summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Stoeckmann <tobias@stoeckmann.org>2015-07-12 11:21:46 +0200
committerAndreas Gruenbacher <agruen@gnu.org>2015-07-12 15:38:23 +0200
commit68049159f2dcb9ba99c02acdd4740658bc005a2f (patch)
tree404ccfdb040ac6dd49a691d7567d4bcef41565b1
parent871f87824ae9b6e7aa5379753327e56dc9e509fc (diff)
downloadpatch-68049159f2dcb9ba99c02acdd4740658bc005a2f.tar.gz
Terminate readlink string
The function readlink does not nul terminate its result string. safe_readlink is a wrapper for readlinkat, which has the same behaviour. * src/util.c (copy_file): Therefore, explicitly set '\0' and reserve one byte for it. (agruen: Reserve PATH_MAX + 1 bytes instead of only reading PATH_MAX - 1 characters.)
-rw-r--r--src/util.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/util.c b/src/util.c
index 82a7e37..ee88c13 100644
--- a/src/util.c
+++ b/src/util.c
@@ -610,10 +610,12 @@ copy_file (char const *from, char const *to, struct stat *tost,
if (S_ISLNK (mode))
{
- char *buffer = xmalloc (PATH_MAX);
+ char *buffer = xmalloc (PATH_MAX + 1);
+ ssize_t r;
- if (safe_readlink (from, buffer, PATH_MAX) < 0)
+ if ((r = safe_readlink (from, buffer, PATH_MAX)) < 0)
pfatal ("Can't read %s %s", "symbolic link", from);
+ buffer[r] = '\0';
if (safe_symlink (buffer, to) != 0)
pfatal ("Can't create %s %s", "symbolic link", to);
if (tost && safe_lstat (to, tost) != 0)