Note: This is a beta release of Red Hat Bugzilla 5.0. The data contained within is a snapshot of the live data so any changes you make will not be reflected in the production Bugzilla. Also email is disabled so feel free to test any aspect of the site that you want. File any problems you find or give feedback here.
Bug 1686434 - pcre2-10.33-0.1.RC1.fc31 broke fish (SIGSEGV in pcre2_substitute_32)
Summary: pcre2-10.33-0.1.RC1.fc31 broke fish (SIGSEGV in pcre2_substitute_32)
Keywords:
Status: CLOSED RAWHIDE
Alias: None
Product: Fedora
Classification: Fedora
Component: pcre2
Version: rawhide
Hardware: Unspecified
OS: Unspecified
urgent
high
Target Milestone: ---
Assignee: Petr Pisar
QA Contact: Fedora Extras Quality Assurance
URL: https://bugs.exim.org/show_bug.cgi?id...
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2019-03-07 13:06 UTC by Igor Gnatenko
Modified: 2019-03-11 12:13 UTC (History)
1 user (show)

Fixed In Version: pcre2-10.33-0.2.RC1.fc31
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed: 2019-03-11 12:13:42 UTC


Attachments (Terms of Use)

Description Igor Gnatenko 2019-03-07 13:06:29 UTC
With pcre2-10.32-8.fc30 everything was working.

Thread 1 (Thread 0x7f905c2b7d00 (LWP 2263)):
#0  0x00007f905c8489e5 in pcre2_substitute_32 (code=<optimized out>, subject=<optimized out>, length=<optimized out>, length@entry=40, start_offset=<optimized out>, start_offset@entry=0, options=<optimized out>, options@entry=4608, match_data=<optimized out>, mcontext=<optimized out>, replacement=<optimized out>, rlength=<optimized out>, buffer=<optimized out>, blength=<optimized out>) at src/pcre2_substitute.c:834
        ptrstack = {0x0, 0x0, 0x7ffe1d669210, 0x0, 0x0, 0x0, 0x7ffe1d669230, 0x0, 0x0, 0x0, 0x7ffe1d669250, 0x0, 0x0, 0x0, 0x7ffe00000000, 0x0, 0x0, 0x0, 0x0, 0xfe5c41952253c700}
        ptrstackptr = 0
        rc = <optimized out>
        subs = <optimized out>
        forcecase = 0
        forcecasereset = 0
        ovector_count = <optimized out>
        goptions = <optimized out>
        suboptions = 4608
        match_data_created = <optimized out>
        literal = 0
        overflowed = 0
        utf = <optimized out>
        temp = {35120944, 21888, 0, 0, 493261176, 32766}
        ptr = 0x55800215ce00
        repend = 0x55800215ce00
        extra_needed = <optimized out>
        buff_offset = <optimized out>
        buff_length = <optimized out>
        lengthleft = <optimized out>
        fraglength = <optimized out>
        ovector = <optimized out>
        ovecsave = <optimized out>
        scb = {version = 0, input = 0x55800217ff40, output = 0x558002155dd0, output_offsets = {0, 0}, ovector = 0x558002180270, oveccount = 1, subscount = 21888}
#1  0x00005580004982bc in regex_replacer_t::replace_matches (this=0x55800215cd60, arg=L"/home/brain/.config/fish/conf.d/omf.fish") at /usr/include/c++/9/bits/basic_string.h:2297
        options = 4608
        arglen = 40
        bufsize = <optimized out>
        output = <optimized out>
        pcre2_rc = <optimized out>
        outlen = 18446744073709551615
        done = false
        outstr = L""
        rc = <optimized out>
#2  0x0000558000496d68 in string_replace (parser=..., streams=..., argc=<optimized out>, argv=<optimized out>) at ../src/builtin_string.cpp:1054
        arg = <optimized out>
        opts = {all_valid = true, chars_valid = false, count_valid = false, entire_valid = false, filter_valid = true, ignore_case_valid = true, index_valid = false, invert_valid = false, left_valid = false, length_valid = false, max_valid = false, no_newline_valid = false, no_quoted_valid = false, quiet_valid = true, regex_valid = true, right_valid = false, start_valid = false, style_valid = false, no_empty_valid = false, all = false, entire = false, filter = false, ignore_case = false, index = false, invert_match = false, left = false, no_newline = false, no_quoted = false, quiet = false, regex = true, right = false, no_empty = false, count = 0, length = 0, max = 0, start = 0, chars_to_trim = 0x55800056a4e0 L" \f\n\r\t", arg1 = 0x5580021606b8 L"^.*/", arg2 = 0x5580021606cc L"", escape_style = STRING_STYLE_SCRIPT}
        optind = 5
        retval = <optimized out>
        pattern = 0x5580021606b8 L"^.*/"
        replacement = 0x5580021606cc L""
        replacer = std::unique_ptr<string_replacer_t> = {get() = 0x55800215cd60}
        aiter = {argv_ = 0x558002160638, argidx_ = 6, buffer_ = "", split0_ = false, storage_ = L"/home/brain/.config/fish/conf.d/omf.fish", streams_ = @0x7ffe1d6698d0}
#3  0x000055800046ab06 in builtin_run (parser=..., job_pgid=-2, argv=0x558002160630, streams=...) at ../src/builtin.cpp:516
        grab_tty = <optimized out>
        pgroup_to_restore = -1
        ret = <optimized out>
        data = 0x5580005afbb0 <builtin_datas+1104>
#4  0x00005580004d5ac0 in exec_internal_builtin_proc (streams=..., proc_io_chain=..., pipe_read=<optimized out>, p=0x55800217e3d0, j=std::shared_ptr<class job_t> (use count 5, weak count 0) = {...}, parser=...) at /usr/include/c++/9/bits/shared_ptr_base.h:1020
        local_builtin_stdin = 0
        close_stdin = <optimized out>
        stdin_is_directly_redirected = <optimized out>
        fg = 1
        local_builtin_stdin = <optimized out>
        close_stdin = <optimized out>
        stdin_is_directly_redirected = <optimized out>
        fg = <optimized out>
        in = <optimized out>
        in_fd = <optimized out>
        in_pipe = <optimized out>
        in_file = <optimized out>
        stdin_io = <optimized out>
#5  exec_process_in_job (stdout_read_limit=10485760, all_ios=..., out_pipe_next_read=0x7ffe1d669800, pipe_current_read=..., j=std::shared_ptr<class job_t> (empty) = {...}, p=0x55800217e3d0, parser=...) at ../src/exec.cpp:967
        builtin_io_streams = {out = {buffer_ = {buffer_limit_ = 10485760, contents_size_ = 0, elements_ = std::vector of length 0, capacity 0, discard = false}}, err = {buffer_ = {buffer_limit_ = 10485760, contents_size_ = 0, elements_ = std::vector of length 0, capacity 0, discard = false}}, stdin_fd = 0, stdin_is_directly_redirected = false, out_is_redirected = true, err_is_redirected = false, io_chain = 0x7ffe1d669890}
        process_net_io_chain = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 1, capacity 1 = {std::shared_ptr<io_data_t> (use count 7, weak count 0) = {get() = 0x55800217e5f0}}, <No data fields>}
        pipes_to_next_command = <optimized out>
        pipe_current_write = {fd_ = -1}
        pipe_write = std::shared_ptr<io_pipe_t> (empty) = {get() = <optimized out>}
        pipe_read = std::shared_ptr<io_pipe_t> (empty) = {get() = <optimized out>}
        process_net_io_chain = <optimized out>
        pipes_to_next_command = <optimized out>
        pipe_current_write = <optimized out>
        pipe_write = <optimized out>
        pipe_read = <optimized out>
        local_pipe = <optimized out>
        builtin_io_streams = <optimized out>
#6  exec_job (parser=..., j=std::shared_ptr<class job_t> (use count 5, weak count 0) = {...}) at ../src/exec.cpp:1064
        current_read = {fd_ = -1}
        unique_p = std::unique_ptr<process_t> = {get() = 0x55800217e3d0}
        __for_range = <optimized out>
        __for_begin = <optimized out>
        __for_end = <optimized out>
        exec_error = false
        parent_job = std::shared_ptr<job_t> (empty) = {get() = <optimized out>}
        stdout_read_limit = <optimized out>
        all_ios = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 1, capacity 1 = {std::shared_ptr<io_data_t> (use count 7, weak count 0) = {get() = 0x55800217e5f0}}, <No data fields>}
        pipe_next_read = {fd_ = -1}
#7  0x0000558000555a3f in parse_execution_context_t::run_1_job (this=this@entry=0x55800217c590, job_node=..., associated_block=associated_block@entry=0x55800217e260) at /usr/include/c++/9/ext/atomicity.h:96
        job_contained_external_command = false
        pop_result = <optimized out>
        populated_job = true
        tmodes = {c_iflag = 0, c_oflag = 0, c_cflag = 0, c_lflag = 0, c_line = 0 '\000', c_cc = '\000' <repeats 31 times>, c_ispeed = 0, c_ospeed = 0}
        saved_eval_level = {ref = 0x5580005b2178 <s_principal_parser+88>, saved_value = 2, restored = false}
        saved_node = {ref = 0x55800217c5c0, saved_value = {tree = 0x0, nodeptr = 0x0}, restored = false}
        start_time = 0
        parse_time = 0
        exec_time = 0
        profile_item = 0x0
        job = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215cc70}
#8  0x0000558000556224 in parse_execution_context_t::run_job_conjunction (this=this@entry=0x55800217c590, job_expr=..., associated_block=associated_block@entry=0x55800217e260) at ../src/tnode.h:130
        skip = <optimized out>
        result = parse_execution_success
        cursor = {tree = 0x558002150430, nodeptr = <optimized out>}
        continuation = {tree = 0x0, nodeptr = 0x0}
#9  0x0000558000559969 in parse_execution_context_t::run_job_list<grammar::job_list> (this=this@entry=0x55800217c590, job_list=..., associated_block=associated_block@entry=0x55800217e260) at ../src/tnode.h:210
        job_conj = {tree = <optimized out>, nodeptr = 0x55800217fa58}
        result = parse_execution_success
#10 0x0000558000557694 in parse_execution_context_t::eval_node (this=0x55800217c590, job_list=..., associated_block=associated_block@entry=0x55800217e260, io=...) at ../src/parse_execution.cpp:1375
        block_io_push = {ref = 0x55800217c5a0, saved_value = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 0, capacity 0, <No data fields>}, restored = false}
        status = parse_execution_success
        func_name = L""
        infinite_recursive_node = {tree = <optimized out>, nodeptr = 0x0}
#11 0x0000558000519ba4 in parser_t::eval_node<grammar::job_list> (this=this@entry=0x5580005b2120 <s_principal_parser>, ps=std::shared_ptr<const struct parsed_source_t> (use count 4, weak count 0) = {...}, node=..., io=..., block_type=block_type@entry=SUBST, parent_job=std::shared_ptr<class job_t> (empty) = {...}) at /usr/include/c++/9/bits/unique_ptr.h:283
        scope_block = 0x55800217e260
        exc = <optimized out>
        result = <optimized out>
#12 0x00005580005172f4 in parser_t::eval (this=0x5580005b2120 <s_principal_parser>, ps=std::shared_ptr<const struct parsed_source_t> (use count 4, weak count 0) = {...}, io=..., block_type=SUBST) at /usr/include/c++/9/ext/atomicity.h:96
        start = {tree = 0x558002150430, nodeptr = 0x55800217fa30}
#13 0x0000558000518e86 in parser_t::eval (this=this@entry=0x5580005b2120 <s_principal_parser>, cmd=L"string replace -r '^.*/' '' -- $file", io=..., block_type=block_type@entry=SUBST) at /usr/include/c++/9/ext/atomicity.h:96
        error_list = std::vector of length 0, capacity 0
        ps = std::shared_ptr<const parsed_source_t> (use count 4, weak count 0) = {get() = 0x558002150410}
#14 0x00005580004d7cb6 in exec_subshell_internal (cmd=L"string replace -r '^.*/' '' -- $file", lst=lst@entry=0x7ffe1d66a240, apply_exit_status=<optimized out>, is_subcmd=<optimized out>) at /usr/include/c++/9/bits/basic_string.h:936
        parser = @0x5580005b2120: {cancellation_requested = 0, is_within_fish_initialization = true, execution_context = std::unique_ptr<parse_execution_context_t> = {get() = 0x55800217c590}, forbidden_function = std::vector of length 0, capacity 1, my_job_list = std::__cxx11::list = {[0] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215cc70}, [1] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215d790}}, block_stack = std::vector of length 5, capacity 16 = {std::unique_ptr<block_t> = {get() = 0x558002156170}, std::unique_ptr<block_t> = {get() = 0x5580021561d0}, std::unique_ptr<block_t> = {get() = 0x558002156110}, std::unique_ptr<block_t> = {get() = 0x558002162dc0}, std::unique_ptr<block_t> = {get() = 0x55800217e260}}, eval_level = 3, profile_items = std::vector of length 0, capacity 0, global_event_blocks = empty std::__cxx11::list}
        __FUNCTION__ = "exec_subshell_internal"
        prev_subshell = false
        prev_status = 0
        split_output = true
        ifs = {storage = "P\362\027\002\200U\000\000p\362\027\002\200U\000\000p\362\027\002\200U\000\000\000=J\000\200U\000", filled = true}
        subcommand_status = -1
        io_buffer = std::shared_ptr<io_buffer_t> (use count 7, weak count 0) = {get() = 0x55800217e5f0}
#15 0x00005580004d81e0 in exec_subshell (cmd=L"string replace -r '^.*/' '' -- $file", outputs=std::vector of length 0, capacity 0, apply_exit_status=apply_exit_status@entry=true, is_subcmd=is_subcmd@entry=true) at ../src/exec.cpp:1169
        __FUNCTION__ = "exec_subshell"
#16 0x00005580004dc6b5 in expand_cmdsubst (input=L"(string replace -r '^.*/' '' -- $file)", out_list=0x7ffe1d66a4d0, errors=errors@entry=0x7ffe1d66a630) at ../src/expand.cpp:640
        subcmd = L"string replace -r '^.*/' '' -- $file"
        tail_expand = std::vector of length 0, capacity 979252908033 = {<error reading variable tail_expand (Cannot access memory at address 0x1e)>
        paren_begin = 0x55800217e320 L"(string replace -r '^.*/' '' -- $file)"
        paren_end = 0x55800217e3b4 L")"
        tail_begin = 0x0
        i = <optimized out>
        j = <optimized out>
        in = 0x55800217e320 L"(string replace -r '^.*/' '' -- $file)"
        sub_res = std::vector of length 0, capacity 0
#17 0x00005580004dd018 in expand_stage_cmdsubst (input=L"(string replace -r '^.*/' '' -- $file)", out=0x7ffe1d66a4d0, flags=<optimized out>, errors=0x7ffe1d66a630) at ../src/expand.cpp:905
        cmdsubst_ok = <optimized out>
#18 0x00005580004dad49 in expand_string (input=L"(string replace -r '^.*/' '' -- $file)", out_completions=out_completions@entry=0x7ffe1d66a610, flags=flags@entry=64, errors=errors@entry=0x7ffe1d66a630) at /usr/include/c++/9/bits/char_traits.h:413
        next = L""
        this_result = <optimized out>
        i = 0
        stage_idx = 0
        stages = {0x5580004dcf00 <expand_stage_cmdsubst(wcstring, std::vector<completion_t, std::allocator<completion_t> >*, expand_flags_t, parse_error_list_t*)>, 0x5580004de510 <expand_stage_variables(wcstring, std::vector<completion_t, std::allocator<completion_t> >*, expand_flags_t, parse_error_list_t*)>, 0x5580004dc490 <expand_stage_braces(wcstring, std::vector<completion_t, std::allocator<completion_t> >*, expand_flags_t, parse_error_list_t*)>, 0x5580004da4d0 <expand_stage_home_and_self(wcstring, std::vector<completion_t, std::allocator<completion_t> >*, expand_flags_t, parse_error_list_t*)>, 0x5580004de860 <expand_stage_wildcards(wcstring, std::vector<completion_t, std::allocator<completion_t> >*, expand_flags_t, parse_error_list_t*)>}
        completions = std::vector of length 1, capacity 1 = {{completion = L"", description = L"", match = {type = fuzzy_match_exact, match_distance_first = 0, match_distance_second = 0}, flags = 0}}
        output_storage = std::vector of length 0, capacity 0
        total_result = EXPAND_OK
#19 0x0000558000551a14 in parse_execution_context_t::expand_arguments_from_nodes (this=this@entry=0x55800215c970, argument_nodes=std::vector of length 3, capacity 4 = {...}, out_arguments=out_arguments@entry=0x7ffe1d66a760, glob_behavior=glob_behavior@entry=parse_execution_context_t::nullglob) at /usr/include/c++/9/bits/basic_string.h:936
        arg_str = L"(string replace -r '^.*/' '' -- $file)"
        errors = std::vector of length 0, capacity 0
        expand_ret = <optimized out>
        arg_node = {tree = <optimized out>, nodeptr = 0x558002193830}
        __for_range = std::vector of length 3, capacity 4 = {{tree = 0x558002156010, nodeptr = 0x5580021937b8}, {tree = 0x558002156010, nodeptr = 0x5580021937f4}, {tree = 0x558002156010, nodeptr = 0x558002193830}}
        __for_begin = <optimized out>
        __for_end = <optimized out>
        arg_expanded = std::vector of length 0, capacity 1
#20 0x000055800055373d in parse_execution_context_t::populate_plain_process (this=this@entry=0x55800215c970, job=job@entry=0x558002150310, proc=proc@entry=0x55800217eab0, statement=...) at ../src/parse_execution.cpp:859
        glob_behavior = parse_execution_context_t::nullglob
        arg_nodes = std::vector of length 3, capacity 4 = {{tree = 0x558002156010, nodeptr = 0x5580021937b8}, {tree = 0x558002156010, nodeptr = 0x5580021937f4}, {tree = 0x558002156010, nodeptr = 0x558002193830}}
        arg_result = <optimized out>
        use_implicit_cd = false
        cmd = L"set"
        args_from_cmd_expansion = std::vector of length 0, capacity 0
        ret = parse_execution_success
        process_type = <optimized out>
        last_exec_run_counter = 4294967295
        path_to_external_command = L""
        cmd_args = std::vector of length 3, capacity 4 = {L"set", L"-l", L"basename"}
        process_io_chain = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 0, capacity 0, <No data fields>}
#21 0x0000558000554424 in parse_execution_context_t::populate_job_process (this=this@entry=0x55800215c970, job=job@entry=0x558002150310, proc=0x55800217eab0, statement=...) at ../src/parse_execution.cpp:1056
        dec_stat = {tree = 0x558002156010, nodeptr = 0x558002193768}
        plain_statement = <optimized out>
        specific_statement = <optimized out>
        result = parse_execution_success
#22 0x0000558000554a25 in parse_execution_context_t::populate_job_from_job_node (this=this@entry=0x55800215c970, j=j@entry=0x558002150310, job_node=..., associated_block=associated_block@entry=0x558002162dc0) at /usr/include/c++/9/bits/unique_ptr.h:357
        statement = {tree = <optimized out>, nodeptr = 0x55800219372c}
        result = parse_execution_success
        processes = std::vector of length 1, capacity 1 = {std::unique_ptr<process_t> = {get() = 0x55800217eab0}}
        job_cont = <optimized out>
#23 0x0000558000555705 in parse_execution_context_t::run_1_job (this=this@entry=0x55800215c970, job_node=..., associated_block=associated_block@entry=0x558002162dc0) at ../src/parse_execution.cpp:1221
        pop_result = <optimized out>
        populated_job = <optimized out>
        tmodes = {c_iflag = 0, c_oflag = 0, c_cflag = 0, c_lflag = 0, c_line = 0 '\000', c_cc = '\000' <repeats 31 times>, c_ispeed = 0, c_ospeed = 0}
        saved_eval_level = {ref = 0x5580005b2178 <s_principal_parser+88>, saved_value = 1, restored = false}
        saved_node = {ref = 0x55800215c9a0, saved_value = {tree = 0x558002156010, nodeptr = 0x5580021934d4}, restored = false}
        start_time = 0
        parse_time = 0
        exec_time = 0
        profile_item = 0x0
        job = std::shared_ptr<job_t> (use count 2, weak count 0) = {get() = 0x558002150310}
#24 0x0000558000556224 in parse_execution_context_t::run_job_conjunction (this=this@entry=0x55800215c970, job_expr=..., associated_block=associated_block@entry=0x558002162dc0) at ../src/tnode.h:130
        skip = <optimized out>
        result = parse_execution_success
        cursor = {tree = 0x558002156010, nodeptr = <optimized out>}
        continuation = {tree = 0x0, nodeptr = 0x0}
#25 0x0000558000559969 in parse_execution_context_t::run_job_list<grammar::job_list> (this=this@entry=0x55800215c970, job_list=..., associated_block=associated_block@entry=0x558002162dc0) at ../src/tnode.h:210
        job_conj = {tree = <optimized out>, nodeptr = 0x5580021936dc}
        result = parse_execution_success
#26 0x00005580005566f2 in parse_execution_context_t::run_for_statement (this=this@entry=0x55800215c970, header=..., block_contents=...) at ../src/parse_execution.cpp:412
        retval = <optimized out>
        val = L"/home/brain/.config/fish/conf.d/omf.fish"
        __for_range = std::vector of length 1, capacity 3 = {L"/home/brain/.config/fish/conf.d/omf.fish"}
        __for_begin = <optimized out>
        __for_end = <optimized out>
        var_name_node = <optimized out>
        for_var_name = L"file"
        arguments = std::vector of length 1, capacity 3 = {L"/home/brain/.config/fish/conf.d/omf.fish"}
        ret = parse_execution_success
        var = {storage = "\220\327\025\002\200U\000\000x\346\027\002\200U\000\000\320\030\026\002\200U\000\000\240\356Q\000\200U\000", filled = false}
        fb = 0x558002162dc0
#27 0x0000558000557e6c in parse_execution_context_t::run_block_statement (this=this@entry=0x55800215c970, statement=..., associated_block=associated_block@entry=0x558002156110) at ../src/parse_execution.cpp:345
        header = <optimized out>
        bheader = {tree = 0x558002156010, nodeptr = 0x55800219354c}
        contents = <optimized out>
        ret = parse_execution_success
#28 0x0000558000555e23 in parse_execution_context_t::run_1_job (this=this@entry=0x55800215c970, job_node=..., associated_block=associated_block@entry=0x558002156110) at /usr/include/c++/9/bits/shared_ptr_base.h:1020
        result = parse_execution_success
        statement = <optimized out>
        specific_statement = @0x558002193538: {source_start = 10031, source_length = 453, parent = 3375, child_start = 3379, child_count = 4 '\004', type = symbol_block_statement, keyword = parse_keyword_none, flags = 0 '\000', tag = 0 '\000'}
        tmodes = {c_iflag = 0, c_oflag = 0, c_cflag = 0, c_lflag = 0, c_line = 0 '\000', c_cc = '\000' <repeats 31 times>, c_ispeed = 0, c_ospeed = 0}
        saved_eval_level = {ref = 0x5580005b2178 <s_principal_parser+88>, saved_value = 0, restored = false}
        saved_node = {ref = 0x55800215c9a0, saved_value = {tree = 0x0, nodeptr = 0x0}, restored = false}
        start_time = 0
        parse_time = 0
        exec_time = 0
        profile_item = 0x0
        job = <optimized out>
#29 0x0000558000556224 in parse_execution_context_t::run_job_conjunction (this=this@entry=0x55800215c970, job_expr=..., associated_block=associated_block@entry=0x558002156110) at ../src/tnode.h:130
        skip = <optimized out>
        result = parse_execution_success
        cursor = {tree = 0x558002156010, nodeptr = <optimized out>}
        continuation = {tree = 0x0, nodeptr = 0x0}
#30 0x0000558000559969 in parse_execution_context_t::run_job_list<grammar::job_list> (this=this@entry=0x55800215c970, job_list=..., associated_block=associated_block@entry=0x558002156110) at ../src/tnode.h:210
        job_conj = {tree = <optimized out>, nodeptr = 0x5580021934ac}
        result = parse_execution_success
#31 0x0000558000557694 in parse_execution_context_t::eval_node (this=0x55800215c970, job_list=..., associated_block=associated_block@entry=0x558002156110, io=...) at ../src/parse_execution.cpp:1375
        block_io_push = {ref = 0x55800215c980, saved_value = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 0, capacity 0, <No data fields>}, restored = false}
        status = parse_execution_success
        func_name = L""
        infinite_recursive_node = {tree = <optimized out>, nodeptr = 0x0}
