Flag und Pruefung von closure_call entfernt.
Beim Aufruf von Query- oder Setmethoden wurde bislang dieses
Flag gesetzt. Aufrufe von SetProp, Set, QueryProp, Query etc.
im Zuge etwaiger Rekursionen wurden dann wie externe Aufrufe
behandeln, auch wenn sie aus dem eigenen Objekt kamen.
Der Sinn dieses Vorgehens ist zumindest heute nicht klar, denn
der Zugriff wird dann letztendlich doch erlaubt, weil es zwar
nen externen Aufruf ist, aber previous_object() doch das
eigene Objekt ist.
Sinnvoll war es allerdings frueher, als noch ungebundene
Lambdas eingetragen werden konnten, welche an das eigene
Objekte gebunden wurden. Dieses ist heute aber nicht mehr
erlaubt.
Change-Id: If52682141fc005121cee5bff60449ab2bbe5fb86
diff --git a/std/thing/properties.c b/std/thing/properties.c
index 45f520a..102e883 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -37,12 +37,6 @@
// This is empty outside of a save_object() or restore_object() call!
private mapping properties;
-// security-flag: wenn gesetzt und es gleich der aktuellen DI_EVAL_NUMBER ist,
-// ist dieser Ausfuehrungsthread in einer Auswertung von F_QUERY/SET_METHOD
-// (ggf. rekursiv) und es wird jeder Aufruf als extern gewertet bzgl.
-// PROTECTED/SECURED.
-private nosave int closure_call;
-
// Z.Zt. nur Abschalten des Resets noetig.
protected void create() {
@@ -67,14 +61,10 @@
nomask private int prop_check_privilege(int drop_priv, int mode,
int op=PROP_SET)
{
- // Wenn closure_call in diesem Ausfuehrungsthread (Top-Level-Call) gesetzt
- // wurde, zaehlt der Aufruf immer als drop_priv, auch wenn drop_priv 0 sein
- // sollte.
- drop_priv ||= (closure_call == driver_info(DI_EVAL_NUMBER));
-
// Interne Calls oder eigenes Objekt (als letzter 'externer' Aufrufer via
// Callother) darf alles
if (!drop_priv || previous_object() == this_object())
+
return 1;
// Ab hier nur noch fremde Objekte
@@ -213,11 +203,6 @@
// Lambdas bindet, kann es auch nur eine gebundene Closure sein und das
// Objekt existiert auch noch (sonst waere func == 0).
- // closure_call setzen, falls noch nicht gesetzt
- int set_closure_call = closure_call != driver_info(DI_EVAL_NUMBER);
- if (set_closure_call)
- closure_call = driver_info(DI_EVAL_NUMBER);
-
// Dann mal die Closure aufrufen. Bei Fehler selbige loeschen
if (catch(result=funcall(func, Value, name);publish))
{
@@ -229,11 +214,6 @@
result = Set( name, result, F_VALUE, drop_priv||extern_call() );
}
- // Wenn dieser Aufruf closure_call gesetzt hat, wieder loeschen.
- // Da 0 ein gueltiger Wert ist, wird um eins dekrementiert, damit das Flag
- // fuer diese Top-Level-Ausfuehrung wieder freigegeben.
- if (set_closure_call) --closure_call;
-
// Und zurueckgeben
return result;
}
@@ -268,20 +248,11 @@
// Lambdas bindet, kann es auch nur eine gebundene Closure sein und das
// Objekt existiert auch noch (sonst waere func == 0).
- // closure_call setzen, falls noch nicht gesetzt
- int set_closure_call = closure_call != driver_info(DI_EVAL_NUMBER);
- if (set_closure_call)
- closure_call = driver_info(DI_EVAL_NUMBER);
-
// Dann Mal die Closure aufrufen. Bei Fehler selbige loeschen
if (catch(result=funcall(func, prop[F_VALUE][name]);publish))
{
prop[F_QUERY_METHOD]-=([name]);
}
- // Wenn dieser Aufruf closure_call gesetzt hat, wieder loeschen.
- // Da 0 ein gueltiger Wert ist, wird um eins dekrementiert, damit das Flag
- // fuer diese Top-Level-Ausfuehrung wieder freigegeben.
- if (set_closure_call) --closure_call;
// Und zurueckgeben
return result;