leave(): Pruefung Zuhoerer vor Rechtepruefung
Vor der Pruefung des Rechts, die Ebene zu verlassen,
schonmal pruefen, ob das Objekt ueber Zuhoerer der
Ebene ist.
Change-Id: I18b787bc1f1400f13b167d72e178c52a93e16f97
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index 3d4a7d6..6a5c449 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -885,6 +885,12 @@
public int leave(string ch, object pl)
{
ch = lower_case(ch);
+
+ channels[ch][I_MEMBER] -= ({0}); // kaputte Objekte erstmal raus
+
+ if (!IsChannelMember(ch, pl))
+ return E_NOT_MEMBER;
+
/* funcall() auf Closure-Operator, um einen neuen Eintrag im Caller Stack
zu erzeugen, weil access() mit extern_call() und previous_object()
arbeitet und sichergestellt sein muss, dass das in jedem Fall das
@@ -892,11 +898,6 @@
if (!funcall(#'access, ch, pl, C_LEAVE))
return E_ACCESS_DENIED;
- channels[ch][I_MEMBER] -= ({0}); // kaputte Objekte erstmal raus
-
- if (!IsChannelMember(ch, pl))
- return E_NOT_MEMBER;
-
// Erstmal den Zuhoerer raus.
channels[ch][I_MEMBER] -= ({pl});