Unverified Commit 66399567 authored by Tommaso Tocci's avatar Tommaso Tocci
Browse files

intercept readlinkat

parent 373e88de
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ int hook_fchmod(unsigned int dirfd, mode_t mode);
int hook_chdir(const char* path);
int hook_fchdir(unsigned int fd);
int hook_getcwd(char * buf, unsigned long size);
int hook_readlinkat(int dirfd, const char * cpath, char * buf, int bufsiz);
int hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg);


+26 −0
Original line number Diff line number Diff line
@@ -449,6 +449,32 @@ int hook_getcwd(char * buf, unsigned long size) {
    return (CTX->cwd().size() + 1);
}

int hook_readlinkat(int dirfd, const char * cpath, char * buf, int bufsiz) {
    CTX->log()->trace("{}() called with path '{}' dirfd {}, bufsize {}",
                      __func__, cpath, dirfd, bufsiz);

    std::string resolved;
    auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, false);
    switch(rstatus) {
        case RelativizeStatus::fd_unknown:
            return syscall_no_intercept(SYS_readlinkat, dirfd, cpath, buf, bufsiz);

        case RelativizeStatus::external:
            return syscall_no_intercept(SYS_readlinkat, dirfd, resolved.c_str(), buf, bufsiz);

        case RelativizeStatus::fd_not_a_dir:
            return -ENOTDIR;

        case RelativizeStatus::internal:
            CTX->log()->warn("{}() not supported", __func__);
            return -ENOTSUP;

        default:
            CTX->log()->error("{}() relativize status unknown: {}", __func__);
            return -EINVAL;
    }
}

int hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) {
    CTX->log()->trace("{}() called with fd {}, cmd {}, arg {}", __func__, fd, cmd, arg);
    if (!CTX->file_map()->exist(fd)) {
+14 −0
Original line number Diff line number Diff line
@@ -217,6 +217,20 @@ static inline int hook(long syscall_number,
                               static_cast<unsigned long>(arg1));
        break;

    case SYS_readlink:
        *result = hook_readlinkat(AT_FDCWD,
                                  reinterpret_cast<const char *>(arg0),
                                  reinterpret_cast<char *>(arg1),
                                  static_cast<int>(arg2));
        break;

    case SYS_readlinkat:
        *result = hook_readlinkat(static_cast<int>(arg0),
                                  reinterpret_cast<const char *>(arg1),
                                  reinterpret_cast<char *>(arg2),
                                  static_cast<int>(arg3));
        break;

    case SYS_fcntl:
        *result = hook_fcntl(static_cast<unsigned int>(arg0),
                             static_cast<unsigned int>(arg1),