fix segv with removable devices!!!! decode forced strdup/free etc... but rest

of code assumed stringshare.



SVN revision: 48546
This commit is contained in:
Carsten Haitzler 2010-05-02 12:05:56 +00:00
parent 60336d031f
commit 12c8a33b11
3 changed files with 39 additions and 39 deletions

View File

@ -2958,20 +2958,20 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e)
mountpoint = udi + strlen(udi) + 1; mountpoint = udi + strlen(udi) + 1;
v = e_fm2_dbus_volume_find(udi); v = e_fm2_dbus_volume_find(udi);
if (v) if (v)
{ {
e_fm2_dbus_mount_add(v, mountpoint); e_fm2_dbus_mount_add(v, mountpoint);
_e_fm2_volume_icon_update(v); _e_fm2_volume_icon_update(v);
if (e_config->dbus_auto_open && !eina_list_count(v->mounts)) if (e_config->dbus_auto_open && !eina_list_count(v->mounts))
{ {
E_Action *a; E_Action *a;
Eina_List *m; Eina_List *m;
a = e_action_find("fileman"); a = e_action_find("fileman");
m = e_manager_list(); m = e_manager_list();
if (a && a->func.go && m && eina_list_data_get(m)) if (a && a->func.go && m && eina_list_data_get(m))
a->func.go(E_OBJECT(eina_list_data_get(m)), mountpoint); a->func.go(E_OBJECT(eina_list_data_get(m)), mountpoint);
} }
} }
} }
break; break;
@ -2984,10 +2984,10 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e)
udi = e->data; udi = e->data;
v = e_fm2_dbus_volume_find(udi); v = e_fm2_dbus_volume_find(udi);
if (v) if (v)
{ {
e_fm2_dbus_mount_del(v); e_fm2_dbus_mount_del(v);
_e_fm2_volume_icon_update(v); _e_fm2_volume_icon_update(v);
} }
} }
break; break;

View File

