Skip to content

Commit bcddfd4

Browse files
author
Thies C. Arntzen
committed
cleaned up the RETVAL_ RETURN_ and ZVAL_ macros
added check for \0 at end-of-string at some places. all strings in PHP have to be terminated with \0 because 3th party libraries might not be binary-safe.
1 parent 6297cd2 commit bcddfd4

File tree

2 files changed

+41
-107
lines changed

2 files changed

+41
-107
lines changed

Zend/zend_API.h

Lines changed: 39 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -241,36 +241,50 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length,
241241

242242
#define add_method(arg,key,method) add_assoc_function((arg),(key),(method))
243243

244+
#if ZEND_DEBUG
245+
#define CHECK_ZVAL_STRING(z) \
246+
if ((z)->value.str.val[ (z)->value.str.len ] != '\0') zend_error(E_WARNING, "String is not zero-terminated (%s)",(z)->value.str.val);
247+
#else
248+
#define CHECK_ZVAL_STRING(z)
249+
#endif
250+
244251
#define ZVAL_RESOURCE(z,l) { \
245252
(z)->type = IS_RESOURCE; \
246253
(z)->value.lval = l; \
247254
}
255+
248256
#define ZVAL_BOOL(z,b) { \
249257
(z)->type = IS_BOOL; \
250258
(z)->value.lval = b; \
251259
}
260+
252261
#define ZVAL_NULL(z) { \
253262
(z)->type = IS_NULL; \
254263
}
264+
255265
#define ZVAL_LONG(z,l) { \
256266
(z)->type = IS_LONG; \
257267
(z)->value.lval = l; \
258268
}
269+
259270
#define ZVAL_DOUBLE(z,d) { \
260271
(z)->type = IS_DOUBLE; \
261272
(z)->value.dval = d; \
262273
}
274+
263275
#define ZVAL_STRING(z,s,duplicate) { \
264276
char *__s=(s); \
265277
(z)->value.str.len = strlen(__s); \
266278
(z)->value.str.val = (duplicate?estrndup(__s,(z)->value.str.len):__s); \
267279
(z)->type = IS_STRING; \
268280
}
281+
269282
#define ZVAL_STRINGL(z,s,l,duplicate) { \
270283
char *__s=(s); int __l=l; \
271284
(z)->value.str.len = __l; \
272285
(z)->value.str.val = (duplicate?estrndup(__s,__l):__s); \
273286
(z)->type = IS_STRING; \
287+
CHECK_ZVAL_STRING(z); \
274288
}
275289

276290
#define ZVAL_EMPTY_STRING(z) { \
@@ -282,142 +296,60 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length,
282296
#define ZVAL_FALSE { (z)->value.lval = 0; (z)->type = IS_BOOL; }
283297
#define ZVAL_TRUE { (z)->value.lval = 1; (z)->type = IS_BOOL; }
284298

