@@ -1407,6 +1407,22 @@ ftp_getresp(ftpbuf_t *ftp)
1407
1407
}
1408
1408
/* }}} */
1409
1409
1410
+ static ssize_t my_send_wrapper_with_restart (php_socket_t fd , const void * buf , size_t size , int flags ) {
1411
+ ssize_t n ;
1412
+ do {
1413
+ n = send (fd , buf , size , flags );
1414
+ } while (n == -1 && php_socket_errno () == EINTR );
1415
+ return n ;
1416
+ }
1417
+
1418
+ static ssize_t my_recv_wrapper_with_restart (php_socket_t fd , void * buf , size_t size , int flags ) {
1419
+ ssize_t n ;
1420
+ do {
1421
+ n = recv (fd , buf , size , flags );
1422
+ } while (n == -1 && php_socket_errno () == EINTR );
1423
+ return n ;
1424
+ }
1425
+
1410
1426
int single_send (ftpbuf_t * ftp , php_socket_t s , void * buf , size_t size ) {
1411
1427
#ifdef HAVE_FTP_SSL
1412
1428
int err ;
@@ -1422,7 +1438,7 @@ int single_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t size) {
1422
1438
handle = ftp -> data -> ssl_handle ;
1423
1439
fd = ftp -> data -> fd ;
1424
1440
} else {
1425
- return send (s , buf , size , 0 );
1441
+ return my_send_wrapper_with_restart (s , buf , size , 0 );
1426
1442
}
1427
1443
1428
1444
do {
@@ -1461,8 +1477,33 @@ int single_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t size) {
1461
1477
} while (retry );
1462
1478
return sent ;
1463
1479
#else
1464
- return send (s , buf , size , 0 );
1480
+ return my_send_wrapper_with_restart (s , buf , size , 0 );
1481
+ #endif
1482
+ }
1483
+
1484
+ static int my_poll (php_socket_t fd , int events , int timeout ) {
1485
+ int n ;
1486
+ zend_hrtime_t timeout_hr = (zend_hrtime_t ) timeout * 1000000 ;
1487
+
1488
+ while (true) {
1489
+ zend_hrtime_t start_ns = zend_hrtime ();
1490
+ n = php_pollfd_for_ms (fd , events , (int ) (timeout_hr / 1000000 ));
1491
+
1492
+ if (n == -1 && php_socket_errno () == EINTR ) {
1493
+ zend_hrtime_t delta_ns = zend_hrtime () - start_ns ;
1494
+ if (delta_ns > timeout_hr ) {
1495
+ #ifndef PHP_WIN32
1496
+ errno = ETIMEDOUT ;
1465
1497
#endif
1498
+ break ;
1499
+ }
1500
+ timeout_hr -= delta_ns ;
1501
+ } else {
1502
+ break ;
1503
+ }
1504
+ }
1505
+
1506
+ return n ;
1466
1507
}
1467
1508
1468
1509
/* {{{ my_send */
@@ -1474,7 +1515,7 @@ my_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
1474
1515
1475
1516
size = len ;
1476
1517
while (size ) {
1477
- n = php_pollfd_for_ms (s , POLLOUT , ftp -> timeout_sec * 1000 );
1518
+ n = my_poll (s , POLLOUT , ftp -> timeout_sec * 1000 );
1478
1519
1479
1520
if (n < 1 ) {
1480
1521
char buf [256 ];
@@ -1513,7 +1554,7 @@ my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
1513
1554
SSL * handle = NULL ;
1514
1555
php_socket_t fd ;
1515
1556
#endif
1516
- n = php_pollfd_for_ms (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1557
+ n = my_poll (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1517
1558
if (n < 1 ) {
1518
1559
char buf [256 ];
1519
1560
if (n == 0 ) {
@@ -1573,7 +1614,7 @@ my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
1573
1614
} while (retry );
1574
1615
} else {
1575
1616
#endif
1576
- nr_bytes = recv (s , buf , len , 0 );
1617
+ nr_bytes = my_recv_wrapper_with_restart (s , buf , len , 0 );
1577
1618
#ifdef HAVE_FTP_SSL
1578
1619
}
1579
1620
#endif
@@ -1587,7 +1628,7 @@ data_available(ftpbuf_t *ftp, php_socket_t s)
1587
1628
{
1588
1629
int n ;
1589
1630
1590
- n = php_pollfd_for_ms (s , PHP_POLLREADABLE , 1000 );
1631
+ n = my_poll (s , PHP_POLLREADABLE , 1000 );
1591
1632
if (n < 1 ) {
1592
1633
char buf [256 ];
1593
1634
if (n == 0 ) {
@@ -1610,7 +1651,7 @@ data_writeable(ftpbuf_t *ftp, php_socket_t s)
1610
1651
{
1611
1652
int n ;
1612
1653
1613
- n = php_pollfd_for_ms (s , POLLOUT , 1000 );
1654
+ n = my_poll (s , POLLOUT , 1000 );
1614
1655
if (n < 1 ) {
1615
1656
char buf [256 ];
1616
1657
if (n == 0 ) {
@@ -1634,7 +1675,7 @@ my_accept(ftpbuf_t *ftp, php_socket_t s, struct sockaddr *addr, socklen_t *addrl
1634
1675
{
1635
1676
int n ;
1636
1677
1637
- n = php_pollfd_for_ms (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1678
+ n = my_poll (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1638
1679
if (n < 1 ) {
1639
1680
char buf [256 ];
1640
1681
if (n == 0 ) {
0 commit comments