libsdl-org / sdl12-compat

An SDL-1.2 compatibility layer that uses SDL 2.0 behind the scenes.
Other
197 stars 40 forks source link

pink-pony: Segfault on startup #259

Closed smcv closed 1 year ago

smcv commented 2 years ago

Prerequisites:

To reproduce:

Expected result: it runs

Actual result: Real SDL 1.2 works. With sdl12-compat it segfaults during startup:

(gdb) thread apply all bt

Thread 3 (Thread 0x7fa562bff640 (LWP 20903)):
#0  0x00007fa56d2fe426 in __ppoll (fds=0x557f41263d70, nfds=2, timeout=<optimized out>, sigmask=sigmask@entry=0x0) at ../sysdeps/unix/sysv/linux/ppoll.c:42
#1  0x00007fa56c4b1029 in ppoll (__ss=0x0, __timeout=<optimized out>, __nfds=<optimized out>, __fds=<optimized out>) at /usr/include/x86_64-linux-gnu/bits/poll2.h:64
#2  pa_mainloop_poll (m=m@entry=0x557f41291270) at ../src/pulse/mainloop.c:871
#3  0x00007fa56c4b1606 in pa_mainloop_iterate (m=0x557f41291270, block=<optimized out>, retval=0x0) at ../src/pulse/mainloop.c:945
#4  0x00007fa56c711422 in PULSEAUDIO_PlayDevice (this=0x557f41290cf0) at ./src/audio/pulseaudio/SDL_pulseaudio.c:399
#5  0x00007fa56c643f5d in SDL_RunAudio (devicep=devicep@entry=0x557f41290cf0) at ./src/audio/SDL_audio.c:781
#6  0x00007fa56c6ade65 in SDL_RunThread (thread=0x557f41290da0) at ./src/thread/SDL_thread.c:303
#7  0x00007fa56c745c49 in RunThread (data=<optimized out>) at ./src/thread/pthread/SDL_systhread.c:77
#8  0x00007fa56d28784a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#9  0x00007fa56d30b2cc in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 2 (Thread 0x7fa56afff640 (LWP 20902)):
#0  0x00007fa56d2fe426 in __ppoll (fds=0x557f412638b0, nfds=2, timeout=<optimized out>, sigmask=sigmask@entry=0x0) at ../sysdeps/unix/sysv/linux/ppoll.c:42
#1  0x00007fa56c4b1029 in ppoll (__ss=0x0, __timeout=<optimized out>, __nfds=<optimized out>, __fds=<optimized out>) at /usr/include/x86_64-linux-gnu/bits/poll2.h:64
#2  pa_mainloop_poll (m=m@entry=0x557f41261910) at ../src/pulse/mainloop.c:871
#3  0x00007fa56c4b1606 in pa_mainloop_iterate (m=m@entry=0x557f41261910, block=block@entry=1, retval=retval@entry=0x0) at ../src/pulse/mainloop.c:945
#4  0x00007fa56c4b16b0 in pa_mainloop_run (m=0x557f41261910, retval=0x0) at ../src/pulse/mainloop.c:963
#5  0x00007fa56c7117ef in HotplugThread (data=data@entry=0x0) at ./src/audio/pulseaudio/SDL_pulseaudio.c:841
#6  0x00007fa56c6ade65 in SDL_RunThread (thread=0x557f41291070) at ./src/thread/SDL_thread.c:303
#7  0x00007fa56c745c49 in RunThread (data=<optimized out>) at ./src/thread/pthread/SDL_systhread.c:77
#8  0x00007fa56d28784a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#9  0x00007fa56d30b2cc in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

Thread 1 (Thread 0x7fa56b2f7880 (LWP 20901)):
#0  _dlfo_mappings_segment_count_allocated (seg=0xbdb2b000bd979000) at ./elf/dl-find_object.c:151
#1  _dl_find_object_update_1 (count=<optimized out>, loaded=0x557f4124c370) at ./elf/dl-find_object.c:667
#2  _dl_find_object_update (new_map=new_map@entry=0x557f41315230) at ./elf/dl-find_object.c:805
#3  0x00007fa56e3e85c8 in dl_open_worker_begin (a=a@entry=0x7ffefcebafb0) at ./elf/dl-open.c:735
#4  0x00007fa56d350e70 in __GI__dl_catch_exception (exception=exception@entry=0x7ffefcebae10, operate=operate@entry=0x7fa56e3e8200 <dl_open_worker_begin>, args=args@entry=0x7ffefcebafb0) at ./elf/dl-error-skeleton.c:208
#5  0x00007fa56e3e7a66 in dl_open_worker (a=a@entry=0x7ffefcebafb0) at ./elf/dl-open.c:782
#6  0x00007fa56d350e70 in __GI__dl_catch_exception (exception=exception@entry=0x7ffefcebaf90, operate=operate@entry=0x7fa56e3e7a30 <dl_open_worker>, args=args@entry=0x7ffefcebafb0) at ./elf/dl-error-skeleton.c:208
#7  0x00007fa56e3e7e48 in _dl_open (file=<optimized out>, mode=<optimized out>, caller_dlopen=0x7fa56af83e8e <loader_open_driver_lib+190>, nsid=-2, argc=2, argv=0x7ffefcebddd8, env=0x7ffefcebddf0) at ./elf/dl-open.c:886
#8  0x00007fa56d2839e8 in dlopen_doit (a=a@entry=0x7ffefcebb220) at ./dlfcn/dlopen.c:56
#9  0x00007fa56d350e70 in __GI__dl_catch_exception (exception=exception@entry=0x7ffefcebb180, operate=<optimized out>, args=<optimized out>) at ./elf/dl-error-skeleton.c:208
#10 0x00007fa56d350f2f in __GI__dl_catch_error (objname=0x7ffefcebb1d8, errstring=0x7ffefcebb1e0, mallocedp=0x7ffefcebb1d7, operate=<optimized out>, args=<optimized out>) at ./elf/dl-error-skeleton.c:227
#11 0x00007fa56d2834c6 in _dlerror_run (operate=operate@entry=0x7fa56d283990 <dlopen_doit>, args=args@entry=0x7ffefcebb220) at ./dlfcn/dlerror.c:138
#12 0x00007fa56d283aa1 in dlopen_implementation (dl_caller=<optimized out>, mode=<optimized out>, file=<optimized out>) at ./dlfcn/dlopen.c:71
#13 ___dlopen (file=<optimized out>, mode=<optimized out>) at ./dlfcn/dlopen.c:81
#14 0x00007fa56af83e8e in loader_open_driver_lib (driver_name=driver_name@entry=0x557f4131d300 "radeonsi", lib_suffix=lib_suffix@entry=0x7fa56af90a40 "_dri", search_path_vars=search_path_vars@entry=0x7fa56afa4790 <search_path_vars>, default_search_path=default_search_path@entry=0x7fa56af909a0 "/usr/lib/x86_64-linux-gnu/dri:\\$${ORIGIN}/dri:/usr/lib/dri", warn_on_fail=warn_on_fail@entry=true) at ../src/loader/loader.c:636
#15 0x00007fa56af84029 in loader_open_driver (driver_name=driver_name@entry=0x557f4131d300 "radeonsi", out_driver_handle=out_driver_handle@entry=0x557f412e29a8, search_path_vars=search_path_vars@entry=0x7fa56afa4790 <search_path_vars>) at ../src/loader/loader.c:679
#16 0x00007fa56af62e40 in driOpenDriver (driverName=driverName@entry=0x557f4131d300 "radeonsi", out_driver_handle=out_driver_handle@entry=0x557f412e29a8) at ../src/glx/dri_common.c:86
#17 0x00007fa56af792ea in dri3_create_screen (screen=0, priv=0x557f412e0460) at ../src/glx/dri3_glx.c:889
#18 0x00007fa56af6ada9 in AllocAndFetchScreenConfigs (priv=0x557f412e0460, dpy=0x557f412373c0) at ../src/glx/glxext.c:839
#19 __glXInitialize (dpy=dpy@entry=0x557f412373c0) at ../src/glx/glxext.c:973
#20 0x00007fa56af67657 in GetGLXPrivScreenConfig (ppsc=<synthetic pointer>, ppriv=<synthetic pointer>, scrn=0, dpy=0x557f412373c0) at ../src/glx/glxcmds.c:173
#21 glXQueryExtensionsString (dpy=0x557f412373c0, screen=0) at ../src/glx/glxcmds.c:1323
#22 0x00007fa56e25faa7 in extensionSupportedGLX (extension=0x7fa56e283526 "GLX_EXT_swap_control") at ./src/glx_context.c:211
#23 _glfwInitGLX () at ./src/glx_context.c:362
#24 0x00007fa56e25c4e5 in _glfwPlatformCreateWindow (window=window@entry=0x557f412bc030, wndconfig=wndconfig@entry=0x7ffefcebc540, ctxconfig=ctxconfig@entry=0x7ffefcebc4b0, fbconfig=fbconfig@entry=0x7ffefcebc4f0) at ./src/x11_window.c:1971
#25 0x00007fa56e2541ac in glfwCreateWindow (width=800, height=600, title=<optimized out>, monitor=0x0, share=<optimized out>) at ./src/window.c:218
#26 0x0000557f3fb18419 in main(int, char**) (argc=<optimized out>, argv=<optimized out>) at src/main.cc:57
icculus commented 2 years ago

