patch-2.3.99-pre4 linux/fs/lockd/xdr.c
Next file: linux/fs/lockd/xdr4.c
Previous file: linux/fs/lockd/svcsubs.c
Back to the patch index
Back to the overall index
- Lines: 184
- Date:
Sun Apr 2 15:31:32 2000
- Orig file:
v2.3.99-pre3/linux/fs/lockd/xdr.c
- Orig date:
Fri Mar 10 16:40:47 2000
diff -u --recursive --new-file v2.3.99-pre3/linux/fs/lockd/xdr.c linux/fs/lockd/xdr.c
@@ -22,6 +22,25 @@
#define NLMDBG_FACILITY NLMDBG_XDR
+static inline loff_t
+s32_to_loff_t(__s32 offset)
+{
+ return (loff_t)offset;
+}
+
+static inline __s32
+loff_t_to_s32(loff_t offset)
+{
+ __s32 res;
+ if (offset >= NLM_OFFSET_MAX)
+ res = NLM_OFFSET_MAX;
+ else if (offset <= -NLM_OFFSET_MAX)
+ res = -NLM_OFFSET_MAX;
+ else
+ res = offset;
+ return res;
+}
+
/*
* XDR functions for basic NLM types
*/
@@ -65,22 +84,23 @@
{
unsigned int len;
- if ((len = ntohl(*p++)) != sizeof(*f)) {
+ if ((len = ntohl(*p++)) != NFS2_FHSIZE) {
printk(KERN_NOTICE
"lockd: bad fhandle size %x (should be %Zu)\n",
- len, sizeof(*f));
+ len, NFS2_FHSIZE);
return NULL;
}
- memcpy(f, p, sizeof(*f));
- return p + XDR_QUADLEN(sizeof(*f));
+ f->size = NFS2_FHSIZE;
+ memcpy(f->data, p, NFS2_FHSIZE);
+ return p + XDR_QUADLEN(NFS2_FHSIZE);
}
static inline u32 *
nlm_encode_fh(u32 *p, struct nfs_fh *f)
{
- *p++ = htonl(sizeof(*f));
- memcpy(p, f, sizeof(*f));
- return p + XDR_QUADLEN(sizeof(*f));
+ *p++ = htonl(NFS2_FHSIZE);
+ memcpy(p, f->data, NFS2_FHSIZE);
+ return p + XDR_QUADLEN(NFS2_FHSIZE);
}
/*
@@ -102,7 +122,7 @@
nlm_decode_lock(u32 *p, struct nlm_lock *lock)
{
struct file_lock *fl = &lock->fl;
- int len;
+ s32 start, len, end;
if (!(p = xdr_decode_string(p, &lock->caller, &len, NLM_MAXSTRLEN))
|| !(p = nlm_decode_fh(p, &lock->fh))
@@ -114,10 +134,16 @@
fl->fl_pid = ntohl(*p++);
fl->fl_flags = FL_POSIX;
fl->fl_type = F_RDLCK; /* as good as anything else */
- fl->fl_start = ntohl(*p++);
+ start = ntohl(*p++);
len = ntohl(*p++);
- if (len == 0 || (fl->fl_end = fl->fl_start + len - 1) < 0)
- fl->fl_end = NLM_OFFSET_MAX;
+ end = start + len - 1;
+
+ fl->fl_start = s32_to_loff_t(start);
+
+ if (len == 0 || end < 0)
+ fl->fl_end = OFFSET_MAX;
+ else
+ fl->fl_end = s32_to_loff_t(end);
return p;
}
@@ -128,18 +154,26 @@
nlm_encode_lock(u32 *p, struct nlm_lock *lock)
{
struct file_lock *fl = &lock->fl;
+ __s32 start, len;
if (!(p = xdr_encode_string(p, lock->caller))
|| !(p = nlm_encode_fh(p, &lock->fh))
|| !(p = nlm_encode_oh(p, &lock->oh)))
return NULL;
- *p++ = htonl(fl->fl_pid);
- *p++ = htonl(lock->fl.fl_start);
- if (lock->fl.fl_end == NLM_OFFSET_MAX)
- *p++ = xdr_zero;
+ if (fl->fl_start > NLM_OFFSET_MAX
+ || (fl->fl_end > NLM_OFFSET_MAX && fl->fl_end != OFFSET_MAX))
+ return NULL;
+
+ start = loff_t_to_s32(fl->fl_start);
+ if (fl->fl_end == OFFSET_MAX)
+ len = 0;
else
- *p++ = htonl(lock->fl.fl_end - lock->fl.fl_start + 1);
+ len = loff_t_to_s32(fl->fl_end - fl->fl_start + 1);
+
+ *p++ = htonl(fl->fl_pid);
+ *p++ = htonl(start);
+ *p++ = htonl(len);
return p;
}
@@ -150,6 +184,8 @@
static u32 *
nlm_encode_testres(u32 *p, struct nlm_res *resp)
{
+ s32 start, len;
+
if (!(p = nlm_encode_cookie(p, &resp->cookie)))
return 0;
*p++ = resp->status;
@@ -164,11 +200,14 @@
if (!(p = xdr_encode_netobj(p, &resp->lock.oh)))
return 0;
- *p++ = htonl(fl->fl_start);
- if (fl->fl_end == NLM_OFFSET_MAX)
- *p++ = xdr_zero;
+ start = loff_t_to_s32(fl->fl_start);
+ if (fl->fl_end == OFFSET_MAX)
+ len = 0;
else
- *p++ = htonl(fl->fl_end - fl->fl_start + 1);
+ len = loff_t_to_s32(fl->fl_end - fl->fl_start + 1);
+
+ *p++ = htonl(start);
+ *p++ = htonl(len);
}
return p;
@@ -387,7 +426,8 @@
resp->status = ntohl(*p++);
if (resp->status == NLM_LCK_DENIED) {
struct file_lock *fl = &resp->lock.fl;
- u32 excl, len;
+ u32 excl;
+ s32 start, len, end;
memset(&resp->lock, 0, sizeof(resp->lock));
excl = ntohl(*p++);
@@ -397,10 +437,15 @@
fl->fl_flags = FL_POSIX;
fl->fl_type = excl? F_WRLCK : F_RDLCK;
- fl->fl_start = ntohl(*p++);
+ start = ntohl(*p++);
len = ntohl(*p++);
- if (len == 0 || (fl->fl_end = fl->fl_start + len - 1) < 0)
- fl->fl_end = NLM_OFFSET_MAX;
+ end = start + len - 1;
+
+ fl->fl_start = s32_to_loff_t(start);
+ if (len == 0 || end < 0)
+ fl->fl_end = OFFSET_MAX;
+ else
+ fl->fl_end = s32_to_loff_t(end);
}
return 0;
}
@@ -487,7 +532,7 @@
#define NLM_caller_sz 1+QUADLEN(sizeof(system_utsname.nodename))
#define NLM_netobj_sz 1+QUADLEN(XDR_MAX_NETOBJ)
/* #define NLM_owner_sz 1+QUADLEN(NLM_MAXOWNER) */
-#define NLM_fhandle_sz 1+QUADLEN(NFS_FHSIZE)
+#define NLM_fhandle_sz 1+QUADLEN(NFS2_FHSIZE)
#define NLM_lock_sz 3+NLM_caller_sz+NLM_netobj_sz+NLM_fhandle_sz
#define NLM_holder_sz 4+NLM_netobj_sz
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)