diff --git a/qtfs/qtfs_common/conn.c b/qtfs/qtfs_common/conn.c index c0b9515bd5eac40bb918aa315515c2e32466b3df..c34f9329b1c73ef5fe8b8b3c4615949bd16db90c 100644 --- a/qtfs/qtfs_common/conn.c +++ b/qtfs/qtfs_common/conn.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "comm.h" #include "conn.h" @@ -125,6 +126,45 @@ static int qtfs_uds_remote_whitelist(char *path) return ret; } +static int qtfs_uds_absolute_sunpath(struct sockaddr_un *addr) +{ + int ret; + struct path path; + char *name = NULL; + char *abs = NULL; + // 绝对路径不需要处理 + if (addr->sun_path[0] == '/') + return 0; + ret = kern_path(addr->sun_path, 0, &path); + if (ret) { + qtfs_err("get sun path abs kern path failed:%d, sun path:%s", ret, addr->sun_path); + return -1; + } + name = __getname(); + if (!name) { + qtfs_err("get sun path abs get name failed, sun path:%s", addr->sun_path); + goto err_end_path; + } + abs = qtfs_kern_syms.d_absolute_path(&path, name, MAX_PATH_LEN); + if (IS_ERR_OR_NULL(abs)) { + qtfs_err("get sun path abs failed, sun path:%s", addr->sun_path); + goto err_end_name; + } + if (strlen(abs) >= sizeof(addr->sun_path)) { + qtfs_err("get sun path abs:%s len:%lu is too long to sun path", addr->sun_path, strlen(abs)); + goto err_end_name; + } + strlcpy(addr->sun_path, abs, sizeof(addr->sun_path)); + __putname(name); + path_put(&path); + return 0; +err_end_name: + __putname(name); +err_end_path: + path_put(&path); + return -1; +} + static inline int qtfs_uds_is_proxy(void) { #define UDS_PROXYD_PRNAME "udsproxyd" @@ -170,6 +210,10 @@ try_conn_remote: } if (addr_un.sun_family != AF_UNIX) return sysret; + if (qtfs_uds_absolute_sunpath(&addr_un) != 0) { + qtfs_err("uds failed to get absolute sun path of:%s", addr_un.sun_path); + return sysret; + } // don't try remote uds connect if sunpath not in whitelist if (qtfs_uds_remote_whitelist(addr_un.sun_path) != 0) return sysret;