From b38d437a0064e0debfcf923cb53a7ff8e2a37457 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 19 Dec 2018 19:32:18 -0700 Subject: [PATCH] file/untar: allow \0s for user and group ids Some .tar packer (on Windows?) zeros out the user and group fields, and `file/untar` doesn't use them anyway. --- racket/collects/file/untar.rkt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/racket/collects/file/untar.rkt b/racket/collects/file/untar.rkt index f366fa6f0f..e9fb83ff2c 100644 --- a/racket/collects/file/untar.rkt +++ b/racket/collects/file/untar.rkt @@ -55,8 +55,8 @@ link-target-from-extended-attributes) (define name-bytes (read-bytes* 100 in)) (define mode (tar-bytes->number (read-bytes* 8 in) in)) - (define owner (tar-bytes->number (read-bytes* 8 in) in)) - (define group (tar-bytes->number (read-bytes* 8 in) in)) + (define owner (tar-bytes->number (read-bytes* 8 in) in #:allow-zeros? #t)) + (define group (tar-bytes->number (read-bytes* 8 in) in #:allow-zeros? #t)) (define size (tar-bytes->number (read-bytes* 12 in) in)) (define mod-time (tar-bytes->number (read-bytes* 12 in) in)) (define checksum-bytes (read-bytes* 8 in)) @@ -199,13 +199,17 @@ (write-bytes bstr out 0 size)) (loop (- amt size)))))) -(define (tar-bytes->number bstr in) +(define (tar-bytes->number bstr in #:allow-zeros? [allow-zeros? #f]) (define len (bytes-length bstr)) (cond [(bitwise-bit-set? (bytes-ref bstr 0) 7) ;; base-256: (for/fold ([v 0]) ([i (in-range 1 len)]) (+ (* v 256) v))] + [(and allow-zeros? + (for/and ([b (in-bytes bstr)]) + (zero? b))) + #f] [else ;; traditional: (define skip-tail