diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-04-14 20:39:47 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-04-14 20:39:47 +0000 |
commit | 3fc044a1138a1afef86c4071b5fc15e940bed5b8 (patch) | |
tree | a2e3b9449f9dbbab98043ccb42fe76dd5bb9dee0 /nis/nss_nisplus/nisplus-alias.c | |
parent | 0433a3502d98e2c6c1c6a496f4ae521566a2a7b9 (diff) | |
download | glibc-3fc044a1138a1afef86c4071b5fc15e940bed5b8.tar glibc-3fc044a1138a1afef86c4071b5fc15e940bed5b8.tar.gz glibc-3fc044a1138a1afef86c4071b5fc15e940bed5b8.tar.bz2 glibc-3fc044a1138a1afef86c4071b5fc15e940bed5b8.zip |
* nis/nss_nisplus/nisplus-alias.c (_nss_nisplus_parse_aliasent):
Avoid unnecessary allocation. Fix adjustment for pointer value.
Diffstat (limited to 'nis/nss_nisplus/nisplus-alias.c')
-rw-r--r-- | nis/nss_nisplus/nisplus-alias.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/nis/nss_nisplus/nisplus-alias.c b/nis/nss_nisplus/nisplus-alias.c index 86ea5d7a1e..57858721a1 100644 --- a/nis/nss_nisplus/nisplus-alias.c +++ b/nis/nss_nisplus/nisplus-alias.c @@ -36,11 +36,11 @@ static u_long next_entry; static nis_name tablename_val; static size_t tablename_len; -#define NISENTRYVAL(idx,col,res) \ - ((res)->objects.objects_val[(idx)].EN_data.en_cols.en_cols_val[(col)].ec_value.ec_value_val) +#define NISENTRYVAL(idx, col, res) \ + (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_val) -#define NISENTRYLEN(idx,col,res) \ - ((res)->objects.objects_val[(idx)].EN_data.en_cols.en_cols_val[(col)].ec_value.ec_value_len) +#define NISENTRYLEN(idx, col, res) \ + (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_len) static enum nss_status _nss_create_tablename (int *errnop) @@ -79,16 +79,12 @@ _nss_nisplus_parse_aliasent (nis_result *result, unsigned long entry, return 0; if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) - || __type_of (&result->objects.objects_val[entry]) != NIS_ENTRY_OBJ - || strcmp (result->objects.objects_val[entry].EN_data.en_type, + || __type_of (&NIS_RES_OBJECT (result)[entry]) != NIS_ENTRY_OBJ + || strcmp (NIS_RES_OBJECT (result)[entry].EN_data.en_type, "mail_aliases") != 0 - || result->objects.objects_val[entry].EN_data.en_cols.en_cols_len < 2) + || NIS_RES_OBJECT (result)[entry].EN_data.en_cols.en_cols_len < 2) return 0; - char *first_unused = buffer + NISENTRYLEN (0, 1, result) + 1; - size_t room_left = (buflen - (buflen % __alignof__ (char *)) - - NISENTRYLEN (0, 1, result) - 2); - if (NISENTRYLEN (entry, 1, result) >= buflen) { /* The line is too long for our buffer. */ @@ -101,13 +97,15 @@ _nss_nisplus_parse_aliasent (nis_result *result, unsigned long entry, NISENTRYLEN (entry, 1, result)); *cp = '\0'; - if (NISENTRYLEN(entry, 0, result) >= room_left) - goto no_more_room; + char *first_unused = cp + 1; + size_t room_left = buflen - (first_unused - buffer); alias->alias_local = 0; alias->alias_members_len = 0; - *first_unused = '\0'; - ++first_unused; + + if (NISENTRYLEN (entry, 0, result) >= room_left) + goto no_more_room; + cp = __stpncpy (first_unused, NISENTRYVAL (entry, 0, result), NISENTRYLEN (entry, 0, result)); *cp = '\0'; @@ -118,11 +116,20 @@ _nss_nisplus_parse_aliasent (nis_result *result, unsigned long entry, if (cp != NULL) *cp = '\0'; - first_unused += strlen (alias->alias_name) +1; + size_t len = strlen (alias->alias_name) + 1; + first_unused += len; + room_left -= len; + /* Adjust the pointer so it is aligned for storing pointers. */ - first_unused += __alignof__ (char *) - 1; - first_unused -= ((first_unused - (char *) 0) % __alignof__ (char *)); + size_t adjust = ((__alignof__ (char *) + - (first_unused - (char *) 0) % __alignof__ (char *)) + % __alignof__ (char *)); + if (room_left < adjust) + goto no_more_room; + first_unused += adjust; + room_left -= adjust; + alias->alias_members = (char **) first_unused; char *line = buffer; @@ -146,8 +153,10 @@ _nss_nisplus_parse_aliasent (nis_result *result, unsigned long entry, if (line != alias->alias_members[alias->alias_members_len]) { *line++ = '\0'; - alias->alias_members_len++; + ++alias->alias_members_len; } + else if (*line == ',') + ++line; } return alias->alias_members_len == 0 ? 0 : 1; |