summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJonathan Aillet <jonathan.aillet@iot.bzh>2019-06-24 14:45:41 +0200
committerJonathan Aillet <jonathan.aillet@iot.bzh>2019-06-25 11:15:43 +0200
commitbdec00ada0634d039b91ec6d5b9793be2b68823c (patch)
treed460bb7284e32d8167ce39a8dc0654d47c0f99ad /src
parent70c11ed3c3f1f7ce80af6fd3997a8bb8a38d392e (diff)
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 <jonathan.aillet@iot.bzh>
Diffstat (limited to 'src')
-rw-r--r--src/4a-internals-hal/4a-internals-hal-alsacore-link.c15
-rw-r--r--src/4a-internals-hal/4a-internals-hal-cb.c80
2 files changed, 70 insertions, 25 deletions
diff --git a/src/4a-internals-hal/4a-internals-hal-alsacore-link.c b/src/4a-internals-hal/4a-internals-hal-alsacore-link.c
index 902e5ad..e1ad6dd 100644
--- a/src/4a-internals-hal/4a-internals-hal-alsacore-link.c
+++ b/src/4a-internals-hal/4a-internals-hal-alsacore-link.c
@@ -287,7 +287,9 @@ int InternalHalUpdateAlsaCtlProperties(afb_api_t apiHandle, char *cardId, struct
{
int err = 0;
- json_object *returnedDataJ;
+ char *name;
+
+ json_object *returnedDataJ = NULL;
err = InternalHalGetAlsaCtlInfo(apiHandle, cardId, currentAlsaCtl, &returnedDataJ);
if(err) {
@@ -295,7 +297,9 @@ int InternalHalUpdateAlsaCtlProperties(afb_api_t apiHandle, char *cardId, struct
}
// TBD JAI : get dblinear/dbminmax/... values
else if(wrap_json_unpack(returnedDataJ,
- "{s:{s?:i s?:i s?:i s?:i s?:i}}",
+ "{s:i s:s s:{s?:i s?:i s?:i s?:i s?:i}}",
+ "id", &currentAlsaCtl->numid,
+ "name", &name,
"ctl",
"type", (int *) &currentAlsaCtl->alsaCtlProperties.type,
"count", &currentAlsaCtl->alsaCtlProperties.count,
@@ -310,6 +314,13 @@ int InternalHalUpdateAlsaCtlProperties(afb_api_t apiHandle, char *cardId, struct
err = -9;
}
+ else {
+ currentAlsaCtl->name = strdup(name);
+ if(! currentAlsaCtl->name) {
+ AFB_API_ERROR(apiHandle, "Didn't succeed to store (allocate) control 'name' string");
+ err = -10;
+ }
+ }
if(returnedDataJ)
json_object_put(returnedDataJ);
diff --git a/src/4a-internals-hal/4a-internals-hal-cb.c b/src/4a-internals-hal/4a-internals-hal-cb.c
index a8d6dc3..1749131 100644
--- a/src/4a-internals-hal/4a-internals-hal-cb.c
+++ b/src/4a-internals-hal/4a-internals-hal-cb.c
@@ -149,7 +149,9 @@ void InternalHalDispatchApiEvent(afb_api_t apiHandle, const char *evtLabel, json
int InternalHalHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_object *MixerJ)
{
- int err = 0;
+ int err = 0, wrapRet;
+
+ char *mixerApiName, *prefix = NULL;
CtlConfigT *ctrlConfig;
struct HalData *currentHalData;
@@ -171,16 +173,25 @@ int InternalHalHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_ob
else
return -4;
- if(wrap_json_unpack(MixerJ, "{s:s}", "mixerapi", &currentHalData->internalHalData->mixerApiName))
+ wrapRet = wrap_json_unpack(MixerJ, "{s:s s?:s}", "mixerapi", &mixerApiName, "prefix", &prefix);
+ if(wrapRet)
return -5;
- wrap_json_unpack(MixerJ, "{s?:s}", "prefix", &currentHalData->internalHalData->prefix);
+ currentHalData->internalHalData->mixerApiName = strdup(mixerApiName);
+ if(! currentHalData->internalHalData->mixerApiName)
+ return -6;
+
+ if(prefix) {
+ currentHalData->internalHalData->prefix = strdup(prefix);
+ if(! currentHalData->internalHalData->prefix)
+ return -7;
+ }
}
else if(currentHalData->status == HAL_STATUS_AVAILABLE) {
err = InternalHalAttachToMixer(apiHandle);
if(err) {
AFB_API_ERROR(apiHandle, "Error %i while attaching to mixer", err);
- return -6;
+ return -8;
}
}
@@ -193,28 +204,50 @@ int InternalHalHalMixerConfig(afb_api_t apiHandle, CtlSectionT *section, json_ob
int InternalHalProcessOneHalMapObject(afb_api_t apiHandle, struct InternalHalAlsaMap *alsaMap, json_object *AlsaMapJ)
{
- char *action = NULL, *typename = NULL;
+ char *uid, *info = NULL, *action = NULL, *name = NULL, *typename = NULL;
json_object *alsaJ = NULL, *createAlsaCtlJ = NULL;
AFB_API_DEBUG(apiHandle, "AlsaMapJ=%s", json_object_get_string(AlsaMapJ));
if(wrap_json_unpack(AlsaMapJ, "{s:s s?:s s:o s?:s !}",
- "uid", &alsaMap->uid,
- "info", &alsaMap->info,
+ "uid", &uid,
+ "info", &info,
"alsa", &alsaJ,
"action", &action)) {
AFB_API_ERROR(apiHandle, "Parsing error, map should only contains [label]|[uid]|[tag]|[info]|[alsa]|[action] in : '%s'", json_object_get_string(AlsaMapJ));
return -1;
}
+ alsaMap->uid = strdup(uid);
+ if(! alsaMap->uid) {
+ AFB_API_ERROR(apiHandle, "Didn't succeed to store (allocate) control 'uid' string");
+ return -2;
+ }
+
+ if(info) {
+ alsaMap->info = strdup(info);
+ if(! alsaMap->info) {
+ AFB_API_ERROR(apiHandle, "Didn't succeed to store (allocate) control 'info' string");
+ return -3;
+ }
+ }
+
if(wrap_json_unpack(alsaJ, "{s?:s s?:i s?:i s?:o !}",
- "name", &alsaMap->ctl.name,
+ "name", &name,
"numid", &alsaMap->ctl.numid,
"value", &alsaMap->ctl.value,
"create", &createAlsaCtlJ)) {
AFB_API_ERROR(apiHandle, "Parsing error, alsa json should only contains [name]|[numid]||[value]|[create] in : '%s'", json_object_get_string(alsaJ));
- return -2;
+ return -4;
+ }
+
+ if(name) {
+ alsaMap->ctl.name = strdup(name);
+ if(! alsaMap->ctl.name) {
+ AFB_API_ERROR(apiHandle, "Didn't succeed to store (allocate) control 'info' string");
+ return -5;
+ }
}
if(createAlsaCtlJ) {
@@ -228,7 +261,7 @@ int InternalHalProcessOneHalMapObject(afb_api_t apiHandle, struct InternalHalAls
"maxval", &alsaMap->ctl.alsaCtlCreation->maxval,
"step", &alsaMap->ctl.alsaCtlCreation->step)) {
AFB_API_ERROR(apiHandle, "Parsing error, alsa creation json should only contains [type]|[count]|[minval]|[maxval]|[step] in : '%s'", json_object_get_string(alsaJ));
- return -3;
+ return -6;
}
if(typename) {
@@ -238,7 +271,7 @@ int InternalHalProcessOneHalMapObject(afb_api_t apiHandle, struct InternalHalAls
"Couldn't get alsa type from string %s in : '%s'",
typename,
json_object_get_string(alsaJ));
- return -4;
+ return -7;
}
}
@@ -251,17 +284,17 @@ int InternalHalProcessOneHalMapObject(afb_api_t apiHandle, struct InternalHalAls
alsaMap->ctl.name,
alsaMap->ctl.numid,
json_object_get_string(alsaJ));
- return -5;
+ return -8;
}
else if(! alsaMap->ctl.name && alsaMap->ctl.numid <= 0) {
AFB_API_ERROR(apiHandle,
"Need at least a control name or a control uid in alsa object : '%s'",
json_object_get_string(alsaJ));
- return -6;
+ return -9;
}
if(action)
- alsaMap->actionJ = AlsaMapJ;
+ alsaMap->actionJ = json_object_get(AlsaMapJ);
return 0;
}
@@ -875,11 +908,11 @@ int InternalHalHandleInfoGetResponse(afb_api_t apiHandle, json_object *currentRe
int InternalHalHandleOneHalDependencies(afb_api_t apiHandle, struct InternalHalProbedDevice **halDeviceToProbe)
{
- int ret;
+ int ret, toReturn = 0;
struct InternalHalProbedDevice *currentDeviceToProbe;
- json_object *probedDeviceGetInfoResponseJ;
+ json_object *probedDeviceGetInfoResponseJ = NULL;
if(! apiHandle || ! halDeviceToProbe || ! *halDeviceToProbe) {
AFB_API_ERROR(apiHandle, "Invalid argument(s)");
@@ -916,16 +949,15 @@ int InternalHalHandleOneHalDependencies(afb_api_t apiHandle, struct InternalHalP
ret,
currentDeviceToProbe->uid,
json_object_get_string(probedDeviceGetInfoResponseJ));
- return -5;
+ toReturn = -5;
}
-
- if(ret > 0) {
+ else if(ret > 0) {
AFB_API_WARNING(apiHandle,
"Multiple card was found for dependency with uid '%s'(request : '%s', response : '%s')",
currentDeviceToProbe->uid,
json_object_get_string(currentDeviceToProbe->requestedDeviceJ),
json_object_get_string(probedDeviceGetInfoResponseJ));
- return 1;
+ toReturn = 1;
}
else if(! currentDeviceToProbe->deviceData) {
AFB_API_INFO(apiHandle,
@@ -933,10 +965,13 @@ int InternalHalHandleOneHalDependencies(afb_api_t apiHandle, struct InternalHalP
currentDeviceToProbe->uid,
json_object_get_string(currentDeviceToProbe->requestedDeviceJ),
json_object_get_string(probedDeviceGetInfoResponseJ));
- return 2;
+ toReturn = 2;
}
- return 0;
+ if(probedDeviceGetInfoResponseJ)
+ json_object_put(probedDeviceGetInfoResponseJ);
+
+ return toReturn;
}
int InternalHalHandleHalDependencies(afb_api_t apiHandle,
@@ -982,7 +1017,6 @@ int InternalHalHandleHalDependencies(afb_api_t apiHandle,
return -3;
}
- // If no uid is specified, handle all dependencies
if(validatedDepedency) {
ret = InternalHalHandleOneHalDependencies(apiHandle, &halCurrentDeviceToProbe);
if(ret < 0) {