So flowspec_get_addr() in the IPv6 case is utterly complicated.
Since matching can be done on some sub-part of the prefix.
So there is this shift_right() call that moves takes care of this special
offset.

Now the shift_right call uses *olen but should actually use xoff instead.
*olen is set much later in the code.

This should fix:
https://github.com/openbgpd-portable/openbgpd-portable/security/code-scanning/2
-- 
:wq Claudio

Index: flowspec.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/flowspec.c,v
retrieving revision 1.4
diff -u -p -r1.4 flowspec.c
--- flowspec.c  19 Apr 2023 09:31:58 -0000      1.4
+++ flowspec.c  23 Oct 2023 10:44:22 -0000
@@ -366,7 +366,7 @@ flowspec_get_addr(const uint8_t *flow, i
                if (extract_prefix(comp + 2, complen - 2, buf, xlen,
                    sizeof(buf)) == -1)
                        return -1;
-               shift_right(addr->v6.s6_addr, buf, *olen, xlen);
+               shift_right(addr->v6.s6_addr, buf, xoff, xlen);
                *plen = comp[0];
                if (olen != NULL)
                        *olen = comp[1];

Reply via email to