Skip to content

Commit

Permalink
libphoenix/scanf: Fix invalid processing of %n
Browse files Browse the repository at this point in the history
JIRA: RTOS-825
  • Loading branch information
astalke committed Apr 22, 2024
1 parent cbe0b0f commit 6ba101b
Showing 1 changed file with 41 additions and 36 deletions.
77 changes: 41 additions & 36 deletions stdio/scanf.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#define CT_STRING 2 /* %s conversion */
#define CT_INT 3 /* %[dioupxX] conversion */
#define CT_FLOAT 4 /* %[aefgAEFG] conversion */
#define CT_INTPTR 5 /* %n conversion */


static const unsigned char *__sccl(char *tab, const unsigned char *fmt)
Expand Down Expand Up @@ -113,7 +114,7 @@ static int scanf_parse(char *ccltab, const char *inp, int *inr, char const *fmt0
char *p, *p0;
char buf[32];

static short basefix[17] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
static const short basefix[17] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

*inr = strlen(inp);

Expand Down Expand Up @@ -296,29 +297,8 @@ static int scanf_parse(char *ccltab, const char *inp, int *inr, char const *fmt0
break;

case 'n':
nconversions++;
if ((flags & SUPPRESS) != 0) {
continue;
}
if ((flags & SHORTSHORT) != 0) {
*va_arg(ap, char *) = nread;
}
else if ((flags & SHORT) != 0) {
*va_arg(ap, short *) = nread;
}
else if ((flags & LONG) != 0) {
*va_arg(ap, long *) = nread;
}
else if ((flags & LONGLONG) != 0) {
*va_arg(ap, long long *) = nread;
}
else if ((flags & PTRDIFF) != 0) {
*va_arg(ap, ptrdiff_t *) = nread;
}
else {
*va_arg(ap, int *) = nread;
}
continue;
c = CT_INTPTR;
break;
}

break;
Expand All @@ -327,18 +307,20 @@ static int scanf_parse(char *ccltab, const char *inp, int *inr, char const *fmt0
continue;
}

if (*inr <= 0) {
return (nconversions != 0 ? nassigned : -1);
}
if (c != CT_INTPTR) {
if (*inr <= 0) {
return (nconversions != 0 ? nassigned : -1);
}

if ((flags & NOSKIP) == 0) {
while (isspace(*inp) != 0) {
nread++;
if (--(*inr) > 0) {
inp++;
}
else {
return (nconversions != 0 ? nassigned : -1);
if ((flags & NOSKIP) == 0) {
while (isspace(*inp) != 0) {
nread++;
if (--(*inr) > 0) {
inp++;
}
else {
return (nconversions != 0 ? nassigned : -1);
}
}
}
}
Expand Down Expand Up @@ -673,7 +655,30 @@ static int scanf_parse(char *ccltab, const char *inp, int *inr, char const *fmt0
nread += p - buf;
nconversions++;
break;

case CT_INTPTR:
nconversions++;
if ((flags & SUPPRESS) != 0) {
continue;
}
if ((flags & SHORTSHORT) != 0) {
*va_arg(ap, char *) = nread;
}
else if ((flags & SHORT) != 0) {
*va_arg(ap, short *) = nread;
}
else if ((flags & LONG) != 0) {
*va_arg(ap, long *) = nread;
}
else if ((flags & LONGLONG) != 0) {
*va_arg(ap, long long *) = nread;
}
else if ((flags & PTRDIFF) != 0) {
*va_arg(ap, ptrdiff_t *) = nread;
}
else {
*va_arg(ap, int *) = nread;
}
break;
default:
break;
}
Expand Down

0 comments on commit 6ba101b

Please sign in to comment.