summaryrefslogtreecommitdiff
path: root/locks
diff options
context:
space:
mode:
authorJim Jagielski <jim@apache.org>2014-04-28 12:08:38 +0000
committerJim Jagielski <jim@apache.org>2014-04-28 12:08:38 +0000
commit305e29a35ffd7f70719b3b38dde5e5660d8ea3c9 (patch)
treea42a98c2692192ad8d600448dd9718e1b9e9770e /locks
parent2e06f779e45a0fab5ee8567f46fc33783e6c703c (diff)
downloadapr-305e29a35ffd7f70719b3b38dde5e5660d8ea3c9.tar.gz
Merge r741862, r741866 from trunk:
Add object perms set macros and implement them for shm and mutex Submitted by: mturk, rpluem Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.6.x@1590617 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'locks')
-rw-r--r--locks/beos/proc_mutex.c2
-rw-r--r--locks/netware/proc_mutex.c2
-rw-r--r--locks/os2/proc_mutex.c2
-rw-r--r--locks/unix/global_mutex.c9
-rw-r--r--locks/unix/proc_mutex.c72
-rw-r--r--locks/win32/proc_mutex.c2
6 files changed, 88 insertions, 1 deletions
diff --git a/locks/beos/proc_mutex.c b/locks/beos/proc_mutex.c
index ce2a580ba..a02668add 100644
--- a/locks/beos/proc_mutex.c
+++ b/locks/beos/proc_mutex.c
@@ -140,6 +140,8 @@ APR_DECLARE(const char *) apr_proc_mutex_defname(void)
return "beossem";
}
+APR_PERMS_SET_ENOTIMPL(proc_mutex)
+
APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex)
/* Implement OS-specific accessors defined in apr_portable.h */
diff --git a/locks/netware/proc_mutex.c b/locks/netware/proc_mutex.c
index 77411d0bf..097914645 100644
--- a/locks/netware/proc_mutex.c
+++ b/locks/netware/proc_mutex.c
@@ -97,6 +97,8 @@ APR_DECLARE(const char *) apr_proc_mutex_defname(void)
return "netwarethread";
}
+APR_PERMS_SET_ENOTIMPL(proc_mutex)
+
APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex)
/* Implement OS-specific accessors defined in apr_portable.h */
diff --git a/locks/os2/proc_mutex.c b/locks/os2/proc_mutex.c
index 0f3a564ef..9b53c0bef 100644
--- a/locks/os2/proc_mutex.c
+++ b/locks/os2/proc_mutex.c
@@ -199,7 +199,7 @@ APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex)
return APR_FROM_OS_ERROR(rc);
}
-
+APR_PERMS_SET_ENOTIMPL(proc_mutex)
APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex)
diff --git a/locks/unix/global_mutex.c b/locks/unix/global_mutex.c
index 18de7e450..c86be917f 100644
--- a/locks/unix/global_mutex.c
+++ b/locks/unix/global_mutex.c
@@ -185,4 +185,13 @@ APR_DECLARE(const char *) apr_global_mutex_name(apr_global_mutex_t *mutex)
return apr_proc_mutex_name(mutex->proc_mutex);
}
+APR_PERMS_SET_IMPLEMENT(global_mutex)
+{
+ apr_status_t rv;
+ apr_global_mutex_t *mutex = (apr_global_mutex_t *)theglobal_mutex;
+
+ rv = apr_proc_mutex_set_perms(mutex->proc_mutex, perms, uid, gid);
+ return rv;
+}
+
APR_POOL_IMPLEMENT_ACCESSOR(global_mutex)
diff --git a/locks/unix/proc_mutex.c b/locks/unix/proc_mutex.c
index fa8a872f1..cb6bad55e 100644
--- a/locks/unix/proc_mutex.c
+++ b/locks/unix/proc_mutex.c
@@ -35,6 +35,17 @@ static apr_status_t proc_mutex_no_child_init(apr_proc_mutex_t **mutex,
}
#endif
+#if APR_HAS_POSIXSEM_SERIALIZE || APR_HAS_PROC_PTHREAD_SERIALIZE
+static apr_status_t proc_mutex_no_perms_set(apr_proc_mutex_t *mutex,
+ apr_fileperms_t perms,
+ apr_uid_t uid,
+ apr_gid_t gid)
+{
+ return APR_ENOTIMPL;
+}
+#endif
+
+
#if APR_HAS_POSIXSEM_SERIALIZE
#ifndef SEM_FAILED
@@ -183,6 +194,7 @@ static const apr_proc_mutex_unix_lock_methods_t mutex_posixsem_methods =
proc_mutex_posix_release,
proc_mutex_posix_cleanup,
proc_mutex_no_child_init,
+ proc_mutex_no_perms_set,
"posixsem"
};
@@ -291,6 +303,24 @@ static apr_status_t proc_mutex_sysv_release(apr_proc_mutex_t *mutex)
return APR_SUCCESS;
}
+static apr_status_t proc_mutex_sysv_perms_set(apr_proc_mutex_t *mutex,
+ apr_fileperms_t perms,
+ apr_uid_t uid,
+ apr_gid_t gid)
+{
+
+ union semun ick;
+ struct semid_ds buf;
+ buf.sem_perm.uid = uid;
+ buf.sem_perm.gid = gid;
+ buf.sem_perm.mode = apr_unix_perms2mode(perms);
+ ick.buf = &buf;
+ if (semctl(mutex->interproc->filedes, 0, IPC_SET, ick) < 0) {
+ return errno;
+ }
+ return APR_SUCCESS;
+}
+
static const apr_proc_mutex_unix_lock_methods_t mutex_sysv_methods =
{
#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(SYSVSEM_IS_GLOBAL)
@@ -304,6 +334,7 @@ static const apr_proc_mutex_unix_lock_methods_t mutex_sysv_methods =
proc_mutex_sysv_release,
proc_mutex_sysv_cleanup,
proc_mutex_no_child_init,
+ proc_mutex_sysv_perms_set,
"sysvsem"
};
@@ -499,6 +530,7 @@ static const apr_proc_mutex_unix_lock_methods_t mutex_proc_pthread_methods =
proc_mutex_proc_pthread_release,
proc_mutex_proc_pthread_cleanup,
proc_mutex_no_child_init,
+ proc_mutex_no_perms_set,
"pthread"
};
@@ -620,6 +652,22 @@ static apr_status_t proc_mutex_fcntl_release(apr_proc_mutex_t *mutex)
return APR_SUCCESS;
}
+static apr_status_t proc_mutex_fcntl_perms_set(apr_proc_mutex_t *mutex,
+ apr_fileperms_t perms,
+ apr_uid_t uid,
+ apr_gid_t gid)
+{
+
+ if (mutex->fname) {
+ if (!(perms & APR_FPROT_GSETID))
+ gid = -1;
+ if (fchown(mutex->interproc->filedes, uid, gid) < 0) {
+ return errno;
+ }
+ }
+ return APR_SUCCESS;
+}
+
static const apr_proc_mutex_unix_lock_methods_t mutex_fcntl_methods =
{
#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(FCNTL_IS_GLOBAL)
@@ -633,6 +681,7 @@ static const apr_proc_mutex_unix_lock_methods_t mutex_fcntl_methods =
proc_mutex_fcntl_release,
proc_mutex_fcntl_cleanup,
proc_mutex_no_child_init,
+ proc_mutex_fcntl_perms_set,
"fcntl"
};
@@ -758,6 +807,22 @@ static apr_status_t proc_mutex_flock_child_init(apr_proc_mutex_t **mutex,
return APR_SUCCESS;
}
+static apr_status_t proc_mutex_flock_perms_set(apr_proc_mutex_t *mutex,
+ apr_fileperms_t perms,
+ apr_uid_t uid,
+ apr_gid_t gid)
+{
+
+ if (mutex->fname) {
+ if (!(perms & APR_FPROT_GSETID))
+ gid = -1;
+ if (fchown(mutex->interproc->filedes, uid, gid) < 0) {
+ return errno;
+ }
+ }
+ return APR_SUCCESS;
+}
+
static const apr_proc_mutex_unix_lock_methods_t mutex_flock_methods =
{
#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(FLOCK_IS_GLOBAL)
@@ -771,6 +836,7 @@ static const apr_proc_mutex_unix_lock_methods_t mutex_flock_methods =
proc_mutex_flock_release,
proc_mutex_flock_cleanup,
proc_mutex_flock_child_init,
+ proc_mutex_flock_perms_set,
"flock"
};
@@ -943,6 +1009,12 @@ APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex)
return NULL;
}
+APR_PERMS_SET_IMPLEMENT(proc_mutex)
+{
+ apr_proc_mutex_t *mutex = (apr_proc_mutex_t *)theproc_mutex;
+ return mutex->meth->perms_set(mutex, perms, uid, gid);
+}
+
APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex)
/* Implement OS-specific accessors defined in apr_portable.h */
diff --git a/locks/win32/proc_mutex.c b/locks/win32/proc_mutex.c
index 3bd25efaf..38366f185 100644
--- a/locks/win32/proc_mutex.c
+++ b/locks/win32/proc_mutex.c
@@ -199,6 +199,8 @@ APR_DECLARE(const char *) apr_proc_mutex_defname(void)
return "win32mutex";
}
+APR_PERMS_SET_ENOTIMPL(proc_mutex)
+
APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex)
/* Implement OS-specific accessors defined in apr_portable.h */