Index | Thread | Search

From:
Daniel Dickman <didickman@gmail.com>
Subject:
Re: lang/polyml: fix (stupid because needless) W^X violation
To:
Daniel Dickman <didickman@gmail.com>, ports@openbsd.org
Date:
Tue, 15 Jul 2025 22:35:19 -0400

Download raw body.

Thread

On Wed, 16 Jul 2025, Stuart Henderson wrote:

> fwiw, we '#if 0'-out the similar test in libffi. Maybe others too.

Then this would be my proposed diff.

Now actually tested and seemed to work here.


Index: Makefile
===================================================================
RCS file: /cvs/ports/lang/polyml/Makefile,v
diff -u -p -u -r1.1.1.1 Makefile
--- Makefile	12 Jun 2025 11:09:28 -0000	1.1.1.1
+++ Makefile	16 Jul 2025 02:32:37 -0000
@@ -6,6 +6,7 @@ COMMENT =	Poly/ML implementation of stan
 GH_ACCOUNT =	polyml
 GH_PROJECT =	polyml
 GH_TAGNAME =	v5.9.1
+REVISION =	0
 
 USE_NOEXECONLY =	Yes
 USE_NOBTCFI =		Yes
Index: patches/patch-libpolyml_osmemunix_cpp
===================================================================
RCS file: patches/patch-libpolyml_osmemunix_cpp
diff -N patches/patch-libpolyml_osmemunix_cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-libpolyml_osmemunix_cpp	16 Jul 2025 02:32:37 -0000
@@ -0,0 +1,33 @@
+Hard code the W^X code path on OpenBSD since actually
+selecting this at run-time isn't so straightforward.
+
+Index: libpolyml/osmemunix.cpp
+--- libpolyml/osmemunix.cpp.orig
++++ libpolyml/osmemunix.cpp
+@@ -159,6 +159,9 @@ bool OSMem::Initialise(enum _MemUsage usage)
+ {
+     memUsage = usage;
+     pageSize = getpagesize();
++#ifdef __OpenBSD__
++	wxFix = WXFixDualArea;
++#else
+     if (usage != UsageExecutableCode)
+         wxFix = WXFixNone;
+     else
+@@ -177,7 +180,7 @@ bool OSMem::Initialise(enum _MemUsage usage)
+ #endif
+         if (test == MAP_FAILED)
+         {
+-            if (errno != ENOTSUP && errno != EACCES) // Fails with ENOTSUPP on OpenBSD and EACCES in SELinux.
++            if (errno != ENOTSUP && errno != EACCES) // Fails with ENOTSUP on OpenBSD and EACCES in SELinux.
+                 return false;
+             // Check that read-write works.
+             test = mmap(0, pageSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+@@ -188,6 +191,7 @@ bool OSMem::Initialise(enum _MemUsage usage)
+         if (test != MAP_FAILED)
+             munmap(FIXTYPE test, pageSize);
+     }
++#endif
+ 
+     if (wxFix == WXFixDualArea)
+     {