X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnss-resolve%2Fnss-resolve.c;h=6a029a331bd05d7c59ffc7da5fdc6841a6302252;hb=46bcf49291874c5a6b5b34ad6413c5a0f7725f4c;hp=b2cb19a7b42918afd2dbb21ed50ecf88352d5156;hpb=7c2a5e264c1d94ca9ba9c49acfdcd541c8a63a88;p=elogind.git diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index b2cb19a7b..6a029a331 100644 --- a/src/nss-resolve/nss-resolve.c +++ b/src/nss-resolve/nss-resolve.c @@ -66,23 +66,27 @@ static bool bus_error_shall_fallback(sd_bus_error *e) { } static int count_addresses(sd_bus_message *m, int af, const char **canonical) { - int c = 0, r; + int c = 0, r, ifindex; assert(m); assert(canonical); - r = sd_bus_message_enter_container(m, 'a', "(iayi)"); + r = sd_bus_message_read(m, "i", &ifindex); if (r < 0) return r; - while ((r = sd_bus_message_enter_container(m, 'r', "iayi")) > 0) { + r = sd_bus_message_enter_container(m, 'a', "(iay)"); + if (r < 0) + return r; + + while ((r = sd_bus_message_enter_container(m, 'r', "iay")) > 0) { int family; r = sd_bus_message_read(m, "i", &family); if (r < 0) return r; - r = sd_bus_message_skip(m, "ayi"); + r = sd_bus_message_skip(m, "ay"); if (r < 0) return r; @@ -123,11 +127,11 @@ enum nss_status _nss_resolve_gethostbyname4_r( _cleanup_bus_message_unref_ sd_bus_message *req = NULL, *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; struct gaih_addrtuple *r_tuple, *r_tuple_first = NULL; - _cleanup_bus_unref_ sd_bus *bus = NULL; + _cleanup_bus_close_unref_ sd_bus *bus = NULL; const char *canonical = NULL; size_t l, ms, idx; char *r_name; - int c, r, i = 0; + int c, r, i = 0, ifindex; assert(name); assert(pat); @@ -153,7 +157,7 @@ enum nss_status _nss_resolve_gethostbyname4_r( if (r < 0) goto fail; - r = sd_bus_message_append(req, "si", name, AF_UNSPEC); + r = sd_bus_message_append(req, "isit", 0, name, AF_UNSPEC, (uint64_t) 0); if (r < 0) goto fail; @@ -219,12 +223,21 @@ enum nss_status _nss_resolve_gethostbyname4_r( /* Second, append addresses */ r_tuple_first = (struct gaih_addrtuple*) (buffer + idx); - r = sd_bus_message_enter_container(reply, 'a', "(iayi)"); + r = sd_bus_message_read(reply, "i", &ifindex); + if (r < 0) + goto fail; + + if (ifindex < 0) { + r = -EINVAL; + goto fail; + } + + r = sd_bus_message_enter_container(reply, 'a', "(iay)"); if (r < 0) goto fail; - while ((r = sd_bus_message_enter_container(reply, 'r', "iayi")) > 0) { - int family, ifindex; + while ((r = sd_bus_message_enter_container(reply, 'r', "iay")) > 0) { + int family; const void *a; size_t sz; @@ -236,10 +249,6 @@ enum nss_status _nss_resolve_gethostbyname4_r( if (r < 0) goto fail; - r = sd_bus_message_read(reply, "i", &ifindex); - if (r < 0) - goto fail; - r = sd_bus_message_exit_container(reply); if (r < 0) goto fail; @@ -252,11 +261,6 @@ enum nss_status _nss_resolve_gethostbyname4_r( goto fail; } - if (ifindex < 0) { - r = -EINVAL; - goto fail; - } - r_tuple = (struct gaih_addrtuple*) (buffer + idx); r_tuple->next = i == c-1 ? NULL : (struct gaih_addrtuple*) ((char*) r_tuple + ALIGN(sizeof(struct gaih_addrtuple))); r_tuple->name = r_name; @@ -281,6 +285,11 @@ enum nss_status _nss_resolve_gethostbyname4_r( if (ttlp) *ttlp = 0; + /* Explicitly reset all error variables */ + *errnop = 0; + *h_errnop = NETDB_SUCCESS; + h_errno = 0; + return NSS_STATUS_SUCCESS; fail: @@ -301,10 +310,10 @@ enum nss_status _nss_resolve_gethostbyname3_r( _cleanup_bus_message_unref_ sd_bus_message *req = NULL, *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; char *r_name, *r_aliases, *r_addr, *r_addr_list; - _cleanup_bus_unref_ sd_bus *bus = NULL; + _cleanup_bus_close_unref_ sd_bus *bus = NULL; size_t l, idx, ms, alen; const char *canonical; - int c, r, i = 0; + int c, r, i = 0, ifindex; assert(name); assert(result); @@ -338,7 +347,7 @@ enum nss_status _nss_resolve_gethostbyname3_r( if (r < 0) goto fail; - r = sd_bus_message_append(req, "si", name, af); + r = sd_bus_message_append(req, "isit", 0, name, af, (uint64_t) 0); if (r < 0) goto fail; @@ -395,10 +404,7 @@ enum nss_status _nss_resolve_gethostbyname3_r( alen = FAMILY_ADDRESS_SIZE(af); l = strlen(canonical); - ms = ALIGN(l+1) + - sizeof(char*) + - (c > 0 ? c : 1) * ALIGN(alen) + - (c > 0 ? c+1 : 2) * sizeof(char*); + ms = ALIGN(l+1) + c * ALIGN(alen) + (c+2) * sizeof(char*); if (buflen < ms) { *errnop = ENOMEM; @@ -419,12 +425,21 @@ enum nss_status _nss_resolve_gethostbyname3_r( /* Third, append addresses */ r_addr = buffer + idx; - r = sd_bus_message_enter_container(reply, 'a', "(iayi)"); + r = sd_bus_message_read(reply, "i", &ifindex); + if (r < 0) + goto fail; + + if (ifindex < 0) { + r = -EINVAL; + goto fail; + } + + r = sd_bus_message_enter_container(reply, 'a', "(iay)"); if (r < 0) goto fail; - while ((r = sd_bus_message_enter_container(reply, 'r', "iayi")) > 0) { - int family, ifindex; + while ((r = sd_bus_message_enter_container(reply, 'r', "iay")) > 0) { + int family; const void *a; size_t sz; @@ -436,10 +451,6 @@ enum nss_status _nss_resolve_gethostbyname3_r( if (r < 0) goto fail; - r = sd_bus_message_read(reply, "i", &ifindex); - if (r < 0) - goto fail; - r = sd_bus_message_exit_container(reply); if (r < 0) goto fail; @@ -452,11 +463,6 @@ enum nss_status _nss_resolve_gethostbyname3_r( goto fail; } - if (ifindex < 0) { - r = -EINVAL; - goto fail; - } - memcpy(r_addr + i*ALIGN(alen), a, alen); i++; } @@ -482,6 +488,11 @@ enum nss_status _nss_resolve_gethostbyname3_r( result->h_length = alen; result->h_addr_list = (char**) r_addr_list; + /* Explicitly reset all error variables */ + *errnop = 0; + *h_errnop = NETDB_SUCCESS; + h_errno = 0; + if (ttlp) *ttlp = 0; @@ -507,11 +518,11 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( _cleanup_bus_message_unref_ sd_bus_message *req = NULL, *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; char *r_name, *r_aliases, *r_addr, *r_addr_list; - _cleanup_bus_unref_ sd_bus *bus = NULL; + _cleanup_bus_close_unref_ sd_bus *bus = NULL; unsigned c = 0, i = 0; size_t ms = 0, idx; const char *n; - int r; + int r, ifindex; assert(addr); assert(result); @@ -549,7 +560,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( if (r < 0) goto fail; - r = sd_bus_message_append(req, "i", af); + r = sd_bus_message_append(req, "ii", 0, af); if (r < 0) goto fail; @@ -557,7 +568,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( if (r < 0) goto fail; - r = sd_bus_message_append(req, "i", 0); + r = sd_bus_message_append(req, "t", (uint64_t) 0); if (r < 0) goto fail; @@ -597,6 +608,15 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( return NSS_STATUS_UNAVAIL; } + r = sd_bus_message_read(reply, "i", &ifindex); + if (r < 0) + goto fail; + + if (ifindex < 0) { + r = -EINVAL; + goto fail; + } + r = sd_bus_message_enter_container(reply, 'a', "s"); if (r < 0) goto fail; @@ -675,6 +695,11 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( if (ttlp) *ttlp = 0; + /* Explicitly reset all error variables */ + *errnop = 0; + *h_errnop = NETDB_SUCCESS; + h_errno = 0; + return NSS_STATUS_SUCCESS; fail: