astrand / xclip

Command line interface to the X11 clipboard
GNU General Public License v2.0
1.03k stars 73 forks source link

"xclip -o -sel clip" segfaults #131

Closed clbr closed 2 years ago

clbr commented 2 years ago

Today's git master.

$ valgrind xclip -o -sel clip
==4588== Memcheck, a memory error detector
==4588== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==4588== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==4588== Command: xclip -o -sel clip
==4588==
==4588== Conditional jump or move depends on uninitialised value(s)
==4588==    at 0x4C221C1: free (in /opt/valgrind/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4588==    by 0x40430F: main (in /usr/bin/xclip)
==4588==
==4588== Invalid free() / delete / delete[] / realloc()
==4588==    at 0x4C2220F: free (in /opt/valgrind/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4588==    by 0x40430F: main (in /usr/bin/xclip)
==4588==  Address 0x4016db is not stack'd, malloc'd or (recently) free'd
==4588==
xclip: Error: There is no owner for the CLIPBOARD selection
==4588==
==4588== HEAP SUMMARY:
==4588==     in use at exit: 91,389 bytes in 473 blocks
==4588==   total heap usage: 707 allocs, 235 frees, 104,478 bytes allocated
==4588==
==4588== LEAK SUMMARY:
==4588==    definitely lost: 0 bytes in 0 blocks
==4588==    indirectly lost: 0 bytes in 0 blocks
==4588==      possibly lost: 0 bytes in 0 blocks
==4588==    still reachable: 91,389 bytes in 473 blocks
==4588==         suppressed: 0 bytes in 0 blocks
==4588== Rerun with --leak-check=full to see details of leaked memory
==4588==
==4588== For counts of detected and suppressed errors, rerun with: -v
==4588== Use --track-origins=yes to see where uninitialised values come from
==4588== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 5 from 5)
clbr commented 2 years ago

The following patch fixes this.

diff --git a/xclip.c b/xclip.c
index 9c2d157..1d4eb4b 100644
--- a/xclip.c
+++ b/xclip.c
@@ -714,7 +714,7 @@ static int
 doOut(Window win)
 {
     Atom sel_type = None;
-    unsigned char *sel_buf;    /* buffer for selection data */
+    unsigned char *sel_buf = NULL;     /* buffer for selection data */
     unsigned long sel_len = 0; /* length of sel_buf */
     XEvent evt;                        /* X Event Structures */
     unsigned int context = XCLIB_XCOUT_NONE;
hackerb9 commented 2 years ago

Thank you.