#32 0x0000558000519ba4 in parser_t::eval_node<grammar::job_list> (this=this@entry=0x5580005b2120 <s_principal_parser>, ps=std::shared_ptr<const struct parsed_source_t> (use count 17, weak count 0) = {...}, node=..., io=..., block_type=block_type@entry=TOP, parent_job=std::shared_ptr<class job_t> (empty) = {...}) at /usr/include/c++/9/bits/unique_ptr.h:283
        scope_block = 0x558002156110
        exc = <optimized out>
        result = <optimized out>
#33 0x00005580005172f4 in parser_t::eval (this=this@entry=0x5580005b2120 <s_principal_parser>, ps=std::shared_ptr<const struct parsed_source_t> (use count 17, weak count 0) = {...}, io=..., block_type=block_type@entry=TOP) at /usr/include/c++/9/ext/atomicity.h:96
        start = {tree = 0x558002156010, nodeptr = 0x558002182d50}
#34 0x000055800052674c in read_ni (fd=fd@entry=3, io=...) at /usr/include/c++/9/ext/atomicity.h:96
        str = L"# Main file for fish command completions. This file contains various\n# common helper functions for the command completions. All actual\n# completions are located in the completions subdirectory.\n#\n# Se"...
        errors = std::vector of length 0, capacity 0
        pstree = std::shared_ptr<const parsed_source_t> (use count 17, weak count 0) = {get() = 0x558002155ff0}
        parser = @0x5580005b2120: {cancellation_requested = 0, is_within_fish_initialization = true, execution_context = std::unique_ptr<parse_execution_context_t> = {get() = 0x55800217c590}, forbidden_function = std::vector of length 0, capacity 1, my_job_list = std::__cxx11::list = {[0] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215cc70}, [1] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215d790}}, block_stack = std::vector of length 5, capacity 16 = {std::unique_ptr<block_t> = {get() = 0x558002156170}, std::unique_ptr<block_t> = {get() = 0x5580021561d0}, std::unique_ptr<block_t> = {get() = 0x558002156110}, std::unique_ptr<block_t> = {get() = 0x558002162dc0}, std::unique_ptr<block_t> = {get() = 0x55800217e260}}, eval_level = 3, profile_items = std::vector of length 0, capacity 0, global_event_blocks = empty std::__cxx11::list}
        in_stream = <optimized out>
        acc = std::vector of length 0, capacity 16384
        des = <optimized out>
        res = 0
#35 0x0000558000530f9a in reader_read (fd=fd@entry=3, io=...) at /usr/include/c++/9/ext/new_allocator.h:119
        res = <optimized out>
        inter = 0
        data = <optimized out>
#36 0x0000558000490468 in builtin_source (parser=..., streams=..., argv=<optimized out>) at /usr/include/c++/9/ext/atomicity.h:98
        __FUNCTION__ = "builtin_source"
        cmd = 0x55800215c9f8 L"source"
        argc = <optimized out>
        opts = {print_help = false}
        optind = 1
        retval = <optimized out>
        fd = 3
        buf = {st_dev = 64769, st_ino = 924371, st_nlink = 1, st_mode = 33188, st_uid = 0, st_gid = 0, __pad0 = 0, st_rdev = 0, st_size = 10485, st_blksize = 4096, st_blocks = 24, st_atim = {tv_sec = 1551877238, tv_nsec = 444598052}, st_mtim = {tv_sec = 1550583557, tv_nsec = 0}, st_ctim = {tv_sec = 1550602733, tv_nsec = 727904880}, __glibc_reserved = {0, 0, 0}}
        fn = <optimized out>
        fn_intern = 0x55800215c060 L"/usr/share/fish/config.fish"
        sb = 0x5580021561d0
#37 0x000055800046ab06 in builtin_run (parser=..., job_pgid=-2, argv=0x55800215c9e0, streams=...) at ../src/builtin.cpp:516
        grab_tty = <optimized out>
        pgroup_to_restore = -1
        ret = <optimized out>
        data = 0x5580005afb80 <builtin_datas+1056>
#38 0x00005580004d5ac0 in exec_internal_builtin_proc (streams=..., proc_io_chain=..., pipe_read=<optimized out>, p=0x55800215baf0, j=std::shared_ptr<class job_t> (use count 5, weak count 0) = {...}, parser=...) at /usr/include/c++/9/bits/shared_ptr_base.h:1020
        local_builtin_stdin = 0
        close_stdin = <optimized out>
        stdin_is_directly_redirected = <optimized out>
        fg = 1
        local_builtin_stdin = <optimized out>
        close_stdin = <optimized out>
        stdin_is_directly_redirected = <optimized out>
        fg = <optimized out>
        in = <optimized out>
        in_fd = <optimized out>
        in_pipe = <optimized out>
        in_file = <optimized out>
        stdin_io = <optimized out>
