guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/04: locate: Do not return the system database when it is too old.


From: guix-commits
Subject: 01/04: locate: Do not return the system database when it is too old.
Date: Wed, 18 Oct 2023 17:12:50 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit d0fed2f4df06446eafcc992f0bc7ea154124fdf4
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Wed Oct 18 18:17:36 2023 +0200

    locate: Do not return the system database when it is too old.
    
    Fixes a bug whereby ‘guix locate’ would pick the system database, then
    decide it’s too old, try to update it, and fail because it’s not
    writable by unprivileged users.
    
    Fixes <https://issues.guix.gnu.org/66612>.
    
    * guix/scripts/locate.scm (file-age): New procedure.
    (suitable-database): Add ‘age-update-threshold’ parameter and honor it.
    (guix-locate): Remove ‘file-age’.  Pass ‘age-update-threshold’ to the
    ‘database’ option.
    
    Reported-by: Matt Wette <matt.wette@gmail.com>
---
 guix/scripts/locate.scm | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/guix/scripts/locate.scm b/guix/scripts/locate.scm
index 5f3e28797f..ae64f46896 100644
--- a/guix/scripts/locate.scm
+++ b/guix/scripts/locate.scm
@@ -196,10 +196,15 @@ SELECT version FROM SchemaVersion ORDER BY version DESC 
LIMIT 1;"
   ;; System-wide database file name.
   (string-append %localstatedir "/cache/guix/locate/db.sqlite"))
 
-(define (suitable-database create?)
+(define (file-age stat)
+  "Return the age of the file denoted by STAT in seconds."
+  (- (current-time) (stat:mtime stat)))
+
+(define (suitable-database create? age-update-threshold)
   "Return a suitable database file.  When CREATE? is true, the returned
 database will be opened for writing; otherwise, return the most recent one,
-user or system."
+user or system.  Do not return the system database if it is older than
+AGE-UPDATE-THRESHOLD seconds."
   (if (zero? (getuid))
       system-database-file
       (if create?
@@ -207,10 +212,13 @@ user or system."
           (let ((system (stat system-database-file #f))
                 (user   (stat user-database-file #f)))
             (if user
-                (if (and system (> (stat:mtime system) (stat:mtime user)))
+                (if (and system
+                         (> (stat:mtime system) (stat:mtime user))
+                         (< (file-age system) age-update-threshold))
                     system-database-file
                     user-database-file)
-                (if system
+                (if (and system
+                         (< (file-age system) age-update-threshold))
                     system-database-file
                     user-database-file))))))
 
@@ -595,10 +603,6 @@ Locate FILE and return the list of packages that contain 
it.\n"))
     ;; database.
     (* 9 30 (* 24 60 60)))
 
-  (define (file-age stat)
-    ;; Return true if TIME denotes an "old" time.
-    (- (current-time) (stat:mtime stat)))
-
   (with-error-handling
     (let* ((opts     (parse-command-line args %options
                                          (list %default-options)
@@ -610,7 +614,7 @@ Locate FILE and return the list of packages that contain 
it.\n"))
            (clear?   (assoc-ref opts 'clear?))
            (update?  (assoc-ref opts 'update?))
            (glob?    (assoc-ref opts 'glob?))
-           (database ((assoc-ref opts 'database) update?))
+           (database ((assoc-ref opts 'database) update? age-update-threshold))
            (method   (assoc-ref opts 'method))
            (files    (reverse (filter-map (match-lambda
                                             (('argument . arg) arg)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]