terminal-util: stop doing 0/upper bound check in tty_is_vc()

tty_is_vc() is more often than not used for simple "categorization"
than validity check. E.g. in logind, we first recognize the tty
"looks like vc", and then use vtnr_from_tty() where range check
is performed and vtnr is extracted. In such cases, we want to reject
invalid vtnr from clients rather than silently carry on, hence
let's remove bound check in tty_is_vc().

Fixes #36166
Replaces #36167 and #36175
This commit is contained in:
Mike Yuan
2025-01-26 01:32:42 +01:00
parent ba0266b376
commit b27f791691

View File

@@ -764,21 +764,7 @@ int make_console_stdio(void) {
return 0;
}
bool tty_is_vc(const char *tty) {
assert(tty);
return vtnr_from_tty(tty) >= 0;
}
bool tty_is_console(const char *tty) {
assert(tty);
return streq(skip_dev_prefix(tty), "console");
}
int vtnr_from_tty(const char *tty) {
int r;
static int vtnr_from_tty_raw(const char *tty, unsigned *ret) {
assert(tty);
tty = skip_dev_prefix(tty);
@@ -787,8 +773,16 @@ int vtnr_from_tty(const char *tty) {
if (!e)
return -EINVAL;
return safe_atou(e, ret);
}
int vtnr_from_tty(const char *tty) {
unsigned u;
r = safe_atou(e, &u);
int r;
assert(tty);
r = vtnr_from_tty_raw(tty, &u);
if (r < 0)
return r;
if (!vtnr_is_valid(u))
@@ -797,6 +791,23 @@ int vtnr_from_tty(const char *tty) {
return (int) u;
}
bool tty_is_vc(const char *tty) {
assert(tty);
/* NB: for >= 0 values no range check is conducted here, on the assumption that the caller will
* either extract vtnr through vtnr_from_tty() later where ERANGE would be reported, or doesn't care
* about whether it's strictly valid, but only asking "does this fall into the vt catogory?", for which
* "yes" seems to be a better answer. */
return vtnr_from_tty_raw(tty, /* ret = */ NULL) >= 0;
}
bool tty_is_console(const char *tty) {
assert(tty);
return streq(skip_dev_prefix(tty), "console");
}
int resolve_dev_console(char **ret) {
int r;