From 9cf6f8206a23a5131290256dbab83f7145881a8b Mon Sep 17 00:00:00 2001 From: hoelscher <jens.hoelscher@fh-muenster.de> Date: Wed, 14 Oct 2015 07:20:49 +0200 Subject: [PATCH] fix mistake in handling sockaddr array in sctp_sendv --- gtests/net/packetdrill/run_system_call.c | 58 +++++------------------- 1 file changed, 11 insertions(+), 47 deletions(-) diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 5775c62c..ce57589b 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -122,44 +122,7 @@ static int get_arg_count(struct expression_list *args) { return expression_list_length(args); } -/* This table maps expression types to human-readable strings */ -struct expression_type_entry { - enum expression_t type; - const char *name; -}; -struct expression_type_entry expression_type_table2[] = { - { EXPR_NONE, "none" }, - { EXPR_NULL, "null" }, - { EXPR_ELLIPSIS, "ellipsis" }, - { EXPR_INTEGER, "integer" }, - { EXPR_WORD, "word" }, - { EXPR_STRING, "string" }, - { EXPR_SOCKET_ADDRESS_IPV4, "sockaddr_in" }, - { EXPR_SOCKET_ADDRESS_IPV6, "sockaddr_in6" }, - { EXPR_LINGER, "linger" }, - { EXPR_BINARY, "binary_expression" }, - { EXPR_LIST, "list" }, - { EXPR_IOVEC, "iovec" }, - { EXPR_MSGHDR, "msghdr" }, - { EXPR_POLLFD, "pollfd" }, - { EXPR_SCTP_RTOINFO, "sctp_rtoinfo"}, - { EXPR_SCTP_INITMSG, "sctp_initmsg"}, - { EXPR_SCTP_ASSOC_VALUE, "sctp_assoc_value"}, - { EXPR_SCTP_SACKINFO, "sctp_sackinfo"}, - { EXPR_SCTP_STATUS, "sctp_status"}, - { EXPR_SCTP_PADDRINFO, "sctp_paddrinfo"}, - { EXPR_SCTP_PEER_ADDR_PARAMS,"sctp_peer_addr_params"}, - { EXPR_SCTP_STREAM_VALUE, "sctp_stream_value"}, - { EXPR_SCTP_ASSOCPARAMS, "sctp_assocparams"}, - { EXPR_SCTP_EVENT, "sctp_event" }, - { EXPR_SCTP_SNDINFO, "sctp_sndinfo" }, - { EXPR_SCTP_SETADAPTATION, "sctp_setadaptation"}, - { EXPR_SCTP_SNDRCVINFO, "sctp_sndrcvinfo" }, - { EXPR_SCTP_PRINFO, "sctp_prinfo" }, - { EXPR_SCTP_AUTHINFO, "sctp_authinfo" }, - { EXPR_SCTP_SENDV_SPA, "sctp_sendv_spa" }, - { NUM_EXPR_TYPES, NULL} -}; + /* Verify that the expression list has the expected number of * expressions. Returns STATUS_OK on success; on failure returns * STATUS_ERR and sets error message. @@ -3446,7 +3409,7 @@ static int syscall_sctp_sendv(struct state *state, struct syscall_spec *syscall, int addrlen = expression_list_length(addrs_expr_list); int i = 0; size_t size = 0; - struct sockaddr *addr_ptr; + char *addr_ptr; for (i = 0; i < addrlen; i++) { expr = get_arg(addrs_expr_list, i, error); if (expr->type == EXPR_SOCKET_ADDRESS_IPV4) { @@ -3458,23 +3421,24 @@ static int syscall_sctp_sendv(struct state *state, struct syscall_spec *syscall, } } addrs = malloc(size); - addr_ptr = (struct sockaddr *)addrs; + addr_ptr = (char *)addrs; for(i = 0; i < addrlen; i++) { expr = get_arg(addrs_expr_list, i, error); if (expr->type == EXPR_SOCKET_ADDRESS_IPV4) { size = sizeof(struct sockaddr_in); - memcpy(expr->value.socket_address_ipv4, addr_ptr, size); - addr_ptr = addr_ptr + sizeof(struct sockaddr_in); - } else if (expr->type == EXPR_SOCKET_ADDRESS_IPV6) { - size = sizeof(struct sockaddr_in); - memcpy(expr->value.socket_address_ipv6, addr_ptr, size); - addr_ptr = addr_ptr + sizeof(struct sockaddr_in6); + memcpy(addr_ptr, expr->value.socket_address_ipv4, size); + addr_ptr += size; + } else if (expr->type == EXPR_SOCKET_ADDRESS_IPV6) { + size = sizeof(struct sockaddr_in6); + memcpy(addr_ptr, expr->value.socket_address_ipv6, size); + addr_ptr += size; + } else { + return STATUS_ERR; } } } else { return STATUS_ERR; } - addrcnt_expr = get_arg(args, 4, error); if (get_s32(addrcnt_expr, &addrcnt, error)) return STATUS_ERR; -- GitLab