Blame SOURCES/0163-grub-core-loader-machoXX.c-Remove-nested-functions.patch

f96e0b
From ce1cd200024547db7be52f08d80ccb2a3ece94c3 Mon Sep 17 00:00:00 2001
f96e0b
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
f96e0b
Date: Wed, 27 Feb 2013 20:56:23 +0100
f96e0b
Subject: [PATCH 163/482] 	* grub-core/loader/machoXX.c: Remove nested
f96e0b
 functions.
f96e0b
f96e0b
---
f96e0b
 ChangeLog                  |   4 +
f96e0b
 grub-core/loader/machoXX.c | 261 +++++++++++++++++++++++++--------------------
f96e0b
 2 files changed, 148 insertions(+), 117 deletions(-)
f96e0b
f96e0b
diff --git a/ChangeLog b/ChangeLog
f96e0b
index dbecfef..bb02830 100644
f96e0b
--- a/ChangeLog
f96e0b
+++ b/ChangeLog
f96e0b
@@ -1,3 +1,7 @@
f96e0b
+2013-02-27  Vladimir Serbinenko  <phcoder@gmail.com>
f96e0b
+
f96e0b
+	* grub-core/loader/machoXX.c: Remove nested functions.
f96e0b
+
f96e0b
 2013-02-27  Colin Watson  <cjwatson@ubuntu.com>
f96e0b
 
f96e0b
 	Remove nested functions from disk and file read hooks.
f96e0b
diff --git a/grub-core/loader/machoXX.c b/grub-core/loader/machoXX.c
f96e0b
index 5b78a61..3a382b3 100644
f96e0b
--- a/grub-core/loader/machoXX.c
f96e0b
+++ b/grub-core/loader/machoXX.c
f96e0b
@@ -79,7 +79,7 @@ SUFFIX (grub_macho_parse) (grub_macho_t macho, const char *filename)
f96e0b
     }
f96e0b
 }
f96e0b
 
f96e0b
-typedef int NESTED_FUNC_ATTR (*grub_macho_iter_hook_t)
f96e0b
+typedef int (*grub_macho_iter_hook_t)
f96e0b
 (grub_macho_t , struct grub_macho_cmd *,
f96e0b
 	       void *);
f96e0b
 
f96e0b
@@ -200,46 +200,59 @@ SUFFIX (grub_macho_readfile) (grub_macho_t macho,
f96e0b
   return GRUB_ERR_NONE;
f96e0b
 }
f96e0b
 
f96e0b
+struct calcsize_ctx
f96e0b
+{
f96e0b
+  int flags;
f96e0b
+  int nr_phdrs;
f96e0b
+  grub_macho_addr_t *segments_start;
f96e0b
+  grub_macho_addr_t *segments_end;
f96e0b
+};
f96e0b
+
f96e0b
+/* Run through the program headers to calculate the total memory size we
f96e0b
+   should claim.  */
f96e0b
+static int
f96e0b
+calcsize (grub_macho_t _macho __attribute__ ((unused)),
f96e0b
+	  struct grub_macho_cmd *hdr0,
f96e0b
+	  void *_arg)
f96e0b
+{
f96e0b
+  grub_macho_segment_t *hdr = (grub_macho_segment_t *) hdr0;
f96e0b
+  struct calcsize_ctx *ctx = _arg;
f96e0b
+  if (hdr->cmd != GRUB_MACHO_CMD_SEGMENT)
f96e0b
+    return 0;
f96e0b
+
f96e0b
+  if (! hdr->vmsize)
f96e0b
+    return 0;
f96e0b
+
f96e0b
+  if (! hdr->filesize && (ctx->flags & GRUB_MACHO_NOBSS))
f96e0b
+    return 0;
f96e0b
+
f96e0b
+  ctx->nr_phdrs++;
f96e0b
+  if (hdr->vmaddr < *ctx->segments_start)
f96e0b
+    *ctx->segments_start = hdr->vmaddr;
f96e0b
+  if (hdr->vmaddr + hdr->vmsize > *ctx->segments_end)
f96e0b
+    *ctx->segments_end = hdr->vmaddr + hdr->vmsize;
f96e0b
+  return 0;
f96e0b
+}
f96e0b
+
f96e0b
 /* Calculate the amount of memory spanned by the segments. */
f96e0b
 grub_err_t
f96e0b
 SUFFIX (grub_macho_size) (grub_macho_t macho, grub_macho_addr_t *segments_start,
f96e0b
 			  grub_macho_addr_t *segments_end, int flags,
f96e0b
 			  const char *filename)
