summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-10-06 16:22:44 +0200
committerTor Andersson <tor.andersson@artifex.com>2015-10-06 16:37:38 +0200
commitf8b98952cf1d40911593ca9ce1f8c78187551eb5 (patch)
tree8883d342d1e64b07cf17de2e8446d1a851f3548d /platform
parent70ed309e1c69ab8cd7e107f27d101f9a13416333 (diff)
downloadmupdf-f8b98952cf1d40911593ca9ce1f8c78187551eb5.tar.xz
gl: Add checks to prevent overruns in the presence of malformed UTF-8.
Diffstat (limited to 'platform')
-rw-r--r--platform/gl/gl-input.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/platform/gl/gl-input.c b/platform/gl/gl-input.c
index 35c74866..442c277a 100644
--- a/platform/gl/gl-input.c
+++ b/platform/gl/gl-input.c
@@ -51,10 +51,10 @@ static inline int myisalnum(char *s)
return 0;
}
-static char *prev_char(char *p)
+static char *prev_char(char *p, char *start)
{
--p;
- while ((*p & 0xC0) == 0x80) /* skip middle and final multibytes */
+ while ((*p & 0xC0) == 0x80 && p > start) /* skip middle and final multibytes */
--p;
return p;
}
@@ -69,8 +69,8 @@ static char *next_char(char *p)
static char *prev_word(char *p, char *start)
{
- while (p > start && !myisalnum(prev_char(p))) p = prev_char(p);
- while (p > start && myisalnum(prev_char(p))) p = prev_char(p);
+ while (p > start && !myisalnum(prev_char(p, start))) p = prev_char(p, start);
+ while (p > start && myisalnum(prev_char(p, start))) p = prev_char(p, start);
return p;
}
@@ -124,14 +124,14 @@ static int ui_input_key(struct input *input)
else if (ui.mod == GLFW_MOD_SHIFT)
{
if (input->q > input->text)
- input->q = prev_char(input->q);
+ input->q = prev_char(input->q, input->text);
}
else if (ui.mod == 0)
{
if (input->p != input->q)
input->p = input->q = input->p < input->q ? input->p : input->q;
else if (input->q > input->text)
- input->p = input->q = prev_char(input->q);
+ input->p = input->q = prev_char(input->q, input->text);
}
break;
case KEY_RIGHT:
@@ -218,7 +218,7 @@ static int ui_input_key(struct input *input)
ui_input_delete_selection(input);
else if (input->p > input->text)
{
- char *pp = prev_char(input->p);
+ char *pp = prev_char(input->p, input->text);
memmove(pp, input->p, input->end - input->p);
input->end -= input->p - pp;
*input->end = 0;