From 3434d35a64736f0b77a12f61784c2caa33ac44cf Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Sat, 28 Nov 2020 22:09:23 +0100 Subject: [PATCH] Cygwin: Fix access to block devices below /proc/sys. Use fhandler_dev_floppy instead of fhandler_procsys for such devices. The read()/write() functions from fhandler_procsys do not ensure sector aligned transfers and lseek() fails always. Signed-off-by: Christian Franke --- winsup/cygwin/path.cc | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 4f5f03a76..7e6243d32 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -863,19 +863,28 @@ path_conv::check (const char *src, unsigned opt, dev.parse (FH_FS); goto is_fs_via_procsys; case virt_blk: - /* Block special device. If the trailing slash has been - requested, the target is the root directory of the - filesystem on this block device. So we convert this - to a real file and attach the backslash. */ - if (component == 0 && need_directory) + /* Block special device. Convert to a /dev/sd* like + block device unless the trailing slash has been + requested. In this case, the target is the root + directory of the filesystem on this block device. + So we convert this to a real file and attach the + backslash. */ + if (component == 0) { - dev.parse (FH_FS); - strcat (full_path, "\\"); - fileattr = FILE_ATTRIBUTE_DIRECTORY - | FILE_ATTRIBUTE_DEVICE; + fileattr = FILE_ATTRIBUTE_DEVICE; + if (!need_directory) + /* Use a /dev/sd* device number > /dev/sddx. + FIXME: Define a new major DEV_ice number. */ + dev.parse (DEV_SD_HIGHPART_END, 9999); + else + { + dev.parse (FH_FS); + strcat (full_path, "\\"); + fileattr |= FILE_ATTRIBUTE_DIRECTORY; + } goto out; } - fallthrough; + break; case virt_chr: if (component == 0) fileattr = FILE_ATTRIBUTE_DEVICE; -- 2.43.5