fix: atomic rename, secure temp names, read lock for status, remove manifest-path exposure
ober
28d945baf4c244239f6250a912b8a79ab6e9f71d
--- a/src/jerboa-index/segments.ss +++ b/src/jerboa-index/segments.ss @@ -16,6 +16,7 @@ (only (std os path-util) ensure-directory) (only (std security taint) safe-delete-file) (only (std crypto sha256-pure) sha256-hex) + (only (std crypto random) random-token) (jerboa-index core)) (defstruct index-segment-chain @@ -140,7 +141,7 @@ (number->string from-generation) "-" (number->string to-generation) "-" digest "-" - (number->string (random 1000000000)) + (random-token) ".jix")) (def (make-descriptor filename from-generation to-generation digest) --- a/src/jerboa-search/content-store.ss +++ b/src/jerboa-search/content-store.ss @@ -5,7 +5,8 @@ (only (std os path-util) ensure-directory directory-files-recursive file-size) (only (std security taint) safe-delete-file) - (only (std crypto sha256-pure) sha256-hex)) + (only (std crypto sha256-pure) sha256-hex) + (only (std crypto random) random-token)) (def MAX-CONTENT-BYTES (* 16 1024 1024)) @@ -65,17 +66,12 @@ (content-file-matches? path digest)) (ensure-directory directory) (let ([temporary - (string-append path ".tmp-" - (number->string (random 1000000000)))]) + (string-append path ".tmp-" (random-token))]) (guard (e [else (when (file-exists? temporary) (safe-delete-file temporary)) (raise e)]) (write-content-file! temporary bytes) - (if (file-exists? path) - (begin - (safe-delete-file path) - (rename-file temporary path)) - (rename-file temporary path))))) + (rename-file temporary path)))) digest))) (def (content-store-get root digest) --- a/src/jerboa-search/index.ss +++ b/src/jerboa-search/index.ss @@ -21,6 +21,7 @@ make-rwlock rwlock-read-lock! rwlock-read-unlock! with-read-lock with-write-lock) (only (std security taint) safe-delete-file) + (only (std crypto random) random-token) (jerboa-index core) (jerboa-index mmap) (jerboa-index hybrid) @@ -227,7 +228,7 @@ (def (pending-mmap-path path generation) (string-append (mmap-path path) ".pending-" (number->string generation) "-" - (number->string (random 1000000000)))) + (random-token))) (def (pending-live-view managed) (let* ([snapshot (text-index-snapshot-data (managed-index-delta managed))] @@ -757,7 +758,7 @@ (lambda (db) (let* ([managed (ensure-managed-index db store)] [lock (managed-index-rwlock managed)]) - (with-write-lock lock + (with-read-lock lock (let ([size (if (managed-index-mapped managed) (hybrid-index-size @@ -791,9 +792,7 @@ (cons 'source (managed-index-source managed)) (cons 'query-engine (if (managed-index-mapped managed) 'mmap-hybrid 'core)) - (cons 'core-resident (and (managed-index-core managed) #t)) - (cons 'manifest-path - (search-store-index-manifest-path store)))))))))) + (cons 'core-resident (and (managed-index-core managed) #t)))))))))) (def (gc-search-content! store) (call-with-store