Check return values of some library calls.
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 23 Jan 2011 07:30:19 +0000 (23:30 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 23 Jan 2011 07:30:19 +0000 (23:30 -0800)
lib-src/ChangeLog
lib-src/hexl.c
lib-src/make-docfile.c
lib-src/movemail.c
src/ChangeLog
src/emacs.c
src/frame.c

index 232bb38..74509f4 100644 (file)
@@ -1,3 +1,11 @@
+2011-01-23  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Check return values of some library calls.
+       * hexl.c (main): Check fread result.
+       * make-docfile.c (main): Check chdir result.
+       (scan_c_file): Check fscanf result.
+       * movemail.c (main): Check ftruncate result.
+
 2011-01-17  Paul Eggert  <eggert@cs.ucla.edu>
 
        Include <unistd.h> unilaterally.
index aa5b370..e0a5166 100644 (file)
@@ -179,7 +179,9 @@ main (int argc, char **argv)
 
 #define hexchar(x) (isdigit (x) ? x - '0' : x - 'a' + 10)
 
-             fread (buf, 1, 10, fp); /* skip 10 bytes */
+             /* Skip 10 bytes.  */
+             if (fread (buf, 1, 10, fp) != 10)
+               break;
 
              for (i=0; i < 16; ++i)
                {
@@ -207,7 +209,9 @@ main (int argc, char **argv)
                  if (i < 16)
                    break;
 
-                 fread (buf, 1, 18, fp); /* skip 18 bytes */
+                 /* Skip 18 bytes.  */
+                 if (fread (buf, 1, 18, fp) != 18)
+                   break;
                }
            }
        }
index 4260e4c..b6fccfa 100644 (file)
@@ -158,7 +158,11 @@ main (int argc, char **argv)
     }
   if (argc > i + 1 && !strcmp (argv[i], "-d"))
     {
-      chdir (argv[i + 1]);
+      if (chdir (argv[i + 1]) != 0)
+       {
+         perror (argv[i + 1]);
+         return EXIT_FAILURE;
+       }
       i += 2;
     }
 
@@ -648,6 +652,7 @@ scan_c_file (char *filename, const char *mode)
 
              if (defunflag && (commas == 1 || commas == 2))
                {
+                 int scanned = 0;
                  do
                    c = getc (infile);
                  while (c == ' ' || c == '\n' || c == '\r' || c == '\t');
@@ -655,12 +660,14 @@ scan_c_file (char *filename, const char *mode)
                    goto eof;
                  ungetc (c, infile);
                  if (commas == 2) /* pick up minargs */
-                   fscanf (infile, "%d", &minargs);
+                   scanned = fscanf (infile, "%d", &minargs);
                  else /* pick up maxargs */
                    if (c == 'M' || c == 'U') /* MANY || UNEVALLED */
                      maxargs = -1;
                    else
-                     fscanf (infile, "%d", &maxargs);
+                     scanned = fscanf (infile, "%d", &maxargs);
+                 if (scanned < 0)
+                   goto eof;
                }
            }
 
index b127c85..f492188 100644 (file)
@@ -488,7 +488,8 @@ main (int argc, char **argv)
 #ifdef MAIL_USE_SYSTEM_LOCK
       if (! preserve_mail)
        {
-         ftruncate (indesc, 0L);
+         if (ftruncate (indesc, 0L) != 0)
+           pfatal_with_name (inname);
        }
 #endif /* MAIL_USE_SYSTEM_LOCK */
 
index 2e9e80d..c717b3f 100644 (file)
@@ -1,5 +1,10 @@
 2011-01-23  Paul Eggert  <eggert@cs.ucla.edu>
 
+       Check return values of some library calls.
+       * emacs.c (main): Check dup result.
+       * frame.c: Include <limits.h>, for INT_MIN and INT_MAX.
+       (frame_name_fnn_p): Check strtol result.
+
        * image.c (x_create_bitmap_from_xpm_data): Add cast to fix type clash
        when calling XpmCreatePixmapFromData.
 
index 70dd76d..9e9989e 100644 (file)
@@ -912,13 +912,12 @@ main (int argc, char **argv)
          emacs_close (0);
          emacs_close (1);
          result = emacs_open (term, O_RDWR, 0);
-         if (result < 0)
+         if (result < 0 || dup (0) < 0)
            {
              char *errstring = strerror (errno);
              fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
              exit (1);
            }
-         dup (0);
          if (! isatty (0))
            {
              fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
index 5cbdcf1..e663538 100644 (file)
@@ -23,6 +23,8 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <stdio.h>
 #include <ctype.h>
+#include <errno.h>
+#include <limits.h>
 #include <setjmp.h>
 #include "lisp.h"
 #include "character.h"
@@ -2149,10 +2151,13 @@ frame_name_fnn_p (char *str, EMACS_INT len)
   if (len > 1 && str[0] == 'F')
     {
       char *end_ptr;
+      long int n;
+      errno = 0;
+      n = strtol (str + 1, &end_ptr, 10);
 
-      strtol (str + 1, &end_ptr, 10);
-
-      if (end_ptr == str + len)
+      if (end_ptr == str + len
+         && INT_MIN <= n && n <= INT_MAX
+         && ((LONG_MIN < n && n < LONG_MAX) || errno != ERANGE))
        return 1;
     }
   return 0;