|
@@ -2017,7 +2017,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
|
s16 field_width;
|
|
|
bool is_sign;
|
|
|
|
|
|
- while (*fmt && *str) {
|
|
|
+ while (*fmt) {
|
|
|
/* skip any white space in format */
|
|
|
/* white space in format matchs any amount of
|
|
|
* white space, including none, in the input.
|
|
@@ -2042,6 +2042,8 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
|
* advance both strings to next white space
|
|
|
*/
|
|
|
if (*fmt == '*') {
|
|
|
+ if (!*str)
|
|
|
+ break;
|
|
|
while (!isspace(*fmt) && *fmt != '%' && *fmt)
|
|
|
fmt++;
|
|
|
while (!isspace(*str) && *str)
|
|
@@ -2070,7 +2072,17 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!*fmt || !*str)
|
|
|
+ if (!*fmt)
|
|
|
+ break;
|
|
|
+
|
|
|
+ if (*fmt == 'n') {
|
|
|
+ /* return number of characters read so far */
|
|
|
+ *va_arg(args, int *) = str - buf;
|
|
|
+ ++fmt;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!*str)
|
|
|
break;
|
|
|
|
|
|
base = 10;
|
|
@@ -2103,13 +2115,6 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
|
num++;
|
|
|
}
|
|
|
continue;
|
|
|
- case 'n':
|
|
|
- /* return number of characters read so far */
|
|
|
- {
|
|
|
- int *i = (int *)va_arg(args, int*);
|
|
|
- *i = str - buf;
|
|
|
- }
|
|
|
- continue;
|
|
|
case 'o':
|
|
|
base = 8;
|
|
|
break;
|
|
@@ -2210,16 +2215,6 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
|
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;
|
|
|
}
|
|
|
EXPORT_SYMBOL(vsscanf);
|