On Fri, 22 Jan 2021 08:35:55 +0100 Natanael Copa <nc...@alpinelinux.org> wrote:
> 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 > --- > > v2: do the free after bb_simple_perror_msg so it prints the correct > error message. > > coreutils/echo.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/coreutils/echo.c b/coreutils/echo.c > index b3828894c..002832ead 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); > - free(buffer); > - if (/*WRONG:r < 0*/ errno) { > + err = full_write(STDOUT_FILENO, buffer, out - buffer) != out - buffer; > + if (err) { > bb_simple_perror_msg(bb_msg_write_error); > - return 1; > } > - return 0; > + free(buffer); > + return err; > } > > /* Ping. Any change to get this merged? It fixes a real bug and saves a few bytes. -nc _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox