From: Michael Tremer Date: Tue, 6 Dec 2022 16:07:10 +0000 (+0000) Subject: jail: Refactor pakfire_jail_exec_script X-Git-Tag: 0.9.28~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=35291cb72bc57daa85e340089dab42e4244140cf;p=pakfire.git jail: Refactor pakfire_jail_exec_script Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/jail.c b/src/libpakfire/jail.c index 9ec387d39..ba9a10059 100644 --- a/src/libpakfire/jail.c +++ b/src/libpakfire/jail.c @@ -1577,48 +1577,41 @@ PAKFIRE_EXPORT int pakfire_jail_exec_script(struct pakfire_jail* jail, const char* script, const size_t size, const char* args[], char** output) { char path[PATH_MAX]; const char** argv = NULL; + FILE* f = NULL; int r; const char* root = pakfire_get_path(jail->pakfire); // Write the scriptlet to disk - r = pakfire_path_join(path, root, "pakfire-script.XXXXXX"); + r = pakfire_path_join(path, root, PAKFIRE_TMP_DIR "/pakfire-script.XXXXXX"); if (r) goto ERROR; - // Open a temporary file - int fd = mkstemp(path); - if (fd < 0) { - ERROR(jail->pakfire, "Could not open a temporary file: %m\n"); - r = 1; + // Create a temporary file + f = pakfire_mktemp(path, 0700); + if (!f) { + ERROR(jail->pakfire, "Could not create temporary file: %m\n"); goto ERROR; } DEBUG(jail->pakfire, "Writing script to %s:\n%.*s\n", path, (int)size, script); // Write data - ssize_t bytes_written = write(fd, script, size); - if (bytes_written < (ssize_t)size) { + r = fprintf(f, "%s", script); + if (r < 0) { ERROR(jail->pakfire, "Could not write script to file %s: %m\n", path); - r = 1; - goto ERROR; - } - - // Make the script executable - r = fchmod(fd, S_IRUSR|S_IWUSR|S_IXUSR); - if (r) { - ERROR(jail->pakfire, "Could not set executable permissions on %s: %m\n", path); goto ERROR; } // Close file - r = close(fd); + r = fclose(f); if (r) { ERROR(jail->pakfire, "Could not close script file %s: %m\n", path); - r = 1; goto ERROR; } + f = NULL; + // Count how many arguments were passed unsigned int argc = 1; if (args) { @@ -1645,6 +1638,8 @@ PAKFIRE_EXPORT int pakfire_jail_exec_script(struct pakfire_jail* jail, ERROR: if (argv) free(argv); + if (f) + fclose(f); // Remove script from disk if (*path)