diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | nscd/grpcache.c | 48 | ||||
-rw-r--r-- | nscd/pwdcache.c | 35 |
3 files changed, 55 insertions, 35 deletions
@@ -1,3 +1,10 @@ +1998-09-14 23:36 Ulrich Drepper <drepper@cygnus.com> + + * nscd/pwdcache.c (save_pwd): Rewrite to use only one malloc call. + (free_pwd): Adjust for this change. + * nscd/grpcache.c (save_grp): Rewrite to use only one malloc call. + (free_grp): Adjust for this change. + 1998-09-14 Ulrich Drepper <drepper@cygnus.com> * nscd/pwdcache.c (cache_pwdinit): Allocate uidtbl of correct size. diff --git a/nscd/grpcache.c b/nscd/grpcache.c index 2806ddd..a513007 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -133,24 +133,38 @@ save_grp (struct group *src) { struct group *dest; unsigned long int l; - - dest = calloc (1, sizeof (struct group)); - dest->gr_name = strdup (src->gr_name); - dest->gr_passwd = strdup (src->gr_passwd); - dest->gr_gid = src->gr_gid; + size_t tlen; + size_t name_len = strlen (src->gr_name) + 1; + size_t passwd_len = strlen (src->gr_passwd) + 1; + char *cp; /* How many members does this group have? */ - l = 0; - while (src->gr_mem[l]) - ++l; + l = tlen = 0; + while (src->gr_mem[l] != NULL) + tlen += strlen (src->gr_mem[l++]) + 1; + + dest = malloc (sizeof (struct group) + (l + 1) * sizeof (char *) + + name_len + passwd_len + tlen); + if (dest == NULL) + return NULL; + + dest->gr_mem = (char **) (dest + 1); + cp = (char *) (dest->gr_mem + l + 1); + + dest->gr_name = cp; + cp = mempcpy (cp, src->gr_name, name_len); + dest->gr_passwd = cp; + cp = mempcpy (cp, src->gr_passwd, passwd_len); + dest->gr_gid = src->gr_gid; - dest->gr_mem = calloc (1, sizeof (char *) * (l+1)); l = 0; - while (src->gr_mem[l]) + while (src->gr_mem[l] != NULL) { - dest->gr_mem[l] = strdup (src->gr_mem[l]); + dest->gr_mem[l] = cp; + cp = stpcpy (cp, src->gr_mem[l]); ++l; } + dest->gr_mem[l] = NULL; return dest; } @@ -158,18 +172,6 @@ save_grp (struct group *src) static void free_grp (struct group *src) { - unsigned long int l; - - free (src->gr_name); - free (src->gr_passwd); - - l = 0; - while (src->gr_mem[l]) - { - free (src->gr_mem[l]); - ++l; - } - free (src->gr_mem); free (src); } diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c index 9b7c0a0..85b4fe9 100644 --- a/nscd/pwdcache.c +++ b/nscd/pwdcache.c @@ -132,15 +132,31 @@ static struct passwd * save_pwd (struct passwd *src) { struct passwd *dest; - - dest = calloc (1, sizeof (struct passwd)); - dest->pw_name = strdup (src->pw_name); - dest->pw_passwd = strdup (src->pw_passwd); + size_t name_len = strlen (src->pw_name) + 1; + size_t passwd_len = strlen (src->pw_gecos) + 1; + size_t gecos_len = strlen (src->pw_dir) + 1; + size_t dir_len = strlen (src->pw_dir) + 1; + size_t shell_len = strlen (src->pw_shell) + 1; + char *cp; + + dest = malloc (sizeof (struct passwd) + + name_len + passwd_len + gecos_len + dir_len + shell_len); + if (dest == NULL) + return NULL; + + cp = (char *) (dest + 1); + dest->pw_name = cp; + cp = mempcpy (cp, src->pw_name, name_len); + dest->pw_passwd = cp; + cp = mempcpy (cp, src->pw_passwd, passwd_len); dest->pw_uid = src->pw_uid; dest->pw_gid = src->pw_gid; - dest->pw_gecos = strdup (src->pw_gecos); - dest->pw_dir = strdup (src->pw_dir); - dest->pw_shell = strdup (src->pw_shell); + dest->pw_gecos = cp; + cp = mempcpy (cp, src->pw_gecos, gecos_len); + dest->pw_dir = cp; + cp = mempcpy (cp, src->pw_dir, dir_len); + dest->pw_shell = cp; + mempcpy (cp, src->pw_shell, shell_len); return dest; } @@ -148,11 +164,6 @@ save_pwd (struct passwd *src) static void free_pwd (struct passwd *src) { - free (src->pw_name); - free (src->pw_passwd); - free (src->pw_gecos); - free (src->pw_dir); - free (src->pw_shell); free (src); } |