Skip to content

Commit da20cce

Browse files
committed
Avoid multiple calls to sysonf() via the MAX macro.
The expansion of MAX would result in multiple calls to sysconf(). It is less error-prone to store the result of sysconf() in a long.
1 parent 3d85f2e commit da20cce

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

plugins/sudoers/cvtsudoers_pwutil.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ cvtsudoers_make_grlist_item(const struct passwd *pw, char * const *unused1)
403403
struct cache_item_grlist *grlitem;
404404
struct sudoers_string *s;
405405
struct group_list *grlist;
406-
size_t groupname_len;
406+
long groupname_len;
407407
debug_decl(cvtsudoers_make_grlist_item, SUDOERS_DEBUG_NSS);
408408

409409
/*
@@ -421,15 +421,17 @@ cvtsudoers_make_grlist_item(const struct passwd *pw, char * const *unused1)
421421
}
422422

423423
#ifdef _SC_LOGIN_NAME_MAX
424-
groupname_len = (size_t)MAX(sysconf(_SC_LOGIN_NAME_MAX), 32);
424+
groupname_len = sysconf(_SC_LOGIN_NAME_MAX);
425+
if (groupname_len < 32)
426+
groupname_len = 32;
425427
#else
426428
groupname_len = MAX(LOGIN_NAME_MAX, 32);
427429
#endif
428430

429431
/* Allocate in one big chunk for easy freeing. */
430432
nsize = strlen(pw->pw_name) + 1;
431433
total = sizeof(*grlitem) + nsize;
432-
total += groupname_len * ngroups;
434+
total += (size_t)groupname_len * ngroups;
433435

434436
again:
435437
if ((grlitem = calloc(1, total)) == NULL) {
@@ -470,7 +472,7 @@ cvtsudoers_make_grlist_item(const struct passwd *pw, char * const *unused1)
470472
}
471473
len = strlen(s->str) + 1;
472474
if ((size_t)(cp - (char *)grlitem) + len > total) {
473-
total += len + groupname_len;
475+
total += len + (size_t)groupname_len;
474476
free(grlitem);
475477
goto again;
476478
}

plugins/sudoers/pwutil_impl.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,13 @@ PREFIX(make_gidlist_item)(const struct passwd *pw, int ngids, GETGROUPS_T *gids,
363363
struct cache_item *
364364
PREFIX(make_grlist_item)(const struct passwd *pw, char * const *unused1)
365365
{
366-
char *cp;
367-
size_t groupname_len, len, ngroups, nsize, total;
366+
size_t len, ngroups, nsize, total;
368367
struct cache_item_grlist *grlitem;
369368
struct group_list *grlist;
370369
struct gid_list *gidlist;
371370
struct group *grp = NULL;
371+
long groupname_len;
372+
char *cp;
372373
int i;
373374
debug_decl(sudo_make_grlist_item, SUDOERS_DEBUG_NSS);
374375

@@ -381,7 +382,9 @@ PREFIX(make_grlist_item)(const struct passwd *pw, char * const *unused1)
381382
}
382383

383384
#ifdef _SC_LOGIN_NAME_MAX
384-
groupname_len = (size_t)MAX(sysconf(_SC_LOGIN_NAME_MAX), 32);
385+
groupname_len = sysconf(_SC_LOGIN_NAME_MAX);
386+
if (groupname_len < 32)
387+
groupname_len = 32;
385388
#else
386389
groupname_len = MAX(LOGIN_NAME_MAX, 32);
387390
#endif
@@ -390,7 +393,7 @@ PREFIX(make_grlist_item)(const struct passwd *pw, char * const *unused1)
390393
nsize = strlen(pw->pw_name) + 1;
391394
total = sizeof(*grlitem) + nsize;
392395
total += sizeof(char *) * (size_t)gidlist->ngids;
393-
total += groupname_len * (size_t)gidlist->ngids;
396+
total += (size_t)(groupname_len * gidlist->ngids);
394397

395398
again:
396399
if ((grlitem = calloc(1, total)) == NULL) {
@@ -429,7 +432,7 @@ PREFIX(make_grlist_item)(const struct passwd *pw, char * const *unused1)
429432
if ((grp = sudo_getgrgid(gidlist->gids[i])) != NULL) {
430433
len = strlen(grp->gr_name) + 1;
431434
if ((size_t)(cp - (char *)grlitem) + len > total) {
432-
total += len + groupname_len;
435+
total += len + (size_t)groupname_len;
433436
free(grlitem);
434437
sudo_gr_delref(grp);
435438
goto again;

0 commit comments

Comments
 (0)