From 8ffedb4a01a5a6b600d8d20f0a1fe3b8c59e7fb8 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 6 Nov 2006 22:02:53 +0000 Subject: [PATCH] * lib/idcache.c: Include , for offsetof. (struct userid.name): Change from char * to a flexible array member. All uses changed. * modules/idcache (Depends-on): Add flexmember. --- ChangeLog | 5 +++++ lib/idcache.c | 23 ++++++++++++++--------- modules/idcache | 1 + 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8481fd7485..bc1b66e5fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2006-11-06 Paul Eggert + * lib/idcache.c: Include , for offsetof. + (struct userid.name): Change from char * to a flexible array member. + All uses changed. + * modules/idcache (Depends-on): Add flexmember. + * MODULES.html.sh (Core language properties): New module flexmember. * modules/flexmember, m4/flexmember.m4: New files. diff --git a/lib/idcache.c b/lib/idcache.c index d4a867d7b9..02e30e3e97 100644 --- a/lib/idcache.c +++ b/lib/idcache.c @@ -19,6 +19,7 @@ #include +#include #include #include #include @@ -40,8 +41,8 @@ struct userid uid_t u; gid_t g; } id; - char *name; struct userid *next; + char name[FLEXIBLE_ARRAY_MEMBER]; }; static struct userid *user_alist; @@ -56,15 +57,17 @@ getuser (uid_t uid) { register struct userid *tail; struct passwd *pwent; + char const *name; for (tail = user_alist; tail; tail = tail->next) if (tail->id.u == uid) return tail->name; pwent = getpwuid (uid); - tail = xmalloc (sizeof *tail); + name = pwent ? pwent->pw_name : ""; + tail = xmalloc (offsetof (struct userid, name) + strlen (name) + 1); tail->id.u = uid; - tail->name = pwent ? xstrdup (pwent->pw_name) : NULL; + strcpy (tail->name, name); /* Add to the head of the list, so most recently used is first. */ tail->next = user_alist; @@ -104,8 +107,8 @@ getuidbyname (const char *user) } #endif - tail = xmalloc (sizeof *tail); - tail->name = xstrdup (user); + tail = xmalloc (offsetof (struct userid, name) + strlen (user) + 1); + strcpy (tail->name, user); /* Add to the head of the list, so most recently used is first. */ if (pwent) @@ -132,15 +135,17 @@ getgroup (gid_t gid) { register struct userid *tail; struct group *grent; + char const *name; for (tail = group_alist; tail; tail = tail->next) if (tail->id.g == gid) return tail->name; grent = getgrgid (gid); - tail = xmalloc (sizeof *tail); + name = grent ? grent->gr_name : NULL; + tail = xmalloc (offsetof (struct userid, name) + strlen (name) + 1); tail->id.g = gid; - tail->name = grent ? xstrdup (grent->gr_name) : NULL; + strcpy (tail->name, name); /* Add to the head of the list, so most recently used is first. */ tail->next = group_alist; @@ -180,8 +185,8 @@ getgidbyname (const char *group) } #endif - tail = xmalloc (sizeof *tail); - tail->name = xstrdup (group); + tail = xmalloc (offsetof (struct userid, name) + strlen (group) + 1); + strcpy (tail->name, group); /* Add to the head of the list, so most recently used is first. */ if (grent) diff --git a/modules/idcache b/modules/idcache index 05923d0205..97cc71498b 100644 --- a/modules/idcache +++ b/modules/idcache @@ -6,6 +6,7 @@ lib/idcache.c m4/idcache.m4 Depends-on: +flexmember xalloc configure.ac: -- 2.30.2