[systemd-devel] [PATCH] core: reuse the same /tmp, /var/tmp and inaccessible dir
Lennart Poettering
lennart at poettering.net
Wed Feb 13 11:18:30 PST 2013
On Wed, 13.02.13 14:45, Michal Sekletar (msekleta at redhat.com) wrote:
Heya!
Looks good in principle.
> + if (context->private_tmp) {
> + if (!context->tmp_dir) {
> + d = mktemp(tmp_dir);
mktemp() is never OK. Also see "BUGS" section in the man page about
that. Use mkdtemp() or so instead.
> + 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) {
> + free(context->tmp_dir);
> + context->tmp_dir = NULL;
> + r = -errno;
> + goto fail;
> + }
> + remove_tmp = true;
> +
> + if (chmod(tmp_dir, 0777 | S_ISVTX) < 0) {
> + r = -errno;
> + goto fail;
> + }
> + }
>
> - p->path = "/var/tmp";
> - p->mode = PRIVATE_VAR_TMP;
> - p++;
> + if (!context->var_tmp_dir) {
> + d = mktemp(var_tmp_dir);
> + if (!d) {
> + r = -errno;
> + goto fail;
> + }
> +
> + context->var_tmp_dir = strdup(d);
> + if (!context->var_tmp_dir) {
> + r = log_oom();
> + goto fail;
> + }
> +
> + u = umask(0000);
> + r = mkdir(var_tmp_dir, 0777);
> + umask(u);
> + if (r < 0) {
> + free(context->var_tmp_dir);
> + context->var_tmp_dir = NULL;
> + r = -errno;
> + goto fail;
> + }
> + remove_var_tmp = true;
> +
> + if (chmod(var_tmp_dir, 0777 | S_ISVTX) < 0) {
> + r = -errno;
> + goto fail;
> + }
These two blocks really look like they want to be replaced by a function
that we just can call twice...
> static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart) {
> int r;
> assert(s);
> @@ -2520,6 +2526,10 @@ static int service_stop(Unit *u) {
> s->state == SERVICE_EXITED);
>
> service_enter_stop(s, SERVICE_SUCCESS);
> +
> + /* we want empty tmp dirs when service is started again */
> + service_cleanup_tmpdirs(s);
> +
This should probably move to service_enter_dead() or so.
Also, we should have the same in socket.c, mount.c, swap.c probably, as
they also use exec context...
Lennart
--
Lennart Poettering - Red Hat, Inc.
More information about the systemd-devel
mailing list