Skip to content

Commit 843f393

Browse files
Joni Poikelinjobor
authored andcommitted
Fix crash when trying to register .rcc from resource system
_get_osfhandle crashes if invalid value is passed in as a file descriptor. Avoid trying to map if there is no valid file descriptor for a file. Fixes: QTBUG-138807 Pick-to: 6.10 6.8 Change-Id: I462b93d3665c1894fb966080d106839b9840a05b Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
1 parent c44ab2b commit 843f393

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

src/corelib/io/qresource.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,17 +1176,17 @@ uchar *QDynamicFileResourceRoot::map_sys(QFile &file, qint64 offset, qsizetype s
11761176
void *ptr = nullptr;
11771177
if (size < 0)
11781178
size = qMin(file.size() - offset, (std::numeric_limits<qsizetype>::max)());
1179-
1179+
int fd = file.handle();
1180+
if (fd < 0)
1181+
return nullptr;
11801182
// We don't use QFile::map() here because we want to dispose of the QFile object
11811183
#if defined(QT_USE_MMAP)
1182-
int fd = file.handle();
11831184
int protection = PROT_READ; // read-only memory
11841185
int flags = MAP_FILE | MAP_PRIVATE; // swap-backed map from file
11851186
ptr = QT_MMAP(nullptr, size, protection, flags, fd, offset);
11861187
if (ptr == MAP_FAILED)
11871188
ptr = nullptr;
11881189
#elif defined(Q_OS_WIN)
1189-
int fd = file.handle();
11901190
HANDLE fileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(fd));
11911191
if (fileHandle != INVALID_HANDLE_VALUE) {
11921192
HANDLE mapHandle = CreateFileMapping(fileHandle, 0, PAGE_WRITECOPY, 0, 0, 0);

tests/auto/corelib/io/qresourceengine/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,12 @@ qt_add_binary_resources(tst_qresourceengine_runtime_resource "testqrc/test.qrc"
5555
OPTIONS -root "/runtime_resource/" -binary)
5656
add_dependencies(tst_qresourceengine tst_qresourceengine_runtime_resource)
5757

58+
set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/runtime_resource.rcc" PROPERTY
59+
QT_RESOURCE_ALIAS "runtime_resource.rcc"
60+
)
61+
qt_add_resources(tst_qresourceengine "nestedrcc"
62+
PREFIX "/nestedrcc"
63+
FILES "${CMAKE_CURRENT_BINARY_DIR}/runtime_resource.rcc"
64+
)
65+
5866
add_subdirectory(staticplugin)

tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ private slots:
4242
void lastModified();
4343
void resourcesInStaticPlugins();
4444
void qtResourceEmpty();
45+
void registerNestedRccFile();
4546

4647
private:
4748
const QString m_runtimeResourceRcc;
@@ -188,6 +189,7 @@ void tst_QResourceEngine::checkStructure_data()
188189
<< QLatin1String("android_testdata")
189190
#endif
190191
<< QLatin1String("empty")
192+
<< QLatin1String("nestedrcc")
191193
<< QLatin1String("otherdir")
192194
<< QLatin1String("runtime_resource")
193195
<< QLatin1String("searchpath1")
@@ -670,6 +672,16 @@ void tst_QResourceEngine::qtResourceEmpty()
670672
QVERIFY(f.readAll().isEmpty());
671673
}
672674

675+
void tst_QResourceEngine::registerNestedRccFile()
676+
{
677+
QVERIFY(QResource::registerResource(":/nestedrcc/runtime_resource.rcc",
678+
"/registeredNestedRccFile"));
679+
QVERIFY2(QResource::registerResource(":/nestedrcc/runtime_resource.rcc",
680+
"/registeredNestedRccFile"),
681+
"Second QResource::registerResource call failed.");
682+
QVERIFY(QFile::exists(":/registeredNestedRccFile/runtime_resource/search_file.txt"));
683+
}
684+
673685
QTEST_MAIN(tst_QResourceEngine)
674686

675687
#include "tst_qresourceengine.moc"

0 commit comments

Comments
 (0)