#39 exec_process_in_job (stdout_read_limit=0, all_ios=..., out_pipe_next_read=0x7ffe1d66c6f0, pipe_current_read=..., j=std::shared_ptr<class job_t> (empty) = {...}, p=0x55800215baf0, parser=...) at ../src/exec.cpp:967
        builtin_io_streams = {out = {buffer_ = {buffer_limit_ = 0, contents_size_ = 0, elements_ = std::vector of length 0, capacity 0, discard = false}}, err = {buffer_ = {buffer_limit_ = 0, contents_size_ = 0, elements_ = std::vector of length 0, capacity 0, discard = false}}, stdin_fd = 0, stdin_is_directly_redirected = false, out_is_redirected = false, err_is_redirected = false, io_chain = 0x7ffe1d66c780}
        process_net_io_chain = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 0, capacity 0, <No data fields>}
        pipes_to_next_command = <optimized out>
        pipe_current_write = {fd_ = -1}
        pipe_write = std::shared_ptr<io_pipe_t> (empty) = {get() = <optimized out>}
        pipe_read = std::shared_ptr<io_pipe_t> (empty) = {get() = <optimized out>}
        process_net_io_chain = <optimized out>
        pipes_to_next_command = <optimized out>
        pipe_current_write = <optimized out>
        pipe_write = <optimized out>
        pipe_read = <optimized out>
        local_pipe = <optimized out>
        builtin_io_streams = <optimized out>
#40 exec_job (parser=..., j=std::shared_ptr<class job_t> (use count 5, weak count 0) = {...}) at ../src/exec.cpp:1064
        current_read = {fd_ = -1}
        unique_p = std::unique_ptr<process_t> = {get() = 0x55800215baf0}
        __for_range = <optimized out>
        __for_begin = <optimized out>
        __for_end = <optimized out>
        exec_error = false
        parent_job = std::shared_ptr<job_t> (empty) = {get() = <optimized out>}
        stdout_read_limit = <optimized out>
        all_ios = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 0, capacity 0, <No data fields>}
        pipe_next_read = {fd_ = -1}
#41 0x0000558000555a3f in parse_execution_context_t::run_1_job (this=this@entry=0x55800215cf60, job_node=..., associated_block=associated_block@entry=0x558002156170) at /usr/include/c++/9/ext/atomicity.h:96
        job_contained_external_command = false
        pop_result = <optimized out>
        populated_job = true
        tmodes = {c_iflag = 0, c_oflag = 0, c_cflag = 0, c_lflag = 0, c_line = 0 '\000', c_cc = '\000' <repeats 31 times>, c_ispeed = 0, c_ospeed = 0}
        saved_eval_level = {ref = 0x5580005b2178 <s_principal_parser+88>, saved_value = -1, restored = false}
        saved_node = {ref = 0x55800215cf90, saved_value = {tree = 0x0, nodeptr = 0x0}, restored = false}
        start_time = 0
        parse_time = 0
        exec_time = 0
        profile_item = 0x0
        job = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215d790}
#42 0x0000558000556224 in parse_execution_context_t::run_job_conjunction (this=this@entry=0x55800215cf60, job_expr=..., associated_block=associated_block@entry=0x558002156170) at ../src/tnode.h:130
        skip = <optimized out>
        result = parse_execution_success
        cursor = {tree = 0x55800215cac0, nodeptr = <optimized out>}
        continuation = {tree = 0x0, nodeptr = 0x0}
#43 0x0000558000559969 in parse_execution_context_t::run_job_list<grammar::job_list> (this=this@entry=0x55800215cf60, job_list=..., associated_block=associated_block@entry=0x558002156170) at ../src/tnode.h:210
        job_conj = {tree = <optimized out>, nodeptr = 0x55800215de88}
        result = parse_execution_success
#44 0x0000558000557694 in parse_execution_context_t::eval_node (this=0x55800215cf60, job_list=..., associated_block=associated_block@entry=0x558002156170, io=...) at ../src/parse_execution.cpp:1375
        block_io_push = {ref = 0x55800215cf70, saved_value = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 0, capacity 0, <No data fields>}, restored = false}
        status = parse_execution_success
        func_name = L""
        infinite_recursive_node = {tree = <optimized out>, nodeptr = 0x0}
#45 0x0000558000519ba4 in parser_t::eval_node<grammar::job_list> (this=this@entry=0x5580005b2120 <s_principal_parser>, ps=std::shared_ptr<const struct parsed_source_t> (use count 4, weak count 0) = {...}, node=..., io=..., block_type=block_type@entry=TOP, parent_job=std::shared_ptr<class job_t> (empty) = {...}) at /usr/include/c++/9/bits/unique_ptr.h:283
        scope_block = 0x558002156170
        exc = <optimized out>
        result = <optimized out>
#46 0x00005580005172f4 in parser_t::eval (this=0x5580005b2120 <s_principal_parser>, ps=std::shared_ptr<const struct parsed_source_t> (use count 4, weak count 0) = {...}, io=..., block_type=TOP) at /usr/include/c++/9/ext/atomicity.h:96
        start = {tree = 0x55800215cac0, nodeptr = 0x55800215de60}
#47 0x0000558000518e86 in parser_t::eval (this=0x5580005b2120 <s_principal_parser>, cmd=L"builtin source /usr/share/fish/config.fish", io=..., block_type=TOP) at /usr/include/c++/9/ext/atomicity.h:96
        error_list = std::vector of length 0, capacity 0
        ps = std::shared_ptr<const parsed_source_t> (use count 4, weak count 0) = {get() = 0x55800215caa0}
