]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_label.c
tests: Check if Node Target Extended Communities work
[mirror_frr.git] / bgpd / bgp_label.c
index 28fac0bedde67196e67db09cf8ad6e1faf540c49..0f3faeb29759f303bcc8a9943b07423ff35c5046 100644 (file)
@@ -6,7 +6,7 @@
 #include <zebra.h>
 
 #include "command.h"
-#include "thread.h"
+#include "frrevent.h"
 #include "prefix.h"
 #include "zclient.h"
 #include "stream.h"
@@ -297,6 +297,9 @@ static int bgp_nlri_get_labels(struct peer *peer, uint8_t *pnt, uint8_t plen,
        uint8_t llen = 0;
        uint8_t label_depth = 0;
 
+       if (plen < BGP_LABEL_BYTES)
+               return 0;
+
        for (; data < lim; data += BGP_LABEL_BYTES) {
                memcpy(label, data, BGP_LABEL_BYTES);
                llen += BGP_LABEL_BYTES;
@@ -359,6 +362,9 @@ int bgp_nlri_parse_label(struct peer *peer, struct attr *attr,
                        memcpy(&addpath_id, pnt, BGP_ADDPATH_ID_LEN);
                        addpath_id = ntohl(addpath_id);
                        pnt += BGP_ADDPATH_ID_LEN;
+
+                       if (pnt >= lim)
+                               return BGP_NLRI_PARSE_ERROR_PACKET_OVERFLOW;
                }
 
                /* Fetch prefix length. */
@@ -377,6 +383,13 @@ int bgp_nlri_parse_label(struct peer *peer, struct attr *attr,
 
                /* Fill in the labels */
                llen = bgp_nlri_get_labels(peer, pnt, psize, &label);
+               if (llen == 0) {
+                       flog_err(
+                               EC_BGP_UPDATE_RCV,
+                               "%s [Error] Update packet error (wrong label length 0)",
+                               peer->host);
+                       return BGP_NLRI_PARSE_ERROR_LABEL_LENGTH;
+               }
                p.prefixlen = prefixlen - BSIZE(llen);
 
                /* There needs to be at least one label */
@@ -384,8 +397,6 @@ int bgp_nlri_parse_label(struct peer *peer, struct attr *attr,
                        flog_err(EC_BGP_UPDATE_RCV,
                                 "%s [Error] Update packet error (wrong label length %d)",
                                 peer->host, prefixlen);
-                       bgp_notify_send(peer, BGP_NOTIFY_UPDATE_ERR,
-                                       BGP_NOTIFY_UPDATE_INVAL_NETWORK);
                        return BGP_NLRI_PARSE_ERROR_LABEL_LENGTH;
                }
 
@@ -442,7 +453,7 @@ int bgp_nlri_parse_label(struct peer *peer, struct attr *attr,
                                   safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
                                   NULL, &label, 1, 0, NULL);
                } else {
-                       bgp_withdraw(peer, &p, addpath_id, attr, packet->afi,
+                       bgp_withdraw(peer, &p, addpath_id, packet->afi,
                                     SAFI_UNICAST, ZEBRA_ROUTE_BGP,
                                     BGP_ROUTE_NORMAL, NULL, &label, 1, NULL);
                }