# New Ticket Created by hanenkamp # Please include the string: [perl #126774] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/Ticket/Display.html?id=126774 >
This report is going to be a bit ugly since this code isn't published anywhere to point to and I'm not sure how I could possibly reduce it, but it's only four small files, so hopefully this is useful. I am getting an abort while executing this program. It does not always happen at the same point, sometimes as early as after the 4th iteration and sometimes as late as after the 5th in http-1.0.t. When I run it against valgrind, it gives the following trace which is the most information I've gotten on what's going on. I have placed the log below. Attached are the files required to see this problem in action. The test file t/http-1.0.t, the test data files t/data/http-1.0-close.txt and t/data/http-1.0-dumb.txt, and the package I am working on lib/HTTP1/StreamParser.pm6. I am working on OS X, but I get the same result running it on in my Linux VM. I am running with rakudo on moar built with rakudobrew this evening (updated shortly before 12/1/15 12:48 AM PST). It is very likely that I've done something incorrect in my code, which is causing this as I'm still getting a feel for how supply and react blocks work, but I'm confident also that regardless of whether my code is right or wrong, it shouldn't be aborting while apparently performing garbage collection on my code either. Cheers. % perl6-valgrind-m -Ilib t/http-1.0.t ================================================================================================ This is Rakudo Perl 6 running in valgrind, a tool for debugging and profiling programs. Running a program in valgrind usually takes *a lot* more time than running it directly, so please be patient. This Rakudo version is 2015.11.311.gf.94.c.31.e built on MoarVM version 2015.11.21.g.469.ba.64, running on macosx (10.10.5) / darwin (14.5.0) ------------------------------------------------------------------------------------------------ ==7204== Memcheck, a memory error detector ==7204== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==7204== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==7204== Command: /Users/sterling/.rakudobrew/moar-nom/install/bin/moar --execname=/Users/sterling/.rakudobrew/bin/../moar-nom/install/bin/perl6-valgrind-m --libpath=/Users/sterling/.rakudobrew/moar-nom/install/share/nqp/lib --libpath=/Us ers/sterling/.rakudobrew/moar-nom/install/share/perl6/lib --libpath=/Users/sterling/.rakudobrew/moar-nom/install/share/perl6/runtime /Users/sterling/.rakudobrew/moar-nom/install/share/perl6/runtime/perl6.moarvm -Ilib t/http-1.0.t ==7204== --7204-- run: /usr/bin/dsymutil "/Users/sterling/.rakudobrew/moar-nom/install/bin/moar" warning: no debug symbols in executable (-arch x86_64) --7204-- run: /usr/bin/dsymutil "/Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib" warning: no debug symbols in executable (-arch x86_64) --7204-- run: /usr/bin/dsymutil "/Users/sterling/.rakudobrew/moar-nom/install/share/perl6/runtime/dynext/libperl6_ops_moar.dylib" --7204-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option --7204-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) --7204-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); 1..40 ==7204== Thread 3: ==7204== Invalid read of size 4 ==7204== at 0x1000E3D9E: uv__stream_osx_select (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x1000E59A8: uv__thread_start (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x1006EA059: _pthread_body (in /usr/lib/system/libsystem_pthread.dylib) ==7204== by 0x1006E9FD6: _pthread_start (in /usr/lib/system/libsystem_pthread.dylib) ==7204== by 0x1006E73EC: thread_start (in /usr/lib/system/libsystem_pthread.dylib) ==7204== Address 0x100b93aeb is 203 bytes inside a block of size 206 alloc'd ==7204== at 0x100009EBB: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==7204== by 0x1000E3962: uv__stream_try_select (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x1000E701B: uv_tty_init (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x10004D0C2: MVM_file_get_stdstream (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x1000C43CF: MVM_vm_create_instance (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x100001658: main (in /Users/sterling/.rakudobrew/moar-nom/install/bin/moar) ==7204== --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); --7204:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK ); ok 1 - environment looks good ok 2 - input found in environment ok 3 - message body looks good ok 4 - no more requests expected ok 5 - environment looks good ok 6 - input found in environment ok 7 - message body looks good ok 8 - no more requests expected ok 9 - environment looks good ok 10 - input found in environment ok 11 - message body looks good ok 12 - no more requests expected ok 13 - environment looks good ok 14 - input found in environment ok 15 - message body looks good ok 16 - no more requests expected ==7204== ==7204== Process terminating with default action of signal 6 (SIGABRT) ==7204== at 0x1005D42B6: __pthread_sigmask (in /usr/lib/system/libsystem_kernel.dylib) ==7204== by 0x1004E8A40: __abort (in /usr/lib/system/libsystem_c.dylib)==7204== by 0x1004E89C1: abort (in /usr/lib/system/libsystem_c.dylib) ==7204== by 0x1000E5A23: uv_mutex_destroy (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x1000718A1: gc_free (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x1000475DF: MVM_gc_collect_free_nursery_uncopied (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x100044906: run_gc (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x1000442BD: MVM_gc_enter_from_allocator (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x100044A77: MVM_gc_allocate_zeroed (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x100044D03: MVM_gc_allocate_object (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x10002BE2B: MVM_frame_takeclosure (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== by 0x100019727: MVM_interp_run (in /Users/sterling/.rakudobrew/moar-nom/install/lib/libmoar.dylib) ==7204== ==7204== HEAP SUMMARY: ==7204== in use at exit: 82,500,601 bytes in 272,148 blocks ==7204== total heap usage: 417,278 allocs, 145,130 frees, 157,048,335 bytes allocated ==7204== ==7204== LEAK SUMMARY: ==7204== definitely lost: 148,938 bytes in 1,868 blocks ==7204== indirectly lost: 28,049 bytes in 1,538 blocks ==7204== possibly lost: 82,223,890 bytes in 268,008 blocks ==7204== still reachable: 64,432 bytes in 303 blocks ==7204== suppressed: 35,292 bytes in 431 blocks ==7204== Rerun with --leak-check=full to see details of leaked memory ==7204== ==7204== For counts of detected and suppressed errors, rerun with: -v ==7204== ERROR SUMMARY: 13 errors from 1 contexts (suppressed: 0 from 0) /Users/sterling/.rakudobrew/bin/../moar-nom/install/bin/perl6-valgrind-m: line 11: 7204 Killed: 9 valgrind /Users/sterling/.rakudobrew/moar-nom/install/bin/moar --execname="$0" --libpath="/Users/sterling/.rakudobrew/moar-no m/install/share/nqp/lib" --libpath="/Users/sterling/.rakudobrew/moar-nom/install/share/perl6/lib" --libpath="/Users/sterling/.rakudobrew/moar-nom/install/share/perl6/runtime" /Users/sterling/.rakudobrew/moar-nom/install/share/perl6/runtim e/perl6.moarvm "$@" -- Sterling Hanenkamp http://sterling.hanenkamp.com/stfl/ 785-370-4454
POST /index.html HTTP/1.0 Content-Type: application/x-www-form-urlencoded; charset=utf8 Content-Length: 11 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== Referer: http://example.com/awesome.html Connection: close User-Agent: Mozilla/Inf a=1&b=2&c=3
#!smackup use v6; use Test; use HTTP1::StreamParser; my @chunk-sizes = 1, 3, 11, 101, 1009; my @tests = { source => 'http-1.0-close.txt', expected => $[{ REQUEST_METHOD => 'POST', REQUEST_URI => '/index.html', SERVER_PROTOCOL => 'HTTP/1.0', CONTENT_TYPE => 'application/x-www-form-urlencoded; charset=utf8', CONTENT_LENGTH => '11', HTTP_AUTHORIZATION => 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==', HTTP_REFERER => 'http://example.com/awesome.html', HTTP_CONNECTION => 'close', HTTP_USER_AGENT => 'Mozilla/Inf', 'p6w.input' => 'a=1&b=2&c=3', }], }, { source => 'http-1.0-dumb.txt', expected => $[{ REQUEST_METHOD => 'POST', REQUEST_URI => '/index.html', SERVER_PROTOCOL => 'HTTP/1.0', CONTENT_TYPE => 'application/x-www-form-urlencoded; charset=utf8', CONTENT_LENGTH => '11', HTTP_AUTHORIZATION => 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==', HTTP_REFERER => 'http://example.com/awesome.html', HTTP_CONNECTION => 'close', HTTP_USER_AGENT => 'Mozilla/Inf', 'p6w.input' => 'a=1&b=2&c=3', }], }, ; plan @tests * @chunk-sizes * 4; for @tests -> $test { # Run the tests at various chunk sizes for @chunk-sizes -> $chunk-size { my $test-file = "t/data/$test<source>".IO; my $envs = parse-http1-request( $test-file.open(:r).Supply(:size($chunk-size), :bin) ); my @expected = $test<expected>; react { whenever $envs -> %env { my %exp = @expected.shift; flunk 'unexpected environment received: ', %env.perl unless %exp.defined; my $input = %env<p6w.input> :delete; my $content = %exp<p6w.input> :delete; is-deeply %env, %exp, 'environment looks good'; ok $input.defined, 'input found in environment'; my $acc = buf8.new; react { whenever $input -> $chunk { $acc ~= $chunk; } $input.wait; CATCH { default { warn $_; flunk $_; } } } is $acc.decode('utf8'), $content, 'message body looks good'; LAST { is @expected.elems, 0, 'no more requests expected'; } QUIT { warn $_; flunk $_; } } } CATCH { default { warn $_; flunk $_; } } } }
POST /index.html HTTP/1.0 Content-Type: application/x-www-form-urlencoded; charset=utf8 Content-Length: 11 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== Referer: http://example.com/awesome.html User-Agent: Mozilla/Inf a=1&b=2&c=3
StreamParser.pm6
Description: Binary data