]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: malformed attribute error that can still proceed should fixup getp
authorPaul Jakma <paul@quagga.net>
Thu, 15 Mar 2012 11:30:00 +0000 (11:30 +0000)
committerPaul Jakma <paul@quagga.net>
Sun, 25 Mar 2012 20:33:51 +0000 (21:33 +0100)
* bgp_attr.c: (bgp_attr_malformed) When a malformed attribute error can be
  ignored, and BGP message processing may still proceed, the stream getp
  should be adjusted to the end of the attribute - the caller may not have
  consumed all the attribute. Problem noted by Martin Winter in bug 678.

  Also, rename the 'startp' local to 'notify_datap', for clarity.

bgpd/bgp_attr.c

index b02cfee356cc43e176d7a4df8312d63da9815934..d204cec1726ec5e3aa43114b4e5e8a33492f3a92 100644 (file)
@@ -719,17 +719,24 @@ bgp_attr_malformed (struct bgp_attr_parser_args *args, u_char subcode,
    * send the attribute data with the NOTIFY depends on the error,
    * the caller therefore signals this with the seperate length argument
    */
-  u_char *startp = (length > 0 ? args->startp : NULL);
+  u_char *notify_datap = (length > 0 ? args->startp : NULL);
   
   /* Only relax error handling for eBGP peers */
   if (peer_sort (peer) != BGP_PEER_EBGP)
     {
       bgp_notify_send_with_data (peer, BGP_NOTIFY_UPDATE_ERR, subcode,
-                                 startp, length);
+                                 notify_datap, length);
       return BGP_ATTR_PARSE_ERROR;
 
     }
   
+  /* Adjust the stream getp to the end of the attribute, in case we can
+   * still proceed but the caller hasn't read all the attribute.
+   */
+  stream_set_getp (BGP_INPUT (peer),
+                   (args->startp - STREAM_DATA (BGP_INPUT (peer)))
+                    + args->total);
+  
   switch (args->type) {
     /* where an optional attribute is inconsequential, e.g. it does not affect
      * route selection, and can be safely ignored then any such attributes
@@ -756,7 +763,7 @@ bgp_attr_malformed (struct bgp_attr_parser_args *args, u_char subcode,
     case BGP_ATTR_MP_UNREACH_NLRI:
     case BGP_ATTR_EXT_COMMUNITIES:
       bgp_notify_send_with_data (peer, BGP_NOTIFY_UPDATE_ERR, subcode,
-                                 startp, length);
+                                 notify_datap, length);
       return BGP_ATTR_PARSE_ERROR;
   }