diff -up shadow-4.8/src/useradd.c.invalid-shell shadow-4.8/src/useradd.c --- shadow-4.8/src/useradd.c.invalid-shell 2020-01-16 08:47:13.841921106 +0100 +++ shadow-4.8/src/useradd.c 2020-01-16 08:57:26.338421901 +0100 @@ -1277,15 +1277,22 @@ static void process_flags (int argc, cha if ( ( !VALID (optarg) ) || ( ('\0' != optarg[0]) && ('/' != optarg[0]) - && ('*' != optarg[0]) ) - || (stat(optarg, &st) != 0) - || (S_ISDIR(st.st_mode)) - || (access(optarg, X_OK) != 0)) { + && ('*' != optarg[0]) )) { fprintf (stderr, _("%s: invalid shell '%s'\n"), Prog, optarg); exit (E_BAD_ARG); } + if ( '\0' != optarg[0] + && '*' != optarg[0] + && strcmp(optarg, "/sbin/nologin") != 0 + && ( stat(optarg, &st) != 0 + || S_ISDIR(st.st_mode) + || access(optarg, X_OK) != 0)) { + fprintf (stderr, + _("%s: Warning: missing or non-executable shell '%s'\n"), + Prog, optarg); + } user_shell = optarg; def_shell = optarg; sflg = true;