File CVE-2016-6250.patch of Package libarchive.13055
commit 3014e19820ea53c15c90f9d447ca3e668a0b76c6
Author: Tim Kientzle <kientzle@acm.org>
Date: Sat May 28 11:50:39 2016 -0700
Issue 711: Be more careful about verifying filename lengths when writing ISO9660 archives
* Don't cast size_t to int, since this can lead to overflow
on machines where sizeof(int) < sizeof(size_t)
* Check a + b > limit by writing it as
a > limit || b > limit || a + b > limit
to avoid problems when a + b wraps around.
Index: libarchive-3.1.2/libarchive/archive_write_set_format_iso9660.c
===================================================================
--- libarchive-3.1.2.orig/libarchive/archive_write_set_format_iso9660.c
+++ libarchive-3.1.2/libarchive/archive_write_set_format_iso9660.c
@@ -6215,7 +6215,7 @@ isoent_gen_joliet_identifier(struct arch
unsigned char *p;
size_t l;
int r;
- int ffmax, parent_len;
+ size_t ffmax, parent_len;
static const struct archive_rb_tree_ops rb_ops = {
isoent_cmp_node_joliet, isoent_cmp_key_joliet
};
@@ -6229,7 +6229,7 @@ isoent_gen_joliet_identifier(struct arch
else
ffmax = 128;
- r = idr_start(a, idr, isoent->children.cnt, ffmax, 6, 2, &rb_ops);
+ r = idr_start(a, idr, isoent->children.cnt, (int)ffmax, 6, 2, &rb_ops);
if (r < 0)
return (r);
@@ -6242,7 +6242,7 @@ isoent_gen_joliet_identifier(struct arch
int ext_off, noff, weight;
size_t lt;
- if ((int)(l = np->file->basename_utf16.length) > ffmax)
+ if ((l = np->file->basename_utf16.length) > ffmax)
l = ffmax;
p = malloc((l+1)*2);
@@ -6275,7 +6275,7 @@ isoent_gen_joliet_identifier(struct arch
/*
* Get a length of MBS of a full-pathname.
*/
- if ((int)np->file->basename_utf16.length > ffmax) {
+ if (np->file->basename_utf16.length > ffmax) {
if (archive_strncpy_l(&iso9660->mbs,
(const char *)np->identifier, l,
iso9660->sconv_from_utf16be) != 0 &&
@@ -6292,7 +6292,9 @@ isoent_gen_joliet_identifier(struct arch
/* If a length of full-pathname is longer than 240 bytes,
* it violates Joliet extensions regulation. */
- if (parent_len + np->mb_len > 240) {
+ if (parent_len > 240
+ || np->mb_len > 240
+ || parent_len + np->mb_len > 240) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"The regulation of Joliet extensions;"
" A length of a full-pathname of `%s' is "
@@ -6304,11 +6306,11 @@ isoent_gen_joliet_identifier(struct arch
/* Make an offset of the number which is used to be set
* hexadecimal number to avoid duplicate identifier. */
- if ((int)l == ffmax)
+ if (l == ffmax)
noff = ext_off - 6;
- else if ((int)l == ffmax-2)
+ else if (l == ffmax-2)
noff = ext_off - 4;
- else if ((int)l == ffmax-4)
+ else if (l == ffmax-4)
noff = ext_off - 2;
else
noff = ext_off;