Skip to content
Snippets Groups Projects
Commit b5cddb04 authored by Aomx's avatar Aomx
Browse files

refined if statements for desired behaviour at accept syscalls

parent ff14fdb6
No related branches found
No related tags found
No related merge requests found
...@@ -514,7 +514,7 @@ static void begin_syscall(struct state *state, struct syscall_spec *syscall) ...@@ -514,7 +514,7 @@ static void begin_syscall(struct state *state, struct syscall_spec *syscall)
enum result_check_t { enum result_check_t {
CHECK_EXACT, /* check that result matches exactly */ CHECK_EXACT, /* check that result matches exactly */
CHECK_NON_NEGATIVE, /* check that result is non-negative */ CHECK_NON_NEGATIVE, /* check that result is non-negative */
CHECK_ANY, /* accept any result */ CHECK_ACCEPT, /* checks for results after accept-syscall */
}; };
static int end_syscall(struct state *state, struct syscall_spec *syscall, static int end_syscall(struct state *state, struct syscall_spec *syscall,
enum result_check_t mode, int actual, char **error) enum result_check_t mode, int actual, char **error)
...@@ -558,8 +558,20 @@ static int end_syscall(struct state *state, struct syscall_spec *syscall, ...@@ -558,8 +558,20 @@ static int end_syscall(struct state *state, struct syscall_spec *syscall,
expected, actual); expected, actual);
return STATUS_ERR; return STATUS_ERR;
} }
} else if (mode == CHECK_ANY) { } else if (mode == CHECK_ACCEPT) {
return STATUS_OK; if (expected >= 0 && actual < 0) {
asprintf(error,
"Expected non-negative result but got %d "
"with errno %d (%s)",
actual, actual_errno, strerror(actual_errno));
return STATUS_ERR;
}
else if (expected < 0 && actual != expected) {
asprintf(error,
"Expected result %d but got %d",
expected, actual);
return STATUS_ERR;
}
}else { }else {
assert(!"bad mode"); assert(!"bad mode");
} }
...@@ -997,7 +1009,7 @@ static int syscall_accept(struct state *state, struct syscall_spec *syscall, ...@@ -997,7 +1009,7 @@ static int syscall_accept(struct state *state, struct syscall_spec *syscall,
result = accept(live_fd, (struct sockaddr *)&live_addr, &live_addrlen); result = accept(live_fd, (struct sockaddr *)&live_addr, &live_addrlen);
if (end_syscall(state, syscall, CHECK_ANY, result, error)) if (end_syscall(state, syscall, CHECK_ACCEPT, result, error))
return STATUS_ERR; return STATUS_ERR;
if (result >= 0) { if (result >= 0) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment