Skip to content

Commit f05328f

Browse files
author
Harald Radi
committed
- MFH and another set of memory fixes
- there were lots of changes in the zend core and now the heap corruptions disapeared as inconspicuous as they appeared. maybe they were not our fault.
1 parent e27b13a commit f05328f

File tree

8 files changed

+118
-104
lines changed

8 files changed

+118
-104
lines changed

ext/com/COM.c

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,7 @@ static PHP_INI_MH(OnTypelibFileChange)
378378
char *typelib_name_buffer;
379379
char *strtok_buf = NULL;
380380
int interactive;
381-
382-
CLS_FETCH();
381+
TSRMLS_FETCH();
383382
interactive = CG(interactive);
384383

385384
if(!new_value || (typelib_file = VCWD_FOPEN(new_value, "r"))==NULL)
@@ -437,7 +436,7 @@ static PHP_INI_MH(OnTypelibFileChange)
437436
{
438437
printf("\rLoading %-60s\r", typelib_name);
439438
}
440-
439+
441440
if((pTL = php_COM_find_typelib(typelib_name, mode)) != NULL)
442441
{
443442
php_COM_load_typelib(pTL, mode);
@@ -953,7 +952,6 @@ static int do_COM_offget(VARIANT *result, comval *array, pval *property, int cle
953952
if(cleanup)
954953
{
955954
php_COM_destruct(array);
956-
efree(array);
957955
}
958956

959957
return retval;
@@ -1113,7 +1111,7 @@ PHP_FUNCTION(com_propget)
11131111

11141112
ALLOC_VARIANT(var_result);
11151113

1116-
if(do_COM_propget(var_result, obj, arg_property, 0)==FAILURE)
1114+
if(do_COM_propget(var_result, obj, arg_property, FALSE) == FAILURE)
11171115
{
11181116
FREE_VARIANT(var_result);
11191117
RETURN_FALSE;
@@ -1206,7 +1204,7 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
12061204
ZVAL_NULL(&return_value);
12071205

12081206
/* fetch the IDispatch interface */
1209-
zend_hash_index_find(object->value.obj.properties, 0, (void **) &comval_handle);
1207+
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void **) &comval_handle);
12101208
obj = (comval *) zend_list_find(Z_LVAL_P(*comval_handle), &type);
12111209
if(!obj || (type != IS_COM))
12121210
{
@@ -1225,7 +1223,7 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
12251223
if(do_COM_offget(var_result, obj, &overloaded_property->element, FALSE) == FAILURE)
12261224
{
12271225
FREE_VARIANT(var_result);
1228-
php_COM_destruct(obj_prop);
1226+
FREE_COM(obj_prop);
12291227

12301228
return return_value;
12311229
}
@@ -1235,23 +1233,26 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
12351233
if(do_COM_propget(var_result, obj, &overloaded_property->element, FALSE) == FAILURE)
12361234
{
12371235
FREE_VARIANT(var_result);
1238-
php_COM_destruct(obj_prop);
1236+
FREE_COM(obj_prop);
12391237

12401238
return return_value;
12411239
}
12421240
break;
12431241

12441242
case OE_IS_METHOD:
12451243
{
1244+
FREE_VARIANT(var_result);
12461245
if(obj != obj_prop)
12471246
{
1248-
php_COM_destruct(obj_prop);
1247+
FREE_COM(obj_prop);
12491248

12501249
return_value = *object;
12511250
ZVAL_ADDREF(&return_value);
12521251
}
1253-
FREE_VARIANT(var_result);
1254-
1252+
else
1253+
{
1254+
RETVAL_COM(obj);
1255+
}
12551256
return return_value;
12561257
}
12571258
break;
@@ -1262,21 +1263,19 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
12621263
if(V_DISPATCH(var_result) == NULL)
12631264
{
12641265
FREE_VARIANT(var_result);
1265-
php_COM_destruct(obj_prop);
1266+
FREE_COM(obj_prop);
12661267

12671268
return return_value;
12681269
}
12691270

12701271
obj = obj_prop;
12711272
php_COM_set(obj, &V_DISPATCH(var_result), TRUE);
1272-
1273-
RETVAL_COM(obj);
12741273
}
12751274
else
12761275
{
12771276
php_variant_to_pval(var_result, &return_value, FALSE, codepage);
12781277

1279-
php_COM_destruct(obj_prop);
1278+
FREE_COM(obj_prop);
12801279
obj_prop = NULL;
12811280
}
12821281

@@ -1302,7 +1301,7 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
13021301

13031302

13041303
/* fetch the IDispatch interface */
1305-
zend_hash_index_find(object->value.obj.properties, 0, (void **) &comval_handle);
1304+
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void **) &comval_handle);
13061305
obj = (comval *)zend_list_find(Z_LVAL_P(*comval_handle), &type);
13071306
if(!obj || (type != IS_COM))
13081307
{
@@ -1321,7 +1320,7 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
13211320
if(do_COM_offget(var_result, obj, &overloaded_property->element, FALSE) == FAILURE)
13221321
{
13231322
FREE_VARIANT(var_result);
1324-
php_COM_destruct(obj_prop);
1323+
FREE_COM(obj_prop);
13251324

13261325
return FAILURE;
13271326
}
@@ -1331,7 +1330,7 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
13311330
if(do_COM_propget(var_result, obj, &overloaded_property->element, FALSE) == FAILURE)
13321331
{
13331332
FREE_VARIANT(var_result);
1334-
php_COM_destruct(obj_prop);
1333+
FREE_COM(obj_prop);
13351334

13361335
return FAILURE;
13371336
}
@@ -1348,7 +1347,7 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
13481347
if(V_DISPATCH(var_result) == NULL)
13491348
{
13501349
FREE_VARIANT(var_result);
1351-
php_COM_destruct(obj_prop);
1350+
FREE_COM(obj_prop);
13521351

13531352
return FAILURE;
13541353
}
@@ -1358,7 +1357,7 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
13581357
}
13591358
else
13601359
{
1361-
php_COM_destruct(obj_prop);
1360+
FREE_COM(obj_prop);
13621361
FREE_VARIANT(var_result);
13631362

13641363
return FAILURE;
@@ -1371,7 +1370,7 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
13711370

13721371
overloaded_property = (zend_overloaded_element *) element->data;
13731372
do_COM_propput(&result, obj, &overloaded_property->element, value);
1374-
php_COM_destruct(obj_prop);
1373+
FREE_COM(obj_prop);
13751374

13761375
pval_destructor(&overloaded_property->element);
13771376

@@ -1401,7 +1400,7 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
14011400
*object_handle = *return_value;
14021401
pval_copy_constructor(object_handle);
14031402
INIT_PZVAL(object_handle);
1404-
zend_hash_index_update(object->value.obj.properties, 0, &object_handle, sizeof(pval *), NULL);
1403+
zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
14051404
pval_destructor(&function_name->element);
14061405

14071406
return;
@@ -1417,8 +1416,8 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
14171416
pval_destructor(&function_name->element);
14181417
return;
14191418
}
1420-
zend_hash_index_find(property.value.obj.properties, 0, (void **) &handle);
1421-
obj = (comval *)zend_list_find((*handle)->value.lval,&type);
1419+
zend_hash_index_find(Z_OBJPROP(property), 0, (void **) &handle);
1420+
obj = (comval *)zend_list_find(Z_LVAL_PP(handle), &type);
14221421

14231422
if(!obj || (type != IS_COM))
14241423
{
@@ -1450,8 +1449,6 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
14501449

14511450
if(do_COM_invoke(obj , &function_name->element, var_result, arguments, arg_count) == FAILURE)
14521451
{
1453-
FREE_VARIANT(var_result);
1454-
14551452
RETVAL_FALSE;
14561453
}
14571454
else
@@ -1660,7 +1657,7 @@ static int php_COM_load_typelib(ITypeLib *TypeLib, int mode)
16601657
ITypeComp *TypeComp;
16611658
int i;
16621659
int interfaces;
1663-
ELS_FETCH();
1660+
TSRMLS_FETCH();
16641661

16651662
if(NULL == TypeLib)
16661663
{
@@ -1729,7 +1726,7 @@ static int php_COM_load_typelib(ITypeLib *TypeLib, int mode)
17291726

17301727
/* Before registering the contsnt, let's see if we can find it */
17311728
{
1732-
zend_register_constant(&c ELS_CC);
1729+
zend_register_constant(&c TSRMLS_CC);
17331730
}
17341731
j++;
17351732
}
@@ -1757,8 +1754,8 @@ PHP_FUNCTION(com_isenum)
17571754
getParameters(ht, 1, &object);
17581755

17591756
/* obtain IDispatch interface */
1760-
zend_hash_index_find(object->value.obj.properties, 0, (void **) &comval_handle);
1761-
obj = (comval *) zend_list_find((*comval_handle)->value.lval, &type);
1757+
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void **) &comval_handle);
1758+
obj = (comval *) zend_list_find(Z_LVAL_PP(comval_handle), &type);
17621759
if(!obj || (type != IS_COM))
17631760
{
17641761
php_error(E_WARNING,"%s is not a COM object handler", "");

ext/com/VARIANT.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,18 @@ PHP_MINIT_FUNCTION(VARIANT)
9898
REGISTER_LONG_CONSTANT("CP_ACP", CP_ACP, CONST_CS | CONST_PERSISTENT);
9999
REGISTER_LONG_CONSTANT("CP_MACCP", CP_MACCP, CONST_CS | CONST_PERSISTENT);
100100
REGISTER_LONG_CONSTANT("CP_OEMCP", CP_OEMCP, CONST_CS | CONST_PERSISTENT);
101-
REGISTER_LONG_CONSTANT("CP_SYMBOL", CP_SYMBOL, CONST_CS | CONST_PERSISTENT);
102-
REGISTER_LONG_CONSTANT("CP_THREAD_ACP", CP_THREAD_ACP, CONST_CS | CONST_PERSISTENT);
103101
REGISTER_LONG_CONSTANT("CP_UTF7", CP_UTF7, CONST_CS | CONST_PERSISTENT);
104102
REGISTER_LONG_CONSTANT("CP_UTF8", CP_UTF8, CONST_CS | CONST_PERSISTENT);
103+
#ifdef CP_SYMBOL
104+
REGISTER_LONG_CONSTANT("CP_SYMBOL", CP_SYMBOL, CONST_CS | CONST_PERSISTENT);
105+
#else
106+
# error "CP_SYMBOL undefined"
107+
#endif
108+
#ifdef CP_THREAD_ACP
109+
REGISTER_LONG_CONSTANT("CP_THREAD_ACP", CP_THREAD_ACP, CONST_CS | CONST_PERSISTENT);
110+
#else
111+
# error "CP_THREAD_ACP undefined"
112+
#endif
105113

106114
php_register_VARIANT_class();
107115
return SUCCESS;
@@ -169,8 +177,8 @@ void php_VARIANT_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_proper
169177
*object_handle = *return_value;
170178
pval_copy_constructor(object_handle);
171179
INIT_PZVAL(object_handle);
172-
zend_hash_index_update(object->value.obj.properties, 0, &object_handle, sizeof(pval *), NULL);
173-
pval_destructor(&function_name->element);
180+
zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
181+
zval_dtor(&function_name->element);
174182
}
175183
}
176184

@@ -184,7 +192,7 @@ pval php_VARIANT_get_property_handler(zend_property_reference *property_referenc
184192
VARIANT *var_arg;
185193

186194
/* fetch the VARIANT structure */
187-
zend_hash_index_find(object->value.obj.properties, 0, (void **) &var_handle);
195+
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void **) &var_handle);
188196
var_arg = zend_list_find(Z_LVAL_PP(var_handle), &type);
189197

190198
if(!var_arg || (type != IS_VARIANT))
@@ -220,7 +228,7 @@ pval php_VARIANT_get_property_handler(zend_property_reference *property_referenc
220228
php_error(E_WARNING, "Unknown method.");
221229
break;
222230

223-
pval_destructor(&overloaded_property->element);
231+
zval_dtor(&overloaded_property->element);
224232
}
225233
}
226234

@@ -236,15 +244,15 @@ int php_VARIANT_set_property_handler(zend_property_reference *property_reference
236244
VARIANT *var_arg;
237245

238246
/* fetch the VARIANT structure */
239-
zend_hash_index_find(object->value.obj.properties, 0, (void **) &var_handle);
247+
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void **) &var_handle);
240248
var_arg = zend_list_find(Z_LVAL_PP(var_handle), &type);
241249

242250
if(!var_arg || (type != IS_VARIANT))
243251
return FAILURE;
244252

245253
overloaded_property = (zend_overloaded_element *) property_reference->elements_list->head->data;
246254
do_VARIANT_propset(var_arg, &overloaded_property->element, value);
247-
pval_destructor(&overloaded_property->element);
255+
zval_dtor(&overloaded_property->element);
248256
return SUCCESS;
249257
}
250258

@@ -423,7 +431,7 @@ static int do_VARIANT_propset(VARIANT *var_arg, pval *arg_property, pval *value)
423431

424432
static void php_variant_destructor(zend_rsrc_list_entry *rsrc)
425433
{
426-
efree(rsrc);
434+
FREE_VARIANT(rsrc->ptr);
427435
}
428436

429437
void php_register_VARIANT_class()

ext/com/com.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,32 @@ typedef struct comval_ {
2020
} comval;
2121

2222
#define ZVAL_COM(z,o) { \
23-
pval *handle; \
23+
zval *handle; \
2424
\
25+
/* OBJECTS_FIXME */ \
2526
Z_TYPE_P(z) = IS_OBJECT; \
26-
(z)->value.obj.ce = &com_class_entry; \
27+
Z_OBJCE_P(z) = &com_class_entry; \
2728
\
28-
ALLOC_HASHTABLE((z)->value.obj.properties); \
29-
zend_hash_init((z)->value.obj.properties, 0, NULL, ZVAL_PTR_DTOR, 0); \
29+
ALLOC_HASHTABLE(Z_OBJPROP_P(z)); \
30+
zend_hash_init(Z_OBJPROP_P(z), 0, NULL, ZVAL_PTR_DTOR, 0); \
3031
\
3132
ALLOC_ZVAL(handle); \
3233
INIT_PZVAL(handle); \
3334
ZVAL_LONG(handle, zend_list_insert((o), IS_COM)); \
3435
\
35-
pval_copy_constructor(handle); \
36-
zend_hash_index_update((z)->value.obj.properties, 0, \
37-
&handle, sizeof(pval *), NULL); \
36+
zval_copy_ctor(handle); \
37+
zend_hash_index_update(Z_OBJPROP_P(z), 0, &handle, sizeof(zval *), NULL); \
3838
}
3939

40-
#define RETVAL_COM(o) ZVAL_COM(&return_value, o)
40+
#define RETVAL_COM(o) ZVAL_COM(&return_value, o);
4141
#define RETURN_COM(o) RETVAL_COM(o) \
4242
return;
4343

4444
#define ALLOC_COM(z) (z) = (comval *) emalloc(sizeof(comval)); \
4545
C_REFCOUNT(z) = 0;
4646

47+
#define FREE_COM(z) efree(z);
48+
4749
#define IS_COM php_COM_get_le_comval()
4850

4951
#define C_HASTLIB(x) ((x)->typelib)

ext/com/conversion.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage)
6262
break;
6363

6464
case IS_OBJECT:
65-
if(!strcmp(pval_arg->value.obj.ce->name, "VARIANT"))
65+
if(!strcmp(Z_OBJCE_P(pval_arg)->name, "VARIANT"))
6666
{
67-
type = VT_VARIANT;
67+
type = VT_VARIANT|VT_BYREF;
6868
}
69-
else if(!strcmp(pval_arg->value.obj.ce->name, "COM"))
69+
else if(!strcmp(Z_OBJCE_P(pval_arg)->name, "COM"))
7070
{
7171
type = VT_DISPATCH;
7272
}
@@ -386,7 +386,7 @@ static void pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, int type, int c
386386
pval **var_handle;
387387

388388
/* fetch the VARIANT structure */
389-
zend_hash_index_find(pval_arg->value.obj.properties, 0, (void **) &var_handle);
389+
zend_hash_index_find(Z_OBJPROP_P(pval_arg), 0, (void **) &var_handle);
390390

391391
V_VT(var_arg) = VT_VARIANT|VT_BYREF;
392392
V_VARIANTREF(var_arg) = (VARIANT FAR*) zend_list_find(Z_LVAL_P(*var_handle), &tp);
@@ -895,7 +895,7 @@ static void comval_to_variant(pval *pval_arg, VARIANT *var_arg)
895895
int type;
896896

897897
/* fetch the comval structure */
898-
zend_hash_index_find(pval_arg->value.obj.properties, 0, (void **) &comval_handle);
898+
zend_hash_index_find(Z_OBJPROP_P(pval_arg), 0, (void **) &comval_handle);
899899
obj = (comval *)zend_list_find(Z_LVAL_P(*comval_handle), &type);
900900
if(!obj || (type != IS_COM) || !C_ISREFD(obj))
901901
{

0 commit comments

Comments
 (0)