MAgic for Zlib & Bzip2
authorPaul <paul@paul-desktop.(none)>
Sat, 4 Aug 2012 15:53:10 +0000 (16:53 +0100)
committerSteve Hay <steve.m.hay@googlemail.com>
Wed, 8 Aug 2012 13:02:57 +0000 (14:02 +0100)
cpan/Compress-Raw-Bzip2/Bzip2.xs
cpan/Compress-Raw-Bzip2/Changes
cpan/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm
cpan/Compress-Raw-Zlib/Changes
cpan/Compress-Raw-Zlib/Zlib.xs
cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm

index 128063c..f2ccc79 100644 (file)
@@ -323,11 +323,13 @@ char * string ;
     if (SvREADONLY(sv) && PL_curcop != &PL_compiling)
         croak("%s: buffer parameter is read-only", string);
 
-    SvUPGRADE(sv, SVt_PV) ;
+    SvUPGRADE(sv, SVt_PV);
+
     if (wipe)
-       sv_setpv(sv, "") ;
+        sv_setpv(sv, "") ;
     else
         (void)SvPVbyte_force(sv, na) ;
+
     return sv ;
 }
 
@@ -493,9 +495,9 @@ bzdeflate (s, buf, output)
 #ifdef UTF8_AVAILABLE    
     if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1))
          croak("Wide character in " COMPRESS_CLASS "::bzdeflate input parameter");
-#endif
-    s->stream.next_in =  SvPV_nomg_nolen(buf);
-    s->stream.avail_in =  SvCUR(buf);
+#endif         
+    s->stream.next_in = (char*)SvPVbyte_nolen(buf) ;
+    s->stream.avail_in = SvCUR(buf) ;
      
     /* and retrieve the output buffer */
     output = deRef_l(output, "deflate") ;
@@ -503,19 +505,22 @@ bzdeflate (s, buf, output)
     if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1))
          croak("Wide character in " COMPRESS_CLASS "::bzdeflate output parameter");
 #endif         
-    if((s->flags & FLAG_APPEND_OUTPUT) != FLAG_APPEND_OUTPUT)
+
+    if((s->flags & FLAG_APPEND_OUTPUT) != FLAG_APPEND_OUTPUT) {
         SvCUR_set(output, 0);
+        /* sv_setpvn(output, "", 0); */
+    }
     cur_length =  SvCUR(output) ;
-    s->stream.next_out =  SvPVX(output) +  cur_length;
+    s->stream.next_out = (char*) SvPVX(output) + cur_length;
     increment =  SvLEN(output) -  cur_length;
     s->stream.avail_out =  increment;
     while (s->stream.avail_in != 0) {
 
         if (s->stream.avail_out == 0) {
            /* out of space in the output buffer so make it bigger */
-            Sv_Grow(output, SvLEN(output) + bufinc) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc) ;
             cur_length += increment ;
-            s->stream.next_out = SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ;
@@ -565,19 +570,21 @@ bzclose(s, output)
     if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1))
          croak("Wide character in " COMPRESS_CLASS "::bzclose input parameter");
 #endif         
-    if(! s->flags & FLAG_APPEND_OUTPUT)
+    if(! s->flags & FLAG_APPEND_OUTPUT) {
         SvCUR_set(output, 0);
+        /* sv_setpvn(output, "", 0); */
+    }
     cur_length =  SvCUR(output) ;
-    s->stream.next_out =  SvPVX(output) +  cur_length;
+    s->stream.next_out = (char*) SvPVX(output) + cur_length;
     increment =  SvLEN(output) -  cur_length;
     s->stream.avail_out =  increment;
 
     for (;;) {
         if (s->stream.avail_out == 0) {
            /* consumed all the available output, so extend it */
-            Sv_Grow(output, SvLEN(output) + bufinc) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc) ;
             cur_length += increment ;
-            s->stream.next_out = SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ;
@@ -624,19 +631,21 @@ bzflush(s, output)
     if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1))
          croak("Wide character in " COMPRESS_CLASS "::bzflush input parameter");
 #endif         
