2012/4/3 Theo de Raadt <[email protected]>:
> Hmm, I'd like to see that refactored somehow.
>
> Also, '-' should not be legal at the start of a login name.  There
> are things that care.  I think at the end it is OK, though.
>
> Crazy eh.  Isn't there something else in libc that checks this?

New diff:

Index: login_yubikey.c
===================================================================
RCS file: /cvs/src/libexec/login_yubikey/login_yubikey.c,v
retrieving revision 1.4
diff -u -r1.4 login_yubikey.c
--- login_yubikey.c     1 Feb 2012 16:07:28 -0000       1.4
+++ login_yubikey.c     4 Apr 2012 13:23:01 -0000
@@ -36,6 +36,7 @@
 #include <ctype.h>
 #include <login_cap.h>
 #include <pwd.h>
+#include <regex.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -165,12 +166,15 @@
 static int
 clean_string(const char *s)
 {
-       while (*s) {
-               if (!isalnum(*s) && *s != '-' && *s != '_')
-                       return (0);
-               ++s;
-       }
-       return (1);
+       char p[] = "^[0-9a-z_]+(($|[0-9a-z_-]$)|([0-9a-z\\._-]+[0-9a-z_-]$))";
+       int ret = 0;
+       regex_t r;
+
+       regcomp(&r,p,REG_EXTENDED);
+       if (regexec(&r,s,0,0,0) == 0)
+               ret = 1;
+       regfree(&r);
+       return (ret);
 }

 static int

Reply via email to