Home | History | Annotate | Download | only in fremovexattr
      1 // SPDX-License-Identifier: GPL-2.0-or-later
      2 /*
      3  * Copyright (c) 2018 Linaro Limited. All rights reserved.
      4  * Author: Rafael David Tinoco <rafael.tinoco (at) linaro.org>
      5  */
      6 
      7 /*
      8  * Test Name: fremovexattr02
      9  *
     10  * Test cases::
     11  * 1) fremovexattr(2) fails if the named attribute does not exist.
     12  * 2) fremovexattr(2) fails if file descriptor is not valid.
     13  * 3) fremovexattr(2) fails if named attribute has an invalid address.
     14  *
     15  * Expected Results:
     16  * fremovexattr(2) should return -1 and set errno to ENODATA.
     17  * fremovexattr(2) should return -1 and set errno to EBADF.
     18  * fremovexattr(2) should return -1 and set errno to EFAULT.
     19  */
     20 
     21 #include "config.h"
     22 #include <sys/types.h>
     23 #include <sys/stat.h>
     24 #include <errno.h>
     25 #include <fcntl.h>
     26 
     27 #ifdef HAVE_SYS_XATTR_H
     28 # include <sys/xattr.h>
     29 #endif
     30 
     31 #include "tst_test.h"
     32 
     33 #ifdef HAVE_SYS_XATTR_H
     34 
     35 #define XATTR_TEST_KEY "user.testkey"
     36 
     37 #define MNTPOINT "mntpoint"
     38 #define FNAME MNTPOINT"/fremovexattr02testfile"
     39 
     40 static int fd = -1;
     41 
     42 struct test_case {
     43 	int fd;
     44 	char *key;
     45 	int exp_err;
     46 };
     47 
     48 struct test_case tc[] = {
     49 	{				/* case 1: attribute does not exist */
     50 	 .key = XATTR_TEST_KEY,
     51 	 .exp_err = ENODATA,
     52 	 },
     53 	{				/* case 2: file descriptor is invalid */
     54 	 .fd = -1,
     55 	 .key = XATTR_TEST_KEY,
     56 	 .exp_err = EBADF,
     57 	 },
     58 	{				/* case 3: bad name attribute */
     59 	 .exp_err = EFAULT,
     60 	},
     61 };
     62 
     63 static void verify_fremovexattr(unsigned int i)
     64 {
     65 	TEST(fremovexattr(tc[i].fd, tc[i].key));
     66 
     67 	if (TST_RET == -1 && TST_ERR == EOPNOTSUPP)
     68 		tst_brk(TCONF, "fremovexattr(2) not supported");
     69 
     70 	if (TST_RET == -1) {
     71 		if (tc[i].exp_err == TST_ERR) {
     72 			tst_res(TPASS | TTERRNO,
     73 				"fremovexattr(2) failed expectedly");
     74 		} else {
     75 			tst_res(TFAIL | TTERRNO,
     76 				"fremovexattr(2) should fail with %s",
     77 				tst_strerrno(tc[i].exp_err));
     78 		}
     79 		return;
     80 	}
     81 
     82 	tst_res(TFAIL, "fremovexattr(2) returned %li", TST_RET);
     83 }
     84 
     85 static void cleanup(void)
     86 {
     87 	if (fd > 0)
     88 		SAFE_CLOSE(fd);
     89 }
     90 
     91 static void setup(void)
     92 {
     93 	size_t i = 0;
     94 
     95 	fd = SAFE_OPEN(FNAME, O_RDWR | O_CREAT, 0644);
     96 
     97 	for (i = 0; i < ARRAY_SIZE(tc); i++) {
     98 
     99 		if (tc[i].fd != -1)
    100 			tc[i].fd = fd;
    101 
    102 		if (!tc[i].key && tc[i].exp_err == EFAULT)
    103 			tc[i].key = tst_get_bad_addr(cleanup);
    104 	}
    105 }
    106 
    107 static struct tst_test test = {
    108 	.setup = setup,
    109 	.test = verify_fremovexattr,
    110 	.cleanup = cleanup,
    111 	.tcnt = ARRAY_SIZE(tc),
    112 	.mntpoint = MNTPOINT,
    113 	.mount_device = 1,
    114 	.all_filesystems = 1,
    115 	.needs_tmpdir = 1,
    116 	.needs_root = 1,
    117 };
    118 
    119 #else /* HAVE_SYS_XATTR_H */
    120 TST_TEST_TCONF("<sys/xattr.h> does not exist");
    121 #endif
    122