[prev in list] [next in list] [prev in thread] [next in thread] 

List:       shadow
Subject:    patch for http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=198920
From:       Tomasz =?UTF-8?Q?K=C5=82oczko?= <kloczek () zie ! pg ! gda ! pl>
Date:       2006-07-26 20:44:15
Message-ID: 1153946655.6846.4.camel () kloczek01
[Download RAW message or body]

OK. Patch finished and tested and is ready for review before commit.
Tomorrow I'll be busy so if nothing bad will happen in next day attached
patch will be committed.

Comments ?

kloczek

["shadow-UID_GID.patch" (shadow-UID_GID.patch)]

Index: src/groupadd.c
===================================================================
RCS file: /cvsroot/shadow/src/groupadd.c,v
retrieving revision 1.54
diff -u -r1.54 groupadd.c
--- src/groupadd.c	14 Jul 2006 19:24:40 -0000	1.54
+++ src/groupadd.c	26 Jul 2006 20:32:44 -0000
@@ -88,6 +88,7 @@
 static void close_files (void);
 static void open_files (void);
 static void fail_exit (int);
+static gid_t get_gid (const char *gidstr);
 
 /*
  * usage - display usage message and exit
@@ -370,6 +371,23 @@
 }
 
 /*
+ * get_id - validate and get group ID
+ */
+static gid_t get_gid (const char *gidstr)
+{
+	long val;
+	char *errptr;
+
+	val = strtol (gidstr, &errptr, 10);
+	if (*errptr || errno == ERANGE || val < 0) {
+		fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
+			 gidstr);
+		exit (E_BAD_ARG);
+	}
+	return val;
+}
+
+/*
  * main - groupadd command
  */
 
@@ -427,16 +445,7 @@
 				break;
 			case 'g':
 				gflg++;
-				if (!isdigit (optarg[0]))
-					usage ();
-
-				group_id = strtoul (optarg, &cp, 10);
-				if (*cp != '\0') {
-					fprintf (stderr,
-						 _("%s: invalid group %s\n"),
-						 Prog, optarg);
-					fail_exit (E_BAD_ARG);
-				}
+				group_id = get_gid (optarg);
 				break;
 			case 'h':
 				usage ();
Index: src/groupmod.c
===================================================================
RCS file: /cvsroot/shadow/src/groupmod.c,v
retrieving revision 1.40
diff -u -r1.40 groupmod.c
--- src/groupmod.c	11 Jul 2006 21:58:47 -0000	1.40
+++ src/groupmod.c	26 Jul 2006 20:32:44 -0000
@@ -90,6 +90,7 @@
 static void process_flags (int, char **);
 static void close_files (void);
 static void open_files (void);
+static gid_t get_gid (const char *gidstr);
 
 /*
  * usage - display usage message and exit
@@ -318,6 +319,23 @@
 }
 
 /*
+ * get_id - validate and get group ID
+ */
+static gid_t get_gid (const char *gidstr)
+{
+	long val;
+	char *errptr;
+
+	val = strtol (gidstr, &errptr, 10);
+	if (*errptr || errno == ERANGE || val < 0) {
+		fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
+			 gidstr);
+		exit (E_BAD_ARG);
+	}
+	return val;
+}
+
+/*
  * process_flags - perform command line argument setting
  *
  *	process_flags() interprets the command line arguments and sets the
@@ -326,7 +344,6 @@
  */
 static void process_flags (int argc, char **argv)
 {
-	char *end;
 
 	{
 		int option_index = 0;
@@ -344,18 +361,12 @@
 			switch (c) {
 			case 'g':
 				gflg++;
-				group_newid = strtoul (optarg, &end, 10);
-				if (*end != '\0') {
-					fprintf (stderr,
-						 _("%s: invalid group %s\n"),
-						 Prog, optarg);
-#ifdef WITH_AUDIT
-					audit_logger (AUDIT_USER_CHAUTHTOK,
-						      Prog, "modifying group",
-						      NULL, group_newid, 0);
+				group_newid = get_gid (optarg);
+#ifdef WITH_AUDIT
+				audit_logger (AUDIT_USER_CHAUTHTOK,
+					      Prog, "modifying group",
+					      NULL, group_newid, 0);
 #endif
-					exit (E_BAD_ARG);
-				}
 				break;
 			case 'n':
 				nflg++;
Index: src/useradd.c
===================================================================
RCS file: /cvsroot/shadow/src/useradd.c,v
retrieving revision 1.99
diff -u -r1.99 useradd.c
--- src/useradd.c	22 Jun 2006 11:30:32 -0000	1.99
+++ src/useradd.c	26 Jul 2006 20:32:44 -0000
@@ -198,42 +198,47 @@
 	exit (code);
 }
 
-static struct group *getgr_nam_gid (const char *name)
+static struct group *getgr_nam_gid (const char *grname)
 {
-	gid_t gid;
-	char *ep;
-
-	gid = strtoul (name, &ep, 10);
-	if (*name != '\0' && *ep == '\0')	/* valid numeric GID */
-		return getgrgid (gid);
+	long gid;
+	char *errptr;
 
-	return getgrnam (name);
+	gid = strtol (grname, &errptr, 10);
+	if (*errptr || errno == ERANGE || gid < 0) {
+		fprintf (stderr,
+			 _("%s: invalid numeric argument '%s'\n"), Prog, grname);
+		exit (E_BAD_ARG);
+	}
+	return getgrnam (grname);
 }
 
-static long get_number (const char *cp)
+static long get_number (const char *numstr)
 {
 	long val;
-	char *ep;
-
-	val = strtol (cp, &ep, 10);
-	if (*cp != '\0' && *ep == '\0')	/* valid number */
-		return val;
+	char *errptr;
 
-	fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog, cp);
-	exit (E_BAD_ARG);
+	val = strtol (numstr, &errptr, 10);
+	if (*errptr || errno == ERANGE) {
+		fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
+			 numstr);
+		exit (E_BAD_ARG);
+	}
+	return val;
 }
 
