Make sure that numbers passed as string will fit into proper
types when doing string->uid_t/gid_t/prid_t conversion.
Signed-off-by: Arkadiusz Miśkiewicz <arekm@xxxxxxxx>
---
Fixed version.
libxcmd/input.c | 33 +++++++++++++++++++++------------
quota/project.c | 2 +-
2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/libxcmd/input.c b/libxcmd/input.c
index 1bc0745..d0c4e0d 100644
--- a/libxcmd/input.c
+++ b/libxcmd/input.c
@@ -336,16 +336,19 @@ prid_from_string(
char *project)
{
fs_project_t *prj;
- prid_t prid;
+ unsigned long int 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 +360,15 @@ uid_from_string(
char *user)
{
struct passwd *pwd;
- uid_t uid;
+ unsigned long int 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 +380,15 @@ gid_from_string(
char *group)
{
struct group *grp;
- gid_t gid;
+ unsigned long int 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;
diff --git a/quota/project.c b/quota/project.c
index 1aacddd..e9baadd 100644
--- a/quota/project.c
+++ b/quota/project.c
@@ -331,7 +331,7 @@ 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);
--
1.7.2.2
|