|  | @@ -1,7 +1,7 @@
 | 
	
		
			
				|  |  |  /* xsparse - expands compressed sparse file images extracted from GNU tar
 | 
	
		
			
				|  |  |     archives.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   Copyright (C) 2006 Free Software Foundation, Inc.
 | 
	
		
			
				|  |  | +   Copyright (C) 2006, 2007 Free Software Foundation, Inc.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     Written by Sergey Poznyakoff
 | 
	
		
			
				|  |  |     
 | 
	
	
		
			
				|  | @@ -302,15 +302,20 @@ expand_sparse (FILE *sfp, int ofd)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        size_t size = sparse_map[i].numbytes;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      lseek (ofd, sparse_map[i].offset, SEEK_SET);
 | 
	
		
			
				|  |  | -      while (size)
 | 
	
		
			
				|  |  | +      if (size == 0)
 | 
	
		
			
				|  |  | +	ftruncate (ofd, sparse_map[i].offset);
 | 
	
		
			
				|  |  | +      else
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  | -	  size_t rdsize = (size < maxbytes) ? size : maxbytes;
 | 
	
		
			
				|  |  | -	  if (rdsize != fread (buffer, 1, rdsize, sfp))
 | 
	
		
			
				|  |  | -	    die (1, "read error (%d)", errno);
 | 
	
		
			
				|  |  | -	  if (rdsize != write (ofd, buffer, rdsize))
 | 
	
		
			
				|  |  | -	    die (1, "write error (%d)", errno);
 | 
	
		
			
				|  |  | -	  size -= rdsize;
 | 
	
		
			
				|  |  | +	  lseek (ofd, sparse_map[i].offset, SEEK_SET);
 | 
	
		
			
				|  |  | +	  while (size)
 | 
	
		
			
				|  |  | +	    {
 | 
	
		
			
				|  |  | +	      size_t rdsize = (size < maxbytes) ? size : maxbytes;
 | 
	
		
			
				|  |  | +	      if (rdsize != fread (buffer, 1, rdsize, sfp))
 | 
	
		
			
				|  |  | +		die (1, "read error (%d)", errno);
 | 
	
		
			
				|  |  | +	      if (rdsize != write (ofd, buffer, rdsize))
 | 
	
		
			
				|  |  | +		die (1, "write error (%d)", errno);
 | 
	
		
			
				|  |  | +	      size -= rdsize;
 | 
	
		
			
				|  |  | +	    }
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    free (buffer);
 |