]> git.ipfire.org Git - pakfire.git/commitdiff
jail: Directly pass the context
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Jun 2025 13:32:13 +0000 (13:32 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Jun 2025 13:32:13 +0000 (13:32 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/archive.c
src/pakfire/build.c
src/pakfire/jail.c
src/pakfire/jail.h
src/pakfire/parser.c
src/pakfire/scriptlet.c
src/pakfire/transaction.c
src/python/root.c
tests/libpakfire/cgroup.c
tests/libpakfire/jail.c

index f328a685de2d514cc190b3b5211f0c03c456e58c..33609410a7c7076c005411c444640fbd4aafbd2d 100644 (file)
@@ -1959,7 +1959,7 @@ static int pakfire_archive_handle_systemd_sysusers(pakfire_archive* archive,
        };
 
        // Create a new jail
-       r = pakfire_jail_create(&jail, archive->root);
+       r = pakfire_jail_create(&jail, archive->ctx, archive->root);
        if (r)
                goto ERROR;
 
index dd9bc246487a4d7728909b5d980428a559ab420c..4f026416c4a4437200c2d2e893022f79fe85cfcb 100644 (file)
@@ -1903,7 +1903,7 @@ static int pakfire_build_setup_jail(pakfire_build* build) {
        int r;
 
        // Create a new jail
-       r = pakfire_jail_create(&build->jail, build->root);
+       r = pakfire_jail_create(&build->jail, build->ctx, build->root);
        if (r) {
                ERROR(build->ctx, "Could not create jail for build %s: %m\n", build->_id);
                return r;
index d9f211c1d102538707985acde1fe9181e8adfc9a..328d8bc20799307c31cc101c1822d22aa5e7be00 100644 (file)
@@ -203,7 +203,7 @@ static const char* pakfire_jail_uuid(pakfire_jail* jail) {
        return jail->__uuid;
 }
 
-int pakfire_jail_create(pakfire_jail** jail, pakfire_root* root) {
+int pakfire_jail_create(pakfire_jail** jail, pakfire_ctx* ctx, pakfire_root* root) {
        pakfire_jail* self = NULL;
        int r;
 
@@ -213,7 +213,7 @@ int pakfire_jail_create(pakfire_jail** jail, pakfire_root* root) {
                return -errno;
 
        // Reference context
-       self->ctx = pakfire_root_get_ctx(root);
+       self->ctx = pakfire_ctx_ref(ctx);
 
        // Reference to the root
        self->root = pakfire_root_ref(root);
@@ -2163,13 +2163,13 @@ ERROR:
        A convenience function that creates a new jail, runs the given command and destroys
        the jail again.
 */
-int pakfire_jail_run(pakfire_root* root, const char* argv[], pakfire_env* env,
+int pakfire_jail_run(pakfire_ctx* ctx, pakfire_root* root, const char* argv[], pakfire_env* env,
                int flags, char** output, size_t* output_length) {
        pakfire_jail* jail = NULL;
        int r;
 
        // Create a new jail
-       r = pakfire_jail_create(&jail, root);
+       r = pakfire_jail_create(&jail, ctx, root);
        if (r)
                goto ERROR;
 
@@ -2183,13 +2183,13 @@ ERROR:
        return r;
 }
 
-int pakfire_jail_run_script(pakfire_root* root, const char* script, const size_t length,
+int pakfire_jail_run_script(pakfire_ctx* ctx, pakfire_root* root, const char* script, const size_t length,
                const char* argv[], pakfire_env* env, int flags) {
        pakfire_jail* jail = NULL;
        int r;
 
        // Create a new jail
-       r = pakfire_jail_create(&jail, root);
+       r = pakfire_jail_create(&jail, ctx, root);
        if (r)
                goto ERROR;
 
@@ -2254,50 +2254,41 @@ ERROR:
        return r;
 }
 
-static int pakfire_jail_run_if_possible(pakfire_root* root, const char** argv) {
+static int pakfire_jail_run_if_possible(pakfire_ctx* ctx, pakfire_root* root, const char** argv) {
        char path[PATH_MAX];
        int r;
 
-       // Fetch the context
-       pakfire_ctx* ctx = pakfire_root_get_ctx(root);
-
        r = pakfire_root_path(root, path, "%s", *argv);
-       if (r)
-               goto ERROR;
+       if (r < 0)
+               return r;
 
        // Check if the file is executable
        r = access(path, X_OK);
        if (r) {
                DEBUG(ctx, "%s is not executable. Skipping...\n", *argv);
-               goto ERROR;
+               return r;
        }
 
-       r = pakfire_jail_run(root, argv, NULL, 0, NULL, NULL);
-
-ERROR:
-       if (ctx)
-               pakfire_ctx_unref(ctx);
-
-       return r;
+       return pakfire_jail_run(ctx, root, argv, NULL, 0, NULL, NULL);
 }
 
-int pakfire_jail_ldconfig(pakfire_root* root) {
+int pakfire_jail_ldconfig(pakfire_ctx* ctx, pakfire_root* root) {
        const char* argv[] = {
                "/sbin/ldconfig",
                NULL,
        };
 
-       return pakfire_jail_run_if_possible(root, argv);
+       return pakfire_jail_run_if_possible(ctx, root, argv);
 }
 
-int pakfire_jail_run_systemd_tmpfiles(pakfire_root* root) {
+int pakfire_jail_run_systemd_tmpfiles(pakfire_ctx* ctx, pakfire_root* root) {
        const char* argv[] = {
                "/usr/bin/systemd-tmpfiles",
                "--create",
                NULL,
        };
 
-       return pakfire_jail_run_if_possible(root, argv);
+       return pakfire_jail_run_if_possible(ctx, root, argv);
 }
 
 ssize_t pakfire_jail_send_buffer(pakfire_ctx* ctx,
index db4cadbbe6305bdcb85eeb6396e8bfdc5f1b18c0..7c99909eaab9dacaf14dec9e4ad26dcebf5a6f2f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <pakfire/buffer.h>
 #include <pakfire/cgroup.h>
+#include <pakfire/ctx.h>
 #include <pakfire/env.h>
 #include <pakfire/root.h>
 
@@ -40,7 +41,7 @@ enum pakfire_jail_output_stream {
 typedef int (*pakfire_jail_output_callback)(pakfire_ctx* ctx, void* data,
        const enum pakfire_jail_output_stream stream, const char* line, size_t length);
 
-int pakfire_jail_create(pakfire_jail** jail, pakfire_root* root);
+int pakfire_jail_create(pakfire_jail** jail, pakfire_ctx* ctx, pakfire_root* root);
 
 pakfire_jail* pakfire_jail_ref(pakfire_jail* jail);
 pakfire_jail* pakfire_jail_unref(pakfire_jail* jail);
@@ -82,9 +83,9 @@ int pakfire_jail_communicate(
        pakfire_jail_output_callback output_callback, void* output_data);
 
 // Convenience functions
-int pakfire_jail_run(pakfire_root* root,
+int pakfire_jail_run(pakfire_ctx* ctx, pakfire_root* root,
        const char* argv[], pakfire_env* env, int flags, char** output, size_t* output_length);
-int pakfire_jail_run_script(pakfire_root* root,
+int pakfire_jail_run_script(pakfire_ctx* ctx, pakfire_root* root,
        const char* script, const size_t length, const char* argv[], pakfire_env* env, int flags);
 
 int pakfire_jail_execute_script(pakfire_jail* jail,
@@ -93,8 +94,8 @@ int pakfire_jail_execute_script(pakfire_jail* jail,
        pakfire_jail_output_callback output_callback, void* output_data);
 
 int pakfire_jail_shell(pakfire_jail* jail, pakfire_env* env);
-int pakfire_jail_ldconfig(pakfire_root* root);
-int pakfire_jail_run_systemd_tmpfiles(pakfire_root* root);
+int pakfire_jail_ldconfig(pakfire_ctx* ctx, pakfire_root* root);
+int pakfire_jail_run_systemd_tmpfiles(pakfire_ctx* ctx, pakfire_root* root);
 
 // Streaming functions
 struct pakfire_input_buffer {
index 44be951b1d4f3da3f293db1f9e6d2ad8cc9ba331..29a040fd1865e994415e6f90a425314d9372973c 100644 (file)
@@ -540,7 +540,7 @@ static int pakfire_parser_expand_commands(pakfire_parser* parser, char** buffer)
                size_t length = 0;
 
                // Execute the command inside the Pakfire environment
-               r = pakfire_jail_run(parser->root, argv, NULL, 0, &output, &length);
+               r = pakfire_jail_run(parser->ctx, parser->root, argv, NULL, 0, &output, &length);
                if (r) {
                        // Just log this and continue
                        DEBUG(parser->ctx, "Command '%s' failed with return code %d\n", command, r);
index 15d74bb2a3bcc95914a8242724bce466fc464dd4..05a4cd4229478ba5b5fda6dc6964a68bec03367a 100644 (file)
@@ -181,7 +181,8 @@ static int pakfire_scriptlet_is_shell_script(pakfire_scriptlet* scriptlet) {
 int pakfire_scriptlet_execute(pakfire_scriptlet* scriptlet, pakfire_root* root) {
        // Detect what kind of script this is and run it
        if (pakfire_scriptlet_is_shell_script(scriptlet))
-               return pakfire_jail_run_script(root, scriptlet->data, scriptlet->size, NULL, NULL, 0);
+               return pakfire_jail_run_script(scriptlet->ctx, root,
+                       scriptlet->data, scriptlet->size, NULL, NULL, 0);
 
        ERROR(scriptlet->ctx, "Scriptlet is of an unknown kind\n");
        return -ENOTSUP;
index 71ace00d3845540d32baf5565a1bb4cfecf83188..5492b25299831fc631da3f7efd1558ee403461c8 100644 (file)
@@ -1349,7 +1349,7 @@ static int pakfire_transaction_extract(pakfire_transaction* transaction,
 
        // Update the runtime linker cache
        if (pakfire_filelist_contains(filelist, "*/lib*.so.?"))
-               pakfire_jail_ldconfig(transaction->root);
+               pakfire_jail_ldconfig(transaction->ctx, transaction->root);
 
        if (filelist)
                pakfire_filelist_unref(filelist);
@@ -1384,7 +1384,7 @@ static int pakfire_transaction_erase(pakfire_transaction* transaction,
                goto ERROR;
 
        // Update the runtime linker cache after all files have been removed
-       pakfire_jail_ldconfig(transaction->root);
+       pakfire_jail_ldconfig(transaction->ctx, transaction->root);
 
 ERROR:
        pakfire_progress_pop_status(transaction->progress);
@@ -1480,7 +1480,7 @@ static int pakfire_transaction_apply_systemd_tmpfiles(
                pakfire_transaction* transaction, pakfire_package* pkg) {
        // Apply any tmpfiles (ignore any errors)
        if (pakfire_package_matches_dep(pkg, PAKFIRE_PKG_REQUIRES, "pakfire(systemd-tmpfiles)"))
-               pakfire_jail_run_systemd_tmpfiles(transaction->root);
+               pakfire_jail_run_systemd_tmpfiles(transaction->ctx, transaction->root);
 
        return 0;
 }
index 21290a177de0c5543ea685316d976015c1873e7d..7074bc1a75abcfcfc3041aa7a3669d1dc74c8e68 100644 (file)
@@ -682,7 +682,7 @@ static PyObject* Root_execute(RootObject* self, PyObject* args, PyObject* kwargs
                input_callback = pakfire_jail_send_buffer;
 
        // Create a new jail
-       r = pakfire_jail_create(&jail, self->root);
+       r = pakfire_jail_create(&jail, self->ctx->ctx, self->root);
        if (r < 0) {
                errno = -r;
                PyErr_SetFromErrno(PyExc_OSError);
index 156543a10e16ccc643acfdb49deed3f682a78cf2..b4f8d12fc36ec864287de083536fe23748ac0464 100644 (file)
@@ -117,7 +117,7 @@ static int test_stats(const struct test* t) {
        ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Connect jail to the cgroup
        ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
index 77218b7f726fd255f5d7c72e457e29f80f84f1b2..0098790f10f1688faa1eb767773734c4a7607b7a 100644 (file)
@@ -45,7 +45,7 @@ static int test_create(const struct test* t) {
        pakfire_jail* jail = NULL;
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Destroy it
        ASSERT_NULL(pakfire_jail_unref(jail));
@@ -65,7 +65,7 @@ static int test_exit_code(const struct test* t) {
        };
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Check if we receive the correct exit code
        ASSERT_EQUALS(pakfire_jail_execute_command(jail, argv, NULL, 0), 123);
@@ -89,7 +89,7 @@ static int test_segv(const struct test* t) {
        };
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Check if we receive the correct exit code
        ASSERT(pakfire_jail_execute_command(jail, argv, NULL, 0) == 139);
@@ -111,7 +111,7 @@ static int test_exec(const struct test* t) {
        size_t length = 0;
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Try to execute something
        ASSERT_SUCCESS(pakfire_jail_execute_capture_output(jail, cmd_hello_world, NULL, 0, &output, &length));
@@ -142,7 +142,7 @@ static int test_launch_into_cgroup(const struct test* t) {
        ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Connect jail to the cgroup
        ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
@@ -174,7 +174,7 @@ static int test_nice(const struct test* t) {
        };
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Set invalid nice levels
        ASSERT_ERROR(pakfire_jail_nice(jail,  100), EINVAL);
@@ -209,7 +209,7 @@ static int test_memory_limit(const struct test* t) {
        ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
 
        // Create jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Connect jail to the cgroup
        ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
@@ -246,7 +246,7 @@ static int test_pid_limit(const struct test* t) {
        ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
 
        // Create jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Connect jail to the cgroup
        ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
@@ -276,7 +276,7 @@ static int test_file_ownership(const struct test* t) {
        char* output = NULL;
 
        // Execute a simple command
-       ASSERT_SUCCESS(pakfire_jail_run(t->root, cmd_stat_ownership, NULL, 0, &output, NULL));
+       ASSERT_SUCCESS(pakfire_jail_run(t->ctx, t->root, cmd_stat_ownership, NULL, 0, &output, NULL));
 
        // Check if the file has been mapped to root/root
        ASSERT_STRING_EQUALS(output, "uid=0 gid=0\n");
@@ -303,7 +303,7 @@ static int test_bind(const struct test* t) {
        };
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Bind-mount nonsense
        ASSERT_ERROR(pakfire_jail_bind(jail, NULL, target, 0), EINVAL);
@@ -365,7 +365,7 @@ static int test_communicate(const struct test* t) {
        };
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Check if the mount actually works
        ASSERT_SUCCESS(pakfire_jail_communicate(jail, argv, NULL, 0,
@@ -396,7 +396,7 @@ static int test_send_signal(const struct test* t) {
        int r = EXIT_FAILURE;
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Sending SIGTERM to ourselves
        ASSERT(test_send_one_signal(t, jail, "15") == 0);
@@ -426,7 +426,7 @@ static int test_timeout(const struct test* t) {
        };
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Set a timeout of one second
        ASSERT_SUCCESS(pakfire_jail_set_timeout(jail, 1));
@@ -460,7 +460,7 @@ static int test_callback(const struct test* t) {
        int i = 123;
 
        // Create a new jail
-       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
 
        // Check if we receive the correct exit code
        ASSERT(pakfire_jail_execute(jail, __callback, &i, 0) == 123);