// SPDX-License-Identifier: GPL-2.0-or-later /* seitan - Syscall Expressive Interpreter, Transformer and Notifier * * cooker/calls/fs.c - Description of known filesystem-related system calls * * Copyright 2023 Red Hat GmbH * Author: Stefano Brivio */ /* stat ? fstat ? lstat ? lseek ? fcntl ? flock ~ fsync fdatasync truncate ftruncate getdents getcwd chdir fchdir mkdir rmdir rename creat link unlink symlink readlink chmod fchmod chown fchown fchownat lchown umask mknod mknodat mount umount2 swapon swapoff */ #include #include #define _GNU_SOURCE #include #include #include #include "../cooker.h" #include "../calls.h" static struct num modes[] = { { "S_ISUID", S_ISUID }, { "S_ISGID", S_ISGID }, { "S_IRWXU", S_IRWXU }, { "S_IRUSR", S_IRUSR }, { "S_IWUSR", S_IWUSR }, { "S_IXUSR", S_IXUSR }, { "S_IRWXG", S_IRWXG }, { "S_IRGRP", S_IRGRP }, { "S_IWGRP", S_IWGRP }, { "S_IXGRP", S_IXGRP }, { "S_IRWXO", S_IRWXO }, { "S_IROTH", S_IROTH }, { "S_IWOTH", S_IWOTH }, { "S_IXOTH", S_IXOTH }, { "S_ISVTX", S_ISVTX }, { 0 }, }; static struct num types[] = { { "S_IFSOCK", S_IFSOCK }, { "S_IFLNK", S_IFLNK }, { "S_IFREG", S_IFREG }, { "S_IFBLK", S_IFBLK }, { "S_IFDIR", S_IFDIR }, { "S_IFCHR", S_IFCHR }, { "S_IFIFO", S_IFIFO }, { 0 }, }; static struct arg mknod_args[] = { { 0, { "path", STRING, 0, 0, PATH_MAX, { 0 } } }, { 1, { "mode", INT, FLAGS | MASK, 0, 0, { .d_num = modes }, } }, { 1, { "type", INT, FLAGS | MASK, 0, 0, { .d_num = types }, } }, { 2, { "major", GNU_DEV_MAJOR, 0, 0, 0, { 0 }, } }, { 2, { "minor", GNU_DEV_MINOR, 0, 0, 0, { 0 }, } }, { 0 } }; static struct arg mknodat_args[] = { /* No dirfd: we only support absolute paths at the moment */ { 1, { "path", STRING, 0, 0, PATH_MAX, { 0 } } }, { 2, { "mode", INT, FLAGS | MASK, 0, 0, { .d_num = modes }, } }, { 2, { "type", INT, FLAGS | MASK, 0, 0, { .d_num = types }, } }, { 3, { "major", GNU_DEV_MAJOR, 0, 0, 0, { 0 }, } }, { 3, { "minor", GNU_DEV_MINOR, 0, 0, 0, { 0 }, } }, { 0 } }; static struct arg chown_args[] = { { 0, { "path", STRING, 0, 0, PATH_MAX, { 0 } } }, { 1, { "uid", UID_T, 0, 0, 0, { .d_num = modes }, } }, { 2, { "gid", GID_T, 0, 0, 0, { 0 }, } }, { 0 } }; struct call syscalls_fs[] = { { __NR_mknod, "mknod", mknod_args }, { __NR_mknodat, "mknodat", mknodat_args }, { __NR_chown, "chown", chown_args }, { __NR_lchown, "lchown", chown_args }, { 0 }, };