summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2007-11-27 17:04:19 +0000
committerCorinna Vinschen <corinna@vinschen.de>2007-11-27 17:04:19 +0000
commit547ad329b628ed176d3fdf43fe103447bddd5d0b (patch)
tree68dd172108b114660513129ca2d962a4b293fb0d
parenta1591d3be7fefcec8056bf5f74be0590fb356605 (diff)
downloadcygnal-547ad329b628ed176d3fdf43fe103447bddd5d0b.tar.gz
cygnal-547ad329b628ed176d3fdf43fe103447bddd5d0b.tar.bz2
cygnal-547ad329b628ed176d3fdf43fe103447bddd5d0b.zip
* posix_ipc.cc (ipc_names): Rename max_len to prefix_len. Store
the prefix len in it. (check_path): Take length parameter. Use this length insetad of calling strlen. Allow PATH_MAX length paths. (ipc_mutex_init): Use MAX_PATH instead of CYG_MAX_PATH. (ipc_cond_init): Ditto. (shm_open): Allocate local name buffer not bigger than necessary. Call check_path with additional length argument. (shm_unlink): Ditto. (mq_open): Ditto. (mq_unlink): Ditto. (sem_open): Ditto. (sem_unlink): Ditto.
-rw-r--r--winsup/cygwin/ChangeLog16
-rw-r--r--winsup/cygwin/posix_ipc.cc50
2 files changed, 46 insertions, 20 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index c1b94b7c8..1968c9f2d 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,21 @@
2007-11-27 Corinna Vinschen <corinna@vinschen.de>
+ * posix_ipc.cc (ipc_names): Rename max_len to prefix_len. Store
+ the prefix len in it.
+ (check_path): Take length parameter. Use this length insetad of
+ calling strlen. Allow PATH_MAX length paths.
+ (ipc_mutex_init): Use MAX_PATH instead of CYG_MAX_PATH.
+ (ipc_cond_init): Ditto.
+ (shm_open): Allocate local name buffer not bigger than necessary. Call
+ check_path with additional length argument.
+ (shm_unlink): Ditto.
+ (mq_open): Ditto.
+ (mq_unlink): Ditto.
+ (sem_open): Ditto.
+ (sem_unlink): Ditto.
+
+2007-11-27 Corinna Vinschen <corinna@vinschen.de>
+
Drop old SetResourceLock stuff in favor of mutos.
* dcrt0.cc (_reslock): Remove.
(__cygwin_user_data): Accommodate removal of resourcelocks member.
diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc
index 70044f973..2ed38fb23 100644
--- a/winsup/cygwin/posix_ipc.cc
+++ b/winsup/cygwin/posix_ipc.cc
@@ -30,15 +30,17 @@ details. */
#include <mqueue.h>
#include <semaphore.h>
+/* The prefix_len is the length of the path prefix ncluding trailing "/"
+ (or "/sem." for semaphores) as well as the trailing NUL. */
struct
{
const char *prefix;
- const size_t max_len;
+ const size_t prefix_len;
const char *description;
} ipc_names[] = {
- { "/dev/shm", CYG_MAX_PATH - 10, "POSIX shared memory object" },
- { "/dev/mqueue", CYG_MAX_PATH - 13, "POSIX message queue" },
- { "/dev/shm", CYG_MAX_PATH - 14, "POSIX semaphore" }
+ { "/dev/shm", 10, "POSIX shared memory object" },
+ { "/dev/mqueue", 13, "POSIX message queue" },
+ { "/dev/shm", 14, "POSIX semaphore" }
};
enum ipc_type_t
@@ -49,7 +51,7 @@ enum ipc_type_t
};
static bool
-check_path (char *res_name, ipc_type_t type, const char *name)
+check_path (char *res_name, ipc_type_t type, const char *name, size_t len)
{
/* Note that we require the existance of the apprpriate /dev subdirectories
for POSIX IPC object support, similar to Linux (which supports the
@@ -76,7 +78,7 @@ check_path (char *res_name, ipc_type_t type, const char *name)
set_errno (EINVAL);
return false;
}
- if (strlen (name) > ipc_names[type].max_len)
+ if (len > PATH_MAX - ipc_names[type].prefix_len)
{
debug_printf ("%s name '%s' too long", ipc_names[type].description, name);
set_errno (ENAMETOOLONG);
@@ -91,7 +93,7 @@ check_path (char *res_name, ipc_type_t type, const char *name)
static int
ipc_mutex_init (HANDLE *pmtx, const char *name)
{
- char buf[CYG_MAX_PATH];
+ char buf[MAX_PATH];
__small_sprintf (buf, "%scyg_pmtx/%s", cygheap->shared_prefix, name);
*pmtx = CreateMutex (&sec_all, FALSE, buf);
if (!*pmtx)
@@ -133,7 +135,7 @@ ipc_mutex_close (HANDLE mtx)
static int
ipc_cond_init (HANDLE *pevt, const char *name)
{
- char buf[CYG_MAX_PATH];
+ char buf[MAX_PATH];
__small_sprintf (buf, "%scyg_pevt/%s", cygheap->shared_prefix, name);
*pevt = CreateEvent (&sec_all, TRUE, FALSE, buf);
if (!*pevt)
@@ -223,9 +225,10 @@ public:
extern "C" int
shm_open (const char *name, int oflag, mode_t mode)
{
- char shmname[CYG_MAX_PATH];
+ size_t len = strlen (name);
+ char shmname[ipc_names[shmem].prefix_len + len];
- if (!check_path (shmname, shmem, name))
+ if (!check_path (shmname, shmem, name, len))
return -1;
/* Check for valid flags. */
@@ -243,9 +246,10 @@ shm_open (const char *name, int oflag, mode_t mode)
extern "C" int
shm_unlink (const char *name)
{
- char shmname[CYG_MAX_PATH];
+ size_t len = strlen (name);
+ char shmname[ipc_names[shmem].prefix_len + len];
- if (!check_path (shmname, shmem, name))
+ if (!check_path (shmname, shmem, name, len))
return -1;
return unlink (shmname);
@@ -312,9 +316,11 @@ mq_open (const char *name, int oflag, ...)
struct mq_attr *attr;
struct mq_info *mqinfo;
LUID luid;
- char mqname[CYG_MAX_PATH];
- if (!check_path (mqname, mqueue, name))
+ size_t len = strlen (name);
+ char mqname[ipc_names[mqueue].prefix_len + len];
+
+ if (!check_path (mqname, mqueue, name, len))
return (mqd_t) -1;
myfault efault;
@@ -870,9 +876,10 @@ mq_close (mqd_t mqd)
extern "C" int
mq_unlink (const char *name)
{
- char mqname[CYG_MAX_PATH];
+ size_t len = strlen (name);
+ char mqname[ipc_names[mqueue].prefix_len + len];
- if (!check_path (mqname, mqueue, name))
+ if (!check_path (mqname, mqueue, name, len))
return -1;
if (unlink (mqname) == -1)
return -1;
@@ -901,11 +908,13 @@ sem_open (const char *name, int oflag, ...)
struct __stat64 statbuff;
sem_t *sem = SEM_FAILED;
sem_finfo sf;
- char semname[CYG_MAX_PATH];
bool wasopen = false;
ipc_flock file;
- if (!check_path (semname, semaphore, name))
+ size_t len = strlen (name);
+ char semname[ipc_names[semaphore].prefix_len + len];
+
+ if (!check_path (semname, semaphore, name, len))
return SEM_FAILED;
myfault efault;
@@ -1041,9 +1050,10 @@ sem_close (sem_t *sem)
extern "C" int
sem_unlink (const char *name)
{
- char semname[CYG_MAX_PATH];
+ size_t len = strlen (name);
+ char semname[ipc_names[semaphore].prefix_len + len];
- if (!check_path (semname, semaphore, name))
+ if (!check_path (semname, semaphore, name, len))
return -1;
if (unlink (semname) == -1)
return -1;