On Wednesday 18 February 2015 17:11:33 tito wrote:
> Hi,
> while experimenting with a modified version of deluser.c
> I've hit a bug in libpwdgrp. The attached drop in replacement
> for deluser.c triggers the bug if compiled with bb's libpwdgrp
> and instead works correctly with glibc.
>
> To reproduce:
> adduser prova
> addgroup test1
> addgroup test2
> addgroup prova test1
> addgroup prova test2
> grep prova /etc/passwd /etc/group
> /etc/passwd:prova:x:1004:1005:,,,:/home/prova:/bin/bash
> /etc/group:test1:x:1008:prova
> /etc/group:test2:x:1009:prova
> /etc/group:prova:x:1005:
>
> with glibc:
> ./busybox deluser prova
> groups[2]=1009
> groups[2] gr->gr_name=test2
> groups[1]=1008
> groups[1] gr->gr_name=test1
> grep prova /etc/passwd /etc/group
>
> with bb's pwdgrp
>
> ./busybox deluser prova
> groups[2]=1009
> groups[2] gr->gr_name=test2
> groups[1]=1008
> getgrgid failed errno=0
>
> grep prova /etc/passwd /etc/group
> /etc/group:test1:x:1008:prova
> /etc/group:prova:x:1005:
>
> seems to me that subsequent calls
> to getgrgid and getgrnam fail
>
> Ciao,
> Tito
>
Hi Denys,
the attached patch fixes the bug. Looks like a copy paste error to me.
Could you please double check as this db_and_field_pos stuff is a little
like black magic to me.
Ciao,
Tito
--- libpwdgrp/pwd_grp.c.original 2015-02-19 21:01:52.742313374 +0100
+++ libpwdgrp/pwd_grp.c 2015-02-19 21:02:35.547212303 +0100
@@ -450,15 +450,7 @@
char *buf;
struct passdb *db = &get_S()->db[db_and_field_pos >> 2];
- if (!db->fp) {
- db->fp = fopen_for_read(db->filename);
- if (!db->fp) {
- return NULL;
- }
- close_on_exec_on(fileno(db->fp));
- }
-
- buf = parse_common(db->fp, db, name, db_and_field_pos & 3);
+ buf = parse_file(db, name, db_and_field_pos & 3);
return massage_data_for_non_r_func(db, buf);
}
Fix copy/paste error.
Signed-off-by: Tito Ragusa <[email protected]>
--- libpwdgrp/pwd_grp.c.original 2015-02-19 21:01:52.742313374 +0100
+++ libpwdgrp/pwd_grp.c 2015-02-19 21:02:35.547212303 +0100
@@ -450,15 +450,7 @@
char *buf;
struct passdb *db = &get_S()->db[db_and_field_pos >> 2];
- if (!db->fp) {
- db->fp = fopen_for_read(db->filename);
- if (!db->fp) {
- return NULL;
- }
- close_on_exec_on(fileno(db->fp));
- }
-
- buf = parse_common(db->fp, db, name, db_and_field_pos & 3);
+ buf = parse_file(db, name, db_and_field_pos & 3);
return massage_data_for_non_r_func(db, buf);
}
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox