in java/com/facebook/soloader/UnpackingSoSource.java [282:318]
private void extractDsoImpl(InputDso iDso, byte[] ioBuffer) throws IOException {
File dsoFileName = new File(soDirectory, iDso.getFileName());
RandomAccessFile dsoFile = null;
try {
if (dsoFileName.exists() && !dsoFileName.setWritable(true)) {
Log.w(TAG, "error adding write permission to: " + dsoFileName);
}
try {
dsoFile = new RandomAccessFile(dsoFileName, "rw");
} catch (IOException ex) {
Log.w(TAG, "error overwriting " + dsoFileName + " trying to delete and start over", ex);
SysUtil.dumbDeleteRecursive(dsoFileName); // Throws on error; not existing is okay
dsoFile = new RandomAccessFile(dsoFileName, "rw");
}
int sizeHint = iDso.available();
if (sizeHint > 1) {
SysUtil.fallocateIfSupported(dsoFile.getFD(), sizeHint);
}
iDso.write(dsoFile, ioBuffer);
dsoFile.setLength(dsoFile.getFilePointer()); // In case we shortened file
if (!dsoFileName.setExecutable(true /* allow exec... */, false /* ...for everyone */)) {
throw new IOException("cannot make file executable: " + dsoFileName);
}
} catch (IOException e) {
SysUtil.dumbDeleteRecursive(dsoFileName);
throw e;
} finally {
if (!dsoFileName.setWritable(false)) {
Log.w(TAG, "error removing " + dsoFileName + " write permission");
}
if (dsoFile != null) {
dsoFile.close();
}
}
}