diff options
author | Timo Teräs <timo.teras@iki.fi> | 2014-10-13 13:21:13 +0300 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2014-10-13 13:33:19 +0300 |
commit | bb1ac2557deb006fd2d6c1554cee329b5f0e44ba (patch) | |
tree | b67debac9e335cb4512e5969e0eb1e0722ee456d /src/database.c | |
parent | 82713dc389c8c4e69d11dcd421d2f827bd0e6306 (diff) | |
download | apk-tools-bb1ac2557deb006fd2d6c1554cee329b5f0e44ba.tar.gz apk-tools-bb1ac2557deb006fd2d6c1554cee329b5f0e44ba.tar.bz2 apk-tools-bb1ac2557deb006fd2d6c1554cee329b5f0e44ba.tar.xz apk-tools-bb1ac2557deb006fd2d6c1554cee329b5f0e44ba.zip |
db: improve and unify fdb error messages
Diffstat (limited to 'src/database.c')
-rw-r--r-- | src/database.c | 40 |
1 files changed, 13 insertions, 27 deletions
diff --git a/src/database.c b/src/database.c index 89f944c..f511125 100644 --- a/src/database.c +++ b/src/database.c @@ -743,9 +743,11 @@ int apk_db_index_read(struct apk_database *db, struct apk_bstream *bs, int repo) mode_t mode; uid_t uid; gid_t gid; - int field, r; + int field, r, lineno = 0; while (!APK_BLOB_IS_NULL(l = bs->read(bs, token))) { + lineno++; + if (l.len < 2 || l.ptr[1] != ':') { if (pkg == NULL) continue; @@ -783,9 +785,8 @@ int apk_db_index_read(struct apk_database *db, struct apk_bstream *bs, int repo) /* Standard index line? */ r = apk_pkg_add_info(db, pkg, field, l); - if (r == 0) { + if (r == 0) continue; - } if (r == 1 && repo == -1 && ipkg == NULL) { /* Instert to installed database; this needs to * happen after package name has been read, but @@ -799,23 +800,14 @@ int apk_db_index_read(struct apk_database *db, struct apk_bstream *bs, int repo) /* Check FDB special entries */ switch (field) { case 'F': - if (pkg->name == NULL) { - apk_error("FDB directory entry before package entry"); - return -1; - } + if (pkg->name == NULL) goto bad_entry; diri = apk_db_diri_new(db, pkg, l, &diri_node); file_diri_node = &diri->owned_files.first; break; case 'a': - if (file == NULL) { - apk_error("FDB file attribute metadata entry before file entry"); - return -1; - } + if (file == NULL) goto bad_entry; case 'M': - if (diri == NULL) { - apk_error("FDB directory metadata entry before directory entry"); - return -1; - } + if (diri == NULL) goto bad_entry; uid = apk_blob_pull_uint(&l, 10); apk_blob_pull_char(&l, ':'); gid = apk_blob_pull_uint(&l, 10); @@ -827,17 +819,11 @@ int apk_db_index_read(struct apk_database *db, struct apk_bstream *bs, int repo) apk_db_file_set(file, mode, uid, gid); break; case 'R': - if (diri == NULL) { - apk_error("FDB file entry before directory entry"); - return -1; - } + if (diri == NULL) goto bad_entry; file = apk_db_file_get(db, diri, l, &file_diri_node); break; case 'Z': - if (file == NULL) { - apk_error("FDB checksum entry before file entry"); - return -1; - } + if (file == NULL) goto bad_entry; apk_blob_pull_csum(&l, &file->csum); break; case 'r': @@ -868,16 +854,16 @@ int apk_db_index_read(struct apk_database *db, struct apk_bstream *bs, int repo) pkg->filename = NULL; continue; } - if (APK_BLOB_IS_NULL(l)) { - apk_error("FDB format error in entry '%c'", field); - return -1; - } + if (APK_BLOB_IS_NULL(l)) goto bad_entry; } return 0; old_apk_tools: /* Installed db should not have unsupported fields */ apk_error("This apk-tools is too old to handle installed packages"); return -1; +bad_entry: + apk_error("FDB format error (line %d, entry '%c')", lineno, field); + return -1; } static int apk_db_write_fdb(struct apk_database *db, struct apk_ostream *os) |