"In the previous installments of this article, there have been
some inaccuracies, workarounds, ugly hacks, and other code which
should never have been written. Fortunately, some readers have
pointed this out to me, so I can learn, as can you."
"The code I'll base this article on is similar in
functionality to that shown in the second installment of this
article. This has been done so that you can compare the differences
between them, and hopefully learn what not to do."
"The first big mistake in the earlier article, was that I was
dereferencing a pointer to user space from within kernel space.
This is not allowed, as the kernel will not know which segment the
offset refers to, and use the current one instead. It's remarkable
that this code ever worked! The corrected code should use the
copy_from_user() function instead of a loop dereferencing to user
space. The TEST_write_proc subroutine now gets a lot shorter, as we
do away with the memory copying loop. All we have to do, is null
terminate the string, and then copy_from_user() it."