Skip to content

Commit ab1b5b1

Browse files
committed
NXDT: Add ZLT packet validation check
NXDT: Update BufferedStreams: add try-with-resources practice instead of handling steam.close() calls. (See https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). Thanks DarkMatterCore :)
1 parent dff7063 commit ab1b5b1

File tree

1 file changed

+61
-47
lines changed

1 file changed

+61
-47
lines changed

src/main/java/nsusbloader/Utilities/nxdumptool/NxdtUsbAbi1.java

Lines changed: 61 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class NxdtUsbAbi1 {
3737
private final String saveToPath;
3838
private final NxdtTask parent;
3939

40-
private boolean isWindows;
40+
private final boolean isWindows;
4141
private boolean isWindows10;
4242

4343
private static final int NXDT_MAX_DIRECTIVE_SIZE = 0x1000;
@@ -77,6 +77,8 @@ class NxdtUsbAbi1 {
7777
0x00, 0x00, 0x00, 0x00,
7878
0x00, 0x00, 0x00, 0x00 };
7979

80+
private static final long W_MAX_PACKET_SIZE = 0x200;
81+
8082
public NxdtUsbAbi1(DeviceHandle handler,
8183
ILogPrinter logPrinter,
8284
String saveToPath,
@@ -136,7 +138,7 @@ private void readLoop(){
136138
logPrinter.print(e.getMessage(), EMsgType.INFO);
137139
logPrinter.print("Terminating now", EMsgType.FAIL);
138140
}
139-
};
141+
}
140142

141143
private boolean isInvalidDirective(byte[] message) throws Exception{
142144
if (message.length < 0x10){
@@ -256,52 +258,66 @@ private void createPath(String path) throws Exception{
256258
}
257259

258260
private void dumpFile(File file, long size) throws Exception{
259-
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file, false));
260-
261-
byte[] readBuffer;
262-
long received = 0;
263-
int bufferSize;
264-
265-
while (received < size){
266-
readBuffer = readUsbFile();
267-
bos.write(readBuffer);
268-
bufferSize = readBuffer.length;
269-
received += bufferSize;
270-
logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0);
261+
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file, false))) {
262+
byte[] readBuffer;
263+
long received = 0;
264+
int bufferSize;
265+
266+
boolean zlt_expected = isAligned(size);
267+
268+
while (received < size) {
269+
readBuffer = readUsbFile();
270+
bos.write(readBuffer);
271+
bufferSize = readBuffer.length;
272+
received += bufferSize;
273+
logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0);
274+
}
275+
276+
if (zlt_expected) {
277+
logPrinter.print("Finishing with ZLT packet request", EMsgType.INFO);
278+
readUsbFile();
279+
}
280+
} finally {
281+
logPrinter.updateProgress(1.0);
271282
}
272-
logPrinter.updateProgress(1.0);
273-
bos.close();
274283
}
275284

276285
// @see https://bugs.openjdk.java.net/browse/JDK-8146538
277286
private void dumpFileOnWindowsTen(File file, long size) throws Exception{
278287
FileOutputStream fos = new FileOutputStream(file, true);
279-
BufferedOutputStream bos = new BufferedOutputStream(fos);
280-
FileDescriptor fd = fos.getFD();
281288

282-
byte[] readBuffer;
283-
long received = 0;
284-
int bufferSize;
289+
try (BufferedOutputStream bos = new BufferedOutputStream(fos)) {
290+
FileDescriptor fd = fos.getFD();
291+
byte[] readBuffer;
292+
long received = 0;
293+
int bufferSize;
285294

286-
while (received < size){
287-
readBuffer = readUsbFile();
288-
bos.write(readBuffer);
289-
fd.sync(); // Fixes flushing under Windows (unharmful for other OS)
290-
bufferSize = readBuffer.length;
291-
received += bufferSize;
295+
boolean zlt_expected = isAligned(size);
292296

293-
logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0);
294-
}
297+
while (received < size) {
298+
readBuffer = readUsbFile();
299+
bos.write(readBuffer);
300+
fd.sync(); // Fixes flushing under Windows (unharmful for other OS)
301+
bufferSize = readBuffer.length;
302+
received += bufferSize;
295303

296-
logPrinter.updateProgress(1.0);
297-
bos.close();
304+
logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0);
305+
}
306+
307+
if (zlt_expected) {
308+
logPrinter.print("Finishing with ZLT packet request", EMsgType.INFO);
309+
readUsbFile();
310+
}
311+
} finally {
312+
logPrinter.updateProgress(1.0);
313+
}
314+
}
315+
/** Handle Zero-length terminator **/
316+
private boolean isAligned(long size){
317+
return ((size & (W_MAX_PACKET_SIZE - 1)) == 0);
298318
}
299319

300-
/**
301-
* Sending any byte array to USB device
302-
* @return 'false' if no issues
303-
* 'true' if errors happened
304-
* */
320+
/** Sending any byte array to USB device **/
305321
private void writeUsb(byte[] message) throws Exception{
306322
ByteBuffer writeBuffer = ByteBuffer.allocateDirect(message.length);
307323
writeBuffer.put(message);
@@ -312,18 +328,16 @@ private void writeUsb(byte[] message) throws Exception{
312328

313329
int result = LibUsb.bulkTransfer(handlerNS, (byte) 0x01, writeBuffer, writeBufTransferred, 5050);
314330

315-
switch (result){
316-
case LibUsb.SUCCESS:
317-
if (writeBufTransferred.get() == message.length)
318-
return;
319-
throw new Exception("Data transfer issue [write]" +
320-
"\n Requested: "+message.length+
321-
"\n Transferred: "+writeBufTransferred.get());
322-
default:
323-
throw new Exception("Data transfer issue [write]" +
324-
"\n Returned: "+ UsbErrorCodes.getErrCode(result) +
325-
"\n (execution stopped)");
331+
if (result == LibUsb.SUCCESS) {
332+
if (writeBufTransferred.get() == message.length)
333+
return;
334+
throw new Exception("Data transfer issue [write]" +
335+
"\n Requested: " + message.length +
336+
"\n Transferred: " + writeBufTransferred.get());
326337
}
338+
throw new Exception("Data transfer issue [write]" +
339+
"\n Returned: " + UsbErrorCodes.getErrCode(result) +
340+
"\n (execution stopped)");
327341

328342
}
329343
/**

0 commit comments

Comments
 (0)