All of lore.kernel.org
 help / color / mirror / Atom feed
* question about snd_ctl_card_info_free and valgrind
@ 2014-09-15  5:15 Ivica Ico Bukvic
  2014-09-15  9:28 ` Takashi Iwai
  0 siblings, 1 reply; 3+ messages in thread
From: Ivica Ico Bukvic @ 2014-09-15  5:15 UTC (permalink / raw)
  To: alsa-devel

Hi all, I have the following code snippet (excerpt from pd-l2ork's 
g_audio_alsa.c that was inherited from pure-data--full version available 
at https://github.com/pd-l2ork/pd/blob/master/pd/src/s_audio_alsa.c):

         if (snd_ctl_open(&ctl, devname, 0) >= 0)
         {
             snd_ctl_card_info_malloc(&info);
             snd_ctl_card_info(ctl, info);
             desc = snd_ctl_card_info_get_name(info);
             snd_ctl_card_info_free(info);
         }

With the said implementation are no crashes or noticeable problems other 
than when ran through valgrind, I get the following error report:

==6884== Memcheck, a memory error detector
==6884== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==6884== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==6884== Command: pd-l2ork
==6884==
==6884== Invalid read of size 1
==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
==6884==    at 0x4C2A82E: free (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==
==6884== Invalid read of size 1
==6884==    at 0x71CFDB8: _IO_default_xsputn (genops.c:480)
==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
==6884==    at 0x4C2A82E: free (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==
==6884== Invalid read of size 1
==6884==    at 0x71CFDC7: _IO_default_xsputn (genops.c:479)
==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==  Address 0xc1ac48a is 42 bytes inside a block of size 376 free'd
==6884==    at 0x4C2A82E: free (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==
==6884== Invalid read of size 1
==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
==6884==    by 0x51414B: alsa_getdevs (stdio2.h:34)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
==6884==    at 0x4C2A82E: free (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==
==6884== Invalid read of size 1
==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
==6884==    by 0x51416A: alsa_getdevs (stdio2.h:34)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
==6884==    at 0x4C2A82E: free (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==
==6884== Invalid read of size 1
==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
==6884==    by 0x514192: alsa_getdevs (stdio2.h:34)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
==6884==    at 0x4C2A82E: free (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==
==6884== Invalid read of size 8
==6884==    at 0x71CFD95: _IO_default_xsputn (genops.c:480)
==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==  Address 0xc1ada58 is 40 bytes inside a block of size 376 free'd
==6884==    at 0x4C2A82E: free (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
==6884==    by 0x4CD804: sys_main (s_main.c:288)
==6884==    by 0x717576C: (below main) (libc-start.c:226)
==6884==

The repeating error refers to the line 857 which is

snd_ctl_card_info_free(info);

If I read valgrind error report, it appears there is a double free (???) 
error taking place even though there is no other place in that code that 
the snd_ctl_card_info_free is being called. Now, the loop does cycle 
through all the available alsa devices. Could this be beccause some of 
them are invalid and if so, how would one go about detecting that before 
calling snd_ctl_card_info_free?

If I comment that line (as it is currently in the linked source file on 
git), valgrind does not complain any more but I wonder if this means 
there is now a memory leak instead?

Any assistance with this is most appreciated. NB: I am not an alsa dev, 
so my knowledge of alsa lib API is rather limited beyond what I've 
briefly studied to better understand the aforesaid code snippet.

Best,

-- 
Ivica Ico Bukvic, D.M.A.
Associate Professor
Computer Music
ICAT Senior Fellow
DISIS, L2Ork
Virginia Tech
School of Performing Arts - 0141
Blacksburg, VA 24061
(540) 231-6139
ico@vt.edu
www.performingarts.vt.edu
disis.music.vt.edu
l2ork.music.vt.edu

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: question about snd_ctl_card_info_free and valgrind
  2014-09-15  5:15 question about snd_ctl_card_info_free and valgrind Ivica Ico Bukvic
@ 2014-09-15  9:28 ` Takashi Iwai
  2014-09-15 14:02   ` Ivica Bukvic
  0 siblings, 1 reply; 3+ messages in thread
From: Takashi Iwai @ 2014-09-15  9:28 UTC (permalink / raw)
  To: Ivica Ico Bukvic; +Cc: alsa-devel

At Mon, 15 Sep 2014 01:15:24 -0400,
Ivica Ico Bukvic wrote:
> 
> Hi all, I have the following code snippet (excerpt from pd-l2ork's 
> g_audio_alsa.c that was inherited from pure-data--full version available 
> at https://github.com/pd-l2ork/pd/blob/master/pd/src/s_audio_alsa.c):
> 
>          if (snd_ctl_open(&ctl, devname, 0) >= 0)
>          {
>              snd_ctl_card_info_malloc(&info);
>              snd_ctl_card_info(ctl, info);
>              desc = snd_ctl_card_info_get_name(info);
>              snd_ctl_card_info_free(info);
>          }
> 
> With the said implementation are no crashes or noticeable problems other 
> than when ran through valgrind, I get the following error report:
> 
> ==6884== Memcheck, a memory error detector
> ==6884== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
> ==6884== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
> ==6884== Command: pd-l2ork
> ==6884==
> ==6884== Invalid read of size 1
> ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> ==6884==    at 0x4C2A82E: free (in 
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==
> ==6884== Invalid read of size 1
> ==6884==    at 0x71CFDB8: _IO_default_xsputn (genops.c:480)
> ==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
> ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> ==6884==    at 0x4C2A82E: free (in 
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==
> ==6884== Invalid read of size 1
> ==6884==    at 0x71CFDC7: _IO_default_xsputn (genops.c:479)
> ==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
> ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==  Address 0xc1ac48a is 42 bytes inside a block of size 376 free'd
> ==6884==    at 0x4C2A82E: free (in 
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==
> ==6884== Invalid read of size 1
> ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> ==6884==    by 0x51414B: alsa_getdevs (stdio2.h:34)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> ==6884==    at 0x4C2A82E: free (in 
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==
> ==6884== Invalid read of size 1
> ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> ==6884==    by 0x51416A: alsa_getdevs (stdio2.h:34)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> ==6884==    at 0x4C2A82E: free (in 
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==
> ==6884== Invalid read of size 1
> ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> ==6884==    by 0x514192: alsa_getdevs (stdio2.h:34)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> ==6884==    at 0x4C2A82E: free (in 
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==
> ==6884== Invalid read of size 8
> ==6884==    at 0x71CFD95: _IO_default_xsputn (genops.c:480)
> ==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
> ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==  Address 0xc1ada58 is 40 bytes inside a block of size 376 free'd
> ==6884==    at 0x4C2A82E: free (in 
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> ==6884==
> 
> The repeating error refers to the line 857 which is
> 
> snd_ctl_card_info_free(info);
> 
> If I read valgrind error report, it appears there is a double free (???) 
> error taking place even though there is no other place in that code that 
> the snd_ctl_card_info_free is being called. Now, the loop does cycle 
> through all the available alsa devices. Could this be beccause some of 
> them are invalid and if so, how would one go about detecting that before 
> calling snd_ctl_card_info_free?
> 
> If I comment that line (as it is currently in the linked source file on 
> git), valgrind does not complain any more but I wonder if this means 
> there is now a memory leak instead?

Yes, it's a memory leak there if you comment it out.

The problem is that you're obtaining the pointer of the freed data in
the code snippet above.  snd_ctl_card_info_get_name() gives the
pointer of the data embedded inside the object info.  It doesn't give
the newly allocated string.  So, the content of the returned pointer
will be freed together with snd_ctl_card_info_free().


Takashi

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: question about snd_ctl_card_info_free and valgrind
  2014-09-15  9:28 ` Takashi Iwai
