]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
libcephfs_proxy: add helper function for robust snprintf()
authorXavi Hernandez <xhernandez@gmail.com>
Tue, 13 Jan 2026 11:57:33 +0000 (12:57 +0100)
committerXavi Hernandez <xhernandez@gmail.com>
Tue, 10 Feb 2026 07:20:27 +0000 (08:20 +0100)
Signed-off-by: Xavi Hernandez <xhernandez@gmail.com>
src/libcephfs_proxy/CMakeLists.txt
src/libcephfs_proxy/proxy_helpers.c
src/libcephfs_proxy/proxy_helpers.h
src/libcephfs_proxy/proxy_link.c
src/libcephfs_proxy/proxy_mount.c

index 83de8bdf9fcb0da0bdf5e6126f10b1988c3d5b19..43c9ae2913661ffb2741c55ce093a32ba8ae3f23 100644 (file)
@@ -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})
index 149d84d34bb0559046a640ab59d14fe8e048d4bd..7df163ada2bacc03b2a1a567435333214ea14917 100644 (file)
@@ -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;
+}
index ec7a1ad90ed5df398ca6228d9c3625ba4cc35061..9177bb52800aadf39152b3777a1a229c1ab275c7 100644 (file)
@@ -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
index 7582822268ed095aed88a1c8762e40effc57ba65..1fc3f65967b946e361cbcca2f7596df0173cdf8a 100644 (file)
@@ -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);
index a29d2a1fdda7b1ed5ce75060de4cc841724f9e02..33cc0e62c318024e3ef658b5a11cc1ee52db76ee 100644 (file)
@@ -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;
        }