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});