3434
3535#include <stddef.h>
3636#include <syscall.h>
37+ #include <fcntl.h>
3738
3839#define SARGS (name , r , ...) \
3940 [SYS_##name] = {#name, r, {__VA_ARGS__, }}
4243static const struct syscall_desc table [] = {
4344 SARGS (read , rdec , arg_fd , arg_ , arg_ ),
4445 SARGS (write , rdec , arg_fd , arg_ , arg_ ),
45- SARGS (open , rdec , arg_cstr , arg_open_flags , arg_ ),
46+ SARGS (open , rdec , arg_cstr , arg_open_flags , arg_mode ),
4647 SARGS (close , rdec , arg_fd ),
4748 SARGS (stat , rdec , arg_cstr , arg_ ),
4849 SARGS (fstat , rdec , arg_fd , arg_ ),
@@ -61,7 +62,7 @@ static const struct syscall_desc table[] = {
6162 SARGS (pwrite64 , rdec , arg_fd , arg_ , arg_ , arg_ ),
6263 SARGS (readv , rdec , arg_fd , arg_ , arg_ ),
6364 SARGS (writev , rdec , arg_fd , arg_ , arg_ ),
64- SARGS (access , rdec , arg_cstr , arg_ ),
65+ SARGS (access , rdec , arg_cstr , arg_mode ),
6566 SARGS (pipe , rdec , arg_ ),
6667 SARGS (select , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
6768 SARGS (sched_yield , rdec , arg_none ),
@@ -123,19 +124,19 @@ static const struct syscall_desc table[] = {
123124 SARGS (chdir , rdec , arg_cstr ),
124125 SARGS (fchdir , rdec , arg_fd ),
125126 SARGS (rename , rdec , arg_cstr , arg_cstr ),
126- SARGS (mkdir , rdec , arg_cstr , arg_ ),
127+ SARGS (mkdir , rdec , arg_cstr , arg_mode ),
127128 SARGS (rmdir , rdec , arg_cstr ),
128- SARGS (creat , rdec , arg_cstr , arg_ ),
129+ SARGS (creat , rdec , arg_cstr , arg_mode ),
129130 SARGS (link , rdec , arg_cstr , arg_cstr ),
130131 SARGS (unlink , rdec , arg_cstr ),
131132 SARGS (symlink , rdec , arg_cstr , arg_cstr ),
132133 SARGS (readlink , rdec , arg_cstr , arg_ , arg_ ),
133- SARGS (chmod , rdec , arg_cstr , arg_ ),
134- SARGS (fchmod , rdec , arg_fd , arg_ ),
134+ SARGS (chmod , rdec , arg_cstr , arg_mode ),
135+ SARGS (fchmod , rdec , arg_fd , arg_mode ),
135136 SARGS (chown , rdec , arg_cstr , arg_ , arg_ ),
136137 SARGS (fchown , rdec , arg_fd , arg_ , arg_ ),
137138 SARGS (lchown , rdec , arg_cstr , arg_ , arg_ ),
138- SARGS (umask , roct , arg_ ),
139+ SARGS (umask , rmode , arg_mode ),
139140 SARGS (gettimeofday , rdec , arg_ , arg_ ),
140141 SARGS (getrlimit , rdec , arg_ , arg_ ),
141142 SARGS (getrusage , rdec , arg_ , arg_ ),
@@ -279,9 +280,9 @@ static const struct syscall_desc table[] = {
279280 SARGS (inotify_add_watch , rdec , arg_fd , arg_cstr , arg_ ),
280281 SARGS (inotify_rm_watch , rdec , arg_fd , arg_ ),
281282 SARGS (migrate_pages , rdec , arg_ , arg_ , arg_ , arg_ ),
282- SARGS (openat , rdec , arg_atfd , arg_cstr , arg_open_flags , arg_ ),
283- SARGS (mkdirat , rdec , arg_atfd , arg_cstr , arg_ ),
284- SARGS (mknodat , rdec , arg_atfd , arg_cstr , arg_ , arg_ ),
283+ SARGS (openat , rdec , arg_atfd , arg_cstr , arg_open_flags , arg_mode ),
284+ SARGS (mkdirat , rdec , arg_atfd , arg_cstr , arg_mode ),
285+ SARGS (mknodat , rdec , arg_atfd , arg_cstr , arg_mode , arg_ ),
285286 SARGS (fchownat , rdec , arg_atfd , arg_cstr , arg_ , arg_ , arg_ ),
286287 SARGS (futimesat , rdec , arg_atfd , arg_cstr , arg_ ),
287288 SARGS (newfstatat , rdec , arg_atfd , arg_cstr , arg_ , arg_ ),
@@ -290,8 +291,8 @@ static const struct syscall_desc table[] = {
290291 SARGS (linkat , rdec , arg_atfd , arg_cstr , arg_atfd , arg_cstr , arg_ ),
291292 SARGS (symlinkat , rdec , arg_atfd , arg_cstr , arg_cstr ),
292293 SARGS (readlinkat , rdec , arg_atfd , arg_cstr , arg_ , arg_ ),
293- SARGS (fchmodat , rdec , arg_atfd , arg_cstr , arg_ ),
294- SARGS (faccessat , rdec , arg_atfd , arg_cstr , arg_ ),
294+ SARGS (fchmodat , rdec , arg_atfd , arg_cstr , arg_mode ),
295+ SARGS (faccessat , rdec , arg_atfd , arg_cstr , arg_mode ),
295296 SARGS (pselect6 , rdec , arg_ , arg_ , arg_ , arg_ , arg_ , arg_ ),
296297 SARGS (ppoll , rdec , arg_ , arg_ , arg_ , arg_ , arg_ ),
297298 SARGS (unshare , rdec , arg_ ),
@@ -394,14 +395,32 @@ static const struct syscall_desc table[] = {
394395
395396#undef SARGS
396397
398+ static const struct syscall_desc open_without_mode = {
399+ .name = "open" ,
400+ .return_type = rdec ,
401+ .args = {arg_cstr , arg_open_flags , }
402+ };
403+
404+ static const struct syscall_desc openat_without_mode = {
405+ .name = "openat" ,
406+ .return_type = rdec ,
407+ .args = {arg_atfd , arg_cstr , arg_open_flags , }
408+ };
409+
397410const struct syscall_desc *
398- get_syscall_desc (long syscall_number )
411+ get_syscall_desc (long syscall_number , const long args [ 6 ] )
399412{
400413 if (syscall_number < 0 )
401414 return NULL ;
402415
403416 if ((size_t )syscall_number >= (sizeof (table ) / sizeof (table [0 ])))
404417 return NULL ;
405418
419+ if (syscall_number == SYS_open && (args [1 ] & O_CREAT ) == 0 )
420+ return & open_without_mode ;
421+
422+ if (syscall_number == SYS_openat && (args [2 ] & O_CREAT ) == 0 )
423+ return & openat_without_mode ;
424+
406425 return table + syscall_number ;
407426}
0 commit comments