diff -U0 shadow-4.1.4.1/ChangeLog.large_group shadow-4.1.4.1/ChangeLog diff -up shadow-4.1.4.1/lib/gshadow.c.large_group shadow-4.1.4.1/lib/gshadow.c --- shadow-4.1.4.1/lib/gshadow.c.large_group 2009-04-23 13:53:56.000000000 +0200 +++ shadow-4.1.4.1/lib/gshadow.c 2009-06-16 14:47:08.000000000 +0200 @@ -2,7 +2,7 @@ * Copyright (c) 1990 - 1994, Julianne Frances Haugh * Copyright (c) 1996 - 1998, Marek Michałkiewicz * Copyright (c) 2005 , Tomasz Kłoczko - * Copyright (c) 2008 , Nicolas François + * Copyright (c) 2008 - 2009, Nicolas François * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,7 +41,6 @@ #include "prototypes.h" #include "defines.h" static /*@null@*/FILE *shadow; -static char sgrbuf[BUFSIZ * 4]; static /*@null@*//*@only@*/char **members = NULL; static size_t nmembers = 0; static /*@null@*//*@only@*/char **admins = NULL; @@ -131,12 +130,25 @@ void endsgent (void) /*@observer@*//*@null@*/struct sgrp *sgetsgent (const char *string) { + static char *sgrbuf = NULL; + static size_t sgrbuflen = 0; + char *fields[FIELDS]; char *cp; int i; + size_t len = strlen (string) + 1; + + if (len > sgrbuflen) { + char *buf = (char *) realloc (sgrbuf, sizeof (char) * len); + if (NULL == buf) { + return NULL; + } + sgrbuf = buf; + sgrbuflen = len; + } - strncpy (sgrbuf, string, sizeof sgrbuf - 1); - sgrbuf[sizeof sgrbuf - 1] = '\0'; + strncpy (sgrbuf, string, len); + sgrbuf[len-1] = '\0'; cp = strrchr (sgrbuf, '\n'); if (NULL != cp) { @@ -161,7 +173,7 @@ void endsgent (void) * the line is invalid. */ - if ((NULL != cp) || (i != FIELDS)) + if ((NULL != cp) || (i != FIELDS)) { #ifdef USE_NIS if (!IS_NISCHAR (fields[0][0])) { return 0; @@ -171,6 +183,7 @@ void endsgent (void) #else return 0; #endif + } sgroup.sg_name = fields[0]; sgroup.sg_passwd = fields[1]; @@ -199,20 +212,48 @@ void endsgent (void) /*@observer@*//*@null@*/struct sgrp *fgetsgent (/*@null@*/FILE * fp) { - char buf[sizeof sgrbuf]; + static size_t buflen = 0; + static char *buf = NULL; + char *cp; + struct sgrp *ret; + + if (0 == buflen) { + buf = (char *) malloc (BUFSIZ); + if (NULL == buf) { + return NULL; + } + } if (NULL == fp) { - return (0); + return NULL; } #ifdef USE_NIS - while (fgetsx (buf, (int) sizeof buf, fp) != (char *) 0) + while (fgetsx (buf, (int) sizeof buf, fp) == buf) #else - if (fgetsx (buf, (int) sizeof buf, fp) != (char *) 0) + if (fgetsx (buf, (int) sizeof buf, fp) == buf) #endif { - cp = strchr (buf, '\n'); + while ( ((cp = strrchr (buf, '\n')) == NULL) + && (feof (fp) == 0)) { + size_t len; + + cp = (char *) realloc (buf, buflen*2); + if (NULL == cp) { + return NULL; + } + buf = cp; + buflen *= 2; + + len = strlen (buf); + if (fgetsx (&buf[len], + (int) (buflen - len), + fp) != &buf[len]) { + return NULL; + } + } + cp = strrchr (buf, '\n'); if (NULL != cp) { *cp = '\0'; } @@ -223,7 +264,7 @@ void endsgent (void) #endif return (sgetsgent (buf)); } - return 0; + return NULL; } /* @@ -235,7 +276,6 @@ void endsgent (void) #ifdef USE_NIS bool nis_1_group = false; struct sgrp *val; - char buf[BUFSIZ]; #endif if (NULL == shadow) { setsgent (); @@ -334,7 +374,6 @@ void endsgent (void) struct sgrp *sgrp; #ifdef USE_NIS - char buf[BUFSIZ]; static char save_name[16]; int nis_disabled = 0; #endif diff -up shadow-4.1.4.1/libmisc/xgetgrgid.c.large_group shadow-4.1.4.1/libmisc/xgetgrgid.c --- shadow-4.1.4.1/libmisc/xgetgrgid.c.large_group 2008-09-06 16:56:51.000000000 +0200 +++ shadow-4.1.4.1/libmisc/xgetgrgid.c 2009-06-16 14:15:08.000000000 +0200 @@ -58,7 +58,6 @@ #define ARG_TYPE gid_t #define ARG_NAME gid #define DUP_FUNCTION __gr_dup -#define MAX_LENGTH 0x8000 #define HAVE_FUNCTION_R (defined HAVE_GETGRGID_R) #include "xgetXXbyYY.c" diff -up shadow-4.1.4.1/libmisc/xgetgrnam.c.large_group shadow-4.1.4.1/libmisc/xgetgrnam.c --- shadow-4.1.4.1/libmisc/xgetgrnam.c.large_group 2008-09-06 16:56:57.000000000 +0200 +++ shadow-4.1.4.1/libmisc/xgetgrnam.c 2009-06-16 14:15:08.000000000 +0200 @@ -58,7 +58,6 @@ #define ARG_TYPE const char * #define ARG_NAME name #define DUP_FUNCTION __gr_dup -#define MAX_LENGTH 0x8000 #define HAVE_FUNCTION_R (defined HAVE_GETGRNAM_R) #include "xgetXXbyYY.c" diff -up shadow-4.1.4.1/libmisc/xgetpwnam.c.large_group shadow-4.1.4.1/libmisc/xgetpwnam.c --- shadow-4.1.4.1/libmisc/xgetpwnam.c.large_group 2008-09-06 16:57:05.000000000 +0200 +++ shadow-4.1.4.1/libmisc/xgetpwnam.c 2009-06-16 14:15:08.000000000 +0200 @@ -58,7 +58,6 @@ #define ARG_TYPE const char * #define ARG_NAME name #define DUP_FUNCTION __pw_dup -#define MAX_LENGTH 0x8000 #define HAVE_FUNCTION_R (defined HAVE_GETPWNAM_R) #include "xgetXXbyYY.c" diff -up shadow-4.1.4.1/libmisc/xgetpwuid.c.large_group shadow-4.1.4.1/libmisc/xgetpwuid.c --- shadow-4.1.4.1/libmisc/xgetpwuid.c.large_group 2008-09-06 16:57:11.000000000 +0200 +++ shadow-4.1.4.1/libmisc/xgetpwuid.c 2009-06-16 14:15:08.000000000 +0200 @@ -58,7 +58,6 @@ #define ARG_TYPE uid_t #define ARG_NAME uid #define DUP_FUNCTION __pw_dup -#define MAX_LENGTH 0x8000 #define HAVE_FUNCTION_R (defined HAVE_GETPWUID_R) #include "xgetXXbyYY.c" diff -up shadow-4.1.4.1/libmisc/xgetspnam.c.large_group shadow-4.1.4.1/libmisc/xgetspnam.c --- shadow-4.1.4.1/libmisc/xgetspnam.c.large_group 2008-09-06 16:57:17.000000000 +0200 +++ shadow-4.1.4.1/libmisc/xgetspnam.c 2009-06-16 14:15:08.000000000 +0200 @@ -58,7 +58,6 @@ #define ARG_TYPE const char * #define ARG_NAME name #define DUP_FUNCTION __spw_dup -#define MAX_LENGTH 0x8000 #define HAVE_FUNCTION_R (defined HAVE_GETSPNAM_R) #include "xgetXXbyYY.c" diff -up shadow-4.1.4.1/libmisc/xgetXXbyYY.c.large_group shadow-4.1.4.1/libmisc/xgetXXbyYY.c --- shadow-4.1.4.1/libmisc/xgetXXbyYY.c.large_group 2009-04-23 11:15:53.000000000 +0200 +++ shadow-4.1.4.1/libmisc/xgetXXbyYY.c 2009-06-16 14:15:08.000000000 +0200 @@ -79,7 +79,7 @@ exit (13); } - do { + while (true) { int status; LOOKUP_TYPE *resbuf = NULL; buffer = (char *)realloc (buffer, length); @@ -106,8 +106,14 @@ return NULL; } - length *= 4; - } while (length < MAX_LENGTH); + if (length <= ((size_t)-1 / 4)) { + length *= 4; + } else if (length == (size_t) -1) { + break; + } else { + length = (size_t) -1; + } + } free(buffer); free(result); diff -up shadow-4.1.4.1/NEWS.large_group shadow-4.1.4.1/NEWS