]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
lib/chkname.c: is_valid_{user,group}_name(): Set errno to distinguish the reasons
authorAlejandro Colomar <alx@kernel.org>
Sat, 31 Aug 2024 09:25:00 +0000 (11:25 +0200)
committerSerge Hallyn <serge@hallyn.com>
Sun, 1 Sep 2024 13:17:11 +0000 (08:17 -0500)
Signed-off-by: Alejandro Colomar <alx@kernel.org>
lib/chkname.c

index bc631f2e1be1cefb2ffd1c65cdae33b1e716ad5c..8bde7a2d96ec25b72dafcc6d3adc631fe5af3c65 100644 (file)
@@ -12,6 +12,9 @@
  * return values:
  *   true  - OK
  *   false - bad name
+ * errors:
+ *   EINVAL    Invalid name characters or sequences
+ *   EOVERFLOW Name longer than maximum size
  */
 
 
@@ -49,7 +52,8 @@ login_name_max_size(void)
 }
 
 
-static bool is_valid_name (const char *name)
+static bool
+is_valid_name(const char *name)
 {
        if (allow_bad_names) {
                return true;
@@ -73,7 +77,9 @@ static bool is_valid_name (const char *name)
              (*name >= 'A' && *name <= 'Z') ||
              (*name >= '0' && *name <= '9') ||
              *name == '_' ||
-             *name == '.')) {
+             *name == '.'))
+       {
+               errno = EINVAL;
                return false;
        }
 
@@ -87,34 +93,46 @@ static bool is_valid_name (const char *name)
                      *name == '.' ||
                      *name == '-' ||
                      (*name == '$' && name[1] == '\0')
-                    )) {
+                    ))
+               {
+                       errno = EINVAL;
                        return false;
                }
                numeric &= isdigit(*name);
        }
 
-       return !numeric;
+       if (numeric) {
+               errno = EINVAL;
+               return false;
+       }
+
+       return true;
 }
 
 
 bool
 is_valid_user_name(const char *name)
 {
-       if (strlen(name) >= login_name_max_size())
+       if (strlen(name) >= login_name_max_size()) {
+               errno = EOVERFLOW;
                return false;
+       }
 
        return is_valid_name(name);
 }
 
 
-bool is_valid_group_name (const char *name)
+bool
+is_valid_group_name(const char *name)
 {
        /*
         * Arbitrary limit for group names.
         * HP-UX 10 limits to 16 characters
         */
        if (   (GROUP_NAME_MAX_LENGTH > 0)
-           && (strlen (name) > GROUP_NAME_MAX_LENGTH)) {
+           && (strlen (name) > GROUP_NAME_MAX_LENGTH))
+       {
+               errno = EOVERFLOW;
                return false;
        }