[Bug 2032667] [NEW] stack space full (SEGFAULT) when accessing %hash with undefined $var (use warnings)

Walter 2032667 at bugs.launchpad.net
Tue Aug 22 14:28:18 UTC 2023


Public bug reported:

Accessing a hash entry with an undefined variable as key causes infinite
recursion and running out of stack space. This only happens when '-w'
("use warnings;") is enabled.

Steps to reproduce:

  $ perl -e 'my %hash = (); int($hash{$undefined_var})'
  (no crash)

  $ perl -we 'my %hash = (); int($hash{$undefined_var})'
  Useless use of int in void context at -e line 1.
  Name "main::undefined_var" used only once: possible typo at -e line 1.
  Use of uninitialized value $undefined_var in hash element at -e line 1.
  Segmentation fault
 
Version: perl-base (5.34.0-3ubuntu1.2) on Jammy

Backtrace (after installing perl-debug):

  Program received signal SIGSEGV, Segmentation fault.
  0x0000555555652d1d in Perl_hv_common (my_perl=0x5555558fa2a0, hv=0x5555559292b8, keysv=0x555555929318, key=0x0, klen=0, flags=0, action=0, val=0x0, hash=0) at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:350
  350	in /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c
  (gdb) bt 10
  #0  0x0000555555652d1d in Perl_hv_common (
      my_perl=0x5555558fa2a0, hv=0x5555559292b8, 
      keysv=0x555555929318, key=0x0, klen=0, flags=0, 
      action=0, val=0x0, hash=0)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:350
  #1  0x0000555555684afc in S_find_uninit_var (
      my_perl=0x5555558fa2a0, obase=<optimized out>, 
      uninit_sv=<optimized out>, match=<optimized out>, 
      desc_p=<optimized out>)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:16785
  #2  0x0000555555684ce4 in Perl_report_uninit (
      my_perl=0x5555558fa2a0, uninit_sv=0x555555929318)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:17051
  #3  0x000055555566771d in Perl_sv_2pv_flags (
      my_perl=0x5555558fa2a0, sv=0x555555929318, 
      lp=0x7fffff7ff1c8, flags=<optimized out>)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:3243
  #4  0x0000555555652fd5 in Perl_hv_common (
      my_perl=0x5555558fa2a0, hv=0x5555559292b8, 
      keysv=0x555555929318, key=0x0, klen=<optimized out>, 
      flags=<optimized out>, action=0, val=0x0, 
      hash=<optimized out>)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:396
  #5  0x0000555555684afc in S_find_uninit_var (
      my_perl=0x5555558fa2a0, obase=<optimized out>, 
      uninit_sv=<optimized out>, match=<optimized out>, 
      desc_p=<optimized out>)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:16785
  #6  0x0000555555684ce4 in Perl_report_uninit (
      my_perl=0x5555558fa2a0, uninit_sv=0x555555929318)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:17051
  #7  0x000055555566771d in Perl_sv_2pv_flags (
      my_perl=0x5555558fa2a0, sv=0x555555929318, 
      lp=0x7fffff7ff3b8, flags=<optimized out>)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:3243
  #8  0x0000555555652fd5 in Perl_hv_common (
      my_perl=0x5555558fa2a0, hv=0x5555559292b8, 
      keysv=0x555555929318, key=0x0, klen=<optimized out>, 
      flags=<optimized out>, action=0, val=0x0, 
      hash=<optimized out>)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:396
  #9  0x0000555555684afc in S_find_uninit_var (
      my_perl=0x5555558fa2a0, obase=<optimized out>, 
      uninit_sv=<optimized out>, match=<optimized out>, 
      desc_p=<optimized out>)
      at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:16785
  (More stack frames follow...)

Long backtrace:

  #0  0x0000555555652d1d in Perl_hv_common (my_perl=..., hv=..
  #1  0x0000555555684afc in S_find_uninit_var (my_perl=..., ob
  #2  0x0000555555684ce4 in Perl_report_uninit (my_perl=..., u
  #3  0x000055555566771d in Perl_sv_2pv_flags (my_perl=..., sv
  #4  0x0000555555652fd5 in Perl_hv_common (my_perl=..., hv=..
  #5  0x0000555555684afc in S_find_uninit_var (my_perl=..., ob
  #6  0x0000555555684ce4 in Perl_report_uninit (my_perl=..., u
  #7  0x000055555566771d in Perl_sv_2pv_flags (my_perl=..., sv
  #8  0x0000555555652fd5 in Perl_hv_common (my_perl=..., hv=..
  #9  0x0000555555684afc in S_find_uninit_var (my_perl=..., ob
  ...
  #67607 0x000055555566771d in Perl_sv_2pv_flags (my_perl=...,
  #67608 0x0000555555652fd5 in Perl_hv_common (my_perl=..., hv
  #67609 0x0000555555684afc in S_find_uninit_var (my_perl=...,
  #67610 0x0000555555684ce4 in Perl_report_uninit (my_perl=...
  #67611 0x000055555566524a in Perl_sv_2iv_flags (my_perl=...,
  #67612 0x000055555568e21d in Perl_pp_int (my_perl=...)
  #67613 0x000055555564fac6 in Perl_runops_standard (my_perl=.
  #67614 0x00005555555c955c in S_run_body (oldscope=..., my_pe
  #67615 perl_run (my_perl=...)
  #67616 0x000055555559e977 in main (argc=..., argv=..., env=.

Cheers!

Walter Doekes
OSSO B.V.

