From: Eric Andersen Date: Mon, 26 Jun 2000 10:54:06 +0000 (-0000) Subject: readlink(2) does not NULL terminate the buffer it reads in, but tar expected it X-Git-Tag: 0_46~94 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=3adffb7fc86ece4a9c8f550abf049a459f1ea1f6;p=oweals%2Fbusybox.git readlink(2) does not NULL terminate the buffer it reads in, but tar expected it to do so. This caused symlinks stored in tarballs to likely have trailing crap in the stored symlink named. Oops. -Erik --- diff --git a/archival/tar.c b/archival/tar.c index 1b783f0f5..836d127e7 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -824,12 +824,15 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *fileName, struct stat *st /* WARNING/NOTICE: I break Hard Links */ if (S_ISLNK(statbuf->st_mode)) { + int link_size=0; char buffer[BUFSIZ]; header.typeflag = SYMTYPE; - if ( readlink(fileName, buffer, sizeof(buffer) - 1) < 0) { + link_size = readlink(fileName, buffer, sizeof(buffer) - 1); + if ( link_size < 0) { errorMsg("Error reading symlink '%s': %s\n", header.name, strerror(errno)); return ( FALSE); } + buffer[link_size] = '\0'; strncpy(header.linkname, buffer, sizeof(header.linkname)); } else if (S_ISDIR(statbuf->st_mode)) { header.typeflag = DIRTYPE; diff --git a/tar.c b/tar.c index 1b783f0f5..836d127e7 100644 --- a/tar.c +++ b/tar.c @@ -824,12 +824,15 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *fileName, struct stat *st /* WARNING/NOTICE: I break Hard Links */ if (S_ISLNK(statbuf->st_mode)) { + int link_size=0; char buffer[BUFSIZ]; header.typeflag = SYMTYPE; - if ( readlink(fileName, buffer, sizeof(buffer) - 1) < 0) { + link_size = readlink(fileName, buffer, sizeof(buffer) - 1); + if ( link_size < 0) { errorMsg("Error reading symlink '%s': %s\n", header.name, strerror(errno)); return ( FALSE); } + buffer[link_size] = '\0'; strncpy(header.linkname, buffer, sizeof(header.linkname)); } else if (S_ISDIR(statbuf->st_mode)) { header.typeflag = DIRTYPE;