mp@allegra.UUCP (Mark Plotnick) (02/22/86)
<> Index: bin/mail 4.2BSD Fix Description: /bin/mail tries to create a lock file for only 30 seconds. Since /usr/ucb/Mail can take longer than this to rewrite a mailbox, /bin/mail may append a message to the mailbox only to have it overwritten (or otherwise gotten rid of by the ftruncate that Mail performs) a few seconds (or minutes) later. Repeat-By: Have a large mailbox. Read mail on a loaded machine (fire up a couple of uucico's, troff's, and vlsi simulators to test this out; this will make you popular with the system staff, one way or the other). Edit or delete some messages, and type q. If someone tries to send you mail before the mailbox is completely rewritten, you'll get a biff message and that's the last you'll ever see of the mail. Actually, all is not lost; you can take advantage of the fact that ftruncate doesn't zero out the last partial block of a file (this is documented in the BUGS (4.2BSD) or RESTRICTIONS (Ultrix) section of the man page) and write a program to seek past the end of the file and write a character, then pull the mailbox into an editor and hopefully extract the newly unearthed message. Fix: I also increased the number of times that it will tolerate a disappearing lock file. ../ucb/Mail/lock.c should probably also be fixed in this regard, since it only tries once. RCS file: mail.c,v retrieving revision 1.1 diff -c -r1.1 mail.c *** /tmp/,RCSt1005526 Sat Feb 22 07:09:01 1986 --- mail.c Fri Aug 9 09:03:40 1985 *************** *** 725,731 return(0); } if (stat(curlock, &sbuf) < 0) { ! if (statfailed++ > 5) return(-1); sleep(5); continue; --- 725,731 ----- return(0); } if (stat(curlock, &sbuf) < 0) { ! if (statfailed++ > 200) return(-1); sleep(5); continue; *************** *** 732,738 } statfailed = 0; time(&curtime); ! if (curtime < sbuf.st_ctime + 30) { sleep(5); continue; } --- 732,738 ----- } statfailed = 0; time(&curtime); ! if (curtime < sbuf.st_ctime + 1800) { sleep(5); continue; } Mark Plotnick Society for the Prevention of Mail Bugs allegra!mp