From 8c68edba1ffd7541017028f3415bc2ec713f5c1f Mon Sep 17 00:00:00 2001 From: brianb Date: Sat, 10 Jan 2004 21:46:14 +0000 Subject: [PATCH] Basic checks on file to ensure it's an mdb database. bug # 587739 --- src/extras/mdb-dump.c | 4 ++-- src/libmdb/catalog.c | 2 ++ src/libmdb/file.c | 11 +++++++++-- src/libmdb/table.c | 2 ++ src/util/mdb-export.c | 5 ++++- src/util/mdb-schema.c | 8 +++++--- src/util/mdb-tables.c | 5 ++++- 7 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/extras/mdb-dump.c b/src/extras/mdb-dump.c index 9554d27..0f6fdbc 100644 --- a/src/extras/mdb-dump.c +++ b/src/extras/mdb-dump.c @@ -58,8 +58,8 @@ int main(int argc, char **argv) } fseek(in,(pg*pg_size),SEEK_SET); i = 0; - while (length = fread(data,1,16,in)) { - sprintf(addr, "%06x", i); + while ((length = fread(data,1,16,in))) { + sprintf(addr, "%06lx", i); //if (!strcmp(&addr[3],"000") || (!jet4 && !strcmp(&addr[3],"800")) && //pg) break; if (!strcmp(&addr[3],"000") || (!jet4 && !strcmp(&addr[3],"800"))) { diff --git a/src/libmdb/catalog.c b/src/libmdb/catalog.c index 878719e..fd505c4 100644 --- a/src/libmdb/catalog.c +++ b/src/libmdb/catalog.c @@ -71,6 +71,8 @@ int type; /* mdb_table_dump(&msysobj); */ table = mdb_read_table(&msysobj); + if (!table) return NULL; + mdb_read_columns(table); mdb_bind_column(table, 1, parentid); diff --git a/src/libmdb/file.c b/src/libmdb/file.c index 723a34f..1ebc097 100644 --- a/src/libmdb/file.c +++ b/src/libmdb/file.c @@ -106,18 +106,25 @@ MdbFile *f; fprintf(stderr,"Couldn't open file %s\n",f->filename); return NULL; } - f->refs++; if (!mdb_read_pg(mdb, 0)) { fprintf(stderr,"Couldn't read first page.\n"); return NULL; } + if (mdb->pg_buf[0] != 0) { + close(f->fd); + return NULL; + } f->jet_version = mdb_pg_get_int32(mdb, 0x14); if (IS_JET4(mdb)) { mdb->fmt = &MdbJet4Constants; - } else { + } else if (IS_JET3(mdb)) { mdb->fmt = &MdbJet3Constants; + } else { + fprintf(stderr,"Unknown Jet version.\n"); + return NULL; } + f->refs++; return mdb; } MdbHandle *mdb_open(char *filename) diff --git a/src/libmdb/table.c b/src/libmdb/table.c index 489e153..5b9f49d 100644 --- a/src/libmdb/table.c +++ b/src/libmdb/table.c @@ -55,6 +55,8 @@ int rownum, row_start, row_end; table = mdb_alloc_tabledef(entry); mdb_read_pg(mdb, entry->table_pg); + if (mdb->pg_buf[0] != 0x02) return NULL; /* not a valid table def page */ + len = mdb_pg_get_int16(mdb,8); table->num_rows = mdb_pg_get_int32(mdb, fmt->tab_num_rows_offset); diff --git a/src/util/mdb-export.c b/src/util/mdb-export.c index c5e808b..d574d39 100644 --- a/src/util/mdb-export.c +++ b/src/util/mdb-export.c @@ -97,7 +97,10 @@ main(int argc, char **argv) exit(1); } - mdb_read_catalog(mdb, MDB_TABLE); + if (!mdb_read_catalog (mdb, MDB_TABLE)) { + fprintf(stderr,"File does not appear to be an Access database\n"); + exit(1); + } for (i=0;inum_catalog;i++) { entry = g_ptr_array_index(mdb->catalog,i); diff --git a/src/util/mdb-schema.c b/src/util/mdb-schema.c index 270b52d..b431931 100644 --- a/src/util/mdb-schema.c +++ b/src/util/mdb-schema.c @@ -74,9 +74,11 @@ main (int argc, char **argv) } } - /* read the catalog */ - - mdb_read_catalog (mdb, MDB_TABLE); + /* read the catalog */ + if (!mdb_read_catalog (mdb, MDB_TABLE)) { + fprintf(stderr,"File does not appear to be an Access database\n"); + exit(1); + } /* loop over each entry in the catalog */ diff --git a/src/util/mdb-tables.c b/src/util/mdb-tables.c index 3a3339d..08567d8 100644 --- a/src/util/mdb-tables.c +++ b/src/util/mdb-tables.c @@ -65,7 +65,10 @@ int opt; /* read the catalog */ - mdb_read_catalog (mdb, MDB_TABLE); + if (!mdb_read_catalog (mdb, MDB_TABLE)) { + fprintf(stderr,"File does not appear to be an Access database\n"); + exit(1); + } /* loop over each entry in the catalog */ for (i=0; i < mdb->num_catalog; i++) {