Skip to content

Commit 987f20d

Browse files
authored
Merge pull request #4234 from masatake/cpreprocessor--cast-unget-data
CPreProcessor: (bugfix) don't return negative value other than EOF from unget-buffer
2 parents e5b77bd + 5152f6e commit 987f20d

File tree

12 files changed

+29
-13
lines changed

12 files changed

+29
-13
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This is a crash test.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
i"犬"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a(i'犬'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
i'犬'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
a(i"犬猫鼠羊兎鶏牛熊"
2+
/* Push back a logger string */
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a(i"犬"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This is a crash test.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
i"犬"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a(i'犬'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
i'犬'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a(i"犬"

parsers/cpreprocessor.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ enum eState {
107107
/* Defines the current state of the pre-processor.
108108
*/
109109
typedef struct sUngetBuffer {
110-
int *buffer; /* memory buffer for unget characters */
110+
unsigned char *buffer; /* memory buffer for unget characters */
111111
int size; /* the current unget buffer size */
112-
int *pointer; /* the current unget char: points in the
112+
unsigned char *pointer; /* the current unget char: points in the
113113
middle of the buffer */
114114
int dataSize; /* the number of valid unget characters
115115
in the buffer */
@@ -551,17 +551,20 @@ 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
557560
if(!ungetBuffer->buffer)
558561
{
559-
ungetBuffer->buffer = (int *)eMalloc(8 * sizeof(int));
562+
ungetBuffer->buffer = eMalloc(8 * sizeof(*(ungetBuffer->buffer)));
560563
ungetBuffer->size = 8;
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
}
@@ -575,16 +578,16 @@ static void ungetBufferUngetc (ungetBuffer *ungetBuffer, const int c, vString *c
575578
if(ungetBuffer->pointer == ungetBuffer->buffer)
576579
{
577580
ungetBuffer->size += 8;
578-
int * tmp = (int *)eMalloc(ungetBuffer->size * sizeof(int));
579-
memcpy(tmp+8,ungetBuffer->pointer,ungetBuffer->dataSize * sizeof(int));
581+
unsigned char * tmp = eMalloc(ungetBuffer->size * sizeof(*(ungetBuffer->buffer)));
582+
memcpy(tmp+8,ungetBuffer->pointer,ungetBuffer->dataSize * sizeof(*(ungetBuffer->buffer)));
580583
eFree(ungetBuffer->buffer);
581584
ungetBuffer->buffer = tmp;
582585
ungetBuffer->pointer = tmp + 7;
583586
} else {
584587
ungetBuffer->pointer--;
585588
}
586589

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

@@ -606,11 +609,12 @@ static void ungetBufferUngetString(ungetBuffer *ungetBuffer, const char * string
606609
if(!ungetBuffer->buffer)
607610
{
608611
ungetBuffer->size = 8 + len;
609-
ungetBuffer->buffer = (int *)eMalloc(ungetBuffer->size * sizeof(int));
612+
ungetBuffer->buffer = eMalloc(ungetBuffer->size * sizeof(*(ungetBuffer->buffer)));
610613
} else if(ungetBuffer->size < len)
611614
{
612615
ungetBuffer->size = 8 + len;
613-
ungetBuffer->buffer = (int *)eRealloc(ungetBuffer->buffer,ungetBuffer->size * sizeof(int));
616+
ungetBuffer->buffer = eRealloc(ungetBuffer->buffer,
617+
ungetBuffer->size * sizeof(*(ungetBuffer->buffer)));
614618
}
615619
ungetBuffer->pointer = ungetBuffer->buffer + ungetBuffer->size - len;
616620
} else {
@@ -623,8 +627,8 @@ static void ungetBufferUngetString(ungetBuffer *ungetBuffer, const char * string
623627
if(ungetBuffer->size < (ungetBuffer->dataSize + len))
624628
{
625629
ungetBuffer->size = 8 + len + ungetBuffer->dataSize;
626-
int * tmp = (int *)eMalloc(ungetBuffer->size * sizeof(int));
627-
memcpy(tmp + 8 + len,ungetBuffer->pointer,ungetBuffer->dataSize * sizeof(int));
630+
unsigned char * tmp = eMalloc(ungetBuffer->size * sizeof(*(ungetBuffer->buffer)));
631+
memcpy(tmp + 8 + len,ungetBuffer->pointer,ungetBuffer->dataSize * sizeof(*(ungetBuffer->buffer)));
628632
eFree(ungetBuffer->buffer);
629633
ungetBuffer->buffer = tmp;
630634
ungetBuffer->pointer = tmp + 8;
@@ -634,12 +638,12 @@ static void ungetBufferUngetString(ungetBuffer *ungetBuffer, const char * string
634638
}
635639
}
636640

637-
int * p = ungetBuffer->pointer;
641+
unsigned char* p = ungetBuffer->pointer;
638642
const char * s = string;
639643
const char * e = string + len;
640644

641645
while(s < e)
642-
*p++ = *s++;
646+
*p++ = (unsigned char)(*s++);
643647

644648
ungetBuffer->dataSize += len;
645649
}

0 commit comments

Comments
 (0)