detect and report an attempt to load non .ngf file in readNGF

This commit is contained in:
krangelov
2021-09-12 08:11:10 +02:00
parent 375452063f
commit a7f00a4e84
2 changed files with 19 additions and 8 deletions

View File

@@ -250,8 +250,16 @@ typedef struct mchunk mbin;
*/
#define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL)
static char slovo[5] = {'S','L','O','V','O'};
struct PGF_INTERNAL_DECL malloc_state
{
/* Each .ngf file starts with 'SLOVO' as in:
* "V načaloto be slovoto" (In the beginning was the word)
* In this way we detect an attempt to read a non .ngf file.
*/
char sign[5];
/* Set if the fastbin chunks contain recently inserted free blocks. */
bool have_fastchunks;
/* Fastbins */
@@ -320,6 +328,9 @@ PgfDB::PgfDB(const char* filepath, int flags, int mode) {
if (is_new) {
init_state(file_size);
} else {
if (strncmp(ms->sign, slovo, sizeof(ms->sign)) != 0)
throw pgf_error("Invalid file content");
// We must make sure that left-over transient revisions are
// released. This may happen if a client process was killed
// or if the garbadge collector has not managed to run
@@ -366,6 +377,8 @@ void PgfDB::set_revision(ref<PgfPGF> pgf)
PGF_INTERNAL
void PgfDB::init_state(size_t size)
{
memcpy(ms->sign, slovo, sizeof(ms->sign));
/* Init fastbins */
ms->have_fastchunks = false;
for (int i = 0; i < NFASTBINS; ++i) {

View File

@@ -79,29 +79,27 @@ main = do
rp1 <- testLoadFailure (readPGF "non-existing.pgf")
rp2 <- testLoadFailure (readPGF "tests/basic.gf")
-- rp3 <- testLoadFailure (readPGF "tests/basic.ngf")
rp3 <- testLoadFailure (readPGF "tests/basic.ngf")
bn1 <- testLoadFailure (bootNGF "non-existing.pgf" "non-existing.ngf")
bn2 <- testLoadFailure (bootNGF "tests/basic.gf" "tests/basic.ngf")
bn3 <- testLoadFailure (bootNGF "tests/basic.ngf" "tests/basic.pgf")
-- rn1 <- testLoadFailure (readNGF "non-existing.ngf")
-- rn2 <- testLoadFailure (readNGF "tests/basic.gf")
-- rn3 <- testLoadFailure (readNGF "tests/basic.pgf")
rn2 <- testLoadFailure (readNGF "tests/basic.gf")
rn3 <- testLoadFailure (readNGF "tests/basic.pgf")
runTestTTAndExit $
TestList $
[TestCase (assertBool "missing file" rp1)
,TestCase (assertBool "wrong file format (GF)" rp2)
-- ,TestCase (assertBool "wrong file format (NGF)" rp3)
,TestCase (assertBool "wrong file format (NGF)" rp3)
,TestCase (assertBool "missing file" bn1)
,TestCase (assertBool "wrong file format (GF)" bn2)
,TestCase (assertBool "wrong file format (NGF)" bn3)
-- ,TestCase (assertBool "missing file" rn1)
-- ,TestCase (assertBool "wrong file format (GF)" rn2)
-- ,TestCase (assertBool "wrong file format (PGF)" rn3)
,TestCase (assertBool "wrong file format (GF)" rn2)
,TestCase (assertBool "wrong file format (PGF)" rn3)
]
++ grammarTests gr1
++ grammarTests gr2