diff options
Diffstat (limited to 'src/libregexp/rregsub.c')
-rw-r--r-- | src/libregexp/rregsub.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/libregexp/rregsub.c b/src/libregexp/rregsub.c index 15f3c174..5a4a564d 100644 --- a/src/libregexp/rregsub.c +++ b/src/libregexp/rregsub.c @@ -5,12 +5,14 @@ extern void rregsub(Rune *sp, /* source string */ Rune *dp, /* destination string */ + int dlen, Resub *mp, /* subexpression elements */ int ms) /* number of elements pointed to by mp */ { - Rune *ssp; + Rune *ssp, *ep; int i; + ep = dp+(dlen/sizeof(Rune))-1; while(*sp != '\0'){ if(*sp == '\\'){ switch(*++sp){ @@ -29,16 +31,19 @@ rregsub(Rune *sp, /* source string */ for(ssp = mp[i].s.rsp; ssp < mp[i].e.rep; ssp++) - *dp++ = *ssp; + if(dp < ep) + *dp++ = *ssp; break; case '\\': - *dp++ = '\\'; + if(dp < ep) + *dp++ = '\\'; break; case '\0': sp--; break; default: - *dp++ = *sp; + if(dp < ep) + *dp++ = *sp; break; } }else if(*sp == '&'){ @@ -46,9 +51,12 @@ rregsub(Rune *sp, /* source string */ if(mp[0].s.rsp != 0) for(ssp = mp[0].s.rsp; ssp < mp[0].e.rep; ssp++) - *dp++ = *ssp; - }else - *dp++ = *sp; + if(dp < ep) + *dp++ = *ssp; + }else{ + if(dp < ep) + *dp++ = *sp; + } sp++; } *dp = '\0'; |