summaryrefslogtreecommitdiffstats
path: root/lib/chkname.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/chkname.c (renamed from libmisc/chkname.c)57
1 files changed, 38 insertions, 19 deletions
diff --git a/libmisc/chkname.c b/lib/chkname.c
index e31ee8c..995562f 100644
--- a/libmisc/chkname.c
+++ b/lib/chkname.c
@@ -1,11 +1,10 @@
-/*
- * SPDX-FileCopyrightText: 1990 - 1994, Julianne Frances Haugh
- * SPDX-FileCopyrightText: 1996 - 2000, Marek Michałkiewicz
- * SPDX-FileCopyrightText: 2001 - 2005, Tomasz Kłoczko
- * SPDX-FileCopyrightText: 2005 - 2008, Nicolas François
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
+// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
+// SPDX-FileCopyrightText: 1996-2000, Marek Michałkiewicz
+// SPDX-FileCopyrightText: 2001-2005, Tomasz Kłoczko
+// SPDX-FileCopyrightText: 2005-2008, Nicolas François
+// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
+// SPDX-License-Identifier: BSD-3-Clause
+
/*
* is_valid_user_name(), is_valid_group_name() - check the new user/group
@@ -15,16 +14,39 @@
* false - bad name
*/
+
#include <config.h>
#ident "$Id$"
#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <unistd.h>
+
#include "defines.h"
#include "chkname.h"
+
int allow_bad_names = false;
+
+size_t
+login_name_max_size(void)
+{
+ long conf;
+
+ errno = 0;
+ conf = sysconf(_SC_LOGIN_NAME_MAX);
+ if (conf == -1 && errno != 0)
+ return LOGIN_NAME_MAX;
+
+ return conf;
+}
+
+
static bool is_valid_name (const char *name)
{
if (allow_bad_names) {
@@ -32,8 +54,8 @@ static bool is_valid_name (const char *name)
}
/*
- * User/group names must match gnu e-regex:
- * [a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?
+ * User/group names must match BRE regex:
+ * [a-zA-Z0-9_.][a-zA-Z0-9_.-]*$\?
*
* as a non-POSIX, extension, allow "$" as the last char for
* sake of Samba 3.x "add machine script"
@@ -72,19 +94,17 @@ static bool is_valid_name (const char *name)
return !numeric;
}
-bool is_valid_user_name (const char *name)
+
+bool
+is_valid_user_name(const char *name)
{
- /*
- * User names are limited by whatever utmp can
- * handle.
- */
- if (strlen (name) > USER_NAME_MAX_LENGTH) {
+ if (strlen(name) >= login_name_max_size())
return false;
- }
- return is_valid_name (name);
+ return is_valid_name(name);
}
+
bool is_valid_group_name (const char *name)
{
/*
@@ -98,4 +118,3 @@ bool is_valid_group_name (const char *name)
return is_valid_name (name);
}
-