[Pkg-shadow-commits] r3020 - in upstream/trunk: . lib
Nicolas FRANÇOIS
nekral-guest at alioth.debian.org
Fri Jun 12 17:50:26 UTC 2009
Author: nekral-guest
Date: 2009-06-12 17:50:24 +0000 (Fri, 12 Jun 2009)
New Revision: 3020
Modified:
upstream/trunk/ChangeLog
upstream/trunk/lib/gshadow.c
Log:
* lib/gshadow.c: Removed limitation on the length of the gshadow
lines.
* lib/gshadow.c: Compare the result of fgetsx() with the provided
buffer instead of NULL.
Modified: upstream/trunk/ChangeLog
===================================================================
--- upstream/trunk/ChangeLog 2009-06-11 21:33:00 UTC (rev 3019)
+++ upstream/trunk/ChangeLog 2009-06-12 17:50:24 UTC (rev 3020)
@@ -1,5 +1,12 @@
2009-06-11 Nicolas François <nicolas.francois at centraliens.net>
+ * lib/gshadow.c: Removed limitation on the length of the gshadow
+ lines.
+ * lib/gshadow.c: Compare the result of fgetsx() with the provided
+ buffer instead of NULL.
+
+2009-06-11 Nicolas François <nicolas.francois at centraliens.net>
+
* libmisc/xgetXXbyYY.c, libmisc/xgetpwnam.c, libmisc/xgetgrnam.c,
libmisc/xgetpwuid.c, libmisc/xgetgrgid.c, libmisc/xgetspnam.c: Do
not limit the size of the buffer to hold the group or user
Modified: upstream/trunk/lib/gshadow.c
===================================================================
--- upstream/trunk/lib/gshadow.c 2009-06-11 21:33:00 UTC (rev 3019)
+++ upstream/trunk/lib/gshadow.c 2009-06-12 17:50:24 UTC (rev 3020)
@@ -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,13 +130,26 @@
/*@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;
- strncpy (sgrbuf, string, sizeof sgrbuf - 1);
- sgrbuf[sizeof sgrbuf - 1] = '\0';
+ if (len > sgrbuflen) {
+ char *buf = (char *) realloc (sgrbuf, sizeof (char) * len);
+ if (NULL == buf) {
+ return NULL;
+ }
+ sgrbuf = buf;
+ sgrbuflen = len;
+ }
+ strncpy (sgrbuf, string, len);
+ sgrbuf[len-1] = '\0';
+
cp = strrchr (sgrbuf, '\n');
if (NULL != cp) {
*cp = '\0';
@@ -161,7 +173,7 @@
* 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 @@
#else
return 0;
#endif
+ }
sgroup.sg_name = fields[0];
sgroup.sg_passwd = fields[1];
@@ -199,20 +212,48 @@
/*@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 @@
#endif
return (sgetsgent (buf));
}
- return 0;
+ return NULL;
}
/*
@@ -235,7 +276,6 @@
#ifdef USE_NIS
bool nis_1_group = false;
struct sgrp *val;
- char buf[BUFSIZ];
#endif
if (NULL == shadow) {
setsgent ();
@@ -334,7 +374,6 @@
struct sgrp *sgrp;
#ifdef USE_NIS
- char buf[BUFSIZ];
static char save_name[16];
int nis_disabled = 0;
#endif
More information about the Pkg-shadow-commits
mailing list