diff --git a/lib/pstore.rb b/lib/pstore.rb index 8569b45..be9d6a1 100644 --- a/lib/pstore.rb +++ b/lib/pstore.rb @@ -651,6 +651,7 @@ def load_data(file, read_only) table = load(file) raise Error, "PStore file seems to be corrupted." unless table.is_a?(Hash) rescue EOFError + raise unless file.size == 0 # This seems to be a newly-created file. table = {} end diff --git a/test/test_pstore.rb b/test/test_pstore.rb index c302d2b..3159b2f 100644 --- a/test/test_pstore.rb +++ b/test/test_pstore.rb @@ -190,6 +190,15 @@ def clear_store def second_file File.join(Dir.tmpdir, "pstore.tmp2.#{Process.pid}") end + + def test_truncated_read_only_store_is_not_empty + @pstore.transaction { @pstore[:foo] = "bar" } + data = File.binread(@pstore_file) + File.binwrite(@pstore_file, data.byteslice(0, data.bytesize - 1)) + + assert_raise(EOFError) { @pstore.transaction(true) { @pstore[:foo] } } + end + def test_store_operations_require_transaction_owner ready = Thread::Queue.new release = Thread::Queue.new