You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.3 KiB
87 lines
2.3 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Peter Jones <pjones@redhat.com> |
|
Date: Tue, 12 Jul 2016 11:59:39 -0400 |
|
Subject: [PATCH] Coverity rightly noticed that grub_ipv6_get_masksize() was |
|
broken. |
|
|
|
This fixes it with a version that even seems to work. |
|
|
|
Related: rhbz#1154226 |
|
|
|
Signed-off-by: Peter Jones <pjones@redhat.com> |
|
--- |
|
grub-core/net/net.c | 27 ++++++++++++++++----------- |
|
include/grub/net.h | 2 +- |
|
2 files changed, 17 insertions(+), 12 deletions(-) |
|
|
|
diff --git a/grub-core/net/net.c b/grub-core/net/net.c |
|
index 19a81bc9e78..36fc0d8b2e8 100644 |
|
--- a/grub-core/net/net.c |
|
+++ b/grub-core/net/net.c |
|
@@ -970,29 +970,34 @@ grub_net_network_level_interface_register (struct grub_net_network_level_interfa |
|
} |
|
|
|
int |
|
-grub_ipv6_get_masksize(grub_uint8_t *be_mask) |
|
+grub_ipv6_get_masksize (grub_uint16_t be_mask[8]) |
|
{ |
|
grub_uint8_t *mask; |
|
grub_uint16_t mask16[8]; |
|
- unsigned int x; |
|
- int ret = 0; |
|
+ int x, y; |
|
+ int ret = 128; |
|
|
|
- grub_memcpy (mask16, be_mask, sizeof(mask16)); |
|
+ grub_memcpy (mask16, be_mask, sizeof (mask16)); |
|
for (x = 0; x < 8; x++) |
|
mask16[x] = grub_be_to_cpu16 (mask16[x]); |
|
|
|
mask = (grub_uint8_t *)mask16; |
|
|
|
- for (x = 15; x > 0; x--) |
|
+ for (x = 15; x >= 0; x--) |
|
{ |
|
grub_uint8_t octet = mask[x]; |
|
- while (octet & 0x80) |
|
+ if (!octet) |
|
{ |
|
- ret++; |
|
- octet <<= 1; |
|
+ ret -= 8; |
|
+ continue; |
|
+ } |
|
+ for (y = 0; y < 8; y++) |
|
+ { |
|
+ if (octet & (1 << y)) |
|
+ break; |
|
+ else |
|
+ ret--; |
|
} |
|
- if (ret) |
|
- ret += 8 * (15 - x); |
|
break; |
|
} |
|
|
|
@@ -1009,7 +1014,7 @@ grub_net_add_ipv6_local (struct grub_net_network_level_interface *inter, |
|
return 0; |
|
|
|
if (mask == -1) |
|
- mask = grub_ipv6_get_masksize ((grub_uint8_t *)inter->address.ipv6); |
|
+ mask = grub_ipv6_get_masksize ((grub_uint16_t *)inter->address.ipv6); |
|
|
|
if (mask == -1) |
|
return 0; |
|
diff --git a/include/grub/net.h b/include/grub/net.h |
|
index c7b8e2ac885..bd930f4dd8c 100644 |
|
--- a/include/grub/net.h |
|
+++ b/include/grub/net.h |
|
@@ -500,7 +500,7 @@ grub_net_configure_by_dhcpv6_ack (const char *name, |
|
int is_def, char **device, char **path); |
|
|
|
int |
|
-grub_ipv6_get_masksize(grub_uint8_t *mask); |
|
+grub_ipv6_get_masksize(grub_uint16_t *mask); |
|
|
|
grub_err_t |
|
grub_net_add_ipv6_local (struct grub_net_network_level_interface *inf,
|
|
|