#48 0x0000558000467e39 in source_config_in_directory (dir=...) at /usr/include/c++/9/bits/basic_string.h:936
        config_pathname = L"/usr/share/fish/config.fish"
        escaped_dir = L"/usr/share/fish"
        escaped_pathname = L"/usr/share/fish/config.fish"
        cmd = L"builtin source /usr/share/fish/config.fish"
        parser = @0x5580005b2120: {cancellation_requested = 0, is_within_fish_initialization = true, execution_context = std::unique_ptr<parse_execution_context_t> = {get() = 0x55800217c590}, forbidden_function = std::vector of length 0, capacity 1, my_job_list = std::__cxx11::list = {[0] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215cc70}, [1] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215d790}}, block_stack = std::vector of length 5, capacity 16 = {std::unique_ptr<block_t> = {get() = 0x558002156170}, std::unique_ptr<block_t> = {get() = 0x5580021561d0}, std::unique_ptr<block_t> = {get() = 0x558002156110}, std::unique_ptr<block_t> = {get() = 0x558002162dc0}, std::unique_ptr<block_t> = {get() = 0x55800217e260}}, eval_level = 3, profile_items = std::vector of length 0, capacity 0, global_event_blocks = empty std::__cxx11::list}
#49 0x00005580004658a3 in read_init (paths=...) at ../src/fish.cpp:386
        config_dir = <error: Cannot access memory at address 0xfd01>
        config_dir = <optimized out>
#50 main (argc=3, argv=0x7ffe1d66e458) at ../src/fish.cpp:386
        res = 1
        my_optind = 3
        dummy_argv = {0x55800055dc85 "fish", 0x0}
        opts = {features = L"", batch_cmds = std::vector of length 1, capacity 1 = {"/usr/bin/gnome-session"}, postconfig_cmds = std::vector of length 0, capacity 0}
        paths = {data = L"/usr/share/fish", sysconf = L"/etc/fish", doc = L"/usr/share/doc/fish", bin = L"/usr/bin"}
        parser = @0x5580005b2120: {cancellation_requested = 0, is_within_fish_initialization = true, execution_context = std::unique_ptr<parse_execution_context_t> = {get() = 0x55800217c590}, forbidden_function = std::vector of length 0, capacity 1, my_job_list = std::__cxx11::list = {[0] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215cc70}, [1] = std::shared_ptr<job_t> (use count 5, weak count 0) = {get() = 0x55800215d790}}, block_stack = std::vector of length 5, capacity 16 = {std::unique_ptr<block_t> = {get() = 0x558002156170}, std::unique_ptr<block_t> = {get() = 0x5580021561d0}, std::unique_ptr<block_t> = {get() = 0x558002156110}, std::unique_ptr<block_t> = {get() = 0x558002162dc0}, std::unique_ptr<block_t> = {get() = 0x55800217e260}}, eval_level = 3, profile_items = std::vector of length 0, capacity 0, global_event_blocks = empty std::__cxx11::list}
        empty_ios = {<std::vector<std::shared_ptr<io_data_t>, std::allocator<std::shared_ptr<io_data_t> > >> = std::vector of length 0, capacity 0, <No data fields>}
        exit_status = <optimized out>

Comment 1 Petr Pisar 2019-03-07 14:37:56 UTC
It would be welcome if you provided a reproducer. I have not idea what fish is, how it is used and how the crash is provoked. The only fish a know is 🐟 and that does contain any PCRE2 code. At least I think.

Comment 2 Igor Gnatenko 2019-03-07 14:46:51 UTC
(In reply to Petr Pisar from comment #1)
> It would be welcome if you provided a reproducer. I have not idea what fish
> is, how it is used and how the crash is provoked. The only fish a know is 🐟
> and that does contain any PCRE2 code. At least I think.

`dnf install fish` and make sure that you have this latest versions of 'pcre2*'.

Comment 3 Igor Gnatenko 2019-03-07 14:47:37 UTC
(In reply to Igor Gnatenko from comment #2)
> (In reply to Petr Pisar from comment #1)
> > It would be welcome if you provided a reproducer. I have not idea what fish
> > is, how it is used and how the crash is provoked. The only fish a know is 🐟
> > and that does contain any PCRE2 code. At least I think.
> 
> `dnf install fish` and make sure that you have this latest versions of
> 'pcre2*'.

And run `fish` :)

Comment 4 Petr Pisar 2019-03-07 15:15:17 UTC
Thanks. I can reproduce it now. It would make debugging much easier if the fish build system did not hard-code -O2 compiler option.

Comment 5 Petr Pisar 2019-03-11 10:32:59 UTC
I diagnosed this issue as a bug in PCRE2 introduced within a new PCRE2-10.33-RC1 feature that forgot to check for mcontext pointer validity. I proposed a fix to an upstream and I will apply it soon to Fedora unless no objections emerges.


Note You need to log in before you can comment on or make changes to this bug.