@ 2014-09-15 14:02   ` Ivica Bukvic
  0 siblings, 0 replies; 3+ messages in thread
From: Ivica Bukvic @ 2014-09-15 14:02 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

Thank you very much!
On Sep 15, 2014 5:29 AM, "Takashi Iwai" <tiwai@suse.de> wrote:

> At Mon, 15 Sep 2014 01:15:24 -0400,
> Ivica Ico Bukvic wrote:
> >
> > Hi all, I have the following code snippet (excerpt from pd-l2ork's
> > g_audio_alsa.c that was inherited from pure-data--full version available
> > at https://github.com/pd-l2ork/pd/blob/master/pd/src/s_audio_alsa.c):
> >
> >          if (snd_ctl_open(&ctl, devname, 0) >= 0)
> >          {
> >              snd_ctl_card_info_malloc(&info);
> >              snd_ctl_card_info(ctl, info);
> >              desc = snd_ctl_card_info_get_name(info);
> >              snd_ctl_card_info_free(info);
> >          }
> >
> > With the said implementation are no crashes or noticeable problems other
> > than when ran through valgrind, I get the following error report:
> >
> > ==6884== Memcheck, a memory error detector
> > ==6884== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
> > ==6884== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright
> info
> > ==6884== Command: pd-l2ork
> > ==6884==
> > ==6884== Invalid read of size 1
> > ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> > ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> > ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> > ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> > ==6884==    at 0x4C2A82E: free (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==
> > ==6884== Invalid read of size 1
> > ==6884==    at 0x71CFDB8: _IO_default_xsputn (genops.c:480)
> > ==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
> > ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> > ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> > ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> > ==6884==    at 0x4C2A82E: free (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==
> > ==6884== Invalid read of size 1
> > ==6884==    at 0x71CFDC7: _IO_default_xsputn (genops.c:479)
> > ==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
> > ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> > ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> > ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==  Address 0xc1ac48a is 42 bytes inside a block of size 376 free'd
> > ==6884==    at 0x4C2A82E: free (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==
> > ==6884== Invalid read of size 1
> > ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> > ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> > ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> > ==6884==    by 0x51414B: alsa_getdevs (stdio2.h:34)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> > ==6884==    at 0x4C2A82E: free (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==
> > ==6884== Invalid read of size 1
> > ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> > ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> > ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> > ==6884==    by 0x51416A: alsa_getdevs (stdio2.h:34)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> > ==6884==    at 0x4C2A82E: free (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==
> > ==6884== Invalid read of size 1
> > ==6884==    at 0x719F061: vfprintf (vfprintf.c:1630)
> > ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> > ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> > ==6884==    by 0x514192: alsa_getdevs (stdio2.h:34)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==  Address 0xc1ac488 is 40 bytes inside a block of size 376 free'd
> > ==6884==    at 0x4C2A82E: free (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==
> > ==6884== Invalid read of size 8
> > ==6884==    at 0x71CFD95: _IO_default_xsputn (genops.c:480)
> > ==6884==    by 0x719EC31: vfprintf (vfprintf.c:1630)
> > ==6884==    by 0x725D263: __vsprintf_chk (vsprintf_chk.c:86)
> > ==6884==    by 0x725D1AC: __sprintf_chk (sprintf_chk.c:33)
> > ==6884==    by 0x51412D: alsa_getdevs (stdio2.h:34)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==  Address 0xc1ada58 is 40 bytes inside a block of size 376 free'd
> > ==6884==    at 0x4C2A82E: free (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==6884==    by 0x51410F: alsa_getdevs (s_audio_alsa.c:857)
> > ==6884==    by 0x4D84DA: sys_set_audio_settings (s_audio.c:209)
> > ==6884==    by 0x4D156A: sys_loadpreferences (s_file.c:375)
> > ==6884==    by 0x4CD804: sys_main (s_main.c:288)
> > ==6884==    by 0x717576C: (below main) (libc-start.c:226)
> > ==6884==
> >
> > The repeating error refers to the line 857 which is
> >
> > snd_ctl_card_info_free(info);
> >
> > If I read valgrind error report, it appears there is a double free (???)
> > error taking place even though there is no other place in that code that
> > the snd_ctl_card_info_free is being called. Now, the loop does cycle
> > through all the available alsa devices. Could this be beccause some of
> > them are invalid and if so, how would one go about detecting that before
> > calling snd_ctl_card_info_free?
> >
> > If I comment that line (as it is currently in the linked source file on
> > git), valgrind does not complain any more but I wonder if this means
> > there is now a memory leak instead?
>
> Yes, it's a memory leak there if you comment it out.
>
> The problem is that you're obtaining the pointer of the freed data in
> the code snippet above.  snd_ctl_card_info_get_name() gives the
> pointer of the data embedded inside the object info.  It doesn't give
> the newly allocated string.  So, the content of the returned pointer
> will be freed together with snd_ctl_card_info_free().
>
>
> Takashi
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-09-15 14:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-15  5:15 question about snd_ctl_card_info_free and valgrind Ivica Ico Bukvic
2014-09-15  9:28 ` Takashi Iwai
2014-09-15 14:02   ` Ivica Bukvic

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.