PTP: Fix permissions problems with files imported via PTP
Change-Id: I630a89c67e5b3d6d0c29e6c257f84e1909fa4de2 Signed-off-by: Mike Lockwood <lockwood@android.com>
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
#include "jni.h"
|
||||
#include "JNIHelp.h"
|
||||
#include "android_runtime/AndroidRuntime.h"
|
||||
#include "private/android_filesystem_config.h"
|
||||
|
||||
#include "MtpClient.h"
|
||||
#include "MtpDevice.h"
|
||||
@@ -197,7 +198,7 @@ android_media_MtpClient_import_file(JNIEnv *env, jobject thiz,
|
||||
MtpDevice* device = client->getDevice(device_id);
|
||||
if (device) {
|
||||
const char *destPathStr = env->GetStringUTFChars(dest_path, NULL);
|
||||
bool result = device->readObject(object_id, destPathStr);
|
||||
bool result = device->readObject(object_id, destPathStr, AID_SDCARD_RW, 0664);
|
||||
env->ReleaseStringUTFChars(dest_path, destPathStr);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -349,7 +349,7 @@ MtpProperty* MtpDevice::getDevicePropDesc(MtpDeviceProperty code) {
|
||||
}
|
||||
|
||||
// reads the object's data and writes it to the specified file path
|
||||
bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath) {
|
||||
bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int group, int perm) {
|
||||
LOGD("readObject: %s", destPath);
|
||||
int fd = ::open(destPath, O_RDWR | O_CREAT | O_TRUNC);
|
||||
if (fd < 0) {
|
||||
@@ -357,6 +357,12 @@ bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath) {
|
||||
return false;
|
||||
}
|
||||
|
||||
fchown(fd, getuid(), group);
|
||||
// set permissions
|
||||
int mask = umask(0);
|
||||
fchmod(fd, perm);
|
||||
umask(mask);
|
||||
|
||||
Mutex::Autolock autoLock(mMutex);
|
||||
bool result = false;
|
||||
|
||||
|
||||
@@ -75,7 +75,8 @@ public:
|
||||
MtpDeviceInfo* getDeviceInfo();
|
||||
MtpStorageIDList* getStorageIDs();
|
||||
MtpStorageInfo* getStorageInfo(MtpStorageID storageID);
|
||||
MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format, MtpObjectHandle parent);
|
||||
MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format,
|
||||
MtpObjectHandle parent);
|
||||
MtpObjectInfo* getObjectInfo(MtpObjectHandle handle);
|
||||
void* getThumbnail(MtpObjectHandle handle, int& outLength);
|
||||
MtpObjectHandle sendObjectInfo(MtpObjectInfo* info);
|
||||
@@ -86,7 +87,8 @@ public:
|
||||
|
||||
MtpProperty* getDevicePropDesc(MtpDeviceProperty code);
|
||||
|
||||
bool readObject(MtpObjectHandle handle, const char* destPath);
|
||||
bool readObject(MtpObjectHandle handle, const char* destPath, int group,
|
||||
int perm);
|
||||
|
||||
private:
|
||||
bool sendRequest(MtpOperationCode operation);
|
||||
|
||||
Reference in New Issue
Block a user