Skip to content

Commit 7433d0a

Browse files
committed
CPreProcessor,refactor: don't put negative values to the unget-buffer
The original code focuses on the phase of getting a value from the unget-buffer. As a fundamental fix, this change focuses on the phase of putting values to the unget-buffer. Fixing the original bug at the getting phase was just a workaround. Signed-off-by: Masatake YAMATO <[email protected]>
1 parent d5cd94f commit 7433d0a

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

parsers/cpreprocessor.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,9 @@ static void ungetBufferUngetc (ungetBuffer *ungetBuffer, const int c, vString *c
551551
return;
552552
}
553553

554+
Assert((unsigned int)c <= 0xff);
555+
unsigned char u = (unsigned char)c;
556+
554557
if(!ungetBuffer->pointer)
555558
{
556559
// no unget data
@@ -561,7 +564,7 @@ static void ungetBufferUngetc (ungetBuffer *ungetBuffer, const int c, vString *c
561564
}
562565
Assert(ungetBuffer->size > 0);
563566
ungetBuffer->pointer = ungetBuffer->buffer + ungetBuffer->size - 1;
564-
*(ungetBuffer->pointer) = c;
567+
*(ungetBuffer->pointer) = u;
565568
ungetBuffer->dataSize = 1;
566569
return;
567570
}
@@ -584,7 +587,7 @@ static void ungetBufferUngetc (ungetBuffer *ungetBuffer, const int c, vString *c
584587
ungetBuffer->pointer--;
585588
}
586589

587-
*(ungetBuffer->pointer) = c;
590+
*(ungetBuffer->pointer) = u;
588591
ungetBuffer->dataSize++;
589592
}
590593

@@ -639,7 +642,7 @@ static void ungetBufferUngetString(ungetBuffer *ungetBuffer, const char * string
639642
const char * e = string + len;
640643

641644
while(s < e)
642-
*p++ = *s++;
645+
*p++ = (unsigned char)(*s++);
643646

644647
ungetBuffer->dataSize += len;
645648
}
@@ -652,7 +655,12 @@ static int ungetBufferGetcFromUngetBuffer (ungetBuffer *ungetBuffer)
652655
Assert(ungetBuffer->size > 0);
653656
Assert(ungetBuffer->dataSize > 0);
654657

655-
unsigned char c = *(ungetBuffer->pointer);
658+
int c = *(ungetBuffer->pointer);
659+
660+
/* We allow putting only non-negative values to
661+
* the ungetc-buffer. */
662+
Assert(c >= 0);
663+
656664
ungetBuffer->dataSize--;
657665
if(ungetBuffer->dataSize > 0)
658666
ungetBuffer->pointer++;

0 commit comments

Comments
 (0)