summaryrefslogtreecommitdiffstats
path: root/src/plugins/VshlCapabilitiesApi.cpp
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2020-01-02 11:03:34 -0500
committerScott Murray <scott.murray@konsulko.com>2020-01-03 15:51:53 +0000
commit93c0d218f4e75e90300735924ca18cab4c79455d (patch)
treee51c9e5e7e794812f50ac4960961fe5c1fa1c157 /src/plugins/VshlCapabilitiesApi.cpp
parent3ddd630bb82160be550f09aefe201f626a3ff2ac (diff)
Fix event JSON reference count issues
It was noticed that vshl-capabilities was triggering the reference count check in json-c and asserting: ../json-c-0.13.1/json_object.c:189: json_object_put: Assertion `jso->_ref_count > 0' failed. Initially, this was only seen once during ad hoc testing, but investigation into using the capabilities events started triggering it reproducibly. The root cause seems to be the capabilities binding reusing the json-c objects it receives from voiceagent events to send out itself. That results in the objects getting json_object_put called on them a second time by the app framework when they're resent. To fix this, call json_object_put on the reused objects to keep their reference count correct and avoid triggering the assert. Bug-AGL: SPEC-3053 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: I533bf492e740509cebd8d3487c9658e175fe73f9 (cherry picked from commit 6fc654713a65a0e72ee592fbd5e177702e33fbca)
Diffstat (limited to 'src/plugins/VshlCapabilitiesApi.cpp')
-rw-r--r--src/plugins/VshlCapabilitiesApi.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/plugins/VshlCapabilitiesApi.cpp b/src/plugins/VshlCapabilitiesApi.cpp
index 78c686f..f581b37 100644
--- a/src/plugins/VshlCapabilitiesApi.cpp
+++ b/src/plugins/VshlCapabilitiesApi.cpp
@@ -160,8 +160,14 @@ CTLP_CAPI(guiMetadataPublish, source, argsJ, eventJ) {
return -1;
}
+ // Bump reference count on payload object since we're reusing it for downstream
+ json_object_get(payloadJ);
if (!sCapabilityMessagingService->publish(guMetadataCapability, action, payloadJ)) {
sLogger->log(Level::ERROR, TAG, "guimetadataPublish: Failed to publish message: " + action);
+ // The publish/forwarder code path returns false when there are no
+ // subscribers, without calling afb_event_push, so need to free
+ // payload to avoid leaking.
+ json_object_put(payloadJ);
return -1;
}
@@ -240,8 +246,14 @@ CTLP_CAPI(phonecontrolPublish, source, argsJ, eventJ) {
return -1;
}
+ // Bump reference count on payload object since we're reusing it for downstream
+ json_object_get(payloadJ);
if (!sCapabilityMessagingService->publish(phoneControlCapability, action, payloadJ)) {
sLogger->log(Level::ERROR, TAG, "phoneControlPublish: Failed to publish message: " + action);
+ // The publish/forwarder code path returns false when there are no
+ // subscribers, without calling afb_event_push, so need to free
+ // payload to avoid leaking.
+ json_object_put(payloadJ);
return -1;
}
@@ -320,8 +332,14 @@ CTLP_CAPI(navigationPublish, source, argsJ, eventJ) {
return -1;
}
+ // Bump reference count on payload object since we're reusing it for downstream
+ json_object_get(payloadJ);
if (!sCapabilityMessagingService->publish(navigationCapability, action, payloadJ)) {
sLogger->log(Level::ERROR, TAG, "navigationPublish: Failed to publish message: " + action);
+ // The publish/forwarder code path returns false when there are no
+ // subscribers, without calling afb_event_push, so need to free
+ // payload to avoid leaking.
+ json_object_put(payloadJ);
return -1;
}
@@ -400,8 +418,14 @@ CTLP_CAPI(playbackControllerPublish, source, argsJ, eventJ) {
return -1;
}
+ // Bump reference count on payload object since we're reusing it for downstream
+ json_object_get(payloadJ);
if (!sCapabilityMessagingService->publish(playbackcontrollerCapability, action, payloadJ)) {
sLogger->log(Level::ERROR, TAG, "playbackControllerPublish: Failed to publish message: " + action);
+ // The publish/forwarder code path returns false when there are no
+ // subscribers, without calling afb_event_push, so need to free
+ // payload to avoid leaking.
+ json_object_put(payloadJ);
return -1;
}