-    if(! s->flags & FLAG_APPEND_OUTPUT)
+    if(! s->flags & FLAG_APPEND_OUTPUT) {
         SvCUR_set(output, 0);
+        /* sv_setpvn(output, "", 0); */
+    }
     cur_length =  SvCUR(output) ;
-    s->stream.next_out =  SvPVX(output) + cur_length;
+    s->stream.next_out = (char*) SvPVX(output) + cur_length;
     increment =  SvLEN(output) -  cur_length;
     s->stream.avail_out =  increment;
 
     for (;;) {
         if (s->stream.avail_out == 0) {
            /* consumed all the available output, so extend it */
-            Sv_Grow(output, SvLEN(output) + bufinc) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc) ;
             cur_length += increment ;
-            s->stream.next_out = SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ;
@@ -733,8 +742,8 @@ bzinflate (s, buf, output)
 #endif         
     
     /* initialise the input buffer */
-    s->stream.next_in = SvPV_nomg_nolen(buf);
-    s->stream.avail_in = stmp = SvCUR(buf);
+    s->stream.next_in = (char*)SvPVbyte_force(buf, stmp) ;
+    s->stream.avail_in = SvCUR(buf);
        
     /* and retrieve the output buffer */
     output = deRef_l(output, "bzinflate") ;
@@ -764,7 +773,7 @@ bzinflate (s, buf, output)
         */
         if (SvLEN(output) > cur_length + 1)
         {
-            s->stream.next_out = SvPVX(output) + cur_length;
+            s->stream.next_out = (char*) SvPVX(output) + cur_length;
             increment = SvLEN(output) -  cur_length - 1;
             s->stream.avail_out = increment;
         }
@@ -778,9 +787,9 @@ bzinflate (s, buf, output)
 
         if (s->stream.avail_out == 0) {
            /* out of space in the output buffer so make it bigger */
-            Sv_Grow(output, SvLEN(output) + bufinc + 1) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc + 1) ;
             cur_length += increment ;
-            s->stream.next_out = SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ;
@@ -789,7 +798,10 @@ bzinflate (s, buf, output)
         /* DispStream(s, "pre"); */
         RETVAL = BZ2_bzDecompress (&(s->stream));
 
-        /* DispStream(s, "apres"); */
+        /* 
+        printf("Status %d\n", RETVAL);
+        DispStream(s, "apres"); 
+        */ 
         if (RETVAL != BZ_OK || s->flags & FLAG_LIMIT_OUTPUT) 
             break ;
 
@@ -813,12 +825,12 @@ bzinflate (s, buf, output)
 
         SvPOK_only(output);
         SvCUR_set(output, prefix_length + s->bytesInflated) ;
-       *SvEND(output) = '\0' ;
+       *SvEND(output) = '\0';
 #ifdef UTF8_AVAILABLE    
         if (out_utf8)
-            sv_utf8_upgrade(output) ;
+            sv_utf8_upgrade(output);
 #endif        
-        SvSETMAGIC(output) ;
+        SvSETMAGIC(output);
 
        /* fix the input buffer */
        if (s->flags & FLAG_CONSUME_INPUT) {
@@ -826,8 +838,8 @@ bzinflate (s, buf, output)
            SvCUR_set(buf, in) ;
            if (in)
                Move(s->stream.next_in, SvPVX(buf), in, char) ; 
-            *SvEND(buf) = '\0' ;
-            SvSETMAGIC(buf) ;
+            *SvEND(buf) = '\0';
+            SvSETMAGIC(buf);
        }
     }
     OUTPUT:
index 7dd052b..0ee8d27 100644 (file)
@@ -1,6 +1,11 @@
 CHANGES
 -------
 
+  2.055 4 August 2012
+
+      * Fix misuse of magic in API
+        [#78080] 
+
   2.052 29 April 2012
 
       * No Changes
index 589f390..9263d65 100644 (file)
@@ -12,7 +12,7 @@ use Carp ;
 use bytes ;
 our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD);
 
