diff --git a/vobsub.c b/vobsub.c index c943655f87..c2b313ca0b 100644 --- a/vobsub.c +++ b/vobsub.c @@ -88,11 +88,38 @@ rar_open(const char *const filename, const char *const mode) p++; } rc = urarlib_get(&stream->data, &stream->size, (char*) p, rar_filename, ""); - free(rar_filename); if (!rc) { - free(stream); - return NULL; + /* There is no matching filename in the archive. However, sometimes + * the files we are looking for have been given arbitrary names in the archive. + * Let's look for a file with an exact match in the extension only. */ + int i, num_files, name_len; + ArchiveList_struct *list, *lp; + /* the cast in the next line is a hack to overcome a design flaw (IMHO) in unrarlib */ + num_files = urarlib_list (rar_filename, (ArchiveList_struct *)&list); + if (num_files > 0) { + char *demanded_ext; + demanded_ext = strrchr (p, '.'); + if (demanded_ext) { + int demanded_ext_len = strlen (demanded_ext); + for (i=0, lp=list; inext) { + name_len = strlen (lp->item.Name); + if (name_len >= demanded_ext_len && !strcasecmp (lp->item.Name + name_len - demanded_ext_len, demanded_ext)) { + if ((rc = urarlib_get(&stream->data, &stream->size, lp->item.Name, rar_filename, ""))) { + break; + } + } + } + } + urarlib_freelist (list); + } + if (!rc) { + free(rar_filename); + free(stream); + return NULL; + } } + + free(rar_filename); stream->pos = 0; } return stream;