2009-03-01 22:56:49

by Roel Kluin

[permalink] [raw]
Subject: lp: too large subtraction on unsigned?

vi drivers/char/lp.c +705

note that count is unsigned, and we do the loop:

do {
if (canwrite > 0) {
...
count -= written;
}
if (lf && canwrite <= 0) {
...
count--;
...
}
} while (count > 0 && (CONSOLE_LP_STRICT || written > 0));

Isn't this wrong?

Roel


2009-03-01 23:41:49

by Thiago Galesi

[permalink] [raw]
Subject: Re: lp: too large subtraction on unsigned?

Doesn't look like something is wrong, or I'm missing something...
:
> do {
> ? ? ? ?if (canwrite > 0) {
> ? ? ? ? ? ? ? ?...
> ? ? ? ? ? ? ? ?count -= written;
> ? ? ? ?}

If there are chars left you write to the PP and take it out of the total

> ? ? ? ?if (lf && canwrite <= 0) {
> ? ? ? ? ? ? ? ?...
> ? ? ? ? ? ? ? ?count--;
> ? ? ? ? ? ? ? ?...
> ? ? ? ?}
> } while (count > 0 && (CONSOLE_LP_STRICT || written > 0));

The second if is for translating \n to \r\n only if you've already
written everything (up to /n) to the PP

If count > 0 fails (that is, count == 0) you get out of the loop

--
-
Thiago Galesi