-$VERSION = '2.05201';
+$VERSION = '2.055';
 $XS_VERSION = $VERSION; 
 $VERSION = eval $VERSION;
 
index 71e4879..a2501d8 100644 (file)
@@ -1,6 +1,11 @@
 CHANGES
 -------
 
+  2.055 4 August 2012
+
+      * Fix misuse of magic in API
+        [#78079] 
+      
   2.054 8 May 2012
 
       * Build issue on Win32
index e57a38a..5b0378d 100644 (file)
@@ -617,11 +617,13 @@ char * string ;
     if (SvREADONLY(sv) && PL_curcop != &PL_compiling)
         croak("%s: buffer parameter is read-only", string);
 
-    SvUPGRADE(sv, SVt_PV) ;
+    SvUPGRADE(sv, SVt_PV);
+
     if (wipe)
-       sv_setpv(sv, "") ;
+        sv_setpv(sv, "") ;
     else
         (void)SvPVbyte_force(sv, na) ;
+
     return sv ;
 }
 
@@ -793,7 +795,6 @@ _deflateInit(flags,level, method, windowBits, memLevel, strategy, bufsize, dicti
             warn(" _deflateInit2 returned %d\n", err);
 
        /* Check if a dictionary has been specified */
-
        SvGETMAGIC(dictionary);
        if (err == Z_OK && SvPOK(dictionary) && SvCUR(dictionary)) {
 #ifdef UTF8_AVAILABLE    
@@ -923,11 +924,11 @@ deflate (s, buf, output)
     Compress::Raw::Zlib::deflateStream s
     SV *       buf
     SV *       output 
-  PREINIT:
-    uInt       cur_length;
-    uInt       increment;
-    uInt       prefix;
-    uLong      bufinc;
+    uInt       cur_length = NO_INIT
+    uInt       increment = NO_INIT
+    uInt       prefix    = NO_INIT
+    int                RETVAL = 0;
+    uLong     bufinc = NO_INIT
   CODE:
     bufinc = s->bufsize;
 
@@ -939,7 +940,7 @@ deflate (s, buf, output)
     if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1))
          croak("Wide character in Compress::Raw::Zlib::Deflate::deflate input parameter");
 #endif         
-    s->stream.next_in = (Bytef*)SvPV_nomg_nolen(buf) ;
+    s->stream.next_in = (Bytef*)SvPVbyte_nolen(buf) ;
     s->stream.avail_in = SvCUR(buf) ;
     
     if (s->flags & FLAG_CRC32)
@@ -996,9 +997,9 @@ deflate (s, buf, output)
 
         if (s->stream.avail_out == 0) {
            /* out of space in the output buffer so make it bigger */
-            Sv_Grow(output, SvLEN(output) + bufinc) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc) ;
             cur_length += increment ;
