On 8/19/23 02:47, Karim Taha wrote:
From: Kyle Evans <kev...@freebsd.org>
Signed-off-by: Kyle Evans <kev...@freebsd.org>
Signed-off-by: Karim Taha <kariem.taha...@gmail.com>
---
bsd-user/freebsd/os-misc.h | 52 +++++++++++++++++++++++++++++++++++
bsd-user/freebsd/os-syscall.c | 13 +++++++++
2 files changed, 65 insertions(+)
diff --git a/bsd-user/freebsd/os-misc.h b/bsd-user/freebsd/os-misc.h
index 8436ccb2f7..993e4598f9 100644
--- a/bsd-user/freebsd/os-misc.h
+++ b/bsd-user/freebsd/os-misc.h
@@ -24,5 +24,57 @@
#include <sys/random.h>
#include <sched.h>
+int shm_open2(const char *path, int flags, mode_t mode, int shmflags,
+ const char *);
+
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
+/* shm_open2(2) */
+static inline abi_long do_freebsd_shm_open2(abi_ulong pathptr, abi_ulong flags,
+ abi_long mode, abi_ulong shmflags, abi_ulong nameptr)
+{
+ int ret;
+ void *uname, *upath;
+
+#ifdef SHM_ANON
Why would SHM_ANON not be defined? You've already restricted the function to freebsd13+
(presumably so that shm_open2() is in libc.a).
+#define SHM_PATH(p) (p) == SHM_ANON ? (p) : path(p)
+ if (pathptr == (uintptr_t)SHM_ANON) {
+ upath = SHM_ANON;
+ } else
+#else
+#define SHM_PATH(p) path(p)
+#endif
+ {
+ upath = lock_user_string(pathptr);
+ if (upath == NULL) {
+ return -TARGET_EFAULT;
+ }
+ }
+
+ uname = NULL;
+ if (nameptr != 0) {
+ uname = lock_user_string(nameptr);
+ if (uname == NULL) {
+ unlock_user(upath, pathptr, 0);
+ return -TARGET_EFAULT;
+ }
+ }
+ ret = get_errno(shm_open2(SHM_PATH(upath),
There is no need for SHM_PATH because you've already handled the condition while setting
upath above.
r~