From 37c09d22323854a63eb3c5ed7bc72b3147bd4967 Mon Sep 17 00:00:00 2001 From: Harlen Tan Date: Fri, 3 Jan 2025 15:54:50 +0800 Subject: [PATCH 1/2] fix: fix memory leak after writing data with false result Signed-off-by: haiyan.tan --- src/adb/connection.ts | 5 ++--- src/adb/sync.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/adb/connection.ts b/src/adb/connection.ts index e2fa5326..ada5a5a6 100644 --- a/src/adb/connection.ts +++ b/src/adb/connection.ts @@ -78,9 +78,8 @@ export default class Connection extends EventEmitter { return this; } - public write(data: Buffer, callback?: (err?: Error) => void): this { - this.socket.write(dump(data), callback); - return this; + public write(data: Buffer, callback?: (err?: Error) => void): boolean { + return this.socket.write(dump(data), callback); } public startServer(): Bluebird { diff --git a/src/adb/sync.ts b/src/adb/sync.ts index 66b9a94d..bab6a434 100644 --- a/src/adb/sync.ts +++ b/src/adb/sync.ts @@ -188,7 +188,7 @@ export default class Sync extends EventEmitter { const track = () => transfer.pop(); const writeNext = () => { let chunk: Buffer; - if ((chunk = stream.read(DATA_MAX_LENGTH) || stream.read())) { + if (!this.connection.socket.writableNeedDrain && (chunk = stream.read(DATA_MAX_LENGTH) || stream.read())) { this._sendCommandWithLength(Protocol.DATA, chunk.length); transfer.push(chunk.length); if (this.connection.write(chunk, track)) { From 612ade5ac5b271b01d5f3c063a7bf00cc21686e4 Mon Sep 17 00:00:00 2001 From: Harlen Tan Date: Fri, 3 Jan 2025 16:26:01 +0800 Subject: [PATCH 2/2] fix: check writableNeedDrain to fix memory leak after writing data with false result Signed-off-by: haiyan.tan --- src/adb/connection.ts | 5 +++-- src/adb/sync.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/adb/connection.ts b/src/adb/connection.ts index ada5a5a6..e2fa5326 100644 --- a/src/adb/connection.ts +++ b/src/adb/connection.ts @@ -78,8 +78,9 @@ export default class Connection extends EventEmitter { return this; } - public write(data: Buffer, callback?: (err?: Error) => void): boolean { - return this.socket.write(dump(data), callback); + public write(data: Buffer, callback?: (err?: Error) => void): this { + this.socket.write(dump(data), callback); + return this; } public startServer(): Bluebird { diff --git a/src/adb/sync.ts b/src/adb/sync.ts index bab6a434..fda1b4da 100644 --- a/src/adb/sync.ts +++ b/src/adb/sync.ts @@ -191,7 +191,7 @@ export default class Sync extends EventEmitter { if (!this.connection.socket.writableNeedDrain && (chunk = stream.read(DATA_MAX_LENGTH) || stream.read())) { this._sendCommandWithLength(Protocol.DATA, chunk.length); transfer.push(chunk.length); - if (this.connection.write(chunk, track)) { + if (!this.connection.write(chunk, track).socket.writableNeedDrain) { return writeNext(); } else { return waitForDrain().then(writeNext);