Merge commit '30dfc1dad4285e7362ce3f596d7c5d5d9b7fb33d'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 12 Jun 2015 20:45:53 +0000 (22:45 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 12 Jun 2015 20:46:10 +0000 (22:46 +0200)
* commit '30dfc1dad4285e7362ce3f596d7c5d5d9b7fb33d':
  cws2fws: Close file handles on error

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
tools/cws2fws.c

diff --combined tools/cws2fws.c
@@@ -22,7 -22,7 +22,7 @@@
  #ifdef DEBUG
  #define dbgprintf printf
  #else
 -#define dbgprintf(...)
 +#define dbgprintf(...) do { if (0) printf(__VA_ARGS__); } while (0)
  #endif
  
  int main(int argc, char *argv[])
@@@ -31,6 -31,7 +31,7 @@@
      char buf_in[1024], buf_out[65536];
      z_stream zstream;
      struct stat statbuf;
+     int ret = 1;
  
      if (argc < 3) {
          printf("Usage: %s <infile.swf> <outfile.swf>\n", argv[0]);
  
      if (read(fd_in, &buf_in, 8) != 8) {
          printf("Header error\n");
-         close(fd_in);
-         close(fd_out);
-         return 1;
+         goto out;
      }
  
      if (buf_in[0] != 'C' || buf_in[1] != 'W' || buf_in[2] != 'S') {
          printf("Not a compressed flash file\n");
-         return 1;
+         goto out;
      }
  
 -    fstat(fd_in, &statbuf);
 +    if (fstat(fd_in, &statbuf) < 0) {
 +        perror("fstat failed");
 +        return 1;
 +    }
      comp_len   = statbuf.st_size;
      uncomp_len = buf_in[4] | (buf_in[5] << 8) | (buf_in[6] << 16) | (buf_in[7] << 24);
  
      buf_in[0] = 'F';
      if (write(fd_out, &buf_in, 8) < 8) {
          perror("Error writing output file");
-         return 1;
+         goto out;
      }
  
      zstream.zalloc = NULL;
      zstream.zfree  = NULL;
      zstream.opaque = NULL;
 -    inflateInit(&zstream);
 +    if (inflateInit(&zstream) != Z_OK) {
 +        fprintf(stderr, "inflateInit failed\n");
 +        return 1;
 +    }
  
      for (i = 0; i < comp_len - 8;) {
          int ret, len = read(fd_in, &buf_in, 1024);
          if (ret != Z_STREAM_END && ret != Z_OK) {
              printf("Error while decompressing: %d\n", ret);
              inflateEnd(&zstream);
-             return 1;
+             goto out;
          }
  
          dbgprintf("a_in: %d t_in: %lu a_out: %d t_out: %lu -- %lu out\n",
          if (write(fd_out, &buf_out, zstream.total_out - last_out) <
              zstream.total_out - last_out) {
              perror("Error writing output file");
-             return 1;
+             inflateEnd(&zstream);
+             goto out;
          }
  
          i += len;
          buf_in[2] = ((zstream.total_out + 8) >> 16) & 0xff;
          buf_in[3] = ((zstream.total_out + 8) >> 24) & 0xff;
  
 -        lseek(fd_out, 4, SEEK_SET);
 -        if (write(fd_out, &buf_in, 4) < 4) {
 +        if (   lseek(fd_out, 4, SEEK_SET) < 0
 +            || write(fd_out, &buf_in, 4) < 4) {
              perror("Error writing output file");
-             return 1;
+             inflateEnd(&zstream);
+             goto out;
          }
      }
  
+     ret = 0;
      inflateEnd(&zstream);
+ out:
      close(fd_in);
      close(fd_out);
-     return 0;
+     return ret;
  }