summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2021-12-16 13:50:21 +0100
committerMarc Mutz <marc.mutz@qt.io>2022-01-03 12:22:53 +0100
commit591a35d6fd9fa4f14ca1ac6a568673e2a2da0f60 (patch)
treeb6f6ef2ba7fb2c2a8e78239be1234561f87c7aea /src
parentc953e5c41750ec886880cfb2cedb89f2886e5424 (diff)
QThread: fix UB (invalid enum value) on Private::Priority
The Unix code stores an additional flag, ThreadPriorityResetFlag, in the Policy enum, but ubsan does not approve: qthread_unix.cpp:303:30: runtime error: load of value 2147483648, which is not a valid value for type 'Priority' qthread_unix.cpp:304:75: runtime error: load of value 2147483648, which is not a valid value for type 'Priority' Fix by making the variable of std::underlying_type_t<Priority>. The masking and unmasking code can now be simplified, too. In the Windows version, replace some switch targets with equivalent ones to keep -Wswitch-like warnings, though I hasten to note that both switches use a default case, so have anyway implicitly disabled said warning. Pick-to: 6.3 6.2 5.15 Change-Id: Ie4ea7d05e2928d2755ad12d36535197f85493191 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/thread/qthread_p.h2
-rw-r--r--src/corelib/thread/qthread_unix.cpp6
-rw-r--r--src/corelib/thread/qthread_win.cpp4
3 files changed, 6 insertions, 6 deletions
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 50d86ab51a7..0a3813ab3b5 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -164,7 +164,7 @@ public:
int returnCode;
uint stackSize;
- QThread::Priority priority;
+ std::underlying_type_t<QThread::Priority> priority;
#ifdef Q_OS_UNIX
QWaitCondition thread_done;
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 85fb5b10344..53395d9a95c 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -322,8 +322,8 @@ void *QThreadPrivate::start(void *arg)
QMutexLocker locker(&thr->d_func()->mutex);
// do we need to reset the thread priority?
- if (qToUnderlying(thr->d_func()->priority) & ThreadPriorityResetFlag) {
- thr->d_func()->setPriority(QThread::Priority(qToUnderlying(thr->d_func()->priority) & ~ThreadPriorityResetFlag));
+ if (thr->d_func()->priority & ThreadPriorityResetFlag) {
+ thr->d_func()->setPriority(QThread::Priority(thr->d_func()->priority & ~ThreadPriorityResetFlag));
}
// threadId is set in QThread::start()
@@ -703,7 +703,7 @@ void QThread::start(Priority priority)
// could not set scheduling hints, fallback to inheriting them
// we'll try again from inside the thread
pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
- d->priority = Priority(qToUnderlying(priority) | ThreadPriorityResetFlag);
+ d->priority = qToUnderlying(priority) | ThreadPriorityResetFlag;
}
break;
}
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index 820ffa11499..4b144ebda4b 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -457,7 +457,7 @@ void QThread::start(Priority priority)
int prio;
d->priority = priority;
- switch (d->priority) {
+ switch (priority) {
case IdlePriority:
prio = THREAD_PRIORITY_IDLE;
break;
@@ -584,7 +584,7 @@ void QThreadPrivate::setPriority(QThread::Priority threadPriority)
int prio;
priority = threadPriority;
- switch (priority) {
+ switch (threadPriority) {
case QThread::IdlePriority:
prio = THREAD_PRIORITY_IDLE;
break;