You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-full-overlay/mail-mta/courier/files/courier-1.2.2-fix-getgrnam-...

121 lines
2.4 KiB

diff -Naurp a/libs/numlib/changeuidgid.c b/libs/numlib/changeuidgid.c
--- a/libs/numlib/changeuidgid.c 2022-03-06 20:02:45.000000000 +0100
+++ b/libs/numlib/changeuidgid.c 2023-02-24 17:26:02.452835861 +0100
@@ -52,10 +52,11 @@ void libmail_changeuidgid(uid_t uid, gid
*/
uid_t libmail_getuid(const char *uname, gid_t *pw_gid)
{
- size_t bufsize;
+ int bufsize;
char *buf;
struct passwd pwbuf;
struct passwd *pw;
+ int s;
/*
** uname might be a pointer returned from a previous called to getpw(),
@@ -70,35 +71,39 @@ uid_t libmail_getuid(const char *uname,
}
strcpy(p, uname);
-#ifdef _SC_GETGR_R_SIZE_MAX
- bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
+#ifdef _SC_GETPW_R_SIZE_MAX
+ bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == -1) /* Value was indeterminate */
- {
#endif
- bufsize = 16384; /* Should be more than enough */
- }
-
- buf = malloc(bufsize);
- if (buf == NULL)
{
- perror("malloc");
- exit(1);
+ bufsize = 16384; /* Should be more than enough */
}
+ do {
+ buf = malloc(bufsize);
+ if (buf == NULL)
+ {
+ perror("malloc");
+ exit(1);
+ }
- errno=ENOENT;
-
- getpwnam_r(p, &pwbuf, buf, bufsize, &pw);
+ s = getpwnam_r(p, &pwbuf, buf, bufsize, &pw);
+ if (s == ERANGE) {
+ free(buf);
+ bufsize += 1024;
+ }
+ } while (s == ERANGE && bufsize <= 65536);
- free(buf);
+ free(p);
if (pw == 0)
{
- free(p);
- perror("getpwnam");
+ errno = s;
+ perror("getpwnam_r");
exit(1);
}
- free(p);
+
+ free(buf);
if ( pw_gid ) *pw_gid = pw->pw_gid;
@@ -149,7 +154,7 @@ gid_t libmail_getgid(const char *gname)
struct group grp;
struct group *result;
char *buf;
- size_t bufsize;
+ int bufsize;
int s;
char *p=malloc(strlen(gname)+1);
@@ -168,14 +173,21 @@ gid_t libmail_getgid(const char *gname)
bufsize = 16384; /* Should be more than enough */
}
- buf = malloc(bufsize);
- if (buf == NULL)
- {
- perror("malloc");
- exit(1);
- }
+ do {
+ buf = malloc(bufsize);
+ if (buf == NULL)
+ {
+ perror("malloc");
+ exit(1);
+ }
+
+ s = getgrnam_r(p, &grp, buf, bufsize, &result);
+ if (s == ERANGE) {
+ free(buf);
+ bufsize += 1024;
+ }
+ } while (s == ERANGE && bufsize <= 65536);
- s = getgrnam_r(p, &grp, buf, bufsize, &result);
free(p);
if (result == NULL)
@@ -187,7 +199,7 @@ gid_t libmail_getgid(const char *gname)
else
{
errno = s;
- perror("getpwnam_r");
+ perror("getgrnam_r");
}
exit(1);
}