From 8dbe053eb02c2165e3240ac3f08706f8502972d8 Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Thu, 25 Feb 2010 12:00:28 -0500 Subject: [PATCH] Use st_size to size the buffer for reading a symbolic link value, instead of using the arbitrary (and sometimes non-existent) PATH_MAX variable. This is part of a fix for building on HURD. SVN-Revision: 1990 --- libarchive/archive_read_disk_entry_from_file.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index 62ac67127..1ae236bfd 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -181,15 +181,26 @@ archive_read_disk_entry_from_file(struct archive *_a, #ifdef HAVE_READLINK if (S_ISLNK(st->st_mode)) { - char linkbuffer[PATH_MAX + 1]; - int lnklen = readlink(path, linkbuffer, PATH_MAX); + size_t linkbuffer_len = st->st_size + 1; + char *linkbuffer; + int lnklen; + + linkbuffer = malloc(linkbuffer_len); + if (linkbuffer == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Couldn't read link data"); + return (ARCHIVE_FAILED); + } + lnklen = readlink(path, linkbuffer, linkbuffer_len); if (lnklen < 0) { archive_set_error(&a->archive, errno, "Couldn't read link data"); + free(linkbuffer); return (ARCHIVE_FAILED); } linkbuffer[lnklen] = 0; archive_entry_set_symlink(entry, linkbuffer); + free(linkbuffer); } #endif -- 2.47.3