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:
Moisés Guimarães
2014-07-23 13:04:34 -03:00
parent 7dfb9e2d5f
commit c20fdb037e

100
src/io.c
View File

@ -836,11 +836,9 @@ 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;
@ -849,94 +847,70 @@ int EmbedOcspLookup(void* ctx, const char* url, int urlSz,
char domainName[80]; char domainName[80];
#endif #endif
(void)ctx;
if (ocspReqBuf == NULL || ocspReqSz == 0) {
CYASSL_MSG("OCSP request is required for lookup");
return -1;
}
if (ocspRespBuf == NULL) {
CYASSL_MSG("Cannot save OCSP response");
return -1;
}
#ifdef CYASSL_SMALL_STACK #ifdef CYASSL_SMALL_STACK
path = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER); path = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (path == NULL) if (path == NULL)
return MEMORY_E; return -1;
domainName = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER); domainName = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (domainName == NULL) { if (domainName == NULL) {
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER); 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");
#ifdef CYASSL_SMALL_STACK
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return -1; return -1;
} }
#endif
(void)ctx;
if (ocspReqBuf == NULL || ocspReqSz == 0) {
CYASSL_MSG("OCSP request is required for lookup");
}
else if (ocspRespBuf == NULL) {
CYASSL_MSG("Cannot save OCSP response");
}
else if (decode_url(url, urlSz, domainName, path, &port) < 0) {
CYASSL_MSG("Unable to decode OCSP URL");
}
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);
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return -1;
} }
else {
httpBufSz = build_http_request(domainName, path, ocspReqSz, httpBufSz = build_http_request(domainName, path, ocspReqSz,
httpBuf, httpBufSz); httpBuf, httpBufSz);
if ((tcp_connect(&sfd, domainName, port) == 0) && (sfd > 0)) { 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);
}
}
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"); CYASSL_MSG("OCSP Responder connection failed");
close(sfd); }
XFREE(httpBuf, NULL, DYNAMIC_TYPE_IN_BUFFER); else if ((int)send(sfd, (char*)httpBuf, httpBufSz, 0) !=
#ifdef CYASSL_SMALL_STACK httpBufSz) {
XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER); CYASSL_MSG("OCSP http request failed");
XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER); }
#endif else if ((int)send(sfd, (char*)ocspReqBuf, ocspReqSz, 0) !=
return -1; 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); 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;
} }