dmesg: free memory even when exiting with an error.

Change-Id: Ib137d32539741bc2638f91427efea62f884b46c8
diff --git a/dmesg.c b/dmesg.c
index 4086ecb..788b058 100644
--- a/dmesg.c
+++ b/dmesg.c
@@ -21,17 +21,17 @@
     char *buffer;
     char *p;
     ssize_t ret;
-    int n, op, bufsize;
+    int n, op, bufsize, err = EXIT_FAILURE;
 
     bufsize = klogctl(KLOG_SIZE_BUFFER, NULL, 0);
     if (bufsize <= 0) {
         perror("klogctl size_buffer");
-        return EXIT_FAILURE;
+        goto done;
     }
     buffer = malloc(bufsize);
     if (!buffer) {
         perror("malloc");
-        return EXIT_FAILURE;
+        goto done;
     }
     buffer[0] = 0;
 
@@ -44,7 +44,7 @@
     n = klogctl(op, buffer, bufsize);
     if (n < 0) {
         perror("klogctl");
-        return EXIT_FAILURE;
+        goto done_free;
     }
     buffer[n] = '\0';
 
@@ -54,11 +54,14 @@
 	    if (errno == EINTR)
                 continue;
 	    perror("write");
-	    return EXIT_FAILURE;
+	    goto done_free;
 	}
 	p += ret;
 	n -= ret;
     }
+    err = 0;
+done_free:
     free(buffer);
-    return 0;
+done:
+    return err;
 }