From fcb7222b1ae6977ced4d6e2555294d8b4aad60f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fran=C3=A7ois?= Date: Tue, 6 Aug 2013 16:30:38 +0200 Subject: [PATCH] Fix Debian bug #675824 * lib/groupmem.c (__gr_dup): Support libc which define other fields in struct group. * lib/pwmem.c: Likewise for struct passwd. * lib/shadowmem.c: Likewise for struct spwd. * lib/sgroupio.c: Apply same logic, even if this structure is defined internally. --- ChangeLog | 10 ++++++++++ lib/groupmem.c | 2 ++ lib/pwmem.c | 2 ++ lib/sgroupio.c | 3 +++ lib/shadowmem.c | 2 ++ 5 files changed, 19 insertions(+) diff --git a/ChangeLog b/ChangeLog index 10509928..4f64110a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2013-08-06 Nicolas François + + Fix Debian bug #675824 + * lib/groupmem.c (__gr_dup): Support libc which define other + fields in struct group. + * lib/pwmem.c: Likewise for struct passwd. + * lib/shadowmem.c: Likewise for struct spwd. + * lib/sgroupio.c: Apply same logic, even if this structure is + defined internally. + 2013-08-05 Nicolas François * lib/groupio.c: Revert change from 2013-07-29. The length of the diff --git a/lib/groupmem.c b/lib/groupmem.c index f5b0532b..f06ed3b2 100644 --- a/lib/groupmem.c +++ b/lib/groupmem.c @@ -48,6 +48,8 @@ if (NULL == gr) { return NULL; } + /* The libc might define other fields. They won't be copied. */ + memset (gr, 0, sizeof *gr); gr->gr_gid = grent->gr_gid; gr->gr_name = strdup (grent->gr_name); if (NULL == gr->gr_name) { diff --git a/lib/pwmem.c b/lib/pwmem.c index 5569191a..9786d5b6 100644 --- a/lib/pwmem.c +++ b/lib/pwmem.c @@ -48,6 +48,8 @@ if (NULL == pw) { return NULL; } + /* The libc might define other fields. They won't be copied. */ + memset (pw, 0, sizeof *pw); pw->pw_uid = pwent->pw_uid; pw->pw_gid = pwent->pw_gid; pw->pw_name = strdup (pwent->pw_name); diff --git a/lib/sgroupio.c b/lib/sgroupio.c index 35238331..7b51f015 100644 --- a/lib/sgroupio.c +++ b/lib/sgroupio.c @@ -51,6 +51,9 @@ if (NULL == sg) { return NULL; } + /* Do the same as the other _dup function, even if we know the + * structure. */ + memset (sg, 0, sizeof *sg); sg->sg_name = strdup (sgent->sg_name); if (NULL == sg->sg_name) { free (sg); diff --git a/lib/shadowmem.c b/lib/shadowmem.c index 2dece383..41dbc40e 100644 --- a/lib/shadowmem.c +++ b/lib/shadowmem.c @@ -49,6 +49,8 @@ if (NULL == sp) { return NULL; } + /* The libc might define other fields. They won't be copied. */ + memset (sp, 0, sizeof *sp); sp->sp_lstchg = spent->sp_lstchg; sp->sp_min = spent->sp_min; sp->sp_max = spent->sp_max;