diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2021-12-01 17:25:36 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2021-12-01 17:25:36 +0000 |
commit | 55b69e2901555a3283cdedab04acbc4ce5c863a4 (patch) | |
tree | e8a61f471a6d8d4f5769e267c4f5fb8997a0f645 /sys/lib | |
parent | 39d8b71521756796bfca4516253686c7eb93cf75 (diff) |
Fix booting from an IDE block device on the Sun Blade 100. Apparently
writing to disk using the Open Firmware interfaces is buggy and causes
corruption of the disk. While it isn't entirely clear what versions
of Open Firmware are affected, but it seems to only affect IDE drives.
So if we detect an IDE drive, disable writing to it. This results in
a small lose of bootloader functionality (bsd.upgrade loop prevention
and flagging /etc/random.seed re-use) but that is better than losing
the ability to run OpenBSD at all.
Based on a diff by Ted Bullock (who did all the hard work of debugging
this and coming up with a viable fix).
ok deraadt@
Diffstat (limited to 'sys/lib')
-rw-r--r-- | sys/lib/libsa/fchmod.c | 7 | ||||
-rw-r--r-- | sys/lib/libsa/stand.h | 11 |
2 files changed, 12 insertions, 6 deletions
diff --git a/sys/lib/libsa/fchmod.c b/sys/lib/libsa/fchmod.c index 7d9bc9cac36..f6252ca9e56 100644 --- a/sys/lib/libsa/fchmod.c +++ b/sys/lib/libsa/fchmod.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fchmod.c,v 1.1 2019/08/03 15:22:17 deraadt Exp $ */ +/* $OpenBSD: fchmod.c,v 1.2 2021/12/01 17:25:35 kettenis Exp $ */ /* $NetBSD: stat.c,v 1.3 1994/10/26 05:45:07 cgd Exp $ */ /*- @@ -53,6 +53,11 @@ fchmod(int fd, mode_t m) errno = EOPNOTSUPP; return (-1); } + /* writing is broken or unsupported */ + if (f->f_flags & F_NOWRITE) { + errno = EOPNOTSUPP; + return (-1); + } errno = (f->f_ops->fchmod)(f, m); return (0); diff --git a/sys/lib/libsa/stand.h b/sys/lib/libsa/stand.h index 9720fe6b1c4..cad63ea389a 100644 --- a/sys/lib/libsa/stand.h +++ b/sys/lib/libsa/stand.h @@ -1,4 +1,4 @@ -/* $OpenBSD: stand.h,v 1.71 2021/10/24 17:49:19 deraadt Exp $ */ +/* $OpenBSD: stand.h,v 1.72 2021/12/01 17:25:35 kettenis Exp $ */ /* $NetBSD: stand.h,v 1.18 1996/11/30 04:35:51 gwr Exp $ */ /*- @@ -107,10 +107,11 @@ struct open_file { extern struct open_file files[]; /* f_flags values */ -#define F_READ 0x0001 /* file opened for reading */ -#define F_WRITE 0x0002 /* file opened for writing */ -#define F_RAW 0x0004 /* raw device open - no file system */ -#define F_NODEV 0x0008 /* network open - no device */ +#define F_READ 0x0001 /* file opened for reading */ +#define F_WRITE 0x0002 /* file opened for writing */ +#define F_RAW 0x0004 /* raw device open - no file system */ +#define F_NODEV 0x0008 /* network open - no device */ +#define F_NOWRITE 0x0010 /* bootblock writing broken or unsupported */ #define isupper(c) ((c) >= 'A' && (c) <= 'Z') #define islower(c) ((c) >= 'a' && (c) <= 'z') |