summaryrefslogtreecommitdiffstats
path: root/media/mtp
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2010-07-02 15:15:07 -0400
committerMike Lockwood <lockwood@android.com>2010-07-02 15:19:32 -0400
commit8e2a280ab7f98bf00ff2651f1f93c8f8bd46c08d (patch)
treed8135f979208f4b6611273fbba70624c0ea40557 /media/mtp
parent0250361b110267a139cc0865ff7d2f13b4d63bdf (diff)
downloadframeworks_av-8e2a280ab7f98bf00ff2651f1f93c8f8bd46c08d.zip
frameworks_av-8e2a280ab7f98bf00ff2651f1f93c8f8bd46c08d.tar.gz
frameworks_av-8e2a280ab7f98bf00ff2651f1f93c8f8bd46c08d.tar.bz2
MTP: Fix ownership and file permissions for transferred files and folders
All new files and folders are created with group sdcard_rw Permissions for new files are 0664 and directories 0775 Change-Id: I6d508231150f687e2e529112fd47f10e30fa594f Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/mtp')
-rw-r--r--media/mtp/MtpServer.cpp16
-rw-r--r--media/mtp/MtpServer.h9
-rw-r--r--media/mtp/mtptest.cpp3
3 files changed, 24 insertions, 4 deletions
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index cc6fdad..b9eeec5 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -113,10 +113,14 @@ static const MtpObjectFormat kSupportedPlaybackFormats[] = {
// MTP_FORMAT_PLS_PLAYLIST,
};
-MtpServer::MtpServer(int fd, const char* databasePath)
+MtpServer::MtpServer(int fd, const char* databasePath,
+ int fileGroup, int filePerm, int directoryPerm)
: mFD(fd),
mDatabasePath(databasePath),
mDatabase(NULL),
+ mFileGroup(fileGroup),
+ mFilePermission(filePerm),
+ mDirectoryPermission(directoryPerm),
mSessionID(0),
mSessionOpen(false),
mSendObjectHandle(kInvalidObjectHandle),
@@ -536,10 +540,11 @@ MtpResponseCode MtpServer::doSendObjectInfo() {
if (format == MTP_FORMAT_ASSOCIATION) {
mode_t mask = umask(0);
- int ret = mkdir((const char *)path, S_IRWXU | S_IRWXG | S_IRWXO);
+ int ret = mkdir((const char *)path, mDirectoryPermission);
umask(mask);
if (ret && ret != -EEXIST)
return MTP_RESPONSE_GENERAL_ERROR;
+ chown((const char *)path, getuid(), mFileGroup);
} else {
mSendObjectFilePath = path;
// save the handle for the SendObject call, which should follow
@@ -571,12 +576,19 @@ MtpResponseCode MtpServer::doSendObject() {
if (mfr.fd < 0) {
return MTP_RESPONSE_GENERAL_ERROR;
}
+ fchown(mfr.fd, getuid(), mFileGroup);
+ // set permissions
+ mode_t mask = umask(0);
+ fchmod(mfr.fd, mFilePermission);
+ umask(mask);
+
mfr.offset = 0;
mfr.length = mSendObjectFileSize;
// transfer the file
ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
close(mfr.fd);
+
// FIXME - we need to delete mSendObjectHandle from the database if this fails.
LOGV("MTP_RECEIVE_FILE returned %d", ret);
mSendObjectHandle = kInvalidObjectHandle;
diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h
index 42261a9..25635af 100644
--- a/media/mtp/MtpServer.h
+++ b/media/mtp/MtpServer.h
@@ -41,6 +41,12 @@ private:
MtpSqliteDatabase* mDatabase;
+ // group to own new files and folders
+ int mFileGroup;
+ // permissions for new files and directories
+ int mFilePermission;
+ int mDirectoryPermission;
+
// current session ID
MtpSessionID mSessionID;
// true if we have an open session and mSessionID is valid
@@ -61,7 +67,8 @@ private:
size_t mSendObjectFileSize;
public:
- MtpServer(int fd, const char* databasePath);
+ MtpServer(int fd, const char* databasePath,
+ int fileGroup, int filePerm, int directoryPerm);
virtual ~MtpServer();
void addStorage(const char* filePath);
diff --git a/media/mtp/mtptest.cpp b/media/mtp/mtptest.cpp
index 9062494..af0f77f 100644
--- a/media/mtp/mtptest.cpp
+++ b/media/mtp/mtptest.cpp
@@ -27,6 +27,7 @@
#include "MtpServer.h"
#include "MtpStorage.h"
#include "f_mtp.h"
+#include "private/android_filesystem_config.h"
using namespace android;
@@ -76,7 +77,7 @@ int main(int argc, char* argv[]) {
enable_usb_function("usb_mass_storage", false);
enable_usb_function("mtp", true);
- MtpServer server(fd, "/data/data/mtp/mtp.db");
+ MtpServer server(fd, "/data/data/mtp/mtp.db", AID_SDCARD_RW, 0664, 0775);
server.addStorage(storagePath);
server.scanStorage();
server.run();