]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
*search: avoid HV modification on conditional assignment
authorEric Wong <e@80x24.org>
Sat, 27 Jul 2024 08:37:48 +0000 (08:37 +0000)
committerEric Wong <e@80x24.org>
Sun, 28 Jul 2024 00:03:34 +0000 (00:03 +0000)
Setting {qp} higher up the stack via `//=' is unsafe since
->qp_init_common calls ->xdb which can also set {xdb}, {nshard},
and {qp_flags}.

While this doesn't fix any known bugs in current versions of
Perl or our current code, it surfaced while working on new
search features on our end.

lib/PublicInbox/CodeSearch.pm
lib/PublicInbox/MiscSearch.pm
lib/PublicInbox/Search.pm
lib/PublicInbox/XapHelper.pm

index e5fa4480afae336be269d9bc789e6573daa176ec..3838fd1b056de2d33846241f121808005f8b442d 100644 (file)
@@ -159,7 +159,7 @@ sub roots_filter { # retry_reopen callback
 
 sub mset {
        my ($self, $qry_str, $opt) = @_;
-       my $qp = $self->{qp} //= qparse_new($self);
+       my $qp = $self->{qp} // qparse_new($self);
        my $qry = $qp->parse_query($qry_str, $self->{qp_flags});
 
        # limit to commits with shared roots
index 5fb47d03dbcc143d95bd695f83dde1fc10bf3580..ad7ebeb4e0d8896a4ac53ec77e661684390b302a 100644 (file)
@@ -38,7 +38,7 @@ sub new {
 sub mi_qp_new ($) {
        my ($self) = @_;
        my $xdb = $self->{xdb};
-       my $qp = $PublicInbox::Search::X{QueryParser}->new;
+       my $qp = $self->{qp} = $PublicInbox::Search::X{QueryParser}->new;
        $qp->set_default_op(PublicInbox::Search::OP_AND());
        $qp->set_database($xdb);
        $qp->set_stemmer(PublicInbox::Search::stemmer($self));
@@ -76,7 +76,7 @@ sub mset {
        my ($self, $qs, $opt) = @_;
        $opt ||= {};
        reopen($self);
-       my $qp = $self->{qp} //= mi_qp_new($self);
+       my $qp = $self->{qp} // mi_qp_new($self);
        $qs = 'type:inbox' if $qs eq '';
        my $qr = $qp->parse_query($qs, $PublicInbox::Search::QP_FLAGS);
        $opt->{relevance} = 1 unless exists $opt->{relevance};
index eb5e67ba5bf12afe8d5df0bc646364eaf7c9b3ad..649157befcc57af7c5452d26597a92a3954bd4ea 100644 (file)
@@ -413,7 +413,7 @@ sub query_approxidate {
 # read-only, for mail only (codesearch has different rules)
 sub mset {
        my ($self, $qry_str, $opt) = @_;
-       my $qp = $self->{qp} //= $self->qparse_new;
+       my $qp = $self->{qp} // $self->qparse_new;
        my $qry = $qp->parse_query($qry_str, $self->{qp_flags});
        if (defined(my $eidx_key = $opt->{eidx_key})) {
                $qry = $X{Query}->new(OP_FILTER(), $qry, 'O'.$eidx_key);
@@ -570,7 +570,7 @@ sub stemmer { $X{Stem}->new($LANG) }
 
 sub qp_init_common {
        my ($self) = @_;
-       my $qp = $X{QueryParser}->new;
+       my $qp = $self->{qp} = $X{QueryParser}->new;
        $qp->set_default_op(OP_AND());
        $qp->set_database(xdb($self));
        $qp->set_stemmer(stemmer($self));
@@ -654,7 +654,7 @@ EOM
 
 sub help {
        my ($self) = @_;
-       $self->{qp} //= $self->qparse_new; # parse altids
+       $self->{qp} // $self->qparse_new; # parse altids
        my @ret = @HELP;
        if (my $user_pfx = $self->{-user_pfx}) {
                push @ret, @$user_pfx;
index ba41b5d23c8329579e4bc05f2741d84eca7e30e3..7e61631c056e99cd706867f9855b11b11460e62f 100644 (file)
@@ -225,7 +225,7 @@ sub dispatch {
                }
                bless $new, $req->{c} ? 'PublicInbox::CodeSearch' :
                                        'PublicInbox::Search';
-               $new->{qp} = $new->qparse_new;
+               $new->qparse_new;
                $SRCH{$key} = $new;
        };
        $req->{srch}->{xdb}->reopen unless $new;