mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
gnrc_ipv6_ext: don't read from pkt->data
after _demux()
`_demux()` might change `pkt->data` in all kind of ways (moving it due to `gnrc_pktbuf_mark()`, though unlikely; releasing it, because e.g. it starts with a fragment header that marks a fragmented packet containing only one fragment, etc.) so accessing the pointer *after* calling `_demux()` is somewhat playing with fire. This change avoids this by storing the value of `ext_hdr->nh` (all we are interested in here) in a temporary variable that then is used to set the out-parameter `nh`. `protnum` needs to be unchanged before the call to `_demux()` as it was set by the previous iteration and determines what extension header actually is handled.
This commit is contained in:
parent
1dcd3b6a08
commit
ea1708b402
@ -109,17 +109,19 @@ gnrc_pktsnip_t *gnrc_ipv6_ext_process_all(gnrc_pktsnip_t *pkt,
|
||||
case PROTNUM_IPV6_EXT_ESP:
|
||||
case PROTNUM_IPV6_EXT_MOB: {
|
||||
ipv6_ext_t *ext_hdr;
|
||||
uint8_t nh;
|
||||
|
||||
DEBUG("ipv6: handle extension header (protnum = %u)\n",
|
||||
*protnum);
|
||||
ext_hdr = pkt->data;
|
||||
nh = ext_hdr->nh;
|
||||
if ((pkt = _demux(pkt, *protnum)) == NULL) {
|
||||
DEBUG("ipv6: packet was consumed by extension header "
|
||||
"handling\n");
|
||||
return NULL;
|
||||
}
|
||||
*protnum = ext_hdr->nh;
|
||||
if (_duplicate_hopopt(pkt, *protnum)) {
|
||||
*protnum = nh;
|
||||
if (_duplicate_hopopt(pkt, nh)) {
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user