From c11bed9f41ab5ad35fb83e6bba040ca7d757e031 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 15 Jan 2012 14:31:27 +0100 Subject: [PATCH] cifsd: handle bogus MaxCount in read, wstat archive attribute --- sys/src/cmd/ip/cifsd/smb.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 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;