Passing overlapping src and dst buffers to snprintf is fragile, and
while it currently works for the special case of passing dst as the
argument corresponding to an initial "%s" in the format string, any
other use would very likely lead to chaos. It's easy enough to avoid,
so let's do that.

Signed-off-by: Rasmus Villemoes <li...@rasmusvillemoes.dk>
---
 drivers/input/joystick/analog.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c
index 6f8b084e13d0..d0a9b90e8f94 100644
--- a/drivers/input/joystick/analog.c
+++ b/drivers/input/joystick/analog.c
@@ -435,14 +435,16 @@ static void analog_calibrate_timer(struct analog_port 
*port)
 
 static void analog_name(struct analog *analog)
 {
-       snprintf(analog->name, sizeof(analog->name), "Analog %d-axis %d-button",
+       int ret = 0;
+
+       ret = scnprintf(analog->name, sizeof(analog->name), "Analog %d-axis 
%d-button",
                 hweight8(analog->mask & ANALOG_AXES_STD),
                 hweight8(analog->mask & ANALOG_BTNS_STD) + !!(analog->mask & 
ANALOG_BTNS_CHF) * 2 +
                 hweight16(analog->mask & ANALOG_BTNS_GAMEPAD) + 
!!(analog->mask & ANALOG_HBTN_CHF) * 4);
 
        if (analog->mask & ANALOG_HATS_ALL)
-               snprintf(analog->name, sizeof(analog->name), "%s %d-hat",
-                        analog->name, hweight16(analog->mask & 
ANALOG_HATS_ALL));
+               scnprintf(analog->name + ret, sizeof(analog->name) - ret, " 
%d-hat",
+                         hweight16(analog->mask & ANALOG_HATS_ALL));
 
        if (analog->mask & ANALOG_HAT_FCS)
                strlcat(analog->name, " FCS", sizeof(analog->name));
-- 
2.1.4

Reply via email to