Hi again. So mplayer is using the XShm extention to share memory with the X server. Unfortunatly, on OpenBSD the X server and the mplayer process don't run with the same uid, leading to the patches to set the shared memory segement permissions to 0777. (one can see them with `ipcs -m` while mplayer is running).
A number of years ago the X.Org developpers provided a solution for this in XShm 1.2. Unfortunatly at this time they only implemented it in libxcb, considering that it would soon replace libX11 and libXext completely, and this has prevented many projects using XShm to upgrade their code. Here is a relarively crude patch to x11/mplayer to implement XShm 1.2 support in vo_x11 and vo_xv backends. The configure bits in particular are not very nice and will probably require more work to be upstreamed. But at least there are no longer wide open shared memory segments containing the p0rn you're watching while running mplayer. ok, comments ? PS: this needs the p2 (add sdl-image bdep) patch I sent earlier to apply. Index: Makefile =================================================================== RCS file: /local/cvs/ports/x11/mplayer/Makefile,v diff -u -p -u -r1.333 Makefile --- Makefile 2 Dec 2024 06:14:53 -0000 1.333 +++ Makefile 15 Dec 2024 17:56:23 -0000 @@ -3,7 +3,7 @@ COMMENT= movie player supporting many fo V= 20240803 FFMPEG_V= 6.1.2 DISTNAME= mplayer-${V} -REVISION= 2 +REVISION= 3 CATEGORIES= x11 multimedia SITES= https://comstyle.com/source/ EXTRACT_SUFX= .tar.xz @@ -17,12 +17,12 @@ MAINTAINER= Brad Smith <b...@comstyle.co # GPLv2 PERMIT_PACKAGE= Yes -WANTLIB= EGL GL SDL X11 Xext Xinerama Xss Xv Xxf86dga Xxf86vm ass \ +WANTLIB= EGL GL SDL X11 X11-xcb Xext Xinerama Xss Xv Xxf86dga Xxf86vm ass \ avcodec avformat avutil bluray bs2b bz2 c cdda_interface \ cdda_paranoia crypto dv dvdnav dvdread enca fontconfig \ freetype fribidi gif iconv jpeg m mng mp3lame curses png \ postproc pthread sndio ssl swscale swresample util x264 \ - xvidcore z + xcb xcb-shm xvidcore z COMPILER= base-clang ports-gcc COMPILER_LANGS= c Index: patches/patch-configure =================================================================== RCS file: /local/cvs/ports/x11/mplayer/patches/patch-configure,v diff -u -p -u -r1.97 patch-configure --- patches/patch-configure 24 Nov 2024 08:50:45 -0000 1.97 +++ patches/patch-configure 15 Dec 2024 17:56:23 -0000 @@ -1,3 +1,5 @@ +Add support for xcb-shm + Index: configure --- configure.orig +++ configure @@ -15,7 +17,24 @@ Index: configure # Use this before starting a check echocheck() { echo "============ Checking for $@ ============" >> "$TMPLOG" -@@ -1521,39 +1528,39 @@ echo configuration: $configuration > "$TMPLOG" +@@ -694,6 +701,7 @@ _mplayer=yes + _x11=auto + _xshape=auto + _xss=auto ++_xcb_shm=auto + _dga1=auto + _dga2=auto + _xv=auto +@@ -1042,6 +1050,8 @@ for ac_option do + --disable-xshape) _xshape=no ;; + --enable-xss) _xss=yes ;; + --disable-xss) _xss=no ;; ++ --enable-xcb_shm) _xcb_shm=yes ;; ++ --disable-xcb-shm) _xcb_shm=no ;; + --enable-xv) _xv=yes ;; + --disable-xv) _xv=no ;; + --enable-vda) _vda=yes ;; +@@ -1521,39 +1531,39 @@ echo configuration: $configuration > "$TMPLOG" echo >> "$TMPLOG" @@ -87,7 +106,7 @@ Index: configure list_subparts() { test ! -e ffmpeg/libav${3} && return 1 pattern="s/^[^#]*${1}.*([^ ,]*, *\([^ ,)]*\).*/\1_${2}/p" -@@ -1990,7 +1997,10 @@ fi +@@ -1990,7 +2000,10 @@ fi if arm ; then cc_check && host_arch=aarch64 || host_arch=arm fi @@ -98,7 +117,7 @@ Index: configure echo "Detected operating system: $system_name" echo "Detected host architecture: $host_arch" -@@ -2544,7 +2554,7 @@ case "$host_arch" in +@@ -2544,7 +2557,7 @@ case "$host_arch" in arch='sparc' iproc='sparc' if test "$host_arch" = "sparc64" ; then @@ -107,7 +126,7 @@ Index: configure proc='ultrasparc' def_fast_64bit='#define HAVE_FAST_64BIT 1' elif sunos ; then -@@ -2846,7 +2856,14 @@ EOF +@@ -2846,7 +2859,14 @@ EOF arch='arc' iproc='arc' ;; @@ -122,7 +141,7 @@ Index: configure *) echo "The architecture of your CPU ($host_arch) is not supported by this configure script" echo "It seems nobody has ported MPlayer to your OS or CPU type yet." -@@ -2920,7 +2937,7 @@ cat > $TMPC << EOF +@@ -2920,7 +2940,7 @@ cat > $TMPC << EOF int ff_extern; EOF cc_check -c || die "Symbol mangling check failed." @@ -131,7 +150,7 @@ Index: configure extern_prefix=${sym%%ff_extern*} def_extern_asm="#define EXTERN_ASM $extern_prefix" def_extern_prefix="#define EXTERN_PREFIX \"$extern_prefix\"" -@@ -2985,7 +3002,7 @@ else +@@ -2985,7 +3005,7 @@ else fi CFLAGS="-D_ISOC99_SOURCE -I. -Iffmpeg $CFLAGS" @@ -140,7 +159,7 @@ Index: configure # On glibc, add some more CPPFLAGS for enabling required functionality. cpp_condition_check features.h "defined __GLIBC__" && -@@ -3066,7 +3083,7 @@ elif test $relocatable = "yes" ; then +@@ -3066,7 +3086,7 @@ elif test $relocatable = "yes" ; then fi echores $relocatable @@ -149,7 +168,27 @@ Index: configure # Checking assembler (_as) compatibility... # Added workaround for older as that reads from stdin by default - atmos as_version=$(echo '' | $_as -version 2>&1 | sed -n 's/^.*assembler \(version \)*\([0-9.]*\).*$/\2/p') -@@ -6338,12 +6355,16 @@ fi #if irix +@@ -4982,6 +5002,19 @@ else + fi + echores "$_x11" + ++echocheck "xcb shm extension" ++if test "$_xcb_shm" = auto ; then ++ _xcb_shm=no ++ statement_check "xcb/shm.h" 'xcb_shm_query_version(NULL)' -lX11-xcb -lxcb-shm -lxcb && _xcb_shm=yes ++fi ++if test "$_xcb_shm" = yes ; then ++ def_xcb_shm='#define CONFIG_XCB_SHM 1' ++ libs_mplayer="$libs_mplayer -lX11-xcb -lxcb-shm -lxcb" ++else ++ def_xcb_shm='#undef CONFIG_XCB_SHM' ++fi ++echores "$_xcb_shm" ++ + echocheck "Xss screensaver extensions" + if test "$_xss" = auto ; then + _xss=no +@@ -6338,12 +6371,16 @@ fi #if irix echocheck "sndio audio" if test "$_sndio" = auto ; then _sndio=no @@ -168,7 +207,7 @@ Index: configure else def_sndio='#undef CONFIG_SNDIO_AUDIO' noaomodules="sndio $noaomodules" -@@ -6526,7 +6547,7 @@ echocheck "cdparanoia" +@@ -6526,7 +6563,7 @@ echocheck "cdparanoia" if test "$_cdparanoia" = auto ; then _cdparanoia=no for inc_tmp in "" "-I/usr/include/cdda" "-I/usr/local/include/cdda" ; do @@ -177,7 +216,7 @@ Index: configure _cdparanoia=yes && extra_cflags="$extra_cflags $inc_tmp" && break done fi -@@ -8417,6 +8438,7 @@ extra_ldflags="$extra_ldflags $libm" +@@ -8417,6 +8454,7 @@ extra_ldflags="$extra_ldflags $libm" # XML documentation tests echocheck "XML catalogs" for try_catalog in \ @@ -185,7 +224,7 @@ Index: configure /etc/sgml/catalog \ /usr/share/xml/docbook/*/catalog.xml \ /opt/local/share/xml/docbook-xml/*/catalog.xml \ -@@ -8444,6 +8466,7 @@ fi +@@ -8444,6 +8482,7 @@ fi echocheck "XML chunked stylesheet" for try_chunk_xsl in \ @@ -193,7 +232,7 @@ Index: configure /usr/share/xml/docbook/*/html/chunk.xsl \ /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/chunk.xsl \ /usr/share/sgml/docbook/yelp/docbook/html/chunk.xsl \ -@@ -8469,6 +8492,7 @@ fi +@@ -8469,6 +8508,7 @@ fi echocheck "XML monolithic stylesheet" for try_docbook_xsl in \ @@ -201,7 +240,7 @@ Index: configure /usr/share/xml/docbook/*/html/docbook.xsl \ /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/docbook.xsl \ /usr/share/sgml/docbook/yelp/docbook/html/docbook.xsl \ -@@ -8522,6 +8546,7 @@ EOF +@@ -8522,6 +8562,7 @@ EOF echocheck "XML DTD" #FIXME: This should prefer higher version numbers, not the other way around .. for try_dtd in \ @@ -209,7 +248,15 @@ Index: configure /usr/share/xml/docbook/*/dtd/4*/docbookx.dtd \ /usr/share/xml/docbook/*/docbookx.dtd \ /usr/share/sgml/docbook/*/docbookx.dtd \ -@@ -9732,9 +9757,6 @@ cmp -s "$TMPH" config.h || mv -f "$TMPH" config.h +@@ -9433,6 +9474,7 @@ $def_xf86keysym + $def_xinerama + $def_xmga + $def_xss ++$def_xcb_shm + $def_xv + $def_xvr100 + $def_yuv4mpeg +@@ -9732,9 +9774,6 @@ cmp -s "$TMPH" config.h || mv -f "$TMPH" config.h ############################################################################ @@ -219,7 +266,7 @@ Index: configure # Create avconfig.h for FFmpeg. cat > "$TMPH" << EOF /* Generated by mpconfigure */ -@@ -9827,8 +9849,6 @@ print_enabled_components libavformat/demuxer_list.c AV +@@ -9827,8 +9866,6 @@ print_enabled_components libavformat/demuxer_list.c AV print_enabled_components libavformat/muxer_list.c AVOutputFormat muxer_list $libavmuxers print_enabled_components libavformat/protocol_list.c URLProtocol url_protocols $libavprotocols print_enabled_filters libavfilter/filter_list.c AVFilter filter_list $libavfilters Index: patches/patch-libvo_vo_x11_c =================================================================== RCS file: /local/cvs/ports/x11/mplayer/patches/patch-libvo_vo_x11_c,v diff -u -p -u -r1.1 patch-libvo_vo_x11_c --- patches/patch-libvo_vo_x11_c 2 Dec 2024 06:14:53 -0000 1.1 +++ patches/patch-libvo_vo_x11_c 15 Dec 2024 17:56:23 -0000 @@ -1,15 +1,117 @@ -Revert "Use appropriate shared memory permissions." -r38419 +Implement XShm 1.2 Index: libvo/vo_x11.c --- libvo/vo_x11.c.orig +++ libvo/vo_x11.c -@@ -150,7 +150,7 @@ static void getMyXImage(void) +@@ -38,7 +38,11 @@ + #ifdef HAVE_SHM + #include <sys/ipc.h> + #include <sys/shm.h> ++#include <sys/mman.h> + #include <X11/extensions/XShm.h> ++#include <X11/Xlib-xcb.h> ++#include <xcb/shm.h> ++#include <unistd.h> + + static int Shmem_Flag; + +@@ -78,7 +82,9 @@ static unsigned char *ImageDataOrig; + static XImage *myximage = NULL; + static int depth, bpp; + static XWindowAttributes attribs; +- ++#ifdef HAVE_SHM ++static char myshmname[128]; ++#endif + static int int_pause; + + static int Flip_Flag; +@@ -123,9 +129,23 @@ static int dst_width; + + static XVisualInfo vinfo; + ++#ifdef HAVE_SHM ++static Bool XShmAttachFd(Display *dpy, XShmSegmentInfo *shminfo) ++{ ++ xcb_connection_t *xcb_conn = XGetXCBConnection(dpy); ++ ++ shminfo->shmseg = xcb_generate_id(xcb_conn); ++ xcb_shm_attach_fd(xcb_conn, shminfo->shmseg, ++ shminfo->shmid, shminfo->readOnly); ++ return 1; ++} ++#endif ++ + static void getMyXImage(void) + { + #ifdef HAVE_SHM ++ size_t len; ++ + if (mLocalDisplay && XShmQueryExtension(mDisplay)) + Shmem_Flag = 1; + else +@@ -148,33 +168,40 @@ static void getMyXImage(void) + "Shared memory error,disabling ( Ximage error )\n"); + goto shmemerror; } - Shminfo[0].shmid = shmget(IPC_PRIVATE, - myximage->bytes_per_line * +- Shminfo[0].shmid = shmget(IPC_PRIVATE, +- myximage->bytes_per_line * - myximage->height, IPC_CREAT | SHM_R | SHM_W); -+ myximage->height, IPC_CREAT | 0777); - if (Shminfo[0].shmid < 0) +- if (Shminfo[0].shmid < 0) ++ memcpy(myshmname, "/tmp/tshm-XXXXXXXXXX", sizeof(myshmname)); ++ Shminfo[0].shmid = shm_mkstemp(myshmname); ++ if (Shminfo[0].shmid < 0) { XDestroyImage(myximage); + mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno)); + //perror( strerror( errno ) ); + mp_msg(MSGT_VO, MSGL_WARN, +- "Shared memory error,disabling ( seg id error )\n"); ++ "Shared memory error,disabling ( shm_open error )\n"); + goto shmemerror; + } +- Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0); +- +- if (Shminfo[0].shmaddr == ((char *) -1)) ++ len = myximage->bytes_per_line * myximage->height; ++ ++ Shminfo[0].shmaddr = mmap(NULL, len, PROT_READ | PROT_WRITE, ++ MAP_SHARED|__MAP_NOFAULT, Shminfo[0].shmid, 0); ++ ++ if (Shminfo[0].shmaddr == MAP_FAILED) + { + XDestroyImage(myximage); +- if (Shminfo[0].shmaddr != ((char *) -1)) +- shmdt(Shminfo[0].shmaddr); + mp_msg(MSGT_VO, MSGL_WARN, +- "Shared memory error,disabling ( address error )\n"); ++ "Shared memory error,disabling ( mmap error )\n"); + goto shmemerror; + } ++ if (ftruncate(Shminfo[0].shmid, len) == -1) ++ { ++ XDestroyImage(myximage); ++ mp_msg(MSGT_VO, MSGL_WARN, ++ "Shared memory error,disabling ( fruncate error )\n"); ++ goto shmemerror; ++ } + myximage->data = Shminfo[0].shmaddr; + ImageData = (unsigned char *) myximage->data; + Shminfo[0].readOnly = False; +- XShmAttach(mDisplay, &Shminfo[0]); ++ XShmAttachFd(mDisplay, &Shminfo[0]); + + XSync(mDisplay, False); + +@@ -218,9 +245,10 @@ static void freeMyXImage(void) + #ifdef HAVE_SHM + if (Shmem_Flag) + { ++ close(Shminfo[0].shmid); ++ shm_unlink(myshmname); + XShmDetach(mDisplay, &Shminfo[0]); + XDestroyImage(myximage); +- shmdt(Shminfo[0].shmaddr); + } else + #endif + { Index: patches/patch-libvo_vo_xv_c =================================================================== RCS file: /local/cvs/ports/x11/mplayer/patches/patch-libvo_vo_xv_c,v diff -u -p -u -r1.1 patch-libvo_vo_xv_c --- patches/patch-libvo_vo_xv_c 2 Dec 2024 06:14:53 -0000 1.1 +++ patches/patch-libvo_vo_xv_c 15 Dec 2024 17:56:23 -0000 @@ -1,15 +1,78 @@ -Revert "Use appropriate shared memory permissions." -r38419 +Implement XShm 1.2 Index: libvo/vo_xv.c --- libvo/vo_xv.c.orig +++ libvo/vo_xv.c -@@ -279,7 +279,7 @@ static void allocate_xvimage(int foo) +@@ -74,7 +74,11 @@ const LIBVO_EXTERN(xv) + #ifdef HAVE_SHM + #include <sys/ipc.h> + #include <sys/shm.h> ++#include <sys/mman.h> + #include <X11/extensions/XShm.h> ++#include <X11/Xlib-xcb.h> ++#include <xcb/shm.h> ++#include <unistd.h> + + static XShmSegmentInfo Shminfo[NUM_BUFFERS]; + static int Shmem_Flag; +@@ -97,6 +101,9 @@ static int num_buffers = 1; // default + static int visible_buf = -1; // -1 means: no buffer was drawn yet + static XvImage *xvimage[NUM_BUFFERS]; + ++#ifdef HAVE_SHM ++static char myshmname[128]; ++#endif + + static uint32_t image_width; + static uint32_t image_height; +@@ -110,6 +117,18 @@ static uint32_t max_width = 0, max_height = 0; // zero + + static vo_draw_alpha_func draw_alpha_func; + ++#ifdef HAVE_SHM ++static Bool XShmAttachFd(Display *dpy, XShmSegmentInfo *shminfo) ++{ ++ xcb_connection_t *xcb_conn = XGetXCBConnection(dpy); ++ ++ shminfo->shmseg = xcb_generate_id(xcb_conn); ++ xcb_shm_attach_fd(xcb_conn, shminfo->shmseg, ++ shminfo->shmid, shminfo->readOnly); ++ return 1; ++} ++#endif ++ + static void fixup_osd_position(int *x0, int *y0, int *w, int *h) + { + *x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x); +@@ -278,15 +297,18 @@ static void allocate_xvimage(int foo) + NULL, image_width, image_height, &Shminfo[foo]); - Shminfo[foo].shmid = +- Shminfo[foo].shmid = - shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | SHM_R | SHM_W); -+ shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777); - Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); +- Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); ++ memcpy(myshmname, "/tmp/tshm-XXXXXXXXXX", sizeof(myshmname)); ++ Shminfo[foo].shmid = shm_mkstemp(myshmname); ++ Shminfo[foo].shmaddr = mmap(NULL, xvimage[foo]->data_size, ++ PROT_READ | PROT_WRITE, MAP_SHARED|__MAP_NOFAULT, ++ Shminfo[0].shmid, 0); ++ ftruncate(Shminfo[0].shmid, xvimage[foo]->data_size); Shminfo[foo].readOnly = False; + xvimage[foo]->data = Shminfo[foo].shmaddr; +- XShmAttach(mDisplay, &Shminfo[foo]); ++ XShmAttachFd(mDisplay, &Shminfo[foo]); + XSync(mDisplay, False); +- shmctl(Shminfo[foo].shmid, IPC_RMID, 0); ++ shm_unlink(myshmname); + } else + #endif + { +@@ -306,6 +328,7 @@ static void deallocate_xvimage(int foo) + if (Shmem_Flag) + { + XShmDetach(mDisplay, &Shminfo[foo]); ++ close(Shminfo[foo].shmid); + shmdt(Shminfo[foo].shmaddr); + } else + #endif -- Matthieu Herrb