public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: path_conv: fix mqueue path check
@ 2021-05-25 20:05 Corinna Vinschen
0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2021-05-25 20:05 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=782b3385309d20cc60f6a41806091ca8430748f2
commit 782b3385309d20cc60f6a41806091ca8430748f2
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Tue May 25 22:03:36 2021 +0200
Cygwin: path_conv: fix mqueue path check
The check for a file or dir within /dev/mqueue is accidentally using
the incoming path, which could be a relative path. Make sure to
restore the absolute POSIX path in path_copy and only then test the
path.
Also, move the actual check for a valid path below /dev/mqueue into
the fhandler_mqueue class.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/fhandler.h | 2 ++
winsup/cygwin/fhandler_mqueue.cc | 15 +++++++++++++++
winsup/cygwin/mqueue_types.h | 3 +++
winsup/cygwin/path.cc | 22 +++++++---------------
4 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 5e298a82f..bd63933c2 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -3111,6 +3111,8 @@ class fhandler_mqueue: public fhandler_disk_file
off_t filesize;
off_t position;
+ bool valid_path ();
+
struct mq_info *_mqinfo (SIZE_T, mode_t, int, bool);
struct mq_info *mqinfo_create (struct mq_attr *, mode_t, int);
diff --git a/winsup/cygwin/fhandler_mqueue.cc b/winsup/cygwin/fhandler_mqueue.cc
index 04a6c3611..f074474d7 100644
--- a/winsup/cygwin/fhandler_mqueue.cc
+++ b/winsup/cygwin/fhandler_mqueue.cc
@@ -34,9 +34,24 @@ fhandler_mqueue::~fhandler_mqueue ()
cfree (filebuf);
}
+bool
+fhandler_mqueue::valid_path ()
+{
+ const char *posix_basename = get_name () + MQ_LEN;
+ size_t len = strlen (posix_basename);
+ if (len > 0 && len <= NAME_MAX && !strpbrk (posix_basename, "/\\"))
+ return true;
+ return false;
+}
+
int
fhandler_mqueue::open (int flags, mode_t mode)
{
+ if (!valid_path ())
+ {
+ set_errno (EINVAL);
+ return 0;
+ }
/* FIXME: reopen by handle semantics missing yet */
flags &= ~(O_NOCTTY | O_PATH | O_BINARY | O_TEXT);
return mq_open (flags, mode, NULL);
diff --git a/winsup/cygwin/mqueue_types.h b/winsup/cygwin/mqueue_types.h
index 4d0d910e4..1e4fe127e 100644
--- a/winsup/cygwin/mqueue_types.h
+++ b/winsup/cygwin/mqueue_types.h
@@ -10,6 +10,9 @@ details. */
#define MQI_MAGIC 0x98765432UL
+#define MQ_PATH "/dev/mqueue/"
+#define MQ_LEN (sizeof (MQ_PATH) - 1)
+
/* The mq_attr structure is defined using long datatypes per POSIX.
The mq_fattr is the in-file representation of the mq_attr struct.
Originally created this way for 32/64 bit interoperability, this
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 53cdc282d..6a07f0d06 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1188,6 +1188,10 @@ path_conv::check (const char *src, unsigned opt,
return;
}
+ /* Restore last path component */
+ if (tail < path_end && tail > path_copy + 1)
+ *tail = '/';
+
if (dev.isfs ())
{
/* If FS hasn't been checked already in symlink_info::check,
@@ -1227,16 +1231,8 @@ path_conv::check (const char *src, unsigned opt,
set_exec (0);
/* FIXME: bad hack alert!!! We need a better solution */
-
-#define MQ_PATH "/dev/mqueue/"
-#define MQ_LEN (sizeof (MQ_PATH) - 1)
-
- if (!strncmp (src, MQ_PATH, MQ_LEN))
- {
- size_t len = strlen (src + MQ_LEN);
- if (len > 0 && len <= NAME_MAX && !strpbrk (src + MQ_LEN, "/\\"))
- dev.parse (FH_MQUEUE);
- }
+ if (!strncmp (path_copy, MQ_PATH, MQ_LEN) && path_copy[MQ_LEN])
+ dev.parse (FH_MQUEUE);
}
if (opt & PC_NOFULL)
@@ -1270,11 +1266,7 @@ path_conv::check (const char *src, unsigned opt,
path_flags |= PATH_CTTY;
if (opt & PC_POSIX)
- {
- if (tail < path_end && tail > path_copy + 1)
- *tail = '/';
- set_posix (path_copy);
- }
+ set_posix (path_copy);
#if 0
if (!error)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-05-25 20:05 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-25 20:05 [newlib-cygwin] Cygwin: path_conv: fix mqueue path check Corinna Vinschen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).