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;