Bonjour,

J'ai été (comme probablement certains d'entre vous touché par le bug
suivant):

https://puck.nether.net/pipermail/juniper-nsp/2012-July/023774.html

Le patch fourni par Claudio Jeker ci-dessous permet de résoudre le
problème.

En esperant en aider certains d'entre vous et ne pas polluer la liste.



Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.316
diff -u -p -r1.316 rde.c
--- rde.c       27 May 2012 18:52:07 -0000      1.316
+++ rde.c       6 Aug 2012 20:57:27 -0000
@@ -1382,7 +1382,7 @@ rde_update_withdraw(struct rde_peer *pee
        } while (0)
 
 #define CHECK_FLAGS(s, t, m)   \
-       (((s) & ~(ATTR_EXTLEN | (m))) == (t))
+       (((s) & ~(ATTR_DEFMASK | (m))) == (t))
 
 int
 rde_attr_parse(u_char *p, u_int16_t len, struct rde_peer *peer,
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.142
diff -u -p -r1.142 rde.h
--- rde.h       21 Sep 2011 08:59:01 -0000      1.142
+++ rde.h       6 Aug 2012 21:09:02 -0000
@@ -118,6 +118,9 @@ enum attrtypes {
 #define ATTR_PARTIAL           0x20
 #define ATTR_TRANSITIVE                0x40
 #define ATTR_OPTIONAL          0x80
+#define ATTR_RESERVED          0x0f
+/* by default mask the reserved bits and the ext len bit */
+#define ATTR_DEFMASK           (ATTR_RESERVED | ATTR_EXTLEN)
 
 /* default attribute flags for well known attributes */
 #define ATTR_WELL_KNOWN                ATTR_TRANSITIVE
Index: rde_attr.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_attr.c,v
retrieving revision 1.90
diff -u -p -r1.90 rde_attr.c
--- rde_attr.c  12 Apr 2012 17:27:20 -0000      1.90
+++ rde_attr.c  6 Aug 2012 21:14:39 -0000
@@ -37,12 +37,12 @@ attr_write(void *p, u_int16_t p_len, u_i
        u_char          *b = p;
        u_int16_t        tmp, tot_len = 2; /* attribute header (without len) */
 
+       flags &= ~ATTR_DEFMASK;
        if (data_len > 255) {
                tot_len += 2 + data_len;
                flags |= ATTR_EXTLEN;
        } else {
                tot_len += 1 + data_len;
-               flags &= ~ATTR_EXTLEN;
        }
 
        if (tot_len > p_len)
@@ -69,12 +69,12 @@ attr_writebuf(struct ibuf *buf, u_int8_t
 {
        u_char  hdr[4];
 
+       flags &= ~ATTR_DEFMASK;
        if (data_len > 255) {
                flags |= ATTR_EXTLEN;
                hdr[2] = (data_len >> 8) & 0xff;
                hdr[3] = data_len & 0xff;
        } else {
-               flags &= ~ATTR_EXTLEN;
                hdr[2] = data_len & 0xff;
        }
 
@@ -322,6 +322,7 @@ attr_alloc(u_int8_t flags, u_int8_t type
                fatal("attr_optadd");
        rdemem.attr_cnt++;
 
+       flags &= ~ATTR_DEFMASK; /* normalize mask */
        a->flags = flags;
        a->hash = hash32_buf(&flags, sizeof(flags), HASHINIT);
        a->type = type;
@@ -351,6 +352,7 @@ attr_lookup(u_int8_t flags, u_int8_t typ
        struct attr             *a;
        u_int32_t                hash;
 
+       flags &= ~ATTR_DEFMASK; /* normalize mask */
        hash = hash32_buf(&flags, sizeof(flags), HASHINIT);
        hash = hash32_buf(&type, sizeof(type), hash);
        hash = hash32_buf(&len, sizeof(len), hash);




---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/

Répondre à