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. Torsten
pgpzBnNNIkCJ8.pgp
Description: PGP signature