projects
/
gnulib.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Tests for module 'integer_length_ll'.
[gnulib.git]
/
lib
/
careadlinkat.c
diff --git
a/lib/careadlinkat.c
b/lib/careadlinkat.c
index
5f0d43c
..
751578b
100644
(file)
--- a/
lib/careadlinkat.c
+++ b/
lib/careadlinkat.c
@@
-18,13
+18,10
@@
/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
-#define _GL_USE_STDLIB_ALLOC 1
#include <config.h>
#include "careadlinkat.h"
#include <config.h>
#include "careadlinkat.h"
-#include "allocator.h"
-
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
@@
-40,23
+37,21
@@
# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
#endif
# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
#endif
-#if ! HAVE_READLINKAT
-/* Ignore FD. Get the symbolic link value of FILENAME and put it into
- BUFFER, with size BUFFER_SIZE. This function acts like readlink
- but has readlinkat's signature. */
+#include "allocator.h"
+
+/* Get the symbolic link value of FILENAME and put it into BUFFER, with
+ size BUFFER_SIZE. This function acts like readlink but has
+ readlinkat's signature. */
ssize_t
careadlinkatcwd (int fd, char const *filename, char *buffer,
size_t buffer_size)
{
ssize_t
careadlinkatcwd (int fd, char const *filename, char *buffer,
size_t buffer_size)
{
- (void) fd;
+ /* FD must be AT_FDCWD here, otherwise the caller is using this
+ function in contexts for which it was not meant for. */
+ if (fd != AT_FDCWD)
+ abort ();
return readlink (filename, buffer, buffer_size);
}
return readlink (filename, buffer, buffer_size);
}
-#endif
-
-/* A standard allocator. For now, only careadlinkat needs this, but
- perhaps it should be moved to the allocator module. */
-static struct allocator const standard_allocator =
- { malloc, realloc, free, NULL };
/* Assuming the current directory is FD, get the symbolic link value
of FILENAME as a null-terminated string and put it into a buffer.
/* Assuming the current directory is FD, get the symbolic link value
of FILENAME as a null-terminated string and put it into a buffer.
@@
-72,7
+67,10
@@
static struct allocator const standard_allocator =
the returned value if it is nonnull and is not BUFFER. A null
ALLOC stands for the standard allocator.
the returned value if it is nonnull and is not BUFFER. A null
ALLOC stands for the standard allocator.
- The PREADLINKAT function specifies how to read links.
+ The PREADLINKAT function specifies how to read links. It operates
+ like POSIX readlinkat()
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>
+ but can assume that its first argument is the same as FD.
If successful, return the buffer address; otherwise return NULL and
set errno. */
If successful, return the buffer address; otherwise return NULL and
set errno. */
@@
-90,7
+88,7
@@
careadlinkat (int fd, char const *filename,
char stack_buf[1024];
if (! alloc)
char stack_buf[1024];
if (! alloc)
- alloc = &st
andard
_allocator;
+ alloc = &st
dlib
_allocator;
if (! buffer_size)
{
if (! buffer_size)
{
@@
-135,6
+133,7
@@
careadlinkat (int fd, char const *filename,
if (buf == stack_buf)
{
char *b = (char *) alloc->allocate (link_size);
if (buf == stack_buf)
{
char *b = (char *) alloc->allocate (link_size);
+ buf_size = link_size;
if (! b)
break;
memcpy (b, buf, link_size);
if (! b)
break;
memcpy (b, buf, link_size);
@@
-158,6
+157,11
@@
careadlinkat (int fd, char const *filename,
buf_size *= 2;
else if (buf_size < buf_size_max)
buf_size = buf_size_max;
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);
else
break;
buf = (char *) alloc->allocate (buf_size);
@@
-165,7
+169,7
@@
careadlinkat (int fd, char const *filename,
while (buf);
if (alloc->die)
while (buf);
if (alloc->die)
- alloc->die ();
+ alloc->die (
buf_size
);
errno = ENOMEM;
return NULL;
}
errno = ENOMEM;
return NULL;
}