On 02/01/2013 04:09 PM, Michal Sekletar wrote:
All Execs within the service, will get mounted the same /tmp and /var/tmp
directories, if service is configured with PrivateTmp=yes. Temporary
directories are cleaned up by service itself, rather than relying on
systemd-tmpfiles.
Thank you taking on this long-standing issue. The general approach looks
good to me.
...
+int setup_tmpdirs(ExecContext *context) {
+ int r = 0;
+ bool remove_tmp = false, remove_var_tmp = false;
+ mode_t u;
+ char *d = NULL;
+ char tmp_dir[] = "/tmp/systemd-private-XXXXXX",
+ var_tmp_dir[] = "/var/tmp/systemd-private-XXXXXX";
+
+ assert(context);
+
+ if (!context->tmp_dir) {
+ d = mktemp(tmp_dir);
+ if (!d) {
+ r = -errno;
+ goto fail;
+ }
+
+ context->tmp_dir = strdup(d);
+ if (!context->tmp_dir) {
+ r = log_oom();
+ goto fail;
+ }
+
+ u = umask(0000);
+ r = mkdir(tmp_dir, 0777);
+ umask(u);
+ if (r < 0) {
Suppose that a mkdir failure happens...
+ r = -errno;
+ goto fail;
+ }
+ remove_tmp = true;
+
+ if (chmod(tmp_dir, 0777 | S_ISVTX) < 0) {
+ r = -errno;
+ goto fail;
+ }
+ }
[...]
... remove_tmp is still false, so this code won't free and reset
context->tmp_dir:
> +fail:
+ if (remove_tmp) {
+ free(context->tmp_dir);
+ context->tmp_dir = NULL;
+ rmdir(tmp_dir);
+ }
_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel