summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qobject.cpp
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2025-08-15 20:47:11 +0300
committerAhmad Samir <a.samirh78@gmail.com>2025-08-22 04:54:17 +0300
commita7c166ee2262efb5d08271cdcd68e77fcb76f866 (patch)
treec9dd7246a1a43e635bdd511bc8470b1c7b9c50cc /src/corelib/kernel/qobject.cpp
parent0f20cb9653220c8ae3eb1aef34a4545277c85b7f (diff)
QObject: (dis)connect: check signal/slot prefix code first
Cheapest checks first. Pick-to: 6.10 Change-Id: I50fc1def64fb9cd4aa0ab614daec1a258108dd10 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r--src/corelib/kernel/qobject.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 5ce14c6b8eb..3cf3e9d39ba 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -3036,10 +3036,15 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
(method && *method) ? method + 1 : "(nullptr)");
return QMetaObject::Connection(nullptr);
}
- QByteArray pinnedSignal;
if (!check_signal_macro(sender, signal, "connect", "bind"))
return QMetaObject::Connection(nullptr);
+
+ int membcode = extract_code(method);
+ if (!check_method_code(membcode, receiver, method, "connect"))
+ return QMetaObject::Connection(nullptr);
+
+ QByteArray pinnedSignal;
const QMetaObject *smeta = sender->metaObject();
const char *signal_arg = signal;
++signal; // skip code
@@ -3068,10 +3073,6 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
signal_index += QMetaObjectPrivate::signalOffset(smeta);
QByteArray pinnedMethod;
- int membcode = extract_code(method);
-
- if (!check_method_code(membcode, receiver, method, "connect"))
- return QMetaObject::Connection(nullptr);
const char *method_arg = method;
++method; // skip code
@@ -3320,6 +3321,18 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
return false;
}
+ if (signal) {
+ if (!check_signal_macro(sender, signal, "disconnect", "unbind"))
+ return false;
+ }
+
+ int membcode = -1;
+ if (method) {
+ membcode = extract_code(method);
+ if (!check_method_code(membcode, receiver, method, "disconnect"))
+ return false;
+ }
+
const char *signal_arg = signal;
QByteArray pinnedSignal;
bool signal_found = false;
@@ -3333,14 +3346,11 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
QT_RETHROW;
}
- if (!check_signal_macro(sender, signal, "disconnect", "unbind"))
- return false;
signal++; // skip code
}
QByteArray pinnedMethod;
const char *method_arg = method;
- int membcode = -1;
bool method_found = false;
if (method) {
QT_TRY {
@@ -3352,9 +3362,6 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
QT_RETHROW;
}
- membcode = extract_code(method);
- if (!check_method_code(membcode, receiver, method, "disconnect"))
- return false;
method++; // skip code
}