Opened 7 hours ago

#852 new defect

Segfault in enquire.get_mset(0,0,x) if collapse key is set.

Reported by: Antonio Rojas Owned by: Olly Betts
Priority: normal Milestone:
Component: Other Version: 2.0.0
Severity: normal Keywords:
Cc: Blocked By:
Blocking: Operating System: Linux

Description

The following test code segfaults in 2.0, it didn't in 1.4:

#include <xapian.h>

int main() {
    char dir[] = "/tmp/xapian_test_XXXXXX";
    mkdtemp(dir);
    std::string path(dir);

    Xapian::WritableDatabase db(path, Xapian::DB_CREATE_OR_OPEN);
    for (int i = 1; i <= 2; i++) {
        Xapian::Document doc;
        doc.set_data("foo");
        doc.add_term("hello");
        doc.add_value(0, "0");
        db.add_document(doc);
    }

    Xapian::Enquire enquire(db);
    enquire.set_query(Xapian::Query("hello"));
    enquire.set_collapse_key(0);
    Xapian::MSet mset = enquire.get_mset(0, 0, 1);

    return 0;
}

Backtrace:

Program received signal SIGSEGV, Segmentation fault.
CollapseData::check_item (this=<optimized out>, results=std::vector of length 0, capacity 0, result=..., collapse_max=<optimized out>, 
    mcmp=0x7ffff7d574a0 <msetcmp_by_relevance<true>(Result const&, Result const&)>, old_item=<optimized out>) at ./api/result.h:68
⚠ warning: Source file is more recent than executable.
68          Xapian::docid get_docid() const { return did; }
(gdb) bt
#0  CollapseData::check_item (this=<optimized out>, results=std::vector of length 0, capacity 0, result=..., collapse_max=<optimized out>, 
    mcmp=0x7ffff7d574a0 <msetcmp_by_relevance<true>(Result const&, Result const&)>, old_item=<optimized out>) at ./api/result.h:68
#1  Collapser::check (this=<optimized out>, result=..., vsdoc=...) at matcher/collapser.cc:153
#2  0x00007ffff7d55bd1 in ProtoMSet::process (this=0x7fffffffdd60, new_item=..., vsdoc=...) at matcher/protomset.h:309
#3  Matcher::get_local_mset (this=<optimized out>, first=<optimized out>, maxitems=<optimized out>, check_at_least=<optimized out>, wtscheme=..., 
    mdecider=<optimized out>, sorter=<optimized out>, collapse_key=<optimized out>, collapse_max=<optimized out>, percent_threshold=<optimized out>, 
    percent_threshold_factor=<optimized out>, weight_threshold=<optimized out>, order=<optimized out>, sort_key=<optimized out>, 
    sort_by=<optimized out>, sort_val_reverse=<optimized out>, time_limit=<optimized out>, matchspies=...) at matcher/matcher.cc:563
#4  Matcher::get_mset (this=<optimized out>, first=<optimized out>, maxitems=<optimized out>, check_at_least=<optimized out>, stats=..., wtscheme=..., 
    mdecider=<optimized out>, sorter=<optimized out>, collapse_key=<optimized out>, collapse_max=<optimized out>, percent_threshold=<optimized out>, 
    weight_threshold=<optimized out>, order=<optimized out>, sort_key=<optimized out>, sort_by=<optimized out>, sort_val_reverse=<optimized out>, 
    time_limit=<optimized out>, matchspies=...) at matcher/matcher.cc:660
#5  0x00007ffff7c59642 in Xapian::Enquire::Internal::get_mset (this=0x555555586d10, first=0, maxitems=<optimized out>, checkatleast=<optimized out>, 
    rset=<optimized out>, mdecider=0x0) at api/enquire.cc:328
#6  0x00007ffff7c599b9 in Xapian::Enquire::get_mset (this=<optimized out>, first=<optimized out>, maxitems=<optimized out>, 
    checkatleast=<optimized out>, rset=<optimized out>, mdecider=0x0) at ./include/xapian/intrusive_ptr.h:301
#7  0x00005555555564d0 in main () at example.cpp:20

Change History (0)

Note: See TracTickets for help on using tickets.