Fix for handling hash copies to make sure copied buffer is not free’d. Resolves issues when testing TLS connection with wolfssl_tcp_client and openurl https://www.google.com/.

This commit is contained in:
David Garske
2017-08-02 08:42:04 -07:00
parent be432d8d3a
commit 65b8389af0
6 changed files with 27 additions and 5 deletions

View File

@@ -48,7 +48,7 @@ enum {
/* SHA */
typedef struct CRYPT_SHA_CTX {
int holder[28]; /* big enough to hold internal, but check on init */
int holder[29]; /* big enough to hold internal, but check on init */
} CRYPT_SHA_CTX;
int CRYPT_SHA_Initialize(CRYPT_SHA_CTX*);

View File

@@ -490,6 +490,9 @@ int wc_Md5Copy(Md5* src, Md5* dst)
#ifdef WOLFSSL_ASYNC_CRYPT
ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
#endif
#ifdef WOLFSSL_PIC32MZ_HASH
ret = wc_Pic32HashCopy(&src->cache, &dst->cache);
#endif
return ret;
}

View File

@@ -279,6 +279,15 @@ int wc_Pic32Hash(const byte* in, int inLen, word32* out, int outLen, int algo)
NULL, 0, NULL, 0);
}
int wc_Pic32HashCopy(hashUpdCache* src, hashUpdCache* dst)
{
/* mark destination as copy, so cache->buf is not free'd */
if (dst) {
dst->isCopy = 1;
}
return 0;
}
static int wc_Pic32HashUpdate(hashUpdCache* cache, byte* stdBuf, word32 stdBufLen,
const byte* data, word32 len, void* heap)
{
@@ -306,12 +315,15 @@ static int wc_Pic32HashUpdate(hashUpdCache* cache, byte* stdBuf, word32 stdBufLe
/* alloc buffer */
newBuf = (byte*)XMALLOC(newLenPad, heap, DYNAMIC_TYPE_HASH_TMP);
if (newBuf == NULL) {
if (cache->buf != stdBuf) {
if (cache->buf != stdBuf && !cache->isCopy) {
XFREE(cache->buf, heap, DYNAMIC_TYPE_HASH_TMP);
cache->buf = NULL;
cache->updLen = cache->bufLen = 0;
}
return MEMORY_E;
}
isNewBuf = 1;
cache->isCopy = 0; /* no longer using copy buffer */
}
else {
/* use existing buffer */
@@ -347,12 +359,11 @@ static int wc_Pic32HashFinal(hashUpdCache* cache, byte* stdBuf, byte* hash,
if (ret == 0) {
XMEMCPY(hash, digest, digestSz);
}
if (cache->buf != stdBuf) {
if (cache->buf != stdBuf && !cache->isCopy) {
XFREE(cache->buf, heap, DYNAMIC_TYPE_HASH_TMP);
}
cache->buf = NULL;
cache->bufLen = 0;
cache->updLen = 0;
cache->bufLen = cache->updLen = 0;
return ret;
}

View File

@@ -597,6 +597,9 @@ int wc_ShaCopy(Sha* src, Sha* dst)
#ifdef WOLFSSL_ASYNC_CRYPT
ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
#endif
#ifdef WOLFSSL_PIC32MZ_HASH
ret = wc_Pic32HashCopy(&src->cache, &dst->cache);
#endif
return ret;
}

View File

@@ -1975,6 +1975,9 @@ int wc_Sha256Copy(Sha256* src, Sha256* dst)
#ifdef WOLFSSL_ASYNC_CRYPT
ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
#endif
#ifdef WOLFSSL_PIC32MZ_HASH
ret = wc_Pic32HashCopy(&src->cache, &dst->cache);
#endif
return ret;
}

View File

@@ -111,6 +111,7 @@ typedef struct hashUpdCache {
unsigned char* buf;
unsigned int bufLen;
unsigned int updLen;
int isCopy;
} hashUpdCache;
@@ -187,6 +188,7 @@ int wc_Pic32DesCrypt(word32 *key, int keyLen, word32 *iv, int ivLen,
#ifdef WOLFSSL_PIC32MZ_HASH
int wc_Pic32Hash(const byte* in, int inLen, word32* out, int outLen, int algo);
int wc_Pic32HashCopy(hashUpdCache* src, hashUpdCache* dst);
#endif
#endif /* WOLFSSL_MICROCHIP_PIC32MZ */