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 <yszhou4t...@gmail.com> wrote:

> Hi, Jure.
>
> On 21 March 2014 03:23, Jure Grabnar <grabna...@gmail.com> 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 <grabna...@gmail.com>
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  <grabna...@gmail.com>
+
+	* 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  <gscri...@redhat.com>
 
 	* 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 <grabna...@gmail.com>
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  <grabna...@gmail.com>
 
+	* 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  <grabna...@gmail.com>
+
 	* 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

Reply via email to