1/* vi: set sw=4 ts=4: */ 2/* 3 * Check user and group names for illegal characters 4 * 5 * Copyright (C) 2008 Tito Ragusa <farmatito@tiscali.it> 6 * 7 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 8 */ 9#include "libbb.h" 10 11#ifndef LOGIN_NAME_MAX 12#define LOGIN_NAME_MAX 256 13#endif 14 15/* To avoid problems, the username should consist only of 16 * letters, digits, underscores, periods, at signs and dashes, 17 * and not start with a dash (as defined by IEEE Std 1003.1-2001). 18 * For compatibility with Samba machine accounts $ is also supported 19 * at the end of the username. 20 */ 21 22void FAST_FUNC die_if_bad_username(const char *name) 23{ 24 const char *start = name; 25 26 /* 1st char being dash or dot isn't valid: 27 * for example, name like ".." can make adduser 28 * chown "/home/.." recursively - NOT GOOD. 29 * Name of just a single "$" is also rejected. 30 */ 31 goto skip; 32 33 do { 34 unsigned char ch; 35 36 /* These chars are valid unless they are at the 1st pos: */ 37 if (*name == '-' 38 || *name == '.' 39 /* $ is allowed if it's the last char: */ 40 || (*name == '$' && !name[1]) 41 ) { 42 continue; 43 } 44 skip: 45 ch = *name; 46 if (ch == '_' 47 /* || ch == '@' -- we disallow this too. Think about "user@host" */ 48 /* open-coded isalnum: */ 49 || (ch >= '0' && ch <= '9') 50 || ((ch|0x20) >= 'a' && (ch|0x20) <= 'z') 51 ) { 52 continue; 53 } 54 bb_error_msg_and_die("illegal character with code %u at position %u", 55 (unsigned)ch, (unsigned)(name - start)); 56 } while (*++name); 57 58 /* The minimum size of the login name is one char or two if 59 * last char is the '$'. Violations of this are caught above. 60 * The maximum size of the login name is LOGIN_NAME_MAX 61 * including the terminating null byte. 62 */ 63 if (name - start >= LOGIN_NAME_MAX) 64 bb_simple_error_msg_and_die("name is too long"); 65} 66