@@ -75,30 +75,36 @@ static ssize_t php_sockop_write(php_stream *stream, const char *buf, size_t coun
75
75
didwrite = send (sock -> socket , buf , XP_SOCK_BUF_SIZE (count ), (sock -> is_blocked && ptimeout ) ? MSG_DONTWAIT : 0 );
76
76
77
77
if (didwrite <= 0 ) {
78
- int err = php_socket_errno ();
79
78
char * estr ;
79
+ int err = php_socket_errno ();
80
+ if (err == EWOULDBLOCK || err == EAGAIN ) {
81
+ if (sock -> is_blocked ) {
82
+ int retval ;
80
83
81
- if (sock -> is_blocked && (err == EWOULDBLOCK || err == EAGAIN )) {
82
- int retval ;
83
-
84
- sock -> timeout_event = 0 ;
84
+ sock -> timeout_event = 0 ;
85
85
86
- do {
87
- retval = php_pollfd_for (sock -> socket , POLLOUT , ptimeout );
86
+ do {
87
+ retval = php_pollfd_for (sock -> socket , POLLOUT , ptimeout );
88
88
89
- if (retval == 0 ) {
90
- sock -> timeout_event = 1 ;
91
- break ;
92
- }
89
+ if (retval == 0 ) {
90
+ sock -> timeout_event = 1 ;
91
+ break ;
92
+ }
93
93
94
- if (retval > 0 ) {
95
- /* writable now; retry */
96
- goto retry ;
97
- }
94
+ if (retval > 0 ) {
95
+ /* writable now; retry */
96
+ goto retry ;
97
+ }
98
98
99
- err = php_socket_errno ();
100
- } while (err == EINTR );
99
+ err = php_socket_errno ();
100
+ } while (err == EINTR );
101
+ } else {
102
+ /* EWOULDBLOCK/EAGAIN is not an error for a non-blocking stream.
103
+ * Report zero byte write instead. */
104
+ return 0 ;
105
+ }
101
106
}
107
+
102
108
estr = php_socket_strerror (err , NULL , 0 );
103
109
php_error_docref (NULL , E_NOTICE , "send of " ZEND_LONG_FMT " bytes failed with errno=%d %s" ,
104
110
(zend_long )count , err , estr );
0 commit comments