summaryrefslogtreecommitdiff
path: root/src/cmscgats.c
diff options
context:
space:
mode:
authorMarti Maria <mmaria@abindustries.com>2021-11-23 08:55:54 +0100
committerMarti Maria <mmaria@abindustries.com>2021-11-23 08:55:54 +0100
commit630cd7e6743c4addaa79b39d6d8493af394dd43a (patch)
treeb0c0962c4d3874d355eed314c5e4d167245b7601 /src/cmscgats.c
parenta37361adf91baf37121ff283773c5eafa9045473 (diff)
downloadlcms2-630cd7e6743c4addaa79b39d6d8493af394dd43a.tar.gz
Safeguard against infinite .include recursion
Detected by oss-fuzz
Diffstat (limited to 'src/cmscgats.c')
-rw-r--r--src/cmscgats.c57
1 files changed, 38 insertions, 19 deletions
diff --git a/src/cmscgats.c b/src/cmscgats.c
index 5a1d4b7..6e8f2dc 100644
--- a/src/cmscgats.c
+++ b/src/cmscgats.c
@@ -679,6 +679,42 @@ cmsFloat64Number ParseFloatNumber(const char *Buffer)
}
+// Reads a string, special case to avoid infinite resursion on .include
+static
+void InStringSymbol(cmsIT8* it8)
+{
+ while (isseparator(it8->ch))
+ NextCh(it8);
+
+ if (it8->ch == '\'' || it8->ch == '\"')
+ {
+ CMSREGISTER char* idptr;
+ int k, sng;
+
+ idptr = it8->str;
+ sng = it8->ch;
+ k = 0;
+ NextCh(it8);
+
+ while (k < (MAXSTR - 1) && it8->ch != sng) {
+
+ if (it8->ch == '\n' || it8->ch == '\r') k = MAXSTR + 1;
+ else {
+ *idptr++ = (char)it8->ch;
+ NextCh(it8);
+ k++;
+ }
+ }
+
+ it8->sy = SSTRING;
+ *idptr = '\0';
+ NextCh(it8);
+ }
+ else
+ SynError(it8, "String expected");
+
+}
+
// Reads next symbol
static
void InSymbol(cmsIT8* it8)
@@ -872,24 +908,7 @@ void InSymbol(cmsIT8* it8)
// String.
case '\'':
case '\"':
- idptr = it8->str;
- sng = it8->ch;
- k = 0;
- NextCh(it8);
-
- while (k < (MAXSTR-1) && it8->ch != sng) {
-
- if (it8->ch == '\n'|| it8->ch == '\r') k = MAXSTR+1;
- else {
- *idptr++ = (char) it8->ch;
- NextCh(it8);
- k++;
- }
- }
-
- it8->sy = SSTRING;
- *idptr = '\0';
- NextCh(it8);
+ InStringSymbol(it8);
break;
@@ -912,7 +931,7 @@ void InSymbol(cmsIT8* it8)
return;
}
- InSymbol(it8);
+ InStringSymbol(it8);
if (!Check(it8, SSTRING, "Filename expected")) return;
FileNest = it8 -> FileStack[it8 -> IncludeSP + 1];