GNU bug report logs - #62134
guix substitute crashes, instead of printing a useful error message, when the only substitutes on offer use unsupported compression

Previous Next

Package: guix;

Reported by: "Zack Weinberg" <zack <at> owlfolio.org>

Date: Sun, 12 Mar 2023 00:56:02 UTC

Severity: normal

To reply to this bug, email your comments to 62134 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guix <at> gnu.org:
bug#62134; Package guix. (Sun, 12 Mar 2023 00:56:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to "Zack Weinberg" <zack <at> owlfolio.org>:
New bug report received and forwarded. Copy sent to bug-guix <at> gnu.org. (Sun, 12 Mar 2023 00:56:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: "Zack Weinberg" <zack <at> owlfolio.org>
To: bug-guix <at> gnu.org
Subject: guix substitute crashes, instead of printing a useful error message,
 when the only substitutes on offer use unsupported compression
Date: Sat, 11 Mar 2023 19:55:31 -0500
`narinfo-best-uri` ends with

```
 (match (sort choices (if fast-decompression? (negate speed<?) file-size<?))
    (((uri compression file-size) _ ...)
     (values uri compression file-size)))
```

This will throw an error if the `choices` list is empty.  Nothing catches this error, so, if the choices list should happen to be empty for some package, you will get a giant, unhelpful backtrace:

```
$ guix package -i [PACKAGE]
...
substitute: Backtrace:
substitute: In ice-9/boot-9.scm:
substitute:   1752:10 17 (with-exception-handler _ _ #:unwind? _ # _)
substitute: In unknown file:
substitute:           16 (apply-smob/0 #<thunk 7f93056f32e0>)
substitute: In ice-9/boot-9.scm:
substitute:     724:2 15 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
substitute: In ice-9/eval.scm:
substitute:     619:8 14 (_ #(#(#<directory (guile-user) 7f93056f8c80>)))
substitute: In guix/ui.scm:
substitute:    2275:7 13 (run-guix . _)
substitute:   2238:10 12 (run-guix-command _ . _)
substitute: In ice-9/boot-9.scm:
substitute:   1752:10 11 (with-exception-handler _ _ #:unwind? _ # _)
substitute:   1752:10 10 (with-exception-handler _ _ #:unwind? _ # _)
substitute: In guix/scripts/substitute.scm:
substitute:    842:18  9 (_)
substitute:     352:7  8 (process-query #<output: file 4> _ #:cache-urls _ #:acl _)
substitute: In srfi/srfi-1.scm:
substitute:     634:9  7 (for-each #<procedure 7f9305761040 at guix/scripts/sub…> …)
substitute: In guix/scripts/substitute.scm:
substitute:    297:13  6 (_ #<<narinfo> path: "/gnu/store/…>)
substitute: In guix/narinfo.scm:
substitute:     346:2  5 (narinfo-best-uri _ #:fast-decompression? _)
substitute: In ice-9/boot-9.scm:
substitute:   1685:16  4 (raise-exception _ #:continuable? _)
substitute:   1685:16  3 (raise-exception _ #:continuable? _)
substitute:   1780:13  2 (_ #<&compound-exception components: (#<&error> #<&orig…>)
substitute:   1685:16  1 (raise-exception _ #:continuable? _)
substitute:   1685:16  0 (raise-exception _ #:continuable? _)
substitute:
substitute: ice-9/boot-9.scm:1685:16: In procedure raise-exception:
substitute: Throw to key `match-error' with args `("match" "no matching pattern" ())'.
guix package: error: `/usr/bin/guix substitute' died unexpectedly
```

The strongest clue to what is actually wrong is

```
Throw to key `match-error' with args `("match" "no matching pattern" ())
```

and you have to know that that () at the end of the error message means `match` was passed an empty list.

OK, so when can the choices list be empty for a package?  Simply, when the only substitutes on offer for that package have been compressed with compression methods that the *Guix daemon*'s Guile installation does not support -- for instance, zstd, if the (zstd) module is not available.  narinfo-best-uri intentionally filters those URIs out of the choices list, but is not prepared for the possibility that nothing will be left.

I tripped over this with a somewhat heterodox configuration; a third-party substitute server that only offers zstd-compressed nars, plus Guix as foreign package manager on Debian, with the daemon installed from *Debian's* package, which doesn't have a dependency on guile-zstd (*Guix's* package of guix does depend on guile-zstd).  Still, I feel that the principle "externally supplied data, no matter how malformed, should never cause a crash" applies.

The requested change, then, is for `guix substitute` to *not* crash if the filtered choices list is empty.  Probably narinfo-best-uri should return (values nil nil nil) in that case, and then scripts/substitute.scm should also be changed to error out gracefully and/or fall back to local building when it gets that result from narinfo-best-uri.

zw




This bug report was last modified 1 year and 66 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.