From: Caspar Z. <cz...@re...> - 2011-03-03 17:16:57
|
On 01/21/2011 04:28 PM, Garrett Cooper wrote: > On Thu, Jan 20, 2011 at 5:30 AM, Cristian Greco <cri...@re...> wrote: >> > Hi, >> > >> > [ please keep CC as I'm not currently subscribed to the list ] >> > >> > please find attached a small fix to check for root privileges in >> > acct(2) testcase (syscalls/acct/acct01.c). > Thanks for spotting the issue. I've fixed it, added a few more > testcases, and discovered what appears to be a kernel bug on 2.6.34 > (acct("/tmp/does/not/exist") should fail with == -1 and errno == > ENOTDIR) :)... > Cheers, > -Garrett a follow-up fix for http://article.gmane.org/gmane.linux.ltp/13576 . In fact, it's not a kernel bug of ENOTDIR's failure. ENOTDIR means that you setup a string as directory in argument, but it is actually a file. The patch fixes this failure. The result of given path /tmp/does/not/exist should be expected as ENOENT. And also, there is a mistake in EPERM case, to restore the permissions, SAFE_SETUID should be used instead of SAFE_SETGID, else it will never recover the permissions. Signed-off-by: Caspar Zhang <cz...@re...> --- testcases/kernel/syscalls/acct/acct01.c | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) diff --git a/testcases/kernel/syscalls/acct/acct01.c b/testcases/kernel/syscalls/acct/acct01.c index 5314f4f..324d423 100644 --- a/testcases/kernel/syscalls/acct/acct01.c +++ b/testcases/kernel/syscalls/acct/acct01.c @@ -96,26 +96,36 @@ int main(int argc, char *argv[]) setup(); + /* EISDIR */ if (acct("/") == -1 && errno == EISDIR) tst_resm(TPASS, "Failed with EISDIR as expected"); else tst_brkm(TFAIL|TERRNO, cleanup, "didn't fail as expected; expected EISDIR"); + /* EACCES */ if (acct("/dev/null") == -1 && errno == EACCES) tst_resm(TPASS, "Failed with EACCES as expected"); else tst_brkm(TFAIL|TERRNO, cleanup, "didn't fail as expected; expected EACCES"); - if (acct("/tmp/does/not/exist") == -1 && errno == ENOTDIR) + /* ENOENT */ + if (acct("/tmp/does/not/exist") == -1 && errno == ENOENT) + tst_resm(TPASS, "Failed with ENOENT as expected"); + else + tst_brkm(TBROK|TERRNO, cleanup, + "didn't fail as expected; expected ENOENT"); + + /* ENOTDIR */ + if (acct("/etc/fstab/") == -1 && errno == ENOTDIR) tst_resm(TPASS, "Failed with ENOTDIR as expected"); else tst_brkm(TFAIL|TERRNO, cleanup, "didn't fail as expected; expected ENOTDIR"); + /* EPERM */ sprintf(tmpbuf, "./%s.%d", TCID, getpid()); - fd = SAFE_CREAT(cleanup, tmpbuf, 0777); SAFE_CLOSE(cleanup, fd); @@ -123,25 +133,17 @@ int main(int argc, char *argv[]) tst_brkm(TBROK|TERRNO, cleanup, "acct failed unexpectedly"); pwent = SAFE_GETPWNAM(cleanup, "nobody"); - SAFE_SETEUID(cleanup, pwent->pw_uid); if (acct(tmpbuf) == -1 && errno == EPERM) - tst_resm(TPASS, "acct failed as expected with EPERM"); + tst_resm(TPASS, "Failed with EPERM as expected"); else tst_brkm(TBROK|TERRNO, cleanup, - "acct didn't fail as expected with EPERM"); - - SAFE_SETEGID(cleanup, 0); + "didn't fail as expected; expected EPERM"); + SAFE_SETEUID(cleanup, 0); SAFE_UNLINK(cleanup, tmpbuf); - if (acct(tmpbuf) == -1 && errno == ENOENT) - tst_resm(TPASS, "acct failed as expected with ENOENT"); - else - tst_brkm(TBROK|TERRNO, cleanup, - "acct didn't fail as expected with ENOENT"); - cleanup(); tst_exit(); } -- 1.7.4.1 -- Quality Engineer (Kernel) in Red Hat Software (Beijing) Co., R&D Branch http://www.cn.redhat.com/ TEL: +86-10-62608150 |