Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Bug#245974: zsh: export LC_ALL=da_DK causes segfault



Peter Stephenson wrote:
> Clint Adams wrote:
> > > Seems that when LC_TIME (or LC_ALL or LANG) is set to a locale such as
> > > da_DK or de_DE, wherein am_pm is set to null strings, zsh will segfault
> > > upon prompt-expanding %p or %P.  Seems that the first argument to
> > 
> > So, when am_pm is set to null strings, strftime() with format "%p" or
> > "%P" will return 0, which zsh is ill-equipped to handle.
> > The following patch avoids the segfault.  I hope there's a better way to
> > do this.
> 
> Yes, the right way to do it is to handle `0' properly, which says the
> array is in an indeterminate state and hence the shell should tidy up.
> The current patch is not the right way to do it.

This is a better patch, although it's not ideal, owing to the interface
of strftime which doesn't signal success or failure properly.

In general, please don't commit gross hacks to the archive unless they
are strictly necessary, since it just makes extra work later.  In this
case, the new hack was just disguising the fact that the previous hack
was allocating infinite amounts of memory without an exit test.  It's
not surprising the shell code is less than transparent in a lot of
places.

The second hunk is a bit imperfect, too, for the same reason --- well,
actually we could be smarter in returns from ztrftime than from
strftime, but at the moment we aren't --- but will at least ensure the
buffer is correctly terminated in cases like the present one.

Index: Src/prompt.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/prompt.c,v
retrieving revision 1.16
diff -u -r1.16 prompt.c
--- Src/prompt.c	4 May 2004 04:17:29 -0000	1.16
+++ Src/prompt.c	4 May 2004 14:34:47 -0000
@@ -526,11 +526,16 @@
 		    }
 		    timet = time(NULL);
 		    tm = localtime(&timet);
-		    for(t0=80; ; t0*=2) {
+		    /*
+		     * Ghastly hack because strftime won't say how
+		     * much space it actually needs.  Try to add it
+		     * a few times until it works.  Some formats don't
+		     * actually have a length, so we could go on for
+		     * ever.
+		     */
+		    for(j = 0, t0 = strlen(tmfmt)*8; j < 3; j++, t0*=2) {
 			addbufspc(t0);
-			if (ztrftime(bp, t0, tmfmt, tm) ||
-			    !strcmp("%P", tmfmt) ||
-			    !strcmp("%p", tmfmt))
+			if (ztrftime(bp, t0, tmfmt, tm))
 			    break;
 		    }
 		    bp += strlen(bp);
Index: Src/utils.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/utils.c,v
retrieving revision 1.59
diff -u -r1.59 utils.c
--- Src/utils.c	4 May 2004 04:17:29 -0000	1.59
+++ Src/utils.c	4 May 2004 14:34:48 -0000
@@ -1831,9 +1831,11 @@
 		 */
 		*buf = '\0';
 		tmp[1] = fmt[-1];
-		if (!strftime(buf, bufsize + 2, tmp, tm) &&
-		    tmp[1]!='p' && tmp[1]!='P')
+		if (!strftime(buf, bufsize + 2, tmp, tm))
+		{
+		    buf[0] = '\0';
 		    return 0;
+		}
 		decr = strlen(buf);
 		buf += decr;
 		bufsize -= decr - 2;

-- 
Peter Stephenson <pws@xxxxxxx>                  Software Engineer
CSR Ltd., Science Park, Milton Road,
Cambridge, CB4 0WH, UK                          Tel: +44 (0)1223 692070


**********************************************************************
This email and any files transmitted with it are confidential and
intended solely for the use of the individual or entity to whom they
are addressed. If you have received this email in error please notify
the system manager.

This footnote also confirms that this email message has been swept by
MIMEsweeper for the presence of computer viruses.

www.mimesweeper.com
**********************************************************************



Messages sorted by: Reverse Date, Date, Thread, Author