]> git.eshelyaron.com Git - emacs.git/commitdiff
* lib/allocator.h, lib/careadlinkat.c: Merge from gnulib.
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 2 Jun 2011 08:22:57 +0000 (01:22 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 2 Jun 2011 08:22:57 +0000 (01:22 -0700)
ChangeLog
lib/allocator.h
lib/careadlinkat.c

index f72f530b480a3768bef35934dbfbedab4178cb62..c0e5329964ee9c96ee8c8d19b18573ea4c72d93d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-06-02  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * lib/allocator.h, lib/careadlinkat.c: Merge from gnulib.
+
 2011-05-30  Paul Eggert  <eggert@cs.ucla.edu>
 
        Use 'inline', not 'INLINE'.
index 953117da83f55609da58fffef4c6b012909bfa89..b8de95c0f50c8d79dbb466ff0ea5e24a3e87b58e 100644 (file)
@@ -45,10 +45,11 @@ struct allocator
   /* Call FREE to free memory, like 'free'.  */
   void (*free) (void *);
 
-  /* If nonnull, call DIE if MALLOC or REALLOC fails.  DIE should not
-     return.  DIE can be used by code that detects memory overflow
-     while calculating sizes to be passed to MALLOC or REALLOC.  */
-  void (*die) (void);
+  /* If nonnull, call DIE (SIZE) if MALLOC (SIZE) or REALLOC (...,
+     SIZE) fails.  DIE should not return.  SIZE should equal SIZE_MAX
+     if size_t overflow was detected while calculating sizes to be
+     passed to MALLOC or REALLOC.  */
+  void (*die) (size_t);
 };
 
 /* An allocator using the stdlib functions and a null DIE function.  */
index e2909c766d5f1969d42b415499f90139e8d9f7aa..6e4aa1395ff06057f4352865248b688d65dc6ccf 100644 (file)
@@ -135,6 +135,7 @@ careadlinkat (int fd, char const *filename,
           if (buf == stack_buf)
             {
               char *b = (char *) alloc->allocate (link_size);
+              buf_size = link_size;
               if (! b)
                 break;
               memcpy (b, buf, link_size);
@@ -158,6 +159,11 @@ careadlinkat (int fd, char const *filename,
         buf_size *= 2;
       else if (buf_size < buf_size_max)
         buf_size = buf_size_max;
+      else if (buf_size_max < SIZE_MAX)
+        {
+          errno = ENAMETOOLONG;
+          return NULL;
+        }
       else
         break;
       buf = (char *) alloc->allocate (buf_size);
@@ -165,7 +171,7 @@ careadlinkat (int fd, char const *filename,
   while (buf);
 
   if (alloc->die)
-    alloc->die ();
+    alloc->die (buf_size);
   errno = ENOMEM;
   return NULL;
 }