From bdec00ada0634d039b91ec6d5b9793be2b68823c Mon Sep 17 00:00:00 2001 From: Jonathan Aillet Date: Mon, 24 Jun 2019 14:45:41 +0200 Subject: Rework json strings allocation/freeing Rework json strings allocation/freeing because : - Some json strings are freed twice. - Some containing strings json are not correctly freed. BUG-AGL: SPEC-2329 Change-Id: I90f9470c6a4bc4b1641a01dd2da5051da1ff9547 Signed-off-by: Jonathan Aillet --- lib/4a-hal-utilities/4a-hal-utilities-data.c | 118 ++++++++++++++++++++------- 1 file changed, 89 insertions(+), 29 deletions(-) (limited to 'lib/4a-hal-utilities') diff --git a/lib/4a-hal-utilities/4a-hal-utilities-data.c b/lib/4a-hal-utilities/4a-hal-utilities-data.c index 3ac2a7c..6121b33 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-data.c +++ b/lib/4a-hal-utilities/4a-hal-utilities-data.c @@ -238,6 +238,24 @@ int HalUtlIsDependencySelected(struct InternalHalProbedDevice *probedDevice, enu } } +void HalUtlFreeSelectedProbedDeviceDataAllocation(struct InternalHalDeviceData *probedDeviceDataToFree) +{ + if(! probedDeviceDataToFree) + return; + + free(probedDeviceDataToFree->extendedCardNb); + free(probedDeviceDataToFree->cardId); + free(probedDeviceDataToFree->cardShortName); + free(probedDeviceDataToFree->cardLongName); + free(probedDeviceDataToFree->cardDriver); + free(probedDeviceDataToFree->cardMixerName); + free(probedDeviceDataToFree->cardComponents); + free(probedDeviceDataToFree->playbackDeviceId); + free(probedDeviceDataToFree->playbackDeviceName); + + free(probedDeviceDataToFree); +} + void HalUtlFreeSelectedProbedDeviceAllocation(struct InternalHalProbedDevice *probedDeviceToFree) { if(! probedDeviceToFree) @@ -245,19 +263,7 @@ void HalUtlFreeSelectedProbedDeviceAllocation(struct InternalHalProbedDevice *pr free(probedDeviceToFree->uid); - if(probedDeviceToFree->deviceData) { - free(probedDeviceToFree->deviceData->extendedCardNb); - free(probedDeviceToFree->deviceData->cardId); - free(probedDeviceToFree->deviceData->cardShortName); - free(probedDeviceToFree->deviceData->cardLongName); - free(probedDeviceToFree->deviceData->cardDriver); - free(probedDeviceToFree->deviceData->cardMixerName); - free(probedDeviceToFree->deviceData->cardComponents); - free(probedDeviceToFree->deviceData->playbackDeviceId); - free(probedDeviceToFree->deviceData->playbackDeviceName); - - free(probedDeviceToFree->deviceData); - } + HalUtlFreeSelectedProbedDeviceDataAllocation(probedDeviceToFree->deviceData); if(probedDeviceToFree->requestedDeviceJ) json_object_put(probedDeviceToFree->requestedDeviceJ); @@ -318,6 +324,15 @@ struct InternalHalDeviceData *HalUtlAllocateAndFillProbedDeviceDataUsingInfoGetR { struct InternalHalDeviceData *currentProbedDeviceData; + char *cardId, + *cardShortName, + *cardLongName, + *cardDriver, + *cardMixerName, + *cardComponents, + *playbackDeviceId = NULL, + *playbackDeviceName = NULL; + if(! responseJ) return NULL; @@ -330,15 +345,15 @@ struct InternalHalDeviceData *HalUtlAllocateAndFillProbedDeviceDataUsingInfoGetR if(wrap_json_unpack(responseJ, "{s:i, s:s, s:s, s:s, s:s, s:s, s:s, s?:i, s?:s, s?:s !}", "cardNb", ¤tProbedDeviceData->cardNb, - "cardId", ¤tProbedDeviceData->cardId, - "cardShortName", ¤tProbedDeviceData->cardShortName, - "cardLongName", ¤tProbedDeviceData->cardLongName, - "cardDriver", ¤tProbedDeviceData->cardDriver, - "cardMixerName", ¤tProbedDeviceData->cardMixerName, - "cardComponents", ¤tProbedDeviceData->cardComponents, + "cardId", &cardId, + "cardShortName", &cardShortName, + "cardLongName", &cardLongName, + "cardDriver", &cardDriver, + "cardMixerName", &cardMixerName, + "cardComponents", &cardComponents, "playbackDeviceNb", ¤tProbedDeviceData->playbackDeviceNb, - "playbackDeviceId", ¤tProbedDeviceData->playbackDeviceId, - "playbackDeviceName", ¤tProbedDeviceData->playbackDeviceName) || + "playbackDeviceId", &playbackDeviceId, + "playbackDeviceName", &playbackDeviceName) || currentProbedDeviceData->cardNb == HAL_UNKNOWN_DEVICE || (currentProbedDeviceData->playbackDeviceNb == HAL_UNKNOWN_DEVICE && asprintf(¤tProbedDeviceData->extendedCardNb, "hw:%i", currentProbedDeviceData->cardNb) < 0) || @@ -346,10 +361,62 @@ struct InternalHalDeviceData *HalUtlAllocateAndFillProbedDeviceDataUsingInfoGetR asprintf(¤tProbedDeviceData->extendedCardNb, "hw:%i,%i", currentProbedDeviceData->cardNb, currentProbedDeviceData->playbackDeviceNb) < 0)) { - free(currentProbedDeviceData); + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + + currentProbedDeviceData->cardId = strdup(cardId); + if(! currentProbedDeviceData->cardId) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + + currentProbedDeviceData->cardShortName = strdup(cardShortName); + if(! currentProbedDeviceData->cardShortName) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + + currentProbedDeviceData->cardLongName = strdup(cardLongName); + if(! currentProbedDeviceData->cardLongName) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); return NULL; } + currentProbedDeviceData->cardDriver = strdup(cardDriver); + if(! currentProbedDeviceData->cardDriver) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + + currentProbedDeviceData->cardMixerName = strdup(cardMixerName); + if(! currentProbedDeviceData->cardMixerName) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + + currentProbedDeviceData->cardComponents = strdup(cardComponents); + if(! currentProbedDeviceData->cardComponents) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + + if(playbackDeviceId) { + currentProbedDeviceData->playbackDeviceId = strdup(playbackDeviceId); + if(! currentProbedDeviceData->playbackDeviceId) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + } + + if(playbackDeviceName) { + currentProbedDeviceData->playbackDeviceName = strdup(playbackDeviceName); + if(! currentProbedDeviceData->playbackDeviceName) { + HalUtlFreeSelectedProbedDeviceDataAllocation(currentProbedDeviceData); + return NULL; + } + } + return currentProbedDeviceData; } @@ -782,13 +849,6 @@ void HalUtlFreeSelectedHalAllocation(struct HalData *halDataToFree) if(! halDataToFree) return; - free(halDataToFree->apiName); - free(halDataToFree->sndCardPath); - free(halDataToFree->info); - free(halDataToFree->author); - free(halDataToFree->version); - free(halDataToFree->date); - if(halDataToFree->internal) { free(halDataToFree->internalHalData->mixerApiName); free(halDataToFree->internalHalData->prefix); -- cgit 1.2.3-korg