From 755b22327807593fd184c4dae46b197848a74452 Mon Sep 17 00:00:00 2001 From: Vladimir Panteleev Date: Tue, 19 Sep 2017 14:33:51 +0000 Subject: [PATCH] fake_outputs: Use %n format specifier instead of sprintf fake_outputs_init used a sprintf invocation with a throw-away buffer to estimate how many characters the sscanf invocation consumed. This was unnecessary, and also potentially incorrect, as differences between the read and formatted strings (such as leading zeros) could lead to fake_outputs_init to lose its track. Instead, use the %n format specifier which allows saving the number of characters consumed by sscanf so far. %n is part of C99. --- src/fake_outputs.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/fake_outputs.c b/src/fake_outputs.c index 6639b361..447409d2 100644 --- a/src/fake_outputs.c +++ b/src/fake_outputs.c @@ -33,10 +33,10 @@ static Output *get_screen_at(unsigned int x, unsigned int y) { * */ void fake_outputs_init(const char *output_spec) { - char useless_buffer[1024]; const char *walk = output_spec; unsigned int x, y, width, height; - while (sscanf(walk, "%ux%u+%u+%u", &width, &height, &x, &y) == 4) { + int chars_consumed; + while (sscanf(walk, "%ux%u+%u+%u%n", &width, &height, &x, &y, &chars_consumed) == 4) { DLOG("Parsed output as width = %u, height = %u at (%u, %u)\n", width, height, x, y); Output *new_output = get_screen_at(x, y); @@ -68,8 +68,7 @@ void fake_outputs_init(const char *output_spec) { num_screens++; } - /* Figure out how long the input was to skip it */ - walk += sprintf(useless_buffer, "%ux%u+%u+%u", width, height, x, y) + 1; + walk += chars_consumed + 1; } if (num_screens == 0) { -- 2.39.5