mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 13:09:33 -06:00
detect and report an attempt to load non .ngf file in readNGF
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user