From: Pádraig Brady
Date: Wed, 15 Mar 2023 13:57:37 +0000 (+0000) Subject: cksum: fix --raw on 64 bit big endian systems X-Git-Tag: v9.2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8e6e627f1a1142ec9cb273cfadc3f9aa2aa412a;p=thirdparty%2Fcoreutils.git cksum: fix --raw on 64 bit big endian systems * src/sum.c (output_bsd): On sparc64 for example, a crc of 0 was output due to casting an int variable to uint16_t and thus operating on the wrong end of the variable. Instead use explicit assignment to the narrower type to ensure we get the appropriate data. (output_sysv): Likewise. Reported by Bruno Haible. --- diff --git a/src/sum.c b/src/sum.c index 5046bb3f0d..36464cacf1 100644 --- a/src/sum.c +++ b/src/sum.c @@ -197,7 +197,8 @@ output_bsd (char const *file, int binary_file, void const *digest, if (raw) { /* Output in network byte order (big endian). */ - uint16_t out_int = SWAP (*(uint16_t *)digest); + uint16_t out_int = *(int *)digest; + out_int = SWAP (out_int); fwrite (&out_int, 1, 16/8, stdout); return; } @@ -221,7 +222,8 @@ output_sysv (char const *file, int binary_file, void const *digest, if (raw) { /* Output in network byte order (big endian). */ - uint16_t out_int = SWAP (*(uint16_t *)digest); + uint16_t out_int = *(int *)digest; + out_int = SWAP (out_int); fwrite (&out_int, 1, 16/8, stdout); return; }