Update of /cvsroot/audacity/lib-src/libnyquist/nyquist/nyqsrc
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv17229/nyquist/nyqsrc

Modified Files:
        sound.c 
Log Message:
Fix stack overflow due to recursion.


Index: sound.c
===================================================================
RCS file: /cvsroot/audacity/lib-src/libnyquist/nyquist/nyqsrc/sound.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- sound.c     26 Feb 2009 03:11:28 -0000      1.2
+++ sound.c     1 Mar 2009 21:09:49 -0000       1.3
@@ -506,33 +506,39 @@
 void snd_list_unref(snd_list_type list)
 {
     void (*freefunc)();
+    snd_list_type next;
 
-    if (list == NULL || list == zero_snd_list) {
-        if (list == NULL)
+    while (list != zero_snd_list) {
+        if (list == NULL) {
            nyquist_printf("why did snd_list_unref get %p?\n", list);
-        return;
-    }
-    list->refcnt--;
-/*    nyquist_printf("snd_list_unref "); print_snd_list_type(list); 
stdputstr("\n"); */
-    if (list->refcnt == 0) {
-        if (list->block && list->block != zero_block) {
-            /* there is a next snd_list */
-/*          stdputstr("["); */
-            sample_block_unref(list->block);
-/*          stdputstr("]"); */
-            snd_list_unref(list->u.next);
+           return;
         }
-        else if (list->block == NULL) { /* the next thing is the susp */
-            /* free suspension structure */
-            /* nyquist_printf("freeing s...@%p\n", list->u.susp); */
-            freefunc = list->u.susp->free;
-            (*freefunc)(list->u.susp);
+        next = zero_snd_list;
+
+        list->refcnt--;
+/*      nyquist_printf("snd_list_unref "); print_snd_list_type(list); 
stdputstr("\n"); */
+        if (list->refcnt == 0) {
+            if (list->block && list->block != zero_block) {
+                /* there is a next snd_list */
+/*              stdputstr("["); */
+                sample_block_unref(list->block);
+/*              stdputstr("]"); */
+                next = list->u.next;
+            }
+            else if (list->block == NULL) { /* the next thing is the susp */
+                /* free suspension structure */
+                /* nyquist_printf("freeing s...@%p\n", list->u.susp); */
+                freefunc = list->u.susp->free;
+                (*freefunc)(list->u.susp);
+            }
+            /* nyquist_printf("freeing snd_l...@%p\n", list); */
+            //DBY
+            if (list == list_watch) printf("freeing watched snd_list %p\n", 
list);
+            //DBY
+            ffree_snd_list(list, "snd_list_unref");
         }
-        /* nyquist_printf("freeing snd_l...@%p\n", list); */
-        //DBY
-        if (list == list_watch) printf("freeing watched snd_list %p\n", list);
-        //DBY
-        ffree_snd_list(list, "snd_list_unref");
+
+        list = next;
     }
 }
 


------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Audacity-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/audacity-cvs

Reply via email to