--- embedaddon/sudo/common/atoid.c 2013/10/14 07:56:33 1.1.1.1 +++ embedaddon/sudo/common/atoid.c 2014/06/15 16:12:54 1.1.1.2 @@ -41,10 +41,11 @@ #include #define DEFAULT_TEXT_DOMAIN "sudo" -#include "gettext.h" +#include "gettext.h" /* must be included before missing.h */ #include "missing.h" #include "sudo_debug.h" +#include "sudo_util.h" /* * Parse a uid/gid in string form. @@ -74,18 +75,24 @@ atoid(const char *p, const char *sep, char **endp, con } while (*sep++ != '\0'); } if (!valid) { - *errstr = N_("invalid value"); + if (errstr != NULL) + *errstr = N_("invalid value"); errno = EINVAL; goto done; } - if ((errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) || - (lval > INT_MAX || lval < INT_MIN)) { + if ((errno == ERANGE && lval == LONG_MAX) || lval > INT_MAX) { errno = ERANGE; - *errstr = N_("value out of range"); + if (errstr != NULL) + *errstr = N_("value too large"); goto done; } + if ((errno == ERANGE && lval == LONG_MIN) || lval < INT_MIN) { + errno = ERANGE; + if (errstr != NULL) + *errstr = N_("value too small"); + goto done; + } rval = (id_t)lval; - *errstr = NULL; } else { unsigned long ulval = strtoul(p, &ep, 10); if (ep != p) { @@ -96,18 +103,21 @@ atoid(const char *p, const char *sep, char **endp, con } while (*sep++ != '\0'); } if (!valid) { - *errstr = N_("invalid value"); + if (errstr != NULL) + *errstr = N_("invalid value"); errno = EINVAL; goto done; } if ((errno == ERANGE && ulval == ULONG_MAX) || ulval > UINT_MAX) { errno = ERANGE; - *errstr = N_("value too large"); + if (errstr != NULL) + *errstr = N_("value too large"); goto done; } rval = (id_t)ulval; - *errstr = NULL; } + if (errstr != NULL) + *errstr = NULL; if (endp != NULL) *endp = ep; done: