Skip to content

Commit 3f7a8d3

Browse files
committed
type/format: do not read float unless asked to
1 parent 660146d commit 3f7a8d3

File tree

1 file changed

+34
-34
lines changed

1 file changed

+34
-34
lines changed

librz/type/format.c

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
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

Comments
 (0)