SunOS 4.1.x kernel
SunOS 4.1.x
A problem was reported to bugtraq showing that unprivileged users can panic the SunOS 4.1.x kernel if an HSFS cdrom is mounted.
The purpose of this advisory is to provide a workaround for this problem. This patch has been successfully tested by a number of people.
Any user can crash the system.
Assuming /cdrom is an hsfs filesystem, execute the following program:
main() { pathconf("/cdrom", 0); }
Obviously do not do this, unless you have the authority to install the fix below.
Two vnodeops in the hsfs_vnodeops struct appear to be left undefined. This fix points them to a real function which then fails the operation in the correct way.
8<------------------------- cut here ------------------------- /* * 8lgm_hsfs.c - SunOS 4.1.x HSFS bugfix. * Copyright (C) 1994 by [8LGM]. * * To use: * cc -c -O -DKERNEL -D8lgm_hsfs.c * modload 8lgm_hsfs.o */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern struct vnodeops hsfs_vnodeops; struct vdldrv vd; int (*old_hsfs_cntl)() = NULL; int (*old_hsfs_realvp)() = NULL; int loaded_8lgm_hsfs = 0; int hsfs_invalid() { return (EINVAL); } int load_8lgm_hsfsfix() { int x; x = splhigh(); old_hsfs_cntl = hsfs_vnodeops.vn_cntl; old_hsfs_realvp = hsfs_vnodeops.vn_realvp; hsfs_vnodeops.vn_cntl = hsfs_invalid; hsfs_vnodeops.vn_realvp = hsfs_invalid; splx(x); return(0); } int unload_8lgm_hsfsfix() { int x; x = splhigh(); hsfs_vnodeops.vn_cntl = old_hsfs_cntl; hsfs_vnodeops.vn_realvp = old_hsfs_realvp; splx(x); return(0); } int xxxinit(function_code, vdp, vdi, vds) unsigned int function_code; struct vddrv *vdp; addr_t vdi; struct vdstat *vds; { bzero(&vd, sizeof(vd)); vd.Drv_magic = VDMAGIC_PSEUDO; vd.Drv_name = "8lgm-hsfs"; switch(function_code) { case VDLOAD: if (loaded_8lgm_hsfs) { log(LOG_INFO, "8lgm: hsfs fix module loaded\n"); return(EEXIST); } vdp->vdd_vdtab = (struct vdlinkage*)&vd; load_8lgm_hsfsfix(); loaded_8lgm_hsfs++; log(LOG_INFO, "8lgm: hsfs fix module loaded\n"); return(0); case VDUNLOAD: return (unload(vdp, vdi)); case VDSTAT: return(0); default: return(EIO); } } static int unload(vdp, vdi) struct vddrv *vdp; struct vdioctl_unload *vdi; { if (loaded_8lgm_hsfs == 0) { log(LOG_INFO, "8lgm: hsfs fix module not loaded!\n"); return(0); } unload_8lgm_hsfsfix(); loaded_8lgm_hsfs = 0; log(LOG_INFO, "8lgm: hsfs fix module unloaded\n"); return(0); } 8<------------------------- cut here -------------------------
majordomo@8lgm.org (Mailing list requests - try 'help' for details)8lgm@8lgm.org (Everything else)
All [8LGM] advisories may be obtained via the [8LGM] fileserver. For details, 'echo help | mail 8lgm-fileserver@8lgm.org'
[8LGM]'s web server can be reached at http://www.8lgm.org. (online only) This contains details of all 8LGM advisories and other useful information.