diff --git a/README.txt b/README.txt
index 289f2c0..cec2ae9 100644
--- a/README.txt
+++ b/README.txt
@@ -29,10 +29,11 @@
 
 This is the output of "pngcrush" and "pngcrush -help":
 
- | pngcrush 1.3.2, Copyright (C) 1998, 1999, Glenn Randers-Pehrson
+
+ | pngcrush 1.3.4, Copyright (C) 1998, 1999, 2000, Glenn Randers-Pehrson
  | This is a free, open-source program.  Permission is
  | granted to everyone to use pngcrush without fee.
- | This program was built with libpng version 1.0.5k,
+ | This program was built with libpng version 1.0.5m,
  |    Copyright (C) 1995, Guy Eric Schalnat, Group 42 Inc.,
  |    Copyright (C) 1996, 1997 Andreas Dilger,
  |    Copyright (C) 1998, 1999, Glenn Randers-Pehrson,
@@ -45,15 +46,15 @@
        pngcrush -d dir [other options] files.png ...
 
 options:
-        -brute (Use brute-force, try 114 different methods)
+        -brute (Use brute-force, try 114 different methods [11-124])
             -c color_type of output file [0, 2, 4, or 6]
             -d directory_name (where output files will go)
  -double_gamma (used for fixing gamma in PhotoShop 5.0/5.02 files)
             -e extension  (used for creating output filename)
             -f user_filter [0-5]
         -force (Write a new output file even if larger than input)
-            -g gamma_value (float, e.g., 0.45455)
-          -itxt b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
+            -g gamma (float or fixed*100000, e.g., 0.45455 or 45455)
+         -itxt b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
             -l zlib_compression_level [0-9]
             -m method [0 through 200]
           -max maximum_IDAT_size [1 through 524288]
@@ -66,14 +67,14 @@
          -srgb [0, 1, 2, or 3]
          -text b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
          -trns index red green blue gray
-      -verbose (write more detailed information)
+            -v (display more detailed information)
+      -version (display the pngcrush version)
             -w compression_window_size [32, 16, 8, 4, 2, 1, 512]
             -h (help)
             -p (pause)
 
-
 options:
-        -brute (Use brute-force, try 114 different methods)
+        -brute (Use brute-force, try 114 different methods [11-124])
 
                Very time-consuming and generally not worthwhile.
                You can restrict this option to certain filter types,
@@ -120,13 +121,13 @@
                if it is smaller than any generated file and no chunk
                additions, removals, or changes were requested.
 
-            -g gamma_value (float, e.g., 0.45455)
+            -g gamma (float or fixed*100000, e.g., 0.45455 or 45455)
 
                Value to insert in gAMA chunk, only if the input
                file has no gAMA chunk.  To replace an existing
                gAMA chunk, use the '-replace_gamma' option.
 
-          -itxt b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
+         -itxt b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
 
                Compressed iTXt chunk to insert (see -text).
 
@@ -199,10 +200,12 @@
                You must give all five parameters regardless of the
                color type, scaled to the output bit depth.
 
-      -verbose (write more detailed information)
+            -v (display more detailed information)
 
                Repeat the option (use "-v -v") for even more.
 
+      -version (display the pngcrush version)
+
             -w compression_window_size [32, 16, 8, 4, 2, 1, 512]
 
                Size of the sliding compression window, in kbytes
@@ -216,7 +219,7 @@
                zlib compression strategy to use with the preceding
                '-m method' argument.
 
-         -zitxt b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
+        -zitxt b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
 
                Compressed iTXt chunk to insert (see -text).
 
diff --git a/pngcrush.c b/pngcrush.c
index 8a9f97d..c55a637 100644
--- a/pngcrush.c
+++ b/pngcrush.c
@@ -15,12 +15,12 @@
  * occasionally creating Linux executables.
  */
 
-#define PNGCRUSH_VERSION "1.3.3"
+#define PNGCRUSH_VERSION "1.3.4"
 
 /*
  * COPYRIGHT NOTICE, DISCLAIMER, AND LICENSE:
  *
- * Copyright (c) 1998, 1999, Glenn Randers-Pehrson (randeg@alum.rpi.edu)
+ * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson (randeg@alum.rpi.edu)
  *
  * The pngcrush program is supplied "AS IS".  The Author disclaims all
  * warranties, expressed or implied, including, without limitation, the
@@ -54,6 +54,10 @@
  *
  * Change log:
  *
+ * Version 1.3.4 (built with libpng-1.0.5m)
+ *
+ *   Do not allow pngcrush to overwrite the input file.
+ *
  * Version 1.3.3 (built with libpng-1.0.5m)
  *
  *   Restored ability to enter gamma as a float even when floating point
@@ -175,6 +179,9 @@
 static PNG_CONST char *progname = "pngtest.png";
 static PNG_CONST char *inname = "pngtest.png";
 static PNG_CONST char *outname = "pngout.png";
+#if 0
+static PNG_CONST char *tmpname = "pngtmp.png";
+#endif
 static PNG_CONST char *directory_name = "pngcrush.bak";
 static PNG_CONST char *extension = "_C.png";
 
@@ -527,6 +534,9 @@
    png_fixed_point file_gamma=0;
 #endif
    char *cp;
+#if 0
+   FILE *tmpfile (void);
+#endif
 
    int i;
    row_buf = (png_bytep)NULL;
@@ -992,7 +1002,7 @@
    if(verbose > 0)
    {
       fprintf(STDERR, 
-        "\n | %s %s, Copyright (C) 1998, 1999, Glenn Randers-Pehrson\n",
+        "\n | %s %s, Copyright (C) 1998, 1999, 2000 Glenn Randers-Pehrson\n",
         progname, PNGCRUSH_VERSION);
       fprintf(STDERR, " | This is a free, open-source program.  Permission is\n");
       fprintf(STDERR, " | granted to everyone to use pngcrush without fee.\n");
@@ -1004,7 +1014,7 @@
       fprintf(STDERR,
         " |    Copyright (C) 1996, 1997 Andreas Dilger,\n");
       fprintf(STDERR,
-        " |    Copyright (C) 1998, 1999, Glenn Randers-Pehrson,\n");
+        " |    Copyright (C) 1998, 1999, 2000 Glenn Randers-Pehrson,\n");
       fprintf(STDERR, 
         " | and zlib version %s, Copyright (c) 1998,\n",
             ZLIB_VERSION);
@@ -1531,6 +1541,7 @@
          if(idat_length[best] == idat_length[0] && things_have_changed == 0
             && best != final_method && nosave == 0)
          {
+            struct stat stat_in, stat_out;
             /* just copy input to output */
 
             if(verbose > 2)
@@ -1542,6 +1553,7 @@
                fprintf(STDERR, "Could not find input file %s\n", inname);
                return 1;
             }
+
             number_of_open_files++;
             if ((fpout = FOPEN(outname, "wb")) == NULL)
             {
@@ -1549,18 +1561,25 @@
                FCLOSE(fpin);
                return 1;
             }
+
             number_of_open_files++;
             if(verbose > 2)
                printf("copying input to output...");
-            for(;;)
+
+            stat(inname, &stat_in);
+            stat(outname, &stat_out);
+            if(stat_in.st_ino != stat_out.st_ino)
             {
-               png_size_t num_in;
+               for(;;)
+               {
+                  png_size_t num_in;
 
-               num_in = fread(buffer, 1, 1, fpin);
-               if (!num_in)
-                  break;
-               fwrite(buffer, 1, 1, fpout);
+                  num_in = fread(buffer, 1, 1, fpin);
+                  if (!num_in)
+                     break;
+                  fwrite(buffer, 1, 1, fpout);
 
+               }
             }
             if(verbose > 2)
                printf("copy complete.\n");
@@ -1618,12 +1637,23 @@
       number_of_open_files++;
       if(nosave == 0)
        {
+         struct stat stat_in, stat_out;
+         stat(inname, &stat_in);
+         stat(outname, &stat_out);
+         if(stat_in.st_ino == stat_out.st_ino)
+         {
+            fprintf(STDERR, "Cannot overwrite input file %s\n", inname);
+            FCLOSE(fpin);
+            return 1;
+         }
+
          if ((fpout = FOPEN(outname, "wb")) == NULL)
          {
             fprintf(STDERR, "Could not open output file %s\n", outname);
             FCLOSE(fpin);
             return 1;
          }
+
          number_of_open_files++;
         }
 
