@@ -144,6 +144,33 @@ static void quit_program(int exit_code) {
144
144
main_loop_quit ();
145
145
}
146
146
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
+
147
174
/**
148
175
* @brief Signals handling
149
176
*
@@ -431,7 +458,8 @@ static gboolean get_and_verify_tls_selection(AXParameter* param_handle, bool* us
431
458
return true;
432
459
}
433
460
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.
435
463
static bool read_settings (struct settings * settings , const struct app_state * app_state ) {
436
464
AXParameter * param_handle = app_state -> param_handle ;
437
465
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
458
486
return false;
459
487
}
460
488
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
+
461
494
if (!(settings -> data_root = prepare_data_root (param_handle , app_state -> sd_card_area )))
462
495
return false;
463
496
@@ -731,6 +764,8 @@ static void dockerd_process_exited_callback(GPid pid, gint status, gpointer app_
731
764
g_autofree char * pid_path = g_strdup_printf ("/var/run/user/%d/docker.pid" , getuid ());
732
765
remove (pid_path );
733
766
767
+ prevent_others_from_using_our_ipc_socket ();
768
+
734
769
main_loop_quit (); // Trigger a restart of dockerd from main()
735
770
}
736
771
@@ -844,7 +879,7 @@ static bool set_env_variables(void) {
844
879
g_strdup_printf ("/bin:/usr/bin:%s:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" ,
845
880
APP_DIRECTORY );
846
881
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 ( );
848
883
849
884
return set_env_variable ("PATH" , path ) && set_env_variable ("HOME" , APP_DIRECTORY ) &&
850
885
set_env_variable ("DOCKER_HOST" , docker_host ) &&
0 commit comments