Home | History | Annotate | Download | only in open
      1 /*
      2  * Copyright (c) International Business Machines  Corp., 2001
      3  *	07/2001 Ported by Wayne Boyer
      4  *	06/2017 Modified by Guangwen Feng <fenggw-fnst (at) cn.fujitsu.com>
      5  *
      6  * This program is free software;  you can redistribute it and/or modify
      7  * it under the terms of the GNU General Public License as published by
      8  * the Free Software Foundation; either version 2 of the License, or
      9  * (at your option) any later version.
     10  *
     11  * This program is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY;  without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     14  * the GNU General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU General Public License
     17  * along with this program;  if not, write to the Free Software
     18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19  */
     20 /*
     21  * DESCRIPTION
     22  *	1. open a new file without O_CREAT, ENOENT should be returned.
     23  *	2. open a file with O_RDONLY | O_NOATIME and the caller was not
     24  *	   privileged, EPERM should be returned.
     25  */
     26 
     27 #define _GNU_SOURCE
     28 
     29 #include <stdio.h>
     30 #include <sys/types.h>
     31 #include <sys/stat.h>
     32 #include <errno.h>
     33 #include <fcntl.h>
     34 #include <pwd.h>
     35 #include "tst_test.h"
     36 
     37 #define TEST_FILE	"test_file"
     38 #define TEST_FILE2	"test_file2"
     39 
     40 static struct tcase {
     41 	char *filename;
     42 	int flag;
     43 	int exp_errno;
     44 } tcases[] = {
     45 	{TEST_FILE, O_RDWR, ENOENT},
     46 	{TEST_FILE2, O_RDONLY | O_NOATIME, EPERM},
     47 };
     48 
     49 void setup(void)
     50 {
     51 	struct passwd *ltpuser;
     52 
     53 	SAFE_TOUCH(TEST_FILE2, 0644, NULL);
     54 
     55 	ltpuser = SAFE_GETPWNAM("nobody");
     56 
     57 	SAFE_SETEUID(ltpuser->pw_uid);
     58 }
     59 
     60 static void verify_open(unsigned int n)
     61 {
     62 	struct tcase *tc = &tcases[n];
     63 
     64 	TEST(open(tc->filename, tc->flag, 0444));
     65 
     66 	if (TEST_RETURN != -1) {
     67 		tst_res(TFAIL, "open(%s) succeeded unexpectedly",
     68 			tc->filename);
     69 		return;
     70 	}
     71 
     72 	if (tc->exp_errno != TEST_ERRNO) {
     73 		tst_res(TFAIL | TTERRNO,
     74 			"open() should fail with %s",
     75 			tst_strerrno(tc->exp_errno));
     76 		return;
     77 	}
     78 
     79 	tst_res(TPASS | TTERRNO, "open() failed as expected");
     80 }
     81 
     82 void cleanup(void)
     83 {
     84 	SAFE_SETEUID(0);
     85 }
     86 
     87 static struct tst_test test = {
     88 	.tcnt = ARRAY_SIZE(tcases),
     89 	.needs_root = 1,
     90 	.needs_tmpdir = 1,
     91 	.setup = setup,
     92 	.cleanup = cleanup,
     93 	.test = verify_open,
     94 };
     95