1/* Tests various combinations of dfd and pathname for *at syscalls.
2   In particular, dfd should not be checked when pathname is absolute.
3   See https://bugs.kde.org/show_bug.cgi?id=307103 for more information.
4 */
5
6#include "config.h"
7
8#include <fcntl.h>
9#include <stdio.h>
10#include <unistd.h>
11#include <sys/stat.h>
12#include <sys/syscall.h>
13
14#define DIRECTORY "/tmp/"
15#define FILENAME "abc123"
16
17int main(void)
18{
19   char buf[1];
20   struct stat stats;
21
22   int dfd = open(DIRECTORY, O_RDONLY);
23
24   /* linkat */
25   linkat(dfd, FILENAME, dfd, FILENAME, 0);
26   linkat(0x9879151, DIRECTORY FILENAME, 0x9879152, DIRECTORY FILENAME, 0);
27   linkat(AT_FDCWD, FILENAME, AT_FDCWD, FILENAME, 0);
28   linkat(0x9879153, FILENAME, 0x9879154, FILENAME, 0); /* warning for this one */
29
30   /* symlinkat */
31   symlinkat(FILENAME, dfd, FILENAME);
32   symlinkat(DIRECTORY FILENAME, 0x26868151, DIRECTORY FILENAME);
33   symlinkat(FILENAME, AT_FDCWD, FILENAME);
34   symlinkat(FILENAME, 0x26868152, FILENAME); /* warning for this one */
35
36   /* readlinkat */
37   readlinkat(dfd, FILENAME, buf, 1);
38   readlinkat(0x4368151, DIRECTORY FILENAME, buf, 1);
39   readlinkat(AT_FDCWD, FILENAME, buf, 1);
40   readlinkat(0x4368152, FILENAME, buf, 1); /* warning for this one */
41
42#if defined(SOLARIS_FREALPATHAT_SYSCALL)
43   /* frealpathat - not available directly */
44   syscall(SYS_frealpathat, dfd, FILENAME, buf, 1);
45   syscall(SYS_frealpathat, 0x443115, DIRECTORY FILENAME, buf, 1);
46   syscall(SYS_frealpathat, AT_FDCWD, FILENAME, buf, 1);
47#endif /* SOLARIS_FREALPATHAT_SYSCALL */
48
49   /* faccessat */
50   faccessat(dfd, FILENAME, F_OK, 0);
51   faccessat(0x4132151, DIRECTORY FILENAME, F_OK, 0);
52   faccessat(AT_FDCWD, FILENAME, F_OK, 0);
53   faccessat(0x4132152, FILENAME, F_OK, 0); /* warning for this one */
54
55   /* fchownat */
56   fchownat(dfd, FILENAME, -1, -1, 0);
57   fchownat(0x4369251, DIRECTORY FILENAME, -1, -1, 0);
58   fchownat(AT_FDCWD, FILENAME, -1, -1, 0);
59   fchownat(0x4369252, FILENAME, -1, -1, 0); /* warning for this one */
60
61   /* renameat */
62   renameat(dfd, FILENAME, dfd, FILENAME);
63   renameat(0x4371151, DIRECTORY FILENAME, 0x4371152, DIRECTORY FILENAME);
64   renameat(AT_FDCWD, FILENAME, AT_FDCWD, FILENAME);
65   renameat(0x4371153, FILENAME, 0x4371154, FILENAME); /* warning for this one */
66
67   /* unlinkat */
68   unlinkat(dfd, FILENAME, 0);
69   unlinkat(0x7608151, DIRECTORY FILENAME, 0);
70   unlinkat(AT_FDCWD, FILENAME, 0);
71   unlinkat(0x7608152, FILENAME, 0); /* warning for this one */
72
73   /* fstatat */
74   fstatat(dfd, FILENAME, &stats, 0);
75   fstatat(0x42515151, DIRECTORY FILENAME, &stats, 0);
76   fstatat(AT_FDCWD, FILENAME, &stats, 0);
77   fstatat(0x42515152, FILENAME, &stats, 0); /* warning for this one */
78
79   /* openat */
80   openat(dfd, FILENAME, O_RDONLY);
81   openat(0x9038151, DIRECTORY FILENAME, O_RDONLY);
82   openat(AT_FDCWD, FILENAME, O_RDONLY);
83   openat(0x9038152, FILENAME, O_RDONLY); /* warning for this one */
84
85   /* fchmodat */
86   fchmodat(dfd, FILENAME, S_IRUSR | S_IWUSR, 0);
87   fchmodat(0x4303151, DIRECTORY FILENAME, S_IRUSR | S_IWUSR, 0);
88   fchmodat(AT_FDCWD, FILENAME, S_IRUSR | S_IWUSR, 0);
89   fchmodat(0x4303152, FILENAME, S_IRUSR | S_IWUSR, 0); /* warning for this one */
90
91   /* mkdirat */
92   mkdirat(dfd, FILENAME, S_IRUSR | S_IWUSR);
93   mkdirat(0x9384151, DIRECTORY FILENAME, S_IRUSR | S_IWUSR);
94   mkdirat(AT_FDCWD, FILENAME, S_IRUSR | S_IWUSR);
95   mkdirat(0x9384152, FILENAME, S_IRUSR | S_IWUSR); /* warning for this one */
96
97   /* utimensat */
98   utimensat(dfd, FILENAME, NULL, 0);
99   utimensat(0x59837215, DIRECTORY FILENAME, NULL, 0);
100   utimensat(AT_FDCWD, FILENAME, NULL, 0);
101   utimensat(0x59837216, FILENAME, NULL, 0); /* warning for this one */
102
103   rmdir(DIRECTORY FILENAME);
104   rmdir(FILENAME);
105   close(dfd);
106   return 0;
107}
108