aboutsummaryrefslogtreecommitdiffstats
path: root/src/tool_metalink.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tool_metalink.c')
-rw-r--r--src/tool_metalink.c46
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;