mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-08 18:19:08 +08:00
Cygwin: Add fd validation where needed in mq_* functions
Validate the fd returned by cygheap_getfd operating on given mqd. A release note is provided for 3.5.6. Reported-by: Christian Franke <Christian.Franke@t-online.de> Addresses: https://cygwin.com/pipermail/cygwin/2025-January/257090.html Signed-off-by: Mark Geisert <mark@maxrnd.com> Fixes: 46f3b0ce85a9 (Cygwin: POSIX msg queues: move all mq_* functionality into fhandler_mqueue) (cherry picked from commit 9a4a44523bb71e1fd453cdebe2182c9ab913a222)
This commit is contained in:
parent
12faeffa3c
commit
f9f66495e9
@ -225,11 +225,14 @@ mq_getattr (mqd_t mqd, struct mq_attr *mqstat)
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
cygheap_fdget fd ((int) mqd, true);
|
cygheap_fdget fd ((int) mqd, true);
|
||||||
fhandler_mqueue *fh = fd->is_mqueue ();
|
if (fd >= 0)
|
||||||
if (!fh)
|
{
|
||||||
set_errno (EBADF);
|
fhandler_mqueue *fh = fd->is_mqueue ();
|
||||||
else
|
if (!fh)
|
||||||
ret = fh->mq_getattr (mqstat);
|
set_errno (EBADF);
|
||||||
|
else
|
||||||
|
ret = fh->mq_getattr (mqstat);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,11 +242,14 @@ mq_setattr (mqd_t mqd, const struct mq_attr *mqstat, struct mq_attr *omqstat)
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
cygheap_fdget fd ((int) mqd, true);
|
cygheap_fdget fd ((int) mqd, true);
|
||||||
fhandler_mqueue *fh = fd->is_mqueue ();
|
if (fd >= 0)
|
||||||
if (!fh)
|
{
|
||||||
set_errno (EBADF);
|
fhandler_mqueue *fh = fd->is_mqueue ();
|
||||||
else
|
if (!fh)
|
||||||
ret = fh->mq_setattr (mqstat, omqstat);
|
set_errno (EBADF);
|
||||||
|
else
|
||||||
|
ret = fh->mq_setattr (mqstat, omqstat);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,11 +259,14 @@ mq_notify (mqd_t mqd, const struct sigevent *notification)
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
cygheap_fdget fd ((int) mqd, true);
|
cygheap_fdget fd ((int) mqd, true);
|
||||||
fhandler_mqueue *fh = fd->is_mqueue ();
|
if (fd >= 0)
|
||||||
if (!fh)
|
{
|
||||||
set_errno (EBADF);
|
fhandler_mqueue *fh = fd->is_mqueue ();
|
||||||
else
|
if (!fh)
|
||||||
ret = fh->mq_notify (notification);
|
set_errno (EBADF);
|
||||||
|
else
|
||||||
|
ret = fh->mq_notify (notification);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,11 +277,14 @@ mq_timedsend (mqd_t mqd, const char *ptr, size_t len, unsigned int prio,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
cygheap_fdget fd ((int) mqd, true);
|
cygheap_fdget fd ((int) mqd, true);
|
||||||
fhandler_mqueue *fh = fd->is_mqueue ();
|
if (fd >= 0)
|
||||||
if (!fh)
|
{
|
||||||
set_errno (EBADF);
|
fhandler_mqueue *fh = fd->is_mqueue ();
|
||||||
else
|
if (!fh)
|
||||||
ret = fh->mq_timedsend (ptr, len, prio, abstime);
|
set_errno (EBADF);
|
||||||
|
else
|
||||||
|
ret = fh->mq_timedsend (ptr, len, prio, abstime);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,11 +301,14 @@ mq_timedreceive (mqd_t mqd, char *ptr, size_t maxlen, unsigned int *priop,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
cygheap_fdget fd ((int) mqd, true);
|
cygheap_fdget fd ((int) mqd, true);
|
||||||
fhandler_mqueue *fh = fd->is_mqueue ();
|
if (fd >= 0)
|
||||||
if (!fh)
|
{
|
||||||
set_errno (EBADF);
|
fhandler_mqueue *fh = fd->is_mqueue ();
|
||||||
else
|
if (!fh)
|
||||||
ret = fh->mq_timedrecv (ptr, maxlen, priop, abstime);
|
set_errno (EBADF);
|
||||||
|
else
|
||||||
|
ret = fh->mq_timedrecv (ptr, maxlen, priop, abstime);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,14 +324,14 @@ mq_close (mqd_t mqd)
|
|||||||
__try
|
__try
|
||||||
{
|
{
|
||||||
cygheap_fdget fd ((int) mqd, true);
|
cygheap_fdget fd ((int) mqd, true);
|
||||||
if (!fd->is_mqueue ())
|
if (fd < 0 || !fd->is_mqueue ())
|
||||||
{
|
{
|
||||||
set_errno (EBADF);
|
set_errno (EBADF);
|
||||||
__leave;
|
__leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mq_notify (mqd, NULL)) /* unregister calling process */
|
if (mq_notify (mqd, NULL)) /* unregister calling process */
|
||||||
__leave;
|
__leave;
|
||||||
|
|
||||||
fd->isclosed (true);
|
fd->isclosed (true);
|
||||||
fd->close ();
|
fd->close ();
|
||||||
|
@ -7,3 +7,6 @@ Fixes:
|
|||||||
|
|
||||||
- Fix a regression since 3.5.0 which fails to use POSIX semantics in
|
- Fix a regression since 3.5.0 which fails to use POSIX semantics in
|
||||||
unlink/rename on NTFS.
|
unlink/rename on NTFS.
|
||||||
|
|
||||||
|
- Add fd validation where needed in mq_* functions.
|
||||||
|
Addresses: https://cygwin.com/pipermail/cygwin/2025-January/257090.html
|
||||||
|
Loading…
x
Reference in New Issue
Block a user