🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.utils.bug
Article #264

tar 1.10 bug

#264
From: Michael C. Adler
Date: Wed, 29 Jul 1992 20:00
88 lines
3131 bytes
The following diff file for create.c in tar 1.10 fixes two bugs:

1.  Off by 1 error in deciding whether another extended header is needed
    when creating a sparse file caused the last sparse table entry not
    to be emitted.

2.  Long link pathnames were read into too short a buffer causing overwrite.


*** create.c.orig	Mon Jul  1 14:20:22 1991
--- create.c	Wed Jul 29 15:38:31 1992
***************
*** 26,31 ****
--- 26,32 ----
   */
  #include <sys/types.h>
  #include <sys/stat.h>
+ #include <errno.h>
  #include <stdio.h>
  
  #ifndef V7
***************
*** 513,519 ****
  /*			sum += i;
  			if (sum < upperbound)
  				goto extend;*/
! 			if (index_offset+i < upperbound) {
  				index_offset += i;
  				exhdr->ext_hdr.isextended++;
  				goto extend;
--- 514,520 ----
  /*			sum += i;
  			if (sum < upperbound)
  				goto extend;*/
! 			if (index_offset+i <= upperbound) {
  				index_offset += i;
  				exhdr->ext_hdr.isextended++;
  				goto extend;
***************
*** 592,613 ****
  	case S_IFLNK:			/* Symbolic link */
  	{
  		int size;
  
  		hstat.st_size = 0;		/* Force 0 size on symlink */
  		header = start_header(p, &hstat);
  		if (header == NULL) goto badfile;
! 		size = readlink(p, header->header.linkname, NAMSIZ);
  		if (size < 0) goto badperror;
! 		if (size == NAMSIZ) {
! 			char buf[MAXPATHLEN];
  
- 			readlink(p,buf,MAXPATHLEN);
  			/* next_mangle(header->header.linkname); */
  			add_symlink_mangle(buf,p,header->header.linkname);
  			msg("symbolic link %s too long: mangling to
%s",p, header->header.linkname);
  			/* size=strlen(header->header.linkname); */
! 		} else
! 			header->header.linkname[size] = '\0';
  		header->header.linkflag = LF_SYMLINK;
  		finish_header(header);		/* Nothing more to do to it */
  	}
--- 593,615 ----
  	case S_IFLNK:			/* Symbolic link */
  	{
  		int size;
+                 char buf[MAXPATHLEN+1];
  
  		hstat.st_size = 0;		/* Force 0 size on symlink */
  		header = start_header(p, &hstat);
  		if (header == NULL) goto badfile;
! 		size = readlink(p, buf, MAXPATHLEN);
  		if (size < 0) goto badperror;
!                 buf[size] = '\0';
! 		if (size >= NAMSIZ) {
  
  			/* next_mangle(header->header.linkname); */
  			add_symlink_mangle(buf,p,header->header.linkname);
  			msg("symbolic link %s too long: mangling to
%s",p, header->header.linkname);
  			/* size=strlen(header->header.linkname); */
! 		} else {
!                         strncpy(header->header.linkname,buf,NAMSIZ);
!                 }
  		header->header.linkflag = LF_SYMLINK;
  		finish_header(header);		/* Nothing more to do to it */
  	}
Technical Details
Message-ID: <9207292000.AA05547@easynet.crl.dec.com>
Path: arc1-ca.pugleaf.net!sparky!uunet!darwin.sura.net!mips!swrinde!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!vssad.enet.DEc.COM!madler

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!darwin.sura.net!mips!swrinde!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!vssad.enet.DEc.COM!madler
From: madler@vssad.enet.DEc.COM (Michael C. Adler)
Newsgroups: gnu.utils.bug
Subject: tar 1.10 bug
Message-ID: <9207292000.AA05547@easynet.crl.dec.com>
Date: 29 Jul 92 20:00:19 GMT
Sender: gnulists@ai.mit.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 88
Approved: bug-gnu-utils@prep.ai.mit.edu