Skip to content

Commit d2e922b

Browse files
committed
Fix race in xmp.py (Closes: #18)
Using os.pread/os.pwrite is the easy and obvious fix, but unfortunately those are not available in Python 2, so fall back to a per file lock.
1 parent 1006867 commit d2e922b

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

example/xmp.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from errno import *
1414
from stat import *
1515
import fcntl
16+
from threading import Lock
1617
# pull in some spaghetti to make this stuff work without fuse-py being installed
1718
try:
1819
import _find_fuse_parts
@@ -168,15 +169,32 @@ def __init__(self, path, flags, *mode):
168169
self.file = os.fdopen(os.open("." + path, flags, *mode),
169170
flag2mode(flags))
170171
self.fd = self.file.fileno()
172+
if hasattr(os, 'pread'):
173+
self.iolock = None
174+
else:
175+
self.iolock = Lock()
171176

172177
def read(self, length, offset):
173-
self.file.seek(offset)
174-
return self.file.read(length)
178+
if self.iolock:
179+
self.iolock.acquire()
180+
try:
181+
self.file.seek(offset)
182+
return self.file.read(length)
183+
finally:
184+
self.iolock.release()
185+
else:
186+
return os.pread(self.fd, length, offset)
175187

176188
def write(self, buf, offset):
177-
self.file.seek(offset)
178-
self.file.write(buf)
179-
return len(buf)
189+
if self.iolock:
190+
self.iolock.acquire()
191+
try:
192+
self.file.seek(offset)
193+
return self.file.write(buf)
194+
finally:
195+
self.iolock.release()
196+
else:
197+
return os.pwrite(self.fd, buf, offset)
180198

181199
def release(self, flags):
182200
self.file.close()

0 commit comments

Comments
 (0)