diff options
author | Jeff Sharkey <jsharkey@android.com> | 2018-03-27 13:17:19 -0600 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2018-03-27 13:19:51 -0600 |
commit | 9c50b5e176b95034b54d04856388ac3be6132076 (patch) | |
tree | cb5aace965dfdc6bc506df908b473cdf2b676e21 | |
parent | fe263b2505fe71584149874ee8a441149676bd9a (diff) | |
download | gptfdisk-pie-qpr1-s3-release.tar.gz |
Parse hex code immediately to avoid SIGBUS.android-wear-9.0.0_r9android-wear-9.0.0_r8android-wear-9.0.0_r7android-wear-9.0.0_r6android-wear-9.0.0_r5android-wear-9.0.0_r4android-wear-9.0.0_r3android-wear-9.0.0_r24android-wear-9.0.0_r21android-wear-9.0.0_r20android-wear-9.0.0_r2android-wear-9.0.0_r19android-wear-9.0.0_r18android-wear-9.0.0_r17android-wear-9.0.0_r16android-wear-9.0.0_r15android-wear-9.0.0_r14android-wear-9.0.0_r13android-wear-9.0.0_r12android-wear-9.0.0_r11android-wear-9.0.0_r10android-p-preview-3android-p-preview-2android-9.0.0_r47android-9.0.0_r46android-9.0.0_r45android-9.0.0_r44android-9.0.0_r43android-9.0.0_r42android-9.0.0_r41android-9.0.0_r40android-9.0.0_r39android-9.0.0_r38android-9.0.0_r37android-9.0.0_r36android-9.0.0_r35android-9.0.0_r34android-9.0.0_r33android-9.0.0_r32android-9.0.0_r31android-9.0.0_r30android-9.0.0_r22android-9.0.0_r21android-9.0.0_r20android-9.0.0_r19android-9.0.0_r16android-9.0.0_r12android-9.0.0_r11pie-qpr3-s1-releasepie-qpr3-releasepie-qpr3-b-releasepie-qpr2-releasepie-qpr1-s3-releasepie-qpr1-s2-releasepie-qpr1-s1-releasepie-qpr1-releasepie-dr1-releasepie-dr1-devpie-devpie-b4s4-releasepie-b4s4-devp-preview-2
On 32-bit devices we trigger SIGBUS by trying to copy around the
std::string, so parse it immediately to avoid trouble.
Test: manual with 32-bit binary
Bug: 73961200
Change-Id: I32028fd18a00f3a40d380145cb7a7874b758f5c4
-rw-r--r-- | gptcl.cc | 10 | ||||
-rw-r--r-- | gptcl.h | 2 |
2 files changed, 6 insertions, 6 deletions
@@ -365,7 +365,10 @@ int GPTDataCL::DoOptions(int argc, char* argv[]) { partNum = newPartNum; if ((partNum >= 0) && (partNum < (int) GetNumParts())) { // Remember the original hex value requested - typeRaw[partNum] = GetString(typeCode, 2); + string raw = GetString(typeCode, 2); + if (raw.size() == 4) { + typeRaw[partNum] = StrToHex(raw, 0); + } typeHelper = GetString(typeCode, 2); if ((typeHelper != (GUIDData) "00000000-0000-0000-0000-000000000000") && (ChangePartType(partNum, typeHelper))) { @@ -499,10 +502,7 @@ int GPTDataCL::BuildMBR(char* argument, int isHybrid) { // 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)); - } + newPart.SetType(typeRaw[origPartNum]); } newMBR.AddPart(i + isHybrid, newPart); } else { @@ -37,7 +37,7 @@ class GPTDataCL : public GPTData { int alignment, deletePartNum, infoPartNum, largestPartNum, bsdPartNum; uint32_t tableSize; poptContext poptCon; - std::map<int, string> typeRaw; + std::map<int, char> typeRaw; int BuildMBR(char* argument, int isHybrid); public: |