diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 3831543a6a..725ccc2b87 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -777,26 +777,24 @@ bool tty_is_console(const char *tty) { } int vtnr_from_tty(const char *tty) { - int i, r; + int r; assert(tty); tty = skip_dev_prefix(tty); - if (!startswith(tty, "tty") ) + const char *e = startswith(tty, "tty"); + if (!e) return -EINVAL; - if (!ascii_isdigit(tty[3])) - return -EINVAL; - - r = safe_atoi(tty+3, &i); + unsigned u; + r = safe_atou(e, &u); if (r < 0) return r; + if (!vtnr_is_valid(u)) + return -ERANGE; - if (i < 0 || i > 63) - return -EINVAL; - - return i; + return (int) u; } int resolve_dev_console(char **ret) { diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index 833c6617de..75b3219097 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -172,3 +172,7 @@ static inline bool osc_char_is_valid(char c) { * ECMA-48 5th edition, section 8.3.89 */ return (unsigned char) c >= 32U && (unsigned char) c < 127; } + +static inline bool vtnr_is_valid(unsigned n) { + return n >= 1 && n <= 63; +} diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index dce596eeb3..4b14b9b690 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -952,7 +952,7 @@ static int create_session( if (seat) { if (seat_has_vts(seat)) { - if (vtnr <= 0 || vtnr > 63) + if (!vtnr_is_valid(vtnr)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "VT number out of range"); } else {