Skip to content

lib/audit_help.c: We don't support names that need encoding #1261

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 15 additions & 26 deletions lib/audit_help.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,11 @@ void audit_logger (int type, MAYBE_UNUSED const char *pgname, const char *op,
const char *name, unsigned int id,
shadow_audit_result result)
{
if (audit_fd < 0) {
if (audit_fd < 0)
return;
} else {
audit_log_acct_message (audit_fd, type, NULL, op, name, id,
NULL, NULL, NULL, result);
}

audit_log_acct_message(audit_fd, type, NULL, op, name, id,
NULL, NULL, NULL, result);
}

/*
Expand All @@ -96,41 +95,31 @@ audit_logger_with_group(int type, const char *op, const char *name,
id_t id, const char *grp_type, const char *grp,
shadow_audit_result result)
{
int len;
char enc_group[GROUP_NAME_MAX_LENGTH * 2 + 1];
char buf[countof(enc_group) + 100];
char buf[GROUP_NAME_MAX_LENGTH + 100];

if (audit_fd < 0)
return;

len = strnlen(grp, sizeof(enc_group)/2);
if (audit_value_needs_encoding(grp, len)) {
SNPRINTF(buf, "%s %s=%s", op, grp_type,
audit_encode_value(enc_group, grp, len));
} else {
SNPRINTF(buf, "%s %s=\"%s\"", op, grp_type, grp);
}
SNPRINTF(buf, "%s %s=\"%s\"", op, grp_type, grp);

audit_log_acct_message(audit_fd, type, NULL, buf, name, id,
NULL, NULL, NULL, result);
}

void audit_logger_message (const char *message, shadow_audit_result result)
{
if (audit_fd < 0) {
if (audit_fd < 0)
return;
} else {
audit_log_user_message (audit_fd,
AUDIT_USYS_CONFIG,
message,
NULL, /* hostname */
NULL, /* addr */
NULL, /* tty */
result);
}

audit_log_user_message (audit_fd,
AUDIT_USYS_CONFIG,
message,
NULL, /* hostname */
NULL, /* addr */
NULL, /* tty */
result);
}

#else /* WITH_AUDIT */
extern int ISO_C_forbids_an_empty_translation_unit;
#endif /* WITH_AUDIT */

37 changes: 23 additions & 14 deletions lib/chkname.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
* true - OK
* false - bad name
* errors:
* EINVAL Invalid name characters or sequences
* EINVAL Invalid name
* EILSEQ Invalid name character sequence (acceptable with --badname)
* EOVERFLOW Name longer than maximum size
*/

Expand All @@ -31,8 +32,11 @@

#include "defines.h"
#include "chkname.h"
#include "string/ctype/strchrisascii/strchriscntrl.h"
#include "string/ctype/strisascii/strisdigit.h"
#include "string/strcmp/streq.h"
#include "string/strcmp/strcaseeq.h"
#include "string/strcmp/strprefix.h"


#ifndef LOGIN_NAME_MAX
Expand All @@ -59,6 +63,21 @@ login_name_max_size(void)
static bool
is_valid_name(const char *name)
{
if (streq(name, "")
|| streq(name, ".")
|| streq(name, "..")
|| strcaseeq(name, "none")
|| strcaseeq(name, "all")
|| strcaseeq(name, "except")
|| strprefix(name, "-")
|| strpbrk(name, " !\"#&*+,/:;@|~")
|| strchriscntrl(name)
|| strisdigit(name))
{
errno = EINVAL;
return false;
}

if (allow_bad_names) {
return true;
}
Expand All @@ -69,25 +88,15 @@ is_valid_name(const char *name)
*
* as a non-POSIX, extension, allow "$" as the last char for
* sake of Samba 3.x "add machine script"
*
* Also do not allow fully numeric names or just "." or "..".
*/

if (strisdigit(name)) {
errno = EINVAL;
return false;
}

if (streq(name, "") ||
streq(name, ".") ||
streq(name, "..") ||
!((*name >= 'a' && *name <= 'z') ||
if (!((*name >= 'a' && *name <= 'z') ||
(*name >= 'A' && *name <= 'Z') ||
(*name >= '0' && *name <= '9') ||
*name == '_' ||
*name == '.'))
{
errno = EINVAL;
errno = EILSEQ;
return false;
}

Expand All @@ -101,7 +110,7 @@ is_valid_name(const char *name)
streq(name, "$")
))
{
errno = EINVAL;
errno = EILSEQ;
return false;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/newusers.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ static int add_user (const char *name, uid_t uid, gid_t gid)

/* Check if this is a valid user name */
if (!is_valid_user_name(name)) {
if (errno == EINVAL) {
if (errno == EILSEQ) {
fprintf(stderr,
_("%s: invalid user name '%s': use --badname to ignore\n"),
Prog, name);
Expand Down
2 changes: 1 addition & 1 deletion src/pwck.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ static void check_pw_file (bool *errors, bool *changed)
*/

if (!is_valid_user_name(pwd->pw_name)) {
if (errno == EINVAL) {
if (errno == EILSEQ) {
printf(_("invalid user name '%s': use --badname to ignore\n"),
pwd->pw_name);
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/useradd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1493,7 +1493,7 @@ static void process_flags (int argc, char **argv)

user_name = argv[optind];
if (!is_valid_user_name(user_name)) {
if (errno == EINVAL) {
if (errno == EILSEQ) {
fprintf(stderr,
_("%s: invalid user name '%s': use --badname to ignore\n"),
Prog, user_name);
Expand Down
2 changes: 1 addition & 1 deletion src/usermod.c
Original file line number Diff line number Diff line change
Expand Up @@ -1127,7 +1127,7 @@ process_flags(int argc, char **argv)
/*@notreached@*/break;
case 'l':
if (!is_valid_user_name(optarg)) {
if (errno == EINVAL) {
if (errno == EILSEQ) {
fprintf(stderr,
_("%s: invalid user name '%s': use --badname to ignore\n"),
Prog, optarg);
Expand Down
Loading