From eaf57b9769e37f029c1e6d5126ae77c2a169967f Mon Sep 17 00:00:00 2001
From: Michael Tuexen <tuexen@fh-muenster.de>
Date: Mon, 26 Oct 2015 20:16:54 +0100
Subject: [PATCH] Fix an off-by-one error.

While there remove some trailing whitespaces.
---
 gtests/net/packetdrill/run_system_call.c      | 37 ++++++-------------
 .../notifications/sctp_assoc_change_event.pkt |  4 +-
 2 files changed, 13 insertions(+), 28 deletions(-)

diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 040c4196..0f5c09e9 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -418,7 +418,7 @@ static int get_sockstorage_arg(struct expression *arg, struct sockaddr_storage *
 int check_u8_expr(struct expression *expr, u8 value, char *val_name, char **error) {
 	if (expr->type != EXPR_ELLIPSIS) {
 		u8 script_val;
-		 
+
 		if (get_u8(expr, &script_val, error)) {
 			return STATUS_ERR;
 		}
@@ -435,7 +435,7 @@ int check_u8_expr(struct expression *expr, u8 value, char *val_name, char **erro
 int check_u16_expr(struct expression *expr, u16 value, char *val_name, char **error) {
 	if (expr->type != EXPR_ELLIPSIS) {
 		u16 script_val;
-		 
+
 		if (get_u16(expr, &script_val, error)) {
 			return STATUS_ERR;
 		}
@@ -451,7 +451,7 @@ int check_u16_expr(struct expression *expr, u16 value, char *val_name, char **er
 int check_s32_expr(struct expression *expr, s16 value, char *val_name, char **error) {
 	if (expr->type != EXPR_ELLIPSIS) {
 		s32 script_val;
-		 
+
 		if (get_s32(expr, &script_val, error)) {
 			return STATUS_ERR;
 		}
@@ -467,7 +467,7 @@ int check_s32_expr(struct expression *expr, s16 value, char *val_name, char **er
 int check_u32_expr(struct expression *expr, u16 value, char *val_name, char **error) {
 	if (expr->type != EXPR_ELLIPSIS) {
 		u32 script_val;
-		 
+
 		if (get_u32(expr, &script_val, error)) {
 			return STATUS_ERR;
 		}
@@ -3343,7 +3343,6 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr,
 static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr,
 				   struct sctp_assoc_change *sctp_event,
 				   char **error) {
-
 	if (check_u16_expr(expr->sac_type, sctp_event->sac_type,
 			   "sctp_assoc_change.sac_type", error))
 		return STATUS_ERR;
@@ -3369,22 +3368,15 @@ static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr,
 			   "sctp_assoc_change.sac_assoc_id", error))
 		return STATUS_ERR;
 	if ( expr->sac_info->type != EXPR_ELLIPSIS) {
-		size_t infolen = 0;
+		size_t infolen;
 		struct expression *info_expr = NULL;
-		int i;
-		infolen = sizeof(sctp_event->sac_type);
-		infolen += sizeof(sctp_event->sac_flags);
-		infolen += sizeof(sctp_event->sac_length);
-		infolen += sizeof(sctp_event->sac_state);
-		infolen += sizeof(sctp_event->sac_error);
-		infolen += sizeof(sctp_event->sac_outbound_streams); 
-		infolen += sizeof(sctp_event->sac_inbound_streams); 
-		infolen += sizeof(sctp_event->sac_assoc_id); 
-		infolen = sctp_event->sac_length - infolen + 1;
+		unsigned int i;
+
+		infolen = sctp_event->sac_length - sizeof(struct sctp_assoc_change);
 		switch(expr->sac_info->type) {
 		case EXPR_LIST:
 			if (infolen != expression_list_length(expr->sac_info->value.list)) {
-				asprintf(error, "sctp_assoc_change. sac_list length unequal to sac_lenth expected: %u actual %u",
+				asprintf(error, "sctp_assoc_change.sac_info length: expected: %u actual %u",
 					 expression_list_length(expr->sac_info->value.list), infolen);
 				return STATUS_ERR;
 			}
@@ -3397,19 +3389,12 @@ static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr,
 						return STATUS_ERR;
 					}
 					if (script_val != sctp_event->sac_info[i]) {
-						asprintf(error, "sctp_assoc_change.sac_info. byte %d: expected: %hhu actual: %hhu",
+						asprintf(error, "sctp_assoc_change.sac_info[%d]: expected: %hhu actual: %hhu",
 							i, script_val, sctp_event->sac_info[i]);
 						return STATUS_ERR;
 					}
 				}
-
-				/*if (info_expr->type != EXPR_ELLIPSIS) {
-					
-					if (check_u8_expr(info_expr, sctp_event->sac_info[i],
-						   "sctp_assoc_change.sac_info", error))
-					return STATUS_ERR;
-				}
-		*/	}
+			}
 			break;
 		default: asprintf(error, "Bad expressiontype for sac_info");
 			return STATUS_ERR;
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
index dcbf791c..78467aad 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
@@ -10,7 +10,7 @@
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
 +0.1 < sctp: COOKIE_ACK[flgs=0]
 +0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=21, sac_state=SCTP_COMM_UP, sac_error=0, sac_outbound_streams=1, 
-sac_inbound_streams=1, sac_assoc_id=3, sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF, 0x00]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], 
+sac_inbound_streams=1, sac_assoc_id=..., sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO],
 [MSG_NOTIFICATION|MSG_EOR]) = 21
 
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
@@ -18,5 +18,5 @@ sac_inbound_streams=1, sac_assoc_id=3, sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF, 0
 *    > sctp: SHUTDOWN_ACK[flgs=0]
 +0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
 +0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=20, sac_state=SCTP_SHUTDOWN_COMP, sac_error=0, sac_outbound_streams=1, 
-sac_inbound_streams=1, sac_assoc_id=3, sac_info=[0]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
+sac_inbound_streams=1, sac_assoc_id=..., sac_info=[]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
 
-- 
GitLab