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) #define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL)
static char slovo[5] = {'S','L','O','V','O'};
struct PGF_INTERNAL_DECL malloc_state 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. */ /* Set if the fastbin chunks contain recently inserted free blocks. */
bool have_fastchunks; bool have_fastchunks;
/* Fastbins */ /* Fastbins */
@@ -320,6 +328,9 @@ PgfDB::PgfDB(const char* filepath, int flags, int mode) {
if (is_new) { if (is_new) {
init_state(file_size); init_state(file_size);
} else { } 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 // We must make sure that left-over transient revisions are
// released. This may happen if a client process was killed // released. This may happen if a client process was killed
// or if the garbadge collector has not managed to run // or if the garbadge collector has not managed to run
@@ -366,6 +377,8 @@ void PgfDB::set_revision(ref<PgfPGF> pgf)
PGF_INTERNAL PGF_INTERNAL
void PgfDB::init_state(size_t size) void PgfDB::init_state(size_t size)
{ {
memcpy(ms->sign, slovo, sizeof(ms->sign));
/* Init fastbins */ /* Init fastbins */
ms->have_fastchunks = false; ms->have_fastchunks = false;
for (int i = 0; i < NFASTBINS; ++i) { for (int i = 0; i < NFASTBINS; ++i) {

View File

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