From: Christian Brauner Date: Wed, 30 May 2018 13:34:03 +0000 (+0200) Subject: confile: improve strprint() X-Git-Tag: lxc-3.1.0~280^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F2365%2Fhead;p=thirdparty%2Flxc.git confile: improve strprint() 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 Reported-by: Donghwa Jeong --- diff --git a/src/lxc/confile_utils.h b/src/lxc/confile_utils.h index 072124f25..1e20c4f5f 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,