@@ -1387,6 +1387,22 @@ ftp_getresp(ftpbuf_t *ftp)
1387
1387
}
1388
1388
/* }}} */
1389
1389
1390
+ static ssize_t my_send_wrapper_with_restart (php_socket_t fd , const void * buf , size_t size , int flags ) {
1391
+ ssize_t n ;
1392
+ do {
1393
+ n = send (fd , buf , size , flags );
1394
+ } while (n == -1 && php_socket_errno () == EINTR );
1395
+ return n ;
1396
+ }
1397
+
1398
+ static ssize_t my_recv_wrapper_with_restart (php_socket_t fd , void * buf , size_t size , int flags ) {
1399
+ ssize_t n ;
1400
+ do {
1401
+ n = recv (fd , buf , size , flags );
1402
+ } while (n == -1 && php_socket_errno () == EINTR );
1403
+ return n ;
1404
+ }
1405
+
1390
1406
int single_send (ftpbuf_t * ftp , php_socket_t s , void * buf , size_t size ) {
1391
1407
#ifdef HAVE_FTP_SSL
1392
1408
int err ;
@@ -1402,7 +1418,7 @@ int single_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t size) {
1402
1418
handle = ftp -> data -> ssl_handle ;
1403
1419
fd = ftp -> data -> fd ;
1404
1420
} else {
1405
- return send (s , buf , size , 0 );
1421
+ return my_send_wrapper_with_restart (s , buf , size , 0 );
1406
1422
}
1407
1423
1408
1424
do {
@@ -1441,8 +1457,33 @@ int single_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t size) {
1441
1457
} while (retry );
1442
1458
return sent ;
1443
1459
#else
1444
- return send (s , buf , size , 0 );
1460
+ return my_send_wrapper_with_restart (s , buf , size , 0 );
1461
+ #endif
1462
+ }
1463
+
1464
+ static int my_poll (php_socket_t fd , int events , int timeout ) {
1465
+ int n ;
1466
+ zend_hrtime_t timeout_hr = (zend_hrtime_t ) timeout * 1000000 ;
1467
+
1468
+ while (true) {
1469
+ zend_hrtime_t start_ns = zend_hrtime ();
1470
+ n = php_pollfd_for_ms (fd , events , (int ) (timeout_hr / 1000000 ));
1471
+
1472
+ if (n == -1 && php_socket_errno () == EINTR ) {
1473
+ zend_hrtime_t delta_ns = zend_hrtime () - start_ns ;
1474
+ if (delta_ns > timeout_hr ) {
1475
+ #ifndef PHP_WIN32
1476
+ errno = ETIMEDOUT ;
1445
1477
#endif
1478
+ break ;
1479
+ }
1480
+ timeout_hr -= delta_ns ;
1481
+ } else {
1482
+ break ;
1483
+ }
1484
+ }
1485
+
1486
+ return n ;
1446
1487
}
1447
1488
1448
1489
/* {{{ my_send */
@@ -1454,7 +1495,7 @@ my_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
1454
1495
1455
1496
size = len ;
1456
1497
while (size ) {
1457
- n = php_pollfd_for_ms (s , POLLOUT , ftp -> timeout_sec * 1000 );
1498
+ n = my_poll (s , POLLOUT , ftp -> timeout_sec * 1000 );
1458
1499
1459
1500
if (n < 1 ) {
1460
1501
char buf [256 ];
@@ -1493,7 +1534,7 @@ my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
1493
1534
SSL * handle = NULL ;
1494
1535
php_socket_t fd ;
1495
1536
#endif
1496
- n = php_pollfd_for_ms (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1537
+ n = my_poll (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1497
1538
if (n < 1 ) {
1498
1539
char buf [256 ];
1499
1540
if (n == 0 ) {
@@ -1553,7 +1594,7 @@ my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
1553
1594
} while (retry );
1554
1595
} else {
1555
1596
#endif
1556
- nr_bytes = recv (s , buf , len , 0 );
1597
+ nr_bytes = my_recv_wrapper_with_restart (s , buf , len , 0 );
1557
1598
#ifdef HAVE_FTP_SSL
1558
1599
}
1559
1600
#endif
@@ -1567,7 +1608,7 @@ data_available(ftpbuf_t *ftp, php_socket_t s)
1567
1608
{
1568
1609
int n ;
1569
1610
1570
- n = php_pollfd_for_ms (s , PHP_POLLREADABLE , 1000 );
1611
+ n = my_poll (s , PHP_POLLREADABLE , 1000 );
1571
1612
if (n < 1 ) {
1572
1613
char buf [256 ];
1573
1614
if (n == 0 ) {
@@ -1590,7 +1631,7 @@ data_writeable(ftpbuf_t *ftp, php_socket_t s)
1590
1631
{
1591
1632
int n ;
1592
1633
1593
- n = php_pollfd_for_ms (s , POLLOUT , 1000 );
1634
+ n = my_poll (s , POLLOUT , 1000 );
1594
1635
if (n < 1 ) {
1595
1636
char buf [256 ];
1596
1637
if (n == 0 ) {
@@ -1614,7 +1655,7 @@ my_accept(ftpbuf_t *ftp, php_socket_t s, struct sockaddr *addr, socklen_t *addrl
1614
1655
{
1615
1656
int n ;
1616
1657
1617
- n = php_pollfd_for_ms (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1658
+ n = my_poll (s , PHP_POLLREADABLE , ftp -> timeout_sec * 1000 );
1618
1659
if (n < 1 ) {
1619
1660
char buf [256 ];
1620
1661
if (n == 0 ) {
0 commit comments