* lib/allocator.h, lib/careadlinkat.c: Merge from gnulib.
This commit is contained in:
parent
4008751468
commit
f797625a8c
3 changed files with 16 additions and 5 deletions
|
@ -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'.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue