Browse Source

pimd: Fix hang when doing nexthop lookup from zebra

I was running in to a bug when pimd would hang in some cases when
it had to do a nexthop lookup from zebra, such as when a PIM JOIN
was received. This issue could be easily reproduced by running
'show ip rib <ip>' from the pimd vty which forces a nexthop lookup.

The issue is in zclient_read_nexthop, the zclient_read_header function
reads the message content into the stream, but then after that the
zclient_read_nexthop function tries to read the message content again
from the socket, but there are no bytes so it hangs waiting for input.
The solution is to not try to read the message content the second time.
Acked-by: Jafar Al-Gharaibeh
Tested-by: NetDEF CI System <>
Jonathan Hart 6 years ago
1 changed files with 0 additions and 9 deletions
  1. 0 9

+ 0 - 9

@@ -155,7 +155,6 @@ static int zclient_read_nexthop(struct zclient *zlookup,
   u_char version;
   uint16_t vrf_id;
   uint16_t command;
-  int nbytes;
   struct in_addr raddr;
   uint8_t distance;
   uint32_t metric;
@@ -189,14 +188,6 @@ static int zclient_read_nexthop(struct zclient *zlookup,
     return -2;
-  nbytes = stream_read(s, zlookup->sock, length);
-  if (nbytes < length) {
-    zlog_err("%s %s: failure reading zclient lookup socket: nbytes=%d < len=%d",
-	     __FILE__, __PRETTY_FUNCTION__, nbytes, length);
-    zclient_lookup_failed(zlookup);
-    return -3;
-  }
   if (command != ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB) {
     zlog_err("%s: socket %d command mismatch: %d",
             __func__, zlookup->sock, command);