From 8d8e39b2a7924bb53114083ef624479ec731cab2 Mon Sep 17 00:00:00 2001 From: Michael Tuexen <tuexen@fh-muenster.de> Date: Tue, 10 Oct 2017 22:58:45 +0200 Subject: [PATCH] Allow generic CHUNKs to be partial. --- gtests/net/packetdrill/parser.y | 2 +- gtests/net/packetdrill/sctp_packet.c | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index 52776a04..381615b1 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -1630,7 +1630,7 @@ sctp_generic_chunk_spec semantic_error("length value out of range"); } if (($7 != -1) && ($9 != NULL) && - ($7 != sizeof(struct sctp_chunk) + $9->nr_entries)) { + ($7 < sizeof(struct sctp_chunk) + $9->nr_entries)) { semantic_error("length value incompatible with val"); } if (($7 == -1) && ($9 != NULL)) { diff --git a/gtests/net/packetdrill/sctp_packet.c b/gtests/net/packetdrill/sctp_packet.c index 34a45a08..cf88b04a 100644 --- a/gtests/net/packetdrill/sctp_packet.c +++ b/gtests/net/packetdrill/sctp_packet.c @@ -504,7 +504,7 @@ sctp_generic_chunk_new(s64 type, s64 flgs, s64 len, struct sctp_chunk *chunk; struct sctp_byte_list_item *item; u32 flags; - u16 length, padding_length, i; + u16 length, size, padding_length, i; flags = 0; if (bytes == NULL) { @@ -516,11 +516,16 @@ sctp_generic_chunk_new(s64 type, s64 flgs, s64 len, } else { length = (u16)len; } - padding_length = length % 4; + if (bytes != NULL) { + size = sizeof(struct sctp_chunk) + bytes->nr_entries; + } else { + size = length; + } + padding_length = size % 4; if (padding_length > 0) { padding_length = 4 - padding_length; } - chunk = malloc(length + padding_length); + chunk = malloc(size + padding_length); assert(chunk != NULL); if (type == -1) { chunk->type = 0; @@ -544,10 +549,10 @@ sctp_generic_chunk_new(s64 type, s64 flgs, s64 len, } else { memset(chunk->value, 0, length - sizeof(struct sctp_chunk)); } - memset(chunk->value + (length - sizeof(struct sctp_chunk)), + memset(chunk->value + (size - sizeof(struct sctp_chunk)), 0, padding_length); return sctp_chunk_list_item_new(chunk, - length + padding_length, + size + padding_length, flags, sctp_parameter_list_new(), sctp_cause_list_new()); -- GitLab