Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package liblouis for openSUSE:Factory 
checked in at 2022-06-04 23:26:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/liblouis (Old)
 and      /work/SRC/openSUSE:Factory/.liblouis.new.1548 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "liblouis"

Sat Jun  4 23:26:43 2022 rev:48 rq:980585 version:3.21.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/liblouis/liblouis.changes        2022-04-13 
21:04:09.132526199 +0200
+++ /work/SRC/openSUSE:Factory/.liblouis.new.1548/liblouis.changes      
2022-06-04 23:26:45.108738570 +0200
@@ -1,0 +2,8 @@
+Thu Jun  2 17:49:07 UTC 2022 - Michael Gorse <mgo...@suse.com>
+
+- Add liblouis-CVE-2022-26981.patch: fix buffer overrun in
+  compilePassOpcode (boo#1197085 CVE-2022-26981).
+- Add liblouis-CVE-2022-31783.patch: prevent an invalid memory
+  write in compileRule (boo#1200120 CVE-2022-31783).
+
+-------------------------------------------------------------------

New:
----
  liblouis-CVE-2022-26981.patch
  liblouis-CVE-2022-31783.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ liblouis.spec ++++++
--- /var/tmp/diff_new_pack.M0yStn/_old  2022-06-04 23:26:45.752739225 +0200
+++ /var/tmp/diff_new_pack.M0yStn/_new  2022-06-04 23:26:45.756739228 +0200
@@ -25,6 +25,10 @@
 Group:          Productivity/Other
 URL:            http://liblouis.org/
 Source0:        
https://github.com/liblouis/liblouis/releases/download/v%{version}/liblouis-%{version}.tar.gz
+# PATCH-FIX-UPSTREAM liblouis-CVE-2022-26981.patch boo#1197085 mgo...@suse.com 
-- fix buffer overrun in compilePassOpcode.
+Patch0:         liblouis-CVE-2022-26981.patch
+# PATCH-FIX-UPSTREAM liblouis-CVE-2022-31783.patch boo#1200120 mgo...@suse.com 
-- prevent an invalid memory write in compileRule.
+Patch1:         liblouis-CVE-2022-31783.patch
 
 BuildRequires:  fdupes
 BuildRequires:  libyaml-devel
@@ -124,7 +128,7 @@
 This subpackage contains the Python3 bindings.
 
 %prep
-%setup -q
+%autosetup -p1
 
 %build
 %configure --disable-static --enable-ucs4

++++++ liblouis-CVE-2022-26981.patch ++++++
>From 73751be7a5617bfff4a735ae095203a2d3ec50ef Mon Sep 17 00:00:00 2001
From: Martin Gieseking <martin.giesek...@uos.de>
Date: Tue, 22 Mar 2022 15:31:04 +0100
Subject: [PATCH] Prevent writing past CharString memory in compilePassOpcode

---
 liblouis/compileTranslationTable.c | 207 ++++++++++++++++++++---------
 1 file changed, 146 insertions(+), 61 deletions(-)

diff --git a/liblouis/compileTranslationTable.c 
b/liblouis/compileTranslationTable.c
index 40513ce6..482ff1a6 100644
--- a/liblouis/compileTranslationTable.c
+++ b/liblouis/compileTranslationTable.c
@@ -1843,6 +1843,17 @@ verifyStringOrDots(const FileInfo *file, 
TranslationTableOpcode opcode, int isSt
        return 0;
 }
 
+static int
+appendInstructionChar(
+               const FileInfo *file, widechar *passInstructions, int *passIC, 
widechar ch) {
+       if (*passIC >= MAXSTRING) {
+               compileError(file, "multipass operand too long");
+               return 0;
+       }
+       passInstructions[(*passIC)++] = ch;
+       return 1;
+}
+
 static int
 compilePassOpcode(const FileInfo *file, TranslationTableOpcode opcode, int 
noback,
                int nofor, TranslationTableHeader **table) {
@@ -1883,32 +1894,34 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
        passLine.chars[endTest] = pass_endTest;
        passLinepos = 0;
        while (passLinepos <= endTest) {
-               if (passIC >= MAXSTRING) {
-                       compileError(file, "Test part in multipass operand too 
long");
-                       return 0;
-               }
                switch ((passSubOp = passLine.chars[passLinepos])) {
                case pass_lookback:
-                       passInstructions[passIC++] = pass_lookback;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_lookback))
+                               return 0;
                        passLinepos++;
                        passGetNumber(&passLine, &passLinepos, &passHoldNumber);
                        if (passHoldNumber == 0) passHoldNumber = 1;
-                       passInstructions[passIC++] = passHoldNumber;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, passHoldNumber))
+                               return 0;
                        break;
                case pass_not:
-                       passInstructions[passIC++] = pass_not;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_not))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_first:
-                       passInstructions[passIC++] = pass_first;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_first))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_last:
-                       passInstructions[passIC++] = pass_last;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_last))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_search:
-                       passInstructions[passIC++] = pass_search;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_search))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_string:
@@ -1916,7 +1929,8 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                return 0;
                        }
                        passLinepos++;
