summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teras <timo.teras@iki.fi>2009-07-21 14:06:35 +0300
committerTimo Teras <timo.teras@iki.fi>2009-07-21 14:06:35 +0300
commit1339b14365b8b791d60d58b3e055c0349205ae25 (patch)
tree212baf84d6e92c8a5243f611612c455fa70d5c2e
parent84e3786e05bb8cda52548b8d98efe87f2a1b64ac (diff)
downloadapk-tools-1339b14365b8b791d60d58b3e055c0349205ae25.tar.bz2
apk-tools-1339b14365b8b791d60d58b3e055c0349205ae25.tar.xz
db: don't run pre-install until control data is verified
to make sure the scripts have not been altered.
-rw-r--r--src/database.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/database.c b/src/database.c
index 65f8633..7c89dd3 100644
--- a/src/database.c
+++ b/src/database.c
@@ -37,6 +37,7 @@ struct install_ctx {
struct apk_package *pkg;
int script;
+ int script_pending : 1;
struct apk_db_dir_instance *diri;
struct apk_checksum data_csum;
struct apk_sign_ctx sctx;
@@ -1233,6 +1234,24 @@ static void extract_cb(void *_ctx, size_t progress)
}
}
+static int apk_db_run_pending_script(struct install_ctx *ctx)
+{
+ int r;
+
+ if (!ctx->script_pending)
+ return 0;
+ if (!ctx->sctx.control_verified)
+ return 0;
+
+ ctx->script_pending = FALSE;
+ r = apk_pkg_run_script(ctx->pkg, ctx->db->root_fd, ctx->script);
+ if (r != 0)
+ apk_error("%s-%s: Failed to execute "
+ "pre-install/upgrade script",
+ ctx->pkg->name->name, ctx->pkg->version);
+ return r;
+}
+
static int apk_db_install_archive_entry(void *_ctx,
const struct apk_file_info *ae,
struct apk_istream *is)
@@ -1275,16 +1294,15 @@ static int apk_db_install_archive_entry(void *_ctx,
/* Handle script */
if (type != APK_SCRIPT_INVALID) {
apk_pkg_add_script(pkg, is, type, ae->size);
+ if (type == ctx->script)
+ ctx->script_pending = TRUE;
+ return apk_db_run_pending_script(ctx);
+ }
- if (type == ctx->script) {
- r = apk_pkg_run_script(pkg, db->root_fd, ctx->script);
- if (r != 0)
- apk_error("%s-%s: Failed to execute pre-install/upgrade script",
- pkg->name->name, pkg->version);
- }
-
+ r = apk_db_run_pending_script(ctx);
+ if (r != 0)
return r;
- }
+
/* Show progress */
if (ctx->cb) {
@@ -1501,6 +1519,9 @@ static int apk_db_unpack_pkg(struct apk_database *db,
newpkg->name->name, newpkg->version);
return -1;
}
+ r = apk_db_run_pending_script(&ctx);
+ if (r != 0)
+ return r;
if (need_copy) {
char file2[256];