f96e0b
 {
f96e0b
-  int nr_phdrs = 0;
f96e0b
-
f96e0b
-  /* Run through the program headers to calculate the total memory size we
f96e0b
-     should claim.  */
f96e0b
-  auto int NESTED_FUNC_ATTR calcsize (grub_macho_t _macho,
f96e0b
-				      struct grub_macho_cmd *phdr, void *_arg);
f96e0b
-  int NESTED_FUNC_ATTR calcsize (grub_macho_t _macho __attribute__ ((unused)),
f96e0b
-				 struct grub_macho_cmd *hdr0,
f96e0b
-				 void *_arg __attribute__ ((unused)))
f96e0b
-    {
f96e0b
-      grub_macho_segment_t *hdr = (grub_macho_segment_t *) hdr0;
f96e0b
-      if (hdr->cmd != GRUB_MACHO_CMD_SEGMENT)
f96e0b
-	return 0;
f96e0b
-
f96e0b
-      if (! hdr->vmsize)
f96e0b
-	return 0;
f96e0b
-
f96e0b
-      if (! hdr->filesize && (flags & GRUB_MACHO_NOBSS))
f96e0b
-	return 0;
f96e0b
-
f96e0b
-      nr_phdrs++;
f96e0b
-      if (hdr->vmaddr < *segments_start)
f96e0b
-	*segments_start = hdr->vmaddr;
f96e0b
-      if (hdr->vmaddr + hdr->vmsize > *segments_end)
f96e0b
-	*segments_end = hdr->vmaddr + hdr->vmsize;
f96e0b
-      return 0;
f96e0b
-    }
f96e0b
+  struct calcsize_ctx ctx = {
f96e0b
+    .flags = flags,
f96e0b
+    .nr_phdrs = 0,
f96e0b
+    .segments_start = segments_start,
f96e0b
+    .segments_end = segments_end,
f96e0b
+  };
f96e0b
 
f96e0b
   *segments_start = (grub_macho_addr_t) -1;
f96e0b
   *segments_end = 0;
f96e0b
 
f96e0b
-  grub_macho_cmds_iterate (macho, calcsize, 0, filename);
f96e0b
+  grub_macho_cmds_iterate (macho, calcsize, &ctx, filename);
f96e0b
 
f96e0b
-  if (nr_phdrs == 0)
f96e0b
+  if (ctx.nr_phdrs == 0)
f96e0b
     return grub_error (GRUB_ERR_BAD_OS, "no program headers present");
f96e0b
 
f96e0b
   if (*segments_end < *segments_start)
f96e0b
@@ -249,109 +262,123 @@ SUFFIX (grub_macho_size) (grub_macho_t macho, grub_macho_addr_t *segments_start,
f96e0b
   return GRUB_ERR_NONE;
f96e0b
 }
f96e0b
 
f96e0b
+struct do_load_ctx
f96e0b
+{
f96e0b
+  int flags;
f96e0b
+  char *offset;
f96e0b
+  const char *filename;
f96e0b
+  int *darwin_version;
f96e0b
+};
f96e0b
+
f96e0b
+static int
f96e0b
+do_load(grub_macho_t _macho,
f96e0b
+	struct grub_macho_cmd *hdr0,
f96e0b
+	void *_arg)
f96e0b
+{
f96e0b
+  grub_macho_segment_t *hdr = (grub_macho_segment_t *) hdr0;
f96e0b
+  struct do_load_ctx *ctx = _arg;
f96e0b
+
f96e0b
+  if (hdr->cmd != GRUB_MACHO_CMD_SEGMENT)
f96e0b
+    return 0;
f96e0b
+
f96e0b
+  if (! hdr->filesize && (ctx->flags & GRUB_MACHO_NOBSS))
f96e0b
+    return 0;
f96e0b
+  if (! hdr->vmsize)
f96e0b
+    return 0;
f96e0b
+
f96e0b
+  if (hdr->filesize)
f96e0b
+    {
f96e0b
+      grub_ssize_t read, toread = min (hdr->filesize, hdr->vmsize);
f96e0b
+      if (_macho->uncompressedXX)
f96e0b
+	{
f96e0b
+	  if (hdr->fileoff + (grub_size_t) toread
f96e0b
+	      > _macho->uncompressed_sizeXX)
f96e0b
+	    read = -1;
f96e0b
+	  else
f96e0b
+	    {
f96e0b
+	      read = toread;
f96e0b
+	      grub_memcpy (ctx->offset + hdr->vmaddr,
f96e0b
+			   _macho->uncompressedXX + hdr->fileoff, read);
f96e0b
+	    }
f96e0b
+	}
f96e0b
+      else
f96e0b
+	{
f96e0b
+	  if (grub_file_seek (_macho->file, hdr->fileoff
f96e0b
+			      + _macho->offsetXX) == (grub_off_t) -1)
f96e0b
+	    return 1;
f96e0b
+	  read = grub_file_read (_macho->file, ctx->offset + hdr->vmaddr,
f96e0b
+				 toread);
f96e0b
+	}
f96e0b
+
f96e0b
+      if (read != toread)
f96e0b
+	{
f96e0b
+	  /* XXX How can we free memory from `load_hook'? */
f96e0b
+	  if (!grub_errno)
f96e0b
+	    grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
f96e0b
+			ctx->filename);
f96e0b
+
f96e0b
+	  return 1;
f96e0b
+	}
f96e0b
+      if (ctx->darwin_version)
f96e0b
+	{
f96e0b
+	  const char *ptr = ctx->offset + hdr->vmaddr;
f96e0b
+	  const char *end = ptr + min (hdr->filesize, hdr->vmsize)
f96e0b
+	    - (sizeof ("Darwin Kernel Version ") - 1);
f96e0b
+	  for (; ptr < end; ptr++)
f96e0b
+	    if (grub_memcmp (ptr, "Darwin Kernel Version ",
f96e0b
+			     sizeof ("Darwin Kernel Version ") - 1) == 0)
f96e0b
+	      {
f96e0b
+		ptr += sizeof ("Darwin Kernel Version ") - 1;
f96e0b
+		*ctx->darwin_version = 0;
f96e0b
+		end += (sizeof ("Darwin Kernel Version ") - 1);
f96e0b
+		while (ptr < end && grub_isdigit (*ptr))
f96e0b
+		  *ctx->darwin_version = (*ptr++ - '0') + *ctx->darwin_version * 10;
f96e0b
+		break;
f96e0b
+	      }
f96e0b
+	}
f96e0b
+    }
f96e0b
+
f96e0b
+  if (hdr->filesize < hdr->vmsize)
f96e0b
+    grub_memset (ctx->offset + hdr->vmaddr + hdr->filesize,
f96e0b
+		 0, hdr->vmsize - hdr->filesize);
f96e0b
+  return 0;
f96e0b
+}
f96e0b
+
f96e0b
 /* Load every loadable segment into memory specified by `_load_hook'.  */
