Skip to content

Commit f08beda

Browse files
Set and restore permissions for /var/run/user/UID (#219)
1 parent bce495f commit f08beda

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

app/dockerdwrapper.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,33 @@ static void quit_program(int exit_code) {
144144
main_loop_quit();
145145
}
146146

147+
static bool with_compose(void) {
148+
return strcmp(APP_NAME, "dockerdwrapperwithcompose") == 0;
149+
}
150+
151+
static char* xdg_runtime_directory(void) {
152+
return g_strdup_printf("/var/run/user/%d", getuid());
153+
}
154+
155+
static bool set_xdg_directory_permisssions(mode_t mode) {
156+
g_autofree char* xdg_runtime_dir = xdg_runtime_directory();
157+
if (chmod(xdg_runtime_dir, mode) != 0) {
158+
log_error("Failed to set permissions on %s: %s", xdg_runtime_dir, strerror(errno));
159+
return false;
160+
}
161+
return true;
162+
}
163+
164+
static bool let_other_apps_use_our_ipc_socket(void) {
165+
const mode_t group_read_and_exec_perms = 0750;
166+
return set_xdg_directory_permisssions(group_read_and_exec_perms);
167+
}
168+
169+
static bool prevent_others_from_using_our_ipc_socket(void) {
170+
const mode_t user_read_and_exec_perms = 0700;
171+
return set_xdg_directory_permisssions(user_read_and_exec_perms);
172+
}
173+
147174
/**
148175
* @brief Signals handling
149176
*
@@ -431,7 +458,8 @@ static gboolean get_and_verify_tls_selection(AXParameter* param_handle, bool* us
431458
return true;
432459
}
433460

434-
// Read and verify consistency of settings. Call set_status_parameter() and return false on error.
461+
// Read and verify consistency of settings. Call set_status_parameter() or quit_program() and return
462+
// false on error.
435463
static bool read_settings(struct settings* settings, const struct app_state* app_state) {
436464
AXParameter* param_handle = app_state->param_handle;
437465
settings->use_tcp_socket = is_parameter_yes(param_handle, PARAM_TCP_SOCKET);
@@ -458,6 +486,11 @@ static bool read_settings(struct settings* settings, const struct app_state* app
458486
return false;
459487
}
460488

489+
if (settings->use_ipc_socket && with_compose() && !let_other_apps_use_our_ipc_socket()) {
490+
quit_program(EX_SOFTWARE);
491+
return false;
492+
}
493+
461494
if (!(settings->data_root = prepare_data_root(param_handle, app_state->sd_card_area)))
462495
return false;
463496

@@ -731,6 +764,8 @@ static void dockerd_process_exited_callback(GPid pid, gint status, gpointer app_
731764
g_autofree char* pid_path = g_strdup_printf("/var/run/user/%d/docker.pid", getuid());
732765
remove(pid_path);
733766

767+
prevent_others_from_using_our_ipc_socket();
768+
734769
main_loop_quit(); // Trigger a restart of dockerd from main()
735770
}
736771

@@ -844,7 +879,7 @@ static bool set_env_variables(void) {
844879
g_strdup_printf("/bin:/usr/bin:%s:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin",
845880
APP_DIRECTORY);
846881
g_autofree char* docker_host = g_strdup_printf("unix:///var/run/user/%d/docker.sock", uid);
847-
g_autofree char* xdg_runtime_dir = g_strdup_printf("/var/run/user/%d", uid);
882+
g_autofree char* xdg_runtime_dir = xdg_runtime_directory();
848883

849884
return set_env_variable("PATH", path) && set_env_variable("HOME", APP_DIRECTORY) &&
850885
set_env_variable("DOCKER_HOST", docker_host) &&

0 commit comments

Comments
 (0)