From: Tobias Stoeckmann Date: Sat, 11 Nov 2023 22:10:55 +0000 (+0100) Subject: chsh: limit acceptable shells to absolute paths X-Git-Tag: 4.15.0-rc1~116 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b89ac41cbd1560d7d612f124567661d955fa817;p=thirdparty%2Fshadow.git chsh: limit acceptable shells to absolute paths If an entry in /etc/shells is not an absolute path (comments or partial reads due to fgets), the line should not be considered as a valid login shell. In general all systems should have getusershells, but let's better be safe than sorry. Signed-off-by: Tobias Stoeckmann --- diff --git a/src/chsh.c b/src/chsh.c index c11195ff9..3ae8b5108 100644 --- a/src/chsh.c +++ b/src/chsh.c @@ -204,21 +204,17 @@ static bool shell_is_listed (const char *sh) } endusershell (); #else - char buf[BUFSIZ]; + char *buf = NULL; FILE *fp; + size_t n = 0; fp = fopen (SHELLS_FILE, "r"); if (NULL == fp) { return false; } - while (fgets (buf, sizeof (buf), fp) == buf) { - cp = strrchr (buf, '\n'); - if (NULL != cp) { - *cp = '\0'; - } - - if (buf[0] == '#') { + while (getline (&buf, &n, fp) != -1) { + if (buf[0] != '/') { continue; } @@ -227,6 +223,8 @@ static bool shell_is_listed (const char *sh) break; } } + + free(buf); fclose (fp); #endif return found;