[meta-virtualization] [PATCH 2/3] xen: fix truncation warning in tools build for ARM 32-bit

Christopher Clark christopher.w.clark at gmail.com
Sat Aug 18 18:37:14 PDT 2018


Adds xen-tools-xenpmd-snprintf.patch to fix string format compiler
truncation warning in xenpmd: assists the compiler by masking the
value to provide an obvious low upper bound for the value range.

Signed-off-by: Christopher Clark <christopher.clark6 at baesystems.com>
---
 .../xen/files/xen-tools-xenpmd-snprintf.patch      | 78 ++++++++++++++++++++++
 recipes-extended/xen/xen_4.11.0.bb                 |  1 +
 2 files changed, 79 insertions(+)
 create mode 100644 recipes-extended/xen/files/xen-tools-xenpmd-snprintf.patch

diff --git a/recipes-extended/xen/files/xen-tools-xenpmd-snprintf.patch b/recipes-extended/xen/files/xen-tools-xenpmd-snprintf.patch
new file mode 100644
index 0000000..aac7282
--- /dev/null
+++ b/recipes-extended/xen/files/xen-tools-xenpmd-snprintf.patch
@@ -0,0 +1,78 @@
+From e4d78a67ffbacf30b66464080898227f18f6bf49 Mon Sep 17 00:00:00 2001
+From: Christopher Clark <christopher.w.clark at gmail.com>
+Date: Fri, 17 Aug 2018 17:46:10 -0700
+Subject: [PATCH] xenpmd: prevent format-truncation warning with gcc 8.2 + ARM
+ 32-bit
+To: xen-devel at lists.xenproject.org
+Cc: ian.jackson at eu.citrix.com,
+    wei.liu2 at citrix.com
+
+xenpmd writes battery information to xenstore, including a string with a
+formatted hex value calculated from summing the lengths of four strings,
+plus some constants.
+
+Each of the four strings has a maximum length of 31 bytes, excluding the
+terminating zero byte. The strings are stored in 32-byte arrays in a
+struct that is zeroed before it is populated, and logic that writes to
+the strings uses strncpy and explicit zero termination.
+
+The maximum value to be supplied to the xenstore string is:
+  (9 * 4) + (31 * 4) + 4 , which is 164, ie. 0xa4.
+
+When used with this value, '%02x' will always fit within 3 bytes, but
+gcc 8.2 is apparently not able to deduce this (observed when building
+for a 32-bit ARM platform).
+
+This commit assists the compiler by applying a mask (0xff) to the value,
+enabling it to observe a lower maximum value and so pass the truncation
+length check.
+
+Prior to this change, building fails with the compiler warning:
+
+| xenpmd.c: In function 'write_battery_info_to_xenstore':
+| 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));
+|                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+| cc1: all warnings being treated as errors
+
+Signed-off-by: Christopher Clark <christopher.clark6 at baesystems.com>
+---
+ tools/xenpmd/xenpmd.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/tools/xenpmd/xenpmd.c b/tools/xenpmd/xenpmd.c
+index 56412a9..0c0787e 100644
+--- a/tools/xenpmd/xenpmd.c
++++ b/tools/xenpmd/xenpmd.c
+@@ -350,8 +350,10 @@ void write_battery_info_to_xenstore(struct battery_info *info)
+    
+     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", 
++    /* write 9 dwords (so 9*4) + length of 4 strings + 4 null terminators.
++     * mask informs the compiler that format truncation will not occur.
++     */
++    snprintf(val, 3, "%02x", 0xff &
+              (unsigned int)(9*4 +
+                             strlen(info->model_number) +
+                             strlen(info->serial_number) +
diff --git a/recipes-extended/xen/xen_4.11.0.bb b/recipes-extended/xen/xen_4.11.0.bb
index d7cff32..40e7340 100644
--- a/recipes-extended/xen/xen_4.11.0.bb
+++ b/recipes-extended/xen/xen_4.11.0.bb
@@ -5,6 +5,7 @@ SRC_URI = " \
     https://downloads.xenproject.org/release/xen/${PV}/xen-${PV}.tar.gz \
     file://tools-xentop-vwprintw.patch \
     file://xen-4.11-arm-acpi-fix-string-lengths.patch \
+    file://xen-tools-xenpmd-snprintf.patch \
     "
 
 SRC_URI[md5sum] = "cbec0600284921744bc14119f4ed3fff"
-- 
2.7.4



More information about the meta-virtualization mailing list