Home | History | Annotate | Download | only in flistxattr
      1 /*
      2 * Copyright (c) 2016 RT-RK Institute for Computer Based Systems
      3 * Author: Dejan Jovicevic <dejan.jovicevic (at) rt-rk.com>
      4 *
      5 * This program is free software; you can redistribute it and/or modify it
      6 * under the terms of version 2 of the GNU General Public License as
      7 * published by the Free Software Foundation.
      8 *
      9 * This program is distributed in the hope that it would be useful, but
     10 * WITHOUT ANY WARRANTY; without even the implied warranty of
     11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 *
     13 * You should have received a copy of the GNU General Public License
     14 * alone with this program.
     15 */
     16 
     17 /*
     18 * Test Name: flistxattr02
     19 *
     20 * Description:
     21 * 1) flistxattr(2) fails if the size of the list buffer is too small
     22 * to hold the result.
     23 * 2) flistxattr(2) fails if fd is an invalid file descriptor.
     24 *
     25 * Expected Result:
     26 * 1) flistxattr(2) should return -1 and set errno to ERANGE.
     27 * 2) flistxattr(2) should return -1 and set errno to EBADF.
     28 */
     29 
     30 #include "config.h"
     31 #include <errno.h>
     32 #include <sys/types.h>
     33 
     34 #ifdef HAVE_SYS_XATTR_H
     35 # include <sys/xattr.h>
     36 #endif
     37 
     38 #include "tst_test.h"
     39 
     40 #ifdef HAVE_SYS_XATTR_H
     41 
     42 #define SECURITY_KEY	"security.ltptest"
     43 #define VALUE	"test"
     44 #define VALUE_SIZE	(sizeof(VALUE) - 1)
     45 
     46 static int fd1;
     47 static int fd2 = -1;
     48 
     49 static struct test_case {
     50 	int *fd;
     51 	size_t size;
     52 	int exp_err;
     53 } tc[] = {
     54 	{&fd1, 1, ERANGE},
     55 	{&fd2, 20, EBADF}
     56 };
     57 
     58 static void verify_flistxattr(unsigned int n)
     59 {
     60 	struct test_case *t = tc + n;
     61 	char buf[t->size];
     62 
     63 	TEST(flistxattr(*t->fd, buf, t->size));
     64 	if (TEST_RETURN != -1) {
     65 		tst_res(TFAIL,
     66 			"flistxattr() succeeded unexpectedly (returned %ld)",
     67 			TEST_RETURN);
     68 		return;
     69 	}
     70 
     71 	if (t->exp_err != TEST_ERRNO) {
     72 		tst_res(TFAIL | TTERRNO, "flistxattr() failed "
     73 			 "unexpectedlly, expected %s",
     74 			 tst_strerrno(t->exp_err));
     75 	} else {
     76 		tst_res(TPASS | TTERRNO,
     77 			 "flistxattr() failed as expected");
     78 	}
     79 }
     80 
     81 static void setup(void)
     82 {
     83 	fd1 = SAFE_OPEN("testfile", O_RDWR | O_CREAT, 0644);
     84 
     85 	SAFE_FSETXATTR(fd1, SECURITY_KEY, VALUE, VALUE_SIZE, XATTR_CREATE);
     86 }
     87 
     88 static void cleanup(void)
     89 {
     90 	if (fd1 > 0)
     91 		SAFE_CLOSE(fd1);
     92 }
     93 
     94 static struct tst_test test = {
     95 	.tid = "flistxattr02",
     96 	.needs_tmpdir = 1,
     97 	.needs_root = 1,
     98 	.test = verify_flistxattr,
     99 	.tcnt = ARRAY_SIZE(tc),
    100 	.setup = setup,
    101 	.cleanup = cleanup,
    102 };
    103 
    104 #else /* HAVE_SYS_XATTR_H */
    105 	TST_TEST_TCONF("<sys/xattr.h> does not exist.");
    106 #endif
    107