From: Xavi Hernandez Date: Tue, 13 Jan 2026 11:57:33 +0000 (+0100) Subject: libcephfs_proxy: add helper function for robust snprintf() X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ac744e208289b31fb56a41f3136d26af9185fed8;p=ceph.git libcephfs_proxy: add helper function for robust snprintf() Signed-off-by: Xavi Hernandez --- diff --git a/src/libcephfs_proxy/CMakeLists.txt b/src/libcephfs_proxy/CMakeLists.txt index 83de8bdf9fc..43c9ae29136 100644 --- a/src/libcephfs_proxy/CMakeLists.txt +++ b/src/libcephfs_proxy/CMakeLists.txt @@ -1,5 +1,5 @@ -set(proxy_common_srcs proxy_link.c proxy_async.c proxy_log.c) -set(libcephfsd_srcs libcephfsd.c proxy_manager.c proxy_mount.c proxy_helpers.c ${proxy_common_srcs}) +set(proxy_common_srcs proxy_helpers.c proxy_link.c proxy_async.c proxy_log.c) +set(libcephfsd_srcs libcephfsd.c proxy_manager.c proxy_mount.c ${proxy_common_srcs}) set(libcephfs_proxy_srcs libcephfs_proxy.c ${proxy_common_srcs}) add_executable(libcephfsd ${libcephfsd_srcs}) diff --git a/src/libcephfs_proxy/proxy_helpers.c b/src/libcephfs_proxy/proxy_helpers.c index 149d84d34bb..7df163ada2b 100644 --- a/src/libcephfs_proxy/proxy_helpers.c +++ b/src/libcephfs_proxy/proxy_helpers.c @@ -79,3 +79,24 @@ int32_t proxy_hash_hex(char *digest, size_t size, return 0; } + +int32_t proxy_snprintf(char *buffer, int32_t size, const char *fmt, ...) +{ + va_list args; + int32_t len; + + va_start(args, fmt); + len = vsnprintf(buffer, size, fmt, args); + va_end(args); + + if (len < 0) { + return proxy_log(LOG_ERR, errno, "vsnprintf() failed"); + } + + if (len >= size) { + return proxy_log(LOG_ERR, ENOBUFS, + "vsnprintf() truncated a string"); + } + + return len; +} diff --git a/src/libcephfs_proxy/proxy_helpers.h b/src/libcephfs_proxy/proxy_helpers.h index ec7a1ad90ed..9177bb52800 100644 --- a/src/libcephfs_proxy/proxy_helpers.h +++ b/src/libcephfs_proxy/proxy_helpers.h @@ -371,4 +371,6 @@ int32_t proxy_hash(uint8_t *hash, size_t size, int32_t proxy_hash_hex(char *digest, size_t size, int32_t (*feed)(void **, void *, int32_t), void *data); +int32_t proxy_snprintf(char *buffer, int32_t size, const char *fmt, ...); + #endif diff --git a/src/libcephfs_proxy/proxy_link.c b/src/libcephfs_proxy/proxy_link.c index 7582822268e..1fc3f65967b 100644 --- a/src/libcephfs_proxy/proxy_link.c +++ b/src/libcephfs_proxy/proxy_link.c @@ -50,14 +50,10 @@ static int32_t proxy_link_prepare(struct sockaddr_un *addr, const char *path) memset(addr, 0, sizeof(*addr)); addr->sun_family = AF_UNIX; - len = snprintf(addr->sun_path, sizeof(addr->sun_path), "%s", path); + len = proxy_snprintf(addr->sun_path, sizeof(addr->sun_path), "%s", + path); if (len < 0) { - return proxy_log(LOG_ERR, EINVAL, - "Failed to copy Unix socket path"); - } - if (len >= sizeof(addr->sun_path)) { - return proxy_log(LOG_ERR, ENAMETOOLONG, - "Unix socket path too long"); + return len; } sd = socket(AF_UNIX, SOCK_STREAM, 0); diff --git a/src/libcephfs_proxy/proxy_mount.c b/src/libcephfs_proxy/proxy_mount.c index a29d2a1fdda..33cc0e62c31 100644 --- a/src/libcephfs_proxy/proxy_mount.c +++ b/src/libcephfs_proxy/proxy_mount.c @@ -590,6 +590,7 @@ static int32_t proxy_config_destination_write(int32_t fd, void *data, static int32_t proxy_config_destination_commit(int32_t fd, const char *name) { char path[32]; + int32_t len; if (fsync(fd) < 0) { return proxy_log(LOG_ERR, errno, "fsync() failed"); @@ -605,7 +606,11 @@ static int32_t proxy_config_destination_commit(int32_t fd, const char *name) * filesystem. */ } - snprintf(path, sizeof(path), "/proc/self/fd/%d", fd); + len = proxy_snprintf(path, sizeof(path), "/proc/self/fd/%d", fd); + if (len < 0) { + return len; + } + if (linkat(AT_FDCWD, path, AT_FDCWD, name, AT_SYMLINK_FOLLOW) < 0) { if (errno != EEXIST) { return proxy_log(LOG_ERR, errno, "linkat() failed"); @@ -678,14 +683,8 @@ static int32_t proxy_config_prepare(const char *config, char *path, goto done_dst; } - err = snprintf(path, size, "ceph-%s.conf", hash); + err = proxy_snprintf(path, size, "ceph-%s.conf", hash); if (err < 0) { - err = proxy_log(LOG_ERR, errno, "snprintf() failed"); - goto done_dst; - } - if (err >= size) { - err = proxy_log(LOG_ERR, ENOBUFS, - "Insufficient space to store the name"); goto done_dst; }