Hi,
thank you for your feedback, Darshit, Yousong!
I reverted magic number back to its original state ('tmp2'), because it
should
be there (I overlooked that 'tmp' variable is changed in the very next
statement).
Duplicated line is removed.
I also changed resource->type to point at dynamic memory.
They say third's time's the charm. :) I hope it's ok now.
Regards,
Jure Grabnar
On 21 March 2014 14:31, Yousong Zhou <[email protected]> wrote:
> Hi, Jure.
>
> On 21 March 2014 03:23, Jure Grabnar <[email protected]> wrote:
> > Thank you for you feedback Darshit. I changed my proposal according to
> your
> > advices. Hopefully a new version is better.
> >
> > I'm also sending corrected patches, again thanks to your review, Darshit.
> > First patch allows Metalink to have optional argument "type" in <url>
> > field. Where type is not present, it extracts protocol type from URL
> string.
> >
>
> On the 1st patch, static "char *" value should not be assigned to
> resource->type that will later be free()'ed.
>
>
> yousong
>
From 622b8d63b15c6217c63f39e4eddfbde5c7462636 Mon Sep 17 00:00:00 2001
From: Jure Grabnar <[email protected]>
Date: Sat, 22 Mar 2014 10:38:16 +0100
Subject: [PATCH 1/2] Fix metalink issues when type is not present
---
src/ChangeLog | 6 ++++++
src/metalink.c | 44 ++++++++++++++++++++++++++++++++++++++++----
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index f222037..6e4729c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2014-03-20 Jure Grabnar <[email protected]>
+
+ * metalink.c (parse_metalink): Find out resources' protocol type from URL.
+ Do not crash when there're no resources.
+ (elect_resources): Do not crash when protocol type is NULL.
+
2014-03-04 Giuseppe Scrivano <[email protected]>
* http.c (modify_param_value, extract_param): Aesthetic change.
diff --git a/src/metalink.c b/src/metalink.c
index 76db2fa..18bc1ee 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,42 @@ 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
+ {
+ const char *type = NULL;
+ enum url_scheme res_scheme = url_scheme (resource->url);
+
+ switch (res_scheme)
+ {
+ case SCHEME_HTTP:
+ case SCHEME_HTTPS:
+ type = "http";
+ break;
+ case SCHEME_FTP:
+ type = "ftp";
+ break;
+ default:
+ type = NULL;
+ }
+
+ int len_url = strlen (resource->url);
+ if (len_url >= 8)
+ {
+ const char *url_ending = &(resource->url[len_url-8]);
+ if (0 == strncasecmp (url_ending, ".torrent", 8))
+ type = "bittorrent";
+ }
+
+ if (type)
+ {
+ resource->type = malloc (strlen (type));
+ sprintf(resource->type, type);
+ }
+ }
+
resource->location = ((*resources)->location ? xstrdup ((*resources)->location) : NULL);
resource->preference = (*resources)->preference;
resource->maxconnections = (*resources)->maxconnections;
@@ -143,7 +179,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 +251,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 +260,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
From 28bd23b824d1bf73424ce5d9669e817c3e6ae4c2 Mon Sep 17 00:00:00 2001
From: Jure Grabnar <[email protected]>
Date: Sat, 22 Mar 2014 10:40:24 +0100
Subject: [PATCH 2/2] Fix some compiler warnings
---
src/ChangeLog | 18 ++++++++++++++++++
src/iri.h | 2 +-
src/metalink.c | 11 +++++------
src/multi.c | 8 ++++++++
src/multi.h | 2 --
src/progress.c | 1 -
src/recur.c | 2 ++
src/retr.c | 3 +--
8 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index 6e4729c..e0d2e71 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,23 @@
2014-03-20 Jure Grabnar <[email protected]>
+ * iri.h: Fix macro parse_charset(str) to not cause 'left-hand operand of
+ comma expression has no effect'.
+ * metalink.c (parse_metalink): Remove unused variable 'piece_hash'.
+ (elect_resources): Add parentheses to assigment.
+ (elect_checksums): Same. Add cast to (unsigned char *).
+ (veriy_file_hash): Add casts to (char *).
+ * multi.h: Remove prototype of static function segmented_retrieve_url().
+ * multi.c: Include "retr.h". Add prototype of static function
+ segmented_retrieve_url();
+ (collect_thread): Add return value to suppress compiler warning.
+ (segmented_retrieve_url): Same.
+ * recur.c (start_retrieve_url): Same.
+ * progress.c: Removed unused variable 'header'.
+ * retr.c (retrieve_from_file): Remove unused variables 'i', 'url_err',
+ 'retries'.
+
+2014-03-20 Jure Grabnar <[email protected]>
+
* metalink.c (parse_metalink): Find out resources' protocol type from URL.
Do not crash when there're no resources.
(elect_resources): Do not crash when protocol type is NULL.
diff --git a/src/iri.h b/src/iri.h
index e759e45..c88d94f 100644
--- a/src/iri.h
+++ b/src/iri.h
@@ -56,7 +56,7 @@ void set_content_encoding (struct iri *i, char *charset);
extern struct iri dummy_iri;
-#define parse_charset(str) (str, NULL)
+#define parse_charset(str) (NULL)
#define find_locale() NULL
#define check_encoding_name(str) false
#define locale_to_utf8(str) (str)
diff --git a/src/metalink.c b/src/metalink.c
index 18bc1ee..7d10bdf 100644
--- a/src/metalink.c
+++ b/src/metalink.c
@@ -217,7 +217,6 @@ parse_metalink(char *input_file)
chunk_sum->type = (chunk_checksum->type ? xstrdup (chunk_checksum->type) : NULL);
for (piece_hashes = chunk_checksum->piece_hashes; *piece_hashes; ++piece_hashes)
{
- mlink_piece_hash piece_hash;
if(!chunk_checksum->type)
{
logprintf (LOG_VERBOSE, "PARSE METALINK: Skipping chunk checksum"
@@ -249,7 +248,7 @@ elect_resources (mlink *mlink)
if (!res)
continue;
- while (res_next = res->next)
+ while ((res_next = res->next))
{
if (res_next->type == NULL || (strcmp(res_next->type, "ftp") && strcmp(res_next->type, "http")))
{
@@ -283,7 +282,7 @@ elect_checksums (mlink *mlink)
if (!csum)
continue;
- while (csum_next = csum->next)
+ while ((csum_next = csum->next))
{
/* Traverse supported hash types & break if csum->type is the same. */
for (i = 0; i < HASH_TYPES; ++i)
@@ -455,7 +454,7 @@ verify_file_hash (const char *filename, mlink_checksum *checksums)
return 1;
}
else
- metalink_hashes[j] = checksum->hash;
+ metalink_hashes[j] = (unsigned char *) checksum->hash;
}
for (i = 0; !metalink_hashes[i]; ++i);
@@ -490,10 +489,10 @@ verify_file_hash (const char *filename, mlink_checksum *checksums)
/* Turn byte-form hash to hex form. */
for(j = 0 ; j < digest_sizes[req_type]; ++j)
- sprintf(file_hash + 2 * j, "%02x", hash_raw[j]);
+ sprintf((char *) file_hash + 2 * j, "%02x", hash_raw[j]);
lower_hex_case(metalink_hashes[req_type], 2 * digest_sizes[req_type]);
- if (strcmp(metalink_hashes[req_type], file_hash))
+ if (strcmp((char *) metalink_hashes[req_type], (char *) file_hash))
{
logprintf (LOG_VERBOSE, "Verifying(%s) failed: %s hashes are different.\n",
filename, supported_hashes[i]);
diff --git a/src/multi.c b/src/multi.c
index 4b22b2e..211c449 100644
--- a/src/multi.c
+++ b/src/multi.c
@@ -38,11 +38,14 @@ as that of the covered work. */
#include <unistd.h>
#include "multi.h"
+#include "retr.h"
#include "url.h"
static struct range *ranges;
char **files;
+static void *segmented_retrieve_url (void *);
+
/* Allocate space for temporary file names. */
void
init_temp_files()
@@ -220,6 +223,9 @@ collect_thread (sem_t *retr_sem, struct s_thread_ctx *thread_ctx)
(thread_ctx[k].range)->is_assigned = 0;
return k;
}
+
+ /* Should not happen. */
+ return -1;
}
/* The function which is being called by pthread_create in spawn_thread(). It
@@ -235,4 +241,6 @@ segmented_retrieve_url (void *arg)
false, ctx->i, true, ctx->range);
ctx->terminated = 1;
sem_post (ctx->retr_sem);
+
+ return NULL;
}
diff --git a/src/multi.h b/src/multi.h
index ad9bd21..ec53e85 100644
--- a/src/multi.h
+++ b/src/multi.h
@@ -84,6 +84,4 @@ int spawn_thread (struct s_thread_ctx*, int, int);
int collect_thread (sem_t *, struct s_thread_ctx *);
-static void * segmented_retrieve_url (void *);
-
#endif /* MULTI_H */
diff --git a/src/progress.c b/src/progress.c
index 44582d8..5ec6b91 100644
--- a/src/progress.c
+++ b/src/progress.c
@@ -302,7 +302,6 @@ progress_update (void *progress, wgint howmuch, double dltime)
void
progress_finish (void *progress, double dltime)
{
- struct progress_header *header = progress;
{
struct progress_header *it, *prev = NULL;
diff --git a/src/recur.c b/src/recur.c
index 38f4d00..c0c9628 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -190,6 +190,8 @@ start_retrieve_url (void *arg)
false, ctx->i, true, NULL);
ctx->terminated = 1;
sem_post (ctx->retr_sem);
+
+ return NULL;
}
#endif
diff --git a/src/retr.c b/src/retr.c
index 8c361de..ea77516 100644
--- a/src/retr.c
+++ b/src/retr.c
@@ -1075,8 +1075,7 @@ retrieve_from_file (const char *file, bool html, int *count)
if(opt.metalink_file && mlink)
{
- int i, j, r, ranges_covered, chunk_size, url_err, retries, ret, dt=0;
- pthread_t thread;
+ int j, r, ranges_covered, chunk_size, retries, ret, dt=0;
sem_t retr_sem;
uerr_t status;
mlink_file* file;
--
1.9.0