Skip to content

IoT.js unexpectedly exits (caused by SIGPIPE) when the active socket is closed by the client #1977

Open
@erkopui

Description

@erkopui

build:

./tools/build.py --jerry-heaplimit=2048 --jerry-profile=es2015-subset

Test code:
test.js

var fs = require("fs")
var http = require("http")
var port = 8888

http.createServer(function(request, response) {
        console.log("Request for path: " + request.url)

        fs.createReadStream("/tmp/100M.bin").pipe(response)
})
.listen(port, function() {
        console.log('HTTP server listening on port: ' + port)
})

#prepeare the file

dd if=/dev/urandom of=/tmp/100M.bin bs=1M count=100

#on the server-side

gdb iotjs/build/x86_64-linux/debug/bin/iotjs
run test.js

#on the client-side

wget -O - localhost:8888 | pv -L 10k > /dev/null
#after a few second, press ctrl + c (close connection)

#GDB result:

Thread 1 "iotjs" received signal SIGPIPE, Broken pipe.
__libc_write (nbytes=4096, buf=0x8157e8, fd=7) at ../sysdeps/unix/sysv/linux/write.c:26
26      ../sysdeps/unix/sysv/linux/write.c: No such file or directory.
(gdb) where
#0  __libc_write (nbytes=4096, buf=0x8157e8, fd=7) at ../sysdeps/unix/sysv/linux/write.c:26
#1  __libc_write (fd=7, buf=0x8157e8, nbytes=4096) at ../sysdeps/unix/sysv/linux/write.c:24
#2  0x000000000059f6fb in uv__write (stream=0x804d80) at /tmp/iotjs/deps/libtuv/src/unix/stream.c:854
#3  0x00000000005a0861 in uv__stream_io (loop=0x803a00 <default_loop_struct>, w=0x804df0, events=29) at /tmp/iotjs/deps/libtuv/src/unix/stream.c:1334
#4  0x00000000005a5477 in uv__io_poll (loop=0x803a00 <default_loop_struct>, timeout=117805) at /tmp/iotjs/deps/libtuv/src/unix/linux-core.c:389
#5  0x0000000000598c9c in uv_run (loop=0x803a00 <default_loop_struct>, mode=UV_RUN_ONCE) at /tmp/iotjs/deps/libtuv/src/unix/core.c:327
#6  0x00000000004200a6 in iotjs_start (env=0x602700 <current_env>) at /tmp/iotjs/src/iotjs.c:233
#7  0x0000000000420386 in iotjs_entry (argc=2, argv=0x7fffffffe368) at /tmp/iotjs/src/iotjs.c:312
#8  0x000000000041fb12 in main (argc=2, argv=0x7fffffffe368) at /tmp/iotjs/src/platform/linux/iotjs_linux.c:19

Possible solution somewhere in main thread:

  sigset_t set;
  sigemptyset(&set);
  sigaddset(&set, SIGPIPE);
  pthread_sigmask(SIG_BLOCK, &set, NULL);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions