]> git.proxmox.com Git - mirror_lxc.git/commitdiff
confile: improve strprint()
authorChristian Brauner <christian.brauner@ubuntu.com>
Wed, 30 May 2018 13:34:03 +0000 (15:34 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Wed, 30 May 2018 13:46:06 +0000 (15:46 +0200)
POSIX specifies [1]:
"If the value of n is zero on a call to snprintf(), nothing shall be written,
the number of bytes that would have been written had n been sufficiently large
excluding the terminating null shall be returned, and s may be a null pointer."

But in case there are any non-sane libcs out there that do actually dereference
the buffer when when 0 is passed as length to snprintf() let's give them a
dummy buffer.

[1]: The Open Group Base Specifications Issue 7, 2018 edition
     IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)
     Copyright © 2001-2018 IEEE and The Open Group

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Reported-by: Donghwa Jeong <dh48.jeong@samsung.com>
src/lxc/confile_utils.h

index 072124f25d423dca1b67e750a9370900e2ca2108..1e20c4f5fcd6e0aa99168038c8dd1cb0d3c7a9d3 100644 (file)
 #define MACVLAN_MODE_PASSTHRU 8
 #endif
 
-#define strprint(str, inlen, ...)                                              \
-       do {                                                                   \
-               len = snprintf(str, inlen, ##__VA_ARGS__);                     \
-               if (len < 0) {                                                 \
-                       SYSERROR("failed to create string");                   \
-                       return -1;                                             \
-               };                                                             \
-               fulllen += len;                                                \
-               if (inlen > 0) {                                               \
-                       if (str)                                               \
-                               str += len;                                    \
-                       inlen -= len;                                          \
-                       if (inlen < 0)                                         \
-                               inlen = 0;                                     \
-               }                                                              \
+#define strprint(str, inlen, ...)                                       \
+       do {                                                            \
+               if (str)                                                \
+                       len = snprintf(str, inlen, ##__VA_ARGS__);      \
+               else                                                    \
+                       len = snprintf((char *){""}, 0, ##__VA_ARGS__); \
+               if (len < 0) {                                          \
+                       SYSERROR("failed to create string");            \
+                       return -1;                                      \
+               };                                                      \
+               fulllen += len;                                         \
+               if (inlen > 0) {                                        \
+                       if (str)                                        \
+                               str += len;                             \
+                       inlen -= len;                                   \
+                       if (inlen < 0)                                  \
+                               inlen = 0;                              \
+               }                                                       \
        } while (0);
 
 extern int parse_idmaps(const char *idmap, char *type, unsigned long *nsid,