From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id B0933383F857; Mon, 30 Nov 2020 10:59:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B0933383F857 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: Fix access to block devices below /proc/sys. X-Act-Checkin: newlib-cygwin X-Git-Author: Christian Franke X-Git-Refname: refs/heads/master X-Git-Oldrev: 7fa8405d3fc166e48f8b401cbd83ce65e694b5a7 X-Git-Newrev: 3434d35a64736f0b77a12f61784c2caa33ac44cf Message-Id: <20201130105903.B0933383F857@sourceware.org> Date: Mon, 30 Nov 2020 10:59:03 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Nov 2020 10:59:03 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=3434d35a64736f0b77a12f61784c2caa33ac44cf commit 3434d35a64736f0b77a12f61784c2caa33ac44cf Author: Christian Franke Date: Sat Nov 28 22:09:23 2020 +0100 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 Diff: --- 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;