[lxc-devel] [lxc/master] confile: improve strprint()

brauner on Github lxc-bot at linuxcontainers.org
Wed May 30 13:41:31 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 1026 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180530/2d066b2e/attachment.bin>
-------------- next part --------------
From 0e5be871954bff1724a6e568be0f9d2baef9e956 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Wed, 30 May 2018 15:34:03 +0200
Subject: [PATCH] confile: improve strprint()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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 at ubuntu.com>
CC: Donghwa Jeong <dh48.jeong at samsung.com>
---
 src/lxc/confile_utils.h | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/lxc/confile_utils.h b/src/lxc/confile_utils.h
index 072124f25..8fda5d798 100644
--- a/src/lxc/confile_utils.h
+++ b/src/lxc/confile_utils.h
@@ -41,21 +41,24 @@
 #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,


More information about the lxc-devel mailing list