-                       passInstructions[passIC++] = pass_string;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_string))
+                               return 0;
                        passGetString(&passLine, &passLinepos, &passHoldString, 
file);
                        if (passHoldString.length == 0) {
                                compileError(file, "empty string in test part");
@@ -1928,7 +1942,8 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                return 0;
                        }
                        passLinepos++;
-                       passInstructions[passIC++] = pass_dots;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_dots))
+                               return 0;
                        passGetDots(&passLine, &passLinepos, &passHoldString, 
file);
                        if (passHoldString.length == 0) {
                                compileError(file, "expected dot pattern after 
@ operand in test part");
@@ -1940,22 +1955,29 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                                file, "@ operand in test part 
of multipass operand too long");
                                return 0;
                        }
-                       passInstructions[passIC++] = passHoldString.length;
+                       if (!appendInstructionChar(
+                                               file, passInstructions, 
&passIC, passHoldString.length))
+                               return 0;
                        for (kk = 0; kk < passHoldString.length; kk++) {
                                if (passIC >= MAXSTRING) {
                                        compileError(
                                                        file, "@ operand in 
test part of multipass operand too long");
                                        return 0;
                                }
-                               passInstructions[passIC++] = 
passHoldString.chars[kk];
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldString.chars[kk]))
+                                       return 0;
                        }
                        break;
                case pass_startReplace:
-                       passInstructions[passIC++] = pass_startReplace;
+                       if (!appendInstructionChar(
+                                               file, passInstructions, 
&passIC, pass_startReplace))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_endReplace:
-                       passInstructions[passIC++] = pass_endReplace;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_endReplace))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_variable:
@@ -1964,26 +1986,37 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                return 0;
                        switch (passLine.chars[passLinepos]) {
                        case pass_eq:
-                               passInstructions[passIC++] = pass_eq;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, pass_eq))
+                                       return 0;
                                goto doComp;
                        case pass_lt:
                                if (passLine.chars[passLinepos + 1] == pass_eq) 
{
                                        passLinepos++;
-                                       passInstructions[passIC++] = pass_lteq;
-                               } else
-                                       passInstructions[passIC++] = pass_lt;
+                                       if (!appendInstructionChar(
+                                                               file, 
passInstructions, &passIC, pass_lteq))
+                                               return 0;
+                               } else if (!appendInstructionChar(
+                                                                  file, 
passInstructions, &passIC, pass_lt))
+                                       return 0;
                                goto doComp;
                        case pass_gt:
                                if (passLine.chars[passLinepos + 1] == pass_eq) 
{
                                        passLinepos++;
-                                       passInstructions[passIC++] = pass_gteq;
-                               } else
-                                       passInstructions[passIC++] = pass_gt;
+                                       if (!appendInstructionChar(
+                                                               file, 
passInstructions, &passIC, pass_gteq))
+                                               return 0;
+                               } else if (!appendInstructionChar(
+                                                                  file, 
passInstructions, &passIC, pass_gt))
+                                       return 0;
                        doComp:
-                               passInstructions[passIC++] = passHoldNumber;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldNumber))
+                                       return 0;
                                passLinepos++;
                                passGetNumber(&passLine, &passLinepos, 
&passHoldNumber);
-                               passInstructions[passIC++] = passHoldNumber;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldNumber))
+                                       return 0;
                                break;
                        default:
                                compileError(file, "incorrect comparison 
operator");
@@ -1995,27 +2028,40 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        if (!passGetAttributes(&passLine, &passLinepos, 
&passAttributes, file))
                                return 0;
                insertAttributes:
-                       passInstructions[passIC++] = pass_attributes;
-                       passInstructions[passIC++] = (passAttributes >> 48) & 
0xffff;
-                       passInstructions[passIC++] = (passAttributes >> 32) & 
0xffff;
-                       passInstructions[passIC++] = (passAttributes >> 16) & 
0xffff;
-                       passInstructions[passIC++] = passAttributes & 0xffff;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_attributes))
+                               return 0;
+                       if (!appendInstructionChar(
+                                               file, passInstructions, 
&passIC, (passAttributes >> 48) & 0xffff))
+                               return 0;
+                       if (!appendInstructionChar(
+                                               file, passInstructions, 
&passIC, (passAttributes >> 32) & 0xffff))
+                               return 0;
+                       if (!appendInstructionChar(
+                                               file, passInstructions, 
&passIC, (passAttributes >> 16) & 0xffff))
+                               return 0;
+                       if (!appendInstructionChar(
+                                               file, passInstructions, 
&passIC, passAttributes & 0xffff))
+                               return 0;
                getRange:
                        if (passLine.chars[passLinepos] == pass_until) {
                                passLinepos++;
-                               passInstructions[passIC++] = 1;
-                               passInstructions[passIC++] = 0xffff;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, 1)) return 0;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, 0xffff))
+                                       return 0;
                                break;
                        }
                        passGetNumber(&passLine, &passLinepos, &passHoldNumber);
                        if (passHoldNumber == 0) {
-                               passHoldNumber = passInstructions[passIC++] = 1;
-                               passInstructions[passIC++] = 1; /* This is not 
an error */
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, 1)) return 0;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, 1)) return 0;
                                break;
                        }
