Bug 103717

Summary: lockf function doesn't comply with Single Unix Specification
Product: Red Hat Enterprise Linux 2.1 Reporter: Unai Uribarri Rodríguez <uribarri_u>
Component: kernelAssignee: Jim Paradis <jparadis>
Status: CLOSED WONTFIX QA Contact: Brian Brock <bbrock>
Severity: medium Docs Contact:
Priority: medium    
Version: 2.1CC: peterm
Target Milestone: ---   
Target Release: ---   
Hardware: i686   
OS: Linux   
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2006-06-08 21:39:05 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---

Description Unai Uribarri Rodríguez 2003-09-04 08:53:23 UTC
From Bugzilla Helper:
User-Agent: Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.4) Gecko/20030624

Description of problem:
lockf returns EINVAL if the third argument of the function lockf, len, is
negative, if running a kernel < 2.4.21 (currently, I'm using redhat

All the versions of the Single Unix Specification says that, when len is
negative, lockf must affect "the preceding bytes up to but not including the
current offset".

Version-Release number of selected component (if applicable):

How reproducible:

Steps to Reproduce:
1. Call lockf with a negative len argument

Actual Results:  lockf return -1, errno==EINVAL.

Expected Results:  lockf must return 0.

Additional info:

Comment 1 Unai Uribarri Rodríguez 2003-09-04 08:54:35 UTC
The glibc version is glibc-2.2.4-26.

Comment 2 Jakub Jelinek 2003-09-04 09:12:22 UTC
glibc lockf just calls fcntl in the kernel.

Comment 3 Arjan van de Ven 2003-09-04 09:19:27 UTC
if we change this, we change behavior to userspace, which is something we don't
want within a stable product release.

Comment 4 Unai Uribarri Rodríguez 2003-09-04 09:39:59 UTC
It isn't needed to change the kernel. You can call traslate the negative length
in lockf to a negative start and a positive length to fcntl, for example:

struct flock flock;
/* ... */
if (len < 0)
  flock.l_start = len
  flock.l_len = -len;
  flock.l_start = 0;
  flock.l_len = len;

Comment 5 Jim Paradis 2006-06-08 21:39:05 UTC
RHEL2.1 is currently accepting only critical security fixes.  This issue is
outside the current scope of support.