Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / native_client_sdk / src / libraries / nacl_io / kernel_intercept.cc
index ce4f170..35bf3fc 100644 (file)
@@ -26,6 +26,7 @@ using namespace nacl_io;
 
 struct KernelInterceptState {
   KernelProxy* kp;
+  PepperInterface* ppapi;
   bool kp_owned;
 };
 
@@ -41,6 +42,7 @@ int ki_push_state_for_testing() {
     return 1;
   s_saved_state = s_state;
   s_state.kp = NULL;
+  s_state.ppapi = NULL;
   s_state.kp_owned = false;
   return 0;
 }
@@ -56,9 +58,12 @@ int ki_init_ppapi(void* kp,
   if (s_state.kp != NULL)
     return 1;
   PepperInterface* ppapi = NULL;
-  if (instance && get_browser_interface)
+  if (instance && get_browser_interface) {
     ppapi = new RealPepperInterface(instance, get_browser_interface);
-  return ki_init_interface(kp, ppapi);
+    s_state.ppapi = ppapi;
+  }
+  int rtn = ki_init_interface(kp, ppapi);
+  return rtn;
 }
 
 int ki_init_interface(void* kp, void* pepper_interface) {
@@ -92,17 +97,20 @@ void ki_uninit() {
 
   // If we are going to delete the KernelProxy don't do it
   // until we've swapped it out.
-  KernelProxy* delete_kp = s_state.kp_owned ? s_state.kp : NULL;
+  KernelInterceptState state_to_delete = s_state;
 
   // Swap out the KernelProxy. This will normally reset the
   // proxy to NULL, aside from in test code that has called
   // ki_push_state_for_testing().
   s_state = s_saved_state;
   s_saved_state.kp = NULL;
+  s_saved_state.ppapi = NULL;
   s_saved_state.kp_owned = false;
 
-  if (delete_kp)
-    delete delete_kp;
+  if (state_to_delete.kp_owned)
+    delete state_to_delete.kp;
+
+  delete state_to_delete.ppapi;
 }
 
 nacl_io::KernelProxy* ki_get_proxy() {