[*_dump] Fix segfault when given a tiny metadata file
This commit is contained in:
parent
7079b1ec9e
commit
48e7ab89a5
@ -13,7 +13,11 @@ namespace {
|
|||||||
// FIXME: duplication
|
// FIXME: duplication
|
||||||
transaction_manager::ptr
|
transaction_manager::ptr
|
||||||
open_tm(block_manager<>::ptr bm) {
|
open_tm(block_manager<>::ptr bm) {
|
||||||
space_map::ptr sm(new core_map(bm->get_nr_blocks()));
|
auto nr_blocks = bm->get_nr_blocks();
|
||||||
|
if (!nr_blocks)
|
||||||
|
throw runtime_error("Metadata is not large enough for superblock.");
|
||||||
|
|
||||||
|
space_map::ptr sm(new core_map(nr_blocks));
|
||||||
sm->inc(SUPERBLOCK_LOCATION);
|
sm->inc(SUPERBLOCK_LOCATION);
|
||||||
transaction_manager::ptr tm(new transaction_manager(bm, sm));
|
transaction_manager::ptr tm(new transaction_manager(bm, sm));
|
||||||
return tm;
|
return tm;
|
||||||
|
@ -11,7 +11,11 @@ namespace {
|
|||||||
// FIXME: duplication
|
// FIXME: duplication
|
||||||
transaction_manager::ptr
|
transaction_manager::ptr
|
||||||
open_tm(block_manager<>::ptr bm) {
|
open_tm(block_manager<>::ptr bm) {
|
||||||
space_map::ptr sm(new core_map(bm->get_nr_blocks()));
|
auto nr_blocks = bm->get_nr_blocks();
|
||||||
|
if (!nr_blocks)
|
||||||
|
throw runtime_error("Metadata is not large enough for superblock.");
|
||||||
|
|
||||||
|
space_map::ptr sm(new core_map(nr_blocks));
|
||||||
sm->inc(SUPERBLOCK_LOCATION);
|
sm->inc(SUPERBLOCK_LOCATION);
|
||||||
transaction_manager::ptr tm(new transaction_manager(bm, sm));
|
transaction_manager::ptr tm(new transaction_manager(bm, sm));
|
||||||
return tm;
|
return tm;
|
||||||
|
@ -245,6 +245,11 @@
|
|||||||
(receive (stdout stderr) (run-fail "cache_dump")
|
(receive (stdout stderr) (run-fail "cache_dump")
|
||||||
(assert-starts-with "No input file provided." stderr)))
|
(assert-starts-with "No input file provided." stderr)))
|
||||||
|
|
||||||
|
(define-scenario (cache-dump small-input-file)
|
||||||
|
"Fails with small input file"
|
||||||
|
(with-temp-file-sized ((md "cache.bin" 512))
|
||||||
|
(run-fail "cache_dump" md)))
|
||||||
|
|
||||||
(define-scenario (cache-dump restore-is-noop)
|
(define-scenario (cache-dump restore-is-noop)
|
||||||
"cache_dump followed by cache_restore is a noop."
|
"cache_dump followed by cache_restore is a noop."
|
||||||
(with-valid-metadata (md)
|
(with-valid-metadata (md)
|
||||||
|
@ -180,6 +180,14 @@
|
|||||||
(assert-eof stdout)
|
(assert-eof stdout)
|
||||||
(assert-starts-with "Couldn't stat file" stderr)))))
|
(assert-starts-with "Couldn't stat file" stderr)))))
|
||||||
|
|
||||||
|
;;;-----------------------------------------------------------
|
||||||
|
;;; era_dump scenarios
|
||||||
|
;;;-----------------------------------------------------------
|
||||||
|
(define-scenario (era-dump small-input-file)
|
||||||
|
"Fails with small input file"
|
||||||
|
(with-temp-file-sized ((md "era.bin" 512))
|
||||||
|
(run-fail "era_dump" md)))
|
||||||
|
|
||||||
(define-scenario (era-dump restore-is-noop)
|
(define-scenario (era-dump restore-is-noop)
|
||||||
"era_dump followed by era_restore is a noop."
|
"era_dump followed by era_restore is a noop."
|
||||||
(with-valid-metadata (md)
|
(with-valid-metadata (md)
|
||||||
|
@ -187,6 +187,15 @@
|
|||||||
(receive (stdout _) (thin-restore "-i" xml "-o" md "--quiet")
|
(receive (stdout _) (thin-restore "-i" xml "-o" md "--quiet")
|
||||||
(assert-eof stdout)))))
|
(assert-eof stdout)))))
|
||||||
|
|
||||||
|
;;;-----------------------------------------------------------
|
||||||
|
;;; thin_dump scenarios
|
||||||
|
;;;-----------------------------------------------------------
|
||||||
|
|
||||||
|
(define-scenario (thin-dump small-input-file)
|
||||||
|
"Fails with small input file"
|
||||||
|
(with-temp-file-sized ((md "thin.bin" 512))
|
||||||
|
(run-fail "thin_dump" md)))
|
||||||
|
|
||||||
(define-scenario (thin-dump restore-is-noop)
|
(define-scenario (thin-dump restore-is-noop)
|
||||||
"thin_dump followed by thin_restore is a noop."
|
"thin_dump followed by thin_restore is a noop."
|
||||||
(with-valid-metadata (md)
|
(with-valid-metadata (md)
|
||||||
|
@ -42,7 +42,11 @@ namespace {
|
|||||||
|
|
||||||
transaction_manager::ptr
|
transaction_manager::ptr
|
||||||
open_tm(block_manager<>::ptr bm) {
|
open_tm(block_manager<>::ptr bm) {
|
||||||
space_map::ptr sm(new core_map(bm->get_nr_blocks()));
|
auto nr_blocks = bm->get_nr_blocks();
|
||||||
|
if (!nr_blocks)
|
||||||
|
throw runtime_error("Metadata is not large enough for superblock.");
|
||||||
|
|
||||||
|
space_map::ptr sm(new core_map(nr_blocks));
|
||||||
sm->inc(SUPERBLOCK_LOCATION);
|
sm->inc(SUPERBLOCK_LOCATION);
|
||||||
transaction_manager::ptr tm(new transaction_manager(bm, sm));
|
transaction_manager::ptr tm(new transaction_manager(bm, sm));
|
||||||
return tm;
|
return tm;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user