summaryrefslogtreecommitdiff
path: root/lib/areadlinkat-with-size.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2019-07-06 00:40:34 +0200
committerBruno Haible <bruno@clisp.org>2019-07-06 00:40:34 +0200
commit8f91b5cf3514d664289afaace0d6f832b9608f20 (patch)
tree138a2f6c8ae9889da4571cb1422dd59bd5e428c0 /lib/areadlinkat-with-size.c
parenteb76defb19b3cc01e12d77d8cc96d402b9b5097d (diff)
downloadgnulib-8f91b5cf3514d664289afaace0d6f832b9608f20.tar.gz
areadlinkat-with-size: Don't return an excessive memory allocation.
* lib/areadlinkat-with-size.c (areadlinkat_with_size): Shrink the buffer before returning it.
Diffstat (limited to 'lib/areadlinkat-with-size.c')
-rw-r--r--lib/areadlinkat-with-size.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/areadlinkat-with-size.c b/lib/areadlinkat-with-size.c
index ed00b98e4d..5b2bccc4a5 100644
--- a/lib/areadlinkat-with-size.c
+++ b/lib/areadlinkat-with-size.c
@@ -92,6 +92,13 @@ areadlinkat_with_size (int fd, char const *file, size_t size)
if (link_length < buf_size)
{
buffer[link_length] = 0;
+ /* Shrink BUFFER before returning it. */
+ if (link_length + 1 < buf_size)
+ {
+ char *shrinked_buffer = realloc (buffer, link_length + 1);
+ if (shrinked_buffer != NULL)
+ buffer = shrinked_buffer;
+ }
return buffer;
}