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