48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- procmail-3.22/src/mailfold.c.truncate	2006-03-30 10:56:58.000000000 -0500
 | |
| +++ procmail-3.22/src/mailfold.c	2006-03-30 11:32:19.000000000 -0500
 | |
| @@ -30,6 +30,7 @@
 | |
|  
 | |
|  int logopened,rawnonl;
 | |
|  off_t lasttell;
 | |
| +static int trunced;
 | |
|  static off_t lastdump;
 | |
|  static volatile int mailread;	/* if the mail is completely read in already */
 | |
|  static struct dyna_array confield;		  /* escapes, concatenations */
 | |
| @@ -81,6 +82,7 @@
 | |
|   size_t len;
 | |
|  { int i;size_t part;
 | |
|    lasttell=i= -1;SETerrno(EBADF);
 | |
| +  trunced=0;
 | |
|    if(s>=0)
 | |
|     { if(ft_lock(type)&&(lseek(s,(off_t)0,SEEK_END),fdlock(s)))
 | |
|  	nlog("Kernel-lock failed\n");
 | |
| @@ -120,13 +122,18 @@
 | |
|        }
 | |
|  writefin:
 | |
|       i=type!=ft_PIPE&&fsync(s)&&errno!=EINVAL;	  /* EINVAL => wasn't a file */
 | |
| +     if ((i||len)&&lasttell>=0)
 | |
| +      { int serrno=errno;
 | |
| +	if(!ftruncate(s,lasttell)) trunced=1;
 | |
| +	SETerrno(serrno);
 | |
| +      }
 | |
|       if(ft_lock(type))
 | |
|        { int serrno=errno;		       /* save any error information */
 | |
|  	if(fdunlock())
 | |
|  	   nlog("Kernel-unlock failed\n");
 | |
|  	SETerrno(serrno);
 | |
|        }
 | |
| -     i=rclose(s)||i;
 | |
| +     i=rclose(s)||i; /* if this fails, we should truncate, but it's too late */
 | |
|     }			   /* return an error even if nothing was to be sent */
 | |
|    return i&&!len?-1:len;
 | |
|  }
 | |
| @@ -237,7 +244,7 @@
 | |
|  #endif
 | |
|  	      default:writeerr(buf);
 | |
|  	    }
 | |
| -	   if(lasttell>=0&&!truncate(boxname,lasttell)&&(logopened||verbose))
 | |
| +	   if(lasttell>=0&&trunced&&(logopened||verbose))
 | |
|  	      nlog("Truncated file to former size\n");	    /* undo garbage */
 | |
|  ret0:	   return 0;
 | |
|  	 }
 |