diff options
| author | Ahmad Samir <a.samirh78@gmail.com> | 2025-08-15 20:47:11 +0300 |
|---|---|---|
| committer | Ahmad Samir <a.samirh78@gmail.com> | 2025-08-22 04:54:17 +0300 |
| commit | a7c166ee2262efb5d08271cdcd68e77fcb76f866 (patch) | |
| tree | c9dd7246a1a43e635bdd511bc8470b1c7b9c50cc /src/corelib/kernel/qobject.cpp | |
| parent | 0f20cb9653220c8ae3eb1aef34a4545277c85b7f (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.cpp | 29 |
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 } |