-            s->stream.next_out = (Bytef*) SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ;
@@ -1097,9 +1098,9 @@ flush(s, output, f=Z_FINISH)
     for (;;) {
         if (s->stream.avail_out == 0) {        
             /* consumed all the available output, so extend it */
-            Sv_Grow(output, SvLEN(output) + bufinc) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc) ;
             cur_length += increment ;
-            s->stream.next_out = (Bytef*) SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ;
@@ -1319,11 +1320,12 @@ inflate (s, buf, output, eof=FALSE)
     SV *       buf
     SV *       output 
     bool       eof 
-  PREINIT:
     uInt       cur_length = 0;
     uInt       prefix_length = 0;
     int            increment = 0;
-    uLong   bufinc;
+    STRLEN  stmp    = NO_INIT
+    uLong     bufinc = NO_INIT
+  PREINIT:
 #ifdef UTF8_AVAILABLE    
     bool       out_utf8  = FALSE;
 #endif    
@@ -1340,7 +1342,7 @@ inflate (s, buf, output, eof=FALSE)
 #endif         
     
     /* initialise the input buffer */
-    s->stream.next_in = (Bytef*)SvPV_nomg_nolen(buf) ;
+    s->stream.next_in = (Bytef*)SvPVbyte_force(buf, stmp) ;
     s->stream.avail_in = SvCUR(buf) ;
        
     /* and retrieve the output buffer */
@@ -1386,9 +1388,9 @@ inflate (s, buf, output, eof=FALSE)
     while (RETVAL == Z_OK) {
         if (s->stream.avail_out == 0) {
            /* out of space in the output buffer so make it bigger */
-            Sv_Grow(output, SvLEN(output) + bufinc +1) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc +1) ;
             cur_length += increment ;
-            s->stream.next_out = (Bytef*) SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ; 
@@ -1437,9 +1439,9 @@ Perl_sv_dump(output); */
         s->stream.avail_in = 1;
         if (s->stream.avail_out == 0) {
            /* out of space in the output buffer so make it bigger */
-            Sv_Grow(output, SvLEN(output) + bufinc) ;
+            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc) ;
             cur_length += increment ;
-            s->stream.next_out = (Bytef*) SvPVX(output) + cur_length ;
+            s->stream.next_out += cur_length ;
             increment = bufinc ;
             s->stream.avail_out = increment;
             bufinc *= 2 ;
@@ -1520,6 +1522,7 @@ DualType
 inflateSync (s, buf)
     Compress::Raw::Zlib::inflateStream s
     SV *       buf
+    STRLEN stmp      = NO_INIT
   CODE:
   
     /* If the buffer is a reference, dereference it */
@@ -1530,7 +1533,7 @@ inflateSync (s, buf)
 #endif         
     
     /* initialise the input buffer */
-    s->stream.next_in = (Bytef*)SvPV_nomg_nolen(buf) ;
+    s->stream.next_in = (Bytef*)SvPVbyte_force(buf, stmp) ;
     s->stream.avail_in = SvCUR(buf) ;
        
     /* inflateSync doesn't create any output */
@@ -1691,6 +1694,7 @@ scan(s, buf, out=NULL, eof=FALSE)
     bool       eof
     bool       eof_mode = FALSE;
     int    start_len = NO_INIT
+    STRLEN stmp      = NO_INIT
   CODE:
     /* If the input buffer is a reference, dereference it */
 #ifndef MAGIC_APPEND
@@ -1703,7 +1707,7 @@ scan(s, buf, out=NULL, eof=FALSE)
         croak("Wide character in Compress::Raw::Zlib::InflateScan::scan input parameter");
 #endif         
     /* initialise the input buffer */
-    s->stream.next_in = (Bytef*)SvPV_nomg_nolen(buf) ;
+    s->stream.next_in = (Bytef*)SvPVbyte_force(buf, stmp) ;
     s->stream.avail_in = SvCUR(buf) ;
     start_len = s->stream.avail_in ;
     s->bytesInflated = 0 ; 
@@ -1789,8 +1793,8 @@ scan(s, buf, out=NULL, eof=FALSE)
             SvCUR_set(buf, in) ;
             if (in)
                 Move(s->stream.next_in, SvPVX(buf), in, char) ;        
-            *SvEND(buf) = '\0';
-            SvSETMAGIC(buf);
+                *SvEND(buf) = '\0';
+                SvSETMAGIC(buf);
         }
     }
 #endif
index 557e843..1ed22c5 100644 (file)
@@ -11,7 +11,7 @@ use warnings ;
 use bytes ;
 our ($VERSION, $XS_VERSION, @ISA, @EXPORT, %EXPORT_TAGS, @EXPORT_OK, $AUTOLOAD, %DEFLATE_CONSTANTS, @DEFLATE_CONSTANTS );
 
-$VERSION = '2.05401';
+$VERSION = '2.055';
 $XS_VERSION = $VERSION; 
 $VERSION = eval $VERSION;