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;
--
⑨