Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Problem with unicode string length zsh segfaults
- X-seq: zsh-workers 25969
- From: Peter Stephenson <pws@xxxxxxx>
- To: "Kazuo Teramoto" <kaz.rag@xxxxxxxxx>
- Subject: Re: Problem with unicode string length zsh segfaults
- Date: Thu, 30 Oct 2008 15:25:35 +0000
- Cc: zsh-workers@xxxxxxxxxx
- In-reply-to: <5992e17f0810300703l1856332cx6ef4e749a5194e1b@xxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- Organization: CSR
- References: <5992e17f0810300703l1856332cx6ef4e749a5194e1b@xxxxxxxxxxxxxx>
On Thu, 30 Oct 2008 12:03:22 -0200
"Kazuo Teramoto" <kaz.rag@xxxxxxxxx> wrote:
> Hello!
> (My first email to list, I subscribed to workers, but I send this type
> of msg to workers or users?)
Yes, zsh-workers is correct.
> I'm having a problem with string size and unicode chars. I'm using
> string size in my prompt theme, I'm using the following code to
> calculate the string size of pwd:
>
> ${#${(%):-%~}}
>
> But sometimes this got the number wrong e.g. I have a dir named
> '~/Music/ææçè' (Yuki Kajiura composer of Noir anime soundtrack) the
> code above give 13 chars but it have 12 chars (count or using "print
> -Pn '%~'|wc -m" and wc -c give 20 bytes).
>
> And if I cd on this dir my prompt get wrong by 3 chars (e.g. on a
> prompt like adams2 the first line is bigger by 3 chars)
>
> The problem is greater for a dir named 'ÐÑÑÑ ÐÐÑÐÑ ÐÐÐÐÐÐÑÐÐÐ' (Pyotr
> Il'yich Tchaikovsky, Russian composer) if I cd on it and execute the
> code above I get
>
> zsh: unmatched '
> zsh: parse error in command substitution
>
> and if I try this several times (repeat this command) my zsh segfaults:
>
> 1: subst.c:222: BUG: parse error in command substitution
Thanks for the report.
Same bug in each case; it's taken surprisingly long to find and I can't
understand how we thought the code should look like that.
I found a similar bug in new code at the same time.
Index: Src/subst.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/subst.c,v
retrieving revision 1.89
diff -u -r1.89 subst.c
--- Src/subst.c 27 Sep 2008 20:58:28 -0000 1.89
+++ Src/subst.c 30 Oct 2008 15:22:34 -0000
@@ -2738,8 +2738,8 @@
char *tmps;
unmetafy(*ap, &len);
untokenize(*ap);
- tmps = unmetafy(promptexpand(metafy(*ap, len, META_NOALLOC),
- 0, NULL, NULL, NULL), &len);
+ tmps = promptexpand(metafy(*ap, len, META_NOALLOC),
+ 0, NULL, NULL, NULL);
*ap = dupstring(tmps);
free(tmps);
}
@@ -2749,8 +2749,8 @@
val = dupstring(val), copied = 1;
unmetafy(val, &len);
untokenize(val);
- tmps = unmetafy(promptexpand(metafy(val, len, META_NOALLOC),
- 0, NULL, NULL, NULL), &len);
+ tmps = promptexpand(metafy(val, len, META_NOALLOC),
+ 0, NULL, NULL, NULL);
val = dupstring(tmps);
free(tmps);
}
Index: Src/utils.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/utils.c,v
retrieving revision 1.205
diff -u -r1.205 utils.c
--- Src/utils.c 30 Oct 2008 14:04:31 -0000 1.205
+++ Src/utils.c 30 Oct 2008 15:22:34 -0000
@@ -857,7 +857,9 @@
scanhashtable(nameddirtab, 0, 0, 0, finddir_scan, 0);
if (func) {
- char **ares = subst_string_by_func(func, "d", finddir_full);
+ char *dir_meta = metafy(finddir_full, strlen(finddir_full),
+ META_ALLOC);
+ char **ares = subst_string_by_func(func, "d", dir_meta);
int len;
if (ares && arrlen(ares) >= 2 &&
(len = (int)zstrtol(ares[1], NULL, 10)) > finddir_best) {
@@ -868,6 +870,8 @@
finddir_last->diff = len - strlen(finddir_last->node.nam);
finddir_best = len;
}
+ if (dir_meta != finddir_full)
+ zsfree(dir_meta);
}
return finddir_last;
Index: Test/D07multibyte.ztst
===================================================================
RCS file: /cvsroot/zsh/zsh/Test/D07multibyte.ztst,v
retrieving revision 1.27
diff -u -r1.27 D07multibyte.ztst
--- Test/D07multibyte.ztst 18 Oct 2008 16:03:18 -0000 1.27
+++ Test/D07multibyte.ztst 30 Oct 2008 15:22:34 -0000
@@ -403,3 +403,10 @@
0:Backslashes and metafied characters in patterns
>Matched against glob/()Ä/*
>Matched against glob/()Ä/*
+
+ mkdir ææçè 'ÐÑÑÑ ÐÐÑÐÑ ÐÐÐÐÐÐÑÐÐÐ'
+ (cd ææçè; print ${${(%):-%~}:t})
+ (cd 'ÐÑÑÑ ÐÐÑÐÑ ÐÐÐÐÐÐÑÐÐÐ'; print ${${(%):-%~}:t})
+0:Metafied characters in prompt expansion
+>ææçè
+>ÐÑÑÑ ÐÐÑÐÑ ÐÐÐÐÐÐÑÐÐÐ
--
Peter Stephenson <pws@xxxxxxx> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
Messages sorted by:
Reverse Date,
Date,
Thread,
Author