fix(YouTube - Litho Filter): Ignore null buffers (#565)

This commit is contained in:
LisoUseInAIKyrios 2024-02-07 19:25:46 +04:00 committed by GitHub
parent 48b968f3be
commit f72faa761c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -503,12 +503,18 @@ public final class LithoFilterPatch {
* Injection point. Called off the main thread. * Injection point. Called off the main thread.
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public static void setProtoBuffer(@NonNull ByteBuffer protobufBuffer) { public static void setProtoBuffer(@Nullable ByteBuffer protobufBuffer) {
// Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes.
// This is intentional, as it appears the buffer can be set once and then filtered multiple times. // This is intentional, as it appears the buffer can be set once and then filtered multiple times.
// The buffer will be cleared from memory after a new buffer is set by the same thread, // The buffer will be cleared from memory after a new buffer is set by the same thread,
// or when the calling thread eventually dies. // or when the calling thread eventually dies.
bufferThreadLocal.set(protobufBuffer); if (protobufBuffer == null) {
// It appears the buffer can be cleared out just before the call to #filter()
// Ignore this null value and retain the last buffer that was set.
Logger.printDebug(() -> "Ignoring null protobuffer");
} else {
bufferThreadLocal.set(protobufBuffer);
}
} }
/** /**
@ -523,15 +529,13 @@ public final class LithoFilterPatch {
ByteBuffer protobufBuffer = bufferThreadLocal.get(); ByteBuffer protobufBuffer = bufferThreadLocal.get();
final byte[] bufferArray; final byte[] bufferArray;
// The buffer can be null or empty when using YT 19.x. // Potentially the buffer may have been null or never set up until now.
// This is likely caused by different threads setting the buffer and calling this method. // Use an empty buffer so the litho id/path filters still work correctly.
// 100% fixing this would require passing the buffer into this method (which may not be so simple).
// For now, still filter with an empty buffer so the non proto buffer filters work correctly.
if (protobufBuffer == null) { if (protobufBuffer == null) {
Logger.printDebug(() -> "Proto buffer is null"); Logger.printDebug(() -> "Proto buffer is null, using an empty buffer array");
bufferArray = EMPTY_BYTE_ARRAY; bufferArray = EMPTY_BYTE_ARRAY;
} else if (!protobufBuffer.hasArray()) { } else if (!protobufBuffer.hasArray()) {
Logger.printDebug(() -> "Proto buffer does not have an array"); Logger.printDebug(() -> "Proto buffer does not have an array, using an empty buffer array");
bufferArray = EMPTY_BYTE_ARRAY; bufferArray = EMPTY_BYTE_ARRAY;
} else { } else {
bufferArray = protobufBuffer.array(); bufferArray = protobufBuffer.array();