Revert "sendf: change Curl_read_plain to wrap Curl_recv_plain"

This reverts commit 12e1def51a.

It introduced SOCKS proxy fails, like test 700 never ending.

Reopens #9431
This commit is contained in:
Daniel Stenberg 2022-11-18 10:30:24 +01:00
parent 95a8ac6bc5
commit 18383fbf72
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
5 changed files with 40 additions and 59 deletions

View File

@ -454,14 +454,14 @@ static int ftp_send_command(struct Curl_easy *data, const char *message, ...)
/* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode /* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode
saying whether an error occurred or CURLE_OK if |len| was read. */ saying whether an error occurred or CURLE_OK if |len| was read. */
static CURLcode static CURLcode
socket_read(struct Curl_easy *data, curl_socket_t fd, void *to, size_t len) socket_read(curl_socket_t fd, void *to, size_t len)
{ {
char *to_p = to; char *to_p = to;
CURLcode result; CURLcode result;
ssize_t nread = 0; ssize_t nread = 0;
while(len > 0) { while(len > 0) {
result = Curl_read_plain(data, fd, to_p, len, &nread); result = Curl_read_plain(fd, to_p, len, &nread);
if(!result) { if(!result) {
len -= nread; len -= nread;
to_p += nread; to_p += nread;
@ -502,15 +502,15 @@ socket_write(struct Curl_easy *data, curl_socket_t fd, const void *to,
return CURLE_OK; return CURLE_OK;
} }
static CURLcode read_data(struct Curl_easy *data, curl_socket_t fd, static CURLcode read_data(struct connectdata *conn,
curl_socket_t fd,
struct krb5buffer *buf) struct krb5buffer *buf)
{ {
struct connectdata *conn = data->conn;
int len; int len;
CURLcode result; CURLcode result;
int nread; int nread;
result = socket_read(data, fd, &len, sizeof(len)); result = socket_read(fd, &len, sizeof(len));
if(result) if(result)
return result; return result;
@ -525,7 +525,7 @@ static CURLcode read_data(struct Curl_easy *data, curl_socket_t fd,
if(!len || !buf->data) if(!len || !buf->data)
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
result = socket_read(data, fd, buf->data, len); result = socket_read(fd, buf->data, len);
if(result) if(result)
return result; return result;
nread = conn->mech->decode(conn->app_data, buf->data, len, nread = conn->mech->decode(conn->app_data, buf->data, len,
@ -560,7 +560,7 @@ static ssize_t sec_recv(struct Curl_easy *data, int sockindex,
/* Handle clear text response. */ /* Handle clear text response. */
if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR) if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
return Curl_recv_plain(data, sockindex, buffer, len, err); return sread(fd, buffer, len);
if(conn->in_buffer.eof_flag) { if(conn->in_buffer.eof_flag) {
conn->in_buffer.eof_flag = 0; conn->in_buffer.eof_flag = 0;
@ -573,7 +573,7 @@ static ssize_t sec_recv(struct Curl_easy *data, int sockindex,
buffer += bytes_read; buffer += bytes_read;
while(len > 0) { while(len > 0) {
if(read_data(data, fd, &conn->in_buffer)) if(read_data(conn, fd, &conn->in_buffer))
return -1; return -1;
if(conn->in_buffer.size == 0) { if(conn->in_buffer.size == 0) {
if(bytes_read > 0) if(bytes_read > 0)

View File

@ -338,7 +338,6 @@ CURLcode Curl_write(struct Curl_easy *data,
} }
} }
/* Curl_send_plain sends raw data without a size restriction on 'len'. */
ssize_t Curl_send_plain(struct Curl_easy *data, int num, ssize_t Curl_send_plain(struct Curl_easy *data, int num,
const void *mem, size_t len, CURLcode *code) const void *mem, size_t len, CURLcode *code)
{ {
@ -404,11 +403,7 @@ ssize_t Curl_send_plain(struct Curl_easy *data, int num,
/* /*
* Curl_write_plain() is an internal write function that sends data to the * Curl_write_plain() is an internal write function that sends data to the
* server using plain sockets only. Otherwise meant to have the exact same * server using plain sockets only. Otherwise meant to have the exact same
* proto as Curl_write(). * proto as Curl_write()
*
* This function wraps Curl_send_plain(). The only difference should be the
* prototype. 'sockfd' must be one of the connection's two main sockets and
* the value of 'len' must not be changed.
*/ */
CURLcode Curl_write_plain(struct Curl_easy *data, CURLcode Curl_write_plain(struct Curl_easy *data,
curl_socket_t sockfd, curl_socket_t sockfd,
@ -420,12 +415,6 @@ CURLcode Curl_write_plain(struct Curl_easy *data,
struct connectdata *conn = data->conn; struct connectdata *conn = data->conn;
int num; int num;
DEBUGASSERT(conn); DEBUGASSERT(conn);
DEBUGASSERT(sockfd == conn->sock[FIRSTSOCKET] ||
sockfd == conn->sock[SECONDARYSOCKET]);
if(sockfd != conn->sock[FIRSTSOCKET] &&
sockfd != conn->sock[SECONDARYSOCKET])
return CURLE_BAD_FUNCTION_ARGUMENT;
num = (sockfd == conn->sock[SECONDARYSOCKET]); num = (sockfd == conn->sock[SECONDARYSOCKET]);
*written = Curl_send_plain(data, num, mem, len, &result); *written = Curl_send_plain(data, num, mem, len, &result);
@ -433,7 +422,6 @@ CURLcode Curl_write_plain(struct Curl_easy *data,
return result; return result;
} }
/* Curl_recv_plain receives raw data without a size restriction on 'len'. */
ssize_t Curl_recv_plain(struct Curl_easy *data, int num, char *buf, ssize_t Curl_recv_plain(struct Curl_easy *data, int num, char *buf,
size_t len, CURLcode *code) size_t len, CURLcode *code)
{ {
@ -675,36 +663,30 @@ CURLcode Curl_client_write(struct Curl_easy *data,
return chop_write(data, type, ptr, len); return chop_write(data, type, ptr, len);
} }
/* CURLcode Curl_read_plain(curl_socket_t sockfd,
* Curl_read_plain() is an internal read function that reads data from the char *buf,
* server using plain sockets only. Otherwise meant to have the exact same size_t bytesfromsocket,
* proto as Curl_read(). ssize_t *n)
*
* This function wraps Curl_recv_plain(). The only difference should be the
* prototype. 'sockfd' must be one of the connection's two main sockets and
* the value of 'sizerequested' must not be changed.
*/
CURLcode Curl_read_plain(struct Curl_easy *data, /* transfer */
curl_socket_t sockfd, /* read from this socket */
char *buf, /* store read data here */
size_t sizerequested, /* max amount to read */
ssize_t *n) /* amount bytes read */
{ {
CURLcode result; ssize_t nread = sread(sockfd, buf, bytesfromsocket);
struct connectdata *conn = data->conn;
int num;
DEBUGASSERT(conn);
DEBUGASSERT(sockfd == conn->sock[FIRSTSOCKET] ||
sockfd == conn->sock[SECONDARYSOCKET]);
if(sockfd != conn->sock[FIRSTSOCKET] &&
sockfd != conn->sock[SECONDARYSOCKET])
return CURLE_BAD_FUNCTION_ARGUMENT;
num = (sockfd == conn->sock[SECONDARYSOCKET]); if(-1 == nread) {
const int err = SOCKERRNO;
const bool return_error =
#ifdef USE_WINSOCK
WSAEWOULDBLOCK == err
#else
EWOULDBLOCK == err || EAGAIN == err || EINTR == err
#endif
;
*n = 0; /* no data returned */
if(return_error)
return CURLE_AGAIN;
return CURLE_RECV_ERROR;
}
*n = Curl_recv_plain(data, num, buf, sizerequested, &result); *n = nread;
return CURLE_OK;
return result;
} }
/* /*

View File

@ -61,10 +61,9 @@ CURLcode Curl_client_write(struct Curl_easy *data, int type, char *ptr,
bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex); bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex);
/* internal read-function, does plain socket only */ /* internal read-function, does plain socket only */
CURLcode Curl_read_plain(struct Curl_easy *data, CURLcode Curl_read_plain(curl_socket_t sockfd,
curl_socket_t sockfd,
char *buf, char *buf,
size_t sizerequested, size_t bytesfromsocket,
ssize_t *n); ssize_t *n);
ssize_t Curl_recv_plain(struct Curl_easy *data, int num, char *buf, ssize_t Curl_recv_plain(struct Curl_easy *data, int num, char *buf,

View File

@ -112,7 +112,7 @@ int Curl_blockread_all(struct Curl_easy *data, /* transfer */
result = ~CURLE_OK; result = ~CURLE_OK;
break; break;
} }
result = Curl_read_plain(data, sockfd, buf, buffersize, &nread); result = Curl_read_plain(sockfd, buf, buffersize, &nread);
if(CURLE_AGAIN == result) if(CURLE_AGAIN == result)
continue; continue;
if(result) if(result)
@ -396,7 +396,7 @@ static CURLproxycode do_SOCKS4(struct Curl_cfilter *cf,
/* FALLTHROUGH */ /* FALLTHROUGH */
case CONNECT_SOCKS_READ: case CONNECT_SOCKS_READ:
/* Receive response */ /* Receive response */
result = Curl_read_plain(data, sockfd, (char *)sx->outp, result = Curl_read_plain(sockfd, (char *)sx->outp,
sx->outstanding, &actualread); sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) { if(result && (CURLE_AGAIN != result)) {
failf(data, "SOCKS4: Failed receiving connect request ack: %s", failf(data, "SOCKS4: Failed receiving connect request ack: %s",
@ -599,7 +599,7 @@ static CURLproxycode do_SOCKS5(struct Curl_cfilter *cf,
sx->outp = socksreq; /* store it here */ sx->outp = socksreq; /* store it here */
/* FALLTHROUGH */ /* FALLTHROUGH */
case CONNECT_SOCKS_READ: case CONNECT_SOCKS_READ:
result = Curl_read_plain(data, sockfd, (char *)sx->outp, result = Curl_read_plain(sockfd, (char *)sx->outp,
sx->outstanding, &actualread); sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) { if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to receive initial SOCKS5 response."); failf(data, "Unable to receive initial SOCKS5 response.");
@ -729,7 +729,7 @@ static CURLproxycode do_SOCKS5(struct Curl_cfilter *cf,
sxstate(sx, data, CONNECT_AUTH_READ); sxstate(sx, data, CONNECT_AUTH_READ);
/* FALLTHROUGH */ /* FALLTHROUGH */
case CONNECT_AUTH_READ: case CONNECT_AUTH_READ:
result = Curl_read_plain(data, sockfd, (char *)sx->outp, result = Curl_read_plain(sockfd, (char *)sx->outp,
sx->outstanding, &actualread); sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) { if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to receive SOCKS5 sub-negotiation response."); failf(data, "Unable to receive SOCKS5 sub-negotiation response.");
@ -931,7 +931,7 @@ static CURLproxycode do_SOCKS5(struct Curl_cfilter *cf,
sxstate(sx, data, CONNECT_REQ_READ); sxstate(sx, data, CONNECT_REQ_READ);
/* FALLTHROUGH */ /* FALLTHROUGH */
case CONNECT_REQ_READ: case CONNECT_REQ_READ:
result = Curl_read_plain(data, sockfd, (char *)sx->outp, result = Curl_read_plain(sockfd, (char *)sx->outp,
sx->outstanding, &actualread); sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) { if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to receive SOCKS5 connect request ack."); failf(data, "Failed to receive SOCKS5 connect request ack.");
@ -1030,7 +1030,7 @@ static CURLproxycode do_SOCKS5(struct Curl_cfilter *cf,
#endif #endif
/* FALLTHROUGH */ /* FALLTHROUGH */
case CONNECT_REQ_READ_MORE: case CONNECT_REQ_READ_MORE:
result = Curl_read_plain(data, sockfd, (char *)sx->outp, result = Curl_read_plain(sockfd, (char *)sx->outp,
sx->outstanding, &actualread); sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) { if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to receive SOCKS5 connect request ack."); failf(data, "Failed to receive SOCKS5 connect request ack.");

View File

@ -1413,7 +1413,7 @@ schannel_connect_step2(struct Curl_easy *data, struct connectdata *conn,
for(;;) { for(;;) {
if(doread) { if(doread) {
/* read encrypted handshake data from socket */ /* read encrypted handshake data from socket */
result = Curl_read_plain(data, conn->sock[sockindex], result = Curl_read_plain(conn->sock[sockindex],
(char *) (backend->encdata_buffer + (char *) (backend->encdata_buffer +
backend->encdata_offset), backend->encdata_offset),
backend->encdata_length - backend->encdata_length -
@ -2190,7 +2190,7 @@ schannel_recv(struct Curl_easy *data, int sockindex,
backend->encdata_offset, backend->encdata_length)); backend->encdata_offset, backend->encdata_length));
/* read encrypted data from socket */ /* read encrypted data from socket */
*err = Curl_read_plain(data, conn->sock[sockindex], *err = Curl_read_plain(conn->sock[sockindex],
(char *)(backend->encdata_buffer + (char *)(backend->encdata_buffer +
backend->encdata_offset), backend->encdata_offset),
size, &nread); size, &nread);