We are currently migrating Bugzilla to GitHub issues.
Any changes made to the bug tracker now will be lost, so please do not post new bugs or make changes to them.
When we're done, all bug URLs will redirect to their equivalent location on the new bug tracker.

Bug 2925

Summary: X11-Related Memory Leak
Product: SDL Reporter: Eyal Kalderon <ebkalderon>
Component: videoAssignee: Sam Lantinga <slouken>
Status: RESOLVED INVALID QA Contact: Sam Lantinga <slouken>
Severity: normal    
Priority: P2 CC: icculus
Version: 2.0.3   
Hardware: x86_64   
OS: Linux   

Description Eyal Kalderon 2015-03-27 06:59:58 UTC
I compiled the following example OpenGL application from the GL Wiki using GCC: https://www.opengl.org/wiki/Tutorial1:_Creating_a_Cross_Platform_OpenGL_3.2_Context_in_SDL_%28C_/_SDL%29

When running the application within Valgrind, I receive quite a few errors from libX11.

==8482== Memcheck, a memory error detector
==8482== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==8482== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==8482== Command: ./a.out
==8482== 
==8482== Syscall param writev(vector[...]) points to uninitialised byte(s)
==8482==    at 0x5D9BBC0: __writev_nocancel (in /usr/lib/libc-2.21.so)
==8482==    by 0x9AC1CCA: ??? (in /usr/lib/libxcb.so.1.1.0)
==8482==    by 0x9AC20C0: ??? (in /usr/lib/libxcb.so.1.1.0)
==8482==    by 0x9AC2144: xcb_writev (in /usr/lib/libxcb.so.1.1.0)
==8482==    by 0x8F7C18D: _XSend (in /usr/lib/libX11.so.6.3.0)
==8482==    by 0x8F7C681: _XReply (in /usr/lib/libX11.so.6.3.0)
==8482==    by 0x8F67406: XInternAtom (in /usr/lib/libX11.so.6.3.0)
==8482==    by 0x5245E9B: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==    by 0x5246C8A: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==    by 0x523955F: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==    by 0x523936F: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==    by 0x51A15FE: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==  Address 0xa8cda73 is 35 bytes inside a block of size 16,384 alloc'd
==8482==    at 0x4C2C080: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8482==    by 0x8F6C4E1: XOpenDisplay (in /usr/lib/libX11.so.6.3.0)
==8482==    by 0x5244CB4: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==    by 0x5239330: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==    by 0x51A15FE: ??? (in /usr/lib/libSDL2-2.0.so.0.2.1)
==8482==    by 0x400BFD: main (in /home/ekaljuk/tmp/a.out)
==8482== 
==8482== Conditional jump or move depends on uninitialised value(s)
==8482==    at 0x79A9AF4: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794B0CD: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794DAFD: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A85F3A: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A899F7: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x79849BE: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7984D21: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A86641: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A94ECD: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x767DE45: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A9B2CB: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x75E99C0: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482== 
==8482== Syscall param write(buf) points to uninitialised byte(s)
==8482==    at 0x5D96550: __write_nocancel (in /usr/lib/libc-2.21.so)
==8482==    by 0x5D2DC3E: _IO_file_write@@GLIBC_2.2.5 (in /usr/lib/libc-2.21.so)
==8482==    by 0x5D2D2D2: new_do_write (in /usr/lib/libc-2.21.so)
==8482==    by 0x5D2EAC8: _IO_do_write@@GLIBC_2.2.5 (in /usr/lib/libc-2.21.so)
==8482==    by 0x5D2D1CF: _IO_file_sync@@GLIBC_2.2.5 (in /usr/lib/libc-2.21.so)
==8482==    by 0x5D23405: fflush (in /usr/lib/libc-2.21.so)
==8482==    by 0x7957EBB: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7959776: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7956E5B: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794B180: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794DAFD: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A85F3A: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==  Address 0x4053018 is not stack'd, malloc'd or (recently) free'd
==8482== 
==8482== Conditional jump or move depends on uninitialised value(s)
==8482==    at 0x79A9AF4: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794B0CD: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794D85F: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7AA878B: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7AA9FBC: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x79849BE: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7984D21: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7AA8FE0: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A95ED5: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x767DF52: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A9B2CB: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x75E99C0: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482== 
==8482== Conditional jump or move depends on uninitialised value(s)
==8482==    at 0x79A9AF4: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794B0CD: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x794BADC: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7AD2DA1: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7AD45D3: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x79849BE: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7984D21: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7AD30F5: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x7A9B353: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x75E99C0: ??? (in /usr/lib/libnvidia-glcore.so.346.47)
==8482==    by 0x400CD9: main (in /home/ekaljuk/tmp/a.out)
==8482== 
==8482== 
==8482== HEAP SUMMARY:
==8482==     in use at exit: 33,315 bytes in 435 blocks
==8482==   total heap usage: 14,841 allocs, 14,406 frees, 105,846,582 bytes allocated
==8482== 
==8482== LEAK SUMMARY:
==8482==    definitely lost: 184 bytes in 5 blocks
==8482==    indirectly lost: 0 bytes in 0 blocks
==8482==      possibly lost: 0 bytes in 0 blocks
==8482==    still reachable: 33,131 bytes in 430 blocks
==8482==         suppressed: 0 bytes in 0 blocks
==8482== Rerun with --leak-check=full to see details of leaked memory
==8482== 
==8482== For counts of detected and suppressed errors, rerun with: -v
==8482== Use --track-origins=yes to see where uninitialised values come from
==8482== ERROR SUMMARY: 15 errors from 5 contexts (suppressed: 0 from 0)

Note: Any output relating to libnvidia-glcore can be safely ignored. That is from the proprietary NVIDIA driver leaking video memory, as usual.

This was tested on an x86_64 Arch Linux machine using GCC 4.9.2 20150304 (prerelease).
Comment 1 Ryan C. Gordon 2015-03-28 05:54:51 UTC
This is a (tiny) leak in Xlib, unfortunately.

--ryan.
Comment 2 Ryan C. Gordon 2015-03-28 05:56:07 UTC
(In reply to Ryan C. Gordon from comment #1)
> This is a (tiny) leak in Xlib, unfortunately.

Um, sorry, not a leak. I meant a memory access bug.

--ryan.