Use xmalloc, xcalloc, xasprintf
authorH. Peter Anvin <hpa@zytor.com>
Sun, 6 Jan 2008 04:26:32 +0000 (20:26 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 6 Jan 2008 04:26:32 +0000 (20:26 -0800)
Use xmalloc, xcalloc, xasprintf to handle out of memory errors.

Makefile
linux.c
main.c
wraplinux.h
xmalloc.c [new file with mode: 0644]
xstrdup.c [new file with mode: 0644]

index 013ea3e..94640f6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,7 @@ reloc/reloc.elf: $(RELOC_OBJS) reloc/reloc.ld
 
 reloc.o: reloc.S reloc/reloc.bin 
 
-wraplinux: main.o linux.o reloc.o elf.o nbi.o segment.o
+wraplinux: main.o linux.o reloc.o elf.o nbi.o segment.o xmalloc.o
        $(CC) $(LDFLAGS) -o $@ $^
 
 clean:
diff --git a/linux.c b/linux.c
index 3cc6dbb..dbfcf29 100644 (file)
--- a/linux.c
+++ b/linux.c
@@ -214,13 +214,8 @@ int wrap_kernel(const char *kernel_file, const char *cmdline,
   for (ip = initrd_list; ip; ip = ip->next)
     ninitrd++;
 
-  if (ninitrd) {
-    ird = calloc(ninitrd, sizeof *ird);
-    if (!ird) {
-      fprintf(stderr, "%s: %s\n", program, strerror(errno));
-      goto err;
-    }
-  }
+  if (ninitrd)
+    ird = xcalloc(ninitrd, sizeof *ird);
 
   initrd_len = 0;
   for (ip = initrd_list, i = 0; ip; ip = ip->next, i++) {
@@ -320,7 +315,7 @@ int wrap_kernel(const char *kernel_file, const char *cmdline,
     ird[i].seg.address  = initrd_addr;
     ird[i].seg.sh_type  = SHT_PROGBITS;
     ird[i].seg.sh_flags = SHF_ALLOC;
-    asprintf(&name, "initrd.%d", i);
+    xasprintf(&name, "initrd.%d", i);
     ird[i].seg.name = name;
 
     initrd_addr += ird[i].seg.length;
diff --git a/main.c b/main.c
index 4262d67..a5b0609 100644 (file)
--- a/main.c
+++ b/main.c
@@ -65,7 +65,7 @@ int main(int argc, char *argv[])
       opt.params = optarg;
       break;
     case 'i':
-      ip = malloc(sizeof *ip);
+      ip = xmalloc(sizeof *ip);
       ip->str = optarg;
       ip->next = NULL;
       *irdp = ip;
index 280dd48..e7d00e1 100644 (file)
@@ -13,6 +13,7 @@
 #ifndef WRAPLINUX_H
 #define WRAPLINUX_H
 
+#include <stddef.h>
 #include <stdio.h>
 #include "segment.h"
 
@@ -31,4 +32,9 @@ struct string_list {
 int wrap_kernel(const char *kernel, const char *cmdline,
                const struct string_list *initrd_list, FILE *out);
 
+/* xmalloc.h */
+void *xmalloc(size_t);
+void *xcalloc(size_t, size_t);
+int xasprintf(char **strp, const char *fmt, ...);
+
 #endif
diff --git a/xmalloc.c b/xmalloc.c
new file mode 100644 (file)
index 0000000..bbafe9d
--- /dev/null
+++ b/xmalloc.c
@@ -0,0 +1,55 @@
+/*
+ * xmalloc.c
+ *
+ * Simple error-checking version of malloc()
+ *
+ */
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sysexits.h>
+#include "wraplinux.h"
+
+void *xmalloc(size_t size)
+{
+  void *p = malloc(size);
+
+  if ( !p ) {
+    fprintf(stderr, "%s: %s\n", program, strerror(errno));
+    exit(EX_OSERR);
+  }
+
+  return p;
+}
+
+void *xcalloc(size_t nmemb, size_t size)
+{
+  void *p = calloc(nmemb, size);
+
+  if ( !p ) {
+    fprintf(stderr, "%s: %s\n", program, strerror(errno));
+    exit(EX_OSERR);
+  }
+
+  return p;
+}
+
+int xasprintf(char **strp, const char *fmt, ...)
+{
+  va_list va;
+  int n;
+
+  va_start(va, fmt);
+  n = vasprintf(strp, fmt, va);
+  va_end(va);
+
+  if (n < 0) {
+    fprintf(stderr, "%s: %s\n", program, strerror(errno));
+    exit(EX_OSERR);
+  }
+
+  return n;
+}
diff --git a/xstrdup.c b/xstrdup.c
new file mode 100644 (file)
index 0000000..036b3b2
--- /dev/null
+++ b/xstrdup.c
@@ -0,0 +1,20 @@
+/*
+ * xstrdup.c
+ *
+ * Simple error-checking version of strdup()
+ *
+ */
+
+#include "config.h"
+
+char *xstrdup(const char *s)
+{
+  char *p = strdup(s);
+
+  if ( !p ) {
+    fprintf(stderr, "Out of memory!\n");
+    exit(128);
+  }
+
+  return p;
+}