** Affects: perl (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to perl in Ubuntu.
https://bugs.launchpad.net/bugs/2032667

Title:
  stack space full (SEGFAULT) when accessing %hash with undefined $var
  (use warnings)

Status in perl package in Ubuntu:
  New

Bug description:
  Accessing a hash entry with an undefined variable as key causes
  infinite recursion and running out of stack space. This only happens
  when '-w' ("use warnings;") is enabled.

  Steps to reproduce:

    $ perl -e 'my %hash = (); int($hash{$undefined_var})'
    (no crash)

    $ perl -we 'my %hash = (); int($hash{$undefined_var})'
    Useless use of int in void context at -e line 1.
    Name "main::undefined_var" used only once: possible typo at -e line 1.
    Use of uninitialized value $undefined_var in hash element at -e line 1.
    Segmentation fault
   
  Version: perl-base (5.34.0-3ubuntu1.2) on Jammy

  Backtrace (after installing perl-debug):

    Program received signal SIGSEGV, Segmentation fault.
    0x0000555555652d1d in Perl_hv_common (my_perl=0x5555558fa2a0, hv=0x5555559292b8, keysv=0x555555929318, key=0x0, klen=0, flags=0, action=0, val=0x0, hash=0) at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:350
    350	in /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c
    (gdb) bt 10
    #0  0x0000555555652d1d in Perl_hv_common (
        my_perl=0x5555558fa2a0, hv=0x5555559292b8, 
        keysv=0x555555929318, key=0x0, klen=0, flags=0, 
        action=0, val=0x0, hash=0)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:350
    #1  0x0000555555684afc in S_find_uninit_var (
        my_perl=0x5555558fa2a0, obase=<optimized out>, 
        uninit_sv=<optimized out>, match=<optimized out>, 
        desc_p=<optimized out>)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:16785
    #2  0x0000555555684ce4 in Perl_report_uninit (
        my_perl=0x5555558fa2a0, uninit_sv=0x555555929318)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:17051
    #3  0x000055555566771d in Perl_sv_2pv_flags (
        my_perl=0x5555558fa2a0, sv=0x555555929318, 
        lp=0x7fffff7ff1c8, flags=<optimized out>)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:3243
    #4  0x0000555555652fd5 in Perl_hv_common (
        my_perl=0x5555558fa2a0, hv=0x5555559292b8, 
        keysv=0x555555929318, key=0x0, klen=<optimized out>, 
        flags=<optimized out>, action=0, val=0x0, 
        hash=<optimized out>)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:396
    #5  0x0000555555684afc in S_find_uninit_var (
        my_perl=0x5555558fa2a0, obase=<optimized out>, 
        uninit_sv=<optimized out>, match=<optimized out>, 
        desc_p=<optimized out>)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:16785
    #6  0x0000555555684ce4 in Perl_report_uninit (
        my_perl=0x5555558fa2a0, uninit_sv=0x555555929318)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:17051
    #7  0x000055555566771d in Perl_sv_2pv_flags (
        my_perl=0x5555558fa2a0, sv=0x555555929318, 
        lp=0x7fffff7ff3b8, flags=<optimized out>)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:3243
    #8  0x0000555555652fd5 in Perl_hv_common (
        my_perl=0x5555558fa2a0, hv=0x5555559292b8, 
        keysv=0x555555929318, key=0x0, klen=<optimized out>, 
        flags=<optimized out>, action=0, val=0x0, 
        hash=<optimized out>)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/hv.c:396
    #9  0x0000555555684afc in S_find_uninit_var (
        my_perl=0x5555558fa2a0, obase=<optimized out>, 
        uninit_sv=<optimized out>, match=<optimized out>, 
        desc_p=<optimized out>)
        at /build/perl-Jo9ODt/perl-5.34.0/build-static/sv.c:16785
    (More stack frames follow...)

  Long backtrace:

    #0  0x0000555555652d1d in Perl_hv_common (my_perl=..., hv=..
    #1  0x0000555555684afc in S_find_uninit_var (my_perl=..., ob
    #2  0x0000555555684ce4 in Perl_report_uninit (my_perl=..., u
    #3  0x000055555566771d in Perl_sv_2pv_flags (my_perl=..., sv
    #4  0x0000555555652fd5 in Perl_hv_common (my_perl=..., hv=..
    #5  0x0000555555684afc in S_find_uninit_var (my_perl=..., ob
    #6  0x0000555555684ce4 in Perl_report_uninit (my_perl=..., u
    #7  0x000055555566771d in Perl_sv_2pv_flags (my_perl=..., sv
    #8  0x0000555555652fd5 in Perl_hv_common (my_perl=..., hv=..
    #9  0x0000555555684afc in S_find_uninit_var (my_perl=..., ob
    ...
    #67607 0x000055555566771d in Perl_sv_2pv_flags (my_perl=...,
    #67608 0x0000555555652fd5 in Perl_hv_common (my_perl=..., hv
    #67609 0x0000555555684afc in S_find_uninit_var (my_perl=...,
    #67610 0x0000555555684ce4 in Perl_report_uninit (my_perl=...
    #67611 0x000055555566524a in Perl_sv_2iv_flags (my_perl=...,
    #67612 0x000055555568e21d in Perl_pp_int (my_perl=...)
    #67613 0x000055555564fac6 in Perl_runops_standard (my_perl=.
    #67614 0x00005555555c955c in S_run_body (oldscope=..., my_pe
    #67615 perl_run (my_perl=...)
    #67616 0x000055555559e977 in main (argc=..., argv=..., env=.

  Cheers!

  Walter Doekes
  OSSO B.V.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/perl/+bug/2032667/+subscriptions




More information about the foundations-bugs mailing list