about summary refs log tree commit diff
path: root/Src/utils.c
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2014-12-07 11:06:07 -0800
committerBarton E. Schaefer <schaefer@zsh.org>2014-12-07 11:20:01 -0800
commit48cd1b6c3b51a7bc6d45d4aeb7ff8c55d97a6f2a (patch)
treeb6869b9fcd6dbd38566c4cd452502d2ca40220f3 /Src/utils.c
parent9ddd022ff03efd90bac9f1057e61ad74b5cdbc9a (diff)
downloadzsh-48cd1b6c3b51a7bc6d45d4aeb7ff8c55d97a6f2a.tar.gz
zsh-48cd1b6c3b51a7bc6d45d4aeb7ff8c55d97a6f2a.tar.xz
zsh-48cd1b6c3b51a7bc6d45d4aeb7ff8c55d97a6f2a.zip
33894: boundary conditions in unmeta(), unmetafy()
Check that we aren't running off the end of the string when converting the
next byte after a Meta byte.  This is just defensive programming in case
of bad metafied strings coming through from gettokstr(), some repairs
there are likely still needed.
Diffstat (limited to 'Src/utils.c')
-rw-r--r--Src/utils.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/Src/utils.c b/Src/utils.c
index 926814759..5c90638a2 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -4164,7 +4164,7 @@ unmetafy(char *s, int *len)
 
     for (p = s; *p && *p != Meta; p++);
     for (t = p; (*t = *p++);)
-	if (*t++ == Meta)
+	if (*t++ == Meta && *p)
 	    t[-1] = *p++ ^ 32;
     if (len)
 	*len = t - s;
@@ -4208,8 +4208,10 @@ unmeta(const char *file_name)
     
     meta = 0;
     for (t = file_name; *t; t++) {
-	if (*t == Meta)
-	    meta = 1;
+	if (*t == Meta) {
+	    meta = t[1];
+	    break;
+	}
     }
     if (!meta) {
 	/*