--- Begin Message ---
Package: release.debian.org
User: release.debian....@packages.debian.org
Usertags: pu
Tags: stretch
Severity: normal
This is my proposed update libclamunrar in Stretch. I updated from old
version + patches to the latest clamav release and was able to drop all
patches. The changelog for 0.100.1 stated:
Buffer over-read in unRAR code due to missing max value checks in table
initialization. Reported by Rui Reis.
I don't know if this "just" an over read and nothing bad happens or if a
segfault is possible. The 0.100.0 changelog did not state any unrar
related changes but they made a few changes with no explanation. I feel
more comfortable to sychnronize with latest version as released by
clamav.
Please find a debdiff attached which has the autoconf and m4 changes
removed.
Sebastian
diff --git a/configure.ac b/configure.ac
index 85aa6a7604e1..4994c10e66f1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@ dnl MA 02110-1301, USA.
AC_PREREQ([2.59])
dnl For a release change [devel] to the real version [0.xy]
dnl also change VERSION below
-AC_INIT([ClamAV], [0.99], [http://bugs.clamav.net/], [clamav], [http://www.clamav.net/])
+AC_INIT([ClamAV], [0.100.1], [https://bugzilla.clamav.net/], [clamav], [https://www.clamav.net/])
AH_BOTTOM([#include "platform.h"])
dnl put configure auxiliary into config
@@ -74,6 +74,7 @@ m4_include([m4/reorganization/code_checks/coverage.m4])
dnl libclamav dependencies
m4_include([m4/reorganization/libs/xml.m4])
+m4_include([m4/reorganization/libs/openssl.m4])
m4_include([m4/reorganization/libs/json.m4])
m4_include([m4/reorganization/libs/pcre.m4])
@@ -81,6 +82,7 @@ AM_MAINTAINER_MODE
m4_include([m4/reorganization/libs/libz.m4])
m4_include([m4/reorganization/libs/bzip.m4])
m4_include([m4/reorganization/libs/unrar.m4])
+m4_include([m4/reorganization/libs/systemd.m4])
m4_include([m4/reorganization/code_checks/ipv6.m4])
m4_include([m4/reorganization/code_checks/dns.m4])
m4_include([m4/reorganization/code_checks/fanotify.m4])
@@ -115,18 +117,26 @@ m4_include([m4/reorganization/code_checks/shift.m4])
m4_include([m4/reorganization/code_checks/features.m4])
m4_include([m4/reorganization/clamdtop.m4])
m4_include([m4/reorganization/distcheck.m4])
-m4_include([m4/reorganization/llvm.m4])
m4_include([m4/reorganization/sha_collect.m4])
m4_include([m4/reorganization/yara.m4])
-
+m4_include([m4/reorganization/code_checks/fts.m4])
+m4_include([m4/reorganization/libfreshclam.m4])
+m4_include([m4/reorganization/prelude.m4])
m4_include([m4/reorganization/bsd.m4])
dnl Freshclam dependencies
m4_include([m4/reorganization/libs/curl.m4])
-
m4_include([m4/reorganization/substitutions.m4])
+m4_include([m4/reorganization/strni.m4])
+
+if test "x$use_internal_mspack" = "xyes"; then
+ mspack_msg="Internal"
+ AC_CONFIG_SUBDIRS([libclamav/libmspack-0.5alpha])
+ AC_SYS_LARGEFILE
+else
+ mspack_msg="External, $LIBMSPACK_CFLAGS $LIBMSPACK_LIBS"
+fi
-AM_CONDITIONAL([ENABLE_CLAMSUBMIT], [test "$have_curl" = "yes"])
AC_CONFIG_FILES([
libclamunrar_iface/Makefile
@@ -148,6 +158,8 @@ AM_CONDITIONAL([ENABLE_LLVM],
[test "$subdirfailed" != "yes" && test "$enable_llvm" != "no"])
AM_CONDITIONAL([ENABLE_YARA],
[test "$enable_yara" != "no"])
+AM_CONDITIONAL([ENABLE_CLAMSUBMIT],
+ [test "X$have_curl" = "Xyes" && test "X$have_json" = "Xyes"])
no_recursion="yes";
@@ -166,7 +178,7 @@ else
check_libs="$CHECK_LIBS"
fi
CL_MSG_STATUS([check ],[$check_libs],[$enable_check_ut])
-CL_MSG_STATUS([fanotify ],[$want_fanotify],[$want_fanotify])
+CL_MSG_STATUS([fanotify ],[$have_fanotify],[$have_fanotify])
if test "x$ac_cv_have_control_in_msghdr" = "xyes"; then
CL_MSG_STATUS([fdpassing ],[$have_fdpass],[$want_fdpassing])
else
@@ -177,7 +189,19 @@ CL_MSG_STATUS([IPv6 ],[$have_cv_ipv6],[$want_ipv6])
AC_MSG_NOTICE([Summary of optional tools])
CL_MSG_STATUS([clamdtop ],[$CURSES_LIBS],[$enable_clamdtop])
CL_MSG_STATUS([milter ],[yes],[$have_milter])
-CL_MSG_STATUS([clamsubmit ],[$have_curl],[$curl_msg])
+if test "X$have_curl" = "Xyes" && test "X$have_json" = "Xyes"; then
+ CL_MSG_STATUS([clamsubmit ], [yes (libjson-c-dev found at $LIBJSON_HOME), libcurl-devel found at $LIBCURL_HOME)], [yes])
+else
+ if test "X$have_curl" != "Xyes" && test "X$have_json" != "Xyes"; then
+ CL_MSG_STATUS([clamsubmit ], [no (missing libjson-c-dev AND libcurl-devel. Use the website to submit FPs/FNs.)], [no])
+ else
+ if test "X$have_curl" = "Xyes"; then
+ CL_MSG_STATUS([clamsubmit ], [no (missing libjson-c-dev. Use the website to submit FPs/FNs.)], [no])
+ else
+ CL_MSG_STATUS([clamsubmit ], [no (missing libcurl-devel. Use the website to submit FPs/FNs.)], [no])
+ fi
+ fi
+fi
AC_MSG_NOTICE([Summary of engine performance features])
if test "x$enable_debug" = "xyes"; then
@@ -189,10 +213,12 @@ have_jit="no"
if test "$subdirfailed" = "no"; then
have_jit="yes"
fi
-if test "x$llvm_linking" = "x"; then
- CL_MSG_STATUS([llvm ],[$have_jit, from $system_llvm],[$enable_llvm])
+if test "$enable_llvm" = "no"; then
+ CL_MSG_STATUS([llvm ],[$have_jit],[$enable_llvm])
+elif test "x$llvmconfig" = "x"; then
+ CL_MSG_STATUS([llvm ],[$have_jit ($llvmver), from internal],[$enable_llvm])
else
- CL_MSG_STATUS([llvm ],[$have_jit, from $system_llvm ($llvm_linking)],[$enable_llvm])
+ CL_MSG_STATUS([llvm ],[$have_jit ($llvmver), from $llvmconfig ($llvm_linking)],[$enable_llvm])
fi
CL_MSG_STATUS([mempool ],[$have_mempool],[$enable_mempool])
@@ -200,20 +226,25 @@ AC_MSG_NOTICE([Summary of engine detection features])
CL_MSG_STATUS([bzip2 ],[$bzip_check],[$want_bzip2])
CL_MSG_STATUS([zlib ],[$ZLIB_HOME],[yes])
CL_MSG_STATUS([unrar ],[$want_unrar],[$want_unrar])
-if test "x$LIBJSON_HOME" != "x"; then
- CL_MSG_STATUS([libjson ],[$LIBJSON_HOME],[$have_json])
+if test "X$have_json" = "Xyes"; then
+ CL_MSG_STATUS([preclass ],[yes (libjson-c-dev found at $LIBJSON_HOME)],[yes])
+else
+ CL_MSG_STATUS([preclass ],[no (missing libjson-c-dev)],[no])
fi
if test "x$PCRE_HOME" = "x"; then
CL_MSG_STATUS([pcre ],[no],[$have_pcre])
else
CL_MSG_STATUS([pcre ],[$PCRE_HOME],[$have_pcre])
fi
+CL_MSG_STATUS([libmspack ],[yes],[$mspack_msg])
if test "x$XML_LIBS" = "x"; then
CL_MSG_STATUS([libxml2 ],[no],[])
else
CL_MSG_STATUS([libxml2 ],[yes, from $XML_HOME],[])
fi
CL_MSG_STATUS([yara ],[$enable_yara],[$enable_yara])
+CL_MSG_STATUS([fts ],[yes],[$lfs_fts_msg])
+
# Yep, downgrading the compiler avoids the bug too:
# 4.0.x, and 4.1.0 are the known buggy versions
diff --git a/debian/changelog b/debian/changelog
index 41eebea1f85b..31692b60a46f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+libclamunrar (0.100.1-0+deb9u1) stretch; urgency=medium
+
+ [ Sebastian Andrzej Siewior ]
+ * New upstream version
+ - Buffer over-read in unRAR code due to missing max value checks in table
+ initialization. Reported by Rui Reis.
+ - drop all patches (were picked from upstream, the openssl patch is
+ obsolete).
+
+ [ Scott Kitterman ]
+ * Delete symlinks to files no longer shipped in libclamav7 (Closes: #903792)
+
+ -- Sebastian Andrzej Siewior <sebast...@breakpoint.cc> Sat, 21 Jul 2018 18:25:22 +0200
+
libclamunrar (0.99-3+deb9u1) stretch; urgency=medium
* Team upload.
diff --git a/debian/libclamunrar7.links b/debian/libclamunrar7.links
index 876ecb03db8e..300ea38600bb 100644
--- a/debian/libclamunrar7.links
+++ b/debian/libclamunrar7.links
@@ -1,7 +1,2 @@
-/usr/share/doc/libclamav7/AUTHORS /usr/share/doc/libclamunrar7/AUTHORS
-/usr/share/doc/libclamav7/BUGS /usr/share/doc/libclamunrar7/BUGS
-/usr/share/doc/libclamav7/FAQ /usr/share/doc/libclamunrar7/FAQ
-/usr/share/doc/libclamav7/README.gz /usr/share/doc/libclamunrar7/README.gz
/usr/share/doc/libclamav7/README.Debian.gz /usr/share/doc/libclamunrar7/README.Debian.gz
/usr/share/doc/libclamav7/NEWS.Debian.gz /usr/share/doc/libclamunrar7/NEWS.Debian.gz
-/usr/share/doc/libclamav7/changelog.gz /usr/share/doc/libclamunrar7/changelog.gz
diff --git a/debian/patches/bb11600.patch b/debian/patches/bb11600.patch
deleted file mode 100644
index cbb384fff6fb..000000000000
--- a/debian/patches/bb11600.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 155190a0a5000ffb0b516c04a1a9091a5c4dc2b3 Mon Sep 17 00:00:00 2001
-From: Steven Morgan <smor...@sourcefire.com>
-Date: Tue, 12 Jul 2016 12:36:29 -0400
-Subject: bb11600 - fix out of bounds stack read.
-
-Patch-Name: bb11600.patch
----
- libclamunrar/unrar20.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/libclamunrar/unrar20.c b/libclamunrar/unrar20.c
-index ecfe40cf32f3..d938c472e1d8 100644
---- a/libclamunrar/unrar20.c
-+++ b/libclamunrar/unrar20.c
-@@ -117,7 +117,8 @@ static int read_tables20(int fd, unpack_data_t *unpack_data)
- n = (rar_getbits(unpack_data) >> 14) + 3;
- rar_addbits(unpack_data, 2);
- while ((n-- > 0) && (i < table_size)) {
-- table[i] = table[i-1];
-+ if (i>0)
-+ table[i] = table[i-1];
- i++;
- }
- } else {
diff --git a/debian/patches/bb11600_pt2.patch b/debian/patches/bb11600_pt2.patch
deleted file mode 100644
index 2cf8f8156d8b..000000000000
--- a/debian/patches/bb11600_pt2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 4ba0a93c2887e5cea285ab0dbd8254b4d1fd33e7 Mon Sep 17 00:00:00 2001
-From: Steven Morgan <smor...@sourcefire.com>
-Date: Tue, 12 Jul 2016 14:31:38 -0400
-Subject: fix possible out of bounds stack read.
-
-Patch-Name: bb11600_pt2.patch
----
- libclamunrar/unrar.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/libclamunrar/unrar.c b/libclamunrar/unrar.c
-index 456da4d6fef9..40a3d63cbd3e 100644
---- a/libclamunrar/unrar.c
-+++ b/libclamunrar/unrar.c
-@@ -469,7 +469,8 @@ static int read_tables(int fd, unpack_data_t *unpack_data)
- rar_addbits(unpack_data, 7);
- }
- while (n-- > 0 && i < table_size) {
-- table[i] = table[i-1];
-+ if (i>0)
-+ table[i] = table[i-1];
- i++;
- }
- } else {
diff --git a/debian/patches/bb11601.patch b/debian/patches/bb11601.patch
deleted file mode 100644
index ddb14a3530cb..000000000000
--- a/debian/patches/bb11601.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 337277a57bf9c568861b31fcb06f7aeff5e66a8a Mon Sep 17 00:00:00 2001
-From: Steven Morgan <smor...@sourcefire.com>
-Date: Wed, 13 Jul 2016 14:27:10 -0400
-Subject: bb11601 - check array boundaries in unrarvm rarvm_getbits().
-
-Patch-Name: bb11601.patch
----
- libclamunrar/unrarvm.c | 13 ++++++++-----
- 1 file changed, 8 insertions(+), 5 deletions(-)
-
-diff --git a/libclamunrar/unrarvm.c b/libclamunrar/unrarvm.c
-index 29944cbea82a..1cf5bb629952 100644
---- a/libclamunrar/unrarvm.c
-+++ b/libclamunrar/unrarvm.c
-@@ -215,12 +215,15 @@ unsigned int rarvm_getbits(rarvm_input_t *rarvm_input)
- {
- unsigned int bit_field;
-
-- bit_field = (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr] << 16;
-- bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+1] << 8;
-- bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+2];
-- bit_field >>= (8-rarvm_input->in_bit);
-+ if (rarvm_input->in_addr+2 < rarvm_input->buf_size) {
-+ bit_field = (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr] << 16;
-+ bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+1] << 8;
-+ bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+2];
-+ bit_field >>= (8-rarvm_input->in_bit);
-
-- return (bit_field & 0xffff);
-+ return (bit_field & 0xffff);
-+ }
-+ return 0;
- }
-
- unsigned int rarvm_read_data(rarvm_input_t *rarvm_input)
diff --git a/debian/patches/bb11601_pt2.patch b/debian/patches/bb11601_pt2.patch
deleted file mode 100644
index 3db672c3d0a3..000000000000
--- a/debian/patches/bb11601_pt2.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 0b977ab3aaecd1e2e434474f30288eea3c029fe0 Mon Sep 17 00:00:00 2001
-From: Steven Morgan <stevm...@cisco.com>
-Date: Wed, 14 Dec 2016 13:29:00 -0500
-Subject: bb11601 - revise buffer limit check due.
-
-Patch-Name: bb11601_pt2.patch
----
- libclamunrar/unrarvm.c | 19 +++++++++++--------
- 1 file changed, 11 insertions(+), 8 deletions(-)
-
-diff --git a/libclamunrar/unrarvm.c b/libclamunrar/unrarvm.c
-index 1cf5bb629952..102fe2ebf044 100644
---- a/libclamunrar/unrarvm.c
-+++ b/libclamunrar/unrarvm.c
-@@ -213,17 +213,20 @@ void rarvm_addbits(rarvm_input_t *rarvm_input, int bits)
-
- unsigned int rarvm_getbits(rarvm_input_t *rarvm_input)
- {
-- unsigned int bit_field;
-+ unsigned int bit_field = 0;
-
-- if (rarvm_input->in_addr+2 < rarvm_input->buf_size) {
-+ if (rarvm_input->in_addr < rarvm_input->buf_size) {
- bit_field = (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr] << 16;
-- bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+1] << 8;
-- bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+2];
-- bit_field >>= (8-rarvm_input->in_bit);
--
-- return (bit_field & 0xffff);
-+ if (rarvm_input->in_addr+1 < rarvm_input->buf_size) {
-+ bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+1] << 8;
-+ if (rarvm_input->in_addr+2 < rarvm_input->buf_size) {
-+ bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+2];
-+ }
-+ }
- }
-- return 0;
-+ bit_field >>= (8-rarvm_input->in_bit);
-+
-+ return (bit_field & 0xffff);
- }
-
- unsigned int rarvm_read_data(rarvm_input_t *rarvm_input)
diff --git a/debian/patches/drop_openssl_check.patch b/debian/patches/drop_openssl_check.patch
deleted file mode 100644
index 7c31b9fcdd15..000000000000
--- a/debian/patches/drop_openssl_check.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 184363c715fee85c3f80f10a34d8f57605e462c0 Mon Sep 17 00:00:00 2001
-From: Sebastian Andrzej Siewior <sebast...@breakpoint.cc>
-Date: Thu, 3 Nov 2016 21:38:20 +0100
-Subject: drop openssl check
-
-We don't really need openssl in libclamunrar. It is only there
-because clamav needs it and the configure script is copied while
-the package is split. This patch can be dropped once we move to
-0.99.3 which detects openssl 1.1.0 properly.
-
-Patch-Name: drop_openssl_check.patch
-
-Signed-off-by: Sebastian Andrzej Siewior <sebast...@breakpoint.cc>
----
- configure.ac | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/configure.ac b/configure.ac
-index 0f1cdbaef3b2..85aa6a7604e1 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -74,7 +74,6 @@ m4_include([m4/reorganization/code_checks/coverage.m4])
-
- dnl libclamav dependencies
- m4_include([m4/reorganization/libs/xml.m4])
--m4_include([m4/reorganization/libs/openssl.m4])
- m4_include([m4/reorganization/libs/json.m4])
- m4_include([m4/reorganization/libs/pcre.m4])
-
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644
index 482d6fb84608..000000000000
--- a/debian/patches/series
+++ /dev/null
@@ -1,6 +0,0 @@
-bb11600.patch
-bb11600_pt2.patch
-bb11601.patch
-drop_openssl_check.patch
-bb11601_pt2.patch
-unrar-adding-proposed-changes-to-fix-RAR-VMSF_DELTA-.patch
diff --git a/debian/patches/unrar-adding-proposed-changes-to-fix-RAR-VMSF_DELTA-.patch b/debian/patches/unrar-adding-proposed-changes-to-fix-RAR-VMSF_DELTA-.patch
deleted file mode 100644
index 17d19c99afca..000000000000
--- a/debian/patches/unrar-adding-proposed-changes-to-fix-RAR-VMSF_DELTA-.patch
+++ /dev/null
@@ -1,173 +0,0 @@
-From 890a88f7d593eb6f3a13200103c6e49313eca3f1 Mon Sep 17 00:00:00 2001
-From: Mickey Sola <ms...@sourcefire.com>
-Date: Thu, 29 Jun 2017 14:02:03 -0400
-Subject: unrar - adding proposed changes to fix RAR VMSF_DELTA Filter
- Signedness error
-
-CVE: CVE-2012-6706: arbitrary memory write
-BTS: #867223
-Patch-Name: unrar-adding-proposed-changes-to-fix-RAR-VMSF_DELTA-.patch
----
- libclamunrar/unrarvm.c | 55 ++++++++++++++++++++++++++------------------------
- 1 file changed, 29 insertions(+), 26 deletions(-)
-
-diff --git a/libclamunrar/unrarvm.c b/libclamunrar/unrarvm.c
-index 102fe2ebf044..b21e242fa72b 100644
---- a/libclamunrar/unrarvm.c
-+++ b/libclamunrar/unrarvm.c
-@@ -213,9 +213,9 @@ void rarvm_addbits(rarvm_input_t *rarvm_input, int bits)
-
- unsigned int rarvm_getbits(rarvm_input_t *rarvm_input)
- {
-- unsigned int bit_field = 0;
-+ unsigned int bit_field = 0;
-
-- if (rarvm_input->in_addr < rarvm_input->buf_size) {
-+ if (rarvm_input->in_addr < rarvm_input->buf_size) {
- bit_field = (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr] << 16;
- if (rarvm_input->in_addr+1 < rarvm_input->buf_size) {
- bit_field |= (unsigned int) rarvm_input->in_buf[rarvm_input->in_addr+1] << 8;
-@@ -314,10 +314,10 @@ static unsigned int *rarvm_get_operand(rarvm_data_t *rarvm_data,
- }
- }
-
--static unsigned int filter_itanium_getbits(unsigned char *data, int bit_pos, int bit_count)
-+static unsigned int filter_itanium_getbits(unsigned char *data, unsigned int bit_pos, unsigned int bit_count)
- {
-- int in_addr=bit_pos/8;
-- int in_bit=bit_pos&7;
-+ unsigned int in_addr=bit_pos/8;
-+ unsigned int in_bit=bit_pos&7;
- unsigned int bit_field=(unsigned int)data[in_addr++];
- bit_field|=(unsigned int)data[in_addr++] << 8;
- bit_field|=(unsigned int)data[in_addr++] << 16;
-@@ -326,10 +326,10 @@ static unsigned int filter_itanium_getbits(unsigned char *data, int bit_pos, int
- return(bit_field & (0xffffffff>>(32-bit_count)));
- }
-
--static void filter_itanium_setbits(unsigned char *data, unsigned int bit_field, int bit_pos, int bit_count)
-+static void filter_itanium_setbits(unsigned char *data, unsigned int bit_field, unsigned int bit_pos, unsigned int bit_count)
- {
-- int i, in_addr=bit_pos/8;
-- int in_bit=bit_pos&7;
-+ unsigned int i, in_addr=bit_pos/8;
-+ unsigned int in_bit=bit_pos&7;
- unsigned int and_mask=0xffffffff>>(32-bit_count);
- and_mask=~(and_mask<<in_bit);
-
-@@ -346,11 +346,12 @@ static void filter_itanium_setbits(unsigned char *data, unsigned int bit_field,
- static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_filters_t filter_type)
- {
- unsigned char *data, cmp_byte2, cur_byte, *src_data, *dest_data;
-- int i, j, data_size, channels, src_pos, dest_pos, border, width, PosR;
-- int op_type, cur_channel, byte_count, start_pos, pa, pb, pc;
-+ unsigned int i, j, data_size, channels, src_pos, dest_pos, border, width, PosR;
-+ unsigned int op_type, cur_channel, byte_count, start_pos;
-+ int pa, pb, pc;
- unsigned int file_offset, cur_pos, predicted;
-- int32_t offset, addr;
-- const int file_size=0x1000000;
-+ uint32_t offset, addr;
-+ const unsigned int file_size=0x1000000;
-
- switch(filter_type) {
- case VMSF_E8:
-@@ -359,7 +360,7 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- data_size = rarvm_data->R[4];
- file_offset = rarvm_data->R[6];
-
-- if (((unsigned int)data_size >= VM_GLOBALMEMADDR) || (data_size < 4)) {
-+ if ((data_size > VM_GLOBALMEMADDR) || (data_size < 4)) {
- break;
- }
-
-@@ -370,12 +371,14 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- if (cur_byte==0xe8 || cur_byte==cmp_byte2) {
- offset = cur_pos+file_offset;
- addr = GET_VALUE(FALSE, data);
-- if (addr < 0) {
-- if (addr+offset >=0 ) {
-+ // We check 0x80000000 bit instead of '< 0' comparison
-+ // not assuming int32 presence or uint size and endianness.
-+ if ((addr & 0x80000000)!=0) { // addr<0
-+ if (((addr+offset) & 0x80000000)==0) { // addr+offset>=0
- SET_VALUE(FALSE, data, addr+file_size);
- }
- } else {
-- if (addr<file_size) {
-+ if (((addr-file_size) & 0x80000000)!=0) { // addr<file_size
- SET_VALUE(FALSE, data, addr-offset);
- }
- }
-@@ -389,7 +392,7 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- data_size = rarvm_data->R[4];
- file_offset = rarvm_data->R[6];
-
-- if (((unsigned int)data_size >= VM_GLOBALMEMADDR) || (data_size < 21)) {
-+ if ((data_size > VM_GLOBALMEMADDR) || (data_size < 21)) {
- break;
- }
-
-@@ -432,7 +435,7 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- border = data_size*2;
-
- SET_VALUE(FALSE, &rarvm_data->mem[VM_GLOBALMEMADDR+0x20], data_size);
-- if ((unsigned int)data_size >= VM_GLOBALMEMADDR/2) {
-+ if (data_size > VM_GLOBALMEMADDR/2 || channels > 1024 || channels == 0) {
- break;
- }
- for (cur_channel=0 ; cur_channel < channels ; cur_channel++) {
-@@ -443,7 +446,7 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- }
- break;
- case VMSF_RGB: {
-- const int channels=3;
-+ const unsigned int channels=3;
- data_size = rarvm_data->R[4];
- width = rarvm_data->R[0] - 3;
- PosR = rarvm_data->R[1];
-@@ -451,15 +454,14 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- dest_data = src_data + data_size;
-
- SET_VALUE(FALSE, &rarvm_data->mem[VM_GLOBALMEMADDR+0x20], data_size);
-- if ((unsigned int)data_size >= VM_GLOBALMEMADDR/2) {
-+ if (data_size > VM_GLOBALMEMADDR/2 || data_size < 3 || width > data_size || PosR > 2) {
- break;
- }
- for (cur_channel=0 ; cur_channel < channels; cur_channel++) {
- unsigned int prev_byte = 0;
- for (i=cur_channel ; i<data_size ; i+=channels) {
-- int upper_pos=i-width;
-- if (upper_pos >= 3) {
-- unsigned char *upper_data = dest_data+upper_pos;
-+ if (i >= width+3) {
-+ unsigned char *upper_data = dest_data+i-width;
- unsigned int upper_byte = *upper_data;
- unsigned int upper_left_byte = *(upper_data-3);
- predicted = prev_byte+upper_byte-upper_left_byte;
-@@ -489,13 +491,14 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- break;
- }
- case VMSF_AUDIO: {
-- int channels=rarvm_data->R[0];
-+ unsigned int channels=rarvm_data->R[0];
- data_size = rarvm_data->R[4];
- src_data = rarvm_data->mem;
- dest_data = src_data + data_size;
-
- SET_VALUE(FALSE, &rarvm_data->mem[VM_GLOBALMEMADDR+0x20], data_size);
-- if ((unsigned int)data_size >= VM_GLOBALMEMADDR/2) {
-+ // In fact, audio channels never exceed 4.
-+ if (data_size > VM_GLOBALMEMADDR/2 || channels > 128 || channels == 0) {
- break;
- }
- for (cur_channel=0 ; cur_channel < channels ; cur_channel++) {
-@@ -556,7 +559,7 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
- data_size = rarvm_data->R[4];
- src_pos = 0;
- dest_pos = data_size;
-- if ((unsigned int)data_size >= VM_GLOBALMEMADDR/2) {
-+ if (data_size > VM_GLOBALMEMADDR/2) {
- break;
- }
- while (src_pos < data_size) {
diff --git a/libclamunrar/unrar.c b/libclamunrar/unrar.c
index 40a3d63cbd3e..70de634a9a09 100644
--- a/libclamunrar/unrar.c
+++ b/libclamunrar/unrar.c
@@ -43,7 +43,7 @@
#ifdef RAR_HIGH_DEBUG
#define rar_dbgmsg printf
#else
-static void rar_dbgmsg(const char* fmt,...){}
+static void rar_dbgmsg(const char* fmt,...){(void)fmt;}
#endif
static void insert_old_dist(unpack_data_t *unpack_data, unsigned int distance)
@@ -117,13 +117,14 @@ int rar_unp_read_buf(int fd, unpack_data_t *unpack_data)
memmove(unpack_data->in_buf, unpack_data->in_buf+unpack_data->in_addr,
data_size);
}
+
unpack_data->in_addr = 0;
unpack_data->read_top = data_size;
} else {
data_size = unpack_data->read_top;
}
/* RAR2 depends on us only reading upto the end of the current compressed file */
- if (unpack_data->pack_size < ((MAX_BUF_SIZE-data_size)&~0xf)) {
+ if (unpack_data->pack_size < (uint32_t)((MAX_BUF_SIZE-data_size)&~0xf)) {
read_size = unpack_data->pack_size;
} else {
read_size = (MAX_BUF_SIZE-data_size)&~0xf;
@@ -218,7 +219,7 @@ static void unp_write_buf(unpack_data_t *unpack_data)
struct UnpackFilter *flt, *next_filter;
struct rarvm_prepared_program *prg, *next_prg;
uint8_t *filtered_data;
- int i, j;
+ size_t i, j;
rar_dbgmsg("in unp_write_buf\n");
written_border = unpack_data->wr_ptr;
@@ -395,8 +396,9 @@ static int read_tables(int fd, unpack_data_t *unpack_data)
uint8_t bit_length[BC];
unsigned char table[HUFF_TABLE_SIZE];
unsigned int bit_field;
- int i, length, zero_count, number, n;
- const int table_size=HUFF_TABLE_SIZE;
+ int length, zero_count, number, n;
+ size_t i;
+ const size_t table_size=HUFF_TABLE_SIZE;
rar_dbgmsg("in read_tables Offset=%ld in_addr=%d read_top=%d\n", lseek(fd, 0, SEEK_CUR),
unpack_data->in_addr, unpack_data->read_top);
@@ -540,9 +542,11 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte,
unsigned char *vmcode, int code_size)
{
rarvm_input_t rarvm_input;
- unsigned int filter_pos, new_filter, block_start, init_mask, cur_size;
+ unsigned int filter_pos, new_filter, block_start, init_mask, cur_size, data_size;
struct UnpackFilter *filter, *stack_filter;
- int i, empty_count, stack_pos, vm_codesize, static_size, data_size;
+ size_t i, empty_count, stack_pos;
+ unsigned int vm_codesize;
+ long static_size;
unsigned char *vm_code, *global_data;
rar_dbgmsg("in add_vm_code first_byte=0x%x code_size=%d\n", first_byte, code_size);
@@ -562,7 +566,7 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte,
filter_pos = unpack_data->last_filter;
}
rar_dbgmsg("filter_pos = %u\n", filter_pos);
- if (filter_pos > unpack_data->Filters.num_items ||
+ if ((size_t) filter_pos > unpack_data->Filters.num_items ||
filter_pos > unpack_data->old_filter_lengths_size) {
rar_dbgmsg("filter_pos check failed\n");
return FALSE;
@@ -652,7 +656,7 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte,
}
if (new_filter) {
vm_codesize = rarvm_read_data(&rarvm_input);
- if (vm_codesize >= 0x1000 || vm_codesize == 0 || (vm_codesize > rarvm_input.buf_size) || vm_codesize < 0) {
+ if (vm_codesize >= 0x1000 || vm_codesize == 0 || vm_codesize > (unsigned int)rarvm_input.buf_size) {
rar_dbgmsg("ERROR: vm_codesize=0x%x buf_size=0x%x\n", vm_codesize, rarvm_input.buf_size);
return FALSE;
}
@@ -661,11 +665,11 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte,
rar_dbgmsg("unrar: add_vm_code: rar_malloc failed for vm_code\n");
return FALSE;
}
- for (i=0 ; i < vm_codesize ; i++) {
+ for (i=0 ; i < (size_t) vm_codesize ; i++) {
vm_code[i] = rarvm_getbits(&rarvm_input) >> 8;
rarvm_addbits(&rarvm_input, 8);
}
- if(!rarvm_prepare(&unpack_data->rarvm_data, &rarvm_input, &vm_code[0], vm_codesize, &filter->prg)) {
+ if(!rarvm_prepare(&unpack_data->rarvm_data, &rarvm_input, &vm_code[0], (int) vm_codesize, &filter->prg)) {
rar_dbgmsg("unrar: add_vm_code: rarvm_prepare failed\n");
free(vm_code);
return FALSE;
@@ -713,10 +717,10 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte,
if (data_size >= 0x10000) {
return FALSE;
}
- cur_size = stack_filter->prg.global_size;
- if (cur_size < data_size+VM_FIXEDGLOBALSIZE) {
- stack_filter->prg.global_size += data_size+VM_FIXEDGLOBALSIZE-cur_size;
- stack_filter->prg.global_data = rar_realloc2(stack_filter->prg.global_data,
+ cur_size = (unsigned int)stack_filter->prg.global_size;
+ if (cur_size < data_size + VM_FIXEDGLOBALSIZE) {
+ stack_filter->prg.global_size += (long)data_size + VM_FIXEDGLOBALSIZE - cur_size;
+ stack_filter->prg.global_data = (unsigned char*)rar_realloc2(stack_filter->prg.global_data,
stack_filter->prg.global_size);
if(!stack_filter->prg.global_data) {
rar_dbgmsg("unrar: add_vm_code: rar_realloc2 failed for stack_filter->prg.global_data\n");
@@ -724,8 +728,8 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte,
}
}
global_data = &stack_filter->prg.global_data[VM_FIXEDGLOBALSIZE];
- for (i=0 ; i< data_size ; i++) {
- if ((rarvm_input.in_addr+2) > rarvm_input.buf_size) {
+ for (i=0 ; i < (size_t)data_size ; i++) {
+ if (rarvm_input.in_addr + 2 > rarvm_input.buf_size) {
rar_dbgmsg("Buffer truncated\n");
return FALSE;
}
@@ -825,9 +829,9 @@ void rar_unpack_init_data(int solid, unpack_data_t *unpack_data)
memset(unpack_data->old_dist, 0, sizeof(unpack_data->old_dist));
unpack_data->old_dist_ptr= 0;
memset(unpack_data->unp_old_table, 0, sizeof(unpack_data->unp_old_table));
+ memset(&unpack_data->LDD, 0, sizeof(unpack_data->LDD));
memset(&unpack_data->LD, 0, sizeof(unpack_data->LD));
memset(&unpack_data->DD, 0, sizeof(unpack_data->DD));
- memset(&unpack_data->LDD, 0, sizeof(unpack_data->LDD));
memset(&unpack_data->RD, 0, sizeof(unpack_data->RD));
memset(&unpack_data->BD, 0, sizeof(unpack_data->BD));
unpack_data->last_dist= 0;
diff --git a/libclamunrar/unrar.h b/libclamunrar/unrar.h
index a2cc7461ff43..0c8cd8d63ff9 100644
--- a/libclamunrar/unrar.h
+++ b/libclamunrar/unrar.h
@@ -209,7 +209,7 @@ typedef struct unpack_data_tag
rar_filter_array_t Filters;
rar_filter_array_t PrgStack;
int *old_filter_lengths;
- int last_filter, old_filter_lengths_size;
+ unsigned int last_filter, old_filter_lengths_size;
int64_t written_size;
int64_t true_size;
int64_t max_size;
diff --git a/libclamunrar/unrar15.c b/libclamunrar/unrar15.c
index d19337f37e0e..20591b7b11d4 100644
--- a/libclamunrar/unrar15.c
+++ b/libclamunrar/unrar15.c
@@ -119,16 +119,18 @@ static void copy_string15(unpack_data_t *unpack_data, unsigned int distance,
}
}
-static unsigned int decode_num(unpack_data_t *unpack_data, int num, unsigned int start_pos,
+static unsigned int decode_num(unpack_data_t *unpack_data, unsigned int num, unsigned int start_pos,
unsigned int *dec_tab, unsigned int *pos_tab)
{
int i;
- for (num&=0xfff0, i=0 ; dec_tab[i] <= num ; i++) {
+ for (num &= 0xfff0, i=0; dec_tab[i] <= num; i++) {
start_pos++;
}
+
rar_addbits(unpack_data, start_pos);
- return (((num-(i ? dec_tab[i-1]:0)) >> (16-start_pos)) + pos_tab[start_pos]);
+
+ return ( ((int)num - (i ? dec_tab[i-1] : 0)) >> (16 - start_pos) ) + pos_tab[start_pos];
}
static void huff_decode(unpack_data_t *unpack_data)
diff --git a/libclamunrar/unrar20.c b/libclamunrar/unrar20.c
index d938c472e1d8..ad50c4e21275 100644
--- a/libclamunrar/unrar20.c
+++ b/libclamunrar/unrar20.c
@@ -25,7 +25,7 @@
#ifdef RAR_HIGH_DEBUG
#define rar_dbgmsg printf
#else
-static void rar_dbgmsg(const char* fmt,...){}
+static void rar_dbgmsg(const char* fmt,...){(void)fmt;}
#endif
void unpack_init_data20(int solid, unpack_data_t *unpack_data)
@@ -338,13 +338,26 @@ int rar_unpack20(int fd, int solid, unpack_data_t *unpack_data)
continue;
}
if (number > 269) {
- length = ldecode[number-=270]+3;
+ /* If number is higher or equal to 298 in this instance something has likely
+ * gone horribly wrong and/or this is a RAR 5 file that Clam does not yet
+ * support parsing. Either way, this is a total failure case. */
+ if (number < 298) {
+ length = ldecode[number-=270]+3;
+ } else {
+ retval = FALSE;
+ break;
+ }
+
if ((bits = lbits[number]) > 0) {
length += rar_getbits(unpack_data) >> (16-bits);
rar_addbits(unpack_data, bits);
}
dist_number = rar_decode_number(unpack_data, (struct Decode *)&unpack_data->DD);
+ if (dist_number > 47 || dist_number < 0) {
+ retval = FALSE;
+ break;
+ }
distance = ddecode[dist_number] + 1;
if ((bits = dbits[dist_number]) > 0) {
distance += rar_getbits(unpack_data)>>(16-bits);
diff --git a/libclamunrar/unrarfilter.c b/libclamunrar/unrarfilter.c
index 1039d1e0e85d..9237027055ab 100644
--- a/libclamunrar/unrarfilter.c
+++ b/libclamunrar/unrarfilter.c
@@ -33,7 +33,7 @@ void rar_filter_array_init(rar_filter_array_t *filter_a)
void rar_filter_array_reset(rar_filter_array_t *filter_a)
{
- int i;
+ size_t i;
if (!filter_a) {
return;
diff --git a/libclamunrar/unrarhlp.c b/libclamunrar/unrarhlp.c
index 62746bf43493..17166db58e5a 100644
--- a/libclamunrar/unrarhlp.c
+++ b/libclamunrar/unrarhlp.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
+ * Copyright (C) 2015, 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
* Copyright (C) 2007 Sourcefire, Inc.
*
* The unRAR sources may be used in any software to handle RAR
@@ -19,7 +19,7 @@
#ifdef RAR_HIGH_DEBUG
#define rar_dbgmsg printf
#else
-static void rar_dbgmsg(const char* fmt,...){}
+static void rar_dbgmsg(const char* fmt,...){(void)fmt;}
#endif
#define RAR_MAX_ALLOCATION 184549376
@@ -30,14 +30,14 @@ void *rar_malloc(size_t size)
if(!size || size > RAR_MAX_ALLOCATION) {
- rar_dbgmsg("UNRAR: rar_malloc(): Attempt to allocate %lu bytes. Please report to http://bugs.clamav.net\n", size);
+ rar_dbgmsg("UNRAR: rar_malloc(): Attempt to allocate %lu bytes. Please report to https://bugzilla.clamav.net\n", size);
return NULL;
}
alloc = malloc(size);
if(!alloc) {
- fprintf(stderr, "UNRAR: rar_malloc(): Can't allocate memory (%lu bytes).\n", size);
+ fprintf(stderr, "UNRAR: rar_malloc(): Can't allocate memory (%llu bytes).\n", (long long unsigned)size);
return NULL;
} else return alloc;
}
@@ -48,14 +48,14 @@ void *rar_realloc2(void *ptr, size_t size)
if(!size || size > RAR_MAX_ALLOCATION) {
- rar_dbgmsg("UNRAR: rar_realloc2(): Attempt to allocate %lu bytes. Please report to http://bugs.clamav.net\n", size);
+ rar_dbgmsg("UNRAR: rar_realloc2(): Attempt to allocate %lu bytes. Please report to https://bugzilla.clamav.net\n", size);
return NULL;
}
alloc = realloc(ptr, size);
if(!alloc) {
- fprintf(stderr, "UNRAR: rar_realloc2(): Can't allocate memory (%lu bytes).\n", size);
+ fprintf(stderr, "UNRAR: rar_realloc2(): Can't allocate memory (%llu bytes).\n", (long long unsigned)size);
if(ptr)
free(ptr);
return NULL;
diff --git a/libclamunrar/unrarppm.c b/libclamunrar/unrarppm.c
index a58b47cedaa2..439318157e7d 100644
--- a/libclamunrar/unrarppm.c
+++ b/libclamunrar/unrarppm.c
@@ -940,14 +940,14 @@ void ppm_cleanup(ppm_data_t *ppm_data)
int ppm_decode_init(ppm_data_t *ppm_data, int fd, unpack_data_t *unpack_data, int *EscChar)
{
- int max_order, Reset, MaxMB;
+ int max_order = 0, Reset = 0, MaxMB = 0;
- max_order = rar_get_char(fd, unpack_data);
+ max_order = (int) rar_get_char(fd, unpack_data);
rar_dbgmsg("ppm_decode_init max_order=%d\n", max_order);
Reset = (max_order & 0x20) ? 1 : 0;
rar_dbgmsg("ppm_decode_init Reset=%d\n", Reset);
if (Reset) {
- MaxMB = rar_get_char(fd, unpack_data);
+ MaxMB = (int) rar_get_char(fd, unpack_data);
rar_dbgmsg("ppm_decode_init MaxMB=%d\n", MaxMB);
} else {
if (sub_allocator_get_allocated_memory(&ppm_data->sub_alloc) == 0) {
diff --git a/libclamunrar/unrarvm.c b/libclamunrar/unrarvm.c
index b21e242fa72b..813ec0867d43 100644
--- a/libclamunrar/unrarvm.c
+++ b/libclamunrar/unrarvm.c
@@ -29,7 +29,7 @@
#ifdef RAR_HIGH_DEBUG
#define rar_dbgmsg printf
#else
-static void rar_dbgmsg(const char* fmt,...){}
+static void rar_dbgmsg(const char* fmt,...){(void)fmt;}
#endif
#define VMCF_OP0 0
@@ -42,6 +42,28 @@ static void rar_dbgmsg(const char* fmt,...){}
#define VMCF_USEFLAGS 32
#define VMCF_CHFLAGS 64
+#define UINT32(x) (sizeof(uint32_t)==4 ? (uint32_t)(x):((x)&0xffffffff))
+
+#if WORDS_BIGENDIAN == 0
+#define GET_VALUE(byte_mode,addr) ((byte_mode) ? (*(unsigned char *)(addr)) : UINT32((*(unsigned int *)(addr))))
+#else
+#define GET_VALUE(byte_mode,addr) ((byte_mode) ? (*(unsigned char *)(addr)) : (((unsigned char *)addr)[0] | ((unsigned char *)addr)[1]<<8 | ((unsigned char *)addr)[2]<<16 | ((unsigned char *)addr)[3]<<24))
+#endif
+
+#if WORDS_BIGENDIAN == 0
+#define SET_VALUE(byte_mode,addr,value) (void)(((byte_mode) ? (*(unsigned char *)(addr)=(value)):(*(uint32_t *)(addr)=((uint32_t)(value)))))
+#else
+#define SET_VALUE(byte_mode,addr,value) rarvm_set_value(byte_mode, (unsigned int *)addr, value);
+#endif
+
+#define SET_IP(IP) \
+ if ((IP)>=(unsigned int)code_size) \
+ return TRUE; \
+ if (--max_ops<=0) \
+ return FALSE; \
+ cmd=prepared_code+(IP);
+
+
static uint8_t vm_cmdflags[]=
{
/* VM_MOV */ VMCF_OP2 | VMCF_BYTEMODE ,
@@ -86,37 +108,6 @@ static uint8_t vm_cmdflags[]=
/* VM_PRINT */ VMCF_OP0
};
-#define UINT32(x) (sizeof(uint32_t)==4 ? (uint32_t)(x):((x)&0xffffffff))
-
-#if WORDS_BIGENDIAN == 0
-#define GET_VALUE(byte_mode,addr) ((byte_mode) ? (*(unsigned char *)(addr)) : UINT32((*(unsigned int *)(addr))))
-#else
-#define GET_VALUE(byte_mode,addr) ((byte_mode) ? (*(unsigned char *)(addr)) : (((unsigned char *)addr)[0] | ((unsigned char *)addr)[1]<<8 | ((unsigned char *)addr)[2]<<16 | ((unsigned char *)addr)[3]<<24))
-#endif
-
-void rarvm_set_value(int byte_mode, unsigned int *addr, unsigned int value)
-{
- if (byte_mode) {
- *(unsigned char *)addr=value;
- } else {
-#if WORDS_BIGENDIAN == 0
- *(uint32_t *)addr = value;
-#else
- ((unsigned char *)addr)[0]=(unsigned char)value;
- ((unsigned char *)addr)[1]=(unsigned char)(value>>8);
- ((unsigned char *)addr)[2]=(unsigned char)(value>>16);
- ((unsigned char *)addr)[3]=(unsigned char)(value>>24);
-#endif
- }
-}
-
-
-#if WORDS_BIGENDIAN == 0
-#define SET_VALUE(byte_mode,addr,value) (void)(((byte_mode) ? (*(unsigned char *)(addr)=(value)):(*(uint32_t *)(addr)=((uint32_t)(value)))))
-#else
-#define SET_VALUE(byte_mode,addr,value) rarvm_set_value(byte_mode, (unsigned int *)addr, value);
-#endif
-
const uint32_t crc_tab[256]={
0x0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
@@ -152,14 +143,30 @@ const uint32_t crc_tab[256]={
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
+void rarvm_set_value(int byte_mode, unsigned int *addr, unsigned int value)
+{
+ if (byte_mode) {
+ *(unsigned char *)addr=value;
+ } else {
+#if WORDS_BIGENDIAN == 0
+ *(uint32_t *)addr = value;
+#else
+ ((unsigned char *)addr)[0]=(unsigned char)value;
+ ((unsigned char *)addr)[1]=(unsigned char)(value>>8);
+ ((unsigned char *)addr)[2]=(unsigned char)(value>>16);
+ ((unsigned char *)addr)[3]=(unsigned char)(value>>24);
+#endif
+ }
+}
+
uint32_t rar_crc(uint32_t start_crc, void *addr, uint32_t size)
{
unsigned char *data;
- int i;
+ uint32_t i;
data = addr;
#if WORDS_BIGENDIAN == 0
- while (size > 0 && ((long)data & 7))
+ while (size > 0 && ((size_t)data & 7))
{
start_crc = crc_tab[(unsigned char)(start_crc^data[0])]^(start_crc>>8);
size--;
@@ -270,7 +277,7 @@ unsigned int rarvm_read_data(rarvm_input_t *rarvm_input)
static rarvm_standard_filters_t is_standard_filter(unsigned char *code, int code_size)
{
uint32_t code_crc;
- int i;
+ size_t i;
struct standard_filter_signature
{
@@ -576,13 +583,6 @@ static void execute_standard_filter(rarvm_data_t *rarvm_data, rarvm_standard_fil
break;
}
}
-
-#define SET_IP(IP) \
- if ((IP)>=code_size) \
- return TRUE; \
- if (--max_ops<=0) \
- return FALSE; \
- cmd=prepared_code+(IP);
static int rarvm_execute_code(rarvm_data_t *rarvm_data,
struct rarvm_prepared_command *prepared_code, int code_size)
diff --git a/libclamunrar_iface/unrar_iface.c b/libclamunrar_iface/unrar_iface.c
index 638008e1bc0a..a3ae10576c8c 100644
--- a/libclamunrar_iface/unrar_iface.c
+++ b/libclamunrar_iface/unrar_iface.c
@@ -1,6 +1,6 @@
/*
* Interface to libclamunrar
- * Copyright (C) 2015 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
+ * Copyright (C) 2015, 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
* Copyright (C) 2007-2013 Sourcefire, Inc.
* Authors: Trog, Torok Edvin, Tomasz Kojm
*
@@ -53,7 +53,7 @@ static uint32_t unrar_endian_convert_32(uint32_t v)
#ifdef RAR_DEBUG_MODE
#define unrar_dbgmsg printf
#else
-static void unrar_dbgmsg(const char* fmt,...){}
+static void unrar_dbgmsg(const char* fmt,...){(void)fmt;}
#endif
static void *read_header(int fd, header_type hdr_type)
@@ -254,8 +254,9 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
int ofd, retval;
char filename[1024];
unpack_data_t *unpack_data;
- unrar_main_header_t *main_hdr;
+ unrar_main_header_t *main_hdr = NULL;
off_t offset;
+ int ret = 0;
if(!state)
@@ -274,34 +275,29 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
unrar_dbgmsg("UNRAR: Head Size: %.4x\n", main_hdr->head_size);
if(main_hdr->flags & MHD_PASSWORD) {
- free(main_hdr);
- return UNRAR_PASSWD;
+ ret = UNRAR_PASSWD;
+ goto err_mhdr;
}
snprintf(filename,1024,"%s"PATHSEP"comments", dirname);
if(mkdir(filename,0700)) {
unrar_dbgmsg("UNRAR: Unable to create comment temporary directory\n");
- free(main_hdr);
- return UNRAR_ERR;
+ goto err_mhdr;
}
state->comment_dir = strdup(filename);
if(!state->comment_dir) {
- free(main_hdr);
- return UNRAR_EMEM;
+ ret = UNRAR_EMEM;
+ goto err_mhdr;
}
- if(main_hdr->head_size < SIZEOF_NEWMHD) {
- free(main_hdr);
- free(state->comment_dir);
- return UNRAR_ERR;
- }
+ if(main_hdr->head_size < SIZEOF_NEWMHD)
+ goto err_cmt_dir;
unpack_data = (unpack_data_t *) calloc(1, sizeof(unpack_data_t));
if(!unpack_data) {
- free(main_hdr);
- free(state->comment_dir);
unrar_dbgmsg("UNRAR: malloc failed for unpack_data\n");
- return UNRAR_EMEM;
+ ret = UNRAR_EMEM;
+ goto err_cmt_dir;
}
unpack_data->rarvm_data.mem = NULL;
unpack_data->old_filter_lengths = NULL;
@@ -318,10 +314,7 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
offset = lseek(fd, 0, SEEK_CUR);
if (offset == -1) {
unrar_dbgmsg("UNRAR: seek: lseek() call failed in unrar_open\n");
- free(main_hdr);
- free(state->comment_dir);
- free(unpack_data);
- return UNRAR_ERR;
+ goto err_unpack_data;
}
unrar_dbgmsg("UNRAR: Offset: %x\n", offset);
comment_header = read_header(fd, COMM_HEAD);
@@ -336,13 +329,7 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
if(ofd < 0) {
unrar_dbgmsg("UNRAR: ERROR: Failed to open output file\n");
free(comment_header);
- free(main_hdr);
- ppm_destructor(&unpack_data->ppm_data);
- rar_init_filters(unpack_data);
- unpack_free_data(unpack_data);
- free(unpack_data);
- free(state->comment_dir);
- return UNRAR_ERR;
+ goto err_unpack_data;
} else {
if(comment_header->method == 0x30) {
unrar_dbgmsg("UNRAR: Copying stored comment (not packed)\n");
@@ -352,6 +339,8 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
unpack_data->dest_unp_size = comment_header->unpack_size;
unpack_data->pack_size = comment_header->head_size - SIZEOF_COMMHEAD;
retval = rar_unpack(fd, comment_header->unpack_ver, FALSE, unpack_data);
+ if (!retval)
+ unrar_dbgmsg("UNRAR: failed to unpack comment\n");
unpack_free_data(unpack_data);
}
close(ofd);
@@ -360,26 +349,13 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
}
if (lseek(fd, offset, SEEK_SET) == -1) {
unrar_dbgmsg("UNRAR: seek: call to lseek() failed in unrar_open: %ld\n", offset);
- free(main_hdr);
- ppm_destructor(&unpack_data->ppm_data);
- rar_init_filters(unpack_data);
- unpack_free_data(unpack_data);
- free(unpack_data);
- free(state->comment_dir);
- return UNRAR_ERR;
+ goto err_unpack_data;
}
}
if(main_hdr->head_size > SIZEOF_NEWMHD) {
- if(!lseek(fd, main_hdr->head_size - SIZEOF_NEWMHD, SEEK_CUR)) {
- free(main_hdr);
- ppm_destructor(&unpack_data->ppm_data);
- rar_init_filters(unpack_data);
- unpack_free_data(unpack_data);
- free(unpack_data);
- free(state->comment_dir);
- return UNRAR_ERR;
- }
+ if (!lseek(fd, main_hdr->head_size - SIZEOF_NEWMHD, SEEK_CUR))
+ goto err_unpack_data;
}
state->unpack_data = unpack_data;
@@ -389,6 +365,19 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
state->fd = fd;
return UNRAR_OK;
+
+err_unpack_data:
+ ppm_destructor(&unpack_data->ppm_data);
+ rar_init_filters(unpack_data);
+ unpack_free_data(unpack_data);
+ free(unpack_data);
+err_cmt_dir:
+ free(state->comment_dir);
+err_mhdr:
+ free(main_hdr);
+ if (!ret)
+ return UNRAR_ERR;
+ return ret;
}
int unrar_extract_next_prepare(unrar_state_t *state, const char *dirname)
@@ -397,6 +386,7 @@ int unrar_extract_next_prepare(unrar_state_t *state, const char *dirname)
int ofd;
unrar_metadata_t *new_metadata;
+ (void)dirname;
state->file_header = read_block(state->fd, FILE_HEAD);
if(!state->file_header)
@@ -510,7 +500,7 @@ int unrar_extract_next(unrar_state_t *state, const char *dirname)
unrar_dbgmsg("UNRAR: Computed File CRC: 0x%x\n", unpack_data->unp_crc^0xffffffff);
if(unpack_data->unp_crc != 0xffffffff) {
if(state->file_header->file_crc != (unpack_data->unp_crc^0xffffffff)) {
- unrar_dbgmsg("UNRAR: RAR CRC error. If the file is not corrupted, please report at http://bugs.clamav.net/\n");
+ unrar_dbgmsg("UNRAR: RAR CRC error. If the file is not corrupted, please report at https://bugzilla.clamav.net/\n");
}
}
if(!retval) {
--- End Message ---