This one is using glfw to create a window (and is failing because it's trying to use glX...?) ... maybe it only uses SDL for audio?

smcv commented 2 years ago

I think I was getting a segfault whether I used SDL_VIDEODRIVER=wayland or not, although possibly not exactly the same backtrace.

smcv commented 2 years ago

maybe it only uses SDL for audio?

Looks that way. I wonder why real SDL 1.2 vs. sdl12-compat even matters here?

icculus commented 1 year ago

Looks like SDL is corrupting memory right near what glfw is using:

==489511== Invalid write of size 8
==489511==    at 0x5D7F18A: _mm_store_ps (xmmintrin.h:976)
==489511==    by 0x5D7F18A: SDL_Convert_S16_to_F32_SSE2 (SDL_audiotypecvt.c:444)
==489511==    by 0x5D7B21F: SDL_ConvertAudio_REAL (SDL_audiocvt.c:275)
==489511==    by 0x5D91A35: SDL_ConvertAudio (SDL_dynapi_procs.h:123)
==489511==    by 0x4E73CB7: SDL_ConvertAudio (SDL12_compat.c:9355)
==489511==    by 0x4E10884: mad_getSamples (in /usr/lib/x86_64-linux-gnu/libSDL_mixer-1.2.so.0.12.0)
==489511==    by 0x4E09C2D: music_mixer (in /usr/lib/x86_64-linux-gnu/libSDL_mixer-1.2.so.0.12.0)
==489511==    by 0x4E03097: ??? (in /usr/lib/x86_64-linux-gnu/libSDL_mixer-1.2.so.0.12.0)
==489511==    by 0x4E72D97: AudioCallbackWrapper (SDL12_compat.c:9005)
==489511==    by 0x5D71001: SDL_RunAudio (SDL_audio.c:755)
==489511==    by 0x5E224B7: SDL_RunThread (SDL_thread.c:305)
==489511==    by 0x5FFDDBB: RunThread (SDL_systhread.c:77)
==489511==    by 0x5270B42: start_thread (pthread_create.c:442)
==489511==  Address 0x70281f0 is 16 bytes before a block of size 2,968 alloc'd
==489511==    at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==489511==    by 0x4D64506: glfwCreateWindow (in /usr/lib/x86_64-linux-gnu/libglfw.so.3.3)
==489511==    by 0x115D97: main (in /usr/lib/pink-pony/pink-pony.bin)

(and several more of those.)

I'll need to look at this more closely, but that's the likely culprit.

slouken commented 1 year ago

We have an audio conversion corruption on the list to look at for 2.26, right @icculus? I think we should probably look at this soon and get it out for 2.24.2 if we can.

icculus commented 1 year ago

Agreed.

smcv commented 1 year ago

Confirmed fixed in 1.2.64.