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

Commit bc0b88e2 authored by Vaibhav Raut's avatar Vaibhav Raut
Browse files

HAL: Fix for crash due to structure mismatch during st deinit

The current implementation of the clear_devices function involves
the audio_device_info structure. However, when a listnode is added
to st_ses_list, the structure sound_trigger_info is used. This leads
to a structural mismatch when clear_devices is called during sound
trigger deinit with st_ses_list. A new function is introduced to
handle the mismatch of structures.

Change-Id: Ida5d5ab2b4a80da5a637a9301465ec3efc16d6ae
parent ee821931
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -25,6 +25,10 @@
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Changes from Qualcomm Innovation Center are provided under the following license:
 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
 * SPDX-License-Identifier: BSD-3-Clause-Clear
 *
 */
#define LOG_TAG "soundtrigger"
/* #define LOG_NDEBUG 0 */
@@ -872,13 +876,32 @@ cleanup:

}

int clear_device_list(struct listnode *devices)
{
     struct listnode *node = NULL, *temp = NULL;
     struct sound_trigger_info *item = NULL;

     if (devices == NULL)
         return 0;

     list_for_each_safe (node, temp, devices) {
         item = node_to_item(node, struct sound_trigger_info, list);
         if (item != NULL) {
             list_remove(&item->list);
             free(item);
        }
     }

     return 0;
}

void audio_extn_sound_trigger_deinit(struct audio_device *adev)
{
    ALOGI("%s: Enter", __func__);
    if (st_dev && (st_dev->adev == adev) && st_dev->lib_handle) {
        audio_extn_snd_mon_unregister_listener(st_dev);
        dlclose(st_dev->lib_handle);
        clear_devices(&st_dev->st_ses_list);
        clear_device_list(&st_dev->st_ses_list);
        free(st_dev);
        st_dev = NULL;
    }