Skip to content

intel: Fix stack overflow in intel_dump_gpu

I get a stack overflow with the intel_dump_gpu tool, because the body of the intercepted ioctl function eventually calls ioctl itself. I've been able to reproduce this with the most recent commit to the tool in 2022 (a06f751e). I'm guessing that there's something about my environment that's causing the issue, and that most people using it aren't having issues. I could probably figure out the reason if I dig further, but the fix is pretty straightforward either way.

stack trace example
#0  get_subsystem_type (device_path=device_path@entry=0x7fffff800ed0 "/sys/dev/char/226:0/device")
    at ../xf86drm.c:3596
#1  0x00007ffff7af5a4a in drmParseSubsystemType (maj=maj@entry=226, min=min@entry=0)
    at ../xf86drm.c:3639
#2  0x00007ffff7af5bac in process_device (device=device@entry=0x7fffff804018,
    d_name=<optimized out>, req_subsystem_type=req_subsystem_type@entry=0,
    fetch_deviceinfo=fetch_deviceinfo@entry=true, flags=flags@entry=1) at ../xf86drm.c:4505
#3  0x00007ffff7af9759 in drmGetDeviceFromDevId (find_rdev=57984, flags=flags@entry=1,
    device=device@entry=0x7fffff804938) at ../xf86drm.c:4668
#4  0x00007ffff7af98a8 in drmGetDevice2 (fd=fd@entry=4, flags=flags@entry=1,
    device=device@entry=0x7fffff804938) at ../xf86drm.c:4730
#5  0x00007ffff7f97e5c in intel_get_device_info_from_fd (fd=4,
    devinfo=devinfo@entry=0x7ffff7fbf7c0 <devinfo>) at ../src/intel/dev/intel_device_info.c:1561
#6  0x00007ffff7f8b67c in ensure_device_info (fd=<optimized out>)
    at ../src/intel/tools/intel_dump_gpu.c:120
#7  ensure_device_info (fd=<optimized out>) at ../src/intel/tools/intel_dump_gpu.c:116
...
#68406 0x00007ffff7f98ab6 in intel_ioctl (arg=0x7ffffffeb9f0, request=3222299718, fd=4)
    at ../src/intel/common/intel_gem.h:83
#68407 getparam (fd=fd@entry=4, param=param@entry=51, value=value@entry=0x7ffffffeba54)
    at ../src/intel/dev/i915/intel_device_info.c:238
#68408 0x00007ffff7f99314 in intel_device_info_i915_get_info_from_fd (fd=fd@entry=4,
    devinfo=devinfo@entry=0x7ffff7fbf7c0 <devinfo>)
    at ../src/intel/dev/i915/intel_device_info.c:551
#68409 0x00007ffff7f97f17 in intel_get_device_info_from_fd (fd=4,
    devinfo=devinfo@entry=0x7ffff7fbf7c0 <devinfo>) at ../src/intel/dev/intel_device_info.c:1602
#68410 0x00007ffff7f8b67c in ensure_device_info (fd=<optimized out>)
    at ../src/intel/tools/intel_dump_gpu.c:120
#68411 ensure_device_info (fd=<optimized out>) at ../src/intel/tools/intel_dump_gpu.c:116
#68412 0x00007ffff7f8c495 in ioctl (fd=fd@entry=4, request=request@entry=3222299718)
    at ../src/intel/tools/intel_dump_gpu.c:537
#68413 0x00007ffff7f98ab6 in intel_ioctl (arg=0x7ffffffebd40, request=3222299718, fd=4)
    at ../src/intel/common/intel_gem.h:83
#68414 getparam (fd=fd@entry=4, param=param@entry=51, value=value@entry=0x7ffffffebda4)
    at ../src/intel/dev/i915/intel_device_info.c:238
#68415 0x00007ffff7f99314 in intel_device_info_i915_get_info_from_fd (fd=fd@entry=4,
    devinfo=devinfo@entry=0x7ffff7fbf7c0 <devinfo>)
    at ../src/intel/dev/i915/intel_device_info.c:551
#68416 0x00007ffff7f97f17 in intel_get_device_info_from_fd (fd=4,
    devinfo=devinfo@entry=0x7ffff7fbf7c0 <devinfo>) at ../src/intel/dev/intel_device_info.c:1602
#68417 0x00007ffff7f8b67c in ensure_device_info (fd=<optimized out>)
    at ../src/intel/tools/intel_dump_gpu.c:120
#68418 ensure_device_info (fd=<optimized out>) at ../src/intel/tools/intel_dump_gpu.c:116
#68419 0x00007ffff7f8c495 in ioctl (fd=fd@entry=4, request=request@entry=3222299718)
    at ../src/intel/tools/intel_dump_gpu.c:537
#68420 0x00007ffff7f8d8b6 in intel_ioctl (arg=0x7ffffffec080, request=3222299718, fd=4)
    at ../src/intel/common/intel_gem.h:83
#68421 i915_gem_get_param (fd=fd@entry=4, param=param@entry=4,
    value=value@entry=0x7ffff7fbf7a8 <device>) at ../src/intel/common/i915/intel_gem.c:256
#68422 0x00007ffff7f8d015 in intel_gem_get_param (fd=fd@entry=4, param=param@entry=4,
    value=value@entry=0x7ffff7fbf7a8 <device>) at ../src/intel/common/intel_gem.c:141
#68423 0x00007ffff7f8c253 in get_pci_id (pci_id=0x7ffff7fbf7a8 <device>, fd=4)
    at ../src/intel/tools/intel_dump_gpu.c:414
#68424 maybe_init (fd=<optimized out>) at ../src/intel/tools/intel_dump_gpu.c:478
#68425 ioctl (fd=fd@entry=4, request=request@entry=3225445376)
    at ../src/intel/tools/intel_dump_gpu.c:512
#68426 0x00007ffff7af6301 in drmIoctl (fd=fd@entry=4, request=request@entry=3225445376,
    arg=arg@entry=0x42afb0) at ../xf86drm.c:704
#68427 0x00007ffff7af6459 in drmGetVersion (fd=fd@entry=4) at ../xf86drm.c:1393
#68428 0x00007ffff7f627ac in loader_get_kernel_driver_name (fd=4) at ../src/loader/loader.c:108
#68429 0x00007ffff7f630e3 in loader_get_dri_config_driver (fd=<optimized out>)
    at ../src/loader/loader.c:212
#68430 loader_get_driver_for_fd (fd=4) at ../src/loader/loader.c:545
#68431 0x00007ffff7f58a43 in dri3_create_screen (screen=0, priv=0x416360)
    at ../src/glx/dri3_glx.c:829
#68432 0x00007ffff7f4a5c9 in AllocAndFetchScreenConfigs (priv=0x416360, dpy=0x408330)
    at ../src/glx/glxext.c:800
#68433 __glXInitialize (dpy=dpy@entry=0x408330) at ../src/glx/glxext.c:935
#68434 0x00007ffff7f463e4 in GetGLXPrivScreenConfig (ppsc=<synthetic pointer>,
    ppriv=<synthetic pointer>, scrn=0, dpy=0x408330) at ../src/glx/glxcmds.c:147
#68435 glXChooseVisual (dpy=0x408330, screen=0, attribList=0x7ffffffec6c0)
    at ../src/glx/glxcmds.c:1083
#68436 0x0000000000403367 in make_window.constprop ()
#68437 0x0000000000402561 in main ()

Merge request reports