ContextHubService: Maintain hub result meaning

We're squeezing a 4-byte signed value to 1-byte.  The naive
(implicit) cast we were using could flip this value from positive
to negative, or vice versa, and completely change the meaning
of the result.

API freeze prevents us from fixing this properly at the moment,
but we use a less naive approach to truncate this value, maintaining
its meaning and logging when we've changed the value.

Bug:30829863
Change-Id: I0e80af9b192066fdf36fee565a4587eb75a5ea7b
This commit is contained in:
Greg Kaiser
2016-08-17 16:44:14 -07:00
parent 4ecc9d2db4
commit 6d9e7f669a

View File

@@ -584,7 +584,32 @@ static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType,
header[HEADER_FIELD_HUB_HANDLE] = hubHandle;
header[HEADER_FIELD_APP_INSTANCE] = OS_APP_ID;
msg[0] = rsp->result;
// Due to API constraints, at the moment we can't change the fact that
// we're changing our 4-byte response to a 1-byte value. But we can prevent
// the possible change in sign (and thus meaning) that would happen from
// a naive cast. Further, we can log when we're losing part of the value.
// TODO(b/30918279): Don't truncate this result.
int8_t truncatedResult;
bool neededToTruncate;
if (rsp->result < INT8_MIN) {
neededToTruncate = true;
truncatedResult = INT8_MIN;
} else if (rsp->result > INT8_MAX) {
neededToTruncate = true;
truncatedResult = INT8_MAX;
} else {
neededToTruncate = false;
// Since this value fits within an int8_t, this is a safe cast which
// won't change the value or sign.
truncatedResult = static_cast<int8_t>(rsp->result);
}
if (neededToTruncate) {
ALOGW("Response from Context Hub truncated. Value was %" PRId32
", but giving Java layer %" PRId8,
rsp->result, (int)truncatedResult);
}
msg[0] = truncatedResult;
if (additionalData) {
memcpy(&msg[1], additionalData, additionalDataLen);