guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Writing to closed network port causes guile to exit with error 141,


From: Tomas Volf
Subject: Re: Writing to closed network port causes guile to exit with error 141, not error message
Date: Fri, 22 Mar 2024 17:05:47 +0100

Hi,

On 2024-03-22 10:22:03 -0400, Ryan Raymond wrote:
> Hello, all
> I have a problem with my web-server.
> If the network connection to the server is closed (by killing the client)
> and one attempts to write data to that port in GUILE, the interpreter will
> exit without an error message. echo "$?" says GUILE exited with error code
> 141 but google doesn't give any results for this.
>
> This code is running in a separate thread so it shouldn't be causing the
> main thread to die.
> Wrapping the write in a try-catch doesn't work. Maybe a bug with the C?
> It only happens on the second write though.
>
> It is reproducible. Run this code as a guile script:
>
> (define sock (socket PF_INET SOCK_STREAM 0))
> (bind sock AF_INET INADDR_LOOPBACK 8081)
> (listen sock 100)
> (define c (car (accept sock)))
> (sleep 5)
> ; Start curl and then cancel here
> (display "I am a banana" c)
> (display "Banana also, lol" c)
> (display "I should run if this doesn't fail\n")
>
> In another terminal run
> curl localhost:8081 --http0.9

Thank you for nice and short reproduction steps :)

>
> Make sure to cancel curl and then type echo $? to see the error code 141.
> Any help would be welcome, thanks

This seems to be caused by SIGPIPE.  When running your repro under GDB:

Thread 1 "guile" received signal SIGPIPE, Broken pipe.
0x00007ffff7a150af in write () from 
/gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib/libc.so.6
(gdb) bt
#0  0x00007ffff7a150af in write () from 
/gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib/libc.so.6
#1  0x00007ffff7ed286f in fport_write (port=<optimized out>, src=<optimized 
out>, start=<optimized out>, count=16) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/fports.c:623
#2  0x00007ffff7f0ef44 in scm_i_write_bytes (port=#<port #<port-type file 
7ffff76c3b40> 7ffff779a160>, src="#<vu8vector>" = {...}, start=0, count=16)
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/ports.c:2858
#3  0x00007ffff7f10f01 in scm_c_put_latin1_chars (port=#<port #<port-type file 
7ffff76c3b40> 7ffff779a160>, chars=<optimized out>, len=16)
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/ports.c:3458
#4  0x00007ffff7f166ef in iprin1 (exp="Banana also, lol", port=#<port 
#<port-type file 7ffff76c3b40> 7ffff779a160>, pstate=0x7ffff778c4d8)
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:687
#5  0x00007ffff7f1693a in scm_iprin1 (exp=<optimized out>, port=<optimized 
out>, pstate=<optimized out>) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:561
#6  0x00007ffff7f16b0d in scm_prin1 (exp="Banana also, lol", port=#<port 
#<port-type file 7ffff76c3b40> 7ffff779a160>, writingp=0)
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:840
#7  0x00007ffff7f16cbf in scm_display (obj="Banana also, lol", port=#<port 
#<port-type file 7ffff76c3b40> 7ffff779a160>)
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:1114
#8  0x00007ffff7f43390 in vm_regular_engine (thread=0x7ffff767dd80) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm-engine.c:972
#9  0x00007ffff7f50db5 in scm_call_n (proc=<optimized out>, argv=<optimized 
out>, nargs=1) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm.c:1615
#10 0x00007ffff7ebb977 in scm_primitive_eval (exp=<optimized out>, 
exp@entry=((@ (ice-9 control) %) (begin ((@@ (ice-9 command-line) load/lang) 
"/tmp/x.scm") (quit))))
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/eval.c:671
#11 0x00007ffff7ec1846 in scm_eval (exp=((@ (ice-9 control) %) (begin ((@@ 
(ice-9 command-line) load/lang) "/tmp/x.scm") (quit))), 
module_or_state="#<struct module>" = {...})
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/eval.c:705
#12 0x00007ffff7f203e6 in scm_shell (argc=3, argv=0x7fffffffda88) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/script.c:357
#13 0x00007ffff7ed28cc in invoke_main_func (body_data=0x7fffffffd920) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/init.c:312
#14 0x00007ffff7eb9e1a in c_body (d=0x7fffffffd840) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/continuations.c:430
#15 0x00007ffff7f43390 in vm_regular_engine (thread=0x7ffff767dd80) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm-engine.c:972
#16 0x00007ffff7f50db5 in scm_call_n (proc=<optimized out>, argv=<optimized 
out>, nargs=2) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm.c:1615
#17 0x00007ffff7ebb5ca in scm_call_2 (proc=<optimized out>, arg1=<optimized 
out>, arg2=<optimized out>) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/eval.c:503
#18 0x00007ffff7f62092 in scm_c_with_exception_handler.constprop.0 (type=#t, 
handler_data=handler_data@entry=0x7fffffffd7d0, 
thunk_data=thunk_data@entry=0x7fffffffd7d0,
    thunk=<optimized out>, handler=<optimized out>) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/exceptions.c:170
#19 0x00007ffff7f3de1f in scm_c_catch (tag=<optimized out>, body=<optimized 
out>, body_data=<optimized out>, handler=<optimized out>, 
handler_data=<optimized out>,
    pre_unwind_handler=<optimized out>, pre_unwind_handler_data=0x7ffff76fd500) 
at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/throw.c:168
#20 0x00007ffff7ebc396 in scm_i_with_continuation_barrier 
(pre_unwind_handler=0x7ffff7ebc0b0 <pre_unwind_handler>, 
pre_unwind_handler_data=0x7ffff76fd500, handler_data=0x7fffffffd840,
    handler=0x7ffff7ec2ba0 <c_handler>, body_data=0x7fffffffd840, 
body=0x7ffff7eb9e10 <c_body>) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/continuations.c:368
#21 scm_c_with_continuation_barrier (func=<optimized out>, data=<optimized 
out>) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/continuations.c:464
#22 0x00007ffff7f3d049 in with_guile (base=0x7fffffffd8c8, data=0x7fffffffd8f0) 
at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/threads.c:649
#23 0x00007ffff7e207fa in GC_call_with_stack_base () from 
/gnu/store/k1ha4n9v8d7myiiszvl2ic7xnb56l219-libgc-8.2.2/lib/libgc.so.1
#24 0x00007ffff7f373f8 in scm_i_with_guile (dynamic_state=<optimized out>, 
data=<optimized out>, func=<optimized out>) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/threads.c:692
#25 scm_with_guile (func=<optimized out>, data=<optimized out>) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/threads.c:698
#26 0x00007ffff7edb8e5 in scm_boot_guile (argc=argc@entry=3, 
argv=argv@entry=0x7fffffffda88, main_func=main_func@entry=0x401240 
<inner_main>, closure=closure@entry=0x0)
    at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/init.c:295
#27 0x00000000004010f7 in main (argc=3, argv=0x7fffffffda88) at 
/tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/guile.c:94


If you check module/web/server/http.scm in the guile's repository, you will
notice there is this line:

    (sigaction SIGPIPE SIG_IGN)

Which caused the signal to be ignored instead of using the default handler
(which is to die).

Have a nice day,
Tomas Volf

--
There are only two hard things in Computer Science:
cache invalidation, naming things and off-by-one errors.

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]