Verified Commit 58029802 authored by Julius Athenstaedt's avatar Julius Athenstaedt Committed by Marc Vef
Browse files

Add system call: listxattr family

parent 477005cd
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -214,6 +214,14 @@ hook_fallocate(int fd, int mode, off_t offset, off_t len);
int
hook_fadvise64(int fd, off_t offset, off_t len, int advice);

// char * list is nullable (_Nullable - Clang extension)
ssize_t
hook_listxattr(const char* path, char* list, size_t size);
ssize_t
hook_llistxattr(const char* path, char* list, size_t size);
ssize_t
hook_flistxattr(int fd, char* list, size_t size);

} // namespace gkfs::hook

#endif
+40 −0
Original line number Diff line number Diff line
@@ -1019,5 +1019,45 @@ hook_fadvise64(int fd, off_t offset, off_t len, int advice) {
    return syscall_no_intercept_wrapper(SYS_fadvise64, fd, offset, len, advice);
}

ssize_t
hook_listxattr(const char* path, char* list, size_t size) {

    LOG(DEBUG, "{}() called with path '{}' list '{}' size '{}'", __func__, path,
        list, size);

    std::string rel_path;
    if(CTX->relativize_path(path, rel_path)) {
        return -ENOTSUP;
    }
    return syscall_no_intercept_wrapper(SYS_listxattr, path, list, size);
}

ssize_t
hook_llistxattr(const char* path, char* list, size_t size) {

    LOG(DEBUG, "{}() called with path '{}' list '{}' size '{}'", __func__, path,
        list, size);

    std::string rel_path;
    if(CTX->relativize_path(path, rel_path)) {
        return -ENOTSUP;
    }
    return syscall_no_intercept_wrapper(SYS_llistxattr, path, list, size);
}

ssize_t
hook_flistxattr(int fd, char* list, size_t size) {

    LOG(DEBUG, "{}() called with filedescriptor '{}' list '{}' size '{}'",
        __func__, fd, list, size);

    const char* newpath_path;
    std::string newpath_resolved;
    auto newpath_status =
            CTX->relativize_fd_path(fd, newpath_path, newpath_resolved);
    if(newpath_status == gkfs::preload::RelativizeStatus::internal) {
        return -ENOTSUP;
    }
    return syscall_no_intercept_wrapper(SYS_flistxattr, fd, list, size);
}
} // namespace gkfs::hook
+21 −0
Original line number Diff line number Diff line
@@ -784,6 +784,27 @@ hook(long syscall_number, long arg0, long arg1, long arg2, long arg3, long arg4,
                    reinterpret_cast<const char*>(arg1),
                    reinterpret_cast<void*>(arg2), static_cast<size_t>(arg4));
            break;
#ifdef SYS_listxattr
        case SYS_listxattr:
            *result = gkfs::hook::hook_listxattr(
                    reinterpret_cast<const char*>(arg0),
                    reinterpret_cast<char*>(arg1), static_cast<size_t>(arg2));
            break;
#endif
#ifdef SYS_llistxattr
        case SYS_llistxattr:
            *result = gkfs::hook::hook_llistxattr(
                    reinterpret_cast<const char*>(arg0),
                    reinterpret_cast<char*>(arg1), static_cast<size_t>(arg2));
            break;
#endif
#ifdef SYS_flistxattr
        case SYS_flistxattr:
            *result = gkfs::hook::hook_flistxattr(reinterpret_cast<long>(arg0),
                                                  reinterpret_cast<char*>(arg1),
                                                  static_cast<size_t>(arg2));
            break;
#endif

        case SYS_lgetxattr:
            *result = gkfs::hook::hook_lgetxattr(