Path: blob/main/website/static/security/patches/EN-07:01/nfs61.patch
18096 views
Index: sys/nfsserver/nfs_serv.c1===================================================================2RCS file: /home/ncvs/src/sys/nfsserver/nfs_serv.c,v3retrieving revision 1.156.2.24diff -u -r1.156.2.2 nfs_serv.c5--- sys/nfsserver/nfs_serv.c 13 Mar 2006 03:06:49 -0000 1.156.2.26+++ sys/nfsserver/nfs_serv.c 3 Jan 2007 17:14:55 -00007@@ -569,6 +569,10 @@89error = lookup(&ind);10ind.ni_dvp = NULL;11+ if (ind.ni_cnd.cn_flags & GIANTHELD) {12+ mtx_unlock(&Giant);13+ ind.ni_cnd.cn_flags &= ~GIANTHELD;14+ }1516if (error == 0) {17/*18@@ -1915,6 +1919,10 @@1920error = lookup(&nd);21nd.ni_dvp = NULL;22+ if (nd.ni_cnd.cn_flags & GIANTHELD) {23+ mtx_unlock(&Giant);24+ nd.ni_cnd.cn_flags &= ~GIANTHELD;25+ }26if (error)27goto ereply;2829@@ -2141,6 +2149,10 @@3031error = lookup(&nd);32nd.ni_dvp = NULL;33+ if (nd.ni_cnd.cn_flags & GIANTHELD) {34+ mtx_unlock(&Giant);35+ nd.ni_cnd.cn_flags &= ~GIANTHELD;36+ }3738if (error)39goto out;40@@ -2514,8 +2526,8 @@41tond.ni_dvp = NULL;42tond.ni_vp = NULL;43if (error) {44- fromnd.ni_cnd.cn_flags &= ~HASBUF;45- tond.ni_cnd.cn_flags &= ~HASBUF;46+ NDFREE(&fromnd, NDF_ONLY_PNBUF);47+ NDFREE(&tond, NDF_ONLY_PNBUF);48}49} else {50if (error == -1)51@@ -2809,6 +2821,12 @@52nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART;53error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,54&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);55+ if (error == 0) {56+ VATTR_NULL(vap);57+ if (v3)58+ nfsm_srvsattr(vap);59+ nfsm_srvpathsiz(len2);60+ }61NFSD_UNLOCK();62mtx_lock(&Giant); /* VFS */63if (dirp && !v3) {64@@ -2818,10 +2836,6 @@65if (error)66goto out;6768- VATTR_NULL(vap);69- if (v3)70- nfsm_srvsattr(vap);71- nfsm_srvpathsiz(len2);72MALLOC(pathcp, caddr_t, len2 + 1, M_TEMP, M_WAITOK);73iv.iov_base = pathcp;74iv.iov_len = len2;75@@ -2878,6 +2892,10 @@7677error = lookup(&nd);78nd.ni_dvp = NULL;79+ if (nd.ni_cnd.cn_flags & GIANTHELD) {80+ mtx_unlock(&Giant);81+ nd.ni_cnd.cn_flags &= ~GIANTHELD;82+ }8384if (error == 0) {85bzero((caddr_t)fhp, sizeof(nfh));86Index: sys/nfsserver/nfs_srvsubs.c87===================================================================88RCS file: /home/ncvs/src/sys/nfsserver/nfs_srvsubs.c,v89retrieving revision 1.136.2.290diff -u -r1.136.2.2 nfs_srvsubs.c91--- sys/nfsserver/nfs_srvsubs.c 4 Apr 2006 15:29:51 -0000 1.136.2.292+++ sys/nfsserver/nfs_srvsubs.c 2 Jan 2007 19:20:02 -000093@@ -875,6 +875,10 @@94}95if (!lockleaf)96cnp->cn_flags &= ~LOCKLEAF;97+ if (cnp->cn_flags & GIANTHELD) {98+ mtx_unlock(&Giant);99+ cnp->cn_flags &= ~GIANTHELD;100+ }101102/*103* nfs_namei() guarentees that fields will not contain garbage104@@ -1331,6 +1335,24 @@105return 0;106}107108+int109+nfsm_srvnamesiz0_xx(int *s, int m, struct mbuf **md, caddr_t *dpos)110+{111+ u_int32_t *tl;112+113+ NFSD_LOCK_DONTCARE();114+115+ tl = nfsm_dissect_xx_nonblock(NFSX_UNSIGNED, md, dpos);116+ if (tl == NULL)117+ return EBADRPC;118+ *s = fxdr_unsigned(int32_t, *tl);119+ if (*s > m)120+ return NFSERR_NAMETOL;121+ if (*s < 0)122+ return EBADRPC;123+ return 0;124+}125+126void127nfsm_clget_xx(u_int32_t **tl, struct mbuf *mb, struct mbuf **mp,128char **bp, char **be, caddr_t bpos, int droplock)129Index: sys/nfsserver/nfsm_subs.h130===================================================================131RCS file: /home/ncvs/src/sys/nfsserver/nfsm_subs.h,v132retrieving revision 1.37133diff -u -r1.37 nfsm_subs.h134--- sys/nfsserver/nfsm_subs.h 7 Jan 2005 01:45:51 -0000 1.37135+++ sys/nfsserver/nfsm_subs.h 2 Jan 2007 19:16:30 -0000136@@ -74,6 +74,7 @@137138int nfsm_srvstrsiz_xx(int *s, int m, struct mbuf **md, caddr_t *dpos);139int nfsm_srvnamesiz_xx(int *s, int m, struct mbuf **md, caddr_t *dpos);140+int nfsm_srvnamesiz0_xx(int *s, int m, struct mbuf **md, caddr_t *dpos);141int nfsm_srvmtofh_xx(fhandle_t *f, struct nfsrv_descript *nfsd,142struct mbuf **md, caddr_t *dpos);143int nfsm_srvsattr_xx(struct vattr *a, struct mbuf **md, caddr_t *dpos);144@@ -101,7 +102,7 @@145#define nfsm_srvpathsiz(s) \146do { \147int t1; \148- t1 = nfsm_srvnamesiz_xx(&(s), NFS_MAXPATHLEN, &md, &dpos); \149+ t1 = nfsm_srvnamesiz0_xx(&(s), NFS_MAXPATHLEN, &md, &dpos); \150if (t1) { \151error = t1; \152nfsm_reply(0); \153154155