diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-12-20 21:14:04 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2019-12-20 21:14:04 +0000 |
| commit | 4ea83d5fe1df7942ca1eabf5fb88dbb72dc15661 (patch) | |
| tree | eae4349e1dcea1efc413482a776b8c2a47668336 /src/plugins/Input/archive | |
| parent | e5be6133ab10637f4f9e0f7131e66095a30c8688 (diff) | |
| download | qmmp-4ea83d5fe1df7942ca1eabf5fb88dbb72dc15661.tar.gz qmmp-4ea83d5fe1df7942ca1eabf5fb88dbb72dc15661.tar.bz2 qmmp-4ea83d5fe1df7942ca1eabf5fb88dbb72dc15661.zip | |
fixed crash on encrypted archives (#1027)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9155 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/archive')
| -rw-r--r-- | src/plugins/Input/archive/archiveinputdevice.cpp | 1 | ||||
| -rw-r--r-- | src/plugins/Input/archive/archivetagreader.cpp | 12 | ||||
| -rw-r--r-- | src/plugins/Input/archive/decoderarchivefactory.cpp | 9 |
3 files changed, 18 insertions, 4 deletions
diff --git a/src/plugins/Input/archive/archiveinputdevice.cpp b/src/plugins/Input/archive/archiveinputdevice.cpp index 5b11a2938..b4727192d 100644 --- a/src/plugins/Input/archive/archiveinputdevice.cpp +++ b/src/plugins/Input/archive/archiveinputdevice.cpp @@ -133,7 +133,6 @@ qint64 ArchiveInputDevice::readData(char *data, qint64 maxSize) { qWarning("ArchiveInputDevice: reading failed; libarchive error: %s", archive_error_string(m_archive)); setErrorString(QString::fromLocal8Bit(archive_error_string(m_archive))); - close(); return -1; } } diff --git a/src/plugins/Input/archive/archivetagreader.cpp b/src/plugins/Input/archive/archivetagreader.cpp index 70820579e..5d87b55a4 100644 --- a/src/plugins/Input/archive/archivetagreader.cpp +++ b/src/plugins/Input/archive/archivetagreader.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2016 by Ilya Kotov * + * Copyright (C) 2016-2019 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -46,8 +46,14 @@ public: } virtual TagLib::ByteVector readBlock(unsigned long length) override { - QByteArray data = m_input->read(length); - return TagLib::ByteVector(data.constData(), data.size()); + char data[length]; + qint64 l = m_input->read(data, length); + if(l < 0) + { + m_input->close(); + return TagLib::ByteVector(); + } + return TagLib::ByteVector(data, l); } virtual void writeBlock(const TagLib::ByteVector &) override {} diff --git a/src/plugins/Input/archive/decoderarchivefactory.cpp b/src/plugins/Input/archive/decoderarchivefactory.cpp index e96bbf007..6f6d0bf87 100644 --- a/src/plugins/Input/archive/decoderarchivefactory.cpp +++ b/src/plugins/Input/archive/decoderarchivefactory.cpp @@ -80,8 +80,17 @@ QList<TrackInfo *> DecoderArchiveFactory::createPlayList(const QString &path, Tr qWarning("DecoderArchiveFactory: unable to open archive; libarchive error: %s", archive_error_string(a)); return list; } + while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { + if(archive_read_has_encrypted_entries(a) == 1) //skip encrypted archives + { + qDeleteAll(list); + list.clear(); + archive_read_free(a); + return list; + } + if(archive_entry_filetype(entry) == AE_IFREG) { QString filePath = QString::fromLocal8Bit(archive_entry_pathname(entry)); |
