Blame SOURCES/0210-Coverity-rightly-noticed-that-grub_ipv6_get_masksize.patch

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