From: Wei Liu Date: Thu, 26 Jul 2018 15:58:54 +0100 Subject: xenpmd: make 32 bit gcc 8.1 non-debug build work 32 bit gcc 8.1 non-debug build yields: xenpmd.c:354:23: error: '%02x' directive output may be truncated writing between 2 and 8 bytes into a region of size 3 [-Werror=format-truncation=] snprintf(val, 3, "%02x", ^~~~ xenpmd.c:354:22: note: directive argument in the range [40, 2147483778] snprintf(val, 3, "%02x", ^~~~~~ xenpmd.c:354:5: note: 'snprintf' output between 3 and 9 bytes into a destination of size 3 snprintf(val, 3, "%02x", ^~~~~~~~~~~~~~~~~~~~~~~~ (unsigned int)(9*4 + ~~~~~~~~~~~~~~~~~~~~ strlen(info->model_number) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strlen(info->serial_number) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strlen(info->battery_type) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strlen(info->oem_info) + 4)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All info->* used in calculation are 32 bytes long, and the parsing code makes sure they are null-terminated, so the end result of the expression won't exceed 255, which should be able to be fit into 3 bytes in hexadecimal format. Add an assertion to make gcc happy. Signed-off-by: Wei Liu Acked-by: Ian Jackson (cherry picked from commit e75c9dc85fdeeeda0b98d8cd8d784e0508c3ffb8) --- tools/xenpmd/xenpmd.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/xenpmd/xenpmd.c b/tools/xenpmd/xenpmd.c index 56412a9..1c801ca 100644 --- a/tools/xenpmd/xenpmd.c +++ b/tools/xenpmd/xenpmd.c @@ -40,6 +40,7 @@ #include #include #include +#include /* #define RUN_STANDALONE */ #define RUN_IN_SIMULATE_MODE @@ -345,18 +346,17 @@ void write_ulong_lsb_first(char *temp_val, unsigned long val) void write_battery_info_to_xenstore(struct battery_info *info) { char val[1024], string_info[256]; + unsigned int len; xs_mkdir(xs, XBT_NULL, "/pm"); memset(val, 0, 1024); memset(string_info, 0, 256); /* write 9 dwords (so 9*4) + length of 4 strings + 4 null terminators */ - snprintf(val, 3, "%02x", - (unsigned int)(9*4 + - strlen(info->model_number) + - strlen(info->serial_number) + - strlen(info->battery_type) + - strlen(info->oem_info) + 4)); + len = 9 * 4 + strlen(info->model_number) + strlen(info->serial_number) + + strlen(info->battery_type) + strlen(info->oem_info) + 4; + assert(len < 255); + snprintf(val, 3, "%02x", len); write_ulong_lsb_first(val+2, info->present); write_ulong_lsb_first(val+10, info->design_capacity); write_ulong_lsb_first(val+18, info->last_full_capacity);