@@ -89,18 +89,35 @@ static RBinInfo *info(RBinFile *bf) {
8989}
9090
9191static bool check (RBinFile * bf , RBuffer * b ) {
92- if (r_buf_size (b ) > 32 ) {
93- ut8 buf [4 ];
94- r_buf_read_at (b , 0 , buf , sizeof (buf ));
95- if (!memcmp (buf , "\xca\xfe\xba\xbe" , 4 )) {
96- int off = r_buf_read_be32_at (b , 4 * sizeof (int ));
97- int version = r_buf_read_be16_at (b , 6 );
98- if (off > 0 && version < 1024 ) {
99- return true;
100- }
92+ if (r_buf_size (b ) <= 32 ) {
93+ return false;
94+ }
95+ ut8 buf [4 ];
96+ r_buf_read_at (b , 0 , buf , sizeof (buf ));
97+ if (memcmp (buf , "\xca\xfe\xba\xbe" , 4 )) {
98+ return false;
99+ }
100+ // Disambiguate from fat Mach-O (same magic): reject when the bytes at
101+ // offset 16 look like a mach-o header (fat_arch[0].offset points there).
102+ ut8 m [4 ];
103+ ut32 off0 = r_buf_read_be32_at (b , 8 );
104+ if (off0 > 0 && off0 + 4 <= r_buf_size (b ) && r_buf_read_at (b , off0 , m , 4 ) == 4 ) {
105+ if (!memcmp (m , "\xce\xfa\xed\xfe" , 4 )
106+ || !memcmp (m , "\xfe\xed\xfa\xce" , 4 )
107+ || !memcmp (m , "\xfe\xed\xfa\xcf" , 4 )
108+ || !memcmp (m , "\xcf\xfa\xed\xfe" , 4 )) {
109+ return false;
101110 }
102111 }
103- return false;
112+ // Java class: minor_version (4-5), major_version (6-7). major>=45 since
113+ // Java 1.1; <1024 keeps the old sanity bound.
114+ ut16 major = r_buf_read_be16_at (b , 6 );
115+ if (major < 45 || major >= 1024 ) {
116+ return false;
117+ }
118+ // constant_pool_count at offset 8; must be > 0 per JVM spec.
119+ ut16 cp_count = r_buf_read_be16_at (b , 8 );
120+ return cp_count > 0 ;
104121}
105122
106123static int retdemangle (const char * str ) {
0 commit comments