On Sun, May 17, 2026 at 09:19:46AM +0000, Matthieu Herrb wrote:
> Hi,
>
> robert@ made a quick diff to webrtc to make it use the XShm 1.2
> extention, rather than legacy 1.1. I've adapted it to Firefox.
>
> XShm 1.2 doesn't use the SysV shmget() syscall and can thus be used in
> a pledge(2) process, allowing it to work with firefox (and chrome).
>
> I think the Mozilla people should have done this years ago (and not
> only for OpenBSD, other systems could benefit from it too.
>
> anyways, I think this is better than falling back to XImage.
>
> Tested with Big Blue Button and Jitsi web conference servers.
>
> Comments ? ok ?
Diff updated to firefox 151:
Index: Makefile
===================================================================
RCS file: /cvs/OpenBSD/ports/www/mozilla-firefox/Makefile,v
diff -u -p -u -r1.684 Makefile
--- Makefile 19 May 2026 13:22:38 -0000 1.684
+++ Makefile 25 May 2026 08:55:42 -0000
@@ -8,6 +8,8 @@ MOZILLA_BRANCH = release
MOZILLA_PROJECT = firefox
MOZILLA_CODENAME = browser
+REVISION = 0
+
WRKDIST = ${WRKDIR}/${MOZILLA_DIST}-${MOZILLA_DIST_VERSION:C/b[0-9]*//}
HOMEPAGE = https://www.mozilla.org/firefox/
SO_VERSION = 163.0
Index:
patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
===================================================================
RCS file:
/cvs/OpenBSD/ports/www/mozilla-firefox/patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc,v
diff -u -p -u -r1.2
patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
---
patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
19 May 2026 13:22:38 -0000 1.2
+++
patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_cc
25 May 2026 08:55:42 -0000
@@ -1,19 +1,108 @@
-https://bugzil.la/1702919, fallback to ximage
+Add XShm 1.2 support
Index:
third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc
---
third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc.orig
+++
third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.cc
-@@ -212,7 +212,12 @@ bool XServerPixelBuffer::Init(XAtomCache* cache, Windo
- void XServerPixelBuffer::InitShm(const XWindowAttributes& attributes) {
- Visual* default_visual = attributes.visual;
- int default_depth = attributes.depth;
--
-+#if defined(__OpenBSD__)
-+// pledge(2)
-+ RTC_LOG(LS_WARNING) << "Unable to use shmget(2) while using pledge(2). "
-+ "Performance may be degraded.";
-+ return;
-+#endif
- int major, minor;
- Bool have_pixmaps;
- if (!XShmQueryVersion(display_, &major, &minor, &have_pixmaps)) {
+@@ -17,6 +17,13 @@
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+
++#if defined(__OpenBSD__)
++#include <X11/Xlib-xcb.h>
++#include <xcb/shm.h>
++#include <sys/mman.h>
++#include <unistd.h>
++#endif
++
+ #include <cstdint>
+ #include <vector>
+
+@@ -170,13 +177,23 @@ void XServerPixelBuffer::ReleaseSharedMemorySegment()
+ if (!shm_segment_info_)
+ return;
+ if (xshm_attached_) {
++#if defined(__OpenBSD__)
++ xcb_shm_detach(xcb_connection_, shm_segment_info_->shmseg);
++#else
+ XShmDetach(display_, shm_segment_info_);
++#endif
+ xshm_attached_ = false;
+ }
+ if (shm_segment_info_->shmaddr != nullptr)
++#if defined(__OpenBSD__)
++ munmap(shm_segment_info_->shmaddr, shm_size_);
++#else
+ shmdt(shm_segment_info_->shmaddr);
++#endif
+ if (shm_segment_info_->shmid != -1)
++#if !defined(__OpenBSD__)
+ shmctl(shm_segment_info_->shmid, IPC_RMID, nullptr);
++#endif
+ delete shm_segment_info_;
+ shm_segment_info_ = nullptr;
+ }
+@@ -224,21 +241,54 @@ void XServerPixelBuffer::InitShm(const XWindowAttribut
+ shm_segment_info_->shmid = -1;
+ shm_segment_info_->shmaddr = nullptr;
+ shm_segment_info_->readOnly = False;
++#if defined(__OpenBSD__)
++ shm_segment_info_->shmseg = XCB_NONE;
++#endif
+ x_shm_image_ = XShmCreateImage(display_, default_visual, default_depth,
+ ZPixmap, nullptr, shm_segment_info_,
+ window_rect_.width(), window_rect_.height());
+ if (x_shm_image_) {
++#if defined(__OpenBSD__)
++ char name[19] = "/webrtc-XXXXXXXXXX";
++ shm_size_ = x_shm_image_->bytes_per_line * x_shm_image_->height;
++ shm_segment_info_->shmid = shm_mkstemp(name);
++ shm_unlink(name);
++#else
+ shm_segment_info_->shmid =
+ shmget(IPC_PRIVATE, x_shm_image_->bytes_per_line *
x_shm_image_->height,
+ IPC_CREAT | 0600);
++#endif
+ if (shm_segment_info_->shmid != -1) {
++#if defined(__OpenBSD__)
++ if (ftruncate(shm_segment_info_->shmid, shm_size_) < 0) {
++ close(shm_segment_info_->shmid);
++ return;
++ }
++ void* shmat_result = mmap(nullptr, shm_size_, PROT_READ | PROT_WRITE,
++ MAP_SHARED | __MAP_NOFAULT,
shm_segment_info_->shmid, 0);
++ if (shmat_result == MAP_FAILED) {
++ close(shm_segment_info_->shmid);
++ return;
++ }
++#else
+ void* shmat_result = shmat(shm_segment_info_->shmid, nullptr, 0);
++#endif
+ if (shmat_result != reinterpret_cast<void*>(-1)) {
+ shm_segment_info_->shmaddr = reinterpret_cast<char*>(shmat_result);
+ x_shm_image_->data = shm_segment_info_->shmaddr;
+
+ XErrorTrap error_trap(display_);
++#if defined(__OpenBSD__)
++ xcb_connection_ = XGetXCBConnection(display_);
++ shm_segment_info_->shmseg = xcb_generate_id(xcb_connection_);
++ xcb_void_cookie_t cookie =
++ xcb_shm_attach_fd_checked(xcb_connection_, shm_segment_info_->shmseg,
++ shm_segment_info_->shmid, 0);
++ if (xcb_request_check(xcb_connection_, cookie) == NULL)
++ xshm_attached_ = true;
++#else
+ xshm_attached_ = XShmAttach(display_, shm_segment_info_);
++#endif
+ XSync(display_, False);
+ if (error_trap.GetLastErrorAndDisable() != 0)
+ xshm_attached_ = false;
+@@ -263,7 +313,9 @@ void XServerPixelBuffer::InitShm(const XWindowAttribut
+ if (have_pixmaps)
+ have_pixmaps = InitPixmaps(default_depth);
+
++#if !defined(__OpenBSD__)
+ shmctl(shm_segment_info_->shmid, IPC_RMID, nullptr);
++#endif
+ shm_segment_info_->shmid = -1;
+
+ RTC_LOG(LS_VERBOSE) << "Using X shared memory extension v" << major << "."
Index:
patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
===================================================================
RCS file:
patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
diff -N
patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++
patches/patch-third_party_libwebrtc_modules_desktop_capture_linux_x11_x_server_pixel_buffer_h
25 May 2026 08:55:42 -0000
@@ -0,0 +1,27 @@
+XShm 1.2 support
+
+Index:
third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h
+---
third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h.orig
++++
third_party/libwebrtc/modules/desktop_capture/linux/x11/x_server_pixel_buffer.h
+@@ -17,6 +17,10 @@
+ #include <X11/Xlib.h>
+ #include <X11/extensions/XShm.h>
+
++#if defined(__OpenBSD__)
++#include <xcb/xcb.h>
++#endif
++
+ #include <cstdint>
+ #include <vector>
+
+@@ -84,6 +88,10 @@ class XServerPixelBuffer {
+ bool xshm_attached_ = false;
+ bool xshm_get_image_succeeded_ = false;
+ std::vector<uint8_t> icc_profile_;
++#if defined(__OpenBSD__)
++ size_t shm_size_ = 0;
++ xcb_connection_t* xcb_connection_ = nullptr;
++#endif
+ };
+
+ } // namespace webrtc
--
Matthieu Herrb