1865695bbc89088b9526ea9045410e5afb70a985cplars/* 2a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * Copyright (c) International Business Machines Corp., 2001 3865695bbc89088b9526ea9045410e5afb70a985cplars * 4a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * This program is free software; you can redistribute it and/or modify 5a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * it under the terms of the GNU General Public License as published by 6a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * the Free Software Foundation; either version 2 of the License, or 7a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * (at your option) any later version. 8865695bbc89088b9526ea9045410e5afb70a985cplars * 9a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * This program is distributed in the hope that it will be useful, 10a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * but WITHOUT ANY WARRANTY; without even the implied warranty of 11a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * the GNU General Public License for more details. 13865695bbc89088b9526ea9045410e5afb70a985cplars * 14a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * You should have received a copy of the GNU General Public License 15a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * along with this program; if not, write to the Free Software 16a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17865695bbc89088b9526ea9045410e5afb70a985cplars */ 18865695bbc89088b9526ea9045410e5afb70a985cplars 19865695bbc89088b9526ea9045410e5afb70a985cplars/* 20865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description: 21865695bbc89088b9526ea9045410e5afb70a985cplars * Verify that, lchown(2) succeeds to change the owner and group of a file 224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * specified by path to any numeric owner(uid)/group(gid) values when invoked 23865695bbc89088b9526ea9045410e5afb70a985cplars * by super-user. 24865695bbc89088b9526ea9045410e5afb70a985cplars * 25865695bbc89088b9526ea9045410e5afb70a985cplars * Expected Result: 264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * lchown(2) should return 0 and the ownership set on the file should match 27865695bbc89088b9526ea9045410e5afb70a985cplars * the numeric values contained in owner and group respectively. 28bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak * 29865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 30865695bbc89088b9526ea9045410e5afb70a985cplars * 07/2001 Ported by Wayne Boyer 31a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper * 11/2010 Code cleanup by Cyril Hrubis chrubis@suse.cz 32865695bbc89088b9526ea9045410e5afb70a985cplars */ 33865695bbc89088b9526ea9045410e5afb70a985cplars 34865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h> 35865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/types.h> 36865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/stat.h> 37a7fa8561a5a095faf6e202a80b0c7729be8bb82dSteven Jackson#include <fcntl.h> 38865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 39865695bbc89088b9526ea9045410e5afb70a985cplars#include <string.h> 40865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h> 41865695bbc89088b9526ea9045410e5afb70a985cplars 42865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h" 43a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh#include "compat_16.h" 44865695bbc89088b9526ea9045410e5afb70a985cplars 457ec1c895ed3c59f9a718f00389feec2acf8c0783Garrett Cooper#define FILE_MODE (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) 46865695bbc89088b9526ea9045410e5afb70a985cplars#define TESTFILE "testfile" 47865695bbc89088b9526ea9045410e5afb70a985cplars#define SFILE "slink_file" 48865695bbc89088b9526ea9045410e5afb70a985cplars 49a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav KholmanskikhTCID_DEFINE(lchown01); 50a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooperint TST_TOTAL = 5; 51865695bbc89088b9526ea9045410e5afb70a985cplars 52a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooperstruct test_case_t { 53865695bbc89088b9526ea9045410e5afb70a985cplars char *desc; 54865695bbc89088b9526ea9045410e5afb70a985cplars uid_t user_id; 55865695bbc89088b9526ea9045410e5afb70a985cplars gid_t group_id; 56865695bbc89088b9526ea9045410e5afb70a985cplars}; 57865695bbc89088b9526ea9045410e5afb70a985cplars 58a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooperstatic struct test_case_t test_cases[] = { 59a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper {"Change Owner/Group ids", 700, 701}, 60354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"Change Owner id only", 702, -1}, 61a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper {"Change Owner/Group ids", 703, 701}, 62354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"Change Group id only", -1, 704}, 63a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper {"Change Group/Group ids", 703, 705}, 64354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {"Change none", -1, -1}, 65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao {NULL, 0, 0} 66a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper}; 67a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper 68a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikhstatic void setup(void); 69a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikhstatic void cleanup(void); 70865695bbc89088b9526ea9045410e5afb70a985cplars 71a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooperint main(int argc, char *argv[]) 72865695bbc89088b9526ea9045410e5afb70a985cplars{ 73a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper struct stat stat_buf; 7443088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper int lc; 7543088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper int i; 7656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 77d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(argc, argv, NULL, NULL); 78865695bbc89088b9526ea9045410e5afb70a985cplars 79865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 80865695bbc89088b9526ea9045410e5afb70a985cplars 81865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 822c28215423293e443469a07ae7011135d058b671Garrett Cooper 83d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 84865695bbc89088b9526ea9045410e5afb70a985cplars 85a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper for (i = 0; test_cases[i].desc != NULL; i++) { 86a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper uid_t user_id = test_cases[i].user_id; 87a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper gid_t group_id = test_cases[i].group_id; 88a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper char *test_desc = test_cases[i].desc; 89865695bbc89088b9526ea9045410e5afb70a985cplars 904bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 9143088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper * Call lchown(2) with different user id and 92865695bbc89088b9526ea9045410e5afb70a985cplars * group id (numeric values) to set it on 93865695bbc89088b9526ea9045410e5afb70a985cplars * symlink of testfile. 9456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 95a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh TEST(LCHOWN(cleanup, SFILE, user_id, group_id)); 96865695bbc89088b9526ea9045410e5afb70a985cplars 97865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN == -1) { 98865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, 99a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper "lchown() Fails to %s, errno %d", 100865695bbc89088b9526ea9045410e5afb70a985cplars test_desc, TEST_ERRNO); 101865695bbc89088b9526ea9045410e5afb70a985cplars continue; 102865695bbc89088b9526ea9045410e5afb70a985cplars } 103e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis 104e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (lstat(SFILE, &stat_buf) < 0) { 105e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis tst_brkm(TFAIL, cleanup, "lstat(2) " 106e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "%s failed, errno %d", 107e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis SFILE, TEST_ERRNO); 108e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis } 109e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis 110e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (user_id == -1) { 111e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (i > 0) 112e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis user_id = 113e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis test_cases[i - 1].user_id; 114e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis else 115e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis user_id = geteuid(); 116e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis } 117e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis 118e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (group_id == -1) { 119e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if (i > 0) 120e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis group_id = 121e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis test_cases[i - 1].group_id; 122e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis else 123e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis group_id = getegid(); 124e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis } 125e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis 126865695bbc89088b9526ea9045410e5afb70a985cplars /* 127e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * Check for expected Ownership ids 128e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis * set on testfile. 129865695bbc89088b9526ea9045410e5afb70a985cplars */ 130e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis if ((stat_buf.st_uid != user_id) || 131e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis (stat_buf.st_gid != group_id)) { 132e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis tst_resm(TFAIL, 133e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "%s: incorrect ownership set, " 134e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "Expected %d %d", SFILE, 135e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis user_id, group_id); 136865695bbc89088b9526ea9045410e5afb70a985cplars } else { 137e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis tst_resm(TPASS, "lchown() succeeds to " 138e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis "%s of %s", test_desc, SFILE); 139865695bbc89088b9526ea9045410e5afb70a985cplars } 140865695bbc89088b9526ea9045410e5afb70a985cplars } 141a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper } 142865695bbc89088b9526ea9045410e5afb70a985cplars 143865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 1445ded27d295f3dd15adf7ffc49aefa594b905cd9eGarrett Cooper tst_exit(); 145a99df35ae15625d5d1f2bc161ef2681918cbb238Garrett Cooper} 146865695bbc89088b9526ea9045410e5afb70a985cplars 147a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikhstatic void setup(void) 148865695bbc89088b9526ea9045410e5afb70a985cplars{ 149865695bbc89088b9526ea9045410e5afb70a985cplars int fd; 150865695bbc89088b9526ea9045410e5afb70a985cplars 151865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(NOFORK, DEF_HANDLER, cleanup); 1522c28215423293e443469a07ae7011135d058b671Garrett Cooper 153d1e794d62b1bf619df8390535e4c2a58899b1145Cyril Hrubis tst_require_root(); 1542c28215423293e443469a07ae7011135d058b671Garrett Cooper 155865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 156865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); 157865695bbc89088b9526ea9045410e5afb70a985cplars 158354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((fd = open(TESTFILE, O_RDWR | O_CREAT, FILE_MODE)) == -1) { 15955535b8815ecaad2753925d418c2d3f4e90150edGarrett Cooper tst_brkm(TBROK, cleanup, "open failed"); 160865695bbc89088b9526ea9045410e5afb70a985cplars } 161865695bbc89088b9526ea9045410e5afb70a985cplars if (close(fd) == -1) { 162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, "close failed"); 163865695bbc89088b9526ea9045410e5afb70a985cplars } 1642c28215423293e443469a07ae7011135d058b671Garrett Cooper 165865695bbc89088b9526ea9045410e5afb70a985cplars if (symlink(TESTFILE, SFILE) < 0) { 166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, "symlink failed"); 167865695bbc89088b9526ea9045410e5afb70a985cplars } 168865695bbc89088b9526ea9045410e5afb70a985cplars} 169865695bbc89088b9526ea9045410e5afb70a985cplars 170a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikhstatic void cleanup(void) 171865695bbc89088b9526ea9045410e5afb70a985cplars{ 172865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 173ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 174