diff options
author | Liang Qi <liang.qi@qt.io> | 2019-07-22 06:50:42 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2019-07-22 06:50:42 +0200 |
commit | 261a87f956f345d4064eb2eb64e0cf7c98ec7d92 (patch) | |
tree | 53d10a28cdaf526418f4419c99cb26485c047a0d /src/corelib/io/qstorageinfo_unix.cpp | |
parent | 0652bdcf5e60461cd9a513d64be00b8830826fad (diff) | |
parent | 5f1cf8e0f5da36063202d46463c2d9e79d841a4d (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Conflicts:
qmake/generators/makefile.cpp
Change-Id: Ib3715e626f2fd32804c75c16ea9aa06a1216e76d
Diffstat (limited to 'src/corelib/io/qstorageinfo_unix.cpp')
-rw-r--r-- | src/corelib/io/qstorageinfo_unix.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp index 4669c20711..1e72241e68 100644 --- a/src/corelib/io/qstorageinfo_unix.cpp +++ b/src/corelib/io/qstorageinfo_unix.cpp @@ -468,8 +468,18 @@ inline bool QStorageIterator::next() size_t len = strlen(buffer.data()); if (len == 0) return false; - if (ptr[len - 1] == '\n') - ptr[len - 1] = '\0'; + while (Q_UNLIKELY(ptr[len - 1] != '\n' && !feof(fp))) { + // buffer wasn't large enough. Enlarge and try again. + // (we're readidng from the kernel, so OOM is unlikely) + buffer.resize((buffer.size() + 4096) & ~4095); + ptr = buffer.data(); + if (fgets(ptr + len, buffer.size() - len, fp) == nullptr) + return false; + + len += strlen(ptr + len); + Q_ASSERT(len < size_t(buffer.size())); + } + ptr[len - 1] = '\0'; // parse the line bool ok; |