git: 9front

Download patch

ref: b3d401ef497f7b86ab1aa1d451f18ed64d0f0e39
parent: 735edc6265d5be9601f4346d1700930ebadcf6a6
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Sun Jan 15 09:31:27 EST 2012

cifsd: handle bogus MaxCount in read, wstat archive attribute

--- a/sys/src/cmd/ip/cifsd/smb.c
+++ b/sys/src/cmd/ip/cifsd/smb.c
@@ -427,11 +427,14 @@
 		r->respond(r, STATUS_INVALID_SMB);
 		goto out;
 	}
-	re = rb + maxcount;
+	re = rb + mincount;
 	if(re > r->re)
-		re = r->re;
-	if((rb + mincount) > re)
 		goto badsmb;
+	if(maxcount > mincount){
+		re = rb + maxcount;
+		if(re > r->re)
+			re = r->re;
+	}
 	n = 0;
 	rp = rb;
 	while(rp < re){
@@ -868,13 +871,20 @@
 	nulldir(&nd);
 	if(mtime)
 		nd.mtime = mtime-tzoff;
+	nd.mode = d->mode;
 	if(attr & ATTR_READONLY){
-		if(d->mode & 0222)
-			nd.mode = d->mode & ~0222;
-	} else {
-		if((d->mode & 0222) == 0)
-			nd.mode = d->mode | 0222;
+		if(nd.mode & 0222)
+			nd.mode &= ~0222;
+	}else{
+		if((nd.mode & 0222) == 0)
+			nd.mode |= 0222;
 	}
+	if(attr & ATTR_ARCHIVE)
+		nd.mode &= ~DMTMP;
+	else
+		nd.mode |= DMTMP;
+	if(nd.mode == d->mode)
+		nd.mode = ~0;
 	if(dirwstat(path, &nd) < 0){
 		r->respond(r, smbmkerror());
 		goto out;
--