Add EINVAL errnor nuber tests for read(2):
* The file was opened with the O_DIRECT flag, and the alignment of the user
  buffer was not multiples of the logical block size of the file system,
  expect an EINVAL.

* The file was opened with the O_DIRECT flag, and transfer sizes was not
  multiples of the logical block size of the file system, expect an EINVAL.

Signed-off-by: Zeng Linggang <[email protected]>
---
 testcases/kernel/syscalls/read/read02.c | 53 ++++++++++++++++++++++++++++-----
 1 file changed, 46 insertions(+), 7 deletions(-)

diff --git a/testcases/kernel/syscalls/read/read02.c 
b/testcases/kernel/syscalls/read/read02.c
index 8aabe93..0e227fe 100644
--- a/testcases/kernel/syscalls/read/read02.c
+++ b/testcases/kernel/syscalls/read/read02.c
@@ -27,6 +27,16 @@
  *
  *     test 3:
  *     Pass buf = -1 as a parmeter to read, expect an EFAULT.
+ *
+ *     test 4:
+ *     The file was opened with the O_DIRECT flag, and the alignment of the
+ *     user buffer was not multiples of the logical block size of the file
+ *     system, expect an EINVAL.
+ *
+ *     test 5:
+ *     The file was opened with the O_DIRECT flag, and transfer sizes was not
+ *     multiples of the logical block size of the file system, expect an
+ *     EINVAL.
  */
 
 #define _GNU_SOURCE
@@ -41,22 +51,30 @@
 #include "safe_macros.h"
 
 #define TEST_FILE      "test_file"
+#define TEST_FILE4     "/root/test_file4"
 
 char *TCID = "read02";
 
 static int badfd = -1;
-static int fd2, fd3;
+static int fd2, fd3, fd4;
 static char buf[BUFSIZ];
-static int exp_enos[] = { EBADF, EISDIR, EFAULT, 0 };
+static void *outside_buf = (void *)-1;
+static void *temp;
+static void *addr4;
+static void *addr5;
+static int exp_enos[] = { EBADF, EISDIR, EFAULT, EINVAL, 0 };
 
 static struct test_case_t {
        int *fd;
-       void *buf;
+       void **buf;
+       size_t count;
        int exp_error;
 } TC[] = {
-       {&badfd, buf, EBADF},
-       {&fd2, buf, EISDIR},
-       {&fd3, (void *)-1, EFAULT},
+       {&badfd, (void **)&buf, 1, EBADF},
+       {&fd2, (void **)&buf, 1, EISDIR},
+       {&fd3, &outside_buf, 1, EFAULT},
+       {&fd4, &addr4, 4096, EINVAL},
+       {&fd4, &addr5, 1, EINVAL},
 };
 
 int TST_TOTAL = ARRAY_SIZE(TC);
@@ -89,6 +107,11 @@ int main(int ac, char **av)
 
 static void setup(void)
 {
+       if ((tst_kvercmp(2, 4, 10)) < 0)
+               tst_brkm(TCONF, NULL, "This test needs kernel 2.4.10 or newer");
+
+       tst_require_root(NULL);
+
        tst_sig(NOFORK, DEF_HANDLER, cleanup);
 
        TEST_PAUSE;
@@ -100,11 +123,19 @@ static void setup(void)
        SAFE_FILE_PRINTF(cleanup, TEST_FILE, "A");
 
        fd3 = SAFE_OPEN(cleanup, TEST_FILE, O_RDWR | O_CREAT, 0666);
+
+       temp = SAFE_MALLOC(cleanup, 4096*10);
+
+       addr4 = (char *)(((long)buf & (~4095)) + 1);
+       addr5 = (char *)((long)buf & (~4095));
+
+       SAFE_FILE_PRINTF(cleanup, TEST_FILE4, "A");
+       fd4 = SAFE_OPEN(cleanup, TEST_FILE4, O_RDWR | O_DIRECT, 0777);
 }
 
 static void read_verify(const struct test_case_t *test)
 {
-       TEST(read(*test->fd, test->buf, 1));
+       TEST(read(*test->fd, *test->buf, test->count));
 
        if (TEST_RETURN != -1) {
                tst_resm(TFAIL, "call succeeded unexpectedly");
@@ -127,6 +158,14 @@ static void cleanup(void)
 {
        TEST_CLEANUP;
 
+       free(temp);
+
+       if (fd4 > 0)
+               close(fd4);
+
+       if (unlink(TEST_FILE4) < 0)
+               tst_resm(TWARN | TERRNO, "unlink(\"%s\") failed", TEST_FILE4);
+
        if (fd3 > 0)
                close(fd3);
 
-- 
1.8.4.2




------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to