1
1
/*
2
2
* Extract RAR archives
3
3
*
4
- * Modified for JtR, (c) magnum 2012. This code use a memory buffer instead
4
+ * Modified for JtR, (c) magnum 2012-2025 . This code uses a buffer instead
5
5
* of a file handle, and decrypts while reading. It does not store inflated
6
6
* data, it just CRC's it. Support for older RAR versions was stripped.
7
7
* Autoconf stuff was removed.
31
31
#include <stdlib.h>
32
32
#include <string.h>
33
33
34
+ #include "common.h"
35
+
34
36
#include "unrar.h"
35
37
#include "unrarppm.h"
36
38
#include "unrarvm.h"
@@ -1054,6 +1056,7 @@ int rar_unpack29(const unsigned char *fd, int solid, unpack_data_t *unpack_data)
1054
1056
} else {
1055
1057
number = rar_decode_number (unpack_data , (struct Decode * )& unpack_data -> LD );
1056
1058
//rar_dbgmsg("number = %d\n", number);
1059
+ /* Sanity check added by magnum */
1057
1060
if (number < 0 ) {
1058
1061
retval = 0 ;
1059
1062
break ;
@@ -1063,14 +1066,20 @@ int rar_unpack29(const unsigned char *fd, int solid, unpack_data_t *unpack_data)
1063
1066
continue ;
1064
1067
}
1065
1068
if (number >= 271 ) {
1069
+ /* Sanity check added by magnum (lbits is same size) */
1070
+ if (number - 271 >= sizeof (ldecode )) {
1071
+ retval = 0 ;
1072
+ break ;
1073
+ }
1066
1074
length = ldecode [number -= 271 ]+ 3 ;
1067
1075
if ((bits = lbits [number ]) > 0 ) {
1068
1076
length += rar_getbits (unpack_data ) >> (16 - bits );
1069
1077
rar_addbits (unpack_data , bits );
1070
1078
}
1071
1079
dist_number = rar_decode_number (unpack_data ,
1072
1080
(struct Decode * )& unpack_data -> DD );
1073
- if (dist_number < 0 ) {
1081
+ /* Sanity checks added by magnum (dbits is same size) */
1082
+ if (dist_number < 0 || dist_number >= sizeof (ddecode )) {
1074
1083
retval = 0 ;
1075
1084
break ;
1076
1085
}
@@ -1149,7 +1158,8 @@ int rar_unpack29(const unsigned char *fd, int solid, unpack_data_t *unpack_data)
1149
1158
1150
1159
length_number = rar_decode_number (unpack_data ,
1151
1160
(struct Decode * )& unpack_data -> RD );
1152
- if (length_number < 0 ) {
1161
+ /* Sanity checks added by magnum (lbits is same size) */
1162
+ if (length_number < 0 || length_number >= sizeof (ldecode )) {
1153
1163
retval = 0 ;
1154
1164
break ;
1155
1165
}
@@ -1163,6 +1173,11 @@ int rar_unpack29(const unsigned char *fd, int solid, unpack_data_t *unpack_data)
1163
1173
continue ;
1164
1174
}
1165
1175
if (number < 272 ) {
1176
+ /* Sanity check added by magnum (sdbits is same size) */
1177
+ if (number - 263 >= sizeof (sddecode )) {
1178
+ retval = 0 ;
1179
+ break ;
1180
+ }
1166
1181
distance = sddecode [number -= 263 ]+ 1 ;
1167
1182
if ((bits = sdbits [number ]) > 0 ) {
1168
1183
distance += rar_getbits (unpack_data ) >> (16 - bits );
@@ -1180,6 +1195,12 @@ int rar_unpack29(const unsigned char *fd, int solid, unpack_data_t *unpack_data)
1180
1195
unp_write_buf (unpack_data );
1181
1196
}
1182
1197
1198
+ /* Added by magnum */
1199
+ if (retval && unpack_data -> written_size != unpack_data -> dest_unp_size ) {
1200
+ //rar_dbgmsg("Passed but only wrote %ld of %ld, degrading to FAIL\n", (long)unpack_data->written_size, (long)unpack_data->dest_unp_size);
1201
+ retval = 0 ;
1202
+ }
1203
+
1183
1204
//rar_dbgmsg("Written size: %ld\n", (long)unpack_data->written_size);
1184
1205
//rar_dbgmsg("True size: %ld\n", (long)unpack_data->true_size);
1185
1206
0 commit comments