RE: [PATCH 1/1] fport_print: handle ttyname ENODEV

Maxime Devos <[email protected]>
Newsgroups gmane.lisp.guile.devel
Message-ID <[email protected]>
You are ignoring out-of-memory situations (from strdup), instead of raising an out-of-memory exception.

It’s rather unclear what you are taking the scm_i_misc_mutex for.

You are also not taking the appropriate port lock (look for scm_i_port_table_mutex – savannah git is down and I don’t have a local copy for a more precise reference – you also need to take the per-fdes).  (the fdes = … in the beginning doesn’t need a lock, since the fdes is only printed, but if you act upon it you need a lock to ensure the fdes doesn’t move)

If you are doing strdup only to turn it into a Scheme string afterwards with scm_take_locale_string, you might as well do scm_from_locale_string directly  (Except that this may lead to an exception while a lock is being held which isn’t ideal, but this can happen anyway since SCM_SYSCALL can raise exceptions.)

The way you are handling the copy of the string here is rather risky – if the syscall results in EINTR, and an async is queued, then the async is run, and this async might cal ‘ttyname’, potentially clobbering the old ttyname. I’m not sure, but I think ttyname isn’t supposed to return EINTR. It has been a while since I’ve looked at Hurd RPCs, but I think the errno aren’t constrained to a fixed set of errno, so to some degree you need to deal with non-standard term servers (even if you don’t intend to deal with such servers normally, what if a malicious user communicates with a program of another (innocent) user, and part of that program involves communicating with potentially malicious user-provided ttys and term servers(*)?).  (Maybe the Hurd already eliminates EINTR somewhere, but that’s something you would need to verify.)

(*) not sure about standard Hurd terminology

ttyname is also thread-unsafe on the Hurd (https://github.com/bminor/glibc/blob/91bb902f58264a2fd50fbce8f39a9a290dd23706/sysdeps/mach/hurd/ttyname.c#L32). According to the glibc description, it is thread-unsafe in general. Maybe that’s what the mutex is for. But then, you are duplicating scm_ttyname (well, probably, I don’t have a local copy available). So, you could just use scm_ttyname and let scm_ttyname deal with all the locking, interrupts and thread-safety. If catching the system-error causes difficulty, you could  define a variant scm_i_ttyname that returns the string or the errno (which is in turn used by scm_ttyname), and use scm_i_ttyname.

Also, the explanation in the commit message belongs in a (code) comment, so people don’t have to track down the commit that introduced the changes.

Best regards,
Maxime Devos
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.