| From: | Andrew Atrens <atrens@xxxxxxxxxxxxxxxxxx> |
| Date: | Thu, 5 Feb 2004 10:51:58 -0500 |
On February 4, 2004 06:55 pm, Simon 'corecode' Schubert wrote:
> On 04.02.2004, at 21:42, Andrew Atrens wrote:
> > Here's a patch to sh, which fixes this -
> >
> >
> > "/usr/bin/cvs" -z3 -Q diff -N -b -B -kk -r 1.3 -r 1.3.2.1 "expand.c"
> > Index: expand.c
> > ===================================================================
> > RCS file: /usr/dfly/repo/src/bin/sh/expand.c,v
> > retrieving revision 1.3
> > retrieving revision 1.3.2.1
> > diff -b -B -r1.3 -r1.3.2.1
> > 472c472
> > < for (p--; lastc == '\n'; lastc = *--p)
> > ---
> >
> >> for ( ; *(dest-1) == '\n' ; )
>
> It lacks some bounds checking. Under sucky circumstances both old and
> new version will eat back up the stack...
>
Right. In the degenerate case where the bytes immediately preceeding expdest
in the heap (or data seg. iff you're in the root element of the command
stack) are == '\n' you'll walk back further than you thought. Though this is
highly unlikely, it's best to be safe :) :) ...
I used this -
for ( ; (dest - stackblock()) > startloc && *(dest-1) == '\n' ; )
Seems to be working. Just compiled and installed the new version and am
rebuilding world now.
> How about (didn't try tho):
>
> while (*(dest - 1) == '\n' && dest - stackblock() > startloc)
>
>
> cheers
> simon
Attachment:
pgp00003.pgp
Description: signature