Fixed some memory leaks when things go wrong.
diff --git a/Modules/audioop.c b/Modules/audioop.c
index 792c4ae..f8810d3 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -731,11 +731,6 @@
 	return 0;
     }
     
-    str = newsizedstringobject(NULL, len/size);
-    if ( str == 0 )
-      return 0;
-    ncp = (signed char *)getstringvalue(str);
-
     /* Decode state, should have (value, step) */
     if ( state == None ) {
 	/* First time, it seems. Set defaults */
@@ -744,6 +739,11 @@
     } else if ( !getargs(state, "(ii)", &valprev, &step) )
       return 0;
 
+    str = newsizedstringobject(NULL, len/size);
+    if ( str == 0 )
+      return 0;
+    ncp = (signed char *)getstringvalue(str);
+
     for ( i=0; i < len; i += size ) {
 	if ( size == 1 )      val = ((int)*CHARP(cp, i)) << 8;
 	else if ( size == 2 ) val = (int)*SHORTP(cp, i);
@@ -861,11 +861,6 @@
 	return 0;
     }
     
-    str = newsizedstringobject(NULL, len/(size*2));
-    if ( str == 0 )
-      return 0;
-    ncp = (signed char *)getstringvalue(str);
-
     /* Decode state, should have (value, step) */
     if ( state == None ) {
 	/* First time, it seems. Set defaults */
@@ -875,6 +870,11 @@
     } else if ( !getargs(state, "(ii)", &valpred, &index) )
       return 0;
 
+    str = newsizedstringobject(NULL, len/(size*2));
+    if ( str == 0 )
+      return 0;
+    ncp = (signed char *)getstringvalue(str);
+
     step = stepsizeTable[index];
     bufferstep = 1;