Skip to content

Commit f031d16

Browse files
committed
fixup! Implement the "Redacting parameters in back traces" RFC
1 parent 761fdee commit f031d16

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

Zend/tests/function_arguments/sensitive_parameter_value.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ The SensitiveParameterValue behaves as expected.
66
$v = new SensitiveParameterValue('secret');
77

88
var_dump($v);
9+
var_dump((array)$v);
910
var_dump(serialize($v));
1011
var_dump(json_encode($v));
1112
var_dump($v->getValue());
@@ -14,6 +15,8 @@ var_dump($v->getValue());
1415
--EXPECTF--
1516
object(SensitiveParameterValue)#%d (0) {
1617
}
18+
array(0) {
19+
}
1720
string(35) "O:23:"SensitiveParameterValue":0:{}"
1821
string(2) "{}"
1922
string(6) "secret"

Zend/zend_attributes.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ ZEND_API zend_class_entry *zend_ce_allow_dynamic_properties;
3030
ZEND_API zend_class_entry *zend_ce_sensitive_parameter;
3131
ZEND_API zend_class_entry *zend_ce_sensitive_parameter_value;
3232

33+
typedef struct {
34+
zend_object std;
35+
} attributes_sensitive_parameter_value;
36+
37+
static zend_object_handlers attributes_object_handlers_sensitive_parameter_value;
38+
3339
static HashTable internal_attributes;
3440

3541
void validate_attribute(zend_attribute *attr, uint32_t target, zend_class_entry *scope)
@@ -147,6 +153,38 @@ ZEND_METHOD(SensitiveParameterValue, __unserialize)
147153
RETURN_THROWS();
148154
} /* }}} */
149155

156+
static zend_object *attributes_sensitive_parameter_value_new(zend_class_entry *ce)
157+
{
158+
attributes_sensitive_parameter_value *intern = zend_object_alloc(sizeof(attributes_sensitive_parameter_value), ce);
159+
memset(intern, 0, sizeof(attributes_sensitive_parameter_value) - sizeof(zend_object));
160+
161+
zend_object_std_init(&intern->std, ce);
162+
object_properties_init(&intern->std, ce);
163+
intern->std.handlers = &attributes_object_handlers_sensitive_parameter_value;
164+
165+
return &intern->std;
166+
}
167+
168+
static inline attributes_sensitive_parameter_value *attributes_sensitive_parameter_value_from_obj(zend_object *obj) {
169+
return (attributes_sensitive_parameter_value *)((char *)(obj) - XtOffsetOf(attributes_sensitive_parameter_value, std));
170+
}
171+
172+
static void attributes_sensitive_parameter_value_free_obj(zend_object *object)
173+
{
174+
attributes_sensitive_parameter_value *v = attributes_sensitive_parameter_value_from_obj(object);
175+
176+
zend_object_std_dtor(&v->std);
177+
}
178+
179+
static HashTable *attributes_sensitive_parameter_value_get_properties_for(zend_object *zobj, zend_prop_purpose purpose)
180+
{
181+
if (purpose == ZEND_PROP_PURPOSE_ARRAY_CAST) {
182+
return NULL;
183+
} else {
184+
return zend_std_get_properties_for(zobj, purpose);
185+
}
186+
}
187+
150188
static zend_attribute *get_attribute(HashTable *attributes, zend_string *lcname, uint32_t offset)
151189
{
152190
if (attributes) {
@@ -372,6 +410,11 @@ void zend_register_attribute_ce(void)
372410

373411
/* This is not an attribute, thus the register call is missing. */
374412
zend_ce_sensitive_parameter_value = register_class_SensitiveParameterValue();
413+
zend_ce_sensitive_parameter_value->create_object = attributes_sensitive_parameter_value_new;
414+
memcpy(&attributes_object_handlers_sensitive_parameter_value, &std_object_handlers, sizeof(zend_object_handlers));
415+
attributes_object_handlers_sensitive_parameter_value.offset = XtOffsetOf(attributes_sensitive_parameter_value, std);
416+
attributes_object_handlers_sensitive_parameter_value.free_obj = attributes_sensitive_parameter_value_free_obj;
417+
attributes_object_handlers_sensitive_parameter_value.get_properties_for = attributes_sensitive_parameter_value_get_properties_for;
375418
}
376419

377420
void zend_attributes_shutdown(void)

0 commit comments

Comments
 (0)