]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
multiboot: Simplify to avoid confusing assignment.
authorVladimir Serbinenko <phcoder@gmail.com>
Mon, 26 Jan 2015 08:43:52 +0000 (09:43 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Mon, 26 Jan 2015 08:43:52 +0000 (09:43 +0100)
Found by: Coverity scan.

grub-core/loader/i386/multiboot_mbi.c
grub-core/loader/multiboot_mbi2.c

index f10c087f724a1eca8043e62c3697cb8f109d9db0..956d0e37b9f87879102c1648b17bf596ade0187c 100644 (file)
@@ -121,6 +121,24 @@ load_kernel (grub_file_t file, const char *filename,
   return grub_multiboot_load_elf (file, filename, buffer);
 }
 
+static struct multiboot_header *
+find_header (char *buffer, grub_ssize_t len)
+{
+  struct multiboot_header *header;
+
+  /* Look for the multiboot header in the buffer.  The header should
+     be at least 12 bytes and aligned on a 4-byte boundary.  */
+  for (header = (struct multiboot_header *) buffer;
+       ((char *) header <= buffer + len - 12);
+       header = (struct multiboot_header *) ((char *) header + MULTIBOOT_HEADER_ALIGN))
+    {
+      if (header->magic == MULTIBOOT_HEADER_MAGIC
+         && !(header->magic + header->flags + header->checksum))
+       return header;
+    }
+  return NULL;
+}
+
 grub_err_t
 grub_multiboot_load (grub_file_t file, const char *filename)
 {
@@ -143,16 +161,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
       return grub_errno;
     }
 
-  /* Look for the multiboot header in the buffer.  The header should
-     be at least 12 bytes and aligned on a 4-byte boundary.  */
-  for (header = (struct multiboot_header *) buffer;
-       ((char *) header <= buffer + len - 12) || (header = 0);
-       header = (struct multiboot_header *) ((char *) header + MULTIBOOT_HEADER_ALIGN))
-    {
-      if (header->magic == MULTIBOOT_HEADER_MAGIC
-         && !(header->magic + header->flags + header->checksum))
-       break;
-    }
+  header = find_header (buffer, len);
 
   if (header == 0)
     {
index 83e8919fa9ae47917af0824d6d39c6c11e12fa91..6f74aeef74a7a95396b1d0c5e1904ed5d741e631 100644 (file)
@@ -79,6 +79,25 @@ grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize,
   elf_sections = data;
 }
 
+static struct multiboot_header *
+find_header (grub_properly_aligned_t *buffer, grub_ssize_t len)
+{
+  struct multiboot_header *header;
+  /* Look for the multiboot header in the buffer.  The header should
+     be at least 12 bytes and aligned on a 4-byte boundary.  */
+  for (header = (struct multiboot_header *) buffer;
+       ((char *) header <= (char *) buffer + len - 12);
+       header = (struct multiboot_header *) ((grub_uint32_t *) header + MULTIBOOT_HEADER_ALIGN / 4))
+    {
+      if (header->magic == MULTIBOOT_HEADER_MAGIC
+         && !(header->magic + header->architecture
+              + header->header_length + header->checksum)
+         && header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT)
+       return header;
+    }
+  return NULL;
+}
+
 grub_err_t
 grub_multiboot_load (grub_file_t file, const char *filename)
 {
@@ -107,18 +126,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
 
   COMPILE_TIME_ASSERT (MULTIBOOT_HEADER_ALIGN % 4 == 0);
 
-  /* Look for the multiboot header in the buffer.  The header should
-     be at least 12 bytes and aligned on a 4-byte boundary.  */
-  for (header = (struct multiboot_header *) buffer;
-       ((char *) header <= (char *) buffer + len - 12) || (header = 0);
-       header = (struct multiboot_header *) ((grub_uint32_t *) header + MULTIBOOT_HEADER_ALIGN / 4))
-    {
-      if (header->magic == MULTIBOOT_HEADER_MAGIC
-         && !(header->magic + header->architecture
-              + header->header_length + header->checksum)
-         && header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT)
-       break;
-    }
+  header = find_header (buffer, len);
 
   if (header == 0)
     {