+++ This bug was initially created as a clone of Bug #40283 +++
> /* this is analogous to *_can_bypass_handlers() method above */
It's _can_bypass_approvers :-)
> static gboolean
> _mcd_dispatch_operation_handlers_can_bypass_observers (
> McdDispatchOperation *self)
> for (iter = self->priv->possible_handlers;
> iter != NULL && *iter != NULL;
> gboolean bypass = _mcd_client_proxy_get_bypass_observers (
> DEBUG ("%s has BypassObservers=%c", *iter, bypass ? 'T' : 'F');
> return bypass;
The corresponding code in _can_bypass_approvers explains why we short-circuit in both cases:
> /* If the best handler that still exists bypasses approval, then
> * we're going to bypass approval.
> * Also, because handlers are sorted with the best ones first, and
> * handlers with BypassApproval are "better", we can be sure that if
> * we've found a handler that still exists and does not bypass
> * approval, no handler bypasses approval. */
However, the second sentence does not apply to BypassObservers - the value of BypassObservers does not affect a Handler's "quality" score (although perhaps it should - see Bug #30043).
So, it should only short-circuit in the TRUE case:
gboolean bypass = [...];
mcd_dispatcher_client_needs_recovery_cb() is broken in an analogous way, and should be fixed at the same time. Before Xavier fixed Bug #40283, it looked at the Handler that actually took the channel (or crashed if the channel was taken via Claim()), without respecting BypassObservers on any other Handler. After fixing Bug #40283, it respects BypassObservers on one "likely" Handler, but does not respect BypassObservers on any other Handler.
Fixed in git for 5.17.0 by deleting this feature.