Changeset 67391 in vbox for trunk/src/VBox/Runtime/common/fs/iso9660vfs.cpp
- Timestamp:
- Jun 14, 2017 12:13:48 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/fs/iso9660vfs.cpp
r67334 r67391 1657 1657 } 1658 1658 1659 /** Logging helper. */ 1660 static char *rtFsIso9660VolGetMaybeUtf16Be(const char *pachField, size_t cchField, char *pszDst, size_t cbDst) 1661 { 1662 /* Check the format by looking for zero bytes. ISO-9660 doesn't allow zeros. 1663 This doesn't have to be a UTF-16BE string. */ 1664 size_t cFirstZeros = 0; 1665 size_t cSecondZeros = 0; 1666 for (size_t off = 0; off < cchField; off += 2) 1667 { 1668 cFirstZeros += pachField[off] == '\0'; 1669 cSecondZeros += pachField[off + 1] == '\0'; 1670 } 1671 1672 int rc = VINF_SUCCESS; 1673 char *pszTmp = &pszDst[10]; 1674 size_t cchRet = 0; 1675 if (cFirstZeros > cSecondZeros) 1676 { 1677 /* UTF-16BE / UTC-2BE: */ 1678 if (cchField & 1) 1679 { 1680 if (pachField[cchField - 1] == '\0' || pachField[cchField - 1] == ' ') 1681 cchField--; 1682 else 1683 rc = VERR_INVALID_UTF16_ENCODING; 1684 } 1685 if (RT_SUCCESS(rc)) 1686 { 1687 while ( cchField >= 2 1688 && pachField[cchField - 1] == ' ' 1689 && pachField[cchField - 2] == '\0') 1690 cchField -= 2; 1691 1692 rc = RTUtf16BigToUtf8Ex((PCRTUTF16)pachField, cchField / sizeof(RTUTF16), &pszTmp, cbDst - 10 - 1, &cchRet); 1693 } 1694 if (RT_SUCCESS(rc)) 1695 { 1696 pszDst[0] = 'U'; 1697 pszDst[1] = 'T'; 1698 pszDst[2] = 'F'; 1699 pszDst[3] = '-'; 1700 pszDst[4] = '1'; 1701 pszDst[5] = '6'; 1702 pszDst[6] = 'B'; 1703 pszDst[7] = 'E'; 1704 pszDst[8] = ':'; 1705 pszDst[9] = '\''; 1706 pszDst[10 + cchRet] = '\''; 1707 pszDst[10 + cchRet + 1] = '\0'; 1708 } 1709 else 1710 RTStrPrintf(pszDst, cbDst, "UTF-16BE: %.*Rhxs", cchField, pachField); 1711 } 1712 else if (cSecondZeros > 0) 1713 { 1714 /* Little endian UTF-16 / UCS-2 (ASSUMES host is little endian, sorry) */ 1715 if (cchField & 1) 1716 { 1717 if (pachField[cchField - 1] == '\0' || pachField[cchField - 1] == ' ') 1718 cchField--; 1719 else 1720 rc = VERR_INVALID_UTF16_ENCODING; 1721 } 1722 if (RT_SUCCESS(rc)) 1723 { 1724 while ( cchField >= 2 1725 && pachField[cchField - 1] == '\0' 1726 && pachField[cchField - 2] == ' ') 1727 cchField -= 2; 1728 1729 rc = RTUtf16ToUtf8Ex((PCRTUTF16)pachField, cchField / sizeof(RTUTF16), &pszTmp, cbDst - 10 - 1, &cchRet); 1730 } 1731 if (RT_SUCCESS(rc)) 1732 { 1733 pszDst[0] = 'U'; 1734 pszDst[1] = 'T'; 1735 pszDst[2] = 'F'; 1736 pszDst[3] = '-'; 1737 pszDst[4] = '1'; 1738 pszDst[5] = '6'; 1739 pszDst[6] = 'L'; 1740 pszDst[7] = 'E'; 1741 pszDst[8] = ':'; 1742 pszDst[9] = '\''; 1743 pszDst[10 + cchRet] = '\''; 1744 pszDst[10 + cchRet + 1] = '\0'; 1745 } 1746 else 1747 RTStrPrintf(pszDst, cbDst, "UTF-16LE: %.*Rhxs", cchField, pachField); 1748 } 1749 else 1750 { 1751 /* ASSUME UTF-8/ASCII. */ 1752 while ( cchField > 0 1753 && pachField[cchField - 1] == ' ') 1754 cchField--; 1755 int rc = RTStrValidateEncodingEx(pachField, cchField, RTSTR_VALIDATE_ENCODING_EXACT_LENGTH); 1756 if (RT_SUCCESS(rc)) 1757 RTStrPrintf(pszDst, cbDst, "UTF-8: '%.*s'", cchField, pachField); 1758 else 1759 RTStrPrintf(pszDst, cbDst, "UNK-8: %.*Rhxs", cchField, pachField); 1760 } 1761 return pszDst; 1762 } 1763 1659 1764 1660 1765 /** … … 1667 1772 if (LogIs2Enabled()) 1668 1773 { 1774 char szTmp[384]; 1669 1775 Log2(("ISO9660: fVolumeFlags: %#RX8\n", pVolDesc->fVolumeFlags)); 1670 Log2(("ISO9660: achSystemId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achSystemId, sizeof(pVolDesc->achSystemId)), pVolDesc->achSystemId));1671 Log2(("ISO9660: achVolumeId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achVolumeId, sizeof(pVolDesc->achVolumeId)), pVolDesc->achVolumeId));1776 Log2(("ISO9660: achSystemId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achSystemId, sizeof(pVolDesc->achSystemId), szTmp, sizeof(szTmp)) )); 1777 Log2(("ISO9660: achVolumeId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achVolumeId, sizeof(pVolDesc->achVolumeId), szTmp, sizeof(szTmp)) )); 1672 1778 Log2(("ISO9660: Unused73: {%#RX32,%#RX32}\n", RT_BE2H_U32(pVolDesc->Unused73.be), RT_LE2H_U32(pVolDesc->Unused73.le))); 1673 1779 Log2(("ISO9660: VolumeSpaceSize: {%#RX32,%#RX32}\n", RT_BE2H_U32(pVolDesc->VolumeSpaceSize.be), RT_LE2H_U32(pVolDesc->VolumeSpaceSize.le))); … … 1681 1787 Log2(("ISO9660: offTypeMPathTable: %#RX32\n", RT_BE2H_U32(pVolDesc->offTypeMPathTable))); 1682 1788 Log2(("ISO9660: offOptionalTypeMPathTable: %#RX32\n", RT_BE2H_U32(pVolDesc->offOptionalTypeMPathTable))); 1683 Log2(("ISO9660: achVolumeSetId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achVolumeSetId, sizeof(pVolDesc->achVolumeSetId)), pVolDesc->achVolumeSetId));1684 Log2(("ISO9660: achPublisherId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achPublisherId, sizeof(pVolDesc->achPublisherId)), pVolDesc->achPublisherId));1685 Log2(("ISO9660: achDataPreparerId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achDataPreparerId, sizeof(pVolDesc->achDataPreparerId)), pVolDesc->achDataPreparerId));1686 Log2(("ISO9660: achApplicationId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achApplicationId, sizeof(pVolDesc->achApplicationId)), pVolDesc->achApplicationId));1687 Log2(("ISO9660: achCopyrightFileId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achCopyrightFileId, sizeof(pVolDesc->achCopyrightFileId)), pVolDesc->achCopyrightFileId));1688 Log2(("ISO9660: achAbstractFileId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achAbstractFileId, sizeof(pVolDesc->achAbstractFileId)), pVolDesc->achAbstractFileId));1689 Log2(("ISO9660: achBibliographicFileId: '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achBibliographicFileId, sizeof(pVolDesc->achBibliographicFileId)), pVolDesc->achBibliographicFileId));1789 Log2(("ISO9660: achVolumeSetId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achVolumeSetId, sizeof(pVolDesc->achVolumeSetId), szTmp, sizeof(szTmp)) )); 1790 Log2(("ISO9660: achPublisherId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achPublisherId, sizeof(pVolDesc->achPublisherId), szTmp, sizeof(szTmp)) )); 1791 Log2(("ISO9660: achDataPreparerId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achDataPreparerId, sizeof(pVolDesc->achDataPreparerId), szTmp, sizeof(szTmp)) )); 1792 Log2(("ISO9660: achApplicationId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achApplicationId, sizeof(pVolDesc->achApplicationId), szTmp, sizeof(szTmp)) )); 1793 Log2(("ISO9660: achCopyrightFileId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achCopyrightFileId, sizeof(pVolDesc->achCopyrightFileId), szTmp, sizeof(szTmp)) )); 1794 Log2(("ISO9660: achAbstractFileId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achAbstractFileId, sizeof(pVolDesc->achAbstractFileId), szTmp, sizeof(szTmp)) )); 1795 Log2(("ISO9660: achBibliographicFileId: %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achBibliographicFileId, sizeof(pVolDesc->achBibliographicFileId), szTmp, sizeof(szTmp)) )); 1690 1796 Log2(("ISO9660: BirthTime: %.4s-%.2s-%.2s %.2s:%.2s:%.2s.%.2s%+03d\n", 1691 1797 pVolDesc->BirthTime.achYear,
Note:
See TracChangeset
for help on using the changeset viewer.