diff mbox series

[v2] display_options: print_size: Fix order overflow

Message ID 20220912190227.20015-1-pali@kernel.org
State Accepted
Commit d179018e4c9561afac5ca5c8878852f1171b836b
Delegated to: Tom Rini
Headers show
Series [v2] display_options: print_size: Fix order overflow | expand

Commit Message

Pali Rohár Sept. 12, 2022, 7:02 p.m. UTC
Function print_size() round size to the nearst value with one decimal
fraction number. But in special cases also unit order may overflow.

For example value 1073689396 is printed as "1024 MiB" and value 1073741824
as "1 GiB".

Fix this issue by detecting order overflow and increasing unit order.
With this change also value 1073689396 is printed as "1 GiB".

Signed-off-by: Pali Rohár <pali@kernel.org>

---
Changes in v2:
* Add unit test case
---
 lib/display_options.c | 6 ++++++
 test/lib/test_print.c | 3 +++
 2 files changed, 9 insertions(+)

Comments

Simon Glass Sept. 14, 2022, 5:10 p.m. UTC | #1
On Mon, 12 Sept 2022 at 13:03, Pali Rohár <pali@kernel.org> wrote:
>
> Function print_size() round size to the nearst value with one decimal
> fraction number. But in special cases also unit order may overflow.
>
> For example value 1073689396 is printed as "1024 MiB" and value 1073741824
> as "1 GiB".
>
> Fix this issue by detecting order overflow and increasing unit order.
> With this change also value 1073689396 is printed as "1 GiB".
>
> Signed-off-by: Pali Rohár <pali@kernel.org>
>
> ---
> Changes in v2:
> * Add unit test case
> ---
>  lib/display_options.c | 6 ++++++
>  test/lib/test_print.c | 3 +++
>  2 files changed, 9 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>
Tom Rini Sept. 23, 2022, 10:48 p.m. UTC | #2
On Mon, Sep 12, 2022 at 09:02:27PM +0200, Pali Rohár wrote:

> Function print_size() round size to the nearst value with one decimal
> fraction number. But in special cases also unit order may overflow.
> 
> For example value 1073689396 is printed as "1024 MiB" and value 1073741824
> as "1 GiB".
> 
> Fix this issue by detecting order overflow and increasing unit order.
> With this change also value 1073689396 is printed as "1 GiB".
> 
> Signed-off-by: Pali Rohár <pali@kernel.org>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/next, thanks!
diff mbox series

Patch

diff --git a/lib/display_options.c b/lib/display_options.c
index 360b01bcf5ff..59ed4f61b741 100644
--- a/lib/display_options.c
+++ b/lib/display_options.c
@@ -126,6 +126,12 @@  void print_size(uint64_t size, const char *s)
 		if (m >= 10) {
 			m -= 10;
 			n += 1;
+
+			if (n == 1024 && i > 0) {
+				n = 1;
+				m = 0;
+				c = names[i - 1];
+			}
 		}
 	}
 
diff --git a/test/lib/test_print.c b/test/lib/test_print.c
index a60a5a51f126..79b67c779321 100644
--- a/test/lib/test_print.c
+++ b/test/lib/test_print.c
@@ -68,6 +68,9 @@  static int lib_test_print_size(struct unit_test_state *uts)
 	ut_assertok(test_print_size(uts, 7654321, "7.3 MiB;"));
 	ut_assertok(test_print_size(uts, 87654321, "83.6 MiB;"));
 	ut_assertok(test_print_size(uts, 987654321, "941.9 MiB;"));
+	ut_assertok(test_print_size(uts, 1073689395, "1023.9 MiB;"));
+	ut_assertok(test_print_size(uts, 1073689396, "1 GiB;"));
+	ut_assertok(test_print_size(uts, 1073741824, "1 GiB;"));
 	ut_assertok(test_print_size(uts, 1987654321, "1.9 GiB;"));
 	ut_assertok(test_print_size(uts, 54321987654321, "49.4 TiB;"));
 	return 0;