diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2021-01-22 08:35:55 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-02-23 12:59:29 +0100 |
commit | e880c9c100028e6b0e805d4637139c67aea83748 (patch) | |
tree | d521d1378a6782ca6f6a3c53fbcc7df05630454f | |
parent | 760b627e2ac6aedbf604040951280eaaf75939a8 (diff) | |
download | busybox-w32-e880c9c100028e6b0e805d4637139c67aea83748.tar.gz busybox-w32-e880c9c100028e6b0e805d4637139c67aea83748.tar.bz2 busybox-w32-e880c9c100028e6b0e805d4637139c67aea83748.zip |
echo: do not assume that free() leaves errno unmodified
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
Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | coreutils/echo.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/coreutils/echo.c b/coreutils/echo.c index b3828894c..61ba060ec 100644 --- a/coreutils/echo.c +++ b/coreutils/echo.c | |||
@@ -97,6 +97,7 @@ int echo_main(int argc UNUSED_PARAM, char **argv) | |||
97 | #else | 97 | #else |
98 | char nflag = 1; | 98 | char nflag = 1; |
99 | char eflag = 0; | 99 | char eflag = 0; |
100 | int err; | ||
100 | 101 | ||
101 | while ((arg = *++argv) != NULL) { | 102 | while ((arg = *++argv) != NULL) { |
102 | char n, e; | 103 | char n, e; |
@@ -185,13 +186,12 @@ int echo_main(int argc UNUSED_PARAM, char **argv) | |||
185 | do_write: | 186 | do_write: |
186 | /* Careful to error out on partial writes too (think ENOSPC!) */ | 187 | /* Careful to error out on partial writes too (think ENOSPC!) */ |
187 | errno = 0; | 188 | errno = 0; |
188 | /*r =*/ full_write(STDOUT_FILENO, buffer, out - buffer); | 189 | err = full_write(STDOUT_FILENO, buffer, out - buffer) != out - buffer; |
189 | free(buffer); | 190 | if (err) { |
190 | if (/*WRONG:r < 0*/ errno) { | ||
191 | bb_simple_perror_msg(bb_msg_write_error); | 191 | bb_simple_perror_msg(bb_msg_write_error); |
192 | return 1; | ||
193 | } | 192 | } |
194 | return 0; | 193 | free(buffer); |
194 | return err; | ||
195 | } | 195 | } |
196 | 196 | ||
197 | /* | 197 | /* |