Skip to content

Commit abb4182

Browse files
committed
Address code review
1 parent e4de3b4 commit abb4182

15 files changed

+116
-111
lines changed

ext/curl/curl.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ function curl_multi_errno(CurlMulti $multi_handle): int {}
3737

3838
function curl_multi_exec(CurlMulti $multi_handle, &$still_running): int {}
3939

40-
function curl_multi_getcontent(CurlMulti $multi_handle): ?string {}
40+
function curl_multi_getcontent(Curl $multi_handle): ?string {}
4141

4242
function curl_multi_info_read(CurlMulti $multi_handle, &$msgs_in_queue = null): array|false {}
4343

ext/curl/curl_arginfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_exec, 0, 2, IS_LONG,
7373
ZEND_END_ARG_INFO()
7474

7575
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_getcontent, 0, 1, IS_STRING, 1)
76-
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMulti, 0)
76+
ZEND_ARG_OBJ_INFO(0, multi_handle, Curl, 0)
7777
ZEND_END_ARG_INFO()
7878

7979
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_curl_multi_info_read, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)

ext/curl/interface.c

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#endif
2222

2323
#include "php.h"
24+
#include "Zend/zend_interfaces.h"
2425

2526
#if HAVE_CURL
2627

@@ -231,6 +232,7 @@ ZEND_GET_MODULE (curl)
231232
/* Curl class */
232233

233234
zend_class_entry *curl_ce;
235+
zend_class_entry *curl_share_ce;
234236
static zend_object_handlers curl_object_handlers;
235237

236238
static zend_object *curl_create_object(zend_class_entry *class_type);
@@ -1190,15 +1192,18 @@ PHP_MINIT_FUNCTION(curl)
11901192

11911193
zend_class_entry ce;
11921194
INIT_CLASS_ENTRY(ce, "Curl", curl_object_methods);
1193-
ce.create_object = curl_create_object;
1194-
ce.ce_flags |= ZEND_ACC_FINAL;
11951195
curl_ce = zend_register_internal_class(&ce);
1196+
curl_ce->ce_flags |= ZEND_ACC_FINAL;
1197+
curl_ce->create_object = curl_create_object;
1198+
curl_ce->serialize = zend_class_serialize_deny;
1199+
curl_ce->unserialize = zend_class_unserialize_deny;
11961200

