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