]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfsprogs: Validate string -> number conversion
authorArkadiusz Mi?kiewicz <arekm@maven.pl>
Fri, 27 Aug 2010 20:54:36 +0000 (20:54 +0000)
committerAlex Elder <aelder@sgi.com>
Mon, 30 Aug 2010 15:00:04 +0000 (10:00 -0500)
Make sure that numbers passed as string will fit into proper types
when doing string->uid_t/gid_t/prid_t conversion.

(Shortened a few long lines before I committed. -Alex)

Signed-off-by: Arkadiusz Mi?kiewicz <arekm@maven.pl>
Signed-off-by: Alex Elder <aelder@sgi.com>
libxcmd/input.c
quota/project.c

index 1bc0745a55cde53d43afef8795dc792e5d2d74b5..d7f29c1596c942408b8a17531bb8a4003b30ba63 100644 (file)
@@ -336,16 +336,20 @@ prid_from_string(
        char            *project)
 {
        fs_project_t    *prj;
-       prid_t          prid;
+       unsigned long   prid_long;
        char            *sp;
 
        /*
         * Allow either a full numeric or a valid projectname, even
         * if it starts with a digit.
         */
-       prid = (prid_t)strtoul(project, &sp, 10);
-       if (*project != '\0' && *sp == '\0')
-               return prid;
+       prid_long = strtoul(project, &sp, 10);
+       if (*project != '\0' && *sp == '\0') {
+               if ((prid_long == ULONG_MAX && errno == ERANGE)
+                               || (prid_long > (prid_t)-1))
+                       return -1;
+               return (prid_t)prid_long;
+       }
        prj = getprnam(project);
        if (prj)
                return prj->pr_prid;
@@ -357,12 +361,16 @@ uid_from_string(
        char            *user)
 {
        struct passwd   *pwd;
-       uid_t           uid;
+       unsigned long   uid_long;
        char            *sp;
 
-       uid = (uid_t)strtoul(user, &sp, 10);
-       if (sp != user)
-               return uid;
+       uid_long = strtoul(user, &sp, 10);
+       if (sp != user) {
+               if ((uid_long == ULONG_MAX && errno == ERANGE)
+                               || (uid_long > (uid_t)-1))
+                       return -1;
+               return (uid_t)uid_long;
+       }
        pwd = getpwnam(user);
        if (pwd)
                return pwd->pw_uid;
@@ -374,12 +382,16 @@ gid_from_string(
        char            *group)
 {
        struct group    *grp;
-       gid_t           gid;
+       unsigned long   gid_long;
        char            *sp;
 
-       gid = (gid_t)strtoul(group, &sp, 10);
-       if (sp != group)
-               return gid;
+       gid_long = strtoul(group, &sp, 10);
+       if (sp != group) {
+               if ((gid_long == ULONG_MAX && errno == ERANGE)
+                               || (gid_long > (gid_t)-1))
+                       return -1;
+               return (gid_t)gid_long;
+       }
        grp = getgrnam(group);
        if (grp)
                return grp->gr_gid;
index 1aacdddd71586416fa31d29785b728ce25d3e86f..b1f160c75d51a071dd5059d05210ef4f6f7383e1 100644 (file)
@@ -268,7 +268,8 @@ project(
                count++;
        }
 
-       printf(_("Processed %d (%s and cmdline) paths for project %s with recursion depth %s (%d).\n"),
+       printf(_("Processed %d (%s and cmdline) paths for project %s with "
+               "recursion depth %s (%d).\n"),
                 count, projects_file, project,
                 recurse_depth < 0 ? _("infinite") : _("limited"), recurse_depth);
 }
@@ -322,8 +323,9 @@ project_f(
 
        if (ispath && argc - optind > 1) {
                exitcode = 1;
-               fprintf(stderr, _("%s: only one projid/name can be specified when using -p <path>, %d found.\n"),
-                               progname, argc - optind);
+               fprintf(stderr, _("%s: only one projid/name can be specified "
+                           "when using -p <path>, %d found.\n"),
+                       progname, argc - optind);
                return 0;
        }
 
@@ -331,7 +333,8 @@ project_f(
                prid = prid_from_string(argv[optind]);
                if (prid == -1) {
                        exitcode = 1;
-                       fprintf(stderr, _("%s - no such project in %s\n"),
+                       fprintf(stderr, _("%s - no such project in %s "
+                                   "or invalid project number\n"),
                                argv[optind], projects_file);
                } else
                        project(argv[optind], type);