Roderich Schupp <roderich.sch...@gmail.com> writes: > Here's the proposed fix (for SVN 1.7.x) > > --- subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c > +++ subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c > @@ -116,7 +116,7 @@ > while (cnt--) { > SV* item = hv_iternextsv(h, &key, &retlen); > void *val = cv(item, ctx, pool); > - apr_hash_set(hash, key, APR_HASH_KEY_STRING, val); > + apr_hash_set(hash, apr_pstrmemdup(pool, key, retlen), retlen, val); > } > > return hash;
Fixes go on trunk first, and then get backported to 1.8 and 1.7. I can reproduce the bug on trunk, valgrind shows: ==7249== Invalid read of size 1 ==7249== at 0x4C2B0B9: bcmp (mc_replace_strmem.c:889) ==7249== by 0x855035F: ??? (in /usr/lib/libapr-1.so.0.4.6) ==7249== by 0x855062D: apr_hash_get (in /usr/lib/libapr-1.so.0.4.6) ==7249== by 0x747C96A: svn_ra_open4 (ra_loader.c:323) ==7249== by 0x6E2E4F2: svn_client__open_ra_session_internal (ra.c:390) ==7249== by 0x6E2EA06: svn_client__ra_session_from_path2 (ra.c:510) ==7249== by 0x6E0359E: list_internal (list.c:365) ==7249== by 0x6E03D75: svn_client_list3 (list.c:572) ==7249== by 0x6DED251: svn_client_list2 (deprecated.c:1375) ==7249== by 0x6DED2C2: svn_client_list (deprecated.c:1393) ==7249== by 0x6DED4C7: svn_client_ls3 (deprecated.c:1468) ==7249== by 0x6DED521: svn_client_ls2 (deprecated.c:1483) ==7249== Address 0xcd46d70 is 32 bytes inside a block of size 41 free'd ==7249== at 0x4C27D4E: free (vg_replace_malloc.c:427) ==7249== by 0x4ED6D75: ??? (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4ED7A42: Perl_hv_free_ent (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4ED7DAD: ??? (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4EDB5C2: Perl_hv_undef_flags (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4EEDDA5: Perl_sv_clear (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4EEE1D1: Perl_sv_free2 (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4F139BF: Perl_free_tmps (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4EDF284: Perl_pp_nextstate (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4EDEC25: Perl_runops_standard (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x4E80754: perl_run (in /usr/lib/libperl.so.5.14.2) ==7249== by 0x400F88: main (in /usr/bin/perl) and your patch, modified for trunk, fixes it: Index: subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c =================================================================== --- subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c (revision 1506881) +++ subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c (working copy) @@ -187,7 +187,7 @@ static apr_hash_t *svn_swig_pl_to_hash(SV *source, while (cnt--) { SV* item = hv_iternextsv(h, &key, &retlen); void *val = cv(item, ctx, pool); - svn_hash_sets(hash, key, val); + svn_hash_sets(hash, apr_pstrmemdup(pool, key, retlen), val); } return hash; -- Philip Martin | Subversion Committer WANdisco | Non-Stop Data