changeset 2854:658f210cdd89

Don't use atoi. Include sys/param.h and limits.h. Include xstrtol.h. (CHAR_BIT, TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM): Define. (UID_T_MAX, GID_T_MAX, MAXUID, MAXGID): Define. (parse_user_spec): Use xstrtoul, not atoi when converting numeric UID, GID. Check range.
author Jim Meyering <jim@meyering.net>
date Sat, 09 Sep 2000 07:20:46 +0000
parents d0457bbc7647
children 59678352da70
files lib/userspec.c
diffstat 1 files changed, 48 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lib/userspec.c	Wed Sep 06 20:04:17 2000 +0000
+++ b/lib/userspec.c	Sat Sep 09 07:20:46 2000 +0000
@@ -40,6 +40,14 @@
 #include <pwd.h>
 #include <grp.h>
 
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
 #if HAVE_STRING_H
 # include <string.h>
 #else
@@ -58,6 +66,7 @@
 #endif
 
 #include "xalloc.h"
+#include "xstrtol.h"
 
 #if ENABLE_NLS
 # include <libintl.h>
@@ -81,6 +90,34 @@
 # define endpwent() ((void) 0)
 #endif
 
+#ifndef CHAR_BIT
+# define CHAR_BIT 8
+#endif
+
+/* The extra casts work around common compiler bugs.  */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+/* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
+   It is necessary at least when t == time_t.  */
+#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
+			      ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
+#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
+
+#ifndef UID_T_MAX
+# define UID_T_MAX TYPE_MAXIMUM (uid_t)
+#endif
+
+#ifndef GID_T_MAX
+# define GID_T_MAX TYPE_MAXIMUM (gid_t)
+#endif
+
+/* MAXUID may come from limits.h or sys/params.h.  */
+#ifndef MAXUID
+# define MAXUID UID_T_MAX
+#endif
+#ifndef MAXGID
+# define MAXGID GID_T_MAX
+#endif
+
 /* Perform the equivalent of the statement `dest = strdup (src);',
    but obtaining storage via alloca instead of from the heap.  */
 
@@ -220,8 +257,12 @@
 		error_msg = E_bad_spec;
 	      else
 		{
-		  /* FIXME: don't use atoi!  */
-		  *uid = atoi (u);
+		  unsigned long int tmp_long;
+		  if (xstrtoul (u, NULL, 0, &tmp_long, NULL) != LONGINT_OK
+		      || tmp_long > MAXUID)
+		    return _(E_invalid_user);
+		  printf ("MAXUID: %u\n", (uid_t) MAXUID);
+		  *uid = tmp_long;
 		}
 	    }
 	}
@@ -263,8 +304,11 @@
 	    error_msg = E_invalid_group;
 	  else
 	    {
-	      /* FIXME: don't use atoi!  */
-	      *gid = atoi (g);
+	      unsigned long int tmp_long;
+	      if (xstrtoul (u, NULL, 0, &tmp_long, NULL) != LONGINT_OK
+		  || tmp_long > MAXGID)
+		return _(E_invalid_group);
+	      *gid = tmp_long;
 	    }
 	}
       else