diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index b25215d9a878f78609d02823d13631f17b26a9d0..7403cc711344cc476b5e5a9e3639f708ba87488e 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -248,7 +248,7 @@ static int get_socklen_t(struct expression *expression, return STATUS_OK; } -#ifdef linux +#if defined(linux) || defined(__FreeBSD__) /* Sets the value from the expression argument, checking that it is a * valid size_t, and matches the expected type. Returns STATUS_OK on * success; on failure returns STATUS_ERR and sets error message. @@ -3468,14 +3468,16 @@ static int syscall_sctp_sendmsg(struct state *state, struct syscall_spec *syscal struct expression_list *args, char **error) { #if defined(__FreeBSD__) || defined(linux) - int result, script_fd, live_fd, len; + int result, script_fd, live_fd; void *msg = NULL; struct sockaddr_storage to; struct sockaddr_storage *to_ptr = &to; socklen_t tolen = 0; + size_t len; u32 ppid, flags, timetolive, context; u16 stream_no; - struct expression *sockaddr_expr, *tolen_expr, *ppid_expr, *flags_expr, *ttl_expr, *stream_no_expr, *context_expr; + struct expression *sockaddr_expr, *tolen_expr, *ppid_expr, *flags_expr, *ttl_expr; + struct expression *len_expr, *stream_no_expr, *context_expr; if (check_arg_count(args, 10, error)) return STATUS_ERR; @@ -3485,15 +3487,16 @@ static int syscall_sctp_sendmsg(struct state *state, struct syscall_spec *syscal return STATUS_ERR; if (ellipsis_arg(args, 1, error)) return STATUS_ERR; - if (s32_arg(args, 2, &len, error)) + len_expr = get_arg(args, 2, error); + if (get_size_t(len_expr, &len, error)) return STATUS_ERR; sockaddr_expr = get_arg(args, 3, error); if (sockaddr_expr->type == EXPR_ELLIPSIS) { - socklen_t len = (socklen_t)sizeof(struct sockaddr_storage); - if (getpeername(live_fd, (struct sockaddr *)to_ptr, &len)) { + socklen_t socklen = (socklen_t)sizeof(struct sockaddr_storage); + if (getpeername(live_fd, (struct sockaddr *)to_ptr, &socklen)) { return STATUS_ERR; } - tolen = len; + tolen = socklen; } else if (sockaddr_expr->type == EXPR_NULL) { to_ptr = NULL; tolen = 0; @@ -3533,7 +3536,7 @@ static int syscall_sctp_sendmsg(struct state *state, struct syscall_spec *syscal assert(msg != NULL); begin_syscall(state, syscall); - result = sctp_sendmsg(live_fd, msg, (size_t)len, (struct sockaddr *) to_ptr, + result = sctp_sendmsg(live_fd, msg, len, (struct sockaddr *) to_ptr, tolen, ppid, flags, stream_no, timetolive, context); free(msg); @@ -3731,7 +3734,7 @@ static int syscall_sctp_recvmsg(struct state *state, struct syscall_spec *syscal } return STATUS_OK; #else - asprintf(error, "sctp_sendmsg is not supported"); + asprintf(error, "sctp_recvmsg is not supported"); return STATUS_ERR; #endif } @@ -4019,7 +4022,7 @@ static int syscall_sctp_send(struct state *state, struct syscall_spec *syscall, if (ellipsis_arg(args, 1, error)) return STATUS_ERR; len_expr = get_arg(args, 2, error); - if (get_u32(len_expr, &len, error)) { + if (get_size_t(len_expr, &len, error)) { return STATUS_ERR; } info_expr = get_arg(args, 3, error);