Remember hex type to support MBR creation.

Before this patch, requesting a code like "0x0c00" would be flattened
to "0x0700" because it was translated through the GUID type table.

Callers creating MBR tables expect these codes to flow through without
this fidelity loss.  To support this, we stash away any provided hex
type and return it instead of doing a lookup.

Test: cts-tradefed run commandAndExit cts-dev --abi armeabi-v7a -m CtsAppSecurityHostTestCases -t android.appsecurity.cts.AdoptableHostTest
Bug: 63735902
Change-Id: If61407960c9ad1050e5f9031617d71d68f7820b4
diff --git a/gptcl.cc b/gptcl.cc
index 9834788..f80db25 100644
--- a/gptcl.cc
+++ b/gptcl.cc
@@ -364,6 +364,8 @@
                   if (partNum < 0)
                      partNum = newPartNum;
                   if ((partNum >= 0) && (partNum < (int) GetNumParts())) {
+                     // Remember the original hex value requested
+                     typeRaw[partNum] = GetString(typeCode, 2);
                      typeHelper = GetString(typeCode, 2);
                      if ((typeHelper != (GUIDData) "00000000-0000-0000-0000-000000000000") &&
                          (ChangePartType(partNum, typeHelper))) {
@@ -494,6 +496,14 @@
                                    operator[](origPartNum).GetLengthLBA());
                newPart.SetStatus(0);
                newPart.SetType((uint8_t)(operator[](origPartNum).GetHexType() / 0x0100));
+               // If we were created with a specific hex type, use that instead
+               // of risking fidelity loss by doing a GUID-based lookup
+               if (typeRaw.count(origPartNum) == 1) {
+                  string raw = typeRaw[origPartNum];
+                  if (raw.size() == 4) {
+                     newPart.SetType(StrToHex(raw, 0));
+                  }
+               }
                newMBR.AddPart(i + isHybrid, newPart);
             } else {
                cerr << "Original partition " << origPartNum + 1 << " does not exist or is too big! Aborting operation!\n";