3030
3131// TODO REWRITE THIS IS BECOMING A NIGHTMARE
3232
33- static float updateAddr (const ut8 * buf , int len , int endian , ut64 * addr , ut64 * addr64 ) {
33+ static float updateAddr (const ut8 * buf , int len , int endian , ut64 * addr , ut64 * addr64 , bool read_float ) {
3434 float f = 0.0 ;
3535 // assert sizeof (float) == sizeof (ut32))
3636 // XXX 999 is used as an implicit buffer size, we should pass the buffer size to every function too, otherwise this code will give us some problems
@@ -42,7 +42,7 @@ static float updateAddr(const ut8 *buf, int len, int endian, ut64 *addr, ut64 *a
4242 if (len < 1 ) {
4343 return 0 ;
4444 }
45- if (len >= sizeof (float )) {
45+ if (read_float && len >= sizeof (float )) {
4646 f = rz_read_ble_float (buf , endian );
4747 }
4848 if (addr && len > 3 ) {
@@ -60,7 +60,7 @@ static int rz_get_size(RzNum *num, ut8 *buf, int endian, const char *s) {
6060 if (s [0 ] == '*' && len >= 4 ) { // value pointed by the address
6161 ut64 addr ;
6262 int offset = (int )rz_num_math (num , s + 1 );
63- (void )updateAddr (buf + offset , 999 , endian , & addr , NULL );
63+ (void )updateAddr (buf + offset , 999 , endian , & addr , NULL , false );
6464 return addr ;
6565 }
6666 // flag handling doesnt seems to work here
@@ -97,7 +97,7 @@ static void rz_type_format_quadword(RzStrBuf *outbuf, int endian, int mode,
9797 elem = size / ARRAYINDEX_COEF - 1 ;
9898 size %= ARRAYINDEX_COEF ;
9999 }
100- updateAddr (buf + i , size - i , endian , NULL , & addr64 );
100+ updateAddr (buf + i , size - i , endian , NULL , & addr64 , false );
101101 if (MUSTSET ) {
102102 rz_strbuf_appendf (outbuf , "wv8 %s @ 0x%08" PFMT64x "\n" , setval , seeki + ((elem >= 0 ) ? elem * 8 : 0 ));
103103 } else if (MUSTSEE ) {
@@ -116,7 +116,7 @@ static void rz_type_format_quadword(RzStrBuf *outbuf, int endian, int mode,
116116 rz_strbuf_append (outbuf , "[ " );
117117 }
118118 while (size -- ) {
119- updateAddr (buf + i , size - i , endian , NULL , & addr64 );
119+ updateAddr (buf + i , size - i , endian , NULL , & addr64 , false );
120120 if (elem == -1 || elem == 0 ) {
121121 rz_strbuf_appendf (outbuf , "0x%016" PFMT64x , addr64 );
122122 if (elem == 0 ) {
@@ -141,7 +141,7 @@ static void rz_type_format_quadword(RzStrBuf *outbuf, int endian, int mode,
141141 } else {
142142 rz_strbuf_append (outbuf , "[ " );
143143 while (size -- ) {
144- updateAddr (buf + i , size - i , endian , NULL , & addr64 );
144+ updateAddr (buf + i , size - i , endian , NULL , & addr64 , false );
145145 if (elem == -1 || elem == 0 ) {
146146 rz_strbuf_appendf (outbuf , "%" PFMT64d , addr64 );
147147 if (elem == 0 ) {
@@ -499,7 +499,7 @@ static void rz_type_format_time(RzStrBuf *outbuf, int endian, int mode,
499499 elem = size / ARRAYINDEX_COEF - 1 ;
500500 size %= ARRAYINDEX_COEF ;
501501 }
502- updateAddr (buf + i , size - i , endian , & addr , NULL );
502+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
503503 if (MUSTSET ) {
504504 rz_strbuf_appendf (outbuf , "wv4 %s @ 0x%08" PFMT64x "\n" , setval , seeki + ((elem >= 0 ) ? elem * 4 : 0 ));
505505 } else if (MUSTSEE ) {
@@ -519,7 +519,7 @@ static void rz_type_format_time(RzStrBuf *outbuf, int endian, int mode,
519519 rz_strbuf_appendf (outbuf , "[ " );
520520 }
521521 while (size -- ) {
522- updateAddr (buf + i , size - i , endian , & addr , NULL );
522+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
523523 rz_asctime_r (rz_gmtime_r ((time_t * )& addr , & timestruct ), timestr );
524524 * (timestr + 24 ) = '\0' ;
525525 if (elem == -1 || elem == 0 ) {
@@ -553,7 +553,7 @@ static void rz_type_format_time(RzStrBuf *outbuf, int endian, int mode,
553553 } else {
554554 rz_strbuf_append (outbuf , "[ " );
555555 while (size -- ) {
556- updateAddr (buf + i , size - i , endian , & addr , NULL );
556+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
557557 rz_asctime_r (rz_gmtime_r ((time_t * )& addr , & timestruct ), timestr );
558558 * (timestr + 24 ) = '\0' ;
559559 if (elem == -1 || elem == 0 ) {
@@ -588,7 +588,7 @@ static void rz_type_format_hex(RzStrBuf *outbuf, int endian, int mode,
588588 elem = size / ARRAYINDEX_COEF - 1 ;
589589 size %= ARRAYINDEX_COEF ;
590590 }
591- updateAddr (buf + i , size - i , endian , & addr , NULL );
591+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
592592 if (MUSTSET ) {
593593 rz_strbuf_appendf (outbuf , "wv4 %s @ 0x%08" PFMT64x "\n" , setval , seeki + ((elem >= 0 ) ? elem * 4 : 0 ));
594594 } else if ((mode & RZ_PRINT_DOT ) || MUSTSEESTRUCT ) {
@@ -608,7 +608,7 @@ static void rz_type_format_hex(RzStrBuf *outbuf, int endian, int mode,
608608 rz_strbuf_append (outbuf , "[ " );
609609 }
610610 while (size -- ) {
611- updateAddr (buf + i , size - i , endian , & addr , NULL );
611+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
612612 if (elem == -1 || elem == 0 ) {
613613 if (ISQUIET ) {
614614 if (addr == UT64_MAX || addr == UT32_MAX ) {
@@ -641,7 +641,7 @@ static void rz_type_format_hex(RzStrBuf *outbuf, int endian, int mode,
641641 } else {
642642 rz_strbuf_append (outbuf , "[ " );
643643 while (size -- ) {
644- updateAddr (buf + i , size - i , endian , & addr , NULL );
644+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
645645 if (elem == -1 || elem == 0 ) {
646646 rz_strbuf_appendf (outbuf , "%" PFMT64d , addr );
647647 if (elem == 0 ) {
@@ -670,7 +670,7 @@ static void rz_type_format_int(RzStrBuf *outbuf, int endian, int mode,
670670 elem = size / ARRAYINDEX_COEF - 1 ;
671671 size %= ARRAYINDEX_COEF ;
672672 }
673- updateAddr (buf + i , size - i , endian , & addr , NULL );
673+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
674674 if (MUSTSET ) {
675675 rz_strbuf_appendf (outbuf , "wv4 %s @ %" PFMT64d "\n" , setval , seeki + ((elem >= 0 ) ? elem * 4 : 0 ));
676676 } else if ((mode & RZ_PRINT_DOT ) || MUSTSEESTRUCT ) {
@@ -686,7 +686,7 @@ static void rz_type_format_int(RzStrBuf *outbuf, int endian, int mode,
686686 rz_strbuf_append (outbuf , "[ " );
687687 }
688688 while (size -- ) {
689- updateAddr (buf + i , size - i , endian , & addr , NULL );
689+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
690690 if (elem == -1 || elem == 0 ) {
691691 rz_strbuf_appendf (outbuf , "%" PFMT64d , (st64 )(st32 )addr );
692692 if (elem == 0 ) {
@@ -711,7 +711,7 @@ static void rz_type_format_int(RzStrBuf *outbuf, int endian, int mode,
711711 } else {
712712 rz_strbuf_append (outbuf , "[ " );
713713 while (size -- ) {
714- updateAddr (buf + i , size - i , endian , & addr , NULL );
714+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
715715 if (elem == -1 || elem == 0 ) {
716716 rz_strbuf_appendf (outbuf , "%" PFMT64d , addr );
717717 if (elem == 0 ) {
@@ -758,7 +758,7 @@ static void rz_type_format_octal(RzStrBuf *outbuf, int endian, int mode,
758758 elem = size / ARRAYINDEX_COEF - 1 ;
759759 size %= ARRAYINDEX_COEF ;
760760 }
761- updateAddr (buf + i , size - i , endian , & addr , NULL );
761+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
762762 if (MUSTSET ) {
763763 rz_strbuf_appendf (outbuf , "wv4 %s @ 0x%08" PFMT64x "\n" , setval , seeki + ((elem >= 0 ) ? elem * 4 : 0 ));
764764 } else if ((mode & RZ_PRINT_DOT ) || MUSTSEESTRUCT ) {
@@ -777,7 +777,7 @@ static void rz_type_format_octal(RzStrBuf *outbuf, int endian, int mode,
777777 rz_strbuf_append (outbuf , "[ " );
778778 }
779779 while (size -- ) {
780- updateAddr (buf + i , size - i , endian , & addr , NULL );
780+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
781781 if (elem == -1 || elem == 0 ) {
782782 rz_strbuf_appendf (outbuf , "0%08" PFMT64o , addr );
783783 if (elem == 0 ) {
@@ -802,7 +802,7 @@ static void rz_type_format_octal(RzStrBuf *outbuf, int endian, int mode,
802802 } else {
803803 rz_strbuf_append (outbuf , "[ " );
804804 while (size -- ) {
805- updateAddr (buf , i , endian , & addr , NULL );
805+ updateAddr (buf , i , endian , & addr , NULL , false );
806806 if (elem == -1 || elem == 0 ) {
807807 rz_strbuf_appendf (outbuf , "%" PFMT64d , addr );
808808 if (elem == 0 ) {
@@ -831,7 +831,7 @@ static void rz_type_format_hexflag(RzStrBuf *outbuf, int endian, int mode,
831831 elem = size / ARRAYINDEX_COEF - 1 ;
832832 size %= ARRAYINDEX_COEF ;
833833 }
834- updateAddr (buf + i , size - i , endian , & addr , NULL );
834+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
835835 if (MUSTSET ) {
836836 rz_strbuf_appendf (outbuf , "wv4 %s @ 0x%08" PFMT64x "\n" , setval , seeki + ((elem >= 0 ) ? elem * 4 : 0 ));
837837 } else if ((mode & RZ_PRINT_DOT ) || MUSTSEESTRUCT ) {
@@ -852,7 +852,7 @@ static void rz_type_format_hexflag(RzStrBuf *outbuf, int endian, int mode,
852852 rz_strbuf_append (outbuf , "[ " );
853853 }
854854 while (size -- ) {
855- updateAddr (buf + i , size - i , endian , & addr , NULL );
855+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
856856 if (elem == -1 || elem == 0 ) {
857857 rz_strbuf_appendf (outbuf , "0x%08" PFMT64x , addr );
858858 if (elem == 0 ) {
@@ -877,7 +877,7 @@ static void rz_type_format_hexflag(RzStrBuf *outbuf, int endian, int mode,
877877 } else {
878878 rz_strbuf_append (outbuf , "[ " );
879879 while (size -- ) {
880- updateAddr (buf + i , size - i , endian , & addr , NULL );
880+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
881881 if (elem == -1 || elem == 0 ) {
882882 rz_strbuf_appendf (outbuf , "%" PFMT64d , addr );
883883 if (elem == 0 ) {
@@ -1000,7 +1000,7 @@ static void rz_type_format_float(RzStrBuf *outbuf, int endian, int mode,
10001000 elem = size / ARRAYINDEX_COEF - 1 ;
10011001 size %= ARRAYINDEX_COEF ;
10021002 }
1003- val_f = updateAddr (buf + i , 999 , endian , & addr , NULL );
1003+ val_f = updateAddr (buf + i , 999 , endian , & addr , NULL , true );
10041004 if (MUSTSET ) {
10051005 rz_strbuf_appendf (outbuf , "wv4 %s @ 0x%08" PFMT64x "\n" , setval ,
10061006 seeki + ((elem >= 0 ) ? elem * 4 : 0 ));
@@ -1020,7 +1020,7 @@ static void rz_type_format_float(RzStrBuf *outbuf, int endian, int mode,
10201020 rz_strbuf_append (outbuf , "[ " );
10211021 }
10221022 while (size -- ) {
1023- val_f = updateAddr (buf + i , 9999 , endian , & addr , NULL );
1023+ val_f = updateAddr (buf + i , 9999 , endian , & addr , NULL , true );
10241024 if (elem == -1 || elem == 0 ) {
10251025 rz_strbuf_appendf (outbuf , "%.9g" , val_f );
10261026 if (elem == 0 ) {
@@ -1054,7 +1054,7 @@ static void rz_type_format_double(RzStrBuf *outbuf, int endian, int mode,
10541054 elem = size / ARRAYINDEX_COEF - 1 ;
10551055 size %= ARRAYINDEX_COEF ;
10561056 }
1057- updateAddr (buf + i , 999 , endian , & addr , NULL );
1057+ updateAddr (buf + i , 999 , endian , & addr , NULL , false );
10581058 val_f = rz_read_at_ble_double (buf , i , endian );
10591059 if (MUSTSET ) {
10601060 rz_strbuf_appendf (outbuf , "wv8 %s @ 0x%08" PFMT64x "\n" , setval ,
@@ -1076,7 +1076,7 @@ static void rz_type_format_double(RzStrBuf *outbuf, int endian, int mode,
10761076 }
10771077 while (size -- ) {
10781078 // XXX this 999 is scary
1079- updateAddr (buf + i , 9999 , endian , & addr , NULL );
1079+ updateAddr (buf + i , 9999 , endian , & addr , NULL , false );
10801080 val_f = rz_read_at_ble_double (buf , i , endian );
10811081 if (elem == -1 || elem == 0 ) {
10821082 rz_strbuf_appendf (outbuf , "%.17g" , val_f );
@@ -1438,9 +1438,9 @@ static void rz_type_format_num(RzStrBuf *outbuf, int endian, int mode, const cha
14381438 size %= ARRAYINDEX_COEF ;
14391439 }
14401440 if (bytes == 8 ) {
1441- updateAddr (buf + i , size - i , endian , NULL , & addr );
1441+ updateAddr (buf + i , size - i , endian , NULL , & addr , false );
14421442 } else {
1443- updateAddr (buf + i , size - i , endian , & addr , NULL );
1443+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
14441444 }
14451445 if (MUSTSET ) {
14461446 rz_strbuf_appendf (outbuf , "wv%d %s @ 0x%08" PFMT64x "\n" , bytes , setval , seeki + ((elem >= 0 ) ? elem * (bytes ) : 0 ));
@@ -1458,9 +1458,9 @@ static void rz_type_format_num(RzStrBuf *outbuf, int endian, int mode, const cha
14581458 }
14591459 while (size -- ) {
14601460 if (bytes == 8 ) {
1461- updateAddr (buf + i , size - i , endian , NULL , & addr );
1461+ updateAddr (buf + i , size - i , endian , NULL , & addr , false );
14621462 } else {
1463- updateAddr (buf + i , size - i , endian , & addr , NULL );
1463+ updateAddr (buf + i , size - i , endian , & addr , NULL , false );
14641464 }
14651465 if (elem == -1 || elem == 0 ) {
14661466 rz_type_format_num_specifier (outbuf , addr , bytes , sign );
@@ -1487,9 +1487,9 @@ static void rz_type_format_num(RzStrBuf *outbuf, int endian, int mode, const cha
14871487 rz_strbuf_append (outbuf , "[ " );
14881488 while (size -- ) {
14891489 if (bytes == 8 ) {
1490- updateAddr (buf + i , size , endian , NULL , & addr );
1490+ updateAddr (buf + i , size , endian , NULL , & addr , false );
14911491 } else {
1492- updateAddr (buf + i , size , endian , & addr , NULL );
1492+ updateAddr (buf + i , size , endian , & addr , NULL , false );
14931493 }
14941494 if (elem == -1 || elem == 0 ) {
14951495 rz_type_format_num_specifier (outbuf , addr , bytes , sign );
@@ -2128,9 +2128,9 @@ static int rz_type_format_data_internal(const RzTypeDB *typedb, RzPrint *p, RzSt
21282128 if (i + fs - 1 < len ) { // should be +7 to avoid oobread on 'q'
21292129 // Max byte number where updateAddr will look into
21302130 if (len - i < 7 ) {
2131- updateAddr (buf + i , THRESHOLD - (len - i ), endian , & addr , & addr64 );
2131+ updateAddr (buf + i , THRESHOLD - (len - i ), endian , & addr , & addr64 , false );
21322132 } else {
2133- updateAddr (buf + i , len - i , endian , & addr , & addr64 );
2133+ updateAddr (buf + i , len - i , endian , & addr , & addr64 , false );
21342134 }
21352135 if (typedb -> target -> bits == 64 ) {
21362136 addr = addr64 ;
@@ -2223,7 +2223,7 @@ static int rz_type_format_data_internal(const RzTypeDB *typedb, RzPrint *p, RzSt
22232223 if (((i + 3 ) < len ) || ((i + 7 ) < len )) {
22242224 // XXX this breaks pf *D
22252225 if (tmp != 'D' ) {
2226- updateAddr (buf + i , len - i , endian , & addr , & addr64 );
2226+ updateAddr (buf + i , len - i , endian , & addr , & addr64 , false );
22272227 }
22282228 } else {
22292229 eprintf ("(cannot read at 0x%08" PFMT64x ", block: %s, blocksize: 0x%x)\n" ,
0 commit comments