Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d415303c authored by tao.pei's avatar tao.pei Committed by Narayan Kamath
Browse files

Pass MUTF-8 paths to open(2) instead of UTF-8.

Modified UTF-8 and UTF-8 differ with respect to how they handle
non-BMP characters. Modified UTF-8 uses 2 x 3 byte encodings, one
each for the high and low surrogate, whereas UTF-8 uses a single
4 byte sequence.

File systems don't specify and encoding and therefore the file name
encoding will vary depending on how it's created. All standard
Java APIs (java.io.File / FileOutputStream etc.) use Modified UTF-8
filenames, so we assume that's the status quo.

We will also audit code from the rest of the platform to make sure
that file names are encoded consistently.

bug: 21578056

Change-Id: I8e37af7f7cc442805a48899917f8e61c8f81fba6
parent 3a5c054a
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -449,15 +449,11 @@ static jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jclass clazz,
        jniThrowNullPointerException(env, NULL);
        return NULL;
    }
    const jchar* str = env->GetStringCritical(name, 0);
    if (str == NULL) {
        // Whatever, whatever.
        jniThrowException(env, "java/lang/IllegalStateException", NULL);
    ScopedUtfChars name8(env, name);
    if (name8.c_str() == NULL) {
        return NULL;
    }
    String8 name8(reinterpret_cast<const char16_t*>(str),
                  env->GetStringLength(name));
    env->ReleaseStringCritical(name, str);

    int flags=0;
    switch (mode&0x30000000) {
        case 0:
@@ -480,7 +476,7 @@ static jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jclass clazz,
    if (mode&0x00000001) realMode |= S_IROTH;
    if (mode&0x00000002) realMode |= S_IWOTH;

    int fd = open(name8.string(), flags, realMode);
    int fd = open(name8.c_str(), flags, realMode);
    if (fd < 0) {
        jniThrowException(env, "java/io/FileNotFoundException", strerror(errno));
        return NULL;