Index: src/sys/kern/vfs_syscalls.c @@ -69,6 +69,7 @@ __FBSDID("$FreeBSD: src/sys/kern/vfs_sys #include #include #include +#include #ifdef KTRACE #include #endif @@ -1940,19 +1941,26 @@ lseek(td, uap) offset += fp->f_offset; break; case L_XTND: + { + off_t size; + vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_GETATTR(vp, &vattr, cred); VOP_UNLOCK(vp, 0); if (error) break; + size = vattr.va_size; + if (!size && vp->v_type == VCHR && vn_isdisk(vp, NULL)) + fo_ioctl(fp, DIOCGMEDIASIZE, &size, cred, td); if (noneg && - (vattr.va_size > OFF_MAX || - (offset > 0 && vattr.va_size > OFF_MAX - offset))) { + (size > OFF_MAX || + (offset > 0 && size > OFF_MAX - offset))) { error = EOVERFLOW; break; } - offset += vattr.va_size; + offset += size; break; + } case L_SET: break; case SEEK_DATA: