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);
}