summaryrefslogtreecommitdiff
path: root/libarchive/archive_read_support_format_iso9660.c
diff options
context:
space:
mode:
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>2011-11-20 21:08:33 -0500
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>2011-11-20 21:08:33 -0500
commitc451144c0a402671c91cf79b89dc0cf203dcda76 (patch)
tree57c4c5bbe8c6a7ddf4be02e612ae0cfa05ab2978 /libarchive/archive_read_support_format_iso9660.c
parentbb44a73ac7ea4f0efee36ad41b2a3ec6e43ea512 (diff)
downloadlibarchive-c451144c0a402671c91cf79b89dc0cf203dcda76.tar.gz
Fix issue 199; improve robustness to corrupted ISO images.
SVN-Revision: 3823
Diffstat (limited to 'libarchive/archive_read_support_format_iso9660.c')
-rw-r--r--libarchive/archive_read_support_format_iso9660.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libarchive/archive_read_support_format_iso9660.c b/libarchive/archive_read_support_format_iso9660.c
index a2ef9299..247cdd7a 100644
--- a/libarchive/archive_read_support_format_iso9660.c
+++ b/libarchive/archive_read_support_format_iso9660.c
@@ -305,6 +305,8 @@ struct file_info {
struct file_info *first;
struct file_info **last;
} rede_files;
+ /* To check a ininity loop. */
+ struct file_info *loop_by;
};
struct heap_queue {
@@ -2839,8 +2841,14 @@ rede_add_entry(struct file_info *file)
struct file_info *re;
re = file->parent;
- while (re != NULL && !re->re)
+ while (re != NULL && !re->re) {
+ /* Sanity check to prevent a infinity loop
+ * cause by a currupted iso file. */
+ if (re->loop_by == file)
+ return (-1);
+ re->loop_by = file;
re = re->parent;
+ }
if (re == NULL)
return (-1);