linux-initrd: Gracefully handle lack of or invalid ext2 superblocks.
Reported by David Thompson <dthompson2@worcester.edu>. * guix/build/linux-initrd.scm (read-ext2-superblock): Add 'superblock-size' variable. Read with 'get-bytevector-n!' instead of 'getbytevector-n', and make sure we read exactly SUPERBLOCK-SIZE bytes.
This commit is contained in:
parent
0f28ee3487
commit
d266b79332
|
@ -116,14 +116,25 @@ if DEVICE does not contain an ext2 file system."
|
||||||
;; The magic bytes that identify an ext2 file system.
|
;; The magic bytes that identify an ext2 file system.
|
||||||
#xef53)
|
#xef53)
|
||||||
|
|
||||||
|
(define superblock-size
|
||||||
|
;; Size of the interesting part of an ext2 superblock.
|
||||||
|
264)
|
||||||
|
|
||||||
|
(define block
|
||||||
|
;; The superblock contents.
|
||||||
|
(make-bytevector superblock-size))
|
||||||
|
|
||||||
(call-with-input-file device
|
(call-with-input-file device
|
||||||
(lambda (port)
|
(lambda (port)
|
||||||
(seek port 1024 SEEK_SET)
|
(seek port 1024 SEEK_SET)
|
||||||
(let* ((block (get-bytevector-n port 264))
|
|
||||||
(magic (bytevector-u16-ref block %ext2-sblock-magic
|
;; Note: work around <http://bugs.gnu.org/17466>.
|
||||||
%ext2-endianness)))
|
(and (eqv? superblock-size (get-bytevector-n! port block 0
|
||||||
(and (= magic %ext2-magic)
|
superblock-size))
|
||||||
block)))))
|
(let ((magic (bytevector-u16-ref block %ext2-sblock-magic
|
||||||
|
%ext2-endianness)))
|
||||||
|
(and (= magic %ext2-magic)
|
||||||
|
block))))))
|
||||||
|
|
||||||
(define (ext2-superblock-uuid sblock)
|
(define (ext2-superblock-uuid sblock)
|
||||||
"Return the UUID of ext2 superblock SBLOCK as a 16-byte bytevector."
|
"Return the UUID of ext2 superblock SBLOCK as a 16-byte bytevector."
|
||||||
|
|
Loading…
Reference in New Issue