Re: slaacd: simplify route message handling

2017-08-11 Thread Jeremie Courreges-Anglas
On Fri, Aug 11 2017, Florian Obser  wrote:
> When read(2)'ing from the routing socket only one message is returned.
> Clue provided by jca and claudio.
>
> OK?

ok jca@

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE



slaacd: simplify route message handling

2017-08-11 Thread Florian Obser
When read(2)'ing from the routing socket only one message is returned.
Clue provided by jca and claudio.

OK?

diff --git frontend.c frontend.c
index f78c9802292..4193517e37b 100644
--- frontend.c
+++ frontend.c
@@ -536,11 +536,9 @@ route_receive(int fd, short events, void *arg)
 {
static uint8_t   buf[ROUTE_SOCKET_BUF_SIZE];
 
-   struct rt_msghdr*rtm;
+   struct rt_msghdr*rtm = (struct rt_msghdr *)buf;
struct sockaddr *sa, *rti_info[RTAX_MAX];
-   size_t   len, offset;
ssize_t  n;
-   char*next;
 
if ((n = read(fd, &buf, sizeof(buf))) == -1) {
if (errno == EAGAIN || errno == EINTR)
@@ -549,26 +547,21 @@ route_receive(int fd, short events, void *arg)
return;
}
 
-   if (n == 0) {
-   log_warnx("routing socket closed");
+   if (n == 0)
+   fatal("routing socket closed");
+
+   if (n < rtm->rtm_msglen) {
+   log_warnx("partial rtm in buffer");
return;
}
 
-   len = n;
-   for (offset = 0; offset < len; offset += rtm->rtm_msglen) {
-   next = buf + offset;
-   rtm = (struct rt_msghdr *)next;
-   if (len < offset + sizeof(u_short) ||
-   len < offset + rtm->rtm_msglen)
-   fatalx("rtmsg_process: partial rtm in buffer");
-   if (rtm->rtm_version != RTM_VERSION)
-   continue;
+   if (rtm->rtm_version != RTM_VERSION)
+   return;
 
-   sa = (struct sockaddr *)(next + rtm->rtm_hdrlen);
-   get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
+   sa = (struct sockaddr *)(buf + rtm->rtm_hdrlen);
+   get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
 
-   handle_route_message(rtm, rti_info);
-   }
+   handle_route_message(rtm, rti_info);
 }
 
 void

-- 
I'm not entirely sure you are real.