* lib/allocator.h, lib/careadlinkat.c: Merge from gnulib.

This commit is contained in:
Paul Eggert 2011-06-02 01:22:57 -07:00
parent 4008751468
commit f797625a8c
3 changed files with 16 additions and 5 deletions

View file

@ -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'.

View 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. */

View 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;
}