diff --git a/src/ktar.cpp b/src/ktar.cpp --- a/src/ktar.cpp +++ b/src/ktar.cpp @@ -69,7 +69,7 @@ void writeLonglink(char *buffer, const QByteArray &name, char typeflag, const char *uname, const char *gname); qint64 readRawHeader(char *buffer); - bool readLonglink(char *buffer, QByteArray &longlink); + const char *readLonglink(char *buffer); qint64 readHeader(char *buffer, QString &name, QString &symlink); }; @@ -228,7 +228,7 @@ return n; } -bool KTar::KTarPrivate::readLonglink(char *buffer, QByteArray &longlink) +const char *KTar::KTarPrivate::readLonglink(char *buffer) { qint64 n = 0; //qCDebug(KArchiveLog) << "reading longlink from pos " << q->device()->pos(); @@ -240,32 +240,33 @@ size--; // ignore trailing null if (size > std::numeric_limits::max()) { qCWarning(KArchiveLog) << "Failed to allocate memory for longlink of size" << size; - return false; + return nullptr; } if (size < 0) { qCWarning(KArchiveLog) << "Invalid longlink size" << size; - return false; + return nullptr; } - longlink.resize(size); + char *longlink = new char[size]; qint64 offset = 0; while (size > 0) { int chunksize = qMin(size, 0x200LL); - n = dev->read(longlink.data() + offset, chunksize); + n = dev->read(longlink + offset, chunksize); if (n == -1) { - return false; + delete[] longlink; + return nullptr; } size -= chunksize; offset += 0x200; }/*wend*/ // jump over the rest const int skip = 0x200 - (n % 0x200); if (skip <= 0x200) { if (dev->read(buffer, skip) != skip) { - return false; + delete[] longlink; + return nullptr; } } - longlink.truncate(qstrlen(longlink.constData())); - return true; + return longlink; } qint64 KTar::KTarPrivate::readHeader(char *buffer, QString &name, QString &symlink) @@ -281,16 +282,18 @@ // is it a longlink? if (strcmp(buffer, "././@LongLink") == 0) { char typeflag = buffer[0x9c]; - QByteArray longlink; - if (readLonglink(buffer, longlink)) { + const char *longlink = readLonglink(buffer); + if (longlink) { switch (typeflag) { case 'L': - name = QFile::decodeName(longlink.constData()); + name = QFile::decodeName(longlink); break; case 'K': - symlink = QFile::decodeName(longlink.constData()); + symlink = QFile::decodeName(longlink); break; }/*end switch*/ + + delete[] longlink; } } else { break;