forked from wolfSSL/wolfssl
io: refactoring EmbedOcspLookup:
--- single return point --- changed stack reduction MEMORY_E to -1 to match XMALLOC fail at httpBuf --- variable written removed --- variable ocspRespSz renamed to ret (initialized with -1 and set only once with process_http_response result)
This commit is contained in:
126
src/io.c
126
src/io.c
@ -836,107 +836,81 @@ static int process_http_response(int sfd, byte** respBuf,
|
|||||||
int EmbedOcspLookup(void* ctx, const char* url, int urlSz,
|
int EmbedOcspLookup(void* ctx, const char* url, int urlSz,
|
||||||
byte* ocspReqBuf, int ocspReqSz, byte** ocspRespBuf)
|
byte* ocspReqBuf, int ocspReqSz, byte** ocspRespBuf)
|
||||||
{
|
{
|
||||||
int httpBufSz;
|
|
||||||
SOCKET_T sfd = 0;
|
SOCKET_T sfd = 0;
|
||||||
word16 port;
|
word16 port;
|
||||||
int ocspRespSz = 0;
|
int ret = -1;
|
||||||
byte* httpBuf = NULL;
|
|
||||||
#ifdef CYASSL_SMALL_STACK
|
#ifdef CYASSL_SMALL_STACK
|
||||||
char* path;
|
char* path;
|
||||||
char* domainName;
|
char* domainName;
|
||||||
#else
|
#else
|
||||||
char path[80];
|
char path[80];
|
||||||
char domainName[80];
|
char domainName[80];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CYASSL_SMALL_STACK
|
||||||
|
path = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
if (path == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
domainName = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
if (domainName == NULL) {
|
||||||
|
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
(void)ctx;
|
(void)ctx;
|
||||||
|
|
||||||
if (ocspReqBuf == NULL || ocspReqSz == 0) {
|
if (ocspReqBuf == NULL || ocspReqSz == 0) {
|
||||||
CYASSL_MSG("OCSP request is required for lookup");
|
CYASSL_MSG("OCSP request is required for lookup");
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
else if (ocspRespBuf == NULL) {
|
||||||
if (ocspRespBuf == NULL) {
|
|
||||||
CYASSL_MSG("Cannot save OCSP response");
|
CYASSL_MSG("Cannot save OCSP response");
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
else if (decode_url(url, urlSz, domainName, path, &port) < 0) {
|
||||||
#ifdef CYASSL_SMALL_STACK
|
|
||||||
path = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
if (path == NULL)
|
|
||||||
return MEMORY_E;
|
|
||||||
|
|
||||||
domainName = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
if (domainName == NULL) {
|
|
||||||
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
return MEMORY_E;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (decode_url(url, urlSz, domainName, path, &port) < 0) {
|
|
||||||
CYASSL_MSG("Unable to decode OCSP URL");
|
CYASSL_MSG("Unable to decode OCSP URL");
|
||||||
#ifdef CYASSL_SMALL_STACK
|
|
||||||
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
#endif
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
/* Note, the library uses the EmbedOcspRespFree() callback to
|
/* Note, the library uses the EmbedOcspRespFree() callback to
|
||||||
* free this buffer. */
|
* free this buffer. */
|
||||||
httpBufSz = SCRATCH_BUFFER_SIZE;
|
int httpBufSz = SCRATCH_BUFFER_SIZE;
|
||||||
httpBuf = (byte*)XMALLOC(httpBufSz, NULL, DYNAMIC_TYPE_IN_BUFFER);
|
byte* httpBuf = (byte*)XMALLOC(httpBufSz, NULL,
|
||||||
|
DYNAMIC_TYPE_IN_BUFFER);
|
||||||
|
|
||||||
if (httpBuf == NULL) {
|
if (httpBuf == NULL) {
|
||||||
CYASSL_MSG("Unable to create OCSP response buffer");
|
CYASSL_MSG("Unable to create OCSP response buffer");
|
||||||
#ifdef CYASSL_SMALL_STACK
|
}
|
||||||
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
else {
|
||||||
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
httpBufSz = build_http_request(domainName, path, ocspReqSz,
|
||||||
#endif
|
httpBuf, httpBufSz);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
httpBufSz = build_http_request(domainName, path, ocspReqSz,
|
if ((tcp_connect(&sfd, domainName, port) != 0) || (sfd <= 0)) {
|
||||||
httpBuf, httpBufSz);
|
CYASSL_MSG("OCSP Responder connection failed");
|
||||||
|
|
||||||
if ((tcp_connect(&sfd, domainName, port) == 0) && (sfd > 0)) {
|
|
||||||
int written;
|
|
||||||
written = (int)send(sfd, (char*)httpBuf, httpBufSz, 0);
|
|
||||||
if (written == httpBufSz) {
|
|
||||||
written = (int)send(sfd, (char*)ocspReqBuf, ocspReqSz, 0);
|
|
||||||
if (written == ocspReqSz) {
|
|
||||||
ocspRespSz = process_http_response(sfd, ocspRespBuf,
|
|
||||||
httpBuf, SCRATCH_BUFFER_SIZE);
|
|
||||||
}
|
}
|
||||||
|
else if ((int)send(sfd, (char*)httpBuf, httpBufSz, 0) !=
|
||||||
|
httpBufSz) {
|
||||||
|
CYASSL_MSG("OCSP http request failed");
|
||||||
|
}
|
||||||
|
else if ((int)send(sfd, (char*)ocspReqBuf, ocspReqSz, 0) !=
|
||||||
|
ocspReqSz) {
|
||||||
|
CYASSL_MSG("OCSP ocsp request failed");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = process_http_response(sfd, ocspRespBuf, httpBuf,
|
||||||
|
SCRATCH_BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(sfd);
|
||||||
|
XFREE(httpBuf, NULL, DYNAMIC_TYPE_IN_BUFFER);
|
||||||
}
|
}
|
||||||
close(sfd);
|
|
||||||
if (ocspRespSz == 0) {
|
|
||||||
CYASSL_MSG("OCSP response was not OK, no OCSP response");
|
|
||||||
XFREE(httpBuf, NULL, DYNAMIC_TYPE_IN_BUFFER);
|
|
||||||
#ifdef CYASSL_SMALL_STACK
|
|
||||||
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
#endif
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
CYASSL_MSG("OCSP Responder connection failed");
|
|
||||||
close(sfd);
|
|
||||||
XFREE(httpBuf, NULL, DYNAMIC_TYPE_IN_BUFFER);
|
|
||||||
#ifdef CYASSL_SMALL_STACK
|
|
||||||
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
#endif
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XFREE(httpBuf, NULL, DYNAMIC_TYPE_IN_BUFFER);
|
|
||||||
#ifdef CYASSL_SMALL_STACK
|
#ifdef CYASSL_SMALL_STACK
|
||||||
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ocspRespSz;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user