diff options
author | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2011-11-20 21:08:33 -0500 |
---|---|---|
committer | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2011-11-20 21:08:33 -0500 |
commit | c451144c0a402671c91cf79b89dc0cf203dcda76 (patch) | |
tree | 57c4c5bbe8c6a7ddf4be02e612ae0cfa05ab2978 /libarchive/archive_read_support_format_iso9660.c | |
parent | bb44a73ac7ea4f0efee36ad41b2a3ec6e43ea512 (diff) | |
download | libarchive-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.c | 10 |
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); |