diff --git a/main/mio.c b/main/mio.c index baabcf5bff..a5c9c7bdf7 100644 --- a/main/mio.c +++ b/main/mio.c @@ -317,6 +317,9 @@ MIO *mio_new_mio (MIO *base, long start, long size) MIO *submio; size_t r; + if (start < 0 || size < -1) + return NULL; + original_pos = mio_tell (base); if (size == -1) diff --git a/main/parse.c b/main/parse.c index 201004c7fb..11d40af150 100644 --- a/main/parse.c +++ b/main/parse.c @@ -4322,7 +4322,7 @@ extern bool runParserInArea (const langType language, unsigned long sourceLineOffset, int promise) { - bool tagFileResized; + bool tagFileResized = false; verbose ("runParserInArea: %s; " "file: %s, " @@ -4334,13 +4334,15 @@ extern bool runParserInArea (const langType language, startLine, startCharOffset, sourceLineOffset, endLine, endCharOffset); - pushArea (doesParserRequireMemoryStream (language), + if (pushArea (doesParserRequireMemoryStream (language), startLine, startCharOffset, endLine, endCharOffset, sourceLineOffset, - promise); - tagFileResized = createTagsWithFallback1 (language, NULL); - popArea (); + promise)) + { + tagFileResized = createTagsWithFallback1 (language, NULL); + popArea (); + } return tagFileResized; } diff --git a/main/read.c b/main/read.c index 2118ec1e99..fe5d8c99c2 100644 --- a/main/read.c +++ b/main/read.c @@ -1394,7 +1394,7 @@ extern char *readLineFromBypass ( return data.result; } -extern void pushArea ( +extern bool pushArea ( bool useMemoryStreamInput, unsigned long startLine, long startColumn, unsigned long endLine, long endColumn, @@ -1415,7 +1415,7 @@ extern void pushArea ( { File.thinDepth++; verbose ("push thin area (%d)\n", File.thinDepth); - return; + return true; } error(WARNING, "INTERNAL ERROR: though pushing MEMORY based thin area, " "underlying area is a FILE base: %s@%s", @@ -1427,12 +1427,15 @@ extern void pushArea ( original = getInputFilePosition (); tmp = getInputFilePositionForLine (startLine); - mio_setpos (File.mio, &tmp); - mio_seek (File.mio, startColumn, SEEK_CUR); + if (mio_setpos (File.mio, &tmp) != 0) + goto fail; + if (mio_seek (File.mio, startColumn, SEEK_CUR) != 0) + goto fail; p = mio_tell (File.mio); tmp = getInputFilePositionForLine (endLine); - mio_setpos (File.mio, &tmp); + if (mio_setpos (File.mio, &tmp) != 0) + goto fail; if (endColumn == EOL_COLUMN) { long line_start = mio_tell (File.mio); @@ -1443,9 +1446,15 @@ extern void pushArea ( Assert (endColumn >= 0); } else - mio_seek (File.mio, endColumn, SEEK_CUR); + { + if (mio_seek (File.mio, endColumn, SEEK_CUR) != 0) + goto fail; + } q = mio_tell (File.mio); + if (q <= p) + goto fail; + mio_setpos (File.mio, &original); invalidatePatternCache(); @@ -1473,6 +1482,12 @@ extern void pushArea ( File.input.lineNumberOrigin = ((startLine == 0)? 0: startLine - 1); File.source.lineNumberOrigin = ((sourceLineOffset == 0)? 0: sourceLineOffset - 1); + + return true; + +fail: + mio_setpos (File.mio, &original); + return false; } extern bool isAreaStacked (void) diff --git a/main/read_p.h b/main/read_p.h index cdfa18b4ae..446599c14c 100644 --- a/main/read_p.h +++ b/main/read_p.h @@ -82,7 +82,7 @@ extern char *readLineFromBypass (vString *const vLine, MIOPos pos, long *const o * args (endColumn): [absolute] * args (sourceLineOffset): [buggy] */ -extern void pushArea ( +extern bool pushArea ( bool useMemoryStreamInput, unsigned long startLine, long startColumn, unsigned long endLine, long endColumn,