chfn, chsh: share illegal_passwd_chars() function

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
Sami Kerola 2014-12-14 21:38:56 +00:00
parent 5eef61296f
commit 144ae70ef3
5 changed files with 53 additions and 25 deletions

View File

@ -83,7 +83,9 @@ dist_man_MANS += \
login-utils/chfn.1 \
login-utils/chsh.1
chfn_chsh_sources =
chfn_chsh_sources = \
login-utils/ch-common.h \
login-utils/ch-common.c
chfn_chsh_cflags = $(SUID_CFLAGS) $(AM_CFLAGS)
chfn_chsh_ldflags = $(SUID_LDFLAGS) $(AM_LDFLAGS)
chfn_chsh_ldadd = libcommon.la

34
login-utils/ch-common.c Normal file
View File

@ -0,0 +1,34 @@
/*
* chfn and chsh shared functions
*
* this program is free software. you can redistribute it and
* modify it under the terms of the gnu general public license.
* there is no warranty.
*/
#include <ctype.h>
#include <string.h>
#include "c.h"
#include "nls.h"
#include "ch-common.h"
/*
* illegal_passwd_chars () -
* check whether a string contains illegal characters
*/
int illegal_passwd_chars(const char *str)
{
const char illegal[] = ",:=\"\n";
const size_t len = strlen(str);
size_t i;
if (strpbrk(str, illegal))
return 1;
for (i = 0; i < len; i++) {
if (iscntrl(str[i]))
return 1;
}
return 0;
}

6
login-utils/ch-common.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef UTIL_LINUX_CH_COMMON_H
#define UTIL_LINUX_CH_COMMON_H
extern int illegal_passwd_chars(const char *str);
#endif /* UTIL_LINUX_CH_COMMON */

View File

@ -42,6 +42,8 @@
#include "xalloc.h"
#include "logindefs.h"
#include "ch-common.h"
#ifdef HAVE_LIBSELINUX
# include <selinux/selinux.h>
# include <selinux/av_permissions.h>
@ -106,23 +108,15 @@ static void __attribute__((__noreturn__)) usage(FILE *fp)
*/
static int check_gecos_string(const char *msg, char *gecos)
{
unsigned int i, c;
const size_t len = strlen(gecos);
if (MAX_FIELD_SIZE < len) {
warnx(_("field %s is too long"), msg);
return -1;
}
for (i = 0; i < len; i++) {
c = gecos[i];
if (c == ',' || c == ':' || c == '=' || c == '"' || c == '\n') {
warnx(_("%s: '%c' is not allowed"), msg, c);
return -1;
}
if (iscntrl(c)) {
warnx(_("%s: control characters are not allowed"), msg);
return -1;
}
if (illegal_passwd_chars(gecos)) {
warnx(_("%s: has illegal characters"), gecos);
return -1;
}
return 0;
}

View File

@ -42,6 +42,8 @@
#include "setpwnam.h"
#include "xalloc.h"
#include "ch-common.h"
#ifdef HAVE_LIBSELINUX
# include <selinux/selinux.h>
# include <selinux/av_permissions.h>
@ -205,8 +207,6 @@ static char *prompt(char *question, char *def_val)
*/
static int check_shell(char *shell)
{
unsigned int i, c;
if (!shell)
return -1;
@ -222,17 +222,9 @@ static int check_shell(char *shell)
printf(_("\"%s\" is not executable"), shell);
return -1;
}
/* keep /etc/passwd clean. */
for (i = 0; i < strlen(shell); i++) {
c = shell[i];
if (c == ',' || c == ':' || c == '=' || c == '"' || c == '\n') {
warnx(_("'%c' is not allowed"), c);
return -1;
}
if (iscntrl(c)) {
warnx(_("control characters are not allowed"));
return -1;
}
if (illegal_passwd_chars(shell)) {
warnx(_("%s: has illegal characters"), shell);
return -1;
}
#ifdef ONLY_LISTED_SHELLS
if (!get_shell_list(shell)) {