diff options
-rw-r--r-- | libs/binder/TEST_MAPPING | 3 | ||||
-rw-r--r-- | libs/binder/ndk/parcel.cpp | 3 | ||||
-rw-r--r-- | libs/binder/rust/src/lib.rs | 4 | ||||
-rw-r--r-- | libs/binder/rust/tests/parcel_fuzzer/parcel_fuzzer.rs | 5 | ||||
-rw-r--r-- | libs/binder/rust/tests/parcel_fuzzer/random_parcel/fuzz_service_test/service_fuzzer.rs | 4 | ||||
-rw-r--r-- | libs/jpegrecoverymap/include/jpegrecoverymap/recoverymaputils.h | 99 | ||||
-rw-r--r-- | libs/jpegrecoverymap/recoverymap.cpp | 129 | ||||
-rw-r--r-- | libs/jpegrecoverymap/recoverymaputils.cpp | 205 | ||||
-rw-r--r-- | services/inputflinger/reader/InputDevice.cpp | 10 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 16 |
10 files changed, 322 insertions, 156 deletions
diff --git a/libs/binder/TEST_MAPPING b/libs/binder/TEST_MAPPING index 342e4a389a..180c67c271 100644 --- a/libs/binder/TEST_MAPPING +++ b/libs/binder/TEST_MAPPING @@ -52,6 +52,9 @@ "name": "memunreachable_binder_test" }, { + "name": "resolv_integration_test" + }, + { "name": "libbinderthreadstateutils_test" }, { diff --git a/libs/binder/ndk/parcel.cpp b/libs/binder/ndk/parcel.cpp index 86930229ce..94f72d96f6 100644 --- a/libs/binder/ndk/parcel.cpp +++ b/libs/binder/ndk/parcel.cpp @@ -700,6 +700,9 @@ binder_status_t AParcel_marshal(const AParcel* parcel, uint8_t* buffer, size_t s return STATUS_BAD_VALUE; } const uint8_t* internalBuffer = parcel->get()->data(); + if (internalBuffer == nullptr) { + return STATUS_UNEXPECTED_NULL; + } memcpy(buffer, internalBuffer + start, len); return STATUS_OK; } diff --git a/libs/binder/rust/src/lib.rs b/libs/binder/rust/src/lib.rs index a0e61d95f9..0c8b48f1f5 100644 --- a/libs/binder/rust/src/lib.rs +++ b/libs/binder/rust/src/lib.rs @@ -94,14 +94,12 @@ //! ``` #[macro_use] -mod proxy; - -#[macro_use] mod binder; mod binder_async; mod error; mod native; mod parcel; +mod proxy; mod state; use binder_ndk_sys as sys; diff --git a/libs/binder/rust/tests/parcel_fuzzer/parcel_fuzzer.rs b/libs/binder/rust/tests/parcel_fuzzer/parcel_fuzzer.rs index c5c7719df2..29bf92cb97 100644 --- a/libs/binder/rust/tests/parcel_fuzzer/parcel_fuzzer.rs +++ b/libs/binder/rust/tests/parcel_fuzzer/parcel_fuzzer.rs @@ -17,9 +17,6 @@ #![allow(missing_docs)] #![no_main] -#[macro_use] -extern crate libfuzzer_sys; - mod read_utils; use crate::read_utils::READ_FUNCS; @@ -31,7 +28,7 @@ use binder::{ StatusCode, }; use binder_random_parcel_rs::create_random_parcel; -use libfuzzer_sys::arbitrary::Arbitrary; +use libfuzzer_sys::{arbitrary::Arbitrary, fuzz_target}; #[derive(Arbitrary, Debug)] enum ReadOperation { diff --git a/libs/binder/rust/tests/parcel_fuzzer/random_parcel/fuzz_service_test/service_fuzzer.rs b/libs/binder/rust/tests/parcel_fuzzer/random_parcel/fuzz_service_test/service_fuzzer.rs index a427f28e29..c53038210c 100644 --- a/libs/binder/rust/tests/parcel_fuzzer/random_parcel/fuzz_service_test/service_fuzzer.rs +++ b/libs/binder/rust/tests/parcel_fuzzer/random_parcel/fuzz_service_test/service_fuzzer.rs @@ -16,8 +16,8 @@ #![allow(missing_docs)] #![no_main] -#[macro_use] -extern crate libfuzzer_sys; + +use libfuzzer_sys::fuzz_target; use binder::{self, BinderFeatures, Interface}; use binder_random_parcel_rs::fuzz_service; diff --git a/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymaputils.h b/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymaputils.h index 164ea64628..8b2672fefa 100644 --- a/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymaputils.h +++ b/libs/jpegrecoverymap/include/jpegrecoverymap/recoverymaputils.h @@ -17,6 +17,8 @@ #ifndef ANDROID_JPEGRECOVERYMAP_RECOVERYMAPUTILS_H #define ANDROID_JPEGRECOVERYMAP_RECOVERYMAPUTILS_H +#include <jpegrecoverymap/recoverymap.h> + #include <sstream> #include <stdint.h> #include <string> @@ -26,6 +28,26 @@ namespace android::recoverymap { struct jpegr_metadata; +// If the EXIF package doesn't exist in the input JPEG, we'll create one with one entry +// where the length is represented by this value. +const size_t PSEUDO_EXIF_PACKAGE_LENGTH = 28; +// If the EXIF package exists in the input JPEG, we'll add an "JR" entry where the length is +// represented by this value. +const size_t EXIF_J_R_ENTRY_LENGTH = 12; + +/* + * Helper function used for writing data to destination. + * + * @param destination destination of the data to be written. + * @param source source of data being written. + * @param length length of the data to be written. + * @param position cursor in desitination where the data is to be written. + * @return status of succeed or error code. + */ +status_t Write(jr_compressed_ptr destination, const void* source, size_t length, int &position); +status_t Write(jr_exif_ptr destination, const void* source, size_t length, int &position); + + /* * Parses XMP packet and fills metadata with data from XMP * @@ -83,6 +105,83 @@ bool getMetadataFromXMP(uint8_t* xmp_data, size_t xmp_size, jpegr_metadata* meta * @return XMP metadata in type of string */ std::string generateXmp(int secondary_image_length, jpegr_metadata& metadata); + +/* + * Add J R entry to existing exif, or create a new one with J R entry if it's null. + * EXIF syntax / change: + * ori: + * FF E1 - APP1 + * 01 FC - size of APP1 (to be calculated) + * ----------------------------------------------------- + * 45 78 69 66 00 00 - Exif\0\0 "Exif header" + * 49 49 2A 00 - TIFF Header + * 08 00 00 00 - offset to the IFD (image file directory) + * 06 00 - 6 entries + * 00 01 - Width Tag + * 03 00 - 'Short' type + * 01 00 00 00 - 1 component + * 00 05 00 00 - image with 0x500 + *-------------------------------------------------------------------------- + * new: + * FF E1 - APP1 + * 02 08 - new size, equals to old size + EXIF_J_R_ENTRY_LENGTH (12) + *----------------------------------------------------- + * 45 78 69 66 00 00 - Exif\0\0 "Exif header" + * 49 49 2A 00 - TIFF Header + * 08 00 00 00 - offset to the IFD (image file directory) + * 07 00 - +1 entry + * 4A 52 Custom ('J''R') Tag + * 07 00 - Unknown type + * 01 00 00 00 - 1 component + * 00 00 00 00 - empty data + * 00 01 - Width Tag + * 03 00 - 'Short' type + * 01 00 00 00 - 1 component + * 00 05 00 00 - image with 0x500 + */ +status_t updateExif(jr_exif_ptr exif, jr_exif_ptr dest); + +/* + * Modify offsets in EXIF in place. + * + * Each tag has the following structure: + * + * 00 01 - Tag + * 03 00 - data format + * 01 00 00 00 - number of components + * 00 05 00 00 - value + * + * The value means offset if + * (1) num_of_components * bytes_per_component > 4 bytes, or + * (2) tag == 0x8769 (ExifOffset). + * In both cases, the method will add EXIF_J_R_ENTRY_LENGTH (12) to the offsets. + */ +void updateExifOffsets(jr_exif_ptr exif, int pos, bool use_big_endian); +void updateExifOffsets(jr_exif_ptr exif, int pos, int num_entry, bool use_big_endian); + +/* + * Read data from the target position and target length in bytes; + */ +int readValue(uint8_t* data, int pos, int length, bool use_big_endian); + +/* + * Returns the length of data format in bytes + * + * ---------------------------------------------------------------------------------------------- + * | value | 1 | 2 | 3 | 4 | + * | format | unsigned byte | ascii strings | unsigned short | unsigned long | + * | bytes/component | 1 | 1 | 2 | 4 | + * ---------------------------------------------------------------------------------------------- + * | value | 5 | 6 | 7 | 8 | + * | format |unsigned rational| signed byte | undefined | signed short | + * | bytes/component | 8 | 1 | 1 | 2 | + * ---------------------------------------------------------------------------------------------- + * | value | 9 | 10 | 11 | 12 | + * | format | signed long | signed rational | single float | double float | + * | bytes/component | 4 | 8 | 4 | 8 | + * ---------------------------------------------------------------------------------------------- + */ +int findFormatLengthInBytes(int data_format); } #endif //ANDROID_JPEGRECOVERYMAP_RECOVERYMAPUTILS_H diff --git a/libs/jpegrecoverymap/recoverymap.cpp b/libs/jpegrecoverymap/recoverymap.cpp index eb557e5f17..22289de39c 100644 --- a/libs/jpegrecoverymap/recoverymap.cpp +++ b/libs/jpegrecoverymap/recoverymap.cpp @@ -94,135 +94,6 @@ int GetCPUCoreCount() { } /* - * Helper function used for writing data to destination. - * - * @param destination destination of the data to be written. - * @param source source of data being written. - * @param length length of the data to be written. - * @param position cursor in desitination where the data is to be written. - * @return status of succeed or error code. - */ -status_t Write(jr_compressed_ptr destination, const void* source, size_t length, int &position) { - if (position + length > destination->maxLength) { - return ERROR_JPEGR_BUFFER_TOO_SMALL; - } - - memcpy((uint8_t*)destination->data + sizeof(uint8_t) * position, source, length); - position += length; - return NO_ERROR; -} - -status_t Write(jr_exif_ptr destination, const void* source, size_t length, int &position) { - memcpy((uint8_t*)destination->data + sizeof(uint8_t) * position, source, length); - position += length; - return NO_ERROR; -} - -// If the EXIF package doesn't exist in the input JPEG, we'll create one with one entry -// where the length is represented by this value. -const size_t PSEUDO_EXIF_PACKAGE_LENGTH = 28; -// If the EXIF package exists in the input JPEG, we'll add an "JR" entry where the length is -// represented by this value. -const size_t EXIF_J_R_ENTRY_LENGTH = 12; - -/* - * Helper function - * Add J R entry to existing exif, or create a new one with J R entry if it's null. - * EXIF syntax / change: - * ori: - * FF E1 - APP1 - * 01 FC - size of APP1 (to be calculated) - * ----------------------------------------------------- - * 45 78 69 66 00 00 - Exif\0\0 "Exif header" - * 49 49 2A 00 - TIFF Header - * 08 00 00 00 - offset to the IFD (image file directory) - * 06 00 - 6 entries - * 00 01 - Width Tag - * 03 00 - 'Short' type - * 01 00 00 00 - one entry - * 00 05 00 00 - image with 0x500 - *-------------------------------------------------------------------------- - * new: - * FF E1 - APP1 - * 02 08 - new size, equals to old size + EXIF_J_R_ENTRY_LENGTH (12) - *----------------------------------------------------- - * 45 78 69 66 00 00 - Exif\0\0 "Exif header" - * 49 49 2A 00 - TIFF Header - * 08 00 00 00 - offset to the IFD (image file directory) - * 07 00 - +1 entry - * 4A 52 Custom ('J''R') Tag - * 07 00 - Unknown type - * 01 00 00 00 - one element - * 00 00 00 00 - empty data - * 00 01 - Width Tag - * 03 00 - 'Short' type - * 01 00 00 00 - one entry - * 00 05 00 00 - image with 0x500 - */ -status_t updateExif(jr_exif_ptr exif, jr_exif_ptr dest) { - if (exif == nullptr || exif->data == nullptr) { - uint8_t data[PSEUDO_EXIF_PACKAGE_LENGTH] = { - 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, - 0x49, 0x49, 0x2A, 0x00, - 0x08, 0x00, 0x00, 0x00, - 0x01, 0x00, - 0x4A, 0x52, - 0x07, 0x00, - 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - int pos = 0; - Write(dest, data, PSEUDO_EXIF_PACKAGE_LENGTH, pos); - return NO_ERROR; - } - - int num_entry = 0; - uint8_t num_entry_low = 0; - uint8_t num_entry_high = 0; - bool use_big_endian = false; - if (reinterpret_cast<uint16_t*>(exif->data)[3] == 0x4949) { - num_entry_low = reinterpret_cast<uint8_t*>(exif->data)[14]; - num_entry_high = reinterpret_cast<uint8_t*>(exif->data)[15]; - } else if (reinterpret_cast<uint16_t*>(exif->data)[3] == 0x4d4d) { - use_big_endian = true; - num_entry_high = reinterpret_cast<uint8_t*>(exif->data)[14]; - num_entry_low = reinterpret_cast<uint8_t*>(exif->data)[15]; - } else { - return ERROR_JPEGR_METADATA_ERROR; - } - num_entry = (num_entry_high << 8) | num_entry_low; - num_entry += 1; - num_entry_low = num_entry & 0xff; - num_entry_high = (num_entry << 8) & 0xff; - - int pos = 0; - Write(dest, (uint8_t*)exif->data, 14, pos); - - if (use_big_endian) { - Write(dest, &num_entry_high, 1, pos); - Write(dest, &num_entry_low, 1, pos); - uint8_t data[EXIF_J_R_ENTRY_LENGTH] = { - 0x4A, 0x52, - 0x07, 0x00, - 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - Write(dest, data, EXIF_J_R_ENTRY_LENGTH, pos); - } else { - Write(dest, &num_entry_low, 1, pos); - Write(dest, &num_entry_high, 1, pos); - uint8_t data[EXIF_J_R_ENTRY_LENGTH] = { - 0x4A, 0x52, - 0x00, 0x07, - 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00}; - Write(dest, data, EXIF_J_R_ENTRY_LENGTH, pos); - } - - Write(dest, (uint8_t*)exif->data + 16, exif->length - 16, pos); - - return NO_ERROR; -} - -/* * Helper function copies the JPEG image from without EXIF. * * @param dest destination of the data to be written. diff --git a/libs/jpegrecoverymap/recoverymaputils.cpp b/libs/jpegrecoverymap/recoverymaputils.cpp index 8997b4dee2..d5ad9a51c4 100644 --- a/libs/jpegrecoverymap/recoverymaputils.cpp +++ b/libs/jpegrecoverymap/recoverymaputils.cpp @@ -15,7 +15,6 @@ */ #include <jpegrecoverymap/recoverymaputils.h> -#include <jpegrecoverymap/recoverymap.h> #include <image_io/xml/xml_reader.h> #include <image_io/xml/xml_writer.h> #include <image_io/base/message_handler.h> @@ -23,6 +22,8 @@ #include <image_io/xml/xml_handler.h> #include <image_io/xml/xml_rule.h> +#include <utils/Log.h> + using namespace photos_editing_formats::image_io; using namespace std; @@ -41,6 +42,25 @@ string Name(const string &prefix, const string &suffix) { return ss.str(); } +/* + * Helper function used for writing data to destination. + */ +status_t Write(jr_compressed_ptr destination, const void* source, size_t length, int &position) { + if (position + length > destination->maxLength) { + return ERROR_JPEGR_BUFFER_TOO_SMALL; + } + + memcpy((uint8_t*)destination->data + sizeof(uint8_t) * position, source, length); + position += length; + return NO_ERROR; +} + +status_t Write(jr_exif_ptr destination, const void* source, size_t length, int &position) { + memcpy((uint8_t*)destination->data + sizeof(uint8_t) * position, source, length); + position += length; + return NO_ERROR; +} + // Extremely simple XML Handler - just searches for interesting elements class XMPXmlHandler : public XmlHandler { public: @@ -324,4 +344,185 @@ string generateXmp(int secondary_image_length, jpegr_metadata& metadata) { return ss.str(); } -} // namespace android::recoverymap +/* + * Helper function + * Add J R entry to existing exif, or create a new one with J R entry if it's null. + */ +status_t updateExif(jr_exif_ptr exif, jr_exif_ptr dest) { + if (exif == nullptr || exif->data == nullptr) { + uint8_t data[PSEUDO_EXIF_PACKAGE_LENGTH] = { + 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, + 0x49, 0x49, 0x2A, 0x00, + 0x08, 0x00, 0x00, 0x00, + 0x01, 0x00, + 0x4A, 0x52, + 0x07, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + int pos = 0; + Write(dest, data, PSEUDO_EXIF_PACKAGE_LENGTH, pos); + return NO_ERROR; + } + + int num_entry = 0; + uint8_t num_entry_low = 0; + uint8_t num_entry_high = 0; + bool use_big_endian = false; + if (reinterpret_cast<uint16_t*>(exif->data)[3] == 0x4949) { + num_entry_low = reinterpret_cast<uint8_t*>(exif->data)[14]; + num_entry_high = reinterpret_cast<uint8_t*>(exif->data)[15]; + } else if (reinterpret_cast<uint16_t*>(exif->data)[3] == 0x4d4d) { + use_big_endian = true; + num_entry_high = reinterpret_cast<uint8_t*>(exif->data)[14]; + num_entry_low = reinterpret_cast<uint8_t*>(exif->data)[15]; + } else { + return ERROR_JPEGR_METADATA_ERROR; + } + num_entry = (num_entry_high << 8) | num_entry_low; + num_entry += 1; + num_entry_low = num_entry & 0xff; + num_entry_high = (num_entry >> 8) & 0xff; + + int pos = 0; + Write(dest, (uint8_t*)exif->data, 14, pos); + + if (use_big_endian) { + Write(dest, &num_entry_high, 1, pos); + Write(dest, &num_entry_low, 1, pos); + uint8_t data[EXIF_J_R_ENTRY_LENGTH] = { + 0x4A, 0x52, + 0x00, 0x07, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00}; + Write(dest, data, EXIF_J_R_ENTRY_LENGTH, pos); + } else { + Write(dest, &num_entry_low, 1, pos); + Write(dest, &num_entry_high, 1, pos); + uint8_t data[EXIF_J_R_ENTRY_LENGTH] = { + 0x4A, 0x52, + 0x07, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + Write(dest, data, EXIF_J_R_ENTRY_LENGTH, pos); + } + + Write(dest, (uint8_t*)exif->data + 16, exif->length - 16, pos); + + updateExifOffsets(dest, + 28, // start from the second tag, skip the "JR" tag + num_entry - 1, + use_big_endian); + + return NO_ERROR; +} + +/* + * Helper function + * Modify offsets in EXIF in place. + */ +void updateExifOffsets(jr_exif_ptr exif, int pos, bool use_big_endian) { + int num_entry = readValue(reinterpret_cast<uint8_t*>(exif->data), pos, 2, use_big_endian); + updateExifOffsets(exif, pos + 2, num_entry, use_big_endian); +} + +void updateExifOffsets(jr_exif_ptr exif, int pos, int num_entry, bool use_big_endian) { + for (int i = 0; i < num_entry; pos += EXIF_J_R_ENTRY_LENGTH, i++) { + int tag = readValue(reinterpret_cast<uint8_t*>(exif->data), pos, 2, use_big_endian); + bool need_to_update_offset = false; + if (tag == 0x8769) { + need_to_update_offset = true; + int sub_ifd_offset = + readValue(reinterpret_cast<uint8_t*>(exif->data), pos + 8, 4, use_big_endian) + + 6 // "Exif\0\0"; + + EXIF_J_R_ENTRY_LENGTH; + updateExifOffsets(exif, sub_ifd_offset, use_big_endian); + } else { + int data_format = + readValue(reinterpret_cast<uint8_t*>(exif->data), pos + 2, 2, use_big_endian); + int num_of_components = + readValue(reinterpret_cast<uint8_t*>(exif->data), pos + 4, 4, use_big_endian); + int data_length = findFormatLengthInBytes(data_format) * num_of_components; + if (data_length > 4) { + need_to_update_offset = true; + } + } + + if (!need_to_update_offset) { + continue; + } + + int offset = readValue(reinterpret_cast<uint8_t*>(exif->data), pos + 8, 4, use_big_endian); + + offset += EXIF_J_R_ENTRY_LENGTH; + + if (use_big_endian) { + reinterpret_cast<uint8_t*>(exif->data)[pos + 11] = offset & 0xff; + reinterpret_cast<uint8_t*>(exif->data)[pos + 10] = (offset >> 8) & 0xff; + reinterpret_cast<uint8_t*>(exif->data)[pos + 9] = (offset >> 16) & 0xff; + reinterpret_cast<uint8_t*>(exif->data)[pos + 8] = (offset >> 24) & 0xff; + } else { + reinterpret_cast<uint8_t*>(exif->data)[pos + 8] = offset & 0xff; + reinterpret_cast<uint8_t*>(exif->data)[pos + 9] = (offset >> 8) & 0xff; + reinterpret_cast<uint8_t*>(exif->data)[pos + 10] = (offset >> 16) & 0xff; + reinterpret_cast<uint8_t*>(exif->data)[pos + 11] = (offset >> 24) & 0xff; + } + } +} + +/* + * Read data from the target position and target length in bytes; + */ +int readValue(uint8_t* data, int pos, int length, bool use_big_endian) { + if (length == 2) { + if (use_big_endian) { + return (data[pos] << 8) | data[pos + 1]; + } else { + return (data[pos + 1] << 8) | data[pos]; + } + } else if (length == 4) { + if (use_big_endian) { + return (data[pos] << 24) | (data[pos + 1] << 16) | (data[pos + 2] << 8) | data[pos + 3]; + } else { + return (data[pos + 3] << 24) | (data[pos + 2] << 16) | (data[pos + 1] << 8) | data[pos]; + } + } else { + // Not support for now. + ALOGE("Error in readValue(): pos=%d, length=%d", pos, length); + return -1; + } +} + +/* + * Helper function + * Returns the length of data format in bytes + */ +int findFormatLengthInBytes(int data_format) { + switch (data_format) { + case 1: // unsigned byte + case 2: // ascii strings + case 6: // signed byte + case 7: // undefined + return 1; + + case 3: // unsigned short + case 8: // signed short + return 2; + + case 4: // unsigned long + case 9: // signed long + case 11: // single float + return 4; + + case 5: // unsigned rational + case 10: // signed rational + case 12: // double float + return 8; + + default: + // should not hit here + ALOGE("Error in findFormatLengthInBytes(): data_format=%d", data_format); + return -1; + } +} + +} // namespace android::recoverymap
\ No newline at end of file diff --git a/services/inputflinger/reader/InputDevice.cpp b/services/inputflinger/reader/InputDevice.cpp index 6ac6b5bdb3..9bd50f7754 100644 --- a/services/inputflinger/reader/InputDevice.cpp +++ b/services/inputflinger/reader/InputDevice.cpp @@ -209,15 +209,9 @@ void InputDevice::addEventHubDevice(int32_t eventHubId, bool populateMappers) { // Touchscreens and touchpad devices. static const bool ENABLE_TOUCHPAD_GESTURES_LIBRARY = - sysprop::InputProperties::enable_touchpad_gestures_library().value_or(true); - // TODO(b/246587538): Fix the new touchpad stack for Sony DualShock 4 (5c4, 9cc) and DualSense - // (ce6) touchpads, or at least load this setting from the IDC file. - const InputDeviceIdentifier& identifier = getDeviceInfo().getIdentifier(); - const bool isSonyGamepadTouchpad = identifier.vendor == 0x054c && - (identifier.product == 0x05c4 || identifier.product == 0x09cc || - identifier.product == 0x0ce6); + sysprop::InputProperties::enable_touchpad_gestures_library().value_or(false); if (ENABLE_TOUCHPAD_GESTURES_LIBRARY && classes.test(InputDeviceClass::TOUCHPAD) && - classes.test(InputDeviceClass::TOUCH_MT) && !isSonyGamepadTouchpad) { + classes.test(InputDeviceClass::TOUCH_MT)) { mappers.push_back(std::make_unique<TouchpadInputMapper>(*contextPtr)); } else if (classes.test(InputDeviceClass::TOUCH_MT)) { mappers.push_back(std::make_unique<MultiTouchInputMapper>(*contextPtr)); diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 0179d62f08..b519bd2ad1 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -2662,18 +2662,18 @@ void Layer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult) { void Layer::onSurfaceFrameCreated( const std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame) { - if (!hasBufferOrSidebandStreamInDrawing()) { - return; - } - while (mPendingJankClassifications.size() >= kPendingClassificationMaxSurfaceFrames) { // Too many SurfaceFrames pending classification. The front of the deque is probably not // tracked by FrameTimeline and will never be presented. This will only result in a memory // leak. - ALOGW("Removing the front of pending jank deque from layer - %s to prevent memory leak", - mName.c_str()); - std::string miniDump = mPendingJankClassifications.front()->miniDump(); - ALOGD("Head SurfaceFrame mini dump\n%s", miniDump.c_str()); + if (hasBufferOrSidebandStreamInDrawing()) { + // Only log for layers with a buffer, since we expect the jank data to be drained for + // these, while there may be no jank listeners for bufferless layers. + ALOGW("Removing the front of pending jank deque from layer - %s to prevent memory leak", + mName.c_str()); + std::string miniDump = mPendingJankClassifications.front()->miniDump(); + ALOGD("Head SurfaceFrame mini dump\n%s", miniDump.c_str()); + } mPendingJankClassifications.pop_front(); } mPendingJankClassifications.emplace_back(surfaceFrame); |