Mercurial > hg > toybox
changeset 1611:50dc30893f9d draft
Fix bug in sed y/// where bytes in target but not in source were replaced by zeroes (nul terminator overwritten).
author | Rob Landley <rob@landley.net> |
---|---|
date | Sat, 13 Dec 2014 18:35:11 -0600 |
parents | 74e2642c35e8 |
children | eec3b88f2d58 |
files | toys/pending/sed.c |
diffstat | 1 files changed, 3 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/toys/pending/sed.c Sat Dec 13 12:27:51 2014 -0600 +++ b/toys/pending/sed.c Sat Dec 13 18:35:11 2014 -0600 @@ -254,7 +254,7 @@ memcpy(s+oldlen, new, newlen); s[oldlen+newlen] = 0; - return s+oldlen+newlen; + return s+oldlen+newlen+1; } // An empty regex repeats the previous one @@ -504,13 +504,11 @@ // place because backrefs may refer to text after it's overwritten.) len += newlen-mlen; swap = xmalloc(len+1); - rswap = swap+(rline-line); + rswap = swap+(rline-line)+match[0].rm_so; memcpy(swap, line, (rline-line)+match[0].rm_so); - memcpy(rswap+match[0].rm_so+newlen, rline+match[0].rm_eo, - (rlen -= match[0].rm_eo)+1); + memcpy(rswap+newlen, rline+match[0].rm_eo, (rlen -= match[0].rm_eo)+1); // copy in new replacement text - rswap += match[0].rm_so; for (off = mlen = 0; new[off]; off++) { int cc = 0, ll;