[vlc-commits] access: rar: skip old volume format string on failure (fix #9835)

Francois Cartegnie git at videolan.org
Sun May 25 12:22:07 CEST 2014


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Dec  5 16:14:04 2013 +0100| [3fdb19ce1b57cb2964567082cda81eee5082de34] | committer: Francois Cartegnie

access: rar: skip old volume format string on failure (fix #9835)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3fdb19ce1b57cb2964567082cda81eee5082de34
---

 modules/access/rar/access.c |   10 +++++++---
 modules/access/rar/rar.c    |   20 ++++++++++++--------
 modules/access/rar/rar.h    |    2 +-
 modules/access/rar/stream.c |    4 +++-
 4 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/modules/access/rar/access.c b/modules/access/rar/access.c
index 49faeab..ddba8f2 100644
--- a/modules/access/rar/access.c
+++ b/modules/access/rar/access.c
@@ -156,10 +156,14 @@ int RarAccessOpen(vlc_object_t *object)
     stream_t *s = stream_UrlNew(access, base);
     if (!s)
         goto error;
-    int count;
+    int count = 0;
     rar_file_t **files;
-    if (RarProbe(s) || RarParse(s, &count, &files) || count <= 0)
-        goto error;
+     if ( RarProbe(s) || (
+            RarParse(s, &count, &files, false ) &&
+            RarParse(s, &count, &files, true )
+          ) ||
+          count <= 0 )
+         goto error;
     rar_file_t *file = NULL;
     for (int i = 0; i < count; i++) {
         if (!file && !strcmp(files[i]->name, name))
diff --git a/modules/access/rar/rar.c b/modules/access/rar/rar.c
index f368245..55afd21 100644
--- a/modules/access/rar/rar.c
+++ b/modules/access/rar/rar.c
@@ -281,16 +281,16 @@ typedef struct {
     const char *format;
     int start;
     int stop;
+    bool b_extonly;
 } rar_pattern_t;
 
-static const rar_pattern_t *FindVolumePattern(const char *location)
+static const rar_pattern_t *FindVolumePattern(const char *location, bool b_extonly )
 {
     static const rar_pattern_t patterns[] = {
-        { ".part1.rar",   "%s.part%.1d.rar", 2,   9 },
-        { ".part01.rar",  "%s.part%.2d.rar", 2,  99, },
-        { ".part001.rar", "%s.part%.3d.rar", 2, 999 },
-        { ".rar",         "%s.%c%.2d",       0, 999 },
-        { NULL, NULL, 0, 0 },
+        { ".part01.rar",  "%s.part%.2d.rar", 2,  99, false }, // new naming
+        { ".part001.rar", "%s.part%.3d.rar", 2, 999, false }, // new
+        { ".rar",         "%s.%c%.2d",       0, 999, true },  // old
+        { NULL, NULL, 0, 0, false },
     };
 
     const size_t location_size = strlen(location);
@@ -299,18 +299,22 @@ static const rar_pattern_t *FindVolumePattern(const char *location)
 
         if (location_size < match_size)
             continue;
+
+        if ( b_extonly && !patterns[i].b_extonly )
+            continue;
+
         if (!strcmp(&location[location_size - match_size], patterns[i].match))
             return &patterns[i];
     }
     return NULL;
 }
 
-int RarParse(stream_t *s, int *count, rar_file_t ***file)
+int RarParse(stream_t *s, int *count, rar_file_t ***file, bool b_extonly)
 {
     *count = 0;
     *file = NULL;
 
-    const rar_pattern_t *pattern = FindVolumePattern(s->psz_path);
+    const rar_pattern_t *pattern = FindVolumePattern(s->psz_path, b_extonly);
     int volume_offset = 0;
 
     char *volume_mrl;
diff --git a/modules/access/rar/rar.h b/modules/access/rar/rar.h
index 232009c..889309f 100644
--- a/modules/access/rar/rar.h
+++ b/modules/access/rar/rar.h
@@ -40,7 +40,7 @@ typedef struct {
 
 int  RarProbe(stream_t *);
 void RarFileDelete(rar_file_t *);
-int  RarParse(stream_t *, int *, rar_file_t ***);
+int  RarParse(stream_t *, int *, rar_file_t ***, bool);
 
 int RarAccessOpen(vlc_object_t *);
 void RarAccessClose(vlc_object_t *);
diff --git a/modules/access/rar/stream.c b/modules/access/rar/stream.c
index cd81764..68b4017 100644
--- a/modules/access/rar/stream.c
+++ b/modules/access/rar/stream.c
@@ -72,7 +72,9 @@ int RarStreamOpen(vlc_object_t *object)
     int count;
     rar_file_t **files;
     const int64_t position = stream_Tell(s->p_source);
-    if (RarParse(s->p_source, &count, &files)) {
+    if (RarParse(s->p_source, &count, &files, false) &&
+        RarParse(s->p_source, &count, &files, true ) )
+    {
         stream_Seek(s->p_source, position);
         msg_Err(s, "Invalid or unsupported RAR archive");
         free(files);



More information about the vlc-commits mailing list