die_if_bad_username.c 1011 B

12345678910111213141516171819202122232425262728293031323334353637383940
  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 tarball for details.
  8. */
  9. #include "libbb.h"
  10. /* To avoid problems, the username should consist only of
  11. * letters, digits, underscores, periods, at signs and dashes,
  12. * and not start with a dash (as defined by IEEE Std 1003.1-2001).
  13. * For compatibility with Samba machine accounts $ is also supported
  14. * at the end of the username.
  15. */
  16. void FAST_FUNC die_if_bad_username(const char *name)
  17. {
  18. /* 1st char being dash or dot isn't valid: */
  19. goto skip;
  20. /* For example, name like ".." can make adduser
  21. * chown "/home/.." recursively - NOT GOOD
  22. */
  23. do {
  24. if (*name == '-' || *name == '.')
  25. continue;
  26. skip:
  27. if (isalnum(*name)
  28. || *name == '_'
  29. || *name == '@'
  30. || (*name == '$' && !name[1])
  31. ) {
  32. continue;
  33. }
  34. bb_error_msg_and_die("illegal character '%c'", *name);
  35. } while (*++name);
  36. }