Messages in this thread | | | Date | Sat, 24 Jan 1998 00:49:07 -0700 | From | Erik Andersen <> | Subject | Re: My last word on copy_to_user |
| |
On Sat, Jan 24, 1998 at 12:12:00AM -0600, Michael Elizabeth Chastain wrote: > Hi guys, > > Here is a list of places in 2.1.80 that call copy_to_user and expect > it to return -EFAULT, or a negative number, on error. These callers > are wrong. > > I think most, or all, of these places will work correctly as long > as the addresses are supplied are valid. In that case copy_to_user > returns 0 and every caller accepts 0 as a sign of success. > [-------------snip-----------------] > IOCTL_OUT drivers/cdrom/cdrom.c
You are right this should be better documented. I thought I had been so careful... Bummer! cdrom.c thinks everything is fine only if copy_from_user returns 0. This is the Right Thing(tm) I believe, but then it directly returns whatever non-zero stuff copy_from_user returns. If indeed copy_to_user returns the number of bits that _didn't_ get copied, then I suppose I need to change this to do something like:
#define IOCTL_IN(arg, type, in) { \ - int ret=copy_from_user(&in, (type *) arg, sizeof in); \ - if (ret) return ret; } + if ( copy_from_user(&in, (type *) arg, sizeof in) ) \ + return -EFAULT; }
Is this the same for copy_to_user as well? Should I change: #define IOCTL_OUT(arg, type, out) { \ - int ret=copy_to_user((type *) arg, &out, sizeof out); \ - if (ret) return ret; } + if ( copy_to_user((type *) arg, &out, sizeof out) ) \ + return -EFAULT; } as well?
-Erik
-- Erik B. Andersen Web: http://www.inconnect.com/~andersen/ email: andersee@debian.org --This message was written using 73% post-consumer electrons--
| |