diff options
Diffstat (limited to 'src/tool_metalink.c')
-rw-r--r-- | src/tool_metalink.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/src/tool_metalink.c b/src/tool_metalink.c index 3f66c74..bbbfc2a 100644 --- a/src/tool_metalink.c +++ b/src/tool_metalink.c @@ -30,6 +30,8 @@ # include <fcntl.h> #endif +#undef HAVE_NSS_CONTEXT + #ifdef USE_OPENSSL # include <openssl/md5.h> # include <openssl/sha.h> @@ -50,6 +52,7 @@ # define MD5_CTX void * # define SHA_CTX void * # define SHA256_CTX void * +# define HAVE_NSS_CONTEXT static NSSInitContext *nss_context; #elif defined(USE_POLARSSL) # include <polarssl/md5.h> @@ -117,7 +120,9 @@ struct win32_crypto_hash { return PARAM_NO_MEM; \ } WHILE_FALSE -#ifdef USE_GNUTLS_NETTLE +#if defined(USE_OPENSSL) +/* Functions are already defined */ +#elif defined(USE_GNUTLS_NETTLE) static int MD5_Init(MD5_CTX *ctx) { @@ -375,7 +380,7 @@ static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx) sha256_finish(ctx, digest); } -#elif defined(_WIN32) && !defined(USE_OPENSSL) +#elif defined(_WIN32) static void win32_crypto_final(struct win32_crypto_hash *ctx, unsigned char *digest, @@ -534,6 +539,7 @@ digest_context *Curl_digest_init(const digest_params *dparams) ctxt->digest_hash = dparams; if(dparams->digest_init(ctxt->digest_hashctx) != 1) { + free(ctxt->digest_hashctx); free(ctxt); return NULL; } @@ -552,7 +558,8 @@ int Curl_digest_update(digest_context *context, int Curl_digest_final(digest_context *context, unsigned char *result) { - (*context->digest_hash->digest_final)(result, context->digest_hashctx); + if(result) + (*context->digest_hash->digest_final)(result, context->digest_hashctx); free(context->digest_hashctx); free(context); @@ -617,6 +624,7 @@ static int check_hash(const char *filename, result = malloc(digest_def->dparams->digest_resultlen); if(!result) { close(fd); + Curl_digest_final(dctx, NULL); return -1; } while(1) { @@ -678,13 +686,15 @@ static metalink_checksum *new_metalink_checksum_from_hex_digest return 0; for(i = 0; i < len; i += 2) { - digest[i/2] = hex_to_uint(hex_digest+i); + digest[i/2] = hex_to_uint(hex_digest + i); } chksum = malloc(sizeof(metalink_checksum)); if(chksum) { chksum->digest_def = digest_def; chksum->digest = digest; } + else + free(digest); return chksum; } @@ -776,8 +786,24 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo) curl_strequal((*p)->type, "ftp") || curl_strequal((*p)->type, "ftps")) { res = new_metalink_resource((*p)->url); - tail->next = res; - tail = res; + if(res) { + tail->next = res; + tail = res; + } + else { + tail = root.next; + + /* clean up the linked list */ + while(tail) { + res = tail->next; + free(tail->url); + free(tail); + tail = res; + } + free(f->filename); + free(f); + return NULL; + } } } f->resource = root.next; @@ -880,7 +906,7 @@ size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb, if(!config) return failure; - rv = metalink_parse_update(outs->metalink_parser, buffer, sz *nmemb); + rv = metalink_parse_update(outs->metalink_parser, buffer, sz * nmemb); if(rv == 0) return sz * nmemb; else { @@ -901,8 +927,8 @@ static int check_content_type(const char *content_type, const char *media_type) return 0; } return curl_strnequal(ptr, media_type, media_type_len) && - (*(ptr+media_type_len) == '\0' || *(ptr+media_type_len) == ' ' || - *(ptr+media_type_len) == '\t' || *(ptr+media_type_len) == ';'); + (*(ptr + media_type_len) == '\0' || *(ptr + media_type_len) == ' ' || + *(ptr + media_type_len) == '\t' || *(ptr + media_type_len) == ';'); } int check_metalink_content_type(const char *content_type) @@ -965,7 +991,7 @@ void clean_metalink(struct OperationConfig *config) void metalink_cleanup(void) { -#ifdef USE_NSS +#ifdef HAVE_NSS_CONTEXT if(nss_context) { NSS_ShutdownContext(nss_context); nss_context = NULL; |