[bug#75457,guile-zlib] zlib.scm: Fix uncompress for native 32-bit systems.

Message ID ba54947857f51c8f1cfb1f2efbb96ecc778494cb.1736417843.git.efraim@flashner.co.il
State New
Headers
Series [bug#75457,guile-zlib] zlib.scm: Fix uncompress for native 32-bit systems. |

Commit Message

Efraim Flashner Jan. 9, 2025, 10:18 a.m. UTC
  * zlib.scm (uncompress): Use the sizeof an unsigned-long for all size
calculations instead of forcing 64-bit integers.
---

I tested this (all the tests passed) using the guix.scm in the repo using:
guix build -f guix.scm
guix build -f guix.scm --system=i686-linux
guix build -f guix.scm --system=powerpc-linux (with offloading to an
actual powerpc-linux machine)

 zlib.scm | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)


base-commit: cfaf683579a97630040efe4b7596af4bc519b05e
  

Comments

Ludovic Courtès Jan. 18, 2025, 5:55 p.m. UTC | #1
Efraim Flashner <efraim@flashner.co.il> skribis:

> * zlib.scm (uncompress): Use the sizeof an unsigned-long for all size
> calculations instead of forcing 64-bit integers.

Pushed as 7eb66708fb8db750d7175b750531a48e3f49d96d.

Interestingly i686 was fine, probably because it’s little endian so the
bug you had on powerpc didn’t show up.

Let’s see if there’s anything else to fix and if not, we should tag a
new version.

Thanks!

Ludo’.
  
Efraim Flashner Jan. 19, 2025, 8:41 a.m. UTC | #2
On Sat, Jan 18, 2025 at 06:55:29PM +0100, Ludovic Courtès wrote:
> Efraim Flashner <efraim@flashner.co.il> skribis:
> 
> > * zlib.scm (uncompress): Use the sizeof an unsigned-long for all size
> > calculations instead of forcing 64-bit integers.
> 
> Pushed as 7eb66708fb8db750d7175b750531a48e3f49d96d.
> 
> Interestingly i686 was fine, probably because it’s little endian so the
> bug you had on powerpc didn’t show up.
> 
> Let’s see if there’s anything else to fix and if not, we should tag a
> new version.

I had thought that some of the 64-bitness of running on a 64-bit machine
while building as i686 leaked through, but checking debian's build logs¹
for guile-zlib 0.2.1-1 was inconclusive, with powerpc and hppa showing
the same test failure I was hitting.  Nothing on m68k, which I think is
big endian, but it looks like the tests weren't run there.

¹ https://buildd.debian.org/status/package.php?p=guile-zlib&suite=sid
  

Patch

diff --git a/zlib.scm b/zlib.scm
index 86ca4fc..a0702dc 100644
--- a/zlib.scm
+++ b/zlib.scm
@@ -425,9 +425,10 @@  require PORT to be a file port."
 the uncompressed data."
   (define (try-uncompress length)
     (let* ((dest (make-bytevector (* (sizeof uint8) length)))
-           (dest-length   (make-bytevector 8))
-           (source-length (make-bytevector 8)))
-      (bytevector-u64-set! source-length 0 length (native-endianness))
+           (dest-length   (make-bytevector (sizeof unsigned-long)))
+           (source-length (make-bytevector (sizeof unsigned-long))))
+      (bytevector-uint-set! source-length 0 length
+                            (native-endianness) (sizeof unsigned-long))
       (bytevector-uint-set! dest-length 0 length
                             (native-endianness) (sizeof unsigned-long))
       (let ((result (%uncompress2 (bytevector->pointer dest)