Re: select() support for NR_OPEN>256

Jakub Jelinek (jj@sunsite.ms.mff.cuni.cz)
Wed, 5 Feb 1997 20:23:07 +0100 (MET)


> - * We do a VERIFY_WRITE here even though we are only reading this time:
> - * we'll write to it eventually..
> - *
> * Use "int" accesses to let user-mode fd_set's be int-aligned.
> */
> static int __get_fd_set(unsigned long nr, int * fs_pointer, int * fdset)
> @@ -209,16 +205,14 @@
> /* round up nr to nearest "int" */
> nr = (nr + 8*sizeof(int)-1) / (8*sizeof(int));
> if (fs_pointer) {
> - int error = verify_area(VERIFY_WRITE,fs_pointer,nr*sizeof(int));
> - if (!error) {
> - while (nr) {
> - get_user(*fdset, fs_pointer);
> - nr--;
> - fs_pointer++;
> - fdset++;
> - }
> + while (nr) {
> + if (get_user(*fdset, fs_pointer))
> + return -EFAULT;
> + nr--;
> + fs_pointer++;
> + fdset++;
> }
> - return error;
> + return 0;

Isn't it better to leave there the verify_area and just use __get_user
instead of get_user? This will generate much nicer code (at least on the
sparc)...

Like:

int error = verify_area(VERIFY_WRITE,fs_pointer,nr*sizeof(int));
if (!error) {
while (nr) {
if (__get_user(*fdset, fs_pointer))
return -EFAULT;
nr--;
fs_pointer++;
fdset++;
}
}
return error;

.u$e.
Cheers .$$$$$:S
Jakub $"*$/"*$$
$.`$ . ^F
4k+#+T.$F
-------------------------------------------------------------- 4P+++"$"$ ---
Jakub Jelinek, jj@sunsite.mff.cuni.cz :R"+ t$$B
Administrator of SunSITE Czech Republic ___# $$$
MFF, Charles University, Prague | | R$$k
---------------------------------------------------------- dd. | Linux $!$
Give your Sparc a new beginning - SparcLinux ddd | Sparc $9$F
-------------------------------------------------------- '!!!!!$ !!#!`
!!!!!* .!!!!!`
'!!!!!!!W..e$$!!!!!!`
"~^^~ ^~~^