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