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

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