Function dfb_input_remove_device calls fusion_reactor_dispatch, which
frees resources pointed by "device" pointer. After that "device" is
still used in following calls: fusion_ref_zero_trylock,
fusion_ref_unlock and fusion_ref_destroy.
If freed area is overwritten (by another allocation) before mentioned
calls then it might end with:
- segmentation faults in case of release build,
- MAGIC asserts in fusion in case of debug builds.

Patch replaces "device" variable with "shared".

Lukasz
--- ./src/core/input.c.old	2012-06-29 18:00:26.000000000 +0200
+++ ./src/core/input.c	2012-07-17 11:19:22.015748625 +0200
@@ -1817,13 +1817,15 @@ dfb_input_remove_device(int device_index
 
      /* Send the hot-plug out message */
 #if FUSION_BUILD_MULTI
+     /* do not use "device" after dispatch call, since dispatch calls
+        local_processing_hotplug, which frees memory pointed by "device" */
      fusion_reactor_dispatch( core_input->reactor, &message, true, NULL);
 
      int    loop = CHECK_NUMBER;
 
      while (--loop) {
-          if (fusion_ref_zero_trylock( &device->shared->ref ) == DR_OK) {
-               fusion_ref_unlock(&device->shared->ref);
+          if (fusion_ref_zero_trylock( &shared->ref ) == DR_OK) {
+               fusion_ref_unlock(&shared->ref);
                break;
           }
 
@@ -1833,7 +1835,7 @@ dfb_input_remove_device(int device_index
      if (!loop)
           D_DEBUG_AT(Core_Input, "Shared device might be connected to by others\n");
 
-     fusion_ref_destroy(&device->shared->ref);
+     fusion_ref_destroy(&shared->ref);
 #else
      local_processing_hotplug((const void*) &message, (void*) device->core);
 #endif
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to