El 1/9/23 a las 9:00, Rafael Sadowski escribió:
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



Hi! From my ignorance I have the following question:

Is it likely that this SHM problem in QT5, has some strange interaction with PyQT5, programs that need access to SHM under certain conditions and the death of a Xenocara session?

You see, I have opened this bug:

https://marc.info/?l=openbsd-bugs&m=169362096621051&w=2

It appears only under very specific conditions. Example: you run a software with PyQT5 using QTMultimedia (either to play music or video), and Xenocara dies instantly. I suspect this bug is related to the handling of SHM and XCB in QT5, and the interaction these two elements have with Xenocara/DRM in OpenBSD.

@Raphael, I understand that you have QT5 patched with this more permissive mode for SHM (0666), correct? Would it be too much trouble to try to install and run picard (2.8.5p0 in packages/ports) and test if with this mode the Xenocara crash problem appears or not?

This way we verify if the picard crash is due to the very restrictive mode in QT5 SHM, and at the same time, we have a reason for a patch to make it less restrictive, like the one you mentioned.

Thanks!

Reply via email to