aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLarry Doolittle <ldoolitt@recycle.lbl.gov>2017-04-25 12:32:41 -0700
committerLarry Doolittle <ldoolitt@recycle.lbl.gov>2017-04-25 12:32:41 -0700
commit37999a4fbf3487b363fd0c2f9b7ab622401b202a (patch)
tree7301dc7732f5348de1d489346e8c63874ad757ac
parent7acf9aa86275a24b468786d6ea9f308ae33f011c (diff)
downloadtinycc-37999a4fbf3487b363fd0c2f9b7ab622401b202a.tar.gz
tinycc-37999a4fbf3487b363fd0c2f9b7ab622401b202a.tar.bz2
Simple-minded fix for bug #50847
bug #50847: #line directive corrupts #include search path Keep a second copy of the filename, that isn't changed by the #line directive, and use that on the initial search path for #include files.
-rw-r--r--libtcc.c1
-rw-r--r--tcc.h1
-rw-r--r--tccpp.c3
3 files changed, 4 insertions, 1 deletions
diff --git a/libtcc.c b/libtcc.c
index 9243e49..c6bc00f 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -581,6 +581,7 @@ ST_FUNC void tcc_open_bf(TCCState *s1, const char *filename, int initlen)
bf->buf_end = bf->buffer + initlen;
bf->buf_end[0] = CH_EOB; /* put eob symbol */
pstrcpy(bf->filename, sizeof(bf->filename), filename);
+ pstrcpy(bf->filename2, sizeof(bf->filename2), filename);
#ifdef _WIN32
normalize_slashes(bf->filename);
#endif
diff --git a/tcc.h b/tcc.h
index 41ad1ab..ae7bb30 100644
--- a/tcc.h
+++ b/tcc.h
@@ -546,6 +546,7 @@ typedef struct BufferedFile {
int *ifdef_stack_ptr; /* ifdef_stack value at the start of the file */
int include_next_index; /* next search path */
char filename[1024]; /* filename */
+ char filename2[1024]; /* filename not modified by # line directive */
unsigned char unget[4];
unsigned char buffer[1]; /* extra size for CH_EOB char */
} BufferedFile;
diff --git a/tccpp.c b/tccpp.c
index 720115d..1f3b083 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -1792,7 +1792,8 @@ ST_FUNC void preprocess(int is_bof)
/* search in file's dir if "header.h" */
if (c != '\"')
continue;
- path = file->filename;
+ /* https://savannah.nongnu.org/bugs/index.php?50847 */
+ path = file->filename2;
pstrncpy(buf1, path, tcc_basename(path) - path);
} else {