liblouis/liblouis-security-fixes.patch
Martin Gieseking 25c4c347ee applied security fixes
CVE-2014-8184, CVE-2017-13738, CVE-2017-13740, CVE-2017-13741, CVE-2017-13742,
CVE-2017-13743, CVE-2017-13744
2017-11-03 12:45:47 +01:00

636 lines
18 KiB
Diff

diff --git a/liblouis/compileTranslationTable.c b/liblouis/compileTranslationTable.c
--- a/liblouis/compileTranslationTable.c
+++ b/liblouis/compileTranslationTable.c
@@ -365,12 +365,13 @@
char *
showString (widechar const *chars, int length)
{
-/*Translate a string of characters to the encoding used in character
-* operands */
+ /*Translate a string of characters to the encoding used in character
+ * operands */
int charPos;
int bufPos = 0;
+ static char scratchBuf[MAXSTRING];
scratchBuf[bufPos++] = '\'';
- for (charPos = 0; charPos < length; charPos++)
+ for (charPos = 0; charPos < length && bufPos < (MAXSTRING-2); charPos++)
{
if (chars[charPos] >= 32 && chars[charPos] < 127)
scratchBuf[bufPos++] = (char) chars[charPos];
@@ -407,7 +408,7 @@
leadingZeros = 0;
break;
}
- if ((bufPos + leadingZeros + hexLength + 4) >= sizeof (scratchBuf))
+ if ((bufPos + leadingZeros + hexLength + 4) >= (MAXSTRING-2))
break;
scratchBuf[bufPos++] = '\\';
scratchBuf[bufPos++] = escapeLetter;
@@ -422,87 +423,88 @@
return scratchBuf;
}
+typedef struct intCharTupple {
+ int key;
+ char value;
+} intCharTupple;
+
+/**
+ * Mapping between braille dot and textual representation as used in dots operands
+ */
+const static intCharTupple dotMapping[] = {
+ {B1, '1'},
+ {B2, '2'},
+ {B3, '3'},
+ {B4, '4'},
+ {B5, '5'},
+ {B6, '6'},
+ {B7, '7'},
+ {B8, '8'},
+ {B9, '9'},
+ {B10, 'A'},
+ {B11, 'B'},
+ {B12, 'C'},
+ {B13, 'D'},
+ {B14, 'E'},
+ {B15, 'F'},
+ 0
+};
+
+/**
+ * Translate a sequence of dots to the encoding used in dots operands.
+ */
char *
showDots (widechar const *dots, int length)
{
-/* Translate a sequence of dots to the encoding used in dots operands.
-*/
int bufPos = 0;
- int dotsPos;
- for (dotsPos = 0; bufPos < sizeof (scratchBuf) && dotsPos < length;
- dotsPos++)
- {
- if ((dots[dotsPos] & B1))
- scratchBuf[bufPos++] = '1';
- if ((dots[dotsPos] & B2))
- scratchBuf[bufPos++] = '2';
- if ((dots[dotsPos] & B3))
- scratchBuf[bufPos++] = '3';
- if ((dots[dotsPos] & B4))
- scratchBuf[bufPos++] = '4';
- if ((dots[dotsPos] & B5))
- scratchBuf[bufPos++] = '5';
- if ((dots[dotsPos] & B6))
- scratchBuf[bufPos++] = '6';
- if ((dots[dotsPos] & B7))
- scratchBuf[bufPos++] = '7';
- if ((dots[dotsPos] & B8))
- scratchBuf[bufPos++] = '8';
- if ((dots[dotsPos] & B9))
- scratchBuf[bufPos++] = '9';
- if ((dots[dotsPos] & B10))
- scratchBuf[bufPos++] = 'A';
- if ((dots[dotsPos] & B11))
- scratchBuf[bufPos++] = 'B';
- if ((dots[dotsPos] & B12))
- scratchBuf[bufPos++] = 'C';
- if ((dots[dotsPos] & B13))
- scratchBuf[bufPos++] = 'D';
- if ((dots[dotsPos] & B14))
- scratchBuf[bufPos++] = 'E';
- if ((dots[dotsPos] & B15))
- scratchBuf[bufPos++] = 'F';
- if ((dots[dotsPos] == B16))
- scratchBuf[bufPos++] = '0';
- if (dotsPos != length - 1)
- scratchBuf[bufPos++] = '-';
+ static char scratchBuf[MAXSTRING];
+ for (int dotsPos = 0; dotsPos < length && bufPos < (MAXSTRING-1); dotsPos++) {
+ for (int mappingPos = 0; dotMapping[mappingPos].key; mappingPos++) {
+ if ((dots[dotsPos] & dotMapping[mappingPos].key) && (bufPos < (MAXSTRING-1)))
+ scratchBuf[bufPos++] = dotMapping[mappingPos].value;
}
+ if ((dots[dotsPos] == B16) && (bufPos < (MAXSTRING-1)))
+ scratchBuf[bufPos++] = '0';
+ if ((dotsPos != length - 1) && (bufPos < (MAXSTRING-1)))
+ scratchBuf[bufPos++] = '-';
+ }
scratchBuf[bufPos] = 0;
- return &scratchBuf[0];
+ return scratchBuf;
}
+/**
+ * Mapping between character attribute and textual representation
+ */
+const static intCharTupple attributeMapping[] = {
+ {CTC_Space, 's'},
+ {CTC_Letter, 'l'},
+ {CTC_Digit, 'd'},
+ {CTC_Punctuation, 'p'},
+ {CTC_UpperCase, 'U'},
+ {CTC_LowerCase, 'u'},
+ {CTC_Math, 'm'},
+ {CTC_Sign, 'S'},
+ {CTC_LitDigit, 'D'},
+ {CTC_Class1, 'w'},
+ {CTC_Class2, 'x'},
+ {CTC_Class3, 'y'},
+ {CTC_Class4, 'z'},
+ 0
+};
+
+/**
+ * Show attributes using the letters used after the $ in multipass
+ * opcodes.
+ */
char *
showAttributes (TranslationTableCharacterAttributes a)
{
-/* Show attributes using the letters used after the $ in multipass
-* opcodes. */
int bufPos = 0;
- if ((a & CTC_Space))
- scratchBuf[bufPos++] = 's';
- if ((a & CTC_Letter))
- scratchBuf[bufPos++] = 'l';
- if ((a & CTC_Digit))
- scratchBuf[bufPos++] = 'd';
- if ((a & CTC_Punctuation))
- scratchBuf[bufPos++] = 'p';
- if ((a & CTC_UpperCase))
- scratchBuf[bufPos++] = 'U';
- if ((a & CTC_LowerCase))
- scratchBuf[bufPos++] = 'u';
- if ((a & CTC_Math))
- scratchBuf[bufPos++] = 'm';
- if ((a & CTC_Sign))
- scratchBuf[bufPos++] = 'S';
- if ((a & CTC_LitDigit))
- scratchBuf[bufPos++] = 'D';
- if ((a & CTC_Class1))
- scratchBuf[bufPos++] = 'w';
- if ((a & CTC_Class2))
- scratchBuf[bufPos++] = 'x';
- if ((a & CTC_Class3))
- scratchBuf[bufPos++] = 'y';
- if ((a & CTC_Class4))
- scratchBuf[bufPos++] = 'z';
+ static char scratchBuf[MAXSTRING];
+ for (int mappingPos = 0; attributeMapping[mappingPos].key; mappingPos++) {
+ if ((a & attributeMapping[mappingPos].key) && bufPos < (MAXSTRING - 1))
+ scratchBuf[bufPos++] = attributeMapping[mappingPos].value;
+ }
scratchBuf[bufPos] = 0;
return scratchBuf;
}
@@ -592,9 +594,10 @@
if (pch == '\\' && ch == 10)
{
nested->linelen--;
+ pch = ch;
continue;
}
- if (ch == 10 || nested->linelen >= MAXSTRING)
+ if (ch == 10 || nested->linelen >= MAXSTRING-1)
break;
nested->line[nested->linelen++] = (widechar) ch;
pch = ch;
@@ -957,43 +960,22 @@
return 1;
}
+/**
+ * Print out dot numbers
+ *
+ * @return a string containing the dot numbers. The longest possible
+ * output is "\123456789ABCDEF0/"
+ */
static char *
unknownDots (widechar dots)
{
-/*Print out dot numbers */
static char buffer[20];
int k = 1;
buffer[0] = '\\';
- if ((dots & B1))
- buffer[k++] = '1';
- if ((dots & B2))
- buffer[k++] = '2';
- if ((dots & B3))
- buffer[k++] = '3';
- if ((dots & B4))
- buffer[k++] = '4';
- if ((dots & B5))
- buffer[k++] = '5';
- if ((dots & B6))
- buffer[k++] = '6';
- if ((dots & B7))
- buffer[k++] = '7';
- if ((dots & B8))
- buffer[k++] = '8';
- if ((dots & B9))
- buffer[k++] = '9';
- if ((dots & B10))
- buffer[k++] = 'A';
- if ((dots & B11))
- buffer[k++] = 'B';
- if ((dots & B12))
- buffer[k++] = 'C';
- if ((dots & B13))
- buffer[k++] = 'D';
- if ((dots & B14))
- buffer[k++] = 'E';
- if ((dots & B15))
- buffer[k++] = 'F';
+ for (int mappingPos = 0; dotMapping[mappingPos].key; mappingPos++) {
+ if (dots & dotMapping[mappingPos].key)
+ buffer[k++] = dotMapping[mappingPos].value;
+ }
buffer[k++] = '/';
buffer[k] = 0;
return buffer;
@@ -1557,6 +1539,11 @@
{
compileWarning (nested, "invalid UTF-8. Assuming Latin-1.");
result->chars[out++] = token->chars[lastIn];
+ if (out >= MAXSTRING)
+ {
+ result->length = out;
+ return 1;
+ }
in = lastIn + 1;
continue;
}
@@ -1582,7 +1569,7 @@
CharsString wideIn;
CharsString result;
int k;
- for (k = 0; inString[k] && k < MAXSTRING; k++)
+ for (k = 0; inString[k] && k < MAXSTRING-1; k++)
wideIn.chars[k] = inString[k];
wideIn.chars[k] = 0;
wideIn.length = k;
@@ -1713,7 +1700,7 @@
CharsString wideIn;
CharsString result;
int k;
- for (k = 0; inString[k] && k < MAXSTRING; k++)
+ for (k = 0; inString[k] && k < MAXSTRING-1; k++)
wideIn.chars[k] = inString[k];
wideIn.chars[k] = 0;
wideIn.length = k;
@@ -3244,8 +3231,7 @@
static int
compileBrailleIndicator (FileInfo * nested, char *ermsg,
- TranslationTableOpcode opcode,
- TranslationTableOffset * rule)
+ TranslationTableOpcode opcode)
{
CharsString token;
CharsString cells;
@@ -3253,7 +3239,6 @@
if (parseDots (nested, &cells, &token))
if (!addRule (nested, opcode, NULL, &cells, 0, 0))
return 0;
- *rule = newRuleOffset;
return 1;
}
@@ -3869,18 +3854,22 @@
case CTO_Undefined:
ok =
compileBrailleIndicator (nested, "undefined character opcode",
- CTO_Undefined, &table->undefined);
+ CTO_Undefined);
+ if (ok)
+ table->undefined = newRuleOffset;
break;
case CTO_CapitalSign:
ok =
- compileBrailleIndicator (nested, "capital sign", CTO_CapitalRule,
- &table->capitalSign);
+ compileBrailleIndicator (nested, "capital sign", CTO_CapitalRule);
+ if (ok)
+ table->capitalSign = newRuleOffset;
break;
case CTO_BeginCapitalSign:
ok =
compileBrailleIndicator (nested, "begin capital sign",
- CTO_BeginCapitalRule,
- &table->beginCapitalSign);
+ CTO_BeginCapitalRule);
+ if (ok)
+ table->beginCapitalSign = newRuleOffset;
break;
case CTO_LenBegcaps:
ok = table->lenBeginCaps = compileNumber (nested);
@@ -3888,33 +3877,39 @@
case CTO_EndCapitalSign:
ok =
compileBrailleIndicator (nested, "end capitals sign",
- CTO_EndCapitalRule, &table->endCapitalSign);
+ CTO_EndCapitalRule);
+ if (ok)
+ table->endCapitalSign = newRuleOffset;
break;
case CTO_FirstWordCaps:
ok =
compileBrailleIndicator (nested, "first word capital sign",
- CTO_FirstWordCapsRule,
- &table->firstWordCaps);
+ CTO_FirstWordCapsRule);
+ if (ok)
+ table->firstWordCaps = newRuleOffset;
break;
case CTO_LastWordCapsBefore:
ok =
compileBrailleIndicator (nested, "capital sign before last word",
- CTO_LastWordCapsBeforeRule,
- &table->lastWordCapsBefore);
+ CTO_LastWordCapsBeforeRule);
+ if (ok)
+ table->lastWordCapsBefore = newRuleOffset;
break;
case CTO_LastWordCapsAfter:
ok =
compileBrailleIndicator (nested, "capital sign after last word",
- CTO_LastWordCapsAfterRule,
- &table->lastWordCapsAfter);
+ CTO_LastWordCapsAfterRule);
+ if (ok)
+ table->lastWordCapsAfter = newRuleOffset;
break;
case CTO_LenCapsPhrase:
ok = table->lenCapsPhrase = compileNumber (nested);
break;
case CTO_LetterSign:
ok =
- compileBrailleIndicator (nested, "letter sign", CTO_LetterRule,
- &table->letterSign);
+ compileBrailleIndicator (nested, "letter sign", CTO_LetterRule);
+ if (ok)
+ table->letterSign = newRuleOffset;
break;
case CTO_NoLetsignBefore:
if (getRuleCharsText (nested, &ruleChars))
@@ -3959,52 +3954,60 @@
break;
case CTO_NumberSign:
ok =
- compileBrailleIndicator (nested, "number sign", CTO_NumberRule,
- &table->numberSign);
+ compileBrailleIndicator (nested, "number sign", CTO_NumberRule);
+ if (ok)
+ table->numberSign = newRuleOffset;
break;
case CTO_FirstWordItal:
ok =
compileBrailleIndicator (nested, "first word italic",
- CTO_FirstWordItalRule,
- &table->firstWordItal);
+ CTO_FirstWordItalRule);
+ if (ok)
+ table->firstWordItal = newRuleOffset;
break;
case CTO_ItalSign:
case CTO_LastWordItalBefore:
ok =
compileBrailleIndicator (nested, "first word italic before",
- CTO_LastWordItalBeforeRule,
- &table->lastWordItalBefore);
+ CTO_LastWordItalBeforeRule);
+ if (ok)
+ table->lastWordItalBefore = newRuleOffset;
break;
case CTO_LastWordItalAfter:
ok =
compileBrailleIndicator (nested, "last word italic after",
- CTO_LastWordItalAfterRule,
- &table->lastWordItalAfter);
+ CTO_LastWordItalAfterRule);
+ if (ok)
+ table->lastWordItalAfter = newRuleOffset;
break;
case CTO_BegItal:
case CTO_FirstLetterItal:
ok =
compileBrailleIndicator (nested, "first letter italic",
- CTO_FirstLetterItalRule,
- &table->firstLetterItal);
+ CTO_FirstLetterItalRule);
+ if (ok)
+ table->firstLetterItal = newRuleOffset;
break;
case CTO_EndItal:
case CTO_LastLetterItal:
ok =
compileBrailleIndicator (nested, "last letter italic",
- CTO_LastLetterItalRule,
- &table->lastLetterItal);
+ CTO_LastLetterItalRule);
+ if (ok)
+ table->lastLetterItal = newRuleOffset;
break;
case CTO_SingleLetterItal:
ok =
compileBrailleIndicator (nested, "single letter italic",
- CTO_SingleLetterItalRule,
- &table->singleLetterItal);
+ CTO_SingleLetterItalRule);
+ if (ok)
+ table->singleLetterItal = newRuleOffset;
break;
case CTO_ItalWord:
ok =
- compileBrailleIndicator (nested, "italic word", CTO_ItalWordRule,
- &table->italWord);
+ compileBrailleIndicator (nested, "italic word", CTO_ItalWordRule);
+ if (ok)
+ table->italWord = newRuleOffset;
break;
case CTO_LenItalPhrase:
ok = table->lenItalPhrase = compileNumber (nested);
@@ -4012,46 +4015,53 @@
case CTO_FirstWordBold:
ok =
compileBrailleIndicator (nested, "first word bold",
- CTO_FirstWordBoldRule,
- &table->firstWordBold);
+ CTO_FirstWordBoldRule);
+ if (ok)
+ table->firstWordBold = newRuleOffset;
break;
case CTO_BoldSign:
case CTO_LastWordBoldBefore:
ok =
compileBrailleIndicator (nested, "last word bold before",
- CTO_LastWordBoldBeforeRule,
- &table->lastWordBoldBefore);
+ CTO_LastWordBoldBeforeRule);
+ if (ok)
+ table->lastWordBoldBefore = newRuleOffset;
break;
case CTO_LastWordBoldAfter:
ok =
compileBrailleIndicator (nested, "last word bold after",
- CTO_LastWordBoldAfterRule,
- &table->lastWordBoldAfter);
+ CTO_LastWordBoldAfterRule);
+ if (ok)
+ table->lastWordBoldAfter = newRuleOffset;
break;
case CTO_BegBold:
case CTO_FirstLetterBold:
ok =
compileBrailleIndicator (nested, "first letter bold",
- CTO_FirstLetterBoldRule,
- &table->firstLetterBold);
+ CTO_FirstLetterBoldRule);
+ if (ok)
+ table->firstLetterBold = newRuleOffset;
break;
case CTO_EndBold:
case CTO_LastLetterBold:
ok =
compileBrailleIndicator (nested, "last letter bold",
- CTO_LastLetterBoldRule,
- &table->lastLetterBold);
+ CTO_LastLetterBoldRule);
+ if (ok)
+ table->lastLetterBold = newRuleOffset;
break;
case CTO_SingleLetterBold:
ok =
compileBrailleIndicator (nested, "single letter bold",
- CTO_SingleLetterBoldRule,
- &table->singleLetterBold);
+ CTO_SingleLetterBoldRule);
+ if (ok)
+ table->singleLetterBold = newRuleOffset;
break;
case CTO_BoldWord:
ok =
- compileBrailleIndicator (nested, "bold word", CTO_BoldWordRule,
- &table->boldWord);
+ compileBrailleIndicator (nested, "bold word", CTO_BoldWordRule);
+ if (ok)
+ table->boldWord = newRuleOffset;
break;
case CTO_LenBoldPhrase:
ok = table->lenBoldPhrase = compileNumber (nested);
@@ -4059,46 +4069,53 @@
case CTO_FirstWordUnder:
ok =
compileBrailleIndicator (nested, "first word underline",
- CTO_FirstWordUnderRule,
- &table->firstWordUnder);
+ CTO_FirstWordUnderRule);
+ if (ok)
+ table->firstWordUnder = newRuleOffset;
break;
case CTO_UnderSign:
case CTO_LastWordUnderBefore:
ok =
compileBrailleIndicator (nested, "last word underline before",
- CTO_LastWordUnderBeforeRule,
- &table->lastWordUnderBefore);
+ CTO_LastWordUnderBeforeRule);
+ if (ok)
+ table->lastWordUnderBefore = newRuleOffset;
break;
case CTO_LastWordUnderAfter:
ok =
compileBrailleIndicator (nested, "last word underline after",
- CTO_LastWordUnderAfterRule,
- &table->lastWordUnderAfter);
+ CTO_LastWordUnderAfterRule);
+ if (ok)
+ table->lastWordUnderAfter = newRuleOffset;
break;
case CTO_BegUnder:
case CTO_FirstLetterUnder:
ok =
compileBrailleIndicator (nested, "first letter underline",
- CTO_FirstLetterUnderRule,
- &table->firstLetterUnder);
+ CTO_FirstLetterUnderRule);
+ if (ok)
+ table->firstLetterUnder = newRuleOffset;
break;
case CTO_EndUnder:
case CTO_LastLetterUnder:
ok =
compileBrailleIndicator (nested, "last letter underline",
- CTO_LastLetterUnderRule,
- &table->lastLetterUnder);
+ CTO_LastLetterUnderRule);
+ if (ok)
+ table->lastLetterUnder = newRuleOffset;
break;
case CTO_SingleLetterUnder:
ok =
compileBrailleIndicator (nested, "single letter underline",
- CTO_SingleLetterUnderRule,
- &table->singleLetterUnder);
+ CTO_SingleLetterUnderRule);
+ if (ok)
+ table->singleLetterUnder = newRuleOffset;
break;
case CTO_UnderWord:
ok =
- compileBrailleIndicator (nested, "underlined word", CTO_UnderWordRule,
- &table->underWord);
+ compileBrailleIndicator (nested, "underlined word", CTO_UnderWordRule);
+ if (ok)
+ table->underWord = newRuleOffset;
break;
case CTO_LenUnderPhrase:
ok = table->lenUnderPhrase = compileNumber (nested);
@@ -4106,12 +4123,16 @@
case CTO_BegComp:
ok =
compileBrailleIndicator (nested, "begin computer braille",
- CTO_BegCompRule, &table->begComp);
+ CTO_BegCompRule);
+ if (ok)
+ table->begComp = newRuleOffset;
break;
case CTO_EndComp:
ok =
compileBrailleIndicator (nested, "end computer braslle",
- CTO_EndCompRule, &table->endComp);
+ CTO_EndCompRule);
+ if (ok)
+ table->endComp = newRuleOffset;
break;
case CTO_Syllable:
table->syllables = 1;
@@ -4748,10 +4769,10 @@
includeFile (FileInfo * nested, CharsString * includedFile)
{
int k;
- char includeThis[MAXSTRING];
+ char includeThis[MAXSTRING+1];
char **tableFiles;
int rv;
- for (k = 0; k < includedFile->length; k++)
+ for (k = 0; k < includedFile->length && k < MAXSTRING; k++)
includeThis[k] = (char) includedFile->chars[k];
includeThis[k] = 0;
tableFiles = resolveTable (includeThis, nested->fileName);
diff --git a/tools/lou_translate.c b/tools/lou_translate.c
--- a/tools/lou_translate.c
+++ b/tools/lou_translate.c
@@ -71,7 +71,7 @@
{
translen = BUFSIZE;
k = 0;
- while ((ch = getchar ()) != '\n' && ch != EOF && k < BUFSIZE)
+ while ((ch = getchar ()) != '\n' && ch != EOF && k < BUFSIZE-1)
charbuf[k++] = ch;
if (ch == EOF && k == 0)
break;