4 ms·
I guess in OpenBSD because of W ^ X this would not work?
by belter 1y ago
I guess in OpenBSD because of W ^ X this would not work?
- akdas 1y agoI was thinking the same thing. Usually, you'd want to write the new code to a page that you mark as read and write, then switch that page to read and execute. This becomes tricky if the code that's doing the modifying is in the same page as the code being modified.
- timewizard 1y agoThe way it's coded it wouldn't; however, you can map the same shared memory twice. Once with R|W and a second time with R|X. Then you can write into one region and execute out of it's mirrored mapping.
- rkeene2 1y agoIn Linux it also needs mprotect() to change the permissions on the page so it can write it. The OpenBSD man page[0] indicate that it supports this as well, though notes that not all implementations are guaranteed to allow it, but my guess is it would generally work. [0] https://man.openbsd.org/mprotect.2 https://man.openbsd.org/mprotect.2
- Retr0id 1y agoIt's not required on linux, if the ELF headers are set up such that the page is mapped rwx to begin with. (but rwx mappings are generally frowned upon from a security perspective)
- mananaysiempre 1y agoNot as is, but I think OpenBSD permits you to map the same memory twice, once as W and once as X (which would be a reasonable hoop to jump through for JITs etc., except there’s no portable way to do it). ARM64 MacOS doesn’t even permit that, and you need to use OS-specific incantations[1] that essentially prohibit two JITs coexisting in the same process. [1] https://developer.apple.com/documentation/apple-silicon/porting-just-in-time-compilers-to-apple-silicon https://developer.apple.com/documentation/apple-silicon/port...
- saagarjha 1y agoNo, the protection is per-thread. You can run the JITs in different threads