diff -urp procmail-3.22.orig/src/mailfold.c procmail-3.22/src/mailfold.c --- procmail-3.22.orig/src/mailfold.c Tue Sep 11 04:58:34 2001 +++ procmail-3.22/src/mailfold.c Wed Jan 18 12:58:44 2006 @@ -30,6 +30,7 @@ static /*const*/char rcsid[]= int logopened,rawnonl; off_t lasttell; +static int trunced; static long lastdump; static volatile int mailread; /* if the mail is completely read in already */ static struct dyna_array confield; /* escapes, concatenations */ @@ -81,6 +82,7 @@ long dump(s,type,source,len)const int s, long len; { int i;long 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 @@ jin: while(part&&(i=rwrite(s,source,BLKS } 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 @@ dumpf: { switch(errno) #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; }