Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-12-07 22:01:29 +0300
committerCorinna Vinschen <corinna@vinschen.de>2005-12-07 22:01:29 +0300
commitdb58e35d94507060b191ab0c15709f7a73e67f5d (patch)
treeaf9457de9d77022c4d6be60066b3340376488f23 /winsup/cygwin/fhandler_raw.cc
parentbb4e8382c5743298f325c3fe1573cc7492136ccf (diff)
* fhandler_raw.cc (fhandler_dev_raw::ioctl): Fix INVALID_PARAMETER
condition. Only copy devbuf to buf if buf is non-NULL.
Diffstat (limited to 'winsup/cygwin/fhandler_raw.cc')
-rw-r--r--winsup/cygwin/fhandler_raw.cc9
1 files changed, 6 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
index 3f45703c9..e4d4e3660 100644
--- a/winsup/cygwin/fhandler_raw.cc
+++ b/winsup/cygwin/fhandler_raw.cc
@@ -157,22 +157,25 @@ fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
mop.mt_count = op->rd_parm;
ret = ioctl (MTIOCTOP, &mop);
}
- else if (devbuf && op->rd_parm < devbufend - devbufstart)
+ else if (devbuf && ((op->rd_parm <= 1 && (devbufend - devbufstart))
+ || op->rd_parm < devbufend - devbufstart))
ret = ERROR_INVALID_PARAMETER;
else if (!devbuf || op->rd_parm != devbufsiz)
{
char *buf = NULL;
if (op->rd_parm > 1L)
buf = new char [op->rd_parm];
- if (devbufsiz > 1L)
+ if (buf && devbufsiz > 1L)
{
memcpy (buf, devbuf + devbufstart, devbufend - devbufstart);
devbufend -= devbufstart;
- delete [] devbuf;
}
else
devbufend = 0;
+ if (devbufsiz > 1L)
+ delete [] devbuf;
+
devbufstart = 0;
devbuf = buf;
devbufsiz = op->rd_parm ?: 1L;