File: chmod_chown.c

package info (click to toggle)
valgrind 1%3A3.24.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 176,332 kB
  • sloc: ansic: 795,029; exp: 26,134; xml: 23,472; asm: 14,393; cpp: 9,397; makefile: 7,464; sh: 6,122; perl: 5,446; python: 1,498; javascript: 981; awk: 166; csh: 1
file content (65 lines) | stat: -rw-r--r-- 1,476 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Test this family of functions
 * lchmod chownat lchownat
 */

#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main(void)
{
    char buff[64];
    char tmpfile[] = "/tmp/test_chmod_chown.XXXXXX";
    char tmplink[] = "/tmp/test_chx_link.XXXXXX";
    int tmpfd = mkstemp(tmpfile);
    mktemp(tmplink);

    memset(buff, 0, sizeof(buff));
    sprintf(buff, "some data");
    write(tmpfd, buff, strlen(buff)+1);
    close (tmpfd);

    DIR* tmpdir = opendir("/tmp");
    if (tmpdir) {
       int tmpdirfd = dirfd(tmpdir);
 
       if (-1 == symlinkat(tmpfile+5, tmpdirfd, tmplink+5)) {
           perror("linkat failed");
       }
 
       if (-1 == lchmod(tmplink, S_IRWXU|S_IRWXG|S_IRWXO))
       {
          perror("lchmod failed:");
       }
 
       if (fchmodat(tmpdirfd, tmpfile+5, S_IRWXU|S_IRWXG|S_IRWXO, 0))
       {
          perror("fchmodat failed:");
       }
 
       // no test for failure as not everyone runnning this will be a member of group 921
       fchownat(tmpdirfd, tmpfile+5, getuid(), 920, 0);

       closedir(tmpdir);
    }

    unlink(tmpfile);
    unlink(tmplink);
 
    // error section
    char* badstring = strdup("foo");
    free(badstring);
    int badint1;
    int badint2;
    int badint3;
    int badint4;
 
    lchmod(badstring, badint1);
    fchmodat(badint1, badstring, badint2, badint3);
    fchownat(badint1, badstring, badint2, badint3, badint4);
}