Loading include/client/hooks.hpp +8 −0 Original line number Diff line number Diff line Loading @@ -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 src/client/hooks.cpp +40 −0 Original line number Diff line number Diff line Loading @@ -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 src/client/intercept.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -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( Loading Loading
include/client/hooks.hpp +8 −0 Original line number Diff line number Diff line Loading @@ -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
src/client/hooks.cpp +40 −0 Original line number Diff line number Diff line Loading @@ -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
src/client/intercept.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -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( Loading