procmail/procmail-3.22-truncate.patch
Peter Vrabec 76d7a0dac4 - fix truncation of mailbox when running into a disk quota or a full
partition. Patch from Solar Designer.
2006-03-30 12:13:22 +00:00

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;
}