From f81e0c25456d1c60d998b62cb1ea2740ddd1a353 Mon Sep 17 00:00:00 2001 From: Jure Grabnar Date: Fri, 14 Mar 2014 08:38:25 +0100 Subject: [PATCH 1/2] Fixed some metalink issues with openSUSE.iso Still returns memory corruption bug. --- src/metalink.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/metalink.c b/src/metalink.c index 76db2fa..9bb2274 100644 --- a/src/metalink.c +++ b/src/metalink.c @@ -42,6 +42,7 @@ as that of the covered work. */ #include "sha256.h" #include "metalink.h" #include "utils.h" +#include "url.h" #define HASH_TYPES 3 @@ -134,7 +135,28 @@ parse_metalink(char *input_file) ++(file->num_of_res); resource->url = xstrdup ((*resources)->url); - resource->type = ((*resources)->type ? xstrdup ((*resources)->type) : NULL); + + if ((*resources)->type) + resource->type = xstrdup((*resources)->type); + else + { + enum url_scheme res_scheme = url_scheme(resource->url); + switch (res_scheme) + { + case SCHEME_HTTP: + resource->type = "http"; + break; + case SCHEME_HTTPS: + resource->type = "https"; + break; + case SCHEME_FTP: + resource->type = "ftp"; + break; + default: + resource->type = NULL; + } + } + resource->location = ((*resources)->location ? xstrdup ((*resources)->location) : NULL); resource->preference = (*resources)->preference; resource->maxconnections = (*resources)->maxconnections; @@ -143,7 +165,7 @@ parse_metalink(char *input_file) (file->resources) = resource; } - for (checksums = (*files)->checksums; *checksums; ++checksums) + for (checksums = (*files)->checksums; checksums && *checksums; ++checksums) { mlink_checksum *checksum = malloc (sizeof(mlink_checksum)); @@ -215,7 +237,7 @@ elect_resources (mlink *mlink) while (res_next = res->next) { - if (strcmp(res_next->type, "ftp") && strcmp(res_next->type, "http")) + if (res_next->type == NULL || (strcmp(res_next->type, "ftp") && strcmp(res_next->type, "http"))) { res->next = res_next->next; free(res_next); @@ -224,7 +246,7 @@ elect_resources (mlink *mlink) res = res_next; } res = file->resources; - if (strcmp(res->type, "ftp") && strcmp(res->type, "http")) + if (res->type == NULL || (strcmp(res->type, "ftp") && strcmp(res->type, "http"))) { file->resources = res->next; free(res); -- 1.9.0