Messages in this thread Patch in this message |  | | Date | Sun, 9 Sep 2001 06:33:24 -0400 (EDT) | From | Francis Galiegue <> | Subject | Re: [PATCH] 2.4.9-ac10 but not only, locks_alloc_lock() |
| |
On Sun, 9 Sep 2001, Manfred Spraul wrote:
> > > Not sure about one thing, though: what error code to return for > > locks_mandatory_area() on failure. It's invoked from some of the > > {do,sys}_*{read,write}*() routines and nowhere else AFAICT. I set it > > to -ENOMEM, maybe this is not the right thing to do. > > I'd put the file_lock structure on the stack. It's ~ 90 bytes long, not > too large. > Returning -ENOMEM is imho not acceptable: -ENOMEM is not listed in > SusV2, and locks_alloc_lock() internally checks for rlimits (setting > RLIM_NLIMITS to 0 and execing another app might have dangerous > sideeffects). >
Not sure about what you mean wrt RLIM_NLIMITS, anyway a new patch is attached with follows your suggestion. Does it look correct?
-- Francis Galiegue, fg@mandrakesoft.com - Normand et fier de l'être "Programming is a race between programmers, who try and make more and more idiot-proof software, and universe, which produces more and more remarkable idiots. Until now, universe leads the race" -- R. Cook diff -urN linux-old/fs/locks.c linux/fs/locks.c --- linux-old/fs/locks.c Sun Sep 9 09:00:06 2001 +++ linux/fs/locks.c Sun Sep 9 12:12:02 2001 @@ -695,16 +695,18 @@ size_t count) { struct file_lock *fl; - struct file_lock *new_fl = locks_alloc_lock(0); + struct file_lock new_fl; int error; - new_fl->fl_owner = current->files; - new_fl->fl_pid = current->pid; - new_fl->fl_file = filp; - new_fl->fl_flags = FL_POSIX | FL_ACCESS; - new_fl->fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK; - new_fl->fl_start = offset; - new_fl->fl_end = offset + count - 1; + memset(&new_fl, 0, sizeof(new_fl)); + + new_fl.fl_owner = current->files; + new_fl.fl_pid = current->pid; + new_fl.fl_file = filp; + new_fl.fl_flags = FL_POSIX | FL_ACCESS; + new_fl.fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK; + new_fl.fl_start = offset; + new_fl.fl_end = offset + count - 1; error = 0; lock_kernel(); @@ -716,17 +718,17 @@ for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { if (!(fl->fl_flags & FL_POSIX)) continue; - if (fl->fl_start > new_fl->fl_end) + if (fl->fl_start > new_fl.fl_end) break; - if (posix_locks_conflict(new_fl, fl)) { + if (posix_locks_conflict(&new_fl, fl)) { error = -EAGAIN; if (filp && (filp->f_flags & O_NONBLOCK)) break; error = -EDEADLK; - if (posix_locks_deadlock(new_fl, fl)) + if (posix_locks_deadlock(&new_fl, fl)) break; - error = locks_block_on(fl, new_fl); + error = locks_block_on(fl, &new_fl); if (error != 0) break; @@ -739,7 +741,6 @@ goto repeat; } } - locks_free_lock(new_fl); unlock_kernel(); return error; } @@ -1411,6 +1412,9 @@ struct inode *inode; int error; + if (file_lock == NULL) + return -ENOLCK; + /* * This might block, so we do it before checking the inode. */ @@ -1563,6 +1567,9 @@ struct flock64 flock; struct inode *inode; int error; + + if (file_lock == NULL) + return -ENOLCK; /* * This might block, so we do it before checking the inode. |  |