Subject: using ftruncate(2) to extend file panics kernel (#332) Index: sys/ufs_inode.c 2.11BSD Description: ftruncate(2) can, beginning with update #331, extend a file as well as shrink a file. Alas a bug was introduced in the file extension code. Using ftruncate(2) to extend a file can panic the system. Repeat-By: Run quotacheck(8). quotacheck(8) issues a ftruncate(2) against the quota file in order to set the size - if this results in the file needing to grow then a kernel panic _may_ result. Fix: Rather than repackage #331 this is being issued separately. The problem is twofold: an unnecessary 'bdwrite(bp)' call and 'bp' being uninitialized. The 'bdwrite' being issued during a file extension is completely unnecessary because "bmap()" has already allocated and written the required block (clearing the buffer first if necessary). The panic may or may not happen depending on the uninitialized content of 'bp' on the stack. Cut where indicated, saving to a file (/tmp/332) and then: patch -p0 < /tmp/332 cd /sys/YOUR_KERNEL make mv /unix /ounix mv /netnix /onetnix mv unix netnix / chmod 744 /unix /netnix make clean reboot It's a good idea (especially with a bug like this) to update the GENERIC kernel as well and keep it installed in /genunix: cd /sys/GENERIC make mv unix /genunix chmod 744 /genunix make clean The "make clean" commands are *optional*. While keeping objects around shortens kernel build times there is a risk of dependencies (especially with options specified by '-D' lines in the Makefile) not being detected and corrupt kernels being built in the future. This and previous updates are available via anonymous FTP to either FTP.IIPO.GTEGSC.COM or MOE.2BSD.COM in the directory /pub/2.11BSD --------------------------cut here----------------------- *** /sys/sys/ufs_inode.c.old Sat Sep 28 20:39:29 1996 --- /sys/sys/ufs_inode.c Mon Sep 30 13:25:45 1996 *************** *** 3,9 **** * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * ! * @(#)ufs_inode.c 1.5 (2.11BSD GTE) 1996/9/19 */ #include "param.h" --- 3,9 ---- * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * ! * @(#)ufs_inode.c 1.6 (2.11BSD GTE) 1996/9/30 */ #include "param.h" *************** *** 474,480 **** bytesreleased = oip->i_size - length; #endif oip->i_size = length; - bdwrite(bp); goto doquotaupd; } --- 474,479 ---- *** /VERSION.old Sat Sep 28 20:40:03 1996 --- /VERSION Mon Sep 30 13:24:16 1996 *************** *** 1,4 **** ! Current Patch Level: 331 2.11 BSD ============ --- 1,4 ---- ! Current Patch Level: 332 2.11 BSD ============