hal: Fix for memory corruption during Sub System Restart

- Random crashes are observed during SSR while playing
  compress session

- To identify active compress usecases during SSR,list_for_each()
  is being used for traversing.
  Once compress session is identiifed as part of loop, list_remove()
  (called from out_standby) is used to remove compress usecase.
  list_for_each() uses this removed node to traverse next node which
  result in-valid memory access as node is already removed.

- Instead of list_for_each(), use list_for_each_safe() which will make
  sure next node is updated before removing compress usecase.

Change-Id: I58c331caca4123651139685bb6c1eb20588a8097
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index c500f9e..c4021a6 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -3086,20 +3086,21 @@
 static void close_compress_sessions(struct audio_device *adev)
 {
     struct stream_out *out;
-    struct listnode *node;
+    struct listnode *node, *tempnode;
     struct audio_usecase *usecase;
     pthread_mutex_lock(&adev->lock);
-    list_for_each(node, &adev->usecase_list) {
+
+    list_for_each_safe(node, tempnode, &adev->usecase_list) {
         usecase = node_to_item(node, struct audio_usecase, list);
-        if (usecase && is_offload_usecase(usecase->id)) {
-            if (usecase && usecase->stream.out) {
+        if (is_offload_usecase(usecase->id)) {
+            if (usecase->stream.out) {
                 ALOGI(" %s closing compress session %d on OFFLINE state", __func__, usecase->id);
                 out = usecase->stream.out;
                 pthread_mutex_unlock(&adev->lock);
                 out_standby(&out->stream.common);
                 pthread_mutex_lock(&adev->lock);
             }
-        }
+       }
     }
     pthread_mutex_unlock(&adev->lock);
 }