From: Thorsten Kukuk Date: Wed, 25 Feb 2009 15:59:45 +0000 (+0000) Subject: Relevant BUGIDs: X-Git-Tag: Linux-PAM-1_0_4~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e40e2920874b268008be1cab4ee2565d5615658;p=linux-pam Relevant BUGIDs: Purpose of commit: bugfix Commit summary: --------------- 2009-02-25 Thorsten Kukuk * libpam/pam_misc.c (_pam_StrTok): Use unsigned char instead of int. Reported by Marcus Granado. * tests/Makefile.am (TESTS): Add tst-pam_mkargv. * tests/tst-pam_mkargv.c (main): Test case for _pam_mkargv. --- diff --git a/ChangeLog b/ChangeLog index faa2f07c..404507ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-02-25 Thorsten Kukuk + + * libpam/pam_misc.c (_pam_StrTok): Use unsigned char + instead of int. Reported by Marcus Granado. + * tests/Makefile.am (TESTS): Add tst-pam_mkargv. + * tests/tst-pam_mkargv.c (main): Test case for + _pam_mkargv. + 2008-12-09 Thorsten Kukuk * release version 1.0.3 diff --git a/libpam/pam_misc.c b/libpam/pam_misc.c index 574a570e..b690fd3e 100644 --- a/libpam/pam_misc.c +++ b/libpam/pam_misc.c @@ -59,10 +59,11 @@ char *_pam_StrTok(char *from, const char *format, char **next) /* initialize table */ for (i=1; i<256; table[i++] = '\0'); - for (i=0; format[i] ; table[(int)format[i++]] = 'y'); + for (i=0; format[i] ; + table[(unsigned char)format[i++]] = 'y'); /* look for first non-format char */ - while (*from && table[(int)*from]) { + while (*from && table[(unsigned char)*from]) { ++from; } @@ -92,7 +93,7 @@ char *_pam_StrTok(char *from, const char *format, char **next) remains */ } else if (*from) { /* simply look for next blank char */ - for (end=from; *end && !table[(int)*end]; ++end); + for (end=from; *end && !table[(unsigned char)*end]; ++end); } else { return (*next = NULL); /* no tokens left */ } diff --git a/tests/.cvsignore b/tests/.cvsignore index 8907f478..d8828fe6 100644 --- a/tests/.cvsignore +++ b/tests/.cvsignore @@ -18,3 +18,4 @@ tst-pam_set_data tst-pam_set_item tst-pam_setcred tst-pam_start +tst-pam_mkargv diff --git a/tests/Makefile.am b/tests/Makefile.am index de1594bd..dfe745da 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright (c) 2006 Thorsten Kukuk +# Copyright (c) 2006, 2009 Thorsten Kukuk # AM_CFLAGS = -DLIBPAM_COMPILE -I$(top_srcdir)/libpam/include \ @@ -11,9 +11,9 @@ CLEANFILES = *~ TESTS = tst-pam_start tst-pam_end tst-pam_fail_delay tst-pam_open_session \ tst-pam_close_session tst-pam_acct_mgmt tst-pam_authenticate \ tst-pam_chauthtok tst-pam_setcred tst-pam_get_item tst-pam_set_item \ - tst-pam_getenvlist tst-pam_get_user tst-pam_set_data + tst-pam_getenvlist tst-pam_get_user tst-pam_set_data \ + tst-pam_mkargv check_PROGRAMS = ${TESTS} tst-dlopen tst_dlopen_LDADD = -ldl - diff --git a/tests/tst-pam_mkargv.c b/tests/tst-pam_mkargv.c new file mode 100644 index 00000000..11dcee9c --- /dev/null +++ b/tests/tst-pam_mkargv.c @@ -0,0 +1,51 @@ +/* + Copyright (C) Thorsten Kukuk 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation in version 2 of the License. +*/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "libpam/pam_misc.c" + +/* Simple program to see if _pam_mkargv() would succeed. */ +int main(void) +{ + char *argvstring = "user = XENDT\\userα user=XENDT\\user1"; + const char *argvresult[] = {"user", "=", "XENDT\\userα", + "user=XENDT\\user1"}; + int myargc; + char **myargv; + int argvlen; + int i; + + argvlen = _pam_mkargv(argvstring, &myargv, &myargc); + +#if 0 + printf ("argvlen=%i, argc=%i", argvlen, myargc); + for (i = 0; i < myargc; i++) { + printf(", argv[%d]=%s", i, myargv[i]); + } + printf ("\n"); +#endif + + if (argvlen != 333) + return 1; + + if (myargc != 4) + return 1; + + for (i = 0; i < 4; i++) + { + if (strcmp (myargv[i], argvresult[i]) != 0) + return 1; + } + + return 0; +}