musl libc's mallocng free() may modify errno if kernel does not support MADV_FREE which causes echo to echo with error when it shouldn't.
Future versions of POSIX[1] will require that free() leaves errno unmodified but til then, do not rely free() implementation. Should fix downstream issues: https://github.com/alpinelinux/docker-alpine/issues/134 https://gitlab.alpinelinux.org/alpine/aports/-/issues/12311 Bloatcheck on x86_64: function old new delta echo_main 414 406 -8 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-8) Total: -8 bytes text data bss dec hex filename 881114 15196 2000 898310 db506 busybox_old 881106 15196 2000 898302 db4fe busybox_unstripped --- coreutils/echo.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/coreutils/echo.c b/coreutils/echo.c index b3828894c..9e8939a00 100644 --- a/coreutils/echo.c +++ b/coreutils/echo.c @@ -97,6 +97,7 @@ int echo_main(int argc UNUSED_PARAM, char **argv) #else char nflag = 1; char eflag = 0; + int err; while ((arg = *++argv) != NULL) { char n, e; @@ -184,14 +185,12 @@ int echo_main(int argc UNUSED_PARAM, char **argv) do_write: /* Careful to error out on partial writes too (think ENOSPC!) */ - errno = 0; - /*r =*/ full_write(STDOUT_FILENO, buffer, out - buffer); + err = full_write(STDOUT_FILENO, buffer, out - buffer) != out - buffer; free(buffer); - if (/*WRONG:r < 0*/ errno) { + if (err) { bb_simple_perror_msg(bb_msg_write_error); - return 1; } - return 0; + return err; } /* -- 2.30.0 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
