Read the flags before calling the Java method, as it might free the underlying memory.

This commit is contained in:
Luca Longinotti 2013-06-18 10:51:06 +02:00
parent faa739dcbd
commit f92a84c979
4 changed files with 11 additions and 4 deletions

View File

@ -306,16 +306,23 @@ static void LIBUSB_CALL transferCallback(struct libusb_transfer *transfer)
// The saved reference to the Java Transfer object.
jobject jTransfer = transferData->transferObject;
// Call back into Java.
(*env)->CallVoidMethod(env, jCallback, jCallbackMethod, jTransfer);
// Cleanup Java Transfer object too, if requested.
// Read flags before calling the Java method, as it could
// free the Transfer itself.
if (transfer->flags & LIBUSB_TRANSFER_FREE_TRANSFER)
{
// Call back into Java.
(*env)->CallVoidMethod(env, jCallback, jCallbackMethod, jTransfer);
// Cleanup Java Transfer object too, if requested.
cleanupGlobalReferences(env, jTransfer);
resetTransfer(env, jTransfer);
free(transferData);
}
else
{
// Call back into Java.
(*env)->CallVoidMethod(env, jCallback, jCallbackMethod, jTransfer);
}
THREAD_END
}