|
From 7c99ef8bfa024f11452311c36329eeeeece4fd74 Mon Sep 17 00:00:00 2001
|
|
From: Hauke Mehrtens <hauke.mehrtens@intel.com>
|
|
Date: Wed, 22 Jun 2016 11:41:43 +0200
|
|
Subject: [PATCH] Fix memory corruption when reading inetgers from cbor
|
|
|
|
When the cbor_value_get_*() function is called with a pointer to some int, it
|
|
should have the correct size. When we cast it to something else it is treated
|
|
as a pointer to an uint64_t in the function for example and them 64 bits gets
|
|
written to memory even with the real type is only 32 bit long. When the real
|
|
type is only 32 bit long some other memory gets overwritten. On Big endian
|
|
systems the least significant bits are cut of so in most cases 0 is read.
|
|
|
|
With this patch a value cast is used and the value is converted to the other size.
|
|
|
|
This is the same as in commit 0d64c7c95a5c11a9fb5201e729fd8c75da210c80
|
|
"security: fix reading of permission attribute from configuration"
|
|
|
|
Change-Id: If5965491241e25ebf60a22dc45d37d74a33cb02f
|
|
Signed-off-by: Hauke Mehrtens <hauke.mehrtens@intel.com>
|
|
---
|
|
resource/csdk/security/src/pconfresource.c | 5 ++++-
|
|
resource/csdk/stack/src/ocpayloadparse.c | 19 +++++++++++++++----
|
|
2 files changed, 19 insertions(+), 5 deletions(-)
|
|
|
|
--- a/resource/csdk/security/src/pconfresource.c
|
|
+++ b/resource/csdk/security/src/pconfresource.c
|
|
@@ -507,8 +507,11 @@ OCStackResult CBORPayloadToPconf(const u
|
|
|
|
while (cbor_value_is_valid(&prm))
|
|
{
|
|
- cborFindResult = cbor_value_get_int(&prm, (int *)&pconf->prm[i++]);
|
|
+ int prm_val;
|
|
+
|
|
+ cborFindResult = cbor_value_get_int(&prm, &prm_val);
|
|
VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
|
|
+ pconf->prm[i++] = (OicSecPrm_t)prm_val;
|
|
cborFindResult = cbor_value_advance(&prm);
|
|
VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance value");
|
|
}
|
|
--- a/resource/csdk/stack/src/ocpayloadparse.c
|
|
+++ b/resource/csdk/stack/src/ocpayloadparse.c
|
|
@@ -287,6 +287,8 @@ static OCStackResult OCParseDiscoveryPay
|
|
|
|
while (cbor_value_is_map(&resourceMap))
|
|
{
|
|
+ int bitmap;
|
|
+
|
|
resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload));
|
|
VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload");
|
|
|
|
@@ -319,8 +321,9 @@ static OCStackResult OCParseDiscoveryPay
|
|
// Bitmap
|
|
err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &curVal);
|
|
VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap tag");
|
|
- err = cbor_value_get_int(&curVal, (int *)&resource->bitmap);
|
|
+ err = cbor_value_get_int(&curVal, &bitmap);
|
|
VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap value");
|
|
+ resource->bitmap = (uint8_t)bitmap;
|
|
|
|
// Secure Flag
|
|
err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &curVal);
|
|
@@ -336,8 +339,11 @@ static OCStackResult OCParseDiscoveryPay
|
|
VERIFY_CBOR_SUCCESS(TAG, err, "to find port tag");
|
|
if (cbor_value_is_valid(&curVal))
|
|
{
|
|
- err = cbor_value_get_int(&curVal, (int *)&resource->port);
|
|
+ int port;
|
|
+
|
|
+ err = cbor_value_get_int(&curVal, &port);
|
|
VERIFY_CBOR_SUCCESS(TAG, err, "to find port value");
|
|
+ resource->port = (uint16_t)port;
|
|
}
|
|
|
|
err = cbor_value_advance(&resourceMap);
|
|
@@ -1170,6 +1176,7 @@ static OCStackResult OCParsePresencePayl
|
|
{
|
|
CborValue curVal;
|
|
uint64_t temp = 0;
|
|
+ uint8_t trigger;
|
|
|
|
// Sequence Number
|
|
CborError err = cbor_value_map_find_value(rootValue, OC_RSRVD_NONCE, &curVal);
|
|
@@ -1189,8 +1196,9 @@ static OCStackResult OCParsePresencePayl
|
|
// Trigger
|
|
err = cbor_value_map_find_value(rootValue, OC_RSRVD_TRIGGER, &curVal);
|
|
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding trigger tag");
|
|
- err = cbor_value_get_simple_type(&curVal, (uint8_t *)&payload->trigger);
|
|
+ err = cbor_value_get_simple_type(&curVal, &trigger);
|
|
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding trigger value");
|
|
+ payload->trigger = (OCPresenceTrigger)trigger;
|
|
|
|
// Resource type name
|
|
err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &curVal);
|