diff options
author | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2000-06-26 10:54:06 +0000 |
---|---|---|
committer | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2000-06-26 10:54:06 +0000 |
commit | adabb70c1a20ff6c0d1e9dd6e4eee7b321334345 (patch) | |
tree | 7cf083d19187362f06120705328ce2fa56b8a36f /tar.c | |
parent | 79e4e178ae733f43f6f6b914abe9c9f6c7b54ee6 (diff) | |
download | busybox-w32-adabb70c1a20ff6c0d1e9dd6e4eee7b321334345.tar.gz busybox-w32-adabb70c1a20ff6c0d1e9dd6e4eee7b321334345.tar.bz2 busybox-w32-adabb70c1a20ff6c0d1e9dd6e4eee7b321334345.zip |
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
git-svn-id: svn://busybox.net/trunk/busybox@702 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'tar.c')
-rw-r--r-- | tar.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -824,12 +824,15 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *fileName, struct stat *st | |||
824 | 824 | ||
825 | /* WARNING/NOTICE: I break Hard Links */ | 825 | /* WARNING/NOTICE: I break Hard Links */ |
826 | if (S_ISLNK(statbuf->st_mode)) { | 826 | if (S_ISLNK(statbuf->st_mode)) { |
827 | int link_size=0; | ||
827 | char buffer[BUFSIZ]; | 828 | char buffer[BUFSIZ]; |
828 | header.typeflag = SYMTYPE; | 829 | header.typeflag = SYMTYPE; |
829 | if ( readlink(fileName, buffer, sizeof(buffer) - 1) < 0) { | 830 | link_size = readlink(fileName, buffer, sizeof(buffer) - 1); |
831 | if ( link_size < 0) { | ||
830 | errorMsg("Error reading symlink '%s': %s\n", header.name, strerror(errno)); | 832 | errorMsg("Error reading symlink '%s': %s\n", header.name, strerror(errno)); |
831 | return ( FALSE); | 833 | return ( FALSE); |
832 | } | 834 | } |
835 | buffer[link_size] = '\0'; | ||
833 | strncpy(header.linkname, buffer, sizeof(header.linkname)); | 836 | strncpy(header.linkname, buffer, sizeof(header.linkname)); |
834 | } else if (S_ISDIR(statbuf->st_mode)) { | 837 | } else if (S_ISDIR(statbuf->st_mode)) { |
835 | header.typeflag = DIRTYPE; | 838 | header.typeflag = DIRTYPE; |