Fixes sscan %sn where strlen(data) < n

This commit is contained in:
David Sidrane
2016-10-15 05:15:40 -10:00
parent 5b46ce4889
commit 0b3c75f6bd
+14 -7
View File
@@ -164,7 +164,7 @@ int sscanf(FAR const char *buf, FAR const char *fmt, ...)
* ANSI standard vsscanf implementation.
*
****************************************************************************/
#pragma GCC optimize ("O0")
int vsscanf(FAR const char *buf, FAR const char *fmt, va_list ap)
{
FAR const char *bufstart;
@@ -174,6 +174,7 @@ int vsscanf(FAR const char *buf, FAR const char *fmt, va_list ap)
bool noassign;
int count;
int width;
int fwidth;
int base = 10;
char tmp[MAXLN];
@@ -275,16 +276,22 @@ int vsscanf(FAR const char *buf, FAR const char *fmt, va_list ap)
buf++;
}
/* Was a fieldwidth specified? */
/* Guess a field width using some heuristics */
if (!width)
fwidth = findwidth(buf, fmt);
/* Use the actual field's width if 1) no fieldwidth
* specified or 2) the actual field's width is smaller
* than fieldwidth specified
*/
if (!width || fwidth < width)
{
/* No... Guess a field width using some heuristics */
int tmpwidth = findwidth(buf, fmt);
width = MIN(sizeof(tmp) - 1, tmpwidth);
width = fwidth;
}
width = MIN(sizeof(tmp) - 1, width);
/* Copy the string (if we are making an assignment) */
if (!noassign)