aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2013-11-06 08:49:11 +1000
committerSteve Bennett <steveb@workware.net.au>2013-11-06 08:55:15 +1000
commita077f0800f5bbc7ca5f3b368726f7d1757c16549 (patch)
treed1f32c6dfaf29df2cd2a2663ba99537af59b8c26
parent91960fb0e584579c5dc25376b5bfba8c6eafa4a3 (diff)
downloadjimtcl-a077f0800f5bbc7ca5f3b368726f7d1757c16549.zip
jimtcl-a077f0800f5bbc7ca5f3b368726f7d1757c16549.tar.gz
jimtcl-a077f0800f5bbc7ca5f3b368726f7d1757c16549.tar.bz2
Fix [string tolower] buffer overflow for non-utf8
Reported-by: Andy <jimdevel@hummypkg.org.uk> Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim-format.c2
-rw-r--r--jim.c4
-rw-r--r--jimregexp.c8
-rw-r--r--linenoise.c10
-rw-r--r--regtest.tcl4
-rw-r--r--utf8.h4
6 files changed, 15 insertions, 17 deletions
diff --git a/jim-format.c b/jim-format.c
index ed612cc..818eea4 100644
--- a/jim-format.c
+++ b/jim-format.c
@@ -302,7 +302,7 @@ Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr, int objc, Jim_
goto error;
}
/* Just store the value in the 'spec' buffer */
- formatted_bytes = utf8_fromunicode(spec, code);
+ formatted_bytes = utf8_getchars(spec, code);
formatted_buf = spec;
formatted_chars = 1;
break;
diff --git a/jim.c b/jim.c
index 86b5479..1e26b38 100644
--- a/jim.c
+++ b/jim.c
@@ -2744,7 +2744,7 @@ static void JimStrCopyUpperLower(char *dest, const char *str, int uc)
while (*str) {
int c;
str += utf8_tounicode(str, &c);
- dest += utf8_fromunicode(dest, uc ? utf8_upper(c) : utf8_lower(c));
+ dest += utf8_getchars(dest, uc ? utf8_upper(c) : utf8_lower(c));
}
*dest = 0;
}
@@ -2813,7 +2813,7 @@ static Jim_Obj *JimStringToTitle(Jim_Interp *interp, Jim_Obj *strObjPtr)
buf = p = Jim_Alloc(len + 1);
str += utf8_tounicode(str, &c);
- p += utf8_fromunicode(p, utf8_title(c));
+ p += utf8_getchars(p, utf8_title(c));
JimStrCopyUpperLower(p, str, 0);
diff --git a/jimregexp.c b/jimregexp.c
index efc56a1..fce33d9 100644
--- a/jimregexp.c
+++ b/jimregexp.c
@@ -1665,10 +1665,10 @@ static void regdump(regex_t *preg)
while (preg->program[s]) {
int len = preg->program[s++];
int first = preg->program[s++];
- buf[utf8_fromunicode(buf, first)] = 0;
+ buf[utf8_setunicode(buf, first)] = 0;
printf("%s", buf);
if (len > 1) {
- buf[utf8_fromunicode(buf, first + len - 1)] = 0;
+ buf[utf8_setunicode(buf, first + len - 1)] = 0;
printf("-%s", buf);
}
}
@@ -1678,7 +1678,7 @@ static void regdump(regex_t *preg)
/* Literal string, where present. */
while (preg->program[s]) {
- buf[utf8_fromunicode(buf, preg->program[s])] = 0;
+ buf[utf8_setunicode(buf, preg->program[s])] = 0;
printf("%s", buf);
s++;
}
@@ -1690,7 +1690,7 @@ static void regdump(regex_t *preg)
if (op == END) {
/* Header fields of interest. */
if (preg->regstart) {
- buf[utf8_fromunicode(buf, preg->regstart)] = 0;
+ buf[utf8_setunicode(buf, preg->regstart)] = 0;
printf("start '%s' ", buf);
}
if (preg->reganch)
diff --git a/linenoise.c b/linenoise.c
index 63d4899..e805356 100644
--- a/linenoise.c
+++ b/linenoise.c
@@ -717,16 +717,6 @@ static int getWindowSize(struct current *current)
}
#endif
-static int utf8_getchars(char *buf, int c)
-{
-#ifdef USE_UTF8
- return utf8_fromunicode(buf, c);
-#else
- *buf = c;
- return 1;
-#endif
-}
-
/**
* Returns the unicode character at the given offset,
* or -1 if none.
diff --git a/regtest.tcl b/regtest.tcl
index 2f09700..65f16af 100644
--- a/regtest.tcl
+++ b/regtest.tcl
@@ -210,6 +210,10 @@ set x [lindex {} 0]
info source $x
eval $x
+# REGTEST 30
+# non-UTF8 string tolower
+string tolower "/mod/video/h\303\203\302\244xan_ witchcraft through the ages_20131101_0110.t"
+
# TAKE THE FOLLOWING puts AS LAST LINE
puts "--- ALL TESTS PASSED ---"
diff --git a/utf8.h b/utf8.h
index 71fd6ff..4dc5a02 100644
--- a/utf8.h
+++ b/utf8.h
@@ -26,6 +26,7 @@ int utf8_fromunicode(char *p, unsigned uc);
/* No utf-8 support. 1 byte = 1 char */
#define utf8_strlen(S, B) ((B) < 0 ? strlen(S) : (B))
#define utf8_tounicode(S, CP) (*(CP) = (unsigned char)*(S), 1)
+#define utf8_getchars(CP, C) (*(CP) = (C), 1)
#define utf8_upper(C) toupper(C)
#define utf8_title(C) toupper(C)
#define utf8_lower(C) tolower(C)
@@ -35,6 +36,9 @@ int utf8_fromunicode(char *p, unsigned uc);
#else
#if !defined(JIM_BOOTSTRAP)
+
+#define utf8_getchars utf8_fromunicode
+
/**
* Returns the length of the utf-8 sequence starting with 'c'.
*