diff -Nru a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c --- a/drivers/char/hvc_console.c Mon Nov 3 19:10:06 2003 +++ b/drivers/char/hvc_console.c Mon Nov 3 19:10:06 2003 @@ -130,24 +130,26 @@ const unsigned char *buf, int count) { struct hvc_struct *hp = tty->driver_data; - char *p; + char *p, *kbuf = NULL; int todo, written = 0; unsigned long flags; + if (from_user) { + kbuf = kmalloc(count, GFP_KERNEL); + if (!kbuf) + return -ENOMEM; + if (copy_from_user(kbuf, buf, count)) { + kfree(kbuf); + return -EFAULT; + } + buf = kbuf; + } spin_lock_irqsave(&hp->lock, flags); while (count > 0 && (todo = N_OUTBUF - hp->n_outbuf) > 0) { if (todo > count) todo = count; p = hp->outbuf + hp->n_outbuf; - if (from_user) { - todo -= copy_from_user(p, buf, todo); - if (todo == 0) { - if (written == 0) - written = -EFAULT; - break; - } - } else - memcpy(p, buf, todo); + memcpy(p, buf, todo); count -= todo; buf += todo; hp->n_outbuf += todo; @@ -155,7 +157,7 @@ hvc_push(hp); } spin_unlock_irqrestore(&hp->lock, flags); - + kfree(kbuf); return written; }