Skip to content

Commit 620828e

Browse files
committed
review: avoid potential ownership issues
1 parent b00753d commit 620828e

2 files changed

Lines changed: 34 additions & 39 deletions

File tree

app/src/main/java/org/koreader/launcher/EventReceiver.kt

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,11 @@ import android.content.Context
88
import android.content.Intent
99
import android.content.IntentFilter
1010
import android.util.Log
11-
import java.io.FileOutputStream
12-
import android.os.ParcelFileDescriptor
1311
import kotlin.collections.HashMap
1412

1513
class EventReceiver : BroadcastReceiver() {
1614
private val tag = this::class.java.simpleName
1715
private val eventMap = HashMap<String, Int>()
18-
private var eventOut: FileOutputStream? = null
19-
private var eventPfd: ParcelFileDescriptor? = null
20-
private var eventFd: Int = -1
21-
private val eventLock = Any()
2216

2317
init {
2418
eventMap[Intent.ACTION_POWER_CONNECTED] = 100
@@ -40,38 +34,18 @@ class EventReceiver : BroadcastReceiver() {
4034
}
4135

4236
private fun write(code: Int?) {
43-
code?.let {
44-
try {
45-
val out = ensureSocketOpen() ?: return
46-
// 32-bit event code, low byte first
47-
val msg = ByteArray(4)
48-
msg[0] = (it and 0xFF).toByte()
49-
msg[1] = ((it ushr 8) and 0xFF).toByte()
50-
msg[2] = ((it ushr 16) and 0xFF).toByte()
51-
msg[3] = ((it ushr 24) and 0xFF).toByte()
52-
out.write(msg)
53-
out.flush()
54-
} catch (e: Exception) {
55-
Log.e(tag, "Cannot write to event socket: \n$e")
56-
}
57-
} ?: Log.e(tag, "Invalid code: must be a 32-bit integer")
58-
}
37+
if (code == null) {
38+
Log.e(tag, "Invalid code: must be a 32-bit integer")
39+
return
40+
}
5941

60-
private fun ensureSocketOpen(): FileOutputStream? {
61-
synchronized(eventLock) {
62-
if (eventOut != null) {
63-
return eventOut
64-
}
65-
if (eventFd < 0) {
66-
eventFd = nativeGetEventSocketFd()
67-
if (eventFd < 0) {
68-
Log.e(tag, "Event socket fd is not available")
69-
return null
70-
}
42+
try {
43+
val rc = nativeSendEvent(code)
44+
if (rc != 0) {
45+
Log.e(tag, "nativeSendEvent failed with code $rc")
7146
}
72-
eventPfd = ParcelFileDescriptor.adoptFd(eventFd)
73-
eventOut = FileOutputStream(eventPfd!!.fileDescriptor)
74-
return eventOut
47+
} catch (e: Throwable) {
48+
Log.e(tag, "Cannot send event to native socket: $e")
7549
}
7650
}
7751

@@ -86,6 +60,6 @@ class EventReceiver : BroadcastReceiver() {
8660

8761
companion object {
8862
@JvmStatic
89-
private external fun nativeGetEventSocketFd(): Int
63+
private external fun nativeSendEvent(code: Int): Int
9064
}
9165
}

jni/android_native_app_glue/android_native_app_glue.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <errno.h>
2121
#include <fcntl.h>
22+
#include <stdint.h>
2223
#include <stdlib.h>
2324
#include <string.h>
2425
#include <unistd.h>
@@ -513,8 +514,28 @@ void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_
513514
}
514515

515516
JNIEXPORT jint JNICALL
516-
Java_org_koreader_launcher_EventReceiver_nativeGetEventSocketFd(JNIEnv* env, jclass clazz) {
517+
Java_org_koreader_launcher_EventReceiver_nativeSendEvent(JNIEnv* env, jclass clazz, jint code) {
517518
(void)env;
518519
(void)clazz;
519-
return g_event_write_fd;
520+
521+
if (g_event_write_fd < 0) {
522+
LOGE("Event socket fd is not available");
523+
return -1;
524+
}
525+
526+
// 32-bit event code, low byte first
527+
uint8_t msg[4];
528+
msg[0] = (uint8_t)(code & 0xFF);
529+
msg[1] = (uint8_t)((code >> 8) & 0xFF);
530+
msg[2] = (uint8_t)((code >> 16) & 0xFF);
531+
msg[3] = (uint8_t)((code >> 24) & 0xFF);
532+
533+
ssize_t written = send(g_event_write_fd, msg, sizeof(msg), MSG_NOSIGNAL);
534+
if (written != (ssize_t)sizeof(msg)) {
535+
int err = errno;
536+
LOGE("Failed to write event socket: %s", strerror(err));
537+
return -err;
538+
}
539+
540+
return 0;
520541
}

0 commit comments

Comments
 (0)