AddSpecialInfo: Zugriffschutz bei ext. Call

Wird AddSpecialInfo() von aussen gerufen, liessen sich
bisher auch beliebige static und protected lfuns im
Objekt durch andere Objekte eintragen. Das wird
hiermit jetzt unterbunden.

Change-Id: I700ac435e094f92578fdcb87949cc5d3b78d25ee
diff --git a/std/npc/info.c b/std/npc/info.c
index cba2985..63e768a 100644
--- a/std/npc/info.c
+++ b/std/npc/info.c
@@ -61,6 +61,8 @@
 #include <config.h>
 #include <exploration.h>
 
+#include <functionlist.h>
+
 // TODO: langfristig waer hier private schoen.
 nosave mapping infos;
 
@@ -318,6 +320,26 @@
 public varargs void AddSpecialInfo(string|string* key, string functionname,
                string indent, int|string silent, string|closure casebased)
 {
+  // Externe Aufrufer durfen keine Closures auf static oder protected lfuns
+  // erstellen.
+  if (extern_call())
+  {
+      <string|int>* fexist = function_exists(functionname,
+                                             FEXISTS_ALL|NAME_HIDDEN);
+      // Gar nicht existierende/gefundene lfuns fuehren auch in diesem Fall
+      // weiter unten zum stillschweigenden return ohne Fehler, um das
+      // Verhalten konsistent bei internem wie externem Aufruf zu halten.
+      //TODO: Allerdings halte ich in beiden Faellen einen Fehler fuer das
+      //TODO::bessere Verhalten.
+      if (fexist
+          && (fexist[FEXISTS_FLAGS] & (TYPE_MOD_STATIC|TYPE_MOD_PROTECTED)))
+      {
+          raise_error(sprintf(
+                "%s ist static oder protected und darf nicht durch"
+                "externe Aufrufer eingetragen werden.\n",
+                functionname));
+      }
+  }
   closure cl = symbol_function(functionname,this_object());
 
   if (!cl)