[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH resend] sed: check errors writing file with sed -i
From:       Dominique Martinet <asmadeus () codewreck ! org>
Date:       2023-02-03 3:59:56
Message-ID: 20230203035956.3663022-1-asmadeus () codewreck ! org
[Download RAW message or body]

From: Dominique Martinet <dominique.martinet@atmark-techno.com>

sed would currently not error if write failed when modifying a file.

This can be reproduced with the following 'script':
$ sudo mount -t tmpfs tmpfs -o size=1M /tmp/m
$ sudo chmod 777 /tmp/m
$ echo foo > /tmp/m/foo
$ dd if=/dev/zero of=/tmp/m/fill bs=4k
dd: error writing '/tmp/m/fill': No space left on device
256+0 records in
255+0 records out
1044480 bytes (1.0 MB, 1020 KiB) copied, 0.00234567 s, 445 MB/s
$ busybox sed -i -e 's/.*/bar/' /tmp/m/foo
$ echo $?
0
$ cat /tmp/m/foo
<empty>

new behaviour:
$ echo foo > /tmp/m/foo
$ ./busybox sed -i -e 's/.*/bar/' /tmp/m/foo
sed: write error
$ echo $?
4
$ cat /tmp/m/foo
foo

function                                             old     new   delta
sed_main                                             754     801     +47
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 47/0)               Total: 47 bytes
   text	   data	    bss	    dec	    hex	filename
  66957	   2398	   1552	  70907	  114fb	busybox_old
  67004	   2398	   1552	  70954	  1152a	busybox_unstripped

Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
---
(Denys, sorry for double-resend -- I didn't understand why I had sent this
from my personal address last time but the list blocks non-subscriber
mails... resending from this address again...)

Not getting any reply to whether I should resend last month, so
resending in doubt...

FWIW this has been applied on alpine shortly after sending the patch
(mid Nov), there hasn't been any problem that I've heard about.

 editors/sed.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/editors/sed.c b/editors/sed.c
index 32a4b61f6d4c..be709eef3a9c 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -1639,6 +1639,11 @@ int sed_main(int argc UNUSED_PARAM, char **argv)
 			fchown(nonstdoutfd, statbuf.st_uid, statbuf.st_gid);
 
 			process_files();
+			fflush(G.nonstdout);
+			if (ferror(G.nonstdout)) {
+				xfunc_error_retval = 4;  /* It's what gnu sed exits with... */
+				bb_simple_error_msg_and_die(bb_msg_write_error);
+			}
 			fclose(G.nonstdout);
 			G.nonstdout = stdout;
 
-- 
2.35.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic