[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: crash inserting character before a special and a normal one
From: |
Tobias Rittweiler |
Subject: |
Re: crash inserting character before a special and a normal one |
Date: |
Thu, 17 Apr 2003 19:06:59 +0200 |
On Thursday, April 17, 2003 at 6:54:40 PM,
Philippe Biondi <biondi@cartel-securite.fr> wrote:
> > Try the patch from
> > http://mail.gnu.org/archive/html/bug-bash/2003-04/msg00026.html
>
> - memset (ps, 0, sizeof(mbstate_t));
> + if (ps != NULL) memset (ps, 0, sizeof(mbstate_t));
>
> That will fix the problem. But is it normal for "ps" to be null here ?
> I could not determine that as I can't match my sources with the binary
> verion I have.
Well, firstly mbrlen(3) says:
If ps is a NULL pointer, a static anonymous state only known
to the mbrlen function is used instead.
That means, mbrlen _can_ work with passing a NULL pointer as ps --
readline can't deny that and just assume ps is never NULL. Well,
actually it could do that, but that wouldn't be good programming
practise, imho. :-)
And second, the source of update_line() (in display.c) is as follows:
1206 #if defined (HANDLE_MULTIBYTE)
1207 /* This may not work for stateful encoding, but who cares? To handle
1208 stateful encoding properly, we have to scan each string from the
1209 beginning and compare. */
1210 else if (_rl_compare_chars (ols, 0, NULL, nls, 0, NULL) == 0)
1211 #else
1212 else if (*ols != *nls)
1213 #endif
Purpose is to test whether ols isn't equal to nls, and it's the
correct way to pass NULL as ps in this circumstance, asfaics.
--
cheers,
Tobias
http://freebits.org - ``Free Life, free Opinion, free Software.''
http://rocklinux.org - ``I'm a hacker, and I'm using ROCK Linux.''
In large states public education will always be mediocre, for the same reason
that in large kitchens the cooking is usually bad.
-- Friedrich Nietzsche