Skip to content

Commit f32867a

Browse files
authored
fix curl multi bug (#4147)
* defense * optimize
1 parent 653f2fe commit f32867a

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

ext-src/swoole_curl.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ CURLcode Multi::exec(php_curl *ch) {
175175
if (sockfd >= 0 && handle->socket && handle->socket->removed) {
176176
swoole_event_add(handle->socket, get_event(handle->action));
177177
}
178+
if (!timer && handle->socket->removed) {
179+
break;
180+
}
178181
}
179182

180183
CURLcode retval = read_info();
@@ -228,6 +231,7 @@ long Multi::select(php_curlm *mh) {
228231
co = nullptr;
229232
};
230233

234+
int event_count = 0;
231235
for (zend_llist_element *element = mh->easyh.head; element; element = element->next) {
232236
zval *z_ch = (zval *) element->data;
233237
php_curl *ch;
@@ -236,12 +240,18 @@ long Multi::select(php_curlm *mh) {
236240
}
237241
Handle *handle = get_handle(ch->cp);
238242
if (handle && handle->socket && handle->socket->removed) {
239-
swoole_event_add(handle->socket, get_event(handle->action));
243+
if (swoole_event_add(handle->socket, get_event(handle->action)) == SW_OK) {
244+
event_count++;
245+
}
240246
swTraceLog(SW_TRACE_CO_CURL, "resume, handle=%p, curl=%p, fd=%d", handle, ch->cp, handle->socket->get_fd());
241247
}
242248
}
243249
set_timer();
244250

251+
// no events and timers, should not be suspended
252+
if (!timer && event_count == 0) {
253+
return 0;
254+
}
245255
co->yield();
246256
auto count = selector->active_handles.size();
247257

0 commit comments

Comments
 (0)