285-
#define RETVAL_RESOURCE(l) { \
286-
return_value->type = IS_RESOURCE;\
287-
return_value->value.lval = l; \
288-
}
289-
#define RETVAL_BOOL(b) { \
290-
return_value->type = IS_BOOL; \
291-
return_value->value.lval = b; \
292-
}
293-
#define RETVAL_NULL() { \
294-
return_value->type = IS_NULL; \
295-
}
296-
#define RETVAL_LONG(l) { \
297-
return_value->type = IS_LONG; \
298-
return_value->value.lval = l; \
299-
}
300-
#define RETVAL_DOUBLE(d) { \
301-
return_value->type = IS_DOUBLE; \
302-
return_value->value.dval = d; \
303-
}
304-
#define RETVAL_STRING(s,duplicate) { \
305-
char *__s=(s); \
306-
return_value->value.str.len = strlen(__s); \
307-
return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \
308-
return_value->type = IS_STRING; \
309-
}
310-
#define RETVAL_STRINGL(s,l,duplicate) { \
311-
char *__s=(s); int __l=l; \
312-
return_value->value.str.len = __l; \
313-
return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \
314-
return_value->type = IS_STRING; \
315-
}
316-
317-
#define RETVAL_EMPTY_STRING() { \
318-
return_value->value.str.len = 0; \
319-
return_value->value.str.val = empty_string; \
320-
return_value->type = IS_STRING; \
321-
}
322-
323-
#define RETVAL_FALSE { return_value->value.lval = 0; return_value->type = IS_BOOL; }
324-
#define RETVAL_TRUE { return_value->value.lval = 1; return_value->type = IS_BOOL; }
325-
326-
#define RETURN_RESOURCE(l) { \
327-
return_value->type = IS_RESOURCE;\
328-
return_value->value.lval = l; \
329-
return; \
330-
}
331-
332-
#define RETURN_BOOL(b) { \
333-
return_value->type = IS_BOOL; \
334-
return_value->value.lval = b; \
335-
return; \
336-
}
337-
338-
#define RETURN_NULL() { \
339-
return_value->type = IS_NULL; \
340-
return; \
341-
}
342-
343-
#define RETURN_LONG(l) { \
344-
return_value->type = IS_LONG; \
345-
return_value->value.lval = l; \
346-
return; \
347-
}
348-
#define RETURN_DOUBLE(d) { \
349-
return_value->type = IS_DOUBLE; \
350-
return_value->value.dval = d; \
351-
return; \
352-
}
353-
#define RETURN_STRING(s,duplicate) { \
354-
char *__s=(s); \
355-
return_value->value.str.len = strlen(__s); \
356-
return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \
357-
return_value->type = IS_STRING; \
358-
return; \
359-
}
360-
#define RETURN_STRINGL(s,l,duplicate) { \
361-
char *__s=(s); int __l=l; \
362-
return_value->value.str.len = __l; \
363-
return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \
364-
return_value->type = IS_STRING; \
365-
return; \
366-
}
367-
368-
#define RETURN_EMPTY_STRING() { \
369-
return_value->value.str.len = 0; \
370-
return_value->value.str.val = empty_string; \
371-
return_value->type = IS_STRING; \
372-
return; \
373-
}
374-
375-
#define RETURN_FALSE { RETVAL_FALSE; return; }
376-
#define RETURN_TRUE { RETVAL_TRUE; return; }
299+
#define RETVAL_RESOURCE(l) ZVAL_RESOURCE(return_value,l)
300+
#define RETVAL_BOOL(b) ZVAL_BOOL(return_value,b)
301+
#define RETVAL_NULL() ZVAL_NULL(return_value)
302+
#define RETVAL_LONG(l) ZVAL_LONG(return_value,l)
303+
#define RETVAL_DOUBLE(d) ZVAL_DOUBLE(return_value,d)
304+
#define RETVAL_STRING(s,duplicate) ZVAL_STRING(return_value,s,duplicate)
305+
#define RETVAL_STRINGL(s,l,duplicate) ZVAL_STRINGL(return_value,s,l,duplicate)
306+
#define RETVAL_EMPTY_STRING() ZVAL_EMPTY_STRING(return_value)
307+
#define RETVAL_FALSE ZVAL_BOOL(return_value,0)
308+
#define RETVAL_TRUE ZVAL_BOOL(return_value,1)
309+
310+
#define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; }
311+
#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }
312+
#define RETURN_NULL() { RETVAL_NULL(); return;}
313+
#define RETURN_LONG(l) { RETVAL_LONG(l); return; }
314+
#define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; }
315+
#define RETURN_STRING(s,duplicate) { RETVAL_STRING(s,duplicate); return; }
316+
#define RETURN_STRINGL(s,l,duplicate) { RETVAL_STRINGL(s,l,duplicate); return; }
317+
#define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }
318+
#define RETURN_FALSE { RETVAL_FALSE; return; }
319+
#define RETURN_TRUE { RETVAL_TRUE; return; }
377320

378321
#define SET_VAR_STRING(n,v) { \
379322
{ \
380323
zval *var; \
381-
char *str=(v); /* prevent 'v' from being evaluated more than once */ \
382-
\
383324
ALLOC_ZVAL(var); \
384-
var->value.str.val = (str); \
385-
var->value.str.len = strlen((str)); \
386-
var->type = IS_STRING; \
325+
ZVAL_STRING(var,v,0); \
387326
ZEND_SET_GLOBAL_VAR(n, var); \
388327
} \
389328
}
390329

391330
#define SET_VAR_STRINGL(n,v,l) { \
392331
{ \
393332
zval *var; \
394-
\
395333
ALLOC_ZVAL(var); \
396-
var->value.str.val = (v); \
397-
var->value.str.len = (l); \
398-
var->type = IS_STRING; \
334+
ZVAL_STRINGL(var,v,l,0); \
399335
ZEND_SET_GLOBAL_VAR(n, var); \
400336
} \
401337
}
402338

403339
#define SET_VAR_LONG(n,v) { \
404340
{ \
405341
zval *var; \
406-
\
407342
ALLOC_ZVAL(var); \
408-
var->value.lval = (v); \
409-
var->type = IS_LONG; \
343+
ZVAL_LONG(var,v); \
410344
ZEND_SET_GLOBAL_VAR(n, var); \
411345
} \
412346
}
413347

414348
#define SET_VAR_DOUBLE(n,v) { \
415349
{ \
416350
zval *var; \
417-
\
418351
ALLOC_ZVAL(var); \
419-
var->value.dval = (v); \
420-
var->type = IS_DOUBLE; \
352+
ZVAL_DOUBLE(var,v); \
421353
ZEND_SET_GLOBAL_VAR(n, var); \
422354
} \
423355
}

Zend/zend_variables.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ ZEND_API void _zval_dtor(zval *zvalue ZEND_FILE_LINE_DC)
5959
switch(zvalue->type) {
6060
case IS_STRING:
6161
case IS_CONSTANT:
62+
CHECK_ZVAL_STRING(zvalue);
6263
STR_FREE_REL(zvalue->value.str.val);
6364
break;
6465
case IS_ARRAY:
@@ -114,6 +115,7 @@ ZEND_API int _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC)
114115
return SUCCESS;
115116
}
116117
}
118+
CHECK_ZVAL_STRING(zvalue);
117119
zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len);
118120
break;
119121
case IS_ARRAY:

0 commit comments

Comments
 (0)