@ -269,18 +269,19 @@ e_fm2_dbus_volume_add(E_Volume *v)
EAPI void EAPI void
e_fm2_dbus_volume_del(E_Volume *v) e_fm2_dbus_volume_del(E_Volume *v)
{ {
Eina_List *l, *l_nxt;
E_Fm2_Mount *m; E_Fm2_Mount *m;
// printf("VOL- %s\n", v->udi); // printf("VOL- %s\n", v->udi);
if (v->storage)
v->storage->volumes = eina_list_remove(v->storage->volumes, v);
_e_vols = eina_list_remove(_e_vols, v); _e_vols = eina_list_remove(_e_vols, v);
_e_fm2_volume_erase(v); _e_fm2_volume_erase(v);
EINA_LIST_FOREACH_SAFE(v->mounts, l, l_nxt, m) if (v->storage)
{
v->storage->volumes = eina_list_remove(v->storage->volumes, v);
v->storage = NULL;
}
EINA_LIST_FREE(v->mounts, m)
{ {
_e_fm2_dbus_unmount_ok(m); _e_fm2_dbus_unmount_ok(m);
v->mounts = eina_list_remove_list(v->mounts, l);
_e_fm2_dbus_mount_free(m); _e_fm2_dbus_mount_free(m);
} }
_e_volume_free(v); _e_volume_free(v);
@ -302,8 +303,6 @@ _e_fm2_volume_write(E_Volume *v)
f = fopen(buf, "w"); f = fopen(buf, "w");
if (f) if (f)
{ {
fprintf(f, fprintf(f,
"[Desktop Entry]\n" "[Desktop Entry]\n"
"Encoding=UTF-8\n" "Encoding=UTF-8\n"
@ -373,7 +372,7 @@ e_fm2_dbus_volume_find(const char *udi)
EINA_LIST_FOREACH(_e_vols, l, v) EINA_LIST_FOREACH(_e_vols, l, v)
{ {
if (!strcmp(udi, v->udi)) return v; if ((v->udi) && (!strcmp(udi, v->udi))) return v;
} }
return NULL; return NULL;
} }
@ -428,7 +427,6 @@ e_fm2_dbus_mount_add(E_Volume *v, const char *mountpoint)
EAPI void EAPI void
e_fm2_dbus_mount_del(E_Volume *v) e_fm2_dbus_mount_del(E_Volume *v)
{ {
Eina_List *l, *l_nxt;
E_Fm2_Mount *m; E_Fm2_Mount *m;
v->mounted = 0; v->mounted = 0;
@ -437,11 +435,10 @@ e_fm2_dbus_mount_del(E_Volume *v)
eina_stringshare_del(v->mount_point); eina_stringshare_del(v->mount_point);
v->mount_point = NULL; v->mount_point = NULL;
} }
EINA_LIST_FOREACH_SAFE(v->mounts, l, l_nxt, m) EINA_LIST_FREE(v->mounts, m)
{ {
_e_fm2_dbus_unmount_ok(m); _e_fm2_dbus_unmount_ok(m);
v->mounts = eina_list_remove_list(v->mounts, l);
_e_fm2_dbus_mount_free(m); _e_fm2_dbus_mount_free(m);
} }
} }
@ -515,7 +512,6 @@ e_fm2_dbus_mount(E_Volume *v,
EAPI void EAPI void
e_fm2_dbus_mount_fail(E_Volume *v) e_fm2_dbus_mount_fail(E_Volume *v)
{ {
Eina_List *l, *l_nxt;
E_Fm2_Mount *m; E_Fm2_Mount *m;
v->mounted = 0; v->mounted = 0;
@ -525,10 +521,9 @@ e_fm2_dbus_mount_fail(E_Volume *v)
v->mount_point = NULL; v->mount_point = NULL;
} }
EINA_LIST_FOREACH_SAFE(v->mounts, l, l_nxt, m) EINA_LIST_FREE(v->mounts, m)
{ {
_e_fm2_dbus_mount_fail(m); _e_fm2_dbus_unmount_ok(m);
v->mounts = eina_list_remove_list(v->mounts, l);
_e_fm2_dbus_mount_free(m); _e_fm2_dbus_mount_free(m);
} }
} }
@ -561,6 +556,7 @@ e_fm2_dbus_unmount_fail(E_Volume *v)
static void static void
_e_fm2_dbus_mount_ok(E_Fm2_Mount *m) _e_fm2_dbus_mount_ok(E_Fm2_Mount *m)
{ {
if (m->mounted) return;
m->mounted = 1; m->mounted = 1;
if (m->volume) if (m->volume)
m->mount_point = eina_stringshare_add(m->volume->mount_point); m->mount_point = eina_stringshare_add(m->volume->mount_point);
@ -572,6 +568,7 @@ _e_fm2_dbus_mount_ok(E_Fm2_Mount *m)
static void static void
_e_fm2_dbus_mount_fail(E_Fm2_Mount *m) _e_fm2_dbus_mount_fail(E_Fm2_Mount *m)
{ {
if (!m->mounted) return;
m->mounted = 0; m->mounted = 0;
if (m->mount_point) if (m->mount_point)
{ {
@ -585,6 +582,7 @@ _e_fm2_dbus_mount_fail(E_Fm2_Mount *m)
static void static void
_e_fm2_dbus_unmount_ok(E_Fm2_Mount *m) _e_fm2_dbus_unmount_ok(E_Fm2_Mount *m)
{ {
if (!m->mounted) return;
m->mounted = 0; m->mounted = 0;
if (m->mount_point) if (m->mount_point)
{ {
@ -598,6 +596,7 @@ _e_fm2_dbus_unmount_ok(E_Fm2_Mount *m)
static void static void
_e_fm2_dbus_unmount_fail(E_Fm2_Mount *m) _e_fm2_dbus_unmount_fail(E_Fm2_Mount *m)
{ {
if (m->mounted) return;
m->mounted = 1; m->mounted = 1;
if (m->unmount_fail) if (m->unmount_fail)
m->unmount_fail(m->data); m->unmount_fail(m->data);

View File

@ -104,6 +104,7 @@ _e_storage_free(E_Storage *s)
E_Volume *v; E_Volume *v;
EINA_LIST_FREE(s->volumes, v) EINA_LIST_FREE(s->volumes, v)
{ {
v->storage = NULL;
_e_volume_free(v); _e_volume_free(v);
} }
if (s->udi) eina_stringshare_del(s->udi); if (s->udi) eina_stringshare_del(s->udi);
@ -126,8 +127,8 @@ _e_volume_edd_new(void)
if (!eet_eina_stream_data_descriptor_class_set(&eddc, "e_volume", sizeof (E_Volume))) if (!eet_eina_stream_data_descriptor_class_set(&eddc, "e_volume", sizeof (E_Volume)))
return NULL; return NULL;
eddc.func.str_alloc = (char *(*)(const char *)) strdup; // eddc.func.str_alloc = (char *(*)(const char *)) strdup;
eddc.func.str_free = (void (*)(const char *)) free; // eddc.func.str_free = (void (*)(const char *)) free;
edd = eet_data_descriptor_stream_new(&eddc); edd = eet_data_descriptor_stream_new(&eddc);
#define DAT(x, y, z) EET_DATA_DESCRIPTOR_ADD_BASIC(edd, E_Volume, x, y, z) #define DAT(x, y, z) EET_DATA_DESCRIPTOR_ADD_BASIC(edd, E_Volume, x, y, z)
@ -157,8 +158,8 @@ _e_storage_edd_new(void)
if (!eet_eina_stream_data_descriptor_class_set(&eddc, "e_storage", sizeof (E_Storage))) if (!eet_eina_stream_data_descriptor_class_set(&eddc, "e_storage", sizeof (E_Storage)))
return NULL; return NULL;
eddc.func.str_alloc = (char *(*)(const char *)) strdup; // eddc.func.str_alloc = (char *(*)(const char *)) strdup;
eddc.func.str_free = (void (*)(const char *)) free; // eddc.func.str_free = (void (*)(const char *)) free;
edd = eet_data_descriptor_stream_new(&eddc); edd = eet_data_descriptor_stream_new(&eddc);
#define DAT(x, y, z) EET_DATA_DESCRIPTOR_ADD_BASIC(edd, E_Storage, x, y, z) #define DAT(x, y, z) EET_DATA_DESCRIPTOR_ADD_BASIC(edd, E_Storage, x, y, z)