diff --git a/packages/hdwallet-keepkey-nodewebusb/src/transport.ts b/packages/hdwallet-keepkey-nodewebusb/src/transport.ts index 2a6e8954..0c2fca01 100644 --- a/packages/hdwallet-keepkey-nodewebusb/src/transport.ts +++ b/packages/hdwallet-keepkey-nodewebusb/src/transport.ts @@ -79,8 +79,11 @@ export class TransportDelegate implements keepkey.TransportDelegate { async readChunk(debugLink?: boolean): Promise { const result = await this.usbDevice.transferIn(debugLink ? 2 : 1, keepkey.SEGMENT_SIZE + 1); - if (result.status === "stall" && result.data !== undefined) { - await this.usbDevice.clearHalt("out", debugLink ? 2 : 1); + if (result.status === "stall") { + // Reset the halt on the IN pipe we just read (not OUT), then surface a + // retryable error -- a stalled transfer's buffer is not a valid packet. + await this.usbDevice.clearHalt("in", debugLink ? 2 : 1); + throw new Error("bad read"); } else if (result.status !== "ok" || result.data === undefined) { throw new Error("bad read"); } diff --git a/packages/hdwallet-keepkey-webusb/src/transport.ts b/packages/hdwallet-keepkey-webusb/src/transport.ts index 6b3a6b87..122e1749 100644 --- a/packages/hdwallet-keepkey-webusb/src/transport.ts +++ b/packages/hdwallet-keepkey-webusb/src/transport.ts @@ -76,7 +76,10 @@ export class TransportDelegate implements keepkey.TransportDelegate { const { status, data } = await this.usbDevice.transferIn(debugLink ? 2 : 1, keepkey.SEGMENT_SIZE + 1); if (status === "stall") { - await this.usbDevice.clearHalt("out", debugLink ? 2 : 1); + // Reset the halt on the IN pipe we just read (not OUT), then surface a + // retryable error -- a stalled transfer's buffer is not a valid packet. + await this.usbDevice.clearHalt("in", debugLink ? 2 : 1); + throw new Error("bad read"); } if (data === undefined) throw new Error("bad read");