]> granicus.if.org Git - pdns/commitdiff
Fix strToUID() and strToGID()
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 10 Dec 2015 14:14:11 +0000 (15:14 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 10 Dec 2015 14:14:11 +0000 (15:14 +0100)
Reported by @cmouse

pdns/misc.cc

index 25b2f5105a067668f4605d59d5578dc026a2f63f..c60bc12f904bf7917a7f82774a97fdcc5673ccb9 100644 (file)
@@ -1245,15 +1245,20 @@ uid_t strToUID(const string &str)
   struct passwd * pwd = getpwnam(cstr);
 
   if (pwd == NULL) {
-    char * endptr = 0;
-    long int val = strtol(cstr, &endptr, 10);
+    long long val;
 
-    if (((val == LONG_MAX || val == LLONG_MIN) && errno == ERANGE) || endptr == cstr || val <= 0) {
-      throw runtime_error((boost::format("Warning: Unable to parse user ID %s") % cstr).str() );
+    try {
+      val = stoll(str);
     }
-    else {
-      result = val;
+    catch(std::exception& e) {
+      throw runtime_error((boost::format("Error: Unable to parse user ID %s") % cstr).str() );
+    }
+
+    if (val < std::numeric_limits<uid_t>::min() || val > std::numeric_limits<uid_t>::max()) {
+      throw runtime_error((boost::format("Error: Unable to parse user ID %s") % cstr).str() );
     }
+
+    result = static_cast<uid_t>(val);
   }
   else {
     result = pwd->pw_uid;
@@ -1269,15 +1274,20 @@ gid_t strToGID(const string &str)
   struct group * grp = getgrnam(cstr);
 
   if (grp == NULL) {
-    char * endptr = 0;
-    long int val = strtol(cstr, &endptr, 10);
+    long long val;
 
-    if (((val == LONG_MAX || val == LLONG_MIN) && errno == ERANGE) || endptr == cstr || val <= 0) {
-      throw runtime_error((boost::format("Warning: Unable to parse group ID %s") % cstr).str() );
+    try {
+      val = stoll(str);
     }
-    else {
-      result = val;
+    catch(std::exception& e) {
+      throw runtime_error((boost::format("Error: Unable to parse group ID %s") % cstr).str() );
+    }
+
+    if (val < std::numeric_limits<gid_t>::min() || val > std::numeric_limits<gid_t>::max()) {
+      throw runtime_error((boost::format("Error: Unable to parse group ID %s") % cstr).str() );
     }
+
+    result = static_cast<gid_t>(val);
   }
   else {
     result = grp->gr_gid;