11971201
memcpy(&curl_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
11981202
curl_object_handlers.offset = XtOffsetOf(php_curl, std);
11991203
curl_object_handlers.free_obj = curl_free_obj;
12001204
curl_object_handlers.get_gc = curl_get_gc;
12011205
curl_object_handlers.get_constructor = curl_get_constructor;
1206+
curl_object_handlers.clone_obj = NULL;
12021207

12031208
curl_multi_register_class();
12041209
curl_share_register_class();
@@ -1212,7 +1217,6 @@ PHP_MINIT_FUNCTION(curl)
12121217

12131218
static zend_object *curl_create_object(zend_class_entry *class_type) {
12141219
php_curl *intern = zend_object_alloc(sizeof(php_curl), class_type);
1215-
memset(intern, 0, sizeof(php_curl) - sizeof(zend_object));
12161220

12171221
zend_object_std_init(&intern->std, class_type);
12181222
object_properties_init(&intern->std, class_type);
@@ -1300,8 +1304,8 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
13001304
int error;
13011305
zend_fcall_info fci;
13021306

1303-
GC_ADDREF(ch->res);
1304-
ZVAL_RES(&argv[0], ch->res);
1307+
GC_ADDREF(&ch->std);
1308+
ZVAL_OBJ(&argv[0], &ch->std);
13051309
ZVAL_STRINGL(&argv[1], data, length);
13061310

13071311
fci.size = sizeof(fci);
@@ -1347,8 +1351,8 @@ static int curl_fnmatch(void *ctx, const char *pattern, const char *string)
13471351
int error;
13481352
zend_fcall_info fci;
13491353

1350-
GC_ADDREF(ch->res);
1351-
ZVAL_RES(&argv[0], ch->res);
1354+
GC_ADDREF(&ch->std);
1355+
ZVAL_OBJ(&argv[0], &ch->std);
13521356
ZVAL_STRING(&argv[1], pattern);
13531357
ZVAL_STRING(&argv[2], string);
13541358

@@ -1399,8 +1403,8 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double
13991403
int error;
14001404
zend_fcall_info fci;
14011405

1402-
GC_ADDREF(ch->res);
1403-
ZVAL_RES(&argv[0], ch->res);
1406+
GC_ADDREF(&ch->std);
1407+
ZVAL_OBJ(&argv[0], &ch->std);
14041408
ZVAL_LONG(&argv[1], (zend_long)dltotal);
14051409
ZVAL_LONG(&argv[2], (zend_long)dlnow);
14061410
ZVAL_LONG(&argv[3], (zend_long)ultotal);
@@ -1453,8 +1457,8 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
14531457
int error;
14541458
zend_fcall_info fci;
14551459

1456-
GC_ADDREF(ch->res);
1457-
ZVAL_RES(&argv[0], ch->res);
1460+
GC_ADDREF(&ch->std);
1461+
ZVAL_OBJ(&argv[0], &ch->std);
14581462
if (t->res) {
14591463
GC_ADDREF(t->res);
14601464
ZVAL_RES(&argv[1], t->res);
@@ -1522,8 +1526,8 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx
15221526
int error;
15231527
zend_fcall_info fci;
15241528

1525-
GC_ADDREF(ch->res);
1526-
ZVAL_RES(&argv[0], ch->res);
1529+
GC_ADDREF(&ch->std);
1530+
ZVAL_OBJ(&argv[0], &ch->std);
15271531
ZVAL_STRINGL(&argv[1], data, length);
15281532

15291533
fci.size = sizeof(fci);
@@ -1715,9 +1719,8 @@ php_curl *alloc_curl_handle(zval *curl)
17151719

17161720
ch->to_free->slist = emalloc(sizeof(HashTable));
17171721
zend_hash_init(ch->to_free->slist, 4, NULL, curl_free_slist, 0);
1718-
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
17191722
ZVAL_UNDEF(&ch->postfields);
1720-
#endif
1723+
17211724
return ch;
17221725
}
17231726
/* }}} */
@@ -1822,7 +1825,7 @@ PHP_FUNCTION(curl_init)
18221825

18231826
if (url) {
18241827
if (php_curl_option_url(ch, ZSTR_VAL(url), ZSTR_LEN(url)) == FAILURE) {
1825-
curl_free_obj(Z_OBJ_P(return_value));
1828+
zval_ptr_dtor(return_value);
18261829
RETURN_FALSE;
18271830
}
18281831
}
@@ -2015,8 +2018,8 @@ static inline int build_mime_structure_from_hash(php_curl *ch, zval *zpostfields
20152018
filename = Z_STRVAL_P(prop);
20162019
}
20172020

2018-
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
20192021
zval_ptr_dtor(&ch->postfields);
2022+
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
20202023
ZVAL_COPY(&ch->postfields, zpostfields);
20212024

20222025
if ((stream = php_stream_open_wrapper(ZSTR_VAL(postval), "rb", STREAM_MUST_SEEK, NULL))) {
@@ -2124,9 +2127,7 @@ PHP_FUNCTION(curl_copy_handle)
21242127
CURL *cp;
21252128
zval *zid;
21262129
php_curl *dupch;
2127-
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
21282130
zval *postfields;
2129-
#endif
21302131

21312132
ZEND_PARSE_PARAMETERS_START(1,1)
21322133
Z_PARAM_OBJECT_OF_CLASS(zid, curl_ce)
@@ -2145,16 +2146,14 @@ PHP_FUNCTION(curl_copy_handle)
21452146

21462147
_php_setup_easy_copy_handlers(dupch, ch);
21472148

2148-
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
21492149
postfields = &ch->postfields;
21502150
if (Z_TYPE_P(postfields) != IS_UNDEF) {
21512151
if (build_mime_structure_from_hash(dupch, postfields) != SUCCESS) {
2152-
curl_free_obj(Z_OBJ_P(return_value));
2152+
zval_ptr_dtor(return_value);
21532153
php_error_docref(NULL, E_WARNING, "Cannot rebuild mime structure");
21542154
RETURN_FALSE;
21552155
}
21562156
}
2157-
#endif
21582157
}
21592158
/* }}} */
21602159

@@ -2784,8 +2783,12 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
27842783

27852784
case CURLOPT_SHARE:
27862785
{
2787-
php_curlsh *sh = Z_CURL_SHARE_P(zvalue);
2788-
curl_easy_setopt(ch->cp, CURLOPT_SHARE, sh->share);
2786+
if (Z_TYPE_P(zvalue) == IS_OBJECT && Z_OBJCE_P(zvalue) == curl_share_ce) {
2787+
php_curlsh *sh = Z_CURL_SHARE_P(zvalue);
2788+
curl_easy_setopt(ch->cp, CURLOPT_SHARE, sh->share);
2789+
} else {
2790+
return FAILURE;
2791+
}
27892792
}
27902793
break;
27912794

@@ -3323,13 +3326,9 @@ static void curl_free_obj(zend_object *object)
33233326
}
33243327

33253328
efree(ch->handlers);
3326-
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
33273329
zval_ptr_dtor(&ch->postfields);
3328-
#endif
33293330

33303331
zend_object_std_dtor(&ch->std);
3331-
3332-
efree(ch);
33333332
}
33343333
/* }}} */
33353334

