Torsten Foertsch wrote:
On Sunday 22 May 2005 19:18, Torsten Foertsch wrote:

Hi,

there is something wrong with APR::Base64.

[EMAIL PROTECTED]:~> perl -MAPR::Base64 -MData::Dumper -e '$x=APR::Base64::encode( 
"x"
); print "$x\n".Dumper( [split "", $x] ), "length=".length($x)."\n";' eA==
$VAR1 = [
         'e',
         'A',
         '=',
         '=',
         ''
       ];
length=5
[EMAIL PROTECTED]:~> perl -MAPR::Base64 -MData::Dumper -e 
'$x=APR::Base64::encode(
"xxx" ); print "$x\n".Dumper( [split "", $x] ), "length=".length($x)."\n";'
eHh4
$VAR1 = [
         'e',
         'H',
         'h',
         '4',
         ''
       ];
length=5

In both cases length should be 4 and split("",$x) should return (qw(e a =
=)).


The problem is apr_base64_encode_len() returns the length including the trailing \0 required to hold the encoded string.

This patch cures the problem:

========================================================================
--- xs/APR/Base64/APR__Base64.h 2005-04-26 20:58:34.000000000 +0200
+++ xs/APR/Base64/APR__Base64.h 2005-05-23 22:05:53.416525123 +0200
@@ -18,9 +18,9 @@
     STRLEN len;
     int encoded_len;
     char *data = SvPV(arg, len);
-    mpxs_sv_grow(sv, apr_base64_encode_len(len));
+    mpxs_sv_grow(sv, apr_base64_encode_len(len)-1);
     encoded_len = apr_base64_encode_binary(SvPVX(sv), data, len);
-    mpxs_sv_cur_set(sv, encoded_len);
+    mpxs_sv_cur_set(sv, encoded_len-1);
 }

 static MP_INLINE void mpxs_apr_base64_decode(pTHX_ SV *sv, SV *arg)
========================================================================

but now the APR::Base64::encode_len test fails because it calls simply apr_base64_encode_len().

To cure that a new function needs to be introduced in xs/APR/Base64/APR__Base64.h ...

I'd do that but I don't know what to call instead of mpxs_sv_cur_set() if I want to set an IV.

No need to set IV. Here is the patch that does that and incorporates yours:

Index: xs/maps/apr_functions.map
===================================================================
--- xs/maps/apr_functions.map   (revision 171124)
+++ xs/maps/apr_functions.map   (working copy)
@@ -579,7 +579,7 @@
 MODULE=APR::Base64
  apr_base64_decode | MPXS_ | coded_src
  apr_base64_encode | MPXS_ | plain_src
- apr_base64_encode_len
+ int:DEFINE_encode_len | | int:len
 -apr_base64_decode_len
 -apr_base64_encode_binary
 -apr_base64_decode_binary
Index: xs/APR/Base64/APR__Base64.h
===================================================================
--- xs/APR/Base64/APR__Base64.h (revision 171124)
+++ xs/APR/Base64/APR__Base64.h (working copy)
@@ -13,14 +13,18 @@
  * limitations under the License.
  */

+/* apr_base64_encode_len and apr_base64_encode_binary give length that
+ * includes the terminating '\0' */
+#define mpxs_APR__Base64_encode_len(len) apr_base64_encode_len(len) - 1;
+
 static MP_INLINE void mpxs_apr_base64_encode(pTHX_ SV *sv, SV *arg)
 {
     STRLEN len;
     int encoded_len;
     char *data = SvPV(arg, len);
-    mpxs_sv_grow(sv, apr_base64_encode_len(len));
+    mpxs_sv_grow(sv, apr_base64_encode_len(len) - 1);
     encoded_len = apr_base64_encode_binary(SvPVX(sv), data, len);
-    mpxs_sv_cur_set(sv, encoded_len);
+    mpxs_sv_cur_set(sv, encoded_len - 1);
 }

 static MP_INLINE void mpxs_apr_base64_decode(pTHX_ SV *sv, SV *arg)

if it works for you, i'll commit it.

--
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

Reply via email to