dcavalca / rpms / rpm

Forked from rpms/rpm a year ago
Clone
Florian Festi e91f7f
From 6dd62720fe84f7e2ad902c915b952fc0b29e3dcd Mon Sep 17 00:00:00 2001
Florian Festi e91f7f
From: Panu Matilainen <pmatilai@redhat.com>
Florian Festi e91f7f
Date: Tue, 15 Feb 2022 11:34:37 +0200
Florian Festi e91f7f
Subject: [PATCH] Swap over to dirfd+basename based operation within the fsm
Florian Festi e91f7f
Florian Festi e91f7f
Within fsm this is just a matter of adjusting error messages to include
Florian Festi e91f7f
the directory... if it only wasn't for the plugins requiring absolute
Florian Festi e91f7f
paths for outside users. For the plugins, we need to assemble absolute
Florian Festi e91f7f
paths as needed, both in ensureDir() and plugin file slots.
Florian Festi e91f7f
---
Florian Festi e91f7f
 lib/rpmplugins.c | 20 +++++++++++++++++---
Florian Festi e91f7f
 2 files changed, 36 insertions(+), 14 deletions(-)
Florian Festi e91f7f
Florian Festi e91f7f
diff --git a/lib/rpmplugins.c b/lib/rpmplugins.c
Florian Festi e91f7f
index 703368c0d..f06fd7895 100644
Florian Festi e91f7f
--- a/lib/rpmplugins.c
Florian Festi e91f7f
+++ b/lib/rpmplugins.c
Florian Festi e91f7f
@@ -350,21 +350,31 @@ rpmRC rpmpluginsCallScriptletPost(rpmPlugins plugins, const char *s_name, int ty
Florian Festi e91f7f
     return rc;
Florian Festi e91f7f
 }
Florian Festi e91f7f
 
Florian Festi e91f7f
+static char *abspath(rpmfi fi, const char *path)
Florian Festi e91f7f
+{
Florian Festi e91f7f
+    if (*path == '/')
Florian Festi e91f7f
+	return xstrdup(path);
Florian Festi e91f7f
+    else
Florian Festi e91f7f
+	return rstrscat(NULL, rpmfiDN(fi), path, NULL);
Florian Festi e91f7f
+}
Florian Festi e91f7f
+
Florian Festi e91f7f
 rpmRC rpmpluginsCallFsmFilePre(rpmPlugins plugins, rpmfi fi, const char *path,
Florian Festi e91f7f
 			       mode_t file_mode, rpmFsmOp op)
Florian Festi e91f7f
 {
Florian Festi e91f7f
     plugin_fsm_file_pre_func hookFunc;
Florian Festi e91f7f
     int i;
Florian Festi e91f7f
     rpmRC rc = RPMRC_OK;
Florian Festi e91f7f
+    char *apath = abspath(fi, path);
Florian Festi e91f7f
 
Florian Festi e91f7f
     for (i = 0; i < plugins->count; i++) {
Florian Festi e91f7f
 	rpmPlugin plugin = plugins->plugins[i];
Florian Festi e91f7f
 	RPMPLUGINS_SET_HOOK_FUNC(fsm_file_pre);
Florian Festi e91f7f
-	if (hookFunc && hookFunc(plugin, fi, path, file_mode, op) == RPMRC_FAIL) {
Florian Festi e91f7f
+	if (hookFunc && hookFunc(plugin, fi, apath, file_mode, op) == RPMRC_FAIL) {
Florian Festi e91f7f
 	    rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_file_pre failed\n", plugin->name);
Florian Festi e91f7f
 	    rc = RPMRC_FAIL;
Florian Festi e91f7f
 	}
Florian Festi e91f7f
     }
Florian Festi e91f7f
+    free(apath);
Florian Festi e91f7f
 
Florian Festi e91f7f
     return rc;
Florian Festi e91f7f
 }
Florian Festi e91f7f
@@ -375,14 +385,16 @@ rpmRC rpmpluginsCallFsmFilePost(rpmPlugins plugins, rpmfi fi, const char *path,
Florian Festi e91f7f
     plugin_fsm_file_post_func hookFunc;
Florian Festi e91f7f
     int i;
Florian Festi e91f7f
     rpmRC rc = RPMRC_OK;
Florian Festi e91f7f
+    char *apath = abspath(fi, path);
Florian Festi e91f7f
 
Florian Festi e91f7f
     for (i = 0; i < plugins->count; i++) {
Florian Festi e91f7f
 	rpmPlugin plugin = plugins->plugins[i];
Florian Festi e91f7f
 	RPMPLUGINS_SET_HOOK_FUNC(fsm_file_post);
Florian Festi e91f7f
-	if (hookFunc && hookFunc(plugin, fi, path, file_mode, op, res) == RPMRC_FAIL) {
Florian Festi e91f7f
+	if (hookFunc && hookFunc(plugin, fi, apath, file_mode, op, res) == RPMRC_FAIL) {
Florian Festi e91f7f
 	    rpmlog(RPMLOG_WARNING, "Plugin %s: hook fsm_file_post failed\n", plugin->name);
Florian Festi e91f7f
 	}
Florian Festi e91f7f
     }
Florian Festi e91f7f
+    free(apath);
Florian Festi e91f7f
 
Florian Festi e91f7f
     return rc;
Florian Festi e91f7f
 }
Florian Festi e91f7f
@@ -394,15 +406,17 @@ rpmRC rpmpluginsCallFsmFilePrepare(rpmPlugins plugins, rpmfi fi,
Florian Festi e91f7f
     plugin_fsm_file_prepare_func hookFunc;
Florian Festi e91f7f
     int i;
Florian Festi e91f7f
     rpmRC rc = RPMRC_OK;
Florian Festi e91f7f
+    char *apath = abspath(fi, path);
Florian Festi e91f7f
 
Florian Festi e91f7f
     for (i = 0; i < plugins->count; i++) {
Florian Festi e91f7f
 	rpmPlugin plugin = plugins->plugins[i];
Florian Festi e91f7f
 	RPMPLUGINS_SET_HOOK_FUNC(fsm_file_prepare);
Florian Festi e91f7f
-	if (hookFunc && hookFunc(plugin, fi, fd, path, dest, file_mode, op) == RPMRC_FAIL) {
Florian Festi e91f7f
+	if (hookFunc && hookFunc(plugin, fi, fd, apath, dest, file_mode, op) == RPMRC_FAIL) {
Florian Festi e91f7f
 	    rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_file_prepare failed\n", plugin->name);
Florian Festi e91f7f
 	    rc = RPMRC_FAIL;
Florian Festi e91f7f
 	}
Florian Festi e91f7f
     }
Florian Festi e91f7f
+    free(apath);
Florian Festi e91f7f
 
Florian Festi e91f7f
     return rc;
Florian Festi e91f7f
 }
Florian Festi e91f7f
-- 
Florian Festi e91f7f
2.41.0
Florian Festi e91f7f