-                       passInstructions[passIC++] = passHoldNumber;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, passHoldNumber))
+                               return 0;
                        if (passLine.chars[passLinepos] != pass_hyphen) {
-                               passInstructions[passIC++] = passHoldNumber;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldNumber))
+                                       return 0;
                                break;
                        }
                        passLinepos++;
@@ -2024,7 +2070,8 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                compileError(file, "invalid range");
                                return 0;
                        }
-                       passInstructions[passIC++] = passHoldNumber;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, passHoldNumber))
+                               return 0;
                        break;
                case pass_groupstart:
                case pass_groupend: {
@@ -2034,9 +2081,14 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        if (ruleOffset)
                                rule = (TranslationTableRule 
*)&(*table)->ruleArea[ruleOffset];
                        if (rule && rule->opcode == CTO_Grouping) {
-                               passInstructions[passIC++] = passSubOp;
-                               passInstructions[passIC++] = ruleOffset >> 16;
-                               passInstructions[passIC++] = ruleOffset & 
0xffff;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, passSubOp))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset >> 16))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset & 0xffff))
+                                       return 0;
                                break;
                        } else {
                                compileError(file, "%s is not a grouping name",
@@ -2059,9 +2111,14 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        if (rule &&
                                        (rule->opcode == CTO_SwapCc || 
rule->opcode == CTO_SwapCd ||
                                                        rule->opcode == 
CTO_SwapDd)) {
-                               passInstructions[passIC++] = pass_swap;
-                               passInstructions[passIC++] = ruleOffset >> 16;
-                               passInstructions[passIC++] = ruleOffset & 
0xffff;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, pass_swap))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset >> 16))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset & 0xffff))
+                                       return 0;
                                goto getRange;
                        }
                        compileError(file, "%s is neither a class name nor a 
swap name.",
@@ -2069,7 +2126,8 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        return 0;
                }
                case pass_endTest:
-                       passInstructions[passIC++] = pass_endTest;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_endTest))
+                               return 0;
                        passLinepos++;
                        break;
                default:
@@ -2094,7 +2152,8 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                return 0;
                        }
                        passLinepos++;
-                       passInstructions[passIC++] = pass_string;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_string))
+                               return 0;
                        passGetString(&passLine, &passLinepos, &passHoldString, 
file);
                        goto actionDoCharsDots;
                case pass_dots:
@@ -2103,7 +2162,8 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        }
                        passLinepos++;
                        passGetDots(&passLine, &passLinepos, &passHoldString, 
file);
-                       passInstructions[passIC++] = pass_dots;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_dots))
+                               return 0;
                        if (passHoldString.length == 0) {
                                compileError(file, "expected dot pattern after 
@ operand in action part");
                                return 0;
@@ -2114,14 +2174,18 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                                file, "@ operand in action part 
of multipass operand too long");
                                return 0;
                        }
-                       passInstructions[passIC++] = passHoldString.length;
+                       if (!appendInstructionChar(
+                                               file, passInstructions, 
&passIC, passHoldString.length))
+                               return 0;
                        for (kk = 0; kk < passHoldString.length; kk++) {
                                if (passIC >= MAXSTRING) {
                                        compileError(file,
                                                        "@ operand in action 
part of multipass operand too long");
                                        return 0;
                                }
-                               passInstructions[passIC++] = 
passHoldString.chars[kk];
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldString.chars[kk]))
+                                       return 0;
                        }
                        break;
                case pass_variable:
@@ -2130,16 +2194,25 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                                return 0;
                        switch (passLine.chars[passLinepos]) {
                        case pass_eq:
-                               passInstructions[passIC++] = pass_eq;
-                               passInstructions[passIC++] = passHoldNumber;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, pass_eq))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldNumber))
+                                       return 0;
                                passLinepos++;
                                passGetNumber(&passLine, &passLinepos, 
&passHoldNumber);
-                               passInstructions[passIC++] = passHoldNumber;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldNumber))
+                                       return 0;
                                break;
                        case pass_plus:
                        case pass_hyphen:
-                               passInstructions[passIC++] = 
passLine.chars[passLinepos++];
-                               passInstructions[passIC++] = passHoldNumber;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC,
+                                                       
passLine.chars[passLinepos++]))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, passHoldNumber))
+                                       return 0;
                                break;
                        default:
                                compileError(file, "incorrect variable operator 
in action part");
@@ -2147,11 +2220,13 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        }
                        break;
                case pass_copy:
-                       passInstructions[passIC++] = pass_copy;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_copy))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_omit:
-                       passInstructions[passIC++] = pass_omit;
+                       if (!appendInstructionChar(file, passInstructions, 
&passIC, pass_omit))
+                               return 0;
                        passLinepos++;
                        break;
                case pass_groupreplace:
@@ -2163,9 +2238,14 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        if (ruleOffset)
                                rule = (TranslationTableRule 
*)&(*table)->ruleArea[ruleOffset];
                        if (rule && rule->opcode == CTO_Grouping) {
-                               passInstructions[passIC++] = passSubOp;
-                               passInstructions[passIC++] = ruleOffset >> 16;
-                               passInstructions[passIC++] = ruleOffset & 
0xffff;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, passSubOp))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset >> 16))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset & 0xffff))
+                                       return 0;
                                break;
                        }
                        compileError(file, "%s is not a grouping name",
@@ -2181,9 +2261,14 @@ compilePassOpcode(const FileInfo *file, 
TranslationTableOpcode opcode, int nobac
                        if (rule &&
                                        (rule->opcode == CTO_SwapCc || 
rule->opcode == CTO_SwapCd ||
                                                        rule->opcode == 
CTO_SwapDd)) {
-                               passInstructions[passIC++] = pass_swap;
-                               passInstructions[passIC++] = ruleOffset >> 16;
-                               passInstructions[passIC++] = ruleOffset & 
0xffff;
+                               if (!appendInstructionChar(file, 
passInstructions, &passIC, pass_swap))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset >> 16))
+                                       return 0;
+                               if (!appendInstructionChar(
+                                                       file, passInstructions, 
&passIC, ruleOffset & 0xffff))
+                                       return 0;
                                break;
                        }
                        compileError(file, "%s is not a swap name.",
-- 
2.36.1


++++++ liblouis-CVE-2022-31783.patch ++++++
>From 2e4772befb2b1c37cb4b9d6572945115ee28630a Mon Sep 17 00:00:00 2001
From: Christian Egli <christian.e...@sbs.ch>
Date: Wed, 25 May 2022 18:08:36 +0200
Subject: [PATCH] Prevent an invalid memory writes in compileRule

Thanks to Han Zheng for reporting it

Fixes #1214
---
 liblouis/compileTranslationTable.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/liblouis/compileTranslationTable.c 
b/liblouis/compileTranslationTable.c
index 482ff1a6..43785245 100644
--- a/liblouis/compileTranslationTable.c
+++ b/liblouis/compileTranslationTable.c
@@ -3821,12 +3821,14 @@ doOpcode:
 
                case CTO_SeqAfterExpression:
                        if (!getRuleCharsText(file, &ruleChars)) return 0;
-                       for ((*table)->seqAfterExpressionLength = 0;
-                                       (*table)->seqAfterExpressionLength < 
ruleChars.length;
-                                       (*table)->seqAfterExpressionLength++)
-                               
(*table)->seqAfterExpression[(*table)->seqAfterExpressionLength] =
-                                               
ruleChars.chars[(*table)->seqAfterExpressionLength];
-                       
(*table)->seqAfterExpression[(*table)->seqAfterExpressionLength] = 0;
+                       if ((ruleChars.length + 1) > SEQPATTERNSIZE) {
+                               compileError(file, "More than %d characters", 
SEQPATTERNSIZE);
+                               return 0;
+                       }
+                       for (int k = 0; k < ruleChars.length; k++)
+                               (*table)->seqAfterExpression[k] = 
ruleChars.chars[k];
+                       (*table)->seqAfterExpression[ruleChars.length] = 0;
+                       (*table)->seqAfterExpressionLength = ruleChars.length;
                        return 1;
 
                case CTO_CapsModeChars:
-- 
2.36.1

Reply via email to