SDOCM00106450 HeapMemMP_free fails to cache invalidate freed...
authorRamsey Harris <ramsey@ti.com>
Fri, 21 Feb 2014 18:48:15 +0000 (10:48 -0800)
committerChris Ring <cring@ti.com>
Mon, 24 Feb 2014 17:43:54 +0000 (09:43 -0800)
The freed buffer content (after the header) was left in cache. If
buffer content was dirty, it would eventually be evicted with a
write-back possibly overwriting memory in use by a different core,
and cause heap corruption.

packages/ti/sdo/ipc/heaps/HeapMemMP.c

index c5f79b7256a822de8cb7a201f6955b9fcde75ee3..2b693b863dc112b4a943fa9303b3952addfc235e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,6 +29,7 @@
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 /*
  *  ======== HeapMemMP.c ========
  */
@@ -866,6 +867,11 @@ Void ti_sdo_ipc_heaps_HeapMemMP_free(ti_sdo_ipc_heaps_HeapMemMP_Object *obj,
          */
         Cache_wbInv(newHeader, sizeof(ti_sdo_ipc_heaps_HeapMemMP_Header),
              Cache_Type_ALL, TRUE);  /* B2 */
+       /*
+        *  Invalidate entire buffer being freed to ensure that stale cache
+        *  data in block isn't evicted later
+        */
+        Cache_inv(newHeader, size, Cache_Type_ALL, TRUE);  /* B2 */
     }
 
     GateMP_leave((GateMP_Handle)obj->gate, key);