the problematic test is:
slurp("./t")
Unix accepts to open a directory but that leads to problem down the pipe.
This following patch, apparently innocent, should fix the problem by refusing
to open a
directory but it triggers a memory bug.
../../parrot ../../runtime/parrot/library/PGE/Perl6Grammar.pir --
output=PGE/builtins_gen.pir PGE/builtins.pg
parrot(14927) malloc: *** mmap(size=1920102400) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Parrot VM: PANIC: Out of mem!
C file src/gc/memory.c, line 51
Thread 0 Crashed:
0 libSystem.B.dylib 0x9589fb9e __kill + 10
1 libSystem.B.dylib 0x95916ec2 raise + 26
2 libparrot.dylib 0x00526f7e do_panic + 606
(exceptions.c:628)
3 libparrot.dylib 0x0052e159 mem_sys_allocate + 73
(memory.c:52)
4 libparrot.dylib 0x004befa4 string_to_cstring + 68
(string.c:2108)
5 libparrot.dylib 0x005772db Parrot_stat_info_intval + 27
(stat.c:160)
6 libparrot.dylib 0x005fbe29 PIO_unix_open + 121
(io_unix.c:306)
7 libparrot.dylib 0x005fda4b PIO_open_down + 59
(io_passdown.c:49)
8 libparrot.dylib 0x005fa46f PIO_buf_open + 47
(io_buf.c:208)
9 libparrot.dylib 0x005fda4b PIO_open_down + 59
(io_passdown.c:49)
10 libparrot.dylib 0x005f97b6 PIO_open + 70 (io.c:721)
11 libparrot.dylib 0x004cd06d Parrot_open_p_s_sc + 125
(io.ops:146)
12 libparrot.dylib 0x0057af97 runops_slow_core + 183
(runops_cores.c:222)
13 libparrot.dylib 0x0053a12f runops_int + 447
(interpreter.c:942)
14 libparrot.dylib 0x0053aab2 runops + 194
(inter_run.c:105)
15 libparrot.dylib 0x0053ad54 runops_args + 436
(inter_run.c:237)
16 libparrot.dylib 0x0053b0ea Parrot_run_meth_fromc_args +
58
(inter_run.c:426)
17 libparrot.dylib 0x00682fe1 initialize_parents + 321
(class.pmc:329)
18 libparrot.dylib 0x00684efc Parrot_Class_instantiate +
1260
(class.pmc:1129)
19 libparrot.dylib 0x004dad11 Parrot_new_p_p + 129
(pmc.ops:120)
20 libparrot.dylib 0x0057af97 runops_slow_core + 183
(runops_cores.c:222)
21 libparrot.dylib 0x0053a12f runops_int + 447
(interpreter.c:942)
22 libparrot.dylib 0x0053aab2 runops + 194
(inter_run.c:105)
23 libparrot.dylib 0x0053ad54 runops_args + 436
(inter_run.c:237)
24 libparrot.dylib 0x0053ae89 Parrot_runops_fromc_args +
73
(inter_run.c:300)
25 libparrot.dylib 0x00570490 run_sub + 112
(packfile.c:496)
26 libparrot.dylib 0x005705fe do_1_sub_pragma + 334
(packfile.c:557)
27 libparrot.dylib 0x00570961 do_sub_pragmas + 289
(packfile.c:722)
28 libparrot.dylib 0x00574cfe PackFile_append_pbc + 110
(packfile.c:3723)
29 libparrot.dylib 0x00574ea8 Parrot_load_bytecode + 408
(packfile.c:3778)
30 libparrot.dylib 0x004c0710 Parrot_load_bytecode_sc + 48
(core.ops:153)
31 libparrot.dylib 0x0057af97 runops_slow_core + 183
(runops_cores.c:222)
32 libparrot.dylib 0x0053a12f runops_int + 447
(interpreter.c:942)
33 libparrot.dylib 0x0053aab2 runops + 194
(inter_run.c:105)
34 libparrot.dylib 0x0053ad54 runops_args + 436
(inter_run.c:237)
35 libparrot.dylib 0x0053ae89 Parrot_runops_fromc_args +
73
(inter_run.c:300)
36 libparrot.dylib 0x00570490 run_sub + 112
(packfile.c:496)
37 libparrot.dylib 0x005706e5 do_1_sub_pragma + 565
(packfile.c:589)
38 libparrot.dylib 0x00570961 do_sub_pragmas + 289
(packfile.c:722)
39 libparrot.dylib 0x00574f99 PackFile_fixup_subs + 41
(packfile.c:3816)
40 libparrot.dylib 0x006fb4d0 imcc_run_pbc + 240
(main.c:791)
41 libparrot.dylib 0x006fbf8d imcc_run + 861 (main.c:1081)
42 parrot 0x00001f79 main + 185 (main.c:61)
43 parrot 0x00001e86 start + 54
Thread 0 crashed with X86 Thread State (32-bit):
eax: 0x00000000 ebx: 0x00526d2c ecx: 0xbfffe7fc edx: 0x9589fb9e
edi: 0x0071e330 esi: 0x00000000 ebp: 0xbfffe818 esp: 0xbfffe7fc
ss: 0x0000001f efl: 0x00000286 eip: 0x9589fb9e cs: 0x00000007
ds: 0x0000001f es: 0x0000001f fs: 0x00000000 gs: 0x00000037
cr2: 0xffe17884
--- ./src/io/io_unix.c.orig 2008-09-19 17:56:19.000000000 +0200
+++ ./src/io/io_unix.c 2008-09-19 18:03:44.000000000 +0200
@@ -303,6 +303,11 @@
if ((flags & (PIO_F_WRITE | PIO_F_READ)) == 0)
return NULL;
+ if (Parrot_stat_info_intval(interp, spath, STAT_ISDIR)) {
+ errno = EISDIR;
+ return NULL;
+ }
+
oflags = flags_to_unix(flags);
/* Only files for now */