summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2007-05-08 00:27:20 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 11:15:05 -0700
commitc6b40d16d1cfa1a01158049bb887a9bbe48ef7ba (patch)
tree72eac6e26f928780fe722ad45ff6eeb6807d2356
parent757dea93e136b219af09d3cd56a81063fdbdef1a (diff)
downloadlinux-3.10-c6b40d16d1cfa1a01158049bb887a9bbe48ef7ba.tar.gz
linux-3.10-c6b40d16d1cfa1a01158049bb887a9bbe48ef7ba.tar.bz2
linux-3.10-c6b40d16d1cfa1a01158049bb887a9bbe48ef7ba.zip
fix sscanf %n match at end of input string
I was playing with some code that sometimes got a string where a %n match should have been done where the input string ended, for example like this: sscanf("abc123", "abc%d%n", &a, &n); /* doesn't work */ sscanf("abc123a", "abc%d%n", &a, &n); /* works */ However, the scanf function in the kernel doesn't convert the %n in that case because it has already matched the complete input after %d and just completely stops matching then. This patch fixes that. [akpm@linux-foundation.org: cleanups] Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--lib/vsprintf.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index cbab1df150c..01729024126 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -825,6 +825,17 @@ int vsscanf(const char * buf, const char * fmt, va_list args)
break;
str = next;
}
+
+ /*
+ * Now we've come all the way through so either the input string or the
+ * format ended. In the former case, there can be a %n at the current
+ * position in the format that needs to be filled.
+ */
+ if (*fmt == '%' && *(fmt + 1) == 'n') {
+ int *p = (int *)va_arg(args, int *);
+ *p = str - buf;
+ }
+
return num;
}