schannel.c: Improve error and return code handling upon aa99a63f03
This commit is contained in:
@@ -823,7 +823,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
|
|||||||
char *buf, size_t len, CURLcode *err)
|
char *buf, size_t len, CURLcode *err)
|
||||||
{
|
{
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
ssize_t nread = 0, ret = 0;
|
ssize_t nread = 0;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
||||||
@@ -989,10 +989,16 @@ schannel_recv(struct connectdata *conn, int sockindex,
|
|||||||
infof(data, "schannel: encrypted data cached: offset %zu length %zu\n",
|
infof(data, "schannel: encrypted data cached: offset %zu length %zu\n",
|
||||||
connssl->encdata_offset, connssl->encdata_length);
|
connssl->encdata_offset, connssl->encdata_length);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
/* reset encrypted buffer offset, because there is no data remaining */
|
/* reset encrypted buffer offset, because there is no data remaining */
|
||||||
connssl->encdata_offset = 0;
|
connssl->encdata_offset = 0;
|
||||||
}
|
}
|
||||||
|
} /* check if something went wrong and we need to return an error */
|
||||||
|
else {
|
||||||
|
infof(data, "schannel: failed to read data from server: %s\n",
|
||||||
|
Curl_sspi_strerror(conn, sspi_status));
|
||||||
|
*err = CURLE_RECV_ERROR;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if server wants to renegotiate the connection context */
|
/* check if server wants to renegotiate the connection context */
|
||||||
@@ -1021,7 +1027,6 @@ schannel_recv(struct connectdata *conn, int sockindex,
|
|||||||
size = len < connssl->decdata_offset ? len : connssl->decdata_offset;
|
size = len < connssl->decdata_offset ? len : connssl->decdata_offset;
|
||||||
if(size > 0) {
|
if(size > 0) {
|
||||||
memcpy(buf, connssl->decdata_buffer, size);
|
memcpy(buf, connssl->decdata_buffer, size);
|
||||||
ret = size;
|
|
||||||
|
|
||||||
/* move remaining decrypted data forward to the beginning of buffer */
|
/* move remaining decrypted data forward to the beginning of buffer */
|
||||||
memmove(connssl->decdata_buffer, connssl->decdata_buffer + size,
|
memmove(connssl->decdata_buffer, connssl->decdata_buffer + size,
|
||||||
@@ -1031,27 +1036,16 @@ schannel_recv(struct connectdata *conn, int sockindex,
|
|||||||
infof(data, "schannel: decrypted data returned %zd\n", size);
|
infof(data, "schannel: decrypted data returned %zd\n", size);
|
||||||
infof(data, "schannel: decrypted data buffer: offset %zu length %zu\n",
|
infof(data, "schannel: decrypted data buffer: offset %zu length %zu\n",
|
||||||
connssl->decdata_offset, connssl->decdata_length);
|
connssl->decdata_offset, connssl->decdata_length);
|
||||||
}
|
} /* check if the server closed the connection */
|
||||||
|
else if(sspi_status == SEC_I_CONTEXT_EXPIRED ||
|
||||||
/* check if the server closed the connection */
|
/* special check for Windows 2000 Professional */
|
||||||
if(ret <= 0 && ( /* special check for Windows 2000 Professional */
|
(sspi_status == SEC_E_OK && connssl->encdata_offset > 0 &&
|
||||||
sspi_status == SEC_I_CONTEXT_EXPIRED ||
|
connssl->encdata_buffer[0] == 0x15)) {
|
||||||
(sspi_status == SEC_E_OK && connssl->encdata_offset > 0 &&
|
|
||||||
connssl->encdata_buffer[0] == 0x15))) {
|
|
||||||
infof(data, "schannel: server closed the conunection\n");
|
infof(data, "schannel: server closed the conunection\n");
|
||||||
*err = CURLE_OK;
|
*err = CURLE_OK;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if something went wrong and we need to return an error */
|
return size;
|
||||||
if(ret < 0 && sspi_status != SEC_E_OK) {
|
|
||||||
infof(data, "schannel: failed to read data from server: %s\n",
|
|
||||||
Curl_sspi_strerror(conn, sspi_status));
|
|
||||||
*err = CURLE_RECV_ERROR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode
|
CURLcode
|
||||||
|
|||||||
Reference in New Issue
Block a user