SetProp(): neues Argument drop_priv
SetProp() wird durch AddToProp() intern gerufen, aber wenn dessen
Aufruf nicht intern ist, darf SetProp ihn auch nicht intern behandeln.
Daher muss AddToProp() durchreichen, ob es von extern gerufen wurde.
Das neue Argument hat als default extern_call().
Aber Achtung:
Es ist verfuehrerisch, das 'drop_priv||extern_call()' durch 'drop_priv'
zu ersetzen, weil extern_call() das default-argument fuer <drop_priv>
ist. Das ist keine gute Idee, weil <drop_priv> unter der Kontrolle des
Aufrufers ist und dieser 0 uebergeben kann. Sprich: wenn es 0 ist,
muessen wir dennoch selber pruefen. Wir glauben aber immer, wenn es 1
ist und der Aufrufer Privilegien abgeben will.
Change-Id: Ia2bd237f2faab4a3319a0cb573de72911cb961bd
diff --git a/std/thing/properties.c b/std/thing/properties.c
index 1e7cdad..fb70913 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -142,7 +142,7 @@
}
// Property setzen unter Verwendung evtl. vorhandener Zugriffsfunktionen
-public mixed SetProp( string name, mixed Value )
+public mixed SetProp( string name, mixed Value, int drop_priv)
{
mixed result;
@@ -173,7 +173,7 @@
{
prop[F_SET_METHOD]-=([name]);
}
-
+
// Wenn closure_call gesetzt wurde, wieder loeschen
if (flag) closure_call = 0;
@@ -181,12 +181,18 @@
return result;
}
- // _set_*-Methode vorhanden? falls ja, aufrufen.i
+ // _set_*-Methode vorhanden? falls ja, aufrufen.
if (call_resolved(&result,this_object(),"_set_"+name,Value ))
return result;
// Letzte Moeglichkeit: Muss eine 'normale' Property sein
- return Set( name, Value, F_VALUE, extern_call() );
+ // Es ist verfuehrerisch, das 'drop_priv||extern_call()' durch 'drop_priv'
+ // zu ersetzen, weil extern_call() das default-argument fuer <drop_priv>
+ // ist. Das ist keine gute Idee, weil <drop_priv> unter der Kontrolle des
+ // Aufrufers ist und dieser 0 uebergeben kann. Sprich: wenn es 0 ist,
+ // muessen wir dennoch selber pruefen. Wir glauben aber immer, wenn es 1
+ // ist und der Aufrufer Privilegien abgeben will.
+ return Set( name, Value, F_VALUE, drop_priv||extern_call() );
}