changeset 112440:b5017c649dfb

Check return values of some library calls.
author Paul Eggert <eggert@cs.ucla.edu>
date Sat, 22 Jan 2011 23:30:19 -0800
parents 11f1b4757236
children 2097405cdc11
files lib-src/ChangeLog lib-src/hexl.c lib-src/make-docfile.c lib-src/movemail.c src/ChangeLog src/emacs.c src/frame.c
diffstat 7 files changed, 41 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/ChangeLog	Sat Jan 22 20:33:12 2011 -0800
+++ b/lib-src/ChangeLog	Sat Jan 22 23:30:19 2011 -0800
@@ -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.
--- a/lib-src/hexl.c	Sat Jan 22 20:33:12 2011 -0800
+++ b/lib-src/hexl.c	Sat Jan 22 23:30:19 2011 -0800
@@ -179,7 +179,9 @@
 
 #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 @@
 		  if (i < 16)
 		    break;
 
-		  fread (buf, 1, 18, fp); /* skip 18 bytes */
+		  /* Skip 18 bytes.  */
+		  if (fread (buf, 1, 18, fp) != 18)
+		    break;
 		}
 	    }
 	}
--- a/lib-src/make-docfile.c	Sat Jan 22 20:33:12 2011 -0800
+++ b/lib-src/make-docfile.c	Sat Jan 22 23:30:19 2011 -0800
@@ -158,7 +158,11 @@
     }
   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 @@
 
 	      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 @@
 		    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;
 		}
 	    }
 
--- a/lib-src/movemail.c	Sat Jan 22 20:33:12 2011 -0800
+++ b/lib-src/movemail.c	Sat Jan 22 23:30:19 2011 -0800
@@ -488,7 +488,8 @@
 #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 */
 
--- a/src/ChangeLog	Sat Jan 22 20:33:12 2011 -0800
+++ b/src/ChangeLog	Sat Jan 22 23:30:19 2011 -0800
@@ -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.
 
--- a/src/emacs.c	Sat Jan 22 20:33:12 2011 -0800
+++ b/src/emacs.c	Sat Jan 22 23:30:19 2011 -0800
@@ -912,13 +912,12 @@
 	  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);
--- a/src/frame.c	Sat Jan 22 20:33:12 2011 -0800
+++ b/src/frame.c	Sat Jan 22 23:30:19 2011 -0800
@@ -23,6 +23,8 @@
 
 #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 @@
   if (len > 1 && str[0] == 'F')
     {
       char *end_ptr;
-
-      strtol (str + 1, &end_ptr, 10);
-
-      if (end_ptr == str + len)
+      long int n;
+      errno = 0;
+      n = strtol (str + 1, &end_ptr, 10);
+
+      if (end_ptr == str + len
+	  && INT_MIN <= n && n <= INT_MAX
+	  && ((LONG_MIN < n && n < LONG_MAX) || errno != ERANGE))
 	return 1;
     }
   return 0;