Skip to content

AttributeError: BadRRModeError object has no attribute 'sequence_number' #259

@Penlect

Description

@Penlect

Dear maintainer,

tldr; An uncaught exception in parse_error_response() causes the next call to get_input_focus() to hang indefinitely with 100% CPU usage.

Details

OS: Debian Bookworm
Python version: 3.10.9
python3-xlib version: 0.33-1

The application I use calls win.get_full_property(self._NET_WM_NAME, 0) where win is instance of Window from drawable.py and self._NET_WM_NAME is 326.

The traceback is as follows:

Traceback (most recent call last):
  File "/usr/bin/keyd-application-mapper", line 156, in get_title
    x = win.get_full_property(self._NET_WM_NAME, 0).value
  File "/usr/lib/python3/dist-packages/Xlib/xobject/drawable.py", line 476, in get_full_property
    prop = self.get_property(property, property_type, sizehint,
  File "/usr/lib/python3/dist-packages/Xlib/xobject/drawable.py", line 455, in get_property
    r = request.GetProperty(display = self.display,
  File "/usr/lib/python3/dist-packages/Xlib/protocol/rq.py", line 1368, in __init__
    self.reply()
  File "/usr/lib/python3/dist-packages/Xlib/protocol/rq.py", line 1380, in reply
    self._display.send_and_recv(request = self._serial)
  File "/usr/lib/python3/dist-packages/Xlib/protocol/display.py", line 612, in send_and_recv
    gotreq = self.parse_response(request)
  File "/usr/lib/python3/dist-packages/Xlib/protocol/display.py", line 719, in parse_response
    gotreq = self.parse_error_response(request) or gotreq
  File "/usr/lib/python3/dist-packages/Xlib/protocol/display.py", line 745, in parse_error_response
    req = self.get_waiting_request(e.sequence_number)
AttributeError: 'BadRRModeError' object has no attribute 'sequence_number'

The BadRRModeError exception was added by disp.extension_add_error(BadRRMode, BadRRModeError) in Xlib/ext/randr.py and seems to be quite different from the other errors defined in Xlib/error.py and in particular the 'sequence_number' attribute does not exist.

The application I use logs this error and proceeds by calling dpy.next_event() and then dpy.dpy.get_input_focus() where dpy = Xlib.display.Display().

The last call hangs indefinitely with 100% CPU usage and seems to do so because of the previous BadRRModeError.

I used Python's faulthandler module to investigate where the code hangs (i.e. python3 -X faulthandler application.py and then sending SIGARBT to see where the main thread is). I did this several times and every time the thread was busy inside the send_and_recv() function in Xlib/protocol/display.py:

Current thread 0x00007f30fc5fe040 (most recent call first):
  File "/usr/lib/python3/dist-packages/Xlib/protocol/display.py", line 515 in send_and_recv
  File "/usr/lib/python3/dist-packages/Xlib/protocol/rq.py", line 1380 in reply
  File "/usr/lib/python3/dist-packages/Xlib/protocol/rq.py", line 1368 in __init__
  File "/usr/lib/python3/dist-packages/Xlib/display.py", line 607 in get_input_focus
  File "/usr/bin/keyd-application-mapper", line 200 in run
  File "/usr/bin/keyd-application-mapper", line 419 in <module>

Workaround

I'm not very familiar with python-xlib internals, so I still don't fully understand what is going on.

A temporary solution for my case is to simply remove the line disp.extension_add_error(BadRRMode, BadRRModeError) which instead causes the error to appear as:

Traceback (most recent call last):
  File "/usr/bin/keyd-application-mapper", line 174, in get_window_info
    return (cls[1], get_title(win))
  File "/usr/bin/keyd-application-mapper", line 155, in get_title
    raise err from None
  File "/usr/bin/keyd-application-mapper", line 153, in get_title
    title = win.get_full_property(self._NET_WM_NAME, 0).value.decode('utf8')
  File "/usr/lib/python3/dist-packages/Xlib/xobject/drawable.py", line 476, in get_full_property
    prop = self.get_property(property, property_type, sizehint,
  File "/usr/lib/python3/dist-packages/Xlib/xobject/drawable.py", line 455, in get_property
    r = request.GetProperty(display = self.display,
  File "/usr/lib/python3/dist-packages/Xlib/protocol/rq.py", line 1368, in __init__
    self.reply()
  File "/usr/lib/python3/dist-packages/Xlib/protocol/rq.py", line 1388, in reply
    raise self._error
Xlib.error.BadValue: <class 'Xlib.error.BadValue'>: code = 2, resource_id = 10, sequence_number = 4818, major_opcode = 20, minor_opcode = 0

which does not cause get_input_focus() to hang.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy