Changeset 48844 in vbox for trunk/src/VBox/Runtime/common
- Timestamp:
- Oct 3, 2013 3:31:32 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 89513
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/zip/xarvfs.cpp
r48843 r48844 143 143 RTFOFF offData; 144 144 /** The size of the archived data. */ 145 uint64_tcbDataArchived;145 RTFOFF cbDataArchived; 146 146 /** The size of the extracted data. */ 147 uint64_tcbDataExtracted;147 RTFOFF cbDataExtracted; 148 148 /** The encoding of the archived ata. */ 149 149 RTZIPXARENCODING enmEncoding; … … 395 395 */ 396 396 static int rtZipXarGetOffsetSizeLengthFromElem(xml::ElementNode const *pElement, 397 PRTFOFF poff, uint64_t *pcbSize, uint64_t *pcbLength)397 PRTFOFF poff, PRTFOFF pcbSize, PRTFOFF pcbLength) 398 398 { 399 399 /* … … 425 425 return VERR_XAR_BAD_SIZE_ELEMENT; 426 426 427 rc = RTStrTo UInt64Full(pszValue, 0, pcbSize);427 rc = RTStrToInt64Full(pszValue, 0, pcbSize); 428 428 if ( RT_FAILURE(rc) 429 429 || rc == VWRN_NUMBER_TOO_BIG 430 || *pcbSize >= UINT64_MAX / 2 /* prevent overflow casting to RTFOFF_MAX. */) 430 || *pcbSize >= RTFOFF_MAX - _1M 431 || *pcbSize < 0) 431 432 return VERR_XAR_BAD_SIZE_ELEMENT; 432 433 AssertCompile(RTFOFF_MAX == UINT64_MAX / 2); … … 446 447 return VERR_XAR_BAD_LENGTH_ELEMENT; 447 448 448 rc = RTStrTo UInt64Full(pszValue, 0, pcbLength);449 rc = RTStrToInt64Full(pszValue, 0, pcbLength); 449 450 if ( RT_FAILURE(rc) 450 451 || rc == VWRN_NUMBER_TOO_BIG 451 || *pcbLength >= UINT64_MAX / 2 /* prevent overflow casting to RTFOFF_MAX. */) 452 || *pcbLength >= RTFOFF_MAX - _1M 453 || *pcbLength < 0) 452 454 return VERR_XAR_BAD_LENGTH_ELEMENT; 453 455 AssertCompile(RTFOFF_MAX == UINT64_MAX / 2); … … 840 842 if (off == -1) 841 843 off = pThis->offCurPos; 842 if (off < 0 || off > (RTFOFF)pThis->DataAttr.cbDataArchived)844 if (off < 0 || off > pThis->DataAttr.cbDataArchived) 843 845 return VERR_EOF; 844 846 if (pThis->fEndOfStream) 845 847 { 846 if (off >= (RTFOFF)pThis->DataAttr.cbDataArchived)848 if (off >= pThis->DataAttr.cbDataArchived) 847 849 return pcbRead ? VINF_EOF : VERR_EOF; 848 850 if (!pThis->fSeekable) … … 852 854 853 855 size_t cbToRead = pSgBuf->paSegs[0].cbSeg; 854 uint64_t cbLeft = (uint64_t)(pThis->DataAttr.cbDataArchived - off);856 uint64_t cbLeft = pThis->DataAttr.cbDataArchived - off; 855 857 if (cbToRead > cbLeft) 856 858 { … … 897 899 * Check for end of stream, also check the hash. 898 900 */ 899 if (pThis->offCurPos >= (RTFOFF)pThis->DataAttr.cbDataArchived)901 if (pThis->offCurPos >= pThis->DataAttr.cbDataArchived) 900 902 { 901 903 Assert(pThis->offCurPos == pThis->DataAttr.cbDataArchived); … … 904 906 /* Check hash. */ 905 907 if ( pThis->uHashState == RTZIPXAR_HASH_PENDING 906 && pThis->cbDigested == (RTFOFF)pThis->DataAttr.cbDataArchived)908 && pThis->cbDigested == pThis->DataAttr.cbDataArchived) 907 909 { 908 910 RTZIPXARHASHDIGEST Digest; … … 1082 1084 if (offSeek < 0) 1083 1085 offSeek = 0; 1084 else if (offSeek > (RTFOFF)pThis->Ios.DataAttr.cbDataArchived)1086 else if (offSeek > pThis->Ios.DataAttr.cbDataArchived) 1085 1087 offSeek = pThis->Ios.DataAttr.cbDataArchived; 1086 1088 1087 1089 /* Apply and return. */ 1088 pThis->Ios.fEndOfStream = (offSeek >= (RTFOFF)pThis->Ios.DataAttr.cbDataArchived);1090 pThis->Ios.fEndOfStream = (offSeek >= pThis->Ios.DataAttr.cbDataArchived); 1089 1091 pThis->Ios.offCurPos = offSeek; 1090 1092 if (poffActual) … … 1191 1193 * Enforce the cbDataExtracted limit. 1192 1194 */ 1193 if (pThis->offCurPos > (RTFOFF)pThis->pIosRaw->DataAttr.cbDataExtracted)1195 if (pThis->offCurPos > pThis->pIosRaw->DataAttr.cbDataExtracted) 1194 1196 return VERR_XAR_EXTRACTED_SIZE_EXCEEDED; 1195 1197 … … 1213 1215 if (rc == VINF_EOF) 1214 1216 { 1215 if (pThis->offCurPos == (RTFOFF)pThis->pIosRaw->DataAttr.cbDataExtracted)1217 if (pThis->offCurPos == pThis->pIosRaw->DataAttr.cbDataExtracted) 1216 1218 { 1217 1219 if (pThis->uHashState == RTZIPXAR_HASH_PENDING) … … 1237 1239 if (RT_SUCCESS(rc)) 1238 1240 { 1239 if ( pThis->pIosRaw->offCurPos < (RTFOFF)pThis->pIosRaw->DataAttr.cbDataArchived1241 if ( pThis->pIosRaw->offCurPos < pThis->pIosRaw->DataAttr.cbDataArchived 1240 1242 || pThis->pIosRaw->uHashState == RTZIPXAR_HASH_PENDING) 1241 1243 rc = VERR_XAR_UNUSED_ARCHIVED_DATA; … … 1812 1814 { 1813 1815 RTFOFF offChecksum; 1814 uint64_tcbChecksum;1816 RTFOFF cbChecksum; 1815 1817 rc = rtZipXarGetOffsetSizeLengthFromElem(pChecksumElem, &offChecksum, &cbChecksum, NULL); 1816 1818 if (RT_FAILURE(rc)) 1817 1819 return rc; 1818 if (cbChecksum != pThis->cbHashDigest)1820 if (cbChecksum != (RTFOFF)pThis->cbHashDigest) 1819 1821 return VERR_XAR_BAD_DIGEST_LENGTH; 1820 1822 if (offChecksum != 0 && pThis->hVfsFile == NIL_RTVFSFILE) … … 1822 1824 1823 1825 RTZIPXARHASHDIGEST StoredDigest; 1824 rc = RTVfsIoStrmReadAt(pThis->hVfsIos, pThis->offZero + offChecksum, &StoredDigest, cbChecksum,1826 rc = RTVfsIoStrmReadAt(pThis->hVfsIos, pThis->offZero + offChecksum, &StoredDigest, pThis->cbHashDigest, 1825 1827 true /*fBlocking*/, NULL /*pcbRead*/); 1826 1828 if (RT_FAILURE(rc))
Note:
See TracChangeset
for help on using the changeset viewer.