Skip to contentSkip to conversation

state machine defect in drivers/tty/vt/vt.c?

DISCUSSION Joe Perches 2 participants 2 messages Jul 10, 2011

lore
Share & tools
lore
#0 lore raw

vc->vc_state is sequentially set to different values.

Looks like there's either a return or a break
missing at the end of case ESgetpars:

Anyone know the right fix here?

/* console_lock is held */
static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) {
[...]

	switch(vc->vc_state) {
[...]
	case ESgetpars:
		if (c == ';' && vc->vc_npar < NPAR - 1) {
			vc->vc_npar++;
			return;
		} else if (c>='0' && c<='9') {
			vc->vc_par[vc->vc_npar] *= 10;
			vc->vc_par[vc->vc_npar] += c - '0';
			return;
		} else
			vc->vc_state = ESgotpars;
	case ESgotpars:
		vc->vc_state = ESnormal;
#1 lore raw
Quoted 6 lines · Joe Perches

vc->vc_state is sequentially set to different values.

Looks like there's either a return or a break
missing at the end of case ESgetpars:

Anyone know the right fix here?

The first assignment can be removed.

Quoted 4 lines
	case ESgetpars:
		if (c == ';' && vc->vc_npar < NPAR - 1) {
			vc->vc_npar++;
			return;
Quoted 8 lines
		} else if (c>='0' && c<='9') {
			vc->vc_par[vc->vc_npar] *= 10;
			vc->vc_par[vc->vc_npar] += c - '0';
			return;
		} else
			vc->vc_state = ESgotpars;
	case ESgotpars:
		vc->vc_state = ESnormal;

That handles cases like '\033[m' where '\033[' enters state ESgetpars, but 'm' is handled by ESgotpars.

Andreas.

Signature · 3 lines
Andreas Schwab, [email protected]
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."