Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85f301c4 authored by Naresh Tanniru's avatar Naresh Tanniru
Browse files

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
parent f10fd1d3
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -3086,13 +3086,14 @@ static void adev_close_output_stream(struct audio_hw_device *dev __unused,
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);