diff --git a/bin/copyparty-fuse.py b/bin/copyparty-fuse.py index 3102cb61..104f4032 100755 --- a/bin/copyparty-fuse.py +++ b/bin/copyparty-fuse.py @@ -296,8 +296,8 @@ class CPPF(Operations): for n, cn in enumerate(self.filecache): cache_path, cache1 = cn.tag cache2 = cache1 + len(cn.data) - msg += "\n#{} = {} {} {}\n{}\n".format( - n, cache1, len(cn.data), cache2, cache_path + msg += "\n#{} |{}| {}:{} {}".format( + n, len(cn.data), cache1, cache2, cache_path ) return msg @@ -353,7 +353,10 @@ class CPPF(Operations): cdr = None ncn = -1 with self.filecache_mtx: - dbg("cache request from {} to {}, size {}".format(get1, get2, file_sz)) + dbg( + "cache request {}:{} |{}|".format(get1, get2, file_sz) + + self._describe() + ) for cn in self.filecache: ncn += 1 @@ -373,7 +376,7 @@ class CPPF(Operations): buf_ofs = get1 - cache1 buf_end = buf_ofs + (get2 - get1) dbg( - "found all ({}, {} to {}, len {}) [{}:{}] = {}".format( + "found all (#{} {}:{} |{}|) [{}:{}] = {}".format( ncn, cache1, cache2, @@ -385,11 +388,11 @@ class CPPF(Operations): ) return cn.data[buf_ofs:buf_end] - if get2 < cache2: + if get2 <= cache2: x = cn.data[: get2 - cache1] if not cdr or len(cdr) < len(x): dbg( - "found car ({}, {} to {}, len {}) [:{}-{}] = [:{}] = {}".format( + "found cdr (#{} {}:{} |{}|) [:{}-{}] = [:{}] = {}".format( ncn, cache1, cache2, @@ -404,11 +407,11 @@ class CPPF(Operations): continue - if get1 > cache1: - x = cn.data[-(cache2 - get1) :] + if get1 >= cache1: + x = cn.data[-(max(0, cache2 - get1)) :] if not car or len(car) < len(x): dbg( - "found cdr ({}, {} to {}, len {}) [-({}-{}):] = [-{}:] = {}".format( + "found car (#{} {}:{} |{}|) [-({}-{}):] = [-{}:] = {}".format( ncn, cache1, cache2, @@ -436,18 +439,11 @@ class CPPF(Operations): msg += self._describe() raise Exception(msg) - if car and cdr: + if car and cdr and len(car) + len(cdr) == get2 - get1: dbg(" have both") + return car + cdr - ret = car + cdr - if len(ret) == get2 - get1: - return ret - - msg = "{} + {} != {} - {}".format(len(car), len(cdr), get2, get1) - msg += self._describe() - raise Exception(msg) - - elif cdr: + elif cdr and (not car or len(car) < len(cdr)): h_end = get1 + (get2 - get1) - len(cdr) h_ofs = h_end - 512 * 1024 @@ -457,7 +453,7 @@ class CPPF(Operations): buf_ofs = (get2 - get1) - len(cdr) dbg( - " cdr {}, car {}-{}={} [-{}:]".format( + " cdr {}, car {}:{} |{}| [-{}:]".format( len(cdr), h_ofs, h_end, h_end - h_ofs, buf_ofs ) ) @@ -475,7 +471,7 @@ class CPPF(Operations): buf_ofs = (get2 - get1) - len(car) dbg( - " car {}, cdr {}-{}={} [:{}]".format( + " car {}, cdr {}:{} |{}| [:{}]".format( len(car), h_ofs, h_end, h_end - h_ofs, buf_ofs ) ) @@ -497,7 +493,7 @@ class CPPF(Operations): buf_end = buf_ofs + get2 - get1 dbg( - " {}-{}={} [{}:{}]".format( + " {}:{} |{}| [{}:{}]".format( h_ofs, h_end, h_end - h_ofs, buf_ofs, buf_end ) ) @@ -536,12 +532,11 @@ class CPPF(Operations): path = path.strip("/") ofs2 = offset + length - log("read {} @ {} len {} end {}".format(path, offset, length, ofs2)) - file_sz = self.getattr(path)["st_size"] + log("read {} |{}| {}:{} max {}".format(path, length, offset, ofs2, file_sz)) if ofs2 > file_sz: ofs2 = file_sz - log("truncate to len {} end {}".format(ofs2 - offset, ofs2)) + log("truncate to |{}| :{}".format(ofs2 - offset, ofs2)) if file_sz == 0 or offset >= ofs2: return b"" diff --git a/copyparty/authsrv.py b/copyparty/authsrv.py index 33d1eccf..a391b976 100644 --- a/copyparty/authsrv.py +++ b/copyparty/authsrv.py @@ -135,9 +135,9 @@ class AuthSrv(object): self.warn_anonwrite = True if WINDOWS: - self.re_vol = re.compile(r"^([a-zA-Z]:[\\/][^:]*|[^:]*):([^:]*):(.*)") + self.re_vol = re.compile(r"^([a-zA-Z]:[\\/][^:]*|[^:]*):([^:]*):([^:]*)$") else: - self.re_vol = re.compile(r"^([^:]*):([^:]*):(.*)") + self.re_vol = re.compile(r"^([^:]*):([^:]*):([^:]*)$") self.mutex = threading.Lock() self.reload() @@ -220,11 +220,13 @@ class AuthSrv(object): if self.args.v: # list of src:dst:permset:permset:... # permset is [rwa]username - for vol_match in [self.re_vol.match(x) for x in self.args.v]: - try: - src, dst, perms = vol_match.groups() - except: - raise Exception("invalid -v argument") + for v_str in self.args.v: + m = self.re_vol.match(v_str) + if not m: + raise Exception("invalid -v argument: [{}]".format(v_str)) + + src, dst, perms = m.groups() + print("\n".join([src, dst, perms])) src = fsdec(os.path.abspath(fsenc(src))) dst = dst.strip("/") diff --git a/scripts/fusefuzz.py b/scripts/fusefuzz.py index b2d20551..9e3a959e 100755 --- a/scripts/fusefuzz.py +++ b/scripts/fusefuzz.py @@ -11,6 +11,7 @@ PYTHONPATH=.. python3 -m copyparty -v /dev/shm/fusefuzz/r::r -i 127.0.0.1 def main(): + v = "virt" for n in range(5): with open(f"r/{n}", "wb") as f: f.write(b"h" * n) @@ -19,7 +20,7 @@ def main(): with open("r/f", "wb", fsz) as f: f.write(b"\xab" * fsz) - for rsz in range(62, 66): + for rsz in range(64 * 1024 - 2, 64 * 1024 + 2): ofslist = [0, 1, 2] for n in range(3): ofslist.append(fsz - n) @@ -34,12 +35,12 @@ def main(): continue for n in range(1, 3): - with open(f"v/{n}", "rb") as f: + with open(f"{v}/{n}", "rb") as f: f.read() prev_ofs = -99 with open("r/f", "rb", rsz) as rf: - with open("v/f", "rb", rsz) as vf: + with open(f"{v}/f", "rb", rsz) as vf: while True: ofs += shift if ofs < 0 or ofs > fsz or ofs == prev_ofs: @@ -66,6 +67,39 @@ def main(): ofs += len(rb) + for n in range(1, 3): + with open(f"{v}/{n}", "rb") as f: + f.read() + + with open("r/f", "rb", rsz) as rf: + with open(f"{v}/f", "rb", rsz) as vf: + for n in range(2): + ofs += shift + if ofs < 0 or ofs > fsz: + break + + if ofs != rf.tell(): + rf.seek(ofs) + vf.seek(ofs) + + rb = rf.read(rsz) + vb = vf.read(rsz) + + print( + f"fsz {fsz} rsz {rsz} ofs {ofs0} shift {shift} ofs {ofs} = {len(rb)}" + ) + + if rb != vb: + raise Exception(f"{len(rb)} != {len(vb)}") + + ofs -= rsz + if __name__ == "__main__": main() + + +""" +f() { cat virt/{1,2,AAAAAAAAAAAAA}; echo; dd if=virt/f bs=${1} | cmp r/f; } +901120 +"""