summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2012-01-15 14:31:27 +0100
committercinap_lenrek <cinap_lenrek@centraldogma>2012-01-15 14:31:27 +0100
commitc11bed9f41ab5ad35fb83e6bba040ca7d757e031 (patch)
treefac76b0c49a0333d09cd57e4a383bc76904b874d
parent260fcc61c01b32c7b878063ca9dd7c9a118981bf (diff)
downloadplan9front-c11bed9f41ab5ad35fb83e6bba040ca7d757e031.tar.xz
cifsd: handle bogus MaxCount in read, wstat archive attribute
-rw-r--r--sys/src/cmd/ip/cifsd/smb.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/sys/src/cmd/ip/cifsd/smb.c b/sys/src/cmd/ip/cifsd/smb.c
index 160023adb..bcb8a28fd 100644
--- a/sys/src/cmd/ip/cifsd/smb.c
+++ b/sys/src/cmd/ip/cifsd/smb.c
@@ -427,11 +427,14 @@ badsmb:
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 @@ smbsetinformation(Req *r, uchar *h, uchar *p, uchar *e)
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;