1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-24 10:50:22 +03:00

r3241: don't skip the read completely for a zero-length read, as it could give a lock conflict

(This used to be commit 7ce6139f984c72a6347c7a64d95d5278bcf3e868)
This commit is contained in:
Andrew Tridgell 2004-10-26 06:17:52 +00:00 committed by Gerald (Jerry) Carter
parent e9820e1b6e
commit ba15d622d3

View File

@ -33,6 +33,7 @@ NTSTATUS pvfs_read(struct ntvfs_module_context *ntvfs,
ssize_t ret;
struct pvfs_file *f;
NTSTATUS status;
uint32_t maxcnt;
if (rd->generic.level != RAW_READ_READX) {
return ntvfs_map_read(req, rd, ntvfs);
@ -51,15 +52,14 @@ NTSTATUS pvfs_read(struct ntvfs_module_context *ntvfs,
return NT_STATUS_ACCESS_VIOLATION;
}
/* this matches w2k3 behaviour for attempted large reads */
if (rd->readx.in.maxcnt > UINT16_MAX) {
ret = 0;
goto done_read;
maxcnt = rd->readx.in.maxcnt;
if (maxcnt > UINT16_MAX) {
maxcnt = 0;
}
status = pvfs_check_lock(pvfs, f, req->smbpid,
rd->readx.in.offset,
rd->readx.in.maxcnt,
maxcnt,
READ_LOCK);
if (!NT_STATUS_IS_OK(status)) {
return status;
@ -67,13 +67,12 @@ NTSTATUS pvfs_read(struct ntvfs_module_context *ntvfs,
ret = pread(f->fd,
rd->readx.out.data,
rd->readx.in.maxcnt,
maxcnt,
rd->readx.in.offset);
if (ret == -1) {
return pvfs_map_errno(pvfs, errno);
}
done_read:
f->position = f->seek_offset = rd->readx.in.offset + ret;
rd->readx.out.nread = ret;