@@ -437,36 +437,9 @@ int link_drop_neighbors(Link *link) {
437437 return r ;
438438}
439439
440- static int manager_rtnl_process_neighbor_lladdr (sd_netlink_message * message , union lladdr_union * lladdr , size_t * size ) {
441- int r ;
442-
443- assert (message );
444- assert (lladdr );
445- assert (size );
446-
447- r = sd_netlink_message_read (message , NDA_LLADDR , sizeof (lladdr -> ip .in6 ), & lladdr -> ip .in6 );
448- if (r >= 0 ) {
449- * size = sizeof (lladdr -> ip .in6 );
450- return r ;
451- }
452-
453- r = sd_netlink_message_read (message , NDA_LLADDR , sizeof (lladdr -> mac ), & lladdr -> mac );
454- if (r >= 0 ) {
455- * size = sizeof (lladdr -> mac );
456- return r ;
457- }
458-
459- r = sd_netlink_message_read (message , NDA_LLADDR , sizeof (lladdr -> ip .in ), & lladdr -> ip .in );
460- if (r >= 0 ) {
461- * size = sizeof (lladdr -> ip .in );
462- return r ;
463- }
464-
465- return r ;
466- }
467-
468440int manager_rtnl_process_neighbor (sd_netlink * rtnl , sd_netlink_message * message , Manager * m ) {
469441 _cleanup_ (neighbor_freep ) Neighbor * tmp = NULL ;
442+ _cleanup_free_ void * lladdr = NULL ;
470443 Neighbor * neighbor = NULL ;
471444 uint16_t type , state ;
472445 int ifindex , r ;
@@ -536,11 +509,15 @@ int manager_rtnl_process_neighbor(sd_netlink *rtnl, sd_netlink_message *message,
536509 return 0 ;
537510 }
538511
539- r = manager_rtnl_process_neighbor_lladdr (message , & tmp -> lladdr , & tmp -> lladdr_size );
512+ r = sd_netlink_message_read_data (message , NDA_LLADDR , & tmp -> lladdr_size , & lladdr );
540513 if (r < 0 ) {
541- log_link_warning_errno (link , r , "rtnl: received neighbor message with invalid lladdr, ignoring: %m" );
514+ log_link_warning_errno (link , r , "rtnl: received neighbor message without valid lladdr, ignoring: %m" );
515+ return 0 ;
516+ } else if (!IN_SET (tmp -> lladdr_size , sizeof (struct ether_addr ), sizeof (struct in_addr ), sizeof (struct in6_addr ))) {
517+ log_link_warning (link , "rtnl: received neighbor message with invalid lladdr size (%zu), ignoring: %m" , tmp -> lladdr_size );
542518 return 0 ;
543519 }
520+ memcpy (& tmp -> lladdr , lladdr , tmp -> lladdr_size );
544521
545522 (void ) neighbor_get (link , tmp , & neighbor );
546523
0 commit comments