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)