aboutsummaryrefslogtreecommitdiff
path: root/src/libregexp/rregsub.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libregexp/rregsub.c')
-rw-r--r--src/libregexp/rregsub.c22
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';