f96e0b
 grub_err_t
f96e0b
 SUFFIX (grub_macho_load) (grub_macho_t macho, const char *filename,
f96e0b
 			  char *offset, int flags, int *darwin_version)
f96e0b
 {
f96e0b
-  auto int NESTED_FUNC_ATTR do_load(grub_macho_t _macho,
f96e0b
-			       struct grub_macho_cmd *hdr0,
f96e0b
-			       void *_arg __attribute__ ((unused)));
f96e0b
-  int NESTED_FUNC_ATTR do_load(grub_macho_t _macho,
f96e0b
-			       struct grub_macho_cmd *hdr0,
f96e0b
-			       void *_arg __attribute__ ((unused)))
f96e0b
-  {
f96e0b
-    grub_macho_segment_t *hdr = (grub_macho_segment_t *) hdr0;
f96e0b
-
f96e0b
-    if (hdr->cmd != GRUB_MACHO_CMD_SEGMENT)
f96e0b
-      return 0;
f96e0b
-
f96e0b
-    if (! hdr->filesize && (flags & GRUB_MACHO_NOBSS))
f96e0b
-      return 0;
f96e0b
-    if (! hdr->vmsize)
f96e0b
-      return 0;
f96e0b
-
f96e0b
-    if (hdr->filesize)
f96e0b
-      {
f96e0b
-	grub_ssize_t read, toread = min (hdr->filesize, hdr->vmsize);
f96e0b
-	if (macho->uncompressedXX)
f96e0b
-	  {
f96e0b
-	    if (hdr->fileoff + (grub_size_t) toread
f96e0b
-		> _macho->uncompressed_sizeXX)
f96e0b
-	      read = -1;
f96e0b
-	    else
f96e0b
-	      {
f96e0b
-		read = toread;
f96e0b
-		grub_memcpy (offset + hdr->vmaddr,
f96e0b
-			     _macho->uncompressedXX + hdr->fileoff, read);
f96e0b
-	      }
f96e0b
-	  }
f96e0b
-	else
f96e0b
-	  {
f96e0b
-	    if (grub_file_seek (_macho->file, hdr->fileoff
f96e0b
-				+ _macho->offsetXX) == (grub_off_t) -1)
f96e0b
-	      return 1;
f96e0b
-	    read = grub_file_read (_macho->file, offset + hdr->vmaddr,
f96e0b
-				   toread);
f96e0b
-	  }
f96e0b
-
f96e0b
-	if (read != toread)
f96e0b
-	  {
f96e0b
-	    /* XXX How can we free memory from `load_hook'? */
f96e0b
-	    if (!grub_errno)
f96e0b
-	      grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
f96e0b
-			  filename);
f96e0b
-
f96e0b
-	    return 1;
f96e0b
-	  }
f96e0b
-	if (darwin_version)
f96e0b
-	  {
f96e0b
-	    const char *ptr = offset + hdr->vmaddr;
f96e0b
-	    const char *end = ptr + min (hdr->filesize, hdr->vmsize)
f96e0b
-	      - (sizeof ("Darwin Kernel Version ") - 1);
f96e0b
-	    for (; ptr < end; ptr++)
f96e0b
-	      if (grub_memcmp (ptr, "Darwin Kernel Version ",
f96e0b
-			       sizeof ("Darwin Kernel Version ") - 1) == 0)
f96e0b
-		{
f96e0b
-		  ptr += sizeof ("Darwin Kernel Version ") - 1;
f96e0b
-		  *darwin_version = 0;
f96e0b
-		  end += (sizeof ("Darwin Kernel Version ") - 1);
f96e0b
-		  while (ptr < end && grub_isdigit (*ptr))
f96e0b
-		    *darwin_version = (*ptr++ - '0') + *darwin_version * 10;
f96e0b
-		  break;
f96e0b
-		}
f96e0b
-	  }
f96e0b
-      }
f96e0b
-
f96e0b
-    if (hdr->filesize < hdr->vmsize)
f96e0b
-      grub_memset (offset + hdr->vmaddr + hdr->filesize,
f96e0b
-		   0, hdr->vmsize - hdr->filesize);
f96e0b
-    return 0;
f96e0b
-  }
f96e0b
+  struct do_load_ctx ctx = {
f96e0b
+    .flags = flags,
f96e0b
+    .offset = offset,
f96e0b
+    .filename = filename,
f96e0b
+    .darwin_version = darwin_version
f96e0b
+  };
f96e0b
 
