find(): Pruefung der Zugriffsrechte korrigiert.

access() muss hier direkt gerufen werden und nicht durch funcall(), weil
bereits durch die Verwendung einer Closure in filter() ein neuer Eintrag
im Caller Stack erzeugt wurde. Erzeugt man noch einen ist in access()
previous_object(1) == this_object() und der Aufrufer bekommt auch Ebenen
vorgeschlagen, auf die er keine Schreibrechte hat.

Change-Id: Ifb3956bb2218255ec27851eef5514ad188375141
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index 29e3f14..60254f7 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -1236,13 +1236,16 @@
   // Objekt <pl> muss auf dieser Ebene senden duerfen, damit der Ebenenname
   // in das Suchergebnis aufgenommen wird.
   string* chs = filter(m_indices(channels), function int (string ch_n) {
-                 /* 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
-                    richtige ist. */
+                 /* Normalerweise benoetigen wir ein 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 richtige ist.
+                    In diesem Fall gibt es schon durch filter() einen neuen
+                    Eintrag, daher muss access() direkt gerufen werden, sonst
+                    ist previous_object(1) == this_object(). */
                   return ( stringp(regmatch(ch_n, "^"+chname)) &&
-                           funcall(#'access, channels[ch_n], pl, C_SEND) );
+                           access(channels[ch_n], pl, C_SEND) );
                 });
 
   int num_channels = sizeof(chs);