ext/curl/multi.c

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#endif
2222

2323
#include "php.h"
24+
#include "Zend/zend_interfaces.h"
2425

2526
#if HAVE_CURL
2627

@@ -49,6 +50,8 @@
4950

5051
/* CurlMulti class */
5152

53+
static zend_class_entry *curl_multi_ce;
54+
5255
static inline php_curlm *curl_multi_from_obj(zend_object *obj) {
5356
return (php_curlm *)((char *)(obj) - XtOffsetOf(php_curlm, std));
5457
}
@@ -107,15 +110,13 @@ PHP_FUNCTION(curl_multi_add_handle)
107110
void _php_curl_multi_cleanup_list(void *data) /* {{{ */
108111
{
109112
zval *z_ch = (zval *)data;
110-
php_curl *ch;
111113

112114
if (!z_ch) {
113115
return;
114116
}
115117
if (!Z_RES_P(z_ch)->ptr) {
116118
return;
117119
}
118-
ch = Z_CURL_P(z_ch);
119120

120121
zend_list_delete(Z_RES_P(z_ch));
121122
}
@@ -229,7 +230,7 @@ PHP_FUNCTION(curl_multi_exec)
229230

230231
for (pz_ch = (zval *)zend_llist_get_first_ex(&mh->easyh, &pos); pz_ch;
231232
pz_ch = (zval *)zend_llist_get_next_ex(&mh->easyh, &pos)) {
232-
ch = Z_CURL_P(pz_ch);
233+
ch = Z_CURL_P(pz_ch);
233234

234235
_php_curl_verify_handlers(ch, 1);
235236
}
@@ -251,7 +252,7 @@ PHP_FUNCTION(curl_multi_getcontent)
251252
zval *z_ch;
252253
php_curl *ch;
253254

254-
ZEND_PARSE_PARAMETERS_START(1,1)
255+
ZEND_PARSE_PARAMETERS_START(1, 1)
255256
Z_PARAM_OBJECT_OF_CLASS(z_ch, curl_ce)
256257
ZEND_PARSE_PARAMETERS_END();
257258