-static uid_t get_uid (const char *cp)
+static uid_t get_uid (const char *uidstr)
 {
-	uid_t val;
-	char *ep;
-
-	val = strtoul (cp, &ep, 10);
-	if (*cp != '\0' && *ep == '\0')	/* valid number */
-		return val;
+	long val;
+	char *errptr;
 
-	fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog, cp);
-	exit (E_BAD_ARG);
+	val = strtol (uidstr, &errptr, 10);
+	if (*errptr || errno == ERANGE || val < 0) {
+		fprintf (stderr,
+			 _("%s: invalid numeric argument '%s'\n"), Prog,
+			 uidstr);
+		exit (E_BAD_ARG);
+	}
+	return val;
 }
 
 #define MATCH(x,y) (strncmp((x),(y),strlen(y)) == 0)
Index: src/usermod.c
===================================================================
RCS file: /cvsroot/shadow/src/usermod.c,v
retrieving revision 1.70
diff -u -r1.70 usermod.c
--- src/usermod.c	12 Jul 2006 14:23:14 -0000	1.70
+++ src/usermod.c	26 Jul 2006 20:32:44 -0000
@@ -68,12 +68,12 @@
 #define E_USAGE		2	/* invalid command syntax */
 #define E_BAD_ARG	3	/* invalid argument to option */
 #define E_UID_IN_USE	4	/* UID already in use (and no -o) */
-/* #define E_BAD_PWFILE     5 *//* passwd file contains errors */
+/* #define E_BAD_PWFILE	5 *//* passwd file contains errors */
 #define E_NOTFOUND	6	/* specified user/group doesn't exist */
 #define E_USER_BUSY	8	/* user to modify is logged in */
 #define E_NAME_IN_USE	9	/* username already in use */
 #define E_GRP_UPDATE	10	/* can't update group file */
-/* #define E_NOSPACE        11 *//* insufficient space to move home dir */
+/* #define E_NOSPACE	11*//* insufficient space to move home dir */
 #define E_HOMEDIR	12	/* unable to complete home dir move */
 #define	VALID(s)	(strcspn (s, ":\n") == strlen (s))
 /*
@@ -160,16 +160,18 @@
  * "56k-family"... ergh.
  * --Pac.
  */
-static struct group *getgr_nam_gid (const char *name)
+static struct group *getgr_nam_gid (const char *grname)
 {
-	gid_t gid;
-	char *ep;
-
-	gid = strtoul (name, &ep, 10);
-	if (*name != '\0' && *ep == '\0')	/* valid numeric GID */
-		return getgrgid (gid);
+	long val;
+	char *errptr;
 
-	return getgrnam (name);
+	val = strtol (grname, &errptr, 10);
+	if (*errptr || errno == ERANGE || val < 0) {
+		fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
+			 grname);
+		exit (E_BAD_ARG);
+	}
+	return getgrnam (grname);
 }
 
 /*
@@ -804,30 +806,32 @@
 	return ret;
 }
 
-static long get_number (const char *cp)
+static long get_number (const char *numstr)
 {
 	long val;
-	char *ep;
-
-	val = strtol (cp, &ep, 10);
-	if (*cp != '\0' && *ep == '\0')	/* valid number */
-		return val;
+	char *errptr;
 
-	fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog, cp);
-	exit (E_BAD_ARG);
+	val = strtol (numstr, &errptr, 10);
+	if (*errptr || errno == ERANGE) {
+		fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
+			 numstr);
+		exit (E_BAD_ARG);
+	}
+	return val;
 }
 
-static uid_t get_id (const char *cp)
+static uid_t get_id (const char *uidstr)
 {
-	uid_t val;
-	char *ep;
-
-	val = strtoul (cp, &ep, 10);
-	if (*cp != '\0' && *ep == '\0')	/* valid number */
-		return val;
+	long val;
+	char *errptr;
 
-	fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog, cp);
-	exit (E_BAD_ARG);
+	val = strtol (uidstr, &errptr, 10);
+	if (*errptr || errno == ERANGE || val < 0) {
+		fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
+			 uidstr);
+		exit (E_BAD_ARG);
+	}
+	return val;
 }
 
 /*


_______________________________________________
shadow mailing list
shadow@pld.org.pl
http://mail.pld.org.pl/mailman/listinfo/shadow


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic