Fix a printf and change the way data is increased so that at the end of
the function it is not overflowing. In the VPN4 case data is increased by
sizeof(u_int64_t) but later on the data is increased by the full length
which moves the pointer beyond the end. Now this is not really a problem
since data is no longer dereferenced but it is better to fix this
inconsistency.

OK?
-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.397
diff -u -p -r1.397 rde.c
--- rde.c       20 Jul 2018 14:58:20 -0000      1.397
+++ rde.c       21 Jul 2018 08:40:32 -0000
@@ -1222,7 +1222,7 @@ rde_update_dispatch(struct imsg *imsg)
                        state.aspath.nexthop = NULL;
                }
                if ((pos = rde_get_mp_nexthop(mpp, mplen, aid, &state)) == -1) {
-                       log_peer_warnx(&peer->conf, "bad nlri prefix");
+                       log_peer_warnx(&peer->conf, "bad nlri nexthop");
                        rde_update_err(peer, ERR_UPDATE, ERR_UPD_OPTATTR,
                            mpa.reach, mpa.reach_len);
                        goto done;
@@ -1815,9 +1815,9 @@ rde_get_mp_nexthop(u_char *data, u_int16
                        log_warnx("bad multiprotocol nexthop, bad size");
                        return (-1);
                }
-               data += sizeof(u_int64_t);
                nexthop.aid = AID_INET;
-               memcpy(&nexthop.v4, data, sizeof(nexthop.v4));
+               memcpy(&nexthop.v4, data + sizeof(u_int64_t),
+                   sizeof(nexthop.v4));
                break;
        default:
                log_warnx("bad multiprotocol nexthop, bad AID");

Reply via email to