@@ -538,7 +539,6 @@ static const zend_function_entry curl_multi_methods[] = {
538539

539540
static zend_object *curl_multi_create_object(zend_class_entry *class_type) {
540541
php_curlm *intern = zend_object_alloc(sizeof(php_curlm), class_type);
541-
memset(intern, 0, sizeof(php_curlm) - sizeof(zend_object));
542542

543543
zend_object_std_init(&intern->std, class_type);
544544
object_properties_init(&intern->std, class_type);
@@ -556,47 +556,46 @@ void curl_multi_free_obj(zend_object *object)
556556
{
557557
php_curlm *mh = curl_multi_from_obj(object);
558558

559-
if (mh) {
560-
zend_llist_position pos;
561-
php_curl *ch;
562-
zval *pz_ch;
563-
564-
for (pz_ch = (zval *)zend_llist_get_first_ex(&mh->easyh, &pos); pz_ch;
565-
pz_ch = (zval *)zend_llist_get_next_ex(&mh->easyh, &pos)) {
566-
/* ptr is NULL means it already be freed */
567-
if (Z_RES_P(pz_ch)->ptr) {
568-
ch = Z_CURL_P(pz_ch);
569-
_php_curl_verify_handlers(ch, 0);
570-
}
571-
}
559+
zend_llist_position pos;
560+
php_curl *ch;
561+
zval *pz_ch;
572562

573-
curl_multi_cleanup(mh->multi);
574-
zend_llist_clean(&mh->easyh);
575-
if (mh->handlers->server_push) {
576-
zval_ptr_dtor(&mh->handlers->server_push->func_name);
577-
efree(mh->handlers->server_push);
578-
}
579-
if (mh->handlers) {
580-
efree(mh->handlers);
563+
for (pz_ch = (zval *)zend_llist_get_first_ex(&mh->easyh, &pos); pz_ch;
564+
pz_ch = (zval *)zend_llist_get_next_ex(&mh->easyh, &pos)) {
565+
/* ptr is NULL means it already be freed */
566+
if (Z_OBJ_P(pz_ch)) {
567+
ch = Z_CURL_P(pz_ch);
568+
_php_curl_verify_handlers(ch, 0);
581569
}
570+
}
582571

583-
zend_object_std_dtor(&mh->std);
584-
585-
efree(mh);
572+
curl_multi_cleanup(mh->multi);
573+
zend_llist_clean(&mh->easyh);
574+
if (mh->handlers->server_push) {
575+
zval_ptr_dtor(&mh->handlers->server_push->func_name);
576+
efree(mh->handlers->server_push);
586577
}
578+
if (mh->handlers) {
579+
efree(mh->handlers);
580+
}
581+
582+
zend_object_std_dtor(&mh->std);
587583
}
588584

589585
void curl_multi_register_class(void) {
590586
zend_class_entry ce_multi;
591587
INIT_CLASS_ENTRY(ce_multi, "CurlMulti", curl_multi_methods);
592-
ce_multi.create_object = curl_multi_create_object;
593-
ce_multi.ce_flags |= ZEND_ACC_FINAL;
594588
curl_multi_ce = zend_register_internal_class(&ce_multi);
589+
curl_multi_ce->ce_flags |= ZEND_ACC_FINAL;
590+
curl_multi_ce->create_object = curl_multi_create_object;
591+
curl_multi_ce->serialize = zend_class_serialize_deny;
592+
curl_multi_ce->unserialize = zend_class_unserialize_deny;
595593

596594
memcpy(&curl_multi_handlers, &std_object_handlers, sizeof(zend_object_handlers));
597595
curl_multi_handlers.offset = XtOffsetOf(php_curlm, std);
598596
curl_multi_handlers.free_obj = curl_multi_free_obj;
599597
curl_multi_handlers.get_constructor = curl_multi_get_constructor;
598+
curl_multi_handlers.clone_obj = NULL;
600599
}
601600

602601
#endif

ext/curl/php_curl.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,13 @@ struct _php_curl_free {
117117
typedef struct {
118118
CURL *cp;
119119
php_curl_handlers *handlers;
120-
zend_resource *res;
121120
struct _php_curl_free *to_free;
122121
struct _php_curl_send_headers header;
123122
struct _php_curl_error err;
124123
zend_bool in_callback;
125124
uint32_t* clone;
126-
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
127125
zval postfields;
128126
zend_object std;
129-
#endif
130127
} php_curl;
131128

132129
#define CURLOPT_SAFE_UPLOAD -1
@@ -173,14 +170,12 @@ static inline php_curlsh *curl_share_from_obj(zend_object *obj) {
173170
#define Z_CURL_SHARE_P(zv) curl_share_from_obj(Z_OBJ_P(zv))
174171

175172
PHP_CURL_API extern zend_class_entry *curl_ce;
173+
PHP_CURL_API extern zend_class_entry *curl_share_ce;
176174

177-
PHP_CURL_API extern zend_class_entry *curl_multi_ce;
178175
void curl_multi_register_class(void);
179-
180-
PHP_CURL_API extern zend_class_entry *curl_share_ce;
181176
void curl_share_register_class(void);
182-
183177
void curlfile_register_class(void);
178+
184179
PHP_CURL_API extern zend_class_entry *curl_CURLFile_class;
185180

186181
#else

0 commit comments

Comments
 (0)