diff options
author | Bastien Nocera <hadess@hadess.net> | 2016-03-23 19:00:42 +0100 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2016-06-08 12:11:55 +0200 |
commit | 6fe89ebd7ede76bfb98f93907fd92305e6de7cc4 (patch) | |
tree | ee862e973437dd77070ac502c7ad71b15f9d9e42 | |
parent | 50d76715badeae0acec9c35f2c27103778d65154 (diff) | |
download | gvfs-6fe89ebd7ede76bfb98f93907fd92305e6de7cc4.tar.gz |
afc: Lock apps mutex when setting up HouseArrest
So that we don't have cases where the AppInfo disappears from under us.
https://bugzilla.gnome.org/show_bug.cgi?id=676188
-rw-r--r-- | daemon/gvfsbackendafc.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/daemon/gvfsbackendafc.c b/daemon/gvfsbackendafc.c index e337efc3..d7048f0f 100644 --- a/daemon/gvfsbackendafc.c +++ b/daemon/gvfsbackendafc.c @@ -777,18 +777,20 @@ g_vfs_backend_setup_afc_for_app (GVfsBackendAfc *self, plist_t dict, error; lockdownd_error_t lerr; + g_mutex_lock (&self->apps_lock); + info = g_hash_table_lookup (self->apps, id); if (info == NULL || info->afc_cli != NULL) - return; + goto out; /* Load house arrest and afc now! */ lockdown_cli = NULL; if (lockdownd_client_new_with_handshake (self->dev, &lockdown_cli, "gvfsd-afc") != LOCKDOWN_E_SUCCESS) { g_warning ("Failed to get a lockdown to start house arrest for app %s", info->id); - return; + goto out; } lerr = lockdownd_start_service (lockdown_cli, "com.apple.mobile.house_arrest", &lockdown_service); @@ -796,7 +798,7 @@ g_vfs_backend_setup_afc_for_app (GVfsBackendAfc *self, { lockdownd_client_free (lockdown_cli); g_warning ("Failed to start house arrest for app %s (%d)", info->id, lerr); - return; + goto out; } house_arrest = NULL; @@ -806,7 +808,7 @@ g_vfs_backend_setup_afc_for_app (GVfsBackendAfc *self, g_warning ("Failed to start house arrest client for app %s", info->id); lockdownd_client_free (lockdown_cli); lockdownd_service_descriptor_free (lockdown_service); - return; + goto out; } lockdownd_service_descriptor_free (lockdown_service); @@ -818,7 +820,7 @@ g_vfs_backend_setup_afc_for_app (GVfsBackendAfc *self, g_warning ("Failed to set up house arrest for app %s", info->id); house_arrest_client_free (house_arrest); lockdownd_client_free (lockdown_cli); - return; + goto out; } error = plist_dict_get_item (dict, "Error"); if (error != NULL) @@ -832,7 +834,7 @@ g_vfs_backend_setup_afc_for_app (GVfsBackendAfc *self, house_arrest_client_free (house_arrest); lockdownd_client_free (lockdown_cli); - return; + goto out; } plist_free (dict); @@ -844,12 +846,14 @@ g_vfs_backend_setup_afc_for_app (GVfsBackendAfc *self, { g_warning ("Failed to set up afc client for app %s", info->id); house_arrest_client_free (house_arrest); - - return; + goto out; } info->house_arrest = house_arrest; info->afc_cli = afc; + +out: + g_mutex_unlock (&self->apps_lock); } /* If force_afc_mount is TRUE, then we'll try to mount |