f96e0b
   if (darwin_version)
f96e0b
     *darwin_version = 0;
f96e0b
 
f96e0b
-  grub_macho_cmds_iterate (macho, do_load, 0, filename);
f96e0b
+  grub_macho_cmds_iterate (macho, do_load, &ctx, filename);
f96e0b
 
f96e0b
   return grub_errno;
f96e0b
 }
f96e0b
 
f96e0b
+static int
f96e0b
+find_entry_point (grub_macho_t _macho __attribute__ ((unused)),
f96e0b
+			    struct grub_macho_cmd *hdr,
f96e0b
+			    void *_arg)
f96e0b
+{
f96e0b
+  grub_macho_addr_t *entry_point = _arg;
f96e0b
+  if (hdr->cmd == GRUB_MACHO_CMD_THREAD)
f96e0b
+    *entry_point = ((grub_macho_thread_t *) hdr)->entry_point;
f96e0b
+  return 0;
f96e0b
+}
f96e0b
+
f96e0b
 grub_macho_addr_t
f96e0b
 SUFFIX (grub_macho_get_entry_point) (grub_macho_t macho, const char *filename)
f96e0b
 {
f96e0b
   grub_macho_addr_t entry_point = 0;
f96e0b
-  auto int NESTED_FUNC_ATTR hook(grub_macho_t _macho,
f96e0b
-				 struct grub_macho_cmd *hdr,
f96e0b
-				 void *_arg __attribute__ ((unused)));
f96e0b
-  int NESTED_FUNC_ATTR hook(grub_macho_t _macho __attribute__ ((unused)),
f96e0b
-			    struct grub_macho_cmd *hdr,
f96e0b
-			    void *_arg __attribute__ ((unused)))
f96e0b
-  {
f96e0b
-    if (hdr->cmd == GRUB_MACHO_CMD_THREAD)
f96e0b
-      entry_point = ((grub_macho_thread_t *) hdr)->entry_point;
f96e0b
-    return 0;
f96e0b
-  }
f96e0b
-  grub_macho_cmds_iterate (macho, hook, 0, filename);
f96e0b
+  grub_macho_cmds_iterate (macho, find_entry_point, &entry_point, filename);
f96e0b
   return entry_point;
f96e0b
 }
f96e0b
-- 
f96e0b
1.8.2.1
f96e0b