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=f10af76de5e6589e35ed620c75f3f6eb02cdf345;hp=555800c10ad70956fe13ebb451b3f889dc2bfa77;hpb=e70df46b9721a3d025e7a0b4ffb5893cbde5e55d;p=elogind.git diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index 555800c10..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; @@ -306,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); @@ -343,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; @@ -400,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; @@ -424,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; - while ((r = sd_bus_message_enter_container(reply, 'r', "iayi")) > 0) { - int family, ifindex; + 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', "iay")) > 0) { + int family; const void *a; size_t sz; @@ -441,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; @@ -457,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++; } @@ -517,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); @@ -559,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; @@ -567,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; @@ -607,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;