jonab@sdcrdcf.UUCP (06/28/83)
The program "compact" from UNIX 4.1BSD has a bug that makes it possible for it to loose a file if it receives a signal at the wrong time. It unlinks the original file before it fcloses the compacted file; thus if it is compacting a short file, it is possible to loose both the uncompacted and compacted versions if it receives a signal after it has unlinked but before it has fclosed the compacted file. The process will terminate without flushing the data that is to be written to the compacted file. One is then left with a zero length compacted file. Following is the required patch: change the lines just before the closeboth label: ... if (i >= argc) break; unlink (argv [i]); closeboth : fclose (cfp); ... to read: ... if (i >= argc) break; fclose(cfp); unlink (argv [i]); goto closein; closeboth : fclose (cfp); ... This will make sure the buffer is flushed before it unlinks the original file. Jon Biggar