On Sat Jul 22, 2023 at 07:51:15AM +0200, Matthieu Herrb wrote:
> On Thu, Jul 20, 2023 at 08:32:30PM +0200, Rafael Sadowski wrote:
> > On Thu Jul 20, 2023 at 04:31:55PM +0100, Stuart Henderson wrote:
> > > On 2023/07/20 17:27, Rafael Sadowski wrote:
> > > > Let's start with a quote from an old try:
> > > >
> > > > "Our Xorg server doesn't run under the same uid as the client, the 
> > > > client
> > > > needs to create the shared memory area with mode 0666.
> > > >
> > > > We are doing the same in misc/screen-shm. Of course, the consequence
> > > > here would be to do it for all Qt applications."
> > > >
> > > > -- https://marc.info/?l=openbsd-ports&m=167110468109188&w=2
> > > >
> > > > There was a veto from sthen@, which was perfectly okay and right.  For
> > > > error analysis and to exclude that this function is not used, I need the
> > > > shm mode from time to time. I would like to solve it with an environment
> > > > variable (QT_OPENBSD_SHM_MODE).
> > >
> > > From that mail,
> > >
> > > "What are the consequences of leaving this as-is? (i.e. what's broken
> > > now that changing this would fix?)"
> > >
> >
> > Nothing is broken and nothing is would fix for now. It just helps me to
> > debug Qt application or large ecosystem like KDE plasma. When I increase
> > the debug level I see that shm could not be init and therefore I can not
> > exclude that exactly this is a problem.
> >
> > Long story short: It helps me not to always have to build Qt myself.
> >
>
> Are there still places in the Qt library that don't use
> xcb_shm_attach_fd() to attach shared memory segments to the X server ?

No, it looks like they are using this pattern:

It starts here:

   286     if (!QXcbBackingStore::createSystemVShmSegment(m_xcbConnection)) {
   287         qCDebug(lcQpaXcb, "failed to create System V shared memory 
segment (remote "
   288                           "X11 connection?), disabling SHM");
   289         m_hasShm = m_hasShmFd = false;
   290     }

   409 bool QXcbBackingStoreImage::createSystemVShmSegment(xcb_connection_t *c, 
size_t segmen
   410                                                     
xcb_shm_segment_info_t *shmInfo)
   411 {
   412    const int id = shmget(IPC_PRIVATE, segmentSize, IPC_CREAT | 0600);
   413     if (id == -1) {
   414         qCWarning(lcQpaXcb, "shmget() failed (%d: %s) for size %zu", 
errno, strerror(e
   415         return false;
   416     }
   417
   418     void *addr = shmat(id, nullptr, 0);
   419     if (addr == (void *)-1) {
   420         qCWarning(lcQpaXcb, "shmat() failed (%d: %s) for id %d", errno, 
strerror(errno
   421         return false;
   422     }
   423
   424     if (shmctl(id, IPC_RMID, nullptr) == -1)
   425         qCWarning(lcQpaXcb, "Error while marking the shared memory 
segment to be destr
   426
   427     const auto seg = xcb_generate_id(c);
   428     auto cookie = xcb_shm_attach_checked(c, seg, id, false);
   429     auto *error = xcb_request_check(c, cookie);
   430     if (error) {
   431         qCWarning(lcQpaXcb(), "xcb_shm_attach() failed");


Or in sort:

412     const int id = shmget(IPC_PRIVATE, segmentSize, IPC_CREAT | 0600);
425     const auto seg = xcb_generate_id(c);
426     auto cookie = xcb_shm_attach_checked(c, seg, id, false);
427     auto *error = xcb_request_check(c, cookie);

431         qCWarning(lcQpaXcb(), "xcb_shm_attach() failed");

https://github.com/qt/qtbase/blob/5.15/src/plugins/platforms/xcb/qxcbbackingstore.cpp#L424

There is no different path for Linux/FreeBSD here.


>
> This was introduced more than 10 years ago, so that if the X server is
> not running as root it can still access shared memory segments created
> by the clients, possibly running as a different uid as the server, and
> preserving the privacy of the shm contents.
>
> In that case 600 is perfectly fine and applications don't need to
> fallback on non-shm based transports.
>
> If Qt is using xcb_shm_attach() or XShmAttach() is that only on
> OpenBSD because it thinks OpenBSD doesn't have xcb_shm_attach_fd(),i
> ot is it the same on Linux ? (since Linux is not running X as root
> anymore either whith systemd, they would face the same issues as you).


$ dolphin # OpenBSD with ports qtbase
qt.scaling: Apply  QT_SCALE_FACTOR 1
qt.qpa.xcb: Has MIT-SHM     : true
qt.qpa.xcb: Has MIT-SHM FD  : true
qt.qpa.xcb: xcb_shm_attach() failed
qt.qpa.xcb: failed to create System V shared memory segment (remote X11 
connection?), disabling SHM
qt.qpa.xcb: Using XInput version 2.2

$ dolphin # Linux Debian sid
qt.qpa.xcb: Has MIT-SHM     : true
qt.qpa.xcb: Has MIT-SHM FD  : true
qt.qpa.xcb: Using XInput version 2.2

>
> PS: I remember we once noticed that mesa was also not using
> xcb_shm_attach_fd() on OpenBSD. I should have a look to confirm this,
> but I'm not available for the next 2 weeks to do that, sorry.
> --
> Matthieu Herrb
>

Reply via email to