diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-12-05 19:30:01 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-12-05 19:30:01 +0000 |
| commit | ade1c826f9bccf77e76b47f83609ea253a537892 (patch) | |
| tree | 03df56a8c77815ba5e8e5e01987112fa0a53facc /src/plugins | |
| parent | 7f1fd1cccfca94740f3c22dd411c847eae8c77d3 (diff) | |
| download | qmmp-ade1c826f9bccf77e76b47f83609ea253a537892.tar.gz qmmp-ade1c826f9bccf77e76b47f83609ea253a537892.tar.bz2 qmmp-ade1c826f9bccf77e76b47f83609ea253a537892.zip | |
http: limit maximum buffer size (#497)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8490 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Transports/http/httpstreamreader.cpp | 52 | ||||
| -rw-r--r-- | src/plugins/Transports/http/httpstreamreader.h | 8 |
2 files changed, 38 insertions, 22 deletions
diff --git a/src/plugins/Transports/http/httpstreamreader.cpp b/src/plugins/Transports/http/httpstreamreader.cpp index bca2844cb..f139c9ba0 100644 --- a/src/plugins/Transports/http/httpstreamreader.cpp +++ b/src/plugins/Transports/http/httpstreamreader.cpp @@ -31,18 +31,28 @@ #include "httpinputsource.h" #include "httpstreamreader.h" +#define MAX_BUFFER_SIZE 150000000UL //bytes + //curl callbacks static size_t curl_write_data(void *data, size_t size, size_t nmemb, void *pointer) { HttpStreamReader *dl = (HttpStreamReader *)pointer; - dl->mutex()->lock (); + dl->mutex()->lock(); + + if(dl->stream()->buf_fill > MAX_BUFFER_SIZE) + { + qWarning("HttpStreamReader: buffer has reached the maximum size, disconnecting..."); + dl->stream()->aborted = true; + dl->mutex()->unlock(); + return 0; + } + size_t buf_start = dl->stream()->buf_fill; size_t data_size = size * nmemb; dl->stream()->buf_fill += data_size; - - dl->stream()->buf = (char *)realloc (dl->stream()->buf, dl->stream()->buf_fill); - memcpy (dl->stream()->buf + buf_start, data, data_size); + dl->stream()->buf = (char *)realloc(dl->stream()->buf, dl->stream()->buf_fill); + memcpy(dl->stream()->buf + buf_start, data, data_size); dl->mutex()->unlock(); dl->checkBuffer(); return data_size; @@ -182,12 +192,15 @@ bool HttpStreamReader::isSequential () const return true; } -bool HttpStreamReader::open (OpenMode mode) +bool HttpStreamReader::open(OpenMode mode) { - if (mode != QIODevice::ReadOnly) - return false; - QIODevice::open(mode); - return m_ready; + if(m_ready && mode == QIODevice::ReadOnly) + { + QIODevice::open(mode); + return true; + } + + return false; } bool HttpStreamReader::seek (qint64 pos) @@ -220,11 +233,10 @@ qint64 HttpStreamReader::readData(char* data, qint64 maxlen) len = readBuffer(data, maxlen); else { - qint64 nread = 0; - qint64 to_read; - while (maxlen > nread && m_stream.buf_fill > nread) + size_t nread = 0; + while (size_t(maxlen) > nread && m_stream.buf_fill > nread) { - to_read = qMin<qint64>(m_stream.icy_metaint - m_metacount, maxlen - nread); + size_t to_read = qMin<size_t>(m_stream.icy_metaint - m_metacount, maxlen - nread); qint64 res = readBuffer(data + nread, to_read); nread += res; m_metacount += res; @@ -371,14 +383,18 @@ qint64 HttpStreamReader::readBuffer(char* data, qint64 maxlen) memmove(m_stream.buf, m_stream.buf + len, m_stream.buf_fill); return len; } - return 0; + else if (m_stream.aborted) + return -1; + else + return 0; } void HttpStreamReader::checkBuffer() { - if(m_stream.aborted) + if(m_stream.aborted || m_ready) return; - if (m_stream.buf_fill > m_buffer_size && !m_ready) + + if (m_stream.buf_fill > m_buffer_size) { m_ready = true; qDebug("HttpStreamReader: ready"); @@ -395,7 +411,7 @@ void HttpStreamReader::checkBuffer() } emit ready(); } - else if (!m_ready) + else { StateHandler::instance()->dispatchBuffer(100 * m_stream.buf_fill / m_buffer_size); qApp->processEvents(); @@ -417,7 +433,7 @@ void HttpStreamReader::readICYMetaData() readBuffer((char *)&packet_size, 1); if (packet_size != 0) { - int size = packet_size * 16; + size_t size = packet_size * 16; char packet[size]; while (m_stream.buf_fill < size && m_thread->isRunning()) { diff --git a/src/plugins/Transports/http/httpstreamreader.h b/src/plugins/Transports/http/httpstreamreader.h index 3f064305d..aefda863b 100644 --- a/src/plugins/Transports/http/httpstreamreader.h +++ b/src/plugins/Transports/http/httpstreamreader.h @@ -43,12 +43,12 @@ class HTTPInputSource; struct HttpStreamData { char *buf; - long buf_fill; + size_t buf_fill; QString content_type; bool aborted; QHash <QString, QByteArray> header; bool icy_meta_data; - int icy_metaint; + size_t icy_metaint; }; /*! @internal @@ -101,11 +101,11 @@ private: HttpStreamData m_stream; QString m_url; QString m_userAgent; - int m_metacount; + size_t m_metacount; QString m_title; bool m_ready; bool m_meta_sent; - long m_buffer_size; + size_t m_buffer_size; QTextCodec *m_codec; DownloadThread *m_thread; HTTPInputSource *m_parent; |
