ioctl_tiocsctty passes the address of a zero instead of the documented 0 argument
Les mainteneurs répondent en général sous 3 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 68/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- linux, rust
- Domaine
- operating-systems
Piste de recherche
Le bogue se trouve dans src/process/ioctl.rs : l'appel documenté est à la ligne 13, et l'adaptateur d'arguments aux lignes 45-47 passe l'adresse d'une variable locale sur la pile 0u32 au lieu de la valeur 0. Commence par lire cet adaptateur et le commentaire de documentation de ioctl_tiocsctty, puis exécute la reproduction strace de l'issue pour confirmer le mauvais argument. C'est terminé lorsque l'adaptateur passe le littéral 0, que le commentaire cite ioctl_tty(2) et que la sortie strace affiche TIOCSCTTY, 0.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
rustix::process::ioctl_tiocsctty is documented as performing ioctl(fd, TIOCSCTTY, 0):
but the argument adapter passes the address of a stack-local 0u32:
Linux from 2.6.12 requires the third arg to be exactly 1 for the option to steal the terminal, and only uses that arg anyway when CAP_SYS_ADMIN. On BSDs the arg is ignored. The Linux manpage says to use 0 otherwise; the comment in the code has tty_ioctl(4) but that's since been renamed to ioctl_tty(2) and TIOCSCTTY(2const) has the detail:
Make the given terminal the controlling terminal of the
calling process. The calling process must be a session
leader and not have a controlling terminal already. For
this case, arg should be specified as zero.
If this terminal is already the controlling terminal of a
different session group, then the ioctl fails with EPERM,
unless the caller has the CAP_SYS_ADMIN capability and arg
equals 1, in which case the terminal is stolen, and all
processes that had it as controlling terminal lose it.
From kernel source:
static int tiocsctty(struct tty_struct *tty,
struct file *file, int arg)
{
// ...
if (tty->ctrl.session) {
if (arg == 1 && capable(CAP_SYS_ADMIN)) {
session_clear_tty(tty->ctrl.session);
} else {
ret = -EPERM;
goto unlock;
}
}
// ...
}
This isn't unsafe exactly, but it's still confusing. Also, it might be worth exposing the steal variant.
Tiny repro:
#!/usr/bin/env -S cargo +nightly -Zscript
---cargo
package.edition = "2024"
dependencies.rustix = { version = "1.1.5", features = ["process"] }
---
fn main() {
let _ = rustix::process::ioctl_tiocsctty(std::io::stdin());
}
With strace:
$ ./repro.rs >/dev/null # compile
$ sudo strace -e ioctl ~/.cargo/build/*/*/target/debug/repro # run with CAP_SYS_ADMIN
ioctl(0, TIOCSCTTY, -527932840) = -1 ENOTTY (Inappropriate ioctl for device)
The return may vary and isn't relevant: -527932840 is an address and is neither 0 nor 1, the two permitted values. A silver lining is that it's also impossible for arg to be 1 under the current code, so it's technically harmless.
- Langage dominant
- Rust
- Étoiles
- 2.1k
- Forks
- 308
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de bytecodealliance/rustix
-
net feature alone fails to compile in 1.1.5: sockopt uses crate::timespec, which net does not gate inPeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
bytecodealliance/rustix#1689 · 2 commentaires ·
Les mainteneurs répondent en général sous 3 jours
-
Wrong flag used for (set_)ipv6_multicast_hopsPeut-être pris @RajaBabu15 l’a pris il y a 61 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
bytecodealliance/rustix#1660 ·
Les mainteneurs répondent en général sous 3 jours
-
Add sched_getscheduler wrapperOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
bytecodealliance/rustix#1635 ·
Les mainteneurs répondent en général sous 3 jours
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
bytecodealliance/rustix#1068 ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 8/100
bytecodealliance/rustix#1702 ·
Les mainteneurs répondent en général sous 3 jours
Toutes les issues de bytecodealliance/rustix
Issues similaires
-
agent:iq3-xxs area: cli duplication enhancement priority: P3 ready-for-agent
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 2 jours
-
bug discussion
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
medialab/xan#1201 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
farion1231/cc-switch#8298 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
Les mainteneurs répondent en général sous 1 jour