aboutsummaryrefslogtreecommitdiffstats
path: root/src
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-02 16:05:19 -0500
commit6fc654713a65a0e72ee592fbd5e177702e33fbca (patch)
tree93fe30f9a8c59f3e09c457237c9a0f1ffcade400 /src
parentbad0a516cd461f5a5385da841858504b67ee5832 (diff)
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
Diffstat (limited to 'src')
-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;
}