Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
syscalls/read02: fix invalid buf parameter when testing for bad fds
The read02 testcases 1 and 2 are intended to check the handling
of the read syscall with an invalid fd (should fail EBADF) and
an fd which is a directory (should fail EISDIR). However a bug
in the test code meant that it also passed a NULL pointer as
the buffer argument, and so the test only succeeded because of
the implementation detail that the kernel happens to check for
the EBADF and EISDIR errors before it checks the buffer pointer
validity for an EFAULT error.

The 'buf' field in the test_case_t structure is supposed to be
a pointer to the address of the buffer, but it was being
initialised with the address of the buffer itself; fix this by
adding the extra indirection via a new 'bufaddr' variable, so
that the test is checking the condition it intends to and nothing
more.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Acked-by: Jan Stancek <jstancek@redhat.com>
  • Loading branch information
pm215 authored and jstancek committed Jul 15, 2016
1 parent 6ce94db commit 3d4b0e9
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions testcases/kernel/syscalls/read/read02.c
Expand Up @@ -54,6 +54,7 @@ char *TCID = "read02";
static int badfd = -1;
static int fd2, fd3, fd4 = -1;
static char buf[BUFSIZ];
static void *bufaddr = buf;
static void *outside_buf = (void *)-1;
static void *addr4;
static void *addr5;
Expand All @@ -66,8 +67,8 @@ static struct test_case_t {
size_t count;
int exp_error;
} TC[] = {
{&badfd, (void **)&buf, 1, EBADF},
{&fd2, (void **)&buf, 1, EISDIR},
{&badfd, &bufaddr, 1, EBADF},
{&fd2, &bufaddr, 1, EISDIR},
#ifndef UCLINUX
{&fd3, &outside_buf, 1, EFAULT},
#endif
Expand Down

0 comments on commit 3d4b0e9

Please sign in to comment.