[LTP] [PATCH 1/2] preadv/preadv02.c: add specific error for preadv()

Cyril Hrubis chrubis@suse.cz
Thu Mar 31 16:13:43 CEST 2016


Hi!
>  /*
> -* Copyright (c) 2015 Fujitsu Ltd.
> +* Copyright (c) 2016 Fujitsu Ltd.

The 2015 should stay there, you should make it:

Copyright (c) 2015-2016 Fujitsu Ltd.

>  * Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
>  *
>  * This program is free software; you can redistribute it and/or modify it
> @@ -21,14 +21,21 @@
>  * 1) preadv(2) fails if iov_len is invalid.
>  * 2) preadv(2) fails if the vector count iovcnt is less than zero.
>  * 3) preadv(2) fails if offset is negative.
> +* 4) preadv(2) fails when attempts to read into a invalid address.
> +* 5) preadv(2) fails if file descriptor is invalid.
> +* 6) preadv(2) fails if file descriptor is not open for reading.
>  *
>  * Expected Result:
>  * 1) preadv(2) should return -1 and set errno to EINVAL.
>  * 2) preadv(2) should return -1 and set errno to EINVAL.
>  * 3) preadv(2) should return -1 and set errno to EINVAL.
> +* 4) preadv(2) should return -1 and set errno to EFAULT.
> +* 5) preadv(2) should return -1 and set errno to EBADF.
> +* 6) preadv(2) should return -1 and set errno to EBADF.
>  */
>  
>  #include <errno.h>
> +#include <sys/uio.h>
>  
>  #include "test.h"
>  #include "preadv.h"
> @@ -36,7 +43,8 @@
>  
>  #define CHUNK           64
>  
> -static int fd;
> +static int fd1;
> +static int fd2;
>  static char buf[CHUNK];
>  
>  static struct iovec rd_iovec1[] = {
> @@ -45,24 +53,33 @@ static struct iovec rd_iovec1[] = {
>  
>  static struct iovec rd_iovec2[] = {
>  	{buf, CHUNK},
> +	{(char *)-1, CHUNK},
>  };
>  
>  static struct test_case_t {
> +	int des;

This should be called fd, calling it des is quite confusing. Also it
should be pointer to int and it should be initialized to &fd1 or &fd2
instead of setting it in the setup().

>  	struct iovec *name;
>  	int count;
>  	off_t offset;
> +	int exp_err;
>  } tc[] = {
>  	/* test1 */
> -	{rd_iovec1, 1, 0},
> +	{0, rd_iovec1, 1, 0, EINVAL},
>  	/* test2 */
> -	{rd_iovec2, -1, 0},
> +	{0, rd_iovec2, -1, 0, EINVAL},
>  	/* test3 */
> -	{rd_iovec2, 1, -1}
> +	{0, rd_iovec2, 1, -1, EINVAL},
> +	/* test4 */
> +	{0, rd_iovec2, 2, 0, EFAULT},
> +	/* test5 */
> +	{-1, rd_iovec2, 1, 0, EBADF},
> +	/* test6 */
> +	{0, rd_iovec2, 1, 0, EBADF}
>  };
>  
> -void verify_preadv(struct test_case_t *tc);
> -void setup(void);
> -void cleanup(void);
> +static void verify_preadv(struct test_case_t *tc);
> +static void setup(void);
> +static void cleanup(void);
>  
>  char *TCID = "preadv02";
>  int TST_TOTAL = ARRAY_SIZE(tc);
> @@ -86,23 +103,27 @@ int main(int ac, char **av)
>  	tst_exit();
>  }
>  
> -void verify_preadv(struct test_case_t *tc)
> +static void verify_preadv(struct test_case_t *tc)
>  {
> -	TEST(preadv(fd, tc->name, tc->count, tc->offset));
> +	TEST(preadv(tc->des, tc->name, tc->count, tc->offset));
>  	if (TEST_RETURN == 0) {
> -		tst_resm(TFAIL, "preadv(2) succeed unexpectedly");
> +		tst_resm(TFAIL, "preadv() succeeded unexpectedly");
>  	} else {
> -		if (TEST_ERRNO == EINVAL) {
> -			tst_resm(TPASS | TTERRNO, "preadv(2) fails as expected");
> +		if (TEST_ERRNO == tc->exp_err) {
> +			tst_resm(TPASS | TTERRNO,
> +				 "preadv() failed as expected");
>  		} else {
> -			tst_resm(TFAIL | TTERRNO, "preadv(2) fails unexpectedly,"
> -				 " expected errno is EINVAL");
> +			tst_resm(TFAIL | TTERRNO,
> +				 "preadv() failed unexpectedly, expected"
> +				 " errno is %s", tst_strerrno(tc->exp_err));
>  		}
>  	}
>  }
>  
> -void setup(void)
> +static void setup(void)
>  {
> +	int i;
> +
>  	if ((tst_kvercmp(2, 6, 30)) < 0) {
>  		tst_brkm(TCONF, NULL, "This test can only run on kernels"
>  			 " that are 2.6.30 or higher.");
> @@ -114,12 +135,22 @@ void setup(void)
>  
>  	tst_tmpdir();
>  
> -	fd = SAFE_OPEN(cleanup, "file", O_RDWR | O_CREAT, 0644);
> +	fd1 = SAFE_OPEN(cleanup, "file1", O_RDWR | O_CREAT, 0644);
> +
> +	fd2 = SAFE_OPEN(cleanup, "file2", O_WRONLY | O_CREAT, 0644);
> +
> +	for (i = 0; i < 4; i++)
> +		tc[i].des = fd1;
> +
> +	tc[5].des = fd2;
>  }
>  
> -void cleanup(void)
> +static void cleanup(void)
>  {
> -	if (fd > 0 && close(fd))
> +	if (fd1 > 0 && close(fd1))
> +		tst_resm(TWARN | TERRNO, "failed to close file");
> +
> +	if (fd2 > 0 && close(fd2))
>  		tst_resm(TWARN | TERRNO, "failed to close file");
>  
>  	tst_rmdir();


Otherwise it looks fine.

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list