Package: elixir
Version: 1.17.3.dfsg-2
Version: 1.18.3.dfsg-1
Severity: normal
File: /usr/lib/elixir/bin/iex

Dear Maintainer,

  $ iex
  Erlang/OTP 27 [erts-15.2.7.3] [source] [64-bit] [smp:24:24] [ds:24:24:10] 
[async-threads:1] [jit:ns]
  
  Interactive Elixir (1.18.3) - press Ctrl+C to exit (type h() ENTER for help)
  iex(1)> [123,124]
  ~c"{|"
  iex(2)>
if I EOF by ^D here, nothing happens, and ^C shows an error;
only ^\ actually quits (but the process doesn't even succumb to it so
the prompt positioning is messed up because it doesn't output a final newline).

This is clearly wrong, especially given:
  $ cat | iex
  Erlang/OTP 27 [erts-15.2.7.3] [source] [64-bit] [smp:24:24] [ds:24:24:10] 
[async-threads:1] [jit:ns]
  
  Interactive Elixir (1.18.3) - press Ctrl+C to exit (type h() ENTER for help)
  iex(1)> [123,124]
  ~c"{|"
  iex(2)>
and EOFing here actually registers
(though it doesn't emit a final newline either so the prompt is also messed up),
and
  $ iex < /dev/null
  Erlang/OTP 27 [erts-15.2.7.3] [source] [64-bit] [smp:24:24] [ds:24:24:10] 
[async-threads:1] [jit:ns]
  
  Interactive Elixir (1.18.3) - press Ctrl+C to exit (type h() ENTER for help)
  $

strace of iex when getting ^D:
  [pid 2539937] ppoll([{fd=10<pipe:[760177565]>, events=POLLIN|POLLRDNORM}], 1, 
NULL, NULL, 8 <unfinished ...>
  [pid 2539938] <... epoll_wait resumed>[{events=EPOLLIN, data={u32=0, 
u64=140179142606848}}], 512, -1) = 1
  [pid 2539938] epoll_wait(4<anon_inode:[eventpoll]>,  <unfinished ...>
  [pid 2539932] read(0</dev/pts/5>, "\4", 1024) = 1
  [pid 2539932] epoll_ctl(4<anon_inode:[eventpoll]>, EPOLL_CTL_MOD, 
0</dev/pts/5>, {events=EPOLLIN|EPOLLONESHOT, data={u32=0, u64=0}}) = 0
  [pid 2539932] writev(1</dev/pts/5>, [{iov_base="\7", iov_len=1}], 1) = 1

strace of cat | iex:
  [pid 2550516] ppoll([{fd=10<pipe:[760201449]>, events=POLLIN|POLLRDNORM}], 1, 
NULL, NULL, 8 <unfinished ...>
  [pid 2550424] <... epoll_wait resumed>[{events=EPOLLIN, data={u32=9, 
u64=16148037947227111433}}], 512, -1) = 1
  [pid 2550424] timerfd_settime(9<anon_inode:[timerfd]>, 0, 
{it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=0, tv_nsec=0}}, NULL) = 0
  [pid 2550424] timerfd_settime(9<anon_inode:[timerfd]>, 0, 
{it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=12, tv_nsec=58194701}}, 
NULL) = 0
  [pid 2550424] epoll_wait(6<anon_inode:[eventpoll]>,  <unfinished ...>
  [pid 2550517] <... epoll_wait resumed>[{events=EPOLLHUP, data={u32=0, 
u64=139693811302400}}], 512, -1) = 1
  [pid 2550517] epoll_wait(4<anon_inode:[eventpoll]>,  <unfinished ...>
  [pid 2550510] read(0<pipe:[760194369]>, "", 1024) = 0
  [pid 2550416] epoll_ctl(4<anon_inode:[eventpoll]>, EPOLL_CTL_DEL, 
0<pipe:[760194369]>, 0x7f0d07d12474) = 0
  [pid 2550416] epoll_ctl(4<anon_inode:[eventpoll]>, EPOLL_CTL_DEL, 
17<pipe:[760192190]>, 0x7f0d07d12474) = 0
  [pid 2550416] close(17<pipe:[760192190]>) = 0
  [pid 2550416] close(18<pipe:[760192190]>) = 0
  [pid 2550416] rt_sigaction(SIGCONT, {sa_handler=SIG_DFL, sa_mask=[], 
sa_flags=SA_RESTORER, sa_restorer=0x7f0d543c2df0}, {sa_handler=0x55892f297a30, 
sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK, sa_restorer=0x7f0d543c2df0}, 8) = 0
  [pid 2550416] rt_sigaction(SIGWINCH, {sa_handler=SIG_DFL, sa_mask=[], 
sa_flags=SA_RESTORER, sa_restorer=0x7f0d543c2df0}, {sa_handler=0x55892f2979e0, 
sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK, sa_restorer=0x7f0d543c2df0}, 8) = 0
  [pid 2550416] write(8<pipe:[760201448]>, "!", 1) = 1

This implies that iex puts its input teletype into -icanon -echo mode,
which is easy to confirm:
  $ stty -F /dev/pts/5
  speed 38400 baud; line = 0;
  min = 1; time = 0;
  -brkint -icrnl -imaxbel iutf8
  -opost
  -icanon -echo

Makes sense, since iex ships its own readline-style input handler
(and explains why it doesn't work that well).

iex needs to correctly understand eof/c_cc[VEOF] in its icanon emulator.

Best,

-- System Information:
Debian Release: 12.11
  APT prefers oldstable-updates
  APT policy: (500, 'oldstable-updates'), (500, 'oldstable-security'), (500, 
'oldstable-debug'), (500, 'oldstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 6.1.0-35-amd64 (SMP w/24 CPU threads; PREEMPT)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_FIRMWARE_WORKAROUND, 
TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_GB:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages elixir depends on:
ii  erlang-base        1:25.2.3+dfsg-1+deb12u3
ii  erlang-crypto      1:25.2.3+dfsg-1+deb12u3
ii  erlang-inets       1:25.2.3+dfsg-1+deb12u3
ii  erlang-parsetools  1:25.2.3+dfsg-1+deb12u3
ii  erlang-public-key  1:25.2.3+dfsg-1+deb12u3
ii  erlang-tools       1:25.2.3+dfsg-1+deb12u3

elixir recommends no packages.

elixir suggests no packages.

-- no debconf information

Attachment: signature.asc
Description: PGP signature

Reply via email to