summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIgnas Bacius <ignas@noia.network>2020-01-03 15:05:46 +0200
committerAndrew Yourtchenko <ayourtch@gmail.com>2020-08-12 15:59:46 +0000
commit06c104f4e3cba6a826603188662083a0efea54a8 (patch)
tree142f056161c6c8ea075cf0aec8e4577374463498 /src
parent5c3aab42120cdeaf5513a8344d0af0630342b1bb (diff)
sr: fix possible null-pointer dereference
Steps to reproduce VPP crash: 1. configure localsid End behavior 2. ping the localsid address Type: fix Signed-off-by: Ignas Bacius <ignas@noia.network> Change-Id: Id780e0875ec9cdb25252217990919fb3dddbf06a (cherry picked from commit bd5c49a1615e36260a86184d087b5b47a5e747be)
Diffstat (limited to 'src')
-rw-r--r--src/plugins/srv6-am/test/test_srv6.py35
-rwxr-xr-xsrc/vnet/srv6/sr_localsid.c2
2 files changed, 27 insertions, 10 deletions
diff --git a/src/plugins/srv6-am/test/test_srv6.py b/src/plugins/srv6-am/test/test_srv6.py
index b3e69724028..311366b65c1 100644
--- a/src/plugins/srv6-am/test/test_srv6.py
+++ b/src/plugins/srv6-am/test/test_srv6.py
@@ -548,9 +548,18 @@ class TestSRv6(VppTestCase):
# TODO: test behavior with SL=0 packet (needs 2*SRH?)
+ expected_count = len(pkts)
+
+ # packets without SRH (should not crash)
+ packet_header = self.create_packet_header_IPv6('a3::')
+ # create traffic stream pg0->pg1
+ pkts.extend(self.create_stream(self.pg0, self.pg1, packet_header,
+ self.pg_packet_sizes, count))
+
# send packets and verify received packets
self.send_and_verify_pkts(self.pg0, pkts, self.pg1,
- self.compare_rx_tx_packet_End)
+ self.compare_rx_tx_packet_End,
+ expected_count=expected_count)
# log the localsid counters
self.logger.info(self.vapi.cli("show sr localsid"))
@@ -1825,13 +1834,16 @@ class TestSRv6(VppTestCase):
self.logger.info("Done creating packets")
return pkts
- def send_and_verify_pkts(self, input, pkts, output, compare_func):
+ def send_and_verify_pkts(self, input, pkts, output, compare_func,
+ expected_count=None):
"""Send packets and verify received packets using compare_func
:param input: ingress interface of DUT
:param pkts: list of packets to transmit
:param output: egress interface of DUT
:param compare_func: function to compare in and out packets
+ :param expected_count: expected number of captured packets (if
+ different than len(pkts))
"""
# add traffic stream to input interface
input.add_stream(pkts)
@@ -1845,7 +1857,7 @@ class TestSRv6(VppTestCase):
# get output capture
self.logger.info("Getting packet capture")
- capture = output.get_capture()
+ capture = output.get_capture(expected_count=expected_count)
# assert nothing was captured on input interface
input.assert_nothing_captured()
@@ -2128,13 +2140,18 @@ class TestSRv6(VppTestCase):
self.logger.error(ppp("Unexpected or invalid packet:", packet))
raise
+ # FIXME: there is no need to check manually that all the packets
+ # arrived (already done so by get_capture); checking here
+ # prevents testing packets that are expected to be dropped, so
+ # commenting this out for now
+
# have all expected packets arrived?
- for i in self.pg_interfaces:
- remaining_packet = self.get_next_packet_info_for_interface2(
- i.sw_if_index, dst_sw_if_index, last_info[i.sw_if_index])
- self.assertTrue(remaining_packet is None,
- "Interface %s: Packet expected from interface %s "
- "didn't arrive" % (dst_if.name, i.name))
+ # for i in self.pg_interfaces:
+ # remaining_packet = self.get_next_packet_info_for_interface2(
+ # i.sw_if_index, dst_sw_if_index, last_info[i.sw_if_index])
+ # self.assertTrue(remaining_packet is None,
+ # "Interface %s: Packet expected from interface %s "
+ # "didn't arrive" % (dst_if.name, i.name))
if __name__ == '__main__':
diff --git a/src/vnet/srv6/sr_localsid.c b/src/vnet/srv6/sr_localsid.c
index ffd08ca1528..04565929a18 100755
--- a/src/vnet/srv6/sr_localsid.c
+++ b/src/vnet/srv6/sr_localsid.c
@@ -713,7 +713,7 @@ end_srh_processing (vlib_node_runtime_t * node,
{
ip6_address_t *new_dst0;
- if (PREDICT_TRUE (sr0->type == ROUTING_HEADER_TYPE_SR))
+ if (PREDICT_TRUE (sr0 && sr0->type == ROUTING_HEADER_TYPE_SR))
{
if (sr0->segments_left == 1 && psp)
{