Browse Source

WS fix (php_read) and correct checking of the return value from inet_aton,

which returns *non-zero* on success (fix by Till Gerken).
experimental/pre_new_hash_func
Sterling Hughes 25 years ago
parent
commit
7d15e8cce3
  1. 89
      ext/sockets/sockets.c

89
ext/sockets/sockets.c

@ -241,62 +241,61 @@ static php_socket *accept_connect(php_socket *php_sock, struct sockaddr *la)
/* php_read -- wrapper around read() so that it only reads to a \r or \n. */
int php_read(php_socket *php_sock, void *buf, int maxlen)
{
int m = 0, n = 0;
int no_read = 0;
int nonblock = 0;
char *t = (char*)buf;
int m = 0, n = 0;
int no_read = 0;
int nonblock = 0;
char *t = (char *) buf;
m = fcntl(php_sock->socket, F_GETFL);
if (m < 0) {
return m;
}
nonblock = (m & O_NONBLOCK);
m = 0;
set_errno(0);
while (*t != '\n' && *t != '\r' && n < maxlen) {
if (m > 0) {
t++;
n++;
} else if (m == 0) {
no_read++;
if (nonblock && no_read >= 2) {
return n;
/* The first pass, m always is 0, so no_read becomes 1
* in the first pass. no_read becomes 2 in the second pass,
* and if this is nonblocking, we should return.. */
}
m = fcntl(php_sock->socket, F_GETFL);
if (m < 0) {
return m;
}
nonblock = (m & O_NONBLOCK);
m = 0;
set_errno(0);
while (*t != '\n' && *t != '\r' && n < maxlen) {
if (m > 0) {
t++;
n++;
} else if (m == 0) {
no_read++;
if (nonblock && no_read >= 2) {
return n;
/* The first pass, m always is 0, so no_read becomes 1
* in the first pass. no_read becomes 2 in the second pass,
* and if this is nonblocking, we should return.. */
}
if (no_read > 200) {
set_errno(ECONNRESET);
return -1;
}
}
if (n < maxlen) {
m = read(php_sock->socket, (void *) t, 1);
}
if (no_read > 200) {
set_errno(ECONNRESET);
return -1;
}
}
if (errno != 0 && errno != ESPIPE && errno != EAGAIN) {
return -1;
}
if (n < maxlen) {
m = read(php_sock->socket, (void *) t, 1);
}
set_errno(0);
}
if (errno != 0 && errno != ESPIPE && errno != EAGAIN) {
return -1;
}
set_errno(0);
}
if (n < maxlen) {
if (n < maxlen) {
n++;
/* The only reasons it makes it to here is
* if '\n' or '\r' are encountered. So, increase
* the return by 1 to make up for the lack of the
* '\n' or '\r' in the count (since read() takes
* place at the end of the loop..) */
}
}
return n;
return n;
}
@ -907,7 +906,7 @@ PHP_FUNCTION(socket_connect)
}
sin->sin_port = htons((unsigned short int)Z_LVAL_PP(arg3));
if (inet_aton(Z_STRVAL_PP(arg2), &addr_buf) == 0) {
if (inet_aton(Z_STRVAL_PP(arg2), &addr_buf)) {
sin->sin_addr.s_addr = addr_buf.s_addr;
} else {
char *q = (char *) &(sin->sin_addr.s_addr);

Loading…
Cancel
Save