* frame.c (frame_name_fnn_p): Get rid of strtol, which isn't right
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 18 Apr 2011 23:32:38 +0000 (16:32 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 18 Apr 2011 23:32:38 +0000 (16:32 -0700)
here, since it parses constructs like leading '-' and spaces,
which are not wanted; and it overflows with large numbers.
Instead, simply match F[0-9]+, which is what is wanted anyway.

src/ChangeLog
src/frame.c

index 3ca41d7..42c7d06 100644 (file)
@@ -1,5 +1,10 @@
 2011-04-18  Paul Eggert  <eggert@cs.ucla.edu>
 
+       * frame.c (frame_name_fnn_p): Get rid of strtol, which isn't right
+       here, since it parses constructs like leading '-' and spaces,
+       which are not wanted; and it overflows with large numbers.
+       Instead, simply match F[0-9]+, which is what is wanted anyway.
+
        * alloc.c: Remove unportable assumptions about struct layout.
        (SDATA_SELECTOR, SDATA_DATA_OFFSET): New macros.
        (SDATA_OF_STRING, SDATA_SIZE, allocate_string_data):
index 9024a2f..179ae40 100644 (file)
@@ -2154,18 +2154,15 @@ store_in_alist (Lisp_Object *alistptr, Lisp_Object prop, Lisp_Object val)
 static int
 frame_name_fnn_p (char *str, EMACS_INT len)
 {
-  if (len > 1 && str[0] == 'F')
+  if (len > 1 && str[0] == 'F' && '0' <= str[1] && str[1] <= '9')
     {
-      char *end_ptr;
-      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))
+      char *p = str + 2;
+      while ('0' <= *p && *p <= '9')
+       p++;
+      if (p == str + len)
        return 1;
     }
+
   return 0;
 }