aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Cournoyer <maxim.cournoyer@gmail.com>2023-04-10 22:08:09 -0400
committerMaxim Cournoyer <maxim.cournoyer@gmail.com>2023-04-10 22:20:21 -0400
commit756e1483c8578d91ec7dde35257ad88148b0c6cc (patch)
treec7b746e714da8c9f2d4f1df5dbf1daf9def032c4
parent61894e823d0d4d8825712fc91597cf661be7eccf (diff)
downloadguix-756e1483c8578d91ec7dde35257ad88148b0c6cc.tar.gz
guix-756e1483c8578d91ec7dde35257ad88148b0c6cc.zip
status: Guard against a numerical overflow condition.
Fixes <https://issues.guix.gnu.org/62766>. * guix/status.scm (update-build): Use 0 as progress when an exception occurs while computing it.
-rw-r--r--guix/status.scm15
1 files changed, 12 insertions, 3 deletions
diff --git a/guix/status.scm b/guix/status.scm
index d4d3fca026..fd89ba9dd3 100644
--- a/guix/status.scm
+++ b/guix/status.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -190,9 +191,17 @@ a completion indication."
((regexp-exec %fraction-line-rx line)
=>
(lambda (match)
- (let ((done (string->number (match:substring match 1)))
- (total (string->number (match:substring match 3))))
- (update (* 100. (/ done total))))))
+ (let* ((done (string->number (match:substring match 1)))
+ (total (string->number (match:substring match 3)))
+ ;; It's possible that both done and total are 0 (see:
+ ;; https://issues.guix.gnu.org/62766). Special case this
+ ;; pathological case as a null progress (0).
+ (progress (catch 'numerical-overflow
+ (lambda ()
+ (/ done total))
+ (lambda _
+ 0))))
+ (update (* 100. progress)))))
((regexp-exec %phase-start-rx line)
=>
(lambda (match)