Rewrite conversion from UUID to string 46/180946/1
authorIgor Kotrasinski <i.kotrasinsk@partner.samsung.com>
Wed, 6 Jun 2018 11:44:48 +0000 (13:44 +0200)
committerIgor Kotrasinski <i.kotrasinsk@partner.samsung.com>
Wed, 6 Jun 2018 12:47:23 +0000 (14:47 +0200)
Fixes an issue with strtol not specifying base and makes all conversions use
std functions.

Change-Id: I3e525f3a58ab40d768357ebb6cca77224885cdab
Signed-off-by: Igor Kotrasinski <i.kotrasinsk@partner.samsung.com>
TEEStub/PropertyAccess/PropertyUtility.cpp

index d7dfec94e734190dc50a7e3d5465f2150e06c245..e16874cfae063229013d9265c5f8eeec70cf2f78 100644 (file)
@@ -109,44 +109,24 @@ TEE_Result PropertyUtility::convertToU32(const PropertyValue& in,
  */\r
 TEE_Result PropertyUtility::convertToUUID(const PropertyValue& in,\r
     TEE_UUID& out) {\r
-       TEE_UUID uuid;\r
-       TEE_Result returnValue = TEE_SUCCESS;\r
-       if ("uuid" == in.type) {\r
-               // Split UUID string into tokens\r
+       if ("uuid" != in.type)\r
+               return TEE_ERROR_BAD_FORMAT;\r
+       try {\r
                string text = in.value;\r
-\r
-               string tokensString[8];\r
-               int i = 0;\r
-               for (i = 0; i < 8; i++) {\r
-                       tokensString[i] = text.substr(4*i, 4);\r
+               out.timeLow = std::stoul(text.substr(0, 8), nullptr, 16);\r
+               out.timeMid = std::stoul(text.substr(8, 4), nullptr, 16);\r
+               out.timeHiAndVersion = std::stoul(text.substr(12, 4), nullptr, 16);\r
+               string clockSeqStr = text.substr(16,16);\r
+               for (int i = 0; i < 8; i++) {\r
+                       out.clockSeqAndNode[i] = std::stoul(clockSeqStr.substr(i * 2, 2),\r
+                                                           nullptr, 16);\r
                }\r
-               // convert each token\r
-               sscanf((tokensString[0] + tokensString[1]).c_str(), "%8x", &uuid.timeLow);\r
-               sscanf(tokensString[2].c_str(), "%4hx", &uuid.timeMid);\r
-               sscanf(tokensString[3].c_str(), "%4hx", &uuid.timeHiAndVersion);\r
-               uint64_t clockSeq;\r
-               string clockSeqStr = tokensString[4] + tokensString[5] + tokensString[6]\r
-                   + tokensString[7];\r
-               clockSeq = std::stoll(clockSeqStr);\r
-               memcpy(uuid.clockSeqAndNode, &clockSeq, sizeof(uint64_t));\r
-               // Change endian-ness\r
-               uint8_t temp[4];\r
-               temp[0] = uuid.clockSeqAndNode[0];\r
-               temp[1] = uuid.clockSeqAndNode[1];\r
-               temp[2] = uuid.clockSeqAndNode[2];\r
-               temp[3] = uuid.clockSeqAndNode[3];\r
-               uuid.clockSeqAndNode[0] = uuid.clockSeqAndNode[7];\r
-               uuid.clockSeqAndNode[1] = uuid.clockSeqAndNode[6];\r
-               uuid.clockSeqAndNode[2] = uuid.clockSeqAndNode[5];\r
-               uuid.clockSeqAndNode[3] = uuid.clockSeqAndNode[4];\r
-               uuid.clockSeqAndNode[4] = temp[3];\r
-               uuid.clockSeqAndNode[5] = temp[2];\r
-               uuid.clockSeqAndNode[6] = temp[1];\r
-               uuid.clockSeqAndNode[7] = temp[0];\r
-               out = uuid;\r
+       } catch (std::invalid_argument) {\r
+               return TEE_ERROR_BAD_FORMAT;\r
+       } catch (std::out_of_range) {\r
+               return TEE_ERROR_BAD_FORMAT;\r
        }\r
-       else returnValue = TEE_ERROR_BAD_FORMAT;\r
-       return returnValue;\r
+       return TEE_SUCCESS;\r
 }\r
 \r
 // TODO: If UUID exists need to append that to identity\r