The size is usually taken from st_size, which can be zero,
resulting in inefficient operation as seen with:
$ strace -e readlink stat -c %N /proc/$$/cwd
readlink("/proc/9036/cwd", "/", 1) = 1
readlink("/proc/9036/cwd", "/h", 2) = 2
readlink("/proc/9036/cwd", "/hom", 4) = 4
readlink("/proc/9036/cwd", "/home/pa", 8) = 8
readlink("/proc/9036/cwd", "/home/padraig", 16) = 13
Instead let zero select an initial memory allocation
of 128 bytes, which most symlinks fit within.
* lib/areadlink-with-size.c (areadlink_with_size):
Start with a 128 byte buffer, for SIZE == 0.
* lib/areadlinkat-with-size.c (areadlinkat_with_size): Likewise.
+2019-07-06 Pádraig Brady <P@draigBrady.com>
+
+ areadlink-with-size: guess a buffer size with 0 size
+ The size is usually taken from st_size, which can be zero,
+ resulting in inefficient operation.
+ Instead let zero select an initial memory allocation
+ of 128 bytes, which most symlinks fit within.
+ * lib/areadlink-with-size.c (areadlink_with_size):
+ Start with a 128 byte buffer, for SIZE == 0.
+ * lib/areadlinkat-with-size.c (areadlinkat_with_size): Likewise.
+
2019-07-06 Konstantin Kharlamov <Hi-Angel@yandex.ru>
Replace manually crafted hex regexes with [:xdigit:]
: INITIAL_LIMIT_BOUND);
/* The initial buffer size for the link value. */
- size_t buf_size = size < initial_limit ? size + 1 : initial_limit;
+ size_t buf_size = (size == 0 ? 128
+ : size < initial_limit ? size + 1 : initial_limit);
while (1)
{
: INITIAL_LIMIT_BOUND);
/* The initial buffer size for the link value. */
- size_t buf_size = size < initial_limit ? size + 1 : initial_limit;
+ size_t buf_size = (size == 0 ? 128
+ : size < initial_limit ? size + 1 : initial_limit);
while (1)
{