On Fri, Jun 06, 2025 at 07:27:56PM +0100, Gavin Smith wrote:
> To explain the problem another way, I believe that if you had XS code like:
>
> HV *hv = newHV ();
> SV *sv = newSViv(7);
> hv_store (hv, "foo", strlen ("foo"), sv, 0);
> hv_store (hv, "bar", strlen ("bar"), sv, 0);
>
> and then, in Perl code, did
>
> $hv->{'foo'} = 8;
>
> then $hv->{'bar'} would also change from 7 to 8. (I haven't tested this.)
Confirmed:
diff --git a/tta/perl/Texinfo/Convert/Plaintext.pm
b/tta/perl/Texinfo/Convert/Plaintext.pm
index 0192b3c5c3..2b4d11bbdc 100644
--- a/tta/perl/Texinfo/Convert/Plaintext.pm
+++ b/tta/perl/Texinfo/Convert/Plaintext.pm
@@ -516,6 +516,12 @@ sub converter_initialize($)
{
my $self = shift;
+ my $dodgy_hash = Texinfo::Convert::Paragraph::dodgy_hash();
+ warn "foo: ", $dodgy_hash->{'foo'}, "\n";
+ $dodgy_hash->{'foo'} = 19;
+ warn "bar: ", $dodgy_hash->{'bar'}, "\n";
+ die;
+
%{$self->{'ignored_commands'}} = %ignored_commands;
foreach my $format (keys(%format_raw_commands)) {
diff --git a/tta/perl/XSTexinfo/XSParagraph.xs
b/tta/perl/XSTexinfo/XSParagraph.xs
index 1ba5ebe379..df532dcb26 100644
--- a/tta/perl/XSTexinfo/XSParagraph.xs
+++ b/tta/perl/XSTexinfo/XSParagraph.xs
@@ -24,6 +24,18 @@ MODULE = Texinfo::Convert::Paragraph PACKAGE =
Texinfo::Convert::Paragraph PREFI
PROTOTYPES: ENABLE
+HV *
+xspara_dodgy_hash (...)
+ CODE:
+ HV *hv = newHV ();
+ SV *sv = newSViv(7);
+ hv_store (hv, "foo", strlen ("foo"), sv, 0);
+ hv_store (hv, "bar", strlen ("bar"), sv, 0);
+ RETVAL = hv;
+ OUTPUT:
+ RETVAL
+
+
void
xspara_set_state (int state)
$ ./texi2any.pl ../../doc/info-stnd.texi
foo: 7
bar: 19
Died at ../perl/Texinfo/Convert/Plaintext.pm line 523.
We set 'foo', but 'bar' changed as well.