aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--lexers/LexMMIXAL.cxx9
-rw-r--r--lexilla/test/examples/mmixal/references.mms16
-rw-r--r--lexilla/test/examples/mmixal/references.mms.styled16
3 files changed, 36 insertions, 5 deletions
diff --git a/lexers/LexMMIXAL.cxx b/lexers/LexMMIXAL.cxx
index 0917b5d0a..49b639dd2 100644
--- a/lexers/LexMMIXAL.cxx
+++ b/lexers/LexMMIXAL.cxx
@@ -99,12 +99,11 @@ static void ColouriseMMIXALDoc(Sci_PositionU startPos, Sci_Position length, int
}
} else if (sc.state == SCE_MMIXAL_REF) { // REF
if (!IsAWordChar(sc.ch) ) {
- char s[100];
- sc.GetCurrent(s, sizeof(s));
+ char s0[100];
+ sc.GetCurrent(s0, sizeof(s0));
+ const char *s = s0;
if (*s == ':') { // ignore base prefix for match
- for (size_t i = 0; i != sizeof(s); ++i) {
- *(s+i) = *(s+i+1);
- }
+ ++s;
}
if (special_register.InList(s)) {
sc.ChangeState(SCE_MMIXAL_REGISTER);
diff --git a/lexilla/test/examples/mmixal/references.mms b/lexilla/test/examples/mmixal/references.mms
new file mode 100644
index 000000000..82be6e8c9
--- /dev/null
+++ b/lexilla/test/examples/mmixal/references.mms
@@ -0,0 +1,16 @@
+# Bug #2019 Buffer over-read in MMIXAL lexer
+label
+ PREFIX Foo:
+% Relative reference (uses PREFIX)
+ JMP label
+%
+ JMP @label
+% Absolute reference (does not use PREFIX)
+ JMP :label
+% In register list so treated as register
+ JMP :rA
+% Too long for buffer so truncated
+ JMP l1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+% Too long for buffer so truncated then treated as absolute
+ JMP :l1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+%
diff --git a/lexilla/test/examples/mmixal/references.mms.styled b/lexilla/test/examples/mmixal/references.mms.styled
new file mode 100644
index 000000000..78ae29a3a
--- /dev/null
+++ b/lexilla/test/examples/mmixal/references.mms.styled
@@ -0,0 +1,16 @@
+{1}# Bug #2019 Buffer over-read in MMIXAL lexer
+{2}label{4}
+{0} {5}PREFIX{7} {10}Foo:{1}
+% Relative reference (uses PREFIX)
+{0} {5}JMP{7} {10}label{1}
+%
+{0} {5}JMP{7} {10}@label{1}
+% Absolute reference (does not use PREFIX)
+{0} {5}JMP{7} {10}:label{1}
+% In register list so treated as register
+{0} {5}JMP{7} {13}:rA{1}
+% Too long for buffer so truncated
+{0} {5}JMP{7} {10}l1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890{1}
+% Too long for buffer so truncated then treated as absolute
+{0} {5}JMP{7} {10}:l1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890{1}
+%