This is the mail archive of the cygwin-patches mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch] Segfault on unaligned lseek() on /dev/sdX (was: [ITP] ddrescue 1.3)


Pedro Alves wrote:
Christopher Faylor escreveu:
On Fri, May 18, 2007 at 09:02:15PM +0200, Christian Franke wrote:
Hi,

Cygwin 1.5.24-2 segfaults on unaligned lseek() on raw block devices with sector size >512 bytes.

Testcases:
$ dd skip=1000 bs=2047 if=/dev/scd0 of=/dev/null

$ ddrescue -c 1 /dev/scd0 file.iso


This is due to a fixed 512 byte buffer in fhandler_dev_floppy::lseek(). It is still present in HEAD revision.

The attached patch should fix. It should work for any sector size.
(Smoke-)tested with 1.5.24-2 (too busy to test with current CVS, sorry).


2007-05-18 Christian Franke <franke@computer.org>

* fhandler_floppy.cc (fhandler_dev_floppy::lseek): Fixed segfault on
unaligned seek due to fixed size buffer.



It seems like this could be done without the heavyweight use of malloc, like use an automatic array of length 512 + 4 and calculate an aligned address from that.


Or use alloca instead?


-  char buf[512];
+  char *buf = (char *) alloca (512);


Yes, thanks.


Makes the new patch really simple, see attachment.

Christian

--- cygwin-1.5.24-2.orig/winsup/cygwin/fhandler_floppy.cc	2006-07-18 14:56:37.001000000 +0200
+++ cygwin-1.5.24-2/winsup/cygwin/fhandler_floppy.cc	2007-05-19 13:07:33.484375000 +0200
@@ -12,6 +12,7 @@ details. */
 #include "winsup.h"
 #include <sys/termios.h>
 #include <unistd.h>
+#include <stdlib.h>
 #include <winioctl.h>
 #include <asm/socket.h>
 #include <cygwin/rdevio.h>
@@ -408,7 +409,6 @@ fhandler_dev_floppy::raw_write (const vo
 _off64_t
 fhandler_dev_floppy::lseek (_off64_t offset, int whence)
 {
-  char buf[512];
   _off64_t lloffset = offset;
   LARGE_INTEGER sector_aligned_offset;
   _off64_t bytes_left;
@@ -454,6 +454,7 @@ fhandler_dev_floppy::lseek (_off64_t off
   if (bytes_left)
     {
       size_t len = bytes_left;
+      char *buf = (char *) alloca (len);
       raw_read (buf, len);
     }
   return sector_aligned_offset.QuadPart + bytes_left;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]