plistutil: Print error message when opening input/output file fails and plug memory leaks on error
diff --git a/tools/plistutil.c b/tools/plistutil.c
index 7652bdc..a1a8c9c 100644
--- a/tools/plistutil.c
+++ b/tools/plistutil.c
@@ -27,6 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <errno.h>
 
 #ifdef _MSC_VER
 #pragma warning(disable:4996)
@@ -124,14 +125,18 @@
     // read input file
     iplist = fopen(options->in_file, "rb");
     if (!iplist) {
+        printf("ERROR: Could not open input file '%s': %s\n", options->in_file, strerror(errno));
         free(options);
         return 1;
     }
 
-    stat(options->in_file, &filestats);
+    memset(&filestats, '\0', sizeof(struct stat));
+    fstat(fileno(iplist), &filestats);
 
     if (filestats.st_size < 8) {
         printf("ERROR: Input file is too small to contain valid plist data.\n");
+        free(options);
+        fclose(iplist);
         return -1;
     }
 
@@ -159,6 +164,7 @@
         {
             FILE *oplist = fopen(options->out_file, "wb");
             if (!oplist) {
+                printf("ERROR: Could not open output file '%s': %s\n", options->out_file, strerror(errno));
                 free(options);
                 return 1;
             }