From cd082cd8e3ee952b136997841a1011cc2fa97387 Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Fri, 22 Mar 2013 11:17:10 +0900 Subject: [PATCH] Fix uses of ulong where 32-bit integers are expected --- taglib/asf/asffile.cpp | 2 +- taglib/it/itfile.cpp | 8 +++--- taglib/mod/modfilebase.cpp | 12 ++++----- taglib/mod/modfilebase.h | 12 ++++----- taglib/mod/modfileprivate.h | 12 ++++----- taglib/mpc/mpcproperties.cpp | 2 +- taglib/toolkit/taglib.h | 27 +++++++++++++++++++++ taglib/xm/xmfile.cpp | 47 ++++++++++++++++++------------------ 8 files changed, 74 insertions(+), 48 deletions(-) diff --git a/taglib/asf/asffile.cpp b/taglib/asf/asffile.cpp index a62f2504..6ddf1f9b 100644 --- a/taglib/asf/asffile.cpp +++ b/taglib/asf/asffile.cpp @@ -553,7 +553,7 @@ bool ASF::File::save() data.append(d->objects[i]->render(this)); } data = headerGuid + ByteVector::fromLongLong(data.size() + 30, false) + ByteVector::fromUInt(d->objects.size(), false) + ByteVector("\x01\x02", 2) + data; - insert(data, 0, (TagLib::ulong)d->size); + insert(data, 0, (uint)d->size); return true; } diff --git a/taglib/it/itfile.cpp b/taglib/it/itfile.cpp index af1891bb..cc466582 100644 --- a/taglib/it/itfile.cpp +++ b/taglib/it/itfile.cpp @@ -99,7 +99,7 @@ bool IT::File::save() StringList lines = d->tag.comment().split("\n"); for(ushort i = 0; i < instrumentCount; ++ i) { seek(192L + length + ((long)i << 2)); - ulong instrumentOffset = 0; + uint instrumentOffset = 0; if(!readU32L(instrumentOffset)) return false; @@ -114,7 +114,7 @@ bool IT::File::save() for(ushort i = 0; i < sampleCount; ++ i) { seek(192L + length + ((long)instrumentCount << 2) + ((long)i << 2)); - ulong sampleOffset = 0; + uint sampleOffset = 0; if(!readU32L(sampleOffset)) return false; @@ -141,13 +141,13 @@ bool IT::File::save() ushort special = 0; ushort messageLength = 0; - ulong messageOffset = 0; + uint messageOffset = 0; seek(46); if(!readU16L(special)) return false; - ulong fileSize = static_cast(File::length()); + uint fileSize = static_cast(File::length()); if(special & Properties::MessageAttached) { seek(54); if(!readU16L(messageLength) || !readU32L(messageOffset)) diff --git a/taglib/mod/modfilebase.cpp b/taglib/mod/modfilebase.cpp index e074dac8..0d19aa89 100644 --- a/taglib/mod/modfilebase.cpp +++ b/taglib/mod/modfilebase.cpp @@ -33,14 +33,14 @@ Mod::FileBase::FileBase(IOStream *stream) : TagLib::File(stream) { } -void Mod::FileBase::writeString(const String &s, ulong size, char padding) +void Mod::FileBase::writeString(const String &s, uint size, char padding) { ByteVector data(s.data(String::Latin1)); data.resize(size, padding); writeBlock(data); } -bool Mod::FileBase::readString(String &s, ulong size) +bool Mod::FileBase::readString(String &s, uint size) { ByteVector data(readBlock(size)); if(data.size() < size) return false; @@ -66,7 +66,7 @@ void Mod::FileBase::writeU16L(ushort number) writeBlock(ByteVector::fromShort(number, false)); } -void Mod::FileBase::writeU32L(ulong number) +void Mod::FileBase::writeU32L(uint number) { writeBlock(ByteVector::fromUInt(number, false)); } @@ -76,7 +76,7 @@ void Mod::FileBase::writeU16B(ushort number) writeBlock(ByteVector::fromShort(number, true)); } -void Mod::FileBase::writeU32B(ulong number) +void Mod::FileBase::writeU32B(uint number) { writeBlock(ByteVector::fromUInt(number, true)); } @@ -97,7 +97,7 @@ bool Mod::FileBase::readU16L(ushort &number) return true; } -bool Mod::FileBase::readU32L(ulong &number) { +bool Mod::FileBase::readU32L(uint &number) { ByteVector data(readBlock(4)); if(data.size() < 4) return false; number = data.toUInt(false); @@ -112,7 +112,7 @@ bool Mod::FileBase::readU16B(ushort &number) return true; } -bool Mod::FileBase::readU32B(ulong &number) { +bool Mod::FileBase::readU32B(uint &number) { ByteVector data(readBlock(4)); if(data.size() < 4) return false; number = data.toUInt(true); diff --git a/taglib/mod/modfilebase.h b/taglib/mod/modfilebase.h index 383bde11..9a919a04 100644 --- a/taglib/mod/modfilebase.h +++ b/taglib/mod/modfilebase.h @@ -40,19 +40,19 @@ namespace TagLib { FileBase(FileName file); FileBase(IOStream *stream); - void writeString(const String &s, ulong size, char padding = 0); + void writeString(const String &s, uint size, char padding = 0); void writeByte(uchar byte); void writeU16L(ushort number); - void writeU32L(ulong number); + void writeU32L(uint number); void writeU16B(ushort number); - void writeU32B(ulong number); + void writeU32B(uint number); - bool readString(String &s, ulong size); + bool readString(String &s, uint size); bool readByte(uchar &byte); bool readU16L(ushort &number); - bool readU32L(ulong &number); + bool readU32L(uint &number); bool readU16B(ushort &number); - bool readU32B(ulong &number); + bool readU32B(uint &number); }; } diff --git a/taglib/mod/modfileprivate.h b/taglib/mod/modfileprivate.h index 19a30019..b06622ec 100644 --- a/taglib/mod/modfileprivate.h +++ b/taglib/mod/modfileprivate.h @@ -37,11 +37,11 @@ setter(number); \ } -#define READ_BYTE(setter) READ(setter,uchar,readByte) +#define READ_BYTE(setter) READ(setter,uchar, readByte) #define READ_U16L(setter) READ(setter,ushort,readU16L) -#define READ_U32L(setter) READ(setter,ulong,readU32L) +#define READ_U32L(setter) READ(setter,uint, readU32L) #define READ_U16B(setter) READ(setter,ushort,readU16B) -#define READ_U32B(setter) READ(setter,ulong,readU32B) +#define READ_U32B(setter) READ(setter,uint, readU32B) #define READ_STRING(setter,size) \ { \ @@ -54,11 +54,11 @@ type name = 0; \ READ_ASSERT(read(name)); -#define READ_BYTE_AS(name) READ_AS(uchar,name,readByte) +#define READ_BYTE_AS(name) READ_AS(uchar, name,readByte) #define READ_U16L_AS(name) READ_AS(ushort,name,readU16L) -#define READ_U32L_AS(name) READ_AS(ulong,name,readU32L) +#define READ_U32L_AS(name) READ_AS(uint, name,readU32L) #define READ_U16B_AS(name) READ_AS(ushort,name,readU16B) -#define READ_U32B_AS(name) READ_AS(ulong,name,readU32B) +#define READ_U32B_AS(name) READ_AS(uint, name,readU32B) #define READ_STRING_AS(name,size) \ String name; \ diff --git a/taglib/mpc/mpcproperties.cpp b/taglib/mpc/mpcproperties.cpp index 85af7cf7..1bc24090 100644 --- a/taglib/mpc/mpcproperties.cpp +++ b/taglib/mpc/mpcproperties.cpp @@ -205,7 +205,7 @@ void MPC::Properties::readSV8(File *file) d->version = data[pos]; pos += 1; d->sampleFrames = readSize(data.mid(pos), pos); - ulong begSilence = readSize(data.mid(pos), pos); + uint begSilence = readSize(data.mid(pos), pos); std::bitset<16> flags(TAGLIB_CONSTRUCT_BITSET(data.mid(pos, 2).toUShort(true))); pos += 2; diff --git a/taglib/toolkit/taglib.h b/taglib/toolkit/taglib.h index 0edd1f00..0338dd56 100755 --- a/taglib/toolkit/taglib.h +++ b/taglib/toolkit/taglib.h @@ -37,6 +37,7 @@ #endif #include +#include #ifdef _WIN32 # if !defined(NOMINMAX) @@ -88,6 +89,30 @@ */ #endif +// Check the widths of integral types. + +#if UCHAR_MAX != 255U +# error TagLib assumes that char is 8-bit wide. +#endif + +#if USHRT_MAX != 65535U +# error TagLib assumes that short is 16-bit wide. +#endif + +#if UINT_MAX != 4294967295U +# error TagLib assumes that int is 32-bit wide. +#endif + +#if !defined(ULLONG_MAX) && !defined(ULONGLONG_MAX) && !defined(ULONG_LONG_MAX) +# error TagLib assumes that long long is 64-bit wide. +#elif defined(ULLONG_MAX) && ULLONG_MAX != 18446744073709551615ULL +# error TagLib assumes that long long is 64-bit wide. +#elif defined(ULONGLONG_MAX) && ULONGLONG_MAX != 18446744073709551615ULL +# error TagLib assumes that long long is 64-bit wide. +#elif defined(ULONG_LONG_MAX) && ULONG_LONG_MAX != 18446744073709551615ULL +# error TagLib assumes that long long is 64-bit wide. +#endif + //! A namespace for all TagLib related classes and functions /*! @@ -106,6 +131,8 @@ namespace TagLib { typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; + + // long/ulong can be either 32-bit or 64-bit wide. typedef unsigned long ulong; // Offset or length type for I/O streams. diff --git a/taglib/xm/xmfile.cpp b/taglib/xm/xmfile.cpp index 5728158a..71a53406 100644 --- a/taglib/xm/xmfile.cpp +++ b/taglib/xm/xmfile.cpp @@ -32,7 +32,6 @@ using namespace TagLib; using namespace XM; using TagLib::uint; using TagLib::ushort; -using TagLib::ulong; /*! * The Reader classes are helpers to make handling of the stripped XM @@ -199,11 +198,11 @@ public: } }; -class U32Reader : public NumberReader +class U32Reader : public NumberReader { public: - U32Reader(ulong &value, bool bigEndian = true) : - NumberReader(value, bigEndian) + U32Reader(uint &value, bool bigEndian = true) : + NumberReader(value, bigEndian) { } @@ -294,7 +293,7 @@ public: * Read a unsigned 32 Bit integer into \a number. The byte order * is controlled by \a bigEndian. */ - StructReader &u32(ulong &number, bool bigEndian) + StructReader &u32(uint &number, bool bigEndian) { m_readers.append(new U32Reader(number, bigEndian)); return *this; @@ -303,7 +302,7 @@ public: /*! * Read a unsigned 32 Bit little endian integer into \a number. */ - StructReader &u32L(ulong &number) + StructReader &u32L(uint &number) { return u32(number, false); } @@ -311,7 +310,7 @@ public: /*! * Read a unsigned 32 Bit big endian integer into \a number. */ - StructReader &u32B(ulong &number) + StructReader &u32B(uint &number) { return u32(number, true); } @@ -398,7 +397,7 @@ bool XM::File::save() seek(1, Current); writeString(d->tag.trackerName(), 20); seek(2, Current); - ulong headerSize = 0; + uint headerSize = 0; if(!readU32L(headerSize)) return false; seek(2+2+2, Current); @@ -412,7 +411,7 @@ bool XM::File::save() // need to read patterns again in order to seek to the instruments: for(ushort i = 0; i < patternCount; ++ i) { - ulong patternHeaderLength = 0; + uint patternHeaderLength = 0; if(!readU32L(patternHeaderLength) || patternHeaderLength < 4) return false; @@ -421,7 +420,7 @@ bool XM::File::save() pattern.skip(3).u16L(dataSize); uint count = pattern.read(*this, patternHeaderLength - 4U); - if(count != std::min(patternHeaderLength - 4U, (ulong)pattern.size())) + if(count != std::min(patternHeaderLength - 4U, pattern.size())) return false; seek(patternHeaderLength - (4 + count) + dataSize, Current); @@ -430,11 +429,11 @@ bool XM::File::save() StringList lines = d->tag.comment().split("\n"); uint sampleNameIndex = instrumentCount; for(ushort i = 0; i < instrumentCount; ++ i) { - ulong instrumentHeaderSize = 0; + uint instrumentHeaderSize = 0; if(!readU32L(instrumentHeaderSize) || instrumentHeaderSize < 4) return false; - uint len = std::min(22UL, instrumentHeaderSize - 4U); + uint len = std::min(22U, instrumentHeaderSize - 4U); if(i >= lines.size()) writeString(String::null, len); else @@ -448,7 +447,7 @@ bool XM::File::save() return false; if(sampleCount > 0) { - ulong sampleHeaderSize = 0; + uint sampleHeaderSize = 0; if(instrumentHeaderSize < 33U || !readU32L(sampleHeaderSize)) return false; // skip unhandeled header proportion: @@ -456,14 +455,14 @@ bool XM::File::save() for(ushort j = 0; j < sampleCount; ++ j) { if(sampleHeaderSize > 4U) { - ulong sampleLength = 0; + uint sampleLength = 0; if(!readU32L(sampleLength)) return false; offset += sampleLength; - seek(std::min(sampleHeaderSize, 14UL), Current); + seek(std::min(sampleHeaderSize, 14U), Current); if(sampleHeaderSize > 18U) { - uint len = std::min(sampleHeaderSize - 18U, 22UL); + uint len = std::min(sampleHeaderSize - 18U, 22U); if(sampleNameIndex >= lines.size()) writeString(String::null, len); else @@ -530,7 +529,7 @@ void XM::File::read(bool) .u16L(bpmSpeed); uint count = header.read(*this, headerSize - 4U); - uint size = std::min(headerSize - 4U, (ulong)header.size()); + uint size = std::min(headerSize - 4U, header.size()); READ_ASSERT(count == size); @@ -557,7 +556,7 @@ void XM::File::read(bool) pattern.byte(packingType).u16L(rowCount).u16L(dataSize); uint count = pattern.read(*this, patternHeaderLength - 4U); - READ_ASSERT(count == std::min(patternHeaderLength - 4U, (ulong)pattern.size())); + READ_ASSERT(count == std::min(patternHeaderLength - 4U, pattern.size())); seek(patternHeaderLength - (4 + count) + dataSize, Current); } @@ -580,9 +579,9 @@ void XM::File::read(bool) // 4 for instrumentHeaderSize uint count = 4 + instrument.read(*this, instrumentHeaderSize - 4U); - READ_ASSERT(count == std::min(instrumentHeaderSize, (ulong)instrument.size() + 4)); + READ_ASSERT(count == std::min(instrumentHeaderSize, instrument.size() + 4)); - ulong sampleHeaderSize = 0; + uint sampleHeaderSize = 0; long offset = 0; if(sampleCount > 0) { sumSampleCount += sampleCount; @@ -592,9 +591,9 @@ void XM::File::read(bool) seek(instrumentHeaderSize - count - 4, Current); for(ushort j = 0; j < sampleCount; ++ j) { - ulong sampleLength = 0; - ulong loopStart = 0; - ulong loopLength = 0; + uint sampleLength = 0; + uint loopStart = 0; + uint loopLength = 0; uchar volume = 0; uchar finetune = 0; uchar sampleType = 0; @@ -615,7 +614,7 @@ void XM::File::read(bool) .string(sampleName, 22); uint count = sample.read(*this, sampleHeaderSize); - READ_ASSERT(count == std::min(sampleHeaderSize, (ulong)sample.size())); + READ_ASSERT(count == std::min(sampleHeaderSize, sample.size())); // skip unhandeled header proportion: seek(sampleHeaderSize - count, Current);