From 403a2e3771be6b1c0c6fc16b2be65b4d36f759ab Mon Sep 17 00:00:00 2001 From: Tobias Stoeckmann Date: Sat, 3 Feb 2024 01:07:58 +0100 Subject: [PATCH] lib/chkname.c: Take NUL byte into account The _SC_LOGIN_NAME_MAX value includes space for the NUL byte. The length of name must smaller than this value to be valid. Signed-off-by: Tobias Stoeckmann --- lib/chkname.c | 2 +- tests/unit/test_chkname.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/chkname.c b/lib/chkname.c index cbfbff51..1c596349 100644 --- a/lib/chkname.c +++ b/lib/chkname.c @@ -80,7 +80,7 @@ bool is_valid_user_name (const char *name) * User names length are limited by the kernel */ maxlen = sysconf(_SC_LOGIN_NAME_MAX); - if (strlen(name) > maxlen) + if (strlen(name) >= maxlen) return false; return is_valid_name (name); diff --git a/tests/unit/test_chkname.c b/tests/unit/test_chkname.c index af982940..e0f9f84b 100644 --- a/tests/unit/test_chkname.c +++ b/tests/unit/test_chkname.c @@ -134,15 +134,15 @@ test_is_valid_user_name_long(void **state) char *name; max = sysconf(_SC_LOGIN_NAME_MAX); - name = MALLOC(max + 2, char); + name = MALLOC(max + 1, char); assert_true(name != NULL); - memset(name, '_', max + 1); - - name[max + 1] = '\0'; - assert_true(false == is_valid_user_name(name)); + memset(name, '_', max); name[max] = '\0'; + assert_true(false == is_valid_user_name(name)); + + name[max - 1] = '\0'; assert_true(is_valid_user_name(name)); free(name);