diff --git a/ChangeLog b/ChangeLog index 4c9420cdc5..c1a00362f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 1999-02-18 Ulrich Drepper + * nss/nsswitch.h (service_user): Change name field from const char * + to char[0]. + (name_database_entry): Likewise. + * nss/nsswitch.c (nss_parse_service_list): Adjust memory allocation + for change of `service_user'. + (nss_getline): Adjust memory allocation for change of + `name_database_entry'. + * catgets/catgets.c: Correctly handle NLSPATH from environment [PR libc/980]. @@ -11,6 +19,7 @@ * string/bits/string2.h: Only use strncmp optimization if count argument is constant. + 1999-02-16 Roland McGrath * sysdeps/mach/hurd/revoke.c: New file. diff --git a/nss/nsswitch.c b/nss/nsswitch.c index b6720fd62e..5bce1f5af3 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -575,21 +575,12 @@ nss_parse_service_list (const char *line) return result; - new_service = (service_user *) malloc (sizeof (service_user)); + new_service = (service_user *) malloc (sizeof (service_user) + + (line - name + 1)); if (new_service == NULL) return result; - else - { - char *source = (char *) malloc (line - name + 1); - if (source == NULL) - { - free (new_service); - return result; - } - *((char *) __mempcpy (source, name, line - name)) = '\0'; - new_service->name = source; - } + *((char *) __mempcpy (new_service->name, name, line - name)) = '\0'; /* Set default actions. */ new_service->actions[2 + NSS_STATUS_TRYAGAIN] = NSS_ACTION_CONTINUE; @@ -706,6 +697,7 @@ nss_getline (char *line) { const char *name; name_database_entry *result; + size_t len; /* Ignore leading white spaces. ATTENTION: this is different from what is implemented in Solaris. The Solaris man page says a line @@ -723,21 +715,14 @@ nss_getline (char *line) return NULL; *line++ = '\0'; - result = (name_database_entry *) malloc (sizeof (name_database_entry)); + len = strlen (name) + 1; + + result = (name_database_entry *) malloc (sizeof (name_database_entry) + len); if (result == NULL) return NULL; /* Save the database name. */ - { - const size_t len = strlen (name) + 1; - char *new = malloc (len); - if (new == NULL) - { - free (result); - return NULL; - } - result->name = memcpy (new, name, len); - } + memcpy (result->name, name, len); /* Parse the list of services. */ result->service = nss_parse_service_list (line); diff --git a/nss/nsswitch.h b/nss/nsswitch.h index ecb2b1bde2..9f40a9e46f 100644 --- a/nss/nsswitch.h +++ b/nss/nsswitch.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -60,16 +60,16 @@ typedef struct typedef struct service_user { - /* Name of the service (`files', `dns', `nis', ...). */ - const char *name; + /* And the link to the next entry. */ + struct service_user *next; /* Action according to result. */ lookup_actions actions[5]; /* Link to the underlying library object. */ service_library *library; /* Collection of known functions. */ struct entry *known; - /* And the link to the next entry. */ - struct service_user *next; + /* Name of the service (`files', `dns', `nis', ...). */ + char name[0]; } service_user; /* To access the action based on the status value use this macro. */ @@ -78,12 +78,12 @@ typedef struct service_user typedef struct name_database_entry { - /* Name of the database. */ - const char *name; - /* List of service to be used. */ - service_user *service; /* And the link to the next entry. */ struct name_database_entry *next; + /* List of service to be used. */ + service_user *service; + /* Name of the database. */ + char name[0]; } name_database_entry;