@@ -66,23 +66,27 @@ static bool bus_error_shall_fallback(sd_bus_error *e) {
6666}
6767
6868static int count_addresses (sd_bus_message * m , int af , const char * * canonical ) {
69- int c = 0 , r ;
69+ int c = 0 , r , ifindex ;
7070
7171 assert (m );
7272 assert (canonical );
7373
74- r = sd_bus_message_enter_container (m , 'a' , "(iayi)" );
74+ r = sd_bus_message_read (m , "i" , & ifindex );
7575 if (r < 0 )
7676 return r ;
7777
78- while ((r = sd_bus_message_enter_container (m , 'r' , "iayi" )) > 0 ) {
78+ r = sd_bus_message_enter_container (m , 'a' , "(iay)" );
79+ if (r < 0 )
80+ return r ;
81+
82+ while ((r = sd_bus_message_enter_container (m , 'r' , "iay" )) > 0 ) {
7983 int family ;
8084
8185 r = sd_bus_message_read (m , "i" , & family );
8286 if (r < 0 )
8387 return r ;
8488
85- r = sd_bus_message_skip (m , "ayi " );
89+ r = sd_bus_message_skip (m , "ay " );
8690 if (r < 0 )
8791 return r ;
8892
@@ -127,7 +131,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
127131 const char * canonical = NULL ;
128132 size_t l , ms , idx ;
129133 char * r_name ;
130- int c , r , i = 0 ;
134+ int c , r , i = 0 , ifindex ;
131135
132136 assert (name );
133137 assert (pat );
@@ -153,7 +157,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
153157 if (r < 0 )
154158 goto fail ;
155159
156- r = sd_bus_message_append (req , "si " , name , AF_UNSPEC );
160+ r = sd_bus_message_append (req , "isit " , 0 , name , AF_UNSPEC , ( uint64_t ) 0 );
157161 if (r < 0 )
158162 goto fail ;
159163
@@ -219,12 +223,21 @@ enum nss_status _nss_resolve_gethostbyname4_r(
219223 /* Second, append addresses */
220224 r_tuple_first = (struct gaih_addrtuple * ) (buffer + idx );
221225
222- r = sd_bus_message_enter_container (reply , 'a' , "(iayi)" );
226+ r = sd_bus_message_read (reply , "i" , & ifindex );
227+ if (r < 0 )
228+ goto fail ;
229+
230+ if (ifindex < 0 ) {
231+ r = - EINVAL ;
232+ goto fail ;
233+ }
234+
235+ r = sd_bus_message_enter_container (reply , 'a' , "(iay)" );
223236 if (r < 0 )
224237 goto fail ;
225238
226- while ((r = sd_bus_message_enter_container (reply , 'r' , "iayi " )) > 0 ) {
227- int family , ifindex ;
239+ while ((r = sd_bus_message_enter_container (reply , 'r' , "iay " )) > 0 ) {
240+ int family ;
228241 const void * a ;
229242 size_t sz ;
230243
@@ -236,10 +249,6 @@ enum nss_status _nss_resolve_gethostbyname4_r(
236249 if (r < 0 )
237250 goto fail ;
238251
239- r = sd_bus_message_read (reply , "i" , & ifindex );
240- if (r < 0 )
241- goto fail ;
242-
243252 r = sd_bus_message_exit_container (reply );
244253 if (r < 0 )
245254 goto fail ;
@@ -252,11 +261,6 @@ enum nss_status _nss_resolve_gethostbyname4_r(
252261 goto fail ;
253262 }
254263
255- if (ifindex < 0 ) {
256- r = - EINVAL ;
257- goto fail ;
258- }
259-
260264 r_tuple = (struct gaih_addrtuple * ) (buffer + idx );
261265 r_tuple -> next = i == c - 1 ? NULL : (struct gaih_addrtuple * ) ((char * ) r_tuple + ALIGN (sizeof (struct gaih_addrtuple )));
262266 r_tuple -> name = r_name ;
@@ -309,7 +313,7 @@ enum nss_status _nss_resolve_gethostbyname3_r(
309313 _cleanup_bus_close_unref_ sd_bus * bus = NULL ;
310314 size_t l , idx , ms , alen ;
311315 const char * canonical ;
312- int c , r , i = 0 ;
316+ int c , r , i = 0 , ifindex ;
313317
314318 assert (name );
315319 assert (result );
@@ -343,7 +347,7 @@ enum nss_status _nss_resolve_gethostbyname3_r(
343347 if (r < 0 )
344348 goto fail ;
345349
346- r = sd_bus_message_append (req , "si " , name , af );
350+ r = sd_bus_message_append (req , "isit " , 0 , name , af , ( uint64_t ) 0 );
347351 if (r < 0 )
348352 goto fail ;
349353
@@ -424,12 +428,21 @@ enum nss_status _nss_resolve_gethostbyname3_r(
424428 /* Third, append addresses */
425429 r_addr = buffer + idx ;
426430
427- r = sd_bus_message_enter_container (reply , 'a' , "(iayi)" );
431+ r = sd_bus_message_read (reply , "i" , & ifindex );
428432 if (r < 0 )
429433 goto fail ;
430434
431- while ((r = sd_bus_message_enter_container (reply , 'r' , "iayi" )) > 0 ) {
432- int family , ifindex ;
435+ if (ifindex < 0 ) {
436+ r = - EINVAL ;
437+ goto fail ;
438+ }
439+
440+ r = sd_bus_message_enter_container (reply , 'a' , "(iay)" );
441+ if (r < 0 )
442+ goto fail ;
443+
444+ while ((r = sd_bus_message_enter_container (reply , 'r' , "iay" )) > 0 ) {
445+ int family ;
433446 const void * a ;
434447 size_t sz ;
435448
@@ -441,10 +454,6 @@ enum nss_status _nss_resolve_gethostbyname3_r(
441454 if (r < 0 )
442455 goto fail ;
443456
444- r = sd_bus_message_read (reply , "i" , & ifindex );
445- if (r < 0 )
446- goto fail ;
447-
448457 r = sd_bus_message_exit_container (reply );
449458 if (r < 0 )
450459 goto fail ;
@@ -521,7 +530,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
521530 unsigned c = 0 , i = 0 ;
522531 size_t ms = 0 , idx ;
523532 const char * n ;
524- int r ;
533+ int r , ifindex ;
525534
526535 assert (addr );
527536 assert (result );
@@ -559,15 +568,15 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
559568 if (r < 0 )
560569 goto fail ;
561570
562- r = sd_bus_message_append (req , "i" , af );
571+ r = sd_bus_message_append (req , "ii" , 0 , af );
563572 if (r < 0 )
564573 goto fail ;
565574
566575 r = sd_bus_message_append_array (req , 'y' , addr , len );
567576 if (r < 0 )
568577 goto fail ;
569578
570- r = sd_bus_message_append (req , "i" , 0 );
579+ r = sd_bus_message_append (req , "t" , ( uint64_t ) 0 );
571580 if (r < 0 )
572581 goto fail ;
573582
@@ -607,6 +616,15 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
607616 return NSS_STATUS_UNAVAIL ;
608617 }
609618
619+ r = sd_bus_message_read (reply , "i" , & ifindex );
620+ if (r < 0 )
621+ goto fail ;
622+
623+ if (ifindex < 0 ) {
624+ r = - EINVAL ;
625+ goto fail ;
626+ }
627+
610628 r = sd_bus_message_enter_container (reply , 'a' , "s" );
611629 if (r < 0 )
612630 goto fail ;
0 commit comments