From: Christian Brauner Date: Wed, 30 May 2018 13:34:03 +0000 (+0200) Subject: confile: improve strprint() X-Git-Tag: lxc-2.0.10~120 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a882bb4b015bd9e105c50aa1890d7441ea0a96cb;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 Signed-off-by: Christian Brauner --- diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 00ea5a069..034a6bc31 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -474,23 +474,6 @@ extern struct lxc_config_t *lxc_getconfig(const char *key) return NULL; } -#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; \ - } \ - } while (0); - static int set_config_string_item(char **conf_item, const char *value) { char *new_value; diff --git a/src/lxc/confile_utils.h b/src/lxc/confile_utils.h index 53665b914..d23d52e7d 100644 --- a/src/lxc/confile_utils.h +++ b/src/lxc/confile_utils.h @@ -23,6 +23,27 @@ #include #include "conf.h" +#include "confile_utils.h" + +#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, unsigned long *hostid, unsigned long *range);