Bugzilla – Attachment 551 Details for
Bug 787
Minor security problem due to use of deprecated NGROUPS_MAX in uidswap.c (sshd)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Size group array using sysconf, if available
groups.diff (text/plain), 3.46 KB, created by
Damien Miller
on 2004-02-24 12:13:29 AEDT
(
hide
)
Description:
Size group array using sysconf, if available
Filename:
MIME Type:
Creator:
Damien Miller
Created:
2004-02-24 12:13:29 AEDT
Size:
3.46 KB
patch
obsolete
>? xxx.diff >Index: groupaccess.c >=================================================================== >RCS file: /var/cvs/openssh/groupaccess.c,v >retrieving revision 1.7 >diff -u -r1.7 groupaccess.c >--- groupaccess.c 14 May 2003 03:40:07 -0000 1.7 >+++ groupaccess.c 24 Feb 2004 01:03:21 -0000 >@@ -31,7 +31,7 @@ > #include "log.h" > > static int ngroups; >-static char *groups_byname[NGROUPS_MAX + 1]; /* +1 for base/primary group */ >+static char **groups_byname; > > /* > * Initialize group access list for user with primary (base) and >@@ -40,19 +40,27 @@ > int > ga_init(const char *user, gid_t base) > { >- gid_t groups_bygid[NGROUPS_MAX + 1]; >+ gid_t *groups_bygid; > int i, j; > struct group *gr; > > if (ngroups > 0) > ga_free(); > >- ngroups = sizeof(groups_bygid) / sizeof(gid_t); >+ ngroups = NGROUPS_MAX; >+#if defined(HAVE_SYSCONF) && defined(_SC_NGROUPS_MAX) >+ ngroups = MAX(NGROUPS_MAX, sysconf(_SC_NGROUPS_MAX)); >+#endif >+ >+ groups_bygid = xmalloc(ngroups * sizeof(*groups_bygid)); >+ groups_byname = xmalloc(ngroups * sizeof(*groups_byname)); >+ > if (getgrouplist(user, base, groups_bygid, &ngroups) == -1) > logit("getgrouplist: groups list too small"); > for (i = 0, j = 0; i < ngroups; i++) > if ((gr = getgrgid(groups_bygid[i])) != NULL) > groups_byname[j++] = xstrdup(gr->gr_name); >+ xfree(groups_bygid); > return (ngroups = j); > } > >@@ -84,5 +92,6 @@ > for (i = 0; i < ngroups; i++) > xfree(groups_byname[i]); > ngroups = 0; >+ xfree(groups_byname); > } > } >Index: uidswap.c >=================================================================== >RCS file: /var/cvs/openssh/uidswap.c,v >retrieving revision 1.42 >diff -u -r1.42 uidswap.c >--- uidswap.c 17 Dec 2003 07:53:26 -0000 1.42 >+++ uidswap.c 24 Feb 2004 01:03:21 -0000 >@@ -16,6 +16,7 @@ > > #include "log.h" > #include "uidswap.h" >+#include "xmalloc.h" > > /* > * Note: all these functions must work in all of the following cases: >@@ -38,7 +39,7 @@ > /* Saved effective uid. */ > static int privileged = 0; > static int temporarily_use_uid_effective = 0; >-static gid_t saved_egroups[NGROUPS_MAX], user_groups[NGROUPS_MAX]; >+static gid_t *saved_egroups, *user_groups; > static int saved_egroupslen = -1, user_groupslen = -1; > > /* >@@ -68,18 +69,38 @@ > > privileged = 1; > temporarily_use_uid_effective = 1; >- saved_egroupslen = getgroups(NGROUPS_MAX, saved_egroups); >+ >+ saved_egroupslen = getgroups(0, NULL); > if (saved_egroupslen < 0) > fatal("getgroups: %.100s", strerror(errno)); >+ if (saved_egroupslen > 0) { >+ saved_egroups = xrealloc(saved_egroups, >+ saved_egroupslen * sizeof(gid_t)); >+ if (getgroups(saved_egroupslen, saved_egroups) < 0) >+ fatal("getgroups: %.100s", strerror(errno)); >+ } else { /* saved_egroupslen == 0 */ >+ if (saved_egroups) >+ xfree(saved_egroups); >+ } > > /* set and save the user's groups */ > if (user_groupslen == -1) { > if (initgroups(pw->pw_name, pw->pw_gid) < 0) > fatal("initgroups: %s: %.100s", pw->pw_name, > strerror(errno)); >- user_groupslen = getgroups(NGROUPS_MAX, user_groups); >+ >+ user_groupslen = getgroups(0, NULL); > if (user_groupslen < 0) > fatal("getgroups: %.100s", strerror(errno)); >+ if (user_groupslen > 0) { >+ user_groups = xrealloc(user_groups, >+ user_groupslen * sizeof(gid_t)); >+ if (getgroups(user_groupslen, user_groups) < 0) >+ fatal("getgroups: %.100s", strerror(errno)); >+ } else { /* user_groupslen == 0 */ >+ if (user_groups) >+ xfree(user_groups); >+ } > } > /* Set the effective uid to the given (unprivileged) uid. */ > if (setgroups(user_groupslen, user_groups) < 0)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 787
:
539
|
548
|
549
|
550
| 551