tag 444427 + patch
Hi!
> this line should add the group floppy to the user "us" according to the
> documentation.
> group.conf :
> "xsh;tty*&!ttyp*;us;Al0000-2400;floppy".
> But this line give all the "us*" users the floppy group.
Indeed, it seems that the function is_same() in pam_time.c and
pam_group.c doesn't check the strings correctly. This code:
#include <string.h>
#include <stdio.h>
#define FALSE 0
static int
is_same (const int *pamh,
const void *A, const char *b, int len, int rule )
{
int i;
const char *a;
a = A;
for (i=0; len > 0; ++i, --len) {
if (b[i] != a[i]) {
if (b[i++] == '*') {
return (!--len || !strncmp(b+i,a+strlen(a)-len,len));
} else
return FALSE;
}
}
return ( !len );
}
int main()
{
printf( "0 %i\n", is_same(NULL,"foo","bar",3,0) );
printf( "1 %i\n", is_same(NULL,"foo","foo",3,0) );
printf( "0 %i\n", is_same(NULL,"foobar","foo",3,0) );
printf( "0 %i\n", is_same(NULL,"foo","foobar",6,0) );
printf( "1 %i\n", is_same(NULL,"foo","foo*",4,0) );
return 0;
}
outputs:
[EMAIL PROTECTED]/tmp> gcc test.c&& ./a.out
0 0
1 1
0 1
1 1
Showing that indeed it only fails if A is shorter than b. The following patch
should fix that:
diff -Nabur pam-0.99.7.1.eerst/Linux-PAM/modules/pam_group/pam_group.c
pam-0.99.7.1/Linux-PAM/modules/pam_group/pam_group.c
--- pam-0.99.7.1.eerst/Linux-PAM/modules/pam_group/pam_group.c 2006-06-16
08:35:16.000000000 +0200
+++ pam-0.99.7.1/Linux-PAM/modules/pam_group/pam_group.c 2008-06-14
18:07:03.913763103 +0200
@@ -319,6 +319,7 @@
{
int i;
const char *a;
+ const int same_len = (strlen(A) == len);
a = A;
for (i=0; len > 0; ++i, --len) {
@@ -329,7 +330,7 @@
return FALSE;
}
}
- return ( !len );
+ return ( !len && same_len );
}
typedef struct {
diff -Nabur pam-0.99.7.1.eerst/Linux-PAM/modules/pam_time/pam_time.c
pam-0.99.7.1/Linux-PAM/modules/pam_time/pam_time.c
--- pam-0.99.7.1.eerst/Linux-PAM/modules/pam_time/pam_time.c 2006-06-16
08:35:16.000000000 +0200
+++ pam-0.99.7.1/Linux-PAM/modules/pam_time/pam_time.c 2008-06-14
18:05:49.373770499 +0200
@@ -314,6 +314,7 @@
{
int i;
const char *a;
+ const int same_len = (strlen(A) == len);
a = A;
for (i=0; len > 0; ++i, --len) {
@@ -324,7 +325,7 @@
return FALSE;
}
}
- return ( !len );
+ return ( !len && same_len );
}
typedef struct {
--
Kind regards,
Bas Zoetekouw.
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]