[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was
From: |
Ludovic Courtès |
Subject: |
[bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for. |
Date: |
Fri, 24 May 2019 15:42:38 +0200 |
Fixes a bug whereby 'lzread!' could return more than COUNT.
* guix/lzlib.scm (lzread!): Rewrite in a semi-functional style.
---
guix/lzlib.scm | 39 +++++++++++++++++++--------------------
1 file changed, 19 insertions(+), 20 deletions(-)
diff --git a/guix/lzlib.scm b/guix/lzlib.scm
index 48927c6262..0e384f6cb8 100644
--- a/guix/lzlib.scm
+++ b/guix/lzlib.scm
@@ -494,29 +494,28 @@ perhaps not yet read."
;; High level functions.
-(define* (lzread! decoder file-port bv
+
+(define* (lzread! decoder port bv
#:optional (start 0) (count (bytevector-length bv)))
- "Read up to COUNT bytes from FILE-PORT into BV at offset START. Return the
+ "Read up to COUNT bytes from PORT into BV at offset START. Return the
number of uncompressed bytes actually read; it is zero if COUNT is zero or if
the end-of-stream has been reached."
- ;; WARNING: Because we don't alternate between lz-reads and lz-writes, we
can't
- ;; process more than lz-decompress-write-size from the file-port.
- (when (> count (lz-decompress-write-size decoder))
- (set! count (lz-decompress-write-size decoder)))
- (let ((file-bv (get-bytevector-n file-port count)))
- (unless (eof-object? file-bv)
- (lz-decompress-write decoder file-bv 0 (bytevector-length file-bv))))
- (let ((read 0))
- (let loop ((rd 0))
- (if (< start (bytevector-length bv))
- (begin
- (set! rd (lz-decompress-read decoder bv start (-
(bytevector-length bv) start)))
- (set! start (+ start rd))
- (set! read (+ read rd)))
- (set! rd 0))
- (unless (= rd 0)
- (loop rd)))
- read))
+ (define (feed-decoder! decoder)
+ ;; Feed DECODER with data read from PORT.
+ (match (get-bytevector-n port (lz-decompress-write-size decoder))
+ ((? eof-object? eof) eof)
+ (bv (lz-decompress-write decoder bv))))
+
+ (let loop ((read 0)
+ (start start))
+ (cond ((< read count)
+ (match (lz-decompress-read decoder bv start (- count read))
+ (0 (if (eof-object? (feed-decoder! decoder))
+ read
+ (loop read start)))
+ (n (loop (+ read n) (+ start n)))))
+ (else
+ read))))
(define (lzwrite! encoder source source-offset source-count
target target-offset target-count)
--
2.21.0
- [bug#35880] [PATCH 0/7] Lzip support for 'guix publish' and 'guix substitute', Ludovic Courtès, 2019/05/24
- [bug#35880] [PATCH 1/7] lzlib: Add 'make-lzip-input-port/compressed'., Ludovic Courtès, 2019/05/24
- [bug#35880] [PATCH 5/7] self: Add dependency on lzlib., Ludovic Courtès, 2019/05/24
- [bug#35880] [PATCH 6/7] gnu: guix: Add dependency on lzlib., Ludovic Courtès, 2019/05/24
- [bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for.,
Ludovic Courtès <=
- [bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for., Pierre Neidhardt, 2019/05/25
- [bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for., Ludovic Courtès, 2019/05/26
- [bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for., Pierre Neidhardt, 2019/05/26
- [bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for., Ludovic Courtès, 2019/05/26
- [bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for., Pierre Neidhardt, 2019/05/27
- [bug#35880] [PATCH 7/7] lzlib: 'lzread!' never returns more than it was asked for., Ludovic Courtès, 2019/05/27
[bug#35880] [PATCH 4/7] publish: Add support for lzip., Ludovic Courtès, 2019/05/24
[bug#35880] [PATCH 1/7] lzlib: Add 'make-lzip-input-port/compressed'., Pierre Neidhardt, 2019/05/25