From 44c06a211adbbe1c3c7d7098f855a45e065a35b6 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 7 Mar 2023 15:46:15 -0700 Subject: [PATCH 01/87] Add notify-send to docs --- web/src/documentation/02_oxide-utils.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/src/documentation/02_oxide-utils.rst b/web/src/documentation/02_oxide-utils.rst index aecea5a97..844d37432 100644 --- a/web/src/documentation/02_oxide-utils.rst +++ b/web/src/documentation/02_oxide-utils.rst @@ -3,7 +3,8 @@ Oxide-Utils =========== As of version 2.6, Oxide ships with several new command line utilities meant to mimic common -existing linux command line tools meant for dealing with desktop environments. +existing linux command line tools meant for dealing with desktop environments. ``notify-send`` +was added in version 2.5. desktop-file-validate ===================== @@ -39,3 +40,8 @@ gio === https://man.archlinux.org/man/gio.1 + +notify-send +=========== + +https://man.archlinux.org/man/notify-send.1.en From ee7cb117129cc520cfd79912e17bc32888a288bf Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 7 Mar 2023 16:03:25 -0700 Subject: [PATCH 02/87] Documentation updates --- web/src/documentation/01_usage.rst | 16 ++++++++++++++++ web/src/documentation/api/00_overview.rst | 13 +++++++------ web/src/documentation/api/01_general.rst | 4 ++-- .../api/{02_system.rst => 05_system.rst} | 0 .../api/{02_wifi.rst => 06_wifi.rst} | 0 5 files changed, 25 insertions(+), 8 deletions(-) rename web/src/documentation/api/{02_system.rst => 05_system.rst} (100%) rename web/src/documentation/api/{02_wifi.rst => 06_wifi.rst} (100%) diff --git a/web/src/documentation/01_usage.rst b/web/src/documentation/01_usage.rst index 40b4df13f..83726a938 100644 --- a/web/src/documentation/01_usage.rst +++ b/web/src/documentation/01_usage.rst @@ -7,11 +7,15 @@ Usage gestures
+.. _decay: + Lockscreen (decay) ================== If xochitl has a pin set, you will be prompted to import it. If you don't have a pin set, or decide not to import one from xochtil, you will be prompted to create a pin. You may choose to use the device with no pin. +.. _oxide: + Launcher (oxide) ================ @@ -25,6 +29,8 @@ The options dialog will allow you to configure various settings in the applicati Press on an application to launch, or return to an application. Long press on it to see more information about the application. If the application is running you will also be presented with a button to kill the application. There will be a button to toggle if this application should be launched on startup. This will automatically disable launch on startup from another application. +.. _corrupt: + Application Switcher (corrupt) ============================== @@ -36,6 +42,8 @@ Application Switcher (corrupt) * You can swipe from the left edge of the screen, or long press the left button to return to the currently running application. * You can select the left or right arrow if they are enabled to scroll through running applications. +.. _tarnish: + Background Service (tarnish) ============================ @@ -45,6 +53,8 @@ Background Service (tarnish) * Press and hold the right button, or swipe from the right edge of the screen to take a screenshot. * Swipe from the top of the screen to enable/disable swipe gestures. +.. _erode: + Process Manager (erode) ======================= @@ -54,11 +64,15 @@ Process Manager (erode) * You can exit the application by pressing the left arrow on the top left of the toolbar. * If the process list is long enough, you can scroll it by swiping up or down on the list. After you have swiped the list will scroll. +.. _fret: + Screenshot Tool (fret) ====================== The screenshot tool will automatically start up and wait for right button long presses, at which time it will request a screenshot be taken and stored to ``/home/root/screenshots``. It will then execute ``/tmp/.screenshot`` if it exists. Due to how the reMarkable preserves colour information in the framebuffer used to generate the screenshot, there may be colour in the screenshots that are not visible on the reMarkable itself. +.. _anxiety: + Screenshot Viewer (anxiety) =========================== @@ -69,6 +83,8 @@ Screenshot Viewer (anxiety) * When a screenshot is open, the arrow on the top left of the screen will return to the screenshots list. * When a screenshot is open, the delete button on the top right of the screen will delete the screenshot, and return to the screenshots list. +.. _rot: + CLI Tool (rot) ============== diff --git a/web/src/documentation/api/00_overview.rst b/web/src/documentation/api/00_overview.rst index a96bd194a..8381d1575 100644 --- a/web/src/documentation/api/00_overview.rst +++ b/web/src/documentation/api/00_overview.rst @@ -8,9 +8,9 @@ While this was the initial specification that was used for development, the actual implementation may not have been completely faithful to it due to technical issues that had to be resolved. You can find the technical DBus specification -`https://github.com/Eeems/oxide/tree/master/interfaces `__, and +`here `_, and examples of it's consumption in some of the embedded applications (e.g. -`fret `__) +`fret `_) Further reading: @@ -23,12 +23,13 @@ Options for interacting with the API There are a number of options for interacting with the API. - 1. Using the `rot` command line tool. - 2. Generating classes using the automatic interface xml files. - 3. Making calls using dbus-send. + 1. Using the `rot` command line tool and :doc:`../02_oxide-utils`. + 2. Making calls using `dbus-send `_. + 3. Generating classes using the + `automatic interface xml files `_. 4. Making D-Bus calls manually in your language of choice. -For the purposes of this documentation we will document using ``rot`` as +For the purposes of this documentation we will document using :ref:`rot` as well as using Qt generated classes. Liboxide Shared Library diff --git a/web/src/documentation/api/01_general.rst b/web/src/documentation/api/01_general.rst index 4a17ef417..b4e7f3774 100644 --- a/web/src/documentation/api/01_general.rst +++ b/web/src/documentation/api/01_general.rst @@ -3,8 +3,8 @@ General API =========== The general API is the main entrypoint into the rest of the API. It is -unavailable for scripting through ``rot``, as ``rot`` abstracts all -usage of the API away. +unavailable for scripting through :ref:`rot`, as :ref:`rot` abstracts +all usage of the API away. +----------------+-------------------------+-------------------------+ | Name | Specification | Description | diff --git a/web/src/documentation/api/02_system.rst b/web/src/documentation/api/05_system.rst similarity index 100% rename from web/src/documentation/api/02_system.rst rename to web/src/documentation/api/05_system.rst diff --git a/web/src/documentation/api/02_wifi.rst b/web/src/documentation/api/06_wifi.rst similarity index 100% rename from web/src/documentation/api/02_wifi.rst rename to web/src/documentation/api/06_wifi.rst From ab0477645f1e8a42e3b4e4f9fe24a6ba1fba0e21 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 7 Mar 2023 16:41:16 -0700 Subject: [PATCH 03/87] Add some more documentation changes --- shared/liboxide/Makefile | 2 +- shared/liboxide/dbus.h | 2 ++ shared/liboxide/debug.h | 4 ++-- shared/liboxide/settingsfile.h | 11 +++++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/shared/liboxide/Makefile b/shared/liboxide/Makefile index bf31f67ee..8530835d3 100644 --- a/shared/liboxide/Makefile +++ b/shared/liboxide/Makefile @@ -1,6 +1,6 @@ DIST=../../web/dist/liboxide -all: dist +all: prod html: doxygen Doxyfile diff --git a/shared/liboxide/dbus.h b/shared/liboxide/dbus.h index 4a504b2e6..59e3dcfbb 100644 --- a/shared/liboxide/dbus.h +++ b/shared/liboxide/dbus.h @@ -1,6 +1,8 @@ /*! * \addtogroup DBus * \brief The DBus module + * + * Contains classes [automatically generated DBus interface classes](https://github.com/Eeems-Org/oxide/tree/master/interfaces) * @{ * \file */ diff --git a/shared/liboxide/debug.h b/shared/liboxide/debug.h index a99080145..84644e83c 100644 --- a/shared/liboxide/debug.h +++ b/shared/liboxide/debug.h @@ -11,7 +11,7 @@ /*! * \def O_DEBUG(msg) * \brief Log a debug message if compiled with DEBUG mode, and debugging is enabled - * \param Debug message to log + * \param msg Debug message to log */ #ifdef DEBUG #define O_DEBUG(msg) if(Oxide::debugEnabled()){ qDebug() << msg; } @@ -21,7 +21,7 @@ /*! * \def O_WARNING(msg) * \brief Log a warning message if debugging is enabled - * \param Warning message to log + * \param msg Warning message to log */ #define O_WARNING(msg) if(Oxide::debugEnabled()){ qWarning() << msg; } diff --git a/shared/liboxide/settingsfile.h b/shared/liboxide/settingsfile.h index 530e05699..c32c94d69 100644 --- a/shared/liboxide/settingsfile.h +++ b/shared/liboxide/settingsfile.h @@ -94,12 +94,21 @@ /*! * \def O_SETTINGS_PROPERTY * \brief Add a property to a SettingsFile derived class + * \param _type Type of property + * \param group Group name for property. This usually should be ``General`` + * \param member Property name + * \param _default Optional default value * \sa O_SETTINGS, O_SETTINGS_PROPERTY_BODY, Oxide::SettingsFile */ #define O_SETTINGS_PROPERTY(...) O_SETTINGS_PROPERTY_X(__VA_ARGS__)(__VA_ARGS__) /*! * \def O_SETTINGS_PROPERTY_BODY * \brief Add the body for a property on a SettingsFile derived class + * \param _class Class name + * \param _type Type of property + * \param group Group name for property. This usually should be ``General`` + * \param member Property name + * \param _default Optional default value * \sa O_SETTINGS, O_SETTINGS_PROPERTY, Oxide::SettingsFile */ #define O_SETTINGS_PROPERTY_BODY(...) O_SETTINGS_PROPERTY_BODY_X(__VA_ARGS__)(__VA_ARGS__) @@ -107,6 +116,8 @@ /*! * \def O_SETTINGS * \brief Define the instance() and constructor methods for a SettingsFile derived class + * \param _type Class name + * \param path Path to file on disk that stores the settings * \sa O_SETTINGS_PROPERTY, O_SETTINGS_PROPERTY_BODY, Oxide::SettingsFile */ #define O_SETTINGS(_type, path) \ From ecfe338b2511f13f50f57387be874f5401d680ff Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 7 Mar 2023 17:00:10 -0700 Subject: [PATCH 04/87] Clean up documentation warnings --- shared/liboxide/applications.h | 71 +++++++++++++++---------------- shared/liboxide/json.h | 12 +++--- shared/liboxide/liboxide.h | 16 +++---- shared/liboxide/oxide_sentry.h | 76 +++++++++++++++++----------------- shared/liboxide/slothandler.h | 24 +++++------ shared/liboxide/sysobject.h | 10 ++--- 6 files changed, 105 insertions(+), 104 deletions(-) diff --git a/shared/liboxide/applications.h b/shared/liboxide/applications.h index 007b81a9d..34bfc7c9c 100644 --- a/shared/liboxide/applications.h +++ b/shared/liboxide/applications.h @@ -55,156 +55,157 @@ namespace Oxide::Applications{ } ValidationError; /*! * \brief Convert an application registration to a QVariantMap - * \param Application registration to convert - * \param Name of the application + * \param app Application registration to convert + * \param name Name of the application * \return QVariantMap of the cached application */ LIBOXIDE_EXPORT QVariantMap registrationToMap(const QJsonObject& app, const QString& name = ""); /*! * \brief Convert an ErrorLevel to a human readable string when piping to a text stream - * \param Text stream to write to - * \param Error level + * \param s Text stream to write to + * \param l Error level * \return Resulting text stream * \sa ErrorLevel */ LIBOXIDE_EXPORT QTextStream& operator<<(QTextStream& s, const ErrorLevel& l); /*! * \brief Convert an ValidationError to a human readable string when piping to a text stream - * \param Text stream to write to - * \param Validation error to convert + * \param s Text stream to write to + * \param t Validation error to convert * \return Resulting text stream * \sa ValidationError */ LIBOXIDE_EXPORT QTextStream& operator<<(QTextStream& s, const ValidationError& t); /*! * \brief Convert an ErrorLevel to a human readable string when piping to a text stream - * \param Text stream to write to - * \param Error level + * \param s Text stream to write to + * \param l Error level * \return Resulting text stream * \sa ErrorLevel */ LIBOXIDE_EXPORT QDebug& operator<<(QDebug& s, const ErrorLevel& l); /*! * \brief Convert an ValidationError to a human readable string when piping to a text stream - * \param Text stream to write to - * \param Validation error to convert + * \param s Text stream to write to + * \param t Validation error to convert * \return Resulting text stream * \sa ValidationError */ LIBOXIDE_EXPORT QDebug& operator<<(QDebug& s, const ValidationError& t); /*! * \brief Compare two ValidationError instances - * \param First instance to comprae - * \param Second instance to compare + * \param v1 First instance to comprae + * \param v2 Second instance to compare * \return If they are the same * \sa ValidationError */ LIBOXIDE_EXPORT bool operator==(const ValidationError& v1, const ValidationError& v2); /*! * \brief Get an application registration. - * \param Path to application registration + * \param path Path to application registration * \return Application registration */ LIBOXIDE_EXPORT QJsonObject getRegistration(const char* path); /*! * \brief Get an application registration. - * \param Path to application registration + * \param path Path to application registration * \return Application registration */ LIBOXIDE_EXPORT QJsonObject getRegistration(const std::string& path); /*! * \brief Get an application registration. - * \param Path to application registration + * \param path Path to application registration * \return Application registration */ LIBOXIDE_EXPORT QJsonObject getRegistration(const QString& path); /*! * \brief Get an application registration. - * \param Application registration file + * \param file Application registration file * \return Application registration */ LIBOXIDE_EXPORT QJsonObject getRegistration(QFile* file); /*! * \brief Validate a application registration file and return any errors found - * \param Path to the file to validate + * \param path Path to the file to validate * \return List of validation errors */ LIBOXIDE_EXPORT QList validateRegistration(const char* path); /*! * \brief Validate a application registration file and return any errors found - * \param Path to the file to validate + * \param path Path to the file to validate * \return List of validation errors */ LIBOXIDE_EXPORT QList validateRegistration(const std::string& path); /*! * \brief Validate a application registration file and return any errors found - * \param Path to the file to validate + * \param path Path to the file to validate * \return List of validation errors */ LIBOXIDE_EXPORT QList validateRegistration(const QString& path); /*! * \brief Validate a application registration file and return any errors found - * \param The file to validate + * \param file The file to validate * \return List of validation errors */ LIBOXIDE_EXPORT QList validateRegistration(QFile* file); /*! * \brief Validate a application registration file and return any errors found - * \param The file to validate + * \param name Name of the application + * \param app Application registration file * \return List of validation errors */ LIBOXIDE_EXPORT QList validateRegistration(const QString& name, const QJsonObject& app); /*! * \brief Add an application to the tarnish application cache - * \param Path to the application registration file + * \param path Path to the application registration file * \return If the application was successfully added */ LIBOXIDE_EXPORT bool addToTarnishCache(const char* path); /*! * \brief Add an application to the tarnish application cache - * \param Path to the application registration file + * \param path Path to the application registration file * \return If the application was successfully added */ LIBOXIDE_EXPORT bool addToTarnishCache(const std::string& path); /*! * \brief Add an application to the tarnish application cache - * \param Path to the application registration file + * \param path Path to the application registration file * \return If the application was successfully added */ LIBOXIDE_EXPORT bool addToTarnishCache(const QString& path); /*! * \brief Add an application to the tarnish application cache - * \param The application registration file + * \param file The application registration file * \return If the application was successfully added */ LIBOXIDE_EXPORT bool addToTarnishCache(QFile* file); /*! * \brief Add an application to the tarnish application cache - * \param The name of the application - * \param The application registration file + * \param name The name of the application + * \param app The application registration file * \return If the application was successfully added */ LIBOXIDE_EXPORT bool addToTarnishCache(const QString& name, const QJsonObject& app); /*! * \brief Get the path to the directory that an icon would be stored in. - * \param Size of the icon. - * \param Icon theme. Default is hicolor. - * \param Icon context. Default is apps. + * \param size Size of the icon. + * \param theme Icon theme. Default is hicolor. + * \param context Icon context. Default is apps. * \return Path to the directory that would contain the icon. */ LIBOXIDE_EXPORT QString iconDirPath(int size, const QString& theme = "hicolor", const QString& context = "apps"); /*! * \brief Get the path to an icon. - * \param Name of the icon. - * \param Size of the icon. - * \param Icon theme. Default is hicolor. - * \param Icon context. Default is apps. + * \param name Name of the icon. + * \param size Size of the icon. + * \param theme Icon theme. Default is hicolor. + * \param context Icon context. Default is apps. * \return Path to the icon. */ LIBOXIDE_EXPORT QString iconPath(const QString& name, int size, const QString& theme = "hicolor", const QString& context = "apps"); /*! * \brief Get the path to an icon from an icon name spec. - * \param Icon name spec using the following format: [theme:][context:]{name}-{size}. e.g. oxide:splash:xochitl-702 + * \param spec Icon name spec using the following format: [theme:][context:]{name}-{size}. e.g. oxide:splash:xochitl-702 * \return Path to the icon. An empty string if it failed to parse the spec. */ LIBOXIDE_EXPORT QString iconPath(const QString& spec); diff --git a/shared/liboxide/json.h b/shared/liboxide/json.h index da9ecf8cd..d4759c6f0 100644 --- a/shared/liboxide/json.h +++ b/shared/liboxide/json.h @@ -17,32 +17,32 @@ namespace Oxide::JSON { /*! * \brief Decode a DBus Argument into a QVariant - * \param DBus Argument to decode + * \param arg DBus Argument to decode * \return QVariant */ LIBOXIDE_EXPORT QVariant decodeDBusArgument(const QDBusArgument& arg); /*! * \brief Sanitize a QVariant into a value that can be converted to JSON - * \param QVariant to sanitize + * \param value QVariant to sanitize * \return Sanitized value */ LIBOXIDE_EXPORT QVariant sanitizeForJson(QVariant value); /*! * \brief Convert a QVariant to a JSON string - * \param QVariant to convert - * \param Format to use + * \param value QVariant to convert + * \param format Format to use * \return JSON string */ LIBOXIDE_EXPORT QString toJson(QVariant value, QJsonDocument::JsonFormat format = QJsonDocument::Compact); /*! * \brief Convert a JSON string into a QVariant - * \param JSON string to convert + * \param json JSON string to convert * \return The converted QVaraint */ LIBOXIDE_EXPORT QVariant fromJson(QByteArray json); /*! * \brief Convert a JSON file into a QVariant - * \param JSON fle to convert + * \param file JSON fle to convert * \return The converted QVaraint */ LIBOXIDE_EXPORT QVariant fromJson(QFile* file); diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index a29823742..7cc46a3be 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -55,21 +55,21 @@ Q_DECLARE_METATYPE(WifiNetworks); namespace Oxide { /*! * \brief Execute a program and return it's output - * \param Program to run - * \param Arguments to pass to the program + * \param program Program to run + * \param args Arguments to pass to the program * \return Output if it ran. Otherwise NULL. */ LIBOXIDE_EXPORT QString execute(const QString& program, const QStringList& args); /*! * \brief Try to get a lock - * \param Path to the lock file + * \param lockName Path to the lock file * \return File descriptor of the lock file if a positive number or -1 if it errored */ LIBOXIDE_EXPORT int tryGetLock(char const *lockName); /*! * \brief Release a lock file - * \param File descriptor of the lock file - * \param Path to the lock file + * \param fd File descriptor of the lock file + * \param lockName Path to the lock file */ LIBOXIDE_EXPORT void releaseLock(int fd, char const* lockName); /*! @@ -79,7 +79,7 @@ namespace Oxide { LIBOXIDE_EXPORT bool processExists(pid_t pid); /*! * \brief Get list of pids that have a file open - * \param File to check + * \param path File to check * \return list of pids that have the file open */ LIBOXIDE_EXPORT QList lsof(const QString& path); @@ -92,7 +92,7 @@ namespace Oxide { LIBOXIDE_EXPORT void dispatchToMainThread(std::function callback); /*! * \brief Get the UID for a username - * \param Username to search for + * \param name Username to search for * \throws std::runtime_error Failed to get the UID for the username * \return The UID for the username * \snippet examples/oxide.cpp getUID @@ -100,7 +100,7 @@ namespace Oxide { LIBOXIDE_EXPORT uid_t getUID(const QString& name); /*! * \brief Get the GID for a groupname - * \param Groupname to search for + * \param name Groupname to search for * \throws std::runtime_error Failed to get the GID for the groupname * \return The GID for the groupname * \snippet examples/oxide.cpp getGID diff --git a/shared/liboxide/oxide_sentry.h b/shared/liboxide/oxide_sentry.h index cd30a415d..3da0af262 100644 --- a/shared/liboxide/oxide_sentry.h +++ b/shared/liboxide/oxide_sentry.h @@ -31,7 +31,7 @@ namespace Oxide::Sentry{ sentry_transaction_t* inner; /*! * \brief Create a sentry_transaction_t wrapper - * \param sentry_transaction_t instance to wrap + * \param t sentry_transaction_t instance to wrap */ explicit Transaction(sentry_transaction_t* t); #else @@ -50,7 +50,7 @@ namespace Oxide::Sentry{ sentry_span_t* inner; /*! * \brief Create a sentry_span_t wrapper - * \param The sentry_span_t instance to wrap + * \param s The sentry_span_t instance to wrap */ explicit Span(sentry_span_t* s); #else @@ -70,89 +70,89 @@ namespace Oxide::Sentry{ LIBOXIDE_EXPORT const char* machineId(); /*! * \brief Initialize sentry tracking - * \param Name of the application - * \param Arguments passed to the application - * \param If automatic session tracking should be enabled + * \param name Name of the application + * \param argv Arguments passed to the application + * \param autoSessionTracking If automatic session tracking should be enabled */ LIBOXIDE_EXPORT void sentry_init(const char* name, char* argv[], bool autoSessionTracking = true); /*! * \brief Create a breadcrumb in the current sentry transaction - * \param Category of the breadcrumb - * \param Message of the breadcrumb - * \param Type of breadcrumb - * \param Logging level of the breadcrumb + * \param category Category of the breadcrumb + * \param message Message of the breadcrumb + * \param type Type of breadcrumb + * \param level Logging level of the breadcrumb */ LIBOXIDE_EXPORT void sentry_breadcrumb(const char* category, const char* message, const char* type = "default", const char* level = "info"); /*! * \brief Start a transaction - * \param Name of the transaction - * \param Action being performed + * \param name Name of the transaction + * \param action Action being performed * \return The transaction wrapper */ LIBOXIDE_EXPORT Transaction* start_transaction(const std::string& name, const std::string& action); /*! * \brief Stop a sentry transaction - * \param The transaction wrapper to stop + * \param transaction The transaction wrapper to stop */ LIBOXIDE_EXPORT void stop_transaction(Transaction* transaction); /*! * \brief Record a sentry trancation - * \param Name of the transaction - * \param Action being performed - * \param Code to run inside the transaction + * \param name Name of the transaction + * \param action Action being performed + * \param callback Code to run inside the transaction */ LIBOXIDE_EXPORT void sentry_transaction(const std::string& name, const std::string& action, std::function callback); /*! * \brief Start a span inside a sentry transaction - * \param Transaction wrapper to attach the span to - * \param Operation being performed - * \param Description of the span + * \param transaction Transaction wrapper to attach the span to + * \param operation Operation being performed + * \param description Description of the span * \return The span wrapper */ LIBOXIDE_EXPORT Span* start_span(Transaction* transaction, const std::string& operation, const std::string& description); /*! * \brief Start a span inside another sentry span - * \param The parent sentry span wrapper - * \param Operation being performed - * \param Description of the span + * \param parent The parent sentry span wrapper + * \param operation Operation being performed + * \param description Description of the span * \return The span wrapper */ LIBOXIDE_EXPORT Span* start_span(Span* parent, const std::string& operation, const std::string& description); /*! * \brief Stop a sentry span - * \param The span wrapper to stop + * \param span The span wrapper to stop */ LIBOXIDE_EXPORT void stop_span(Span* span); /*! * \brief Record a sentry span - * \param The transaction wrapper to attach this span to - * \param Operation being performed - * \param Description of the span - * \param Code to run inside the transaction + * \param transaction The transaction wrapper to attach this span to + * \param operation Operation being performed + * \param description Description of the span + * \param callback Code to run inside the transaction */ LIBOXIDE_EXPORT void sentry_span(Transaction* transaction, const std::string& operation, const std::string& description, std::function callback); /*! * \brief Record a sentry span - * \param The transaction wrapper to attach this span to - * \param Operation being performed - * \param Description of the span - * \param Code to run inside the transaction + * \param transaction The transaction wrapper to attach this span to + * \param operation Operation being performed + * \param description Description of the span + * \param callback Code to run inside the transaction */ LIBOXIDE_EXPORT void sentry_span(Transaction* transaction, const std::string& operation, const std::string& description, std::function callback); /*! * \brief Record a sentry span - * \param The span wrapper to attach this span to - * \param Operation being performed - * \param Description of the span - * \param Code to run inside the transaction + * \param parent The span wrapper to attach this span to + * \param operation Operation being performed + * \param description Description of the span + * \param callback Code to run inside the transaction */ LIBOXIDE_EXPORT void sentry_span(Span* parent, const std::string& operation, const std::string& description, std::function callback); /*! * \brief Record a sentry span - * \param The span wrapper to attach this span to - * \param Operation being performed - * \param Description of the span - * \param Code to run inside the transaction + * \param parent The span wrapper to attach this span to + * \param operation Operation being performed + * \param description Description of the span + * \param callback Code to run inside the transaction */ LIBOXIDE_EXPORT void sentry_span(Span* parent, const std::string& operation, const std::string& description, std::function callback); /*! diff --git a/shared/liboxide/slothandler.h b/shared/liboxide/slothandler.h index a42e06557..02c83db5f 100644 --- a/shared/liboxide/slothandler.h +++ b/shared/liboxide/slothandler.h @@ -14,28 +14,28 @@ namespace Oxide{ /*! * \brief Connect to a slot on a DBus interface - * \param Interface to connect to - * \param Slot to connect to - * \param Method to run when an event is recieved on the slot + * \param interface Interface to connect to + * \param slotName Slot to connect to + * \param onMessage Method to run when an event is recieved on the slot * \return If the connect succeeded */ LIBOXIDE_EXPORT bool DBusConnect(QDBusAbstractInterface* interface, const QString& slotName, std::function onMessage); /*! * \brief Connect to a slot on a DBus interface - * \param Interface to connect to - * \param Slot to connect to - * \param Method to run when an event is recieved on the slot - * \param If this should disconnect after the first event + * \param interface Interface to connect to + * \param slotName Slot to connect to + * \param onMessage Method to run when an event is recieved on the slot + * \param once If this should disconnect after the first event * \return If the connect succeeded */ LIBOXIDE_EXPORT bool DBusConnect(QDBusAbstractInterface* interface, const QString& slotName, std::function onMessage, const bool& once); /*! * \brief Connect to a slot on a DBus interface - * \param Interface to connect to - * \param Slot to connect to - * \param Method to run when an event is recieved on the slot - * \param Method to run when disconnecting - * \param If this should disconnect after the first event + * \param interface Interface to connect to + * \param slotName Slot to connect to + * \param onMessage Method to run when an event is recieved on the slot + * \param callback Method to run when disconnecting + * \param once If this should disconnect after the first event * \return If the connect succeeded */ LIBOXIDE_EXPORT bool DBusConnect(QDBusAbstractInterface* interface, const QString& slotName, std::function onMessage, std::function callback, const bool& once=false); diff --git a/shared/liboxide/sysobject.h b/shared/liboxide/sysobject.h index 04efaeecd..2440fda92 100644 --- a/shared/liboxide/sysobject.h +++ b/shared/liboxide/sysobject.h @@ -32,31 +32,31 @@ namespace Oxide { bool exists(); /*! * \brief Does the sysfs interface have a named property - * \param The property name + * \param name The property name * \return If the sysfs interface has a named property */ bool hasProperty(const std::string& name); /*! * \brief Does the sysfs interface have a named directory - * \param The directory name + * \param name The directory name * \return If the sysfs interface has a named directory */ bool hasDirectory(const std::string& name); /*! * \brief Get a named property value as a string - * \param The property name + * \param name The property name * \return The string value of the named property */ std::string strProperty(const std::string& name); /*! * \brief Get a named property value as an int - * \param The property name + * \param name The property name * \return The int value of the named property */ int intProperty(const std::string& name); /*! * \brief Get the path to a named property - * \param The property name + * \param name The property name * \return The path to the named property */ std::string propertyPath(const std::string& name); From 38d9bf76730c902beb4f854d889c15f3c5461020 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 7 Mar 2023 17:17:08 -0700 Subject: [PATCH 05/87] Add extra information about expected retvals --- shared/liboxide/applications.h | 3 ++- shared/liboxide/json.cpp | 2 +- shared/liboxide/json.h | 1 + shared/liboxide/liboxide.h | 6 ++++-- shared/liboxide/sysobject.h | 1 + 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/shared/liboxide/applications.h b/shared/liboxide/applications.h index 34bfc7c9c..33a5aecd9 100644 --- a/shared/liboxide/applications.h +++ b/shared/liboxide/applications.h @@ -206,7 +206,8 @@ namespace Oxide::Applications{ /*! * \brief Get the path to an icon from an icon name spec. * \param spec Icon name spec using the following format: [theme:][context:]{name}-{size}. e.g. oxide:splash:xochitl-702 - * \return Path to the icon. An empty string if it failed to parse the spec. + * \return Path to the icon. + * \retval "" Failed to parse the spec */ LIBOXIDE_EXPORT QString iconPath(const QString& spec); } diff --git a/shared/liboxide/json.cpp b/shared/liboxide/json.cpp index f71340be4..d1cd7d9bd 100644 --- a/shared/liboxide/json.cpp +++ b/shared/liboxide/json.cpp @@ -113,7 +113,7 @@ namespace Oxide::JSON { arg.endMap(); return sanitizeForJson(QVariant::fromValue(map)); } - O_WARNING("Unable to sanitize QDBusArgument as it is an unknown type"); + O_WARNING("Unable to decode QDBusArgument as it is an unknown type"); return QVariant(); } QVariant sanitizeForJson(QVariant value){ diff --git a/shared/liboxide/json.h b/shared/liboxide/json.h index d4759c6f0..ebfa536cf 100644 --- a/shared/liboxide/json.h +++ b/shared/liboxide/json.h @@ -19,6 +19,7 @@ namespace Oxide::JSON { * \brief Decode a DBus Argument into a QVariant * \param arg DBus Argument to decode * \return QVariant + * \retval QVariant() Unable to decode QDBusArgument */ LIBOXIDE_EXPORT QVariant decodeDBusArgument(const QDBusArgument& arg); /*! diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index 7cc46a3be..c78204af3 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -57,13 +57,15 @@ namespace Oxide { * \brief Execute a program and return it's output * \param program Program to run * \param args Arguments to pass to the program - * \return Output if it ran. Otherwise NULL. + * \return Output if it ran. + * \retval NULL Program was not able to execute */ LIBOXIDE_EXPORT QString execute(const QString& program, const QStringList& args); /*! * \brief Try to get a lock * \param lockName Path to the lock file - * \return File descriptor of the lock file if a positive number or -1 if it errored + * \return File descriptor of the lock file + * \retval -1 Unable to get lock */ LIBOXIDE_EXPORT int tryGetLock(char const *lockName); /*! diff --git a/shared/liboxide/sysobject.h b/shared/liboxide/sysobject.h index 2440fda92..fe0a252c2 100644 --- a/shared/liboxide/sysobject.h +++ b/shared/liboxide/sysobject.h @@ -46,6 +46,7 @@ namespace Oxide { * \brief Get a named property value as a string * \param name The property name * \return The string value of the named property + * \retval "0" Unable to open file. This is to ensure that intProperty will not crash */ std::string strProperty(const std::string& name); /*! From c87afd07e0180c4b098344179e06ea28ab6f64c2 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 16 Mar 2023 14:50:44 -0600 Subject: [PATCH 06/87] Update logs FAQ with info about tarnish --- web/src/faq.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/web/src/faq.rst b/web/src/faq.rst index 3241a3055..1cf452e19 100644 --- a/web/src/faq.rst +++ b/web/src/faq.rst @@ -108,6 +108,12 @@ As of Oxide 2.5, you can now get logs for specific applications with the followi journalctl -eat codes.eeems.oxide +To get logs for just the :ref:`tarnish`, you can use the following command: + +.. code:: bash + + journalctl -eat tarnish + Where are the configuration files? ================================== From 80eb5373ba0d21d284315890e8786ea27973948a Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 24 Apr 2023 10:53:54 -0600 Subject: [PATCH 07/87] Fix multitouch handling to fix onscreen keyboard handling (#298) * Fix #296 * Add code to handle skipping SYN_DROPPED events * Fix version reporting to sentry * Handle invalid touch events * Add install-lib methods, don't set existing if invalid touch event --- applications/system-service/buttonhandler.cpp | 3 ++ .../system-service/digitizerhandler.h | 50 ++++++++++++++++--- applications/system-service/event_device.cpp | 6 +++ applications/system-service/event_device.h | 1 + applications/system-service/systemapi.h | 41 ++++++++++----- package | 37 ++++++++++++++ shared/liboxide/liboxide.h | 10 ++++ shared/liboxide/oxide_sentry.cpp | 6 +-- 8 files changed, 133 insertions(+), 21 deletions(-) diff --git a/applications/system-service/buttonhandler.cpp b/applications/system-service/buttonhandler.cpp index da174b856..627a479b1 100644 --- a/applications/system-service/buttonhandler.cpp +++ b/applications/system-service/buttonhandler.cpp @@ -11,12 +11,15 @@ void button_exit_handler(){ } void flush_stream(istream* stream){ + // Skip the next event input_event ie; streamsize sie = static_cast(sizeof(struct input_event)); stream->read((char*)&ie, sie); } void press_button(event_device& evdev, int code, istream* stream){ +#ifdef DEBUG qDebug() << "inject button " << code; +#endif unlock_device(evdev); ev_key(evdev, code, 1); flush_stream(stream); diff --git a/applications/system-service/digitizerhandler.h b/applications/system-service/digitizerhandler.h index be4c93f0e..6a20ed124 100644 --- a/applications/system-service/digitizerhandler.h +++ b/applications/system-service/digitizerhandler.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include "event_device.h" @@ -91,7 +92,9 @@ class DigitizerHandler : public QThread { void write(ushort type, ushort code, int value){ auto event = createEvent(type, code, value); ::write(device.fd, &event, sizeof(input_event)); +#ifdef DEBUG qDebug() << "Emitted event " << event.time.tv_sec << event.time.tv_usec << type << code << value; +#endif } void write(input_event* events, size_t size){ ::write(device.fd, events, size); @@ -125,7 +128,7 @@ class DigitizerHandler : public QThread { input_event* build_flood(){ auto n = 512 * 8; auto num_inst = 4; - input_event* ev = (input_event *)malloc(sizeof(struct input_event) * n * num_inst); + input_event* ev = (input_event*)malloc(sizeof(struct input_event) * n * num_inst); memset(ev, 0, sizeof(input_event) * n * num_inst); auto i = 0; while (i < n) { @@ -147,13 +150,48 @@ class DigitizerHandler : public QThread { } } bool handle_events(){ + vector event_buffer; + bool success = true; + while(true){ + input_event event; + if(!read(&event)){ + success = false; + goto exitLoop; + } + event_buffer.push_back(event); + switch(event.type){ + case EV_SYN: + switch(event.code){ + case SYN_DROPPED: + event_buffer.clear(); + skip_event(); + case SYN_REPORT: + case SYN_MT_REPORT: + goto exitLoop; + break; + } + break; + } + } + exitLoop: + if(event_buffer.size()){ + for(input_event event : event_buffer){ + emit inputEvent(event); + } + emit activity(); + } + return success; + } + void skip_event(){ input_event event; - if(!read(&event)){ - return false; + while(read(&event)){ + if(event.type != EV_SYN){ + continue; + } + if(event.code == SYN_REPORT || event.code == SYN_MT_REPORT){ + break; + } } - emit inputEvent(event); - emit activity(); - return true; } __gnu_cxx::stdio_filebuf filebuf; istream stream; diff --git a/applications/system-service/event_device.cpp b/applications/system-service/event_device.cpp index 32ba45dff..c5c79ea29 100644 --- a/applications/system-service/event_device.cpp +++ b/applications/system-service/event_device.cpp @@ -35,6 +35,12 @@ void ev_syn(event_device& evdev){ key_input_event.code = SYN_REPORT; write_event(evdev, key_input_event); } +void ev_dropped(event_device& evdev){ + struct input_event key_input_event; + key_input_event.type = EV_SYN; + key_input_event.code = SYN_DROPPED; + write_event(evdev, key_input_event); +} void ev_key(event_device& evdev, int code, int value){ struct input_event key_input_event; key_input_event.type = EV_KEY; diff --git a/applications/system-service/event_device.h b/applications/system-service/event_device.h index 7ef4363c5..4f4314ed3 100644 --- a/applications/system-service/event_device.h +++ b/applications/system-service/event_device.h @@ -24,6 +24,7 @@ int lock_device(event_device& evdev); int unlock_device(event_device& evdev); void write_event(event_device& evdev, input_event ie); void ev_syn(event_device& evdev); +void ev_dropped(event_device& evdev); void ev_key(event_device& evdev, int code, int value = 0); #endif // EVENT_DEVICE_H diff --git a/applications/system-service/systemapi.h b/applications/system-service/systemapi.h index ef6f71e6c..238d36f12 100644 --- a/applications/system-service/systemapi.h +++ b/applications/system-service/systemapi.h @@ -40,11 +40,13 @@ struct Inhibitor { bool released() { return fd == -1; } }; +#define NULL_TOUCH_COORD -1 + struct Touch { int slot = 0; int id = -1; - int x = 0; - int y = 0; + int x = NULL_TOUCH_COORD; + int y = NULL_TOUCH_COORD; bool active = false; bool existing = false; bool modified = true; @@ -470,7 +472,7 @@ private slots: // Setup touches for next event set for(auto touch : touches.values()){ touch->modified = false; - touch->existing = true; + touch->existing = touch->existing || (touch->x != NULL_TOUCH_COORD && touch->y != NULL_TOUCH_COORD); } break; } @@ -487,11 +489,8 @@ private slots: }break; case ABS_MT_TRACKING_ID:{ auto touch = getEvent(currentSlot); - if(event.value == -1){ - touch->active = false; - currentSlot = 0; - }else{ - touch->active = true; + touch->active = event.value != -1; + if(touch->active){ touch->id = event.value; } }break; @@ -614,7 +613,7 @@ private slots: return; } auto touch = touches.first(); - if(swipeDirection != None){ + if(swipeDirection != None || touch->x == NULL_TOUCH_COORD || touch->y == NULL_TOUCH_COORD){ return; } int offset = 20; @@ -686,6 +685,13 @@ private slots: return; } auto touch = touches.first(); + if(touch->x == NULL_TOUCH_COORD || touch->y == NULL_TOUCH_COORD){ + if(Oxide::debugEnabled()){ + qDebug() << "Invalid touch event"; + } + swipeDirection = None; + return; + } if(swipeDirection == Up){ if(!swipeStates[Up] || touch->y < location.y() || touch->y - startLocation.y() < swipeLengths[Up]){ // Must end swiping up and having gone far enough @@ -795,11 +801,22 @@ private slots: if(Oxide::debugEnabled()){ qDebug() << "Write touch move" << touch; } - int size = sizeof(input_event) * 8; + int count = 8; + if(touch->x == NULL_TOUCH_COORD){ + count--; + } + if(touch->y == NULL_TOUCH_COORD){ + count--; + } + int size = sizeof(input_event) * count; input_event* events = (input_event*)malloc(size); events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_SLOT, touch->slot); - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_X, touch->x); - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_Y, touch->y); + if(touch->x != NULL_TOUCH_COORD){ + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_X, touch->x); + } + if(touch->y != NULL_TOUCH_COORD){ + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_Y, touch->y); + } events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_PRESSURE, touch->pressure); events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TOUCH_MAJOR, touch->major); events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TOUCH_MINOR, touch->minor); diff --git a/package b/package index d0c23801b..c387ba5c2 100644 --- a/package +++ b/package @@ -12,6 +12,43 @@ source=(oxide.tar.gz) sha256sums=(SKIP) image=qt:latest _sentry=0.5.0 +######################################## +# These functions come from install-lib: +# https://raw.githubusercontent.com/toltec-dev/toltec/master/scripts/install-lib +######################################## +is-active() { + systemctl --quiet is-active "$1" 2> /dev/null +} +is-enabled() { + systemctl --quiet is-enabled "$1" 2> /dev/null +} +get-conflicts() { + # Find enabled units that have a conflicting name + for name in $(systemctl cat "$1" | awk -F'=' '/^Alias=/{print $2}'); do + local realname + if realname="$(basename "$(readlink "/etc/systemd/system/$name")")"; then + echo "$realname" + fi + done + + # Find units that are declared as conflicting + # (systemd automatically adds a conflict with "shutdown.target" to all + # service units see systemd.service(5), section "Automatic Dependencies") + systemctl show "$1" | awk -F'=' '/^Conflicts=/{print $2}' \ + | sed 's|\bshutdown.target\b||' +} +how-to-enable() { + for conflict in $(get-conflicts "$1"); do + if is-enabled "$conflict"; then + echo "$ systemctl disable --now ${conflict/.service/}" + fi + done + + echo "$ systemctl enable --now ${1/.service/}" +} +######################################## +# End of install-lib methods +######################################## build() { find . -name "*.pro" -type f -print0 \ diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index c78204af3..68e663f1b 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -27,6 +27,16 @@ #include #include +#ifndef VERSION +#ifdef APP_VERSION +#define VERSION APP_VERSION +#else +#define VERSION "2.6" +#endif +#endif +#ifndef APP_VERSION +#define APP_VERSION VERSION +#endif /*! * \def deviceSettings() * \brief Get the Oxide::DeviceSettings instance diff --git a/shared/liboxide/oxide_sentry.cpp b/shared/liboxide/oxide_sentry.cpp index 0fd2b4268..8aaaa2abe 100644 --- a/shared/liboxide/oxide_sentry.cpp +++ b/shared/liboxide/oxide_sentry.cpp @@ -158,8 +158,8 @@ namespace Oxide::Sentry{ } sentry_options_set_debug(options, debugEnabled()); sentry_options_set_database_path(options, "/home/root/.cache/Eeems/sentry"); - sentry_options_set_release(options, (std::string(name) + "@2.4").c_str()); - sentry_init(options); + sentry_options_set_release(options, (std::string(name) + "@" + APP_VERSION).c_str()); + ::sentry_init(options); // Setup user sentry_value_t user = sentry_value_new_object(); @@ -171,7 +171,7 @@ namespace Oxide::Sentry{ sentry_set_tag("name", name); sentry_value_t device = sentry_value_new_object(); sentry_value_set_by_key(device, "machine-id", sentry_value_new_string(machineId())); - sentry_value_set_by_key(device, "version", sentry_value_new_string(readFile("/etc/version").c_str())); + sentry_value_set_by_key(device, "version", sentry_value_new_string(version.c_str())); sentry_value_set_by_key(device, "model", sentry_value_new_string(deviceSettings.getDeviceName())); sentry_set_context("device", device); // Setup transaction From 7a834bba9e871300cf1fc77b95af3f0b15534afe Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 27 Apr 2023 09:47:27 -0600 Subject: [PATCH 08/87] Add 2.5 instructions to pin FAQ --- web/src/faq.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/web/src/faq.rst b/web/src/faq.rst index 1cf452e19..45f08d241 100644 --- a/web/src/faq.rst +++ b/web/src/faq.rst @@ -69,12 +69,27 @@ As of 2.6 you can change your pin to any 4 numbers with the following command: xdg-settings set pin +For example: + +.. code:: bash + + xdg-settings set pin '0123' + As of 2.6 you can clear your pin to skip the lock screen with the following command: .. code:: bash xdg-settings set pin '' +On 2.5 or earlier you can use the following commands to manually clear your pin: + +.. code:: bash + + systemctl stop tarnish + rm /home/root/.config/Eeems/decay.conf + systemctl start tarnish + +You will then be prompted to enter a new pin Not all of my applications are listed? ====================================== From b76ddcfc8548f6b2c58c6320112d3f8eb0881881 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 27 Apr 2023 17:09:18 -0600 Subject: [PATCH 09/87] Add inject_evdev application (#299) * Fix cachix install * Add new inject_evdev tool --- .github/workflows/nix.yml | 2 +- applications/applications.pro | 2 + applications/inject_evdev/.gitignore | 73 ++ applications/inject_evdev/inject_evdev.pro | 21 + applications/inject_evdev/main.cpp | 1010 +++++++++++++++++ applications/system-service/buttonhandler.cpp | 22 +- applications/system-service/buttonhandler.h | 4 +- .../system-service/digitizerhandler.h | 8 +- applications/system-service/event_device.cpp | 50 - applications/system-service/event_device.h | 30 - .../system-service/system-service.pro | 2 - package | 12 +- shared/liboxide/applications.cpp | 1 + shared/liboxide/event_device.cpp | 80 ++ shared/liboxide/event_device.h | 91 ++ shared/liboxide/eventfilter.h | 4 +- shared/liboxide/liboxide.pro | 2 + 17 files changed, 1312 insertions(+), 102 deletions(-) create mode 100644 applications/inject_evdev/.gitignore create mode 100644 applications/inject_evdev/inject_evdev.pro create mode 100644 applications/inject_evdev/main.cpp delete mode 100644 applications/system-service/event_device.cpp delete mode 100644 applications/system-service/event_device.h create mode 100644 shared/liboxide/event_device.cpp create mode 100644 shared/liboxide/event_device.h diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 69344f6df..a46e6842f 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v18 + - uses: cachix/install-nix-action@v20 with: nix_path: nixpkgs=channel:nixos-unstable - uses: cachix/cachix-action@v12 diff --git a/applications/applications.pro b/applications/applications.pro index 30aa36b31..b841c24a1 100644 --- a/applications/applications.pro +++ b/applications/applications.pro @@ -5,6 +5,7 @@ SUBDIRS = \ desktop-file-install \ desktop-file-validate \ gio \ + inject_evdev \ launcher \ lockscreen \ notify-send \ @@ -39,5 +40,6 @@ xdg-settings.depends = system-service xdg-icon-resource.depends = system-service desktop-file-edit.depends = desktop-file-edit desktop-file-install.depends = +inject_evdev.depends = INSTALLS += $$SUBDIRS diff --git a/applications/inject_evdev/.gitignore b/applications/inject_evdev/.gitignore new file mode 100644 index 000000000..fab7372d7 --- /dev/null +++ b/applications/inject_evdev/.gitignore @@ -0,0 +1,73 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/applications/inject_evdev/inject_evdev.pro b/applications/inject_evdev/inject_evdev.pro new file mode 100644 index 000000000..e09dd959e --- /dev/null +++ b/applications/inject_evdev/inject_evdev.pro @@ -0,0 +1,21 @@ +QT -= gui +QT += dbus + +CONFIG += c++11 console +CONFIG -= app_bundle + +DEFINES += QT_DEPRECATED_WARNINGS +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp + +HEADERS += + +TARGET = inject_evdev +include(../../qmake/common.pri) +target.path = /opt/bin +INSTALLS += target + +include(../../qmake/liboxide.pri) +include(../../qmake/sentry.pri) diff --git a/applications/inject_evdev/main.cpp b/applications/inject_evdev/main.cpp new file mode 100644 index 000000000..f29b9047f --- /dev/null +++ b/applications/inject_evdev/main.cpp @@ -0,0 +1,1010 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +using namespace Oxide; +using namespace Oxide::Sentry; + +event_device* device = nullptr; + +#define check(eventType, name, eventCode) \ + if(code == name){ \ + device->write(eventType, eventCode, value); \ + return true; \ + } +#define syn(eventCode) check(EV_SYN, #eventCode, eventCode) +#define abs(eventCode) check(EV_ABS, #eventCode, eventCode) +#define rel(eventCode) check(EV_REL, #eventCode, eventCode) +#define key(eventCode) check(EV_KEY, #eventCode, eventCode) +#define msc(eventCode) check(EV_MSC, #eventCode, eventCode) +#define sw(eventCode) check(EV_SW, #eventCode, eventCode) +#define led(eventCode) check(EV_LED, #eventCode, eventCode) +#define snd(eventCode) check(EV_SND, #eventCode, eventCode) +#define rep(eventCode) check(EV_REP, #eventCode, eventCode) + +// I pulled most of the codes from https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h +// I've left EV_FF, EV_PWR, and EV_FF_STATUS out since they don't seem to really apply to the reMarkable + +bool process_EV_SYN(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + syn(SYN_REPORT); + syn(SYN_MT_REPORT); + syn(SYN_DROPPED); + syn(SYN_CONFIG); + qDebug() << "Unknown EV_SYN event code:" << code.c_str(); + return false; +} + +bool process_EV_ABS(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + abs(ABS_X); + abs(ABS_Y); + abs(ABS_Z); + abs(ABS_RX); + abs(ABS_RY); + abs(ABS_RZ); + abs(ABS_THROTTLE); + abs(ABS_RUDDER); + abs(ABS_WHEEL); + abs(ABS_GAS); + abs(ABS_BRAKE); + abs(ABS_HAT0X); + abs(ABS_HAT0Y); + abs(ABS_HAT1X); + abs(ABS_HAT1Y); + abs(ABS_HAT2X); + abs(ABS_HAT2Y); + abs(ABS_HAT3X); + abs(ABS_HAT3Y); + abs(ABS_PRESSURE); + abs(ABS_DISTANCE); + abs(ABS_TILT_X); + abs(ABS_TILT_Y); + abs(ABS_TOOL_WIDTH); + abs(ABS_VOLUME); + //abs(ABS_PROFILE); + abs(ABS_MISC); + //abs(ABS_RESERVED); + abs(ABS_MT_SLOT); + abs(ABS_MT_TOUCH_MAJOR); + abs(ABS_MT_TOUCH_MINOR); + abs(ABS_MT_WIDTH_MAJOR); + abs(ABS_MT_WIDTH_MINOR); + abs(ABS_MT_ORIENTATION); + abs(ABS_MT_POSITION_X); + abs(ABS_MT_POSITION_Y); + abs(ABS_MT_TOOL_TYPE); + abs(ABS_MT_BLOB_ID); + abs(ABS_MT_TRACKING_ID); + abs(ABS_MT_PRESSURE); + abs(ABS_MT_DISTANCE); + abs(ABS_MT_TOOL_X); + abs(ABS_MT_TOOL_Y); + abs(ABS_MAX); + abs(ABS_CNT); + qDebug() << "Unknown EV_ABS event code:" << code.c_str(); + return false; +} + +bool process_EV_REL(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + rel(REL_X); + rel(REL_Y); + rel(REL_Z); + rel(REL_RX); + rel(REL_RY); + rel(REL_RZ); + rel(REL_HWHEEL); + rel(REL_DIAL); + rel(REL_WHEEL); + rel(REL_MISC); + //rel(REL_RESERVED); + //rel(REL_WHEEL_HI_RES); + //rel(REL_HWHEEL_HI_RES); + rel(REL_MAX); + rel(REL_CNT); + qDebug() << "Unknown EV_REL event code:" << code.c_str(); + return false; +} + +bool process_EV_KEY(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + key(KEY_RESERVED); + key(KEY_ESC); + key(KEY_1); + key(KEY_2); + key(KEY_3); + key(KEY_4); + key(KEY_5); + key(KEY_6); + key(KEY_7); + key(KEY_8); + key(KEY_9); + key(KEY_0); + key(KEY_MINUS); + key(KEY_EQUAL); + key(KEY_BACKSPACE); + key(KEY_TAB); + key(KEY_Q); + key(KEY_W); + key(KEY_E); + key(KEY_R); + key(KEY_T); + key(KEY_Y); + key(KEY_U); + key(KEY_I); + key(KEY_O); + key(KEY_P); + key(KEY_LEFTBRACE); + key(KEY_RIGHTBRACE); + key(KEY_ENTER); + key(KEY_LEFTCTRL); + key(KEY_A); + key(KEY_S); + key(KEY_D); + key(KEY_F); + key(KEY_G); + key(KEY_H); + key(KEY_J); + key(KEY_K); + key(KEY_L); + key(KEY_SEMICOLON); + key(KEY_APOSTROPHE); + key(KEY_GRAVE); + key(KEY_LEFTSHIFT); + key(KEY_BACKSLASH); + key(KEY_Z); + key(KEY_X); + key(KEY_C); + key(KEY_V); + key(KEY_B); + key(KEY_N); + key(KEY_M); + key(KEY_COMMA); + key(KEY_DOT); + key(KEY_SLASH); + key(KEY_RIGHTSHIFT); + key(KEY_KPASTERISK); + key(KEY_LEFTALT); + key(KEY_SPACE); + key(KEY_CAPSLOCK); + key(KEY_F1); + key(KEY_F2); + key(KEY_F3); + key(KEY_F4); + key(KEY_F5); + key(KEY_F6); + key(KEY_F7); + key(KEY_F8); + key(KEY_F9); + key(KEY_F10); + key(KEY_NUMLOCK); + key(KEY_SCROLLLOCK); + key(KEY_KP7); + key(KEY_KP8); + key(KEY_KP9); + key(KEY_KPMINUS); + key(KEY_KP4); + key(KEY_KP5); + key(KEY_KP6); + key(KEY_KPPLUS); + key(KEY_KP1); + key(KEY_KP2); + key(KEY_KP3); + key(KEY_KP0); + key(KEY_KPDOT); + key(KEY_ZENKAKUHANKAKU); + key(KEY_102ND); + key(KEY_F11); + key(KEY_F12); + key(KEY_RO); + key(KEY_KATAKANA); + key(KEY_HIRAGANA); + key(KEY_HENKAN); + key(KEY_KATAKANAHIRAGANA); + key(KEY_MUHENKAN); + key(KEY_KPJPCOMMA); + key(KEY_KPENTER); + key(KEY_RIGHTCTRL); + key(KEY_KPSLASH); + key(KEY_SYSRQ); + key(KEY_RIGHTALT); + key(KEY_LINEFEED); + key(KEY_HOME); + key(KEY_UP); + key(KEY_PAGEUP); + key(KEY_LEFT); + key(KEY_RIGHT); + key(KEY_END); + key(KEY_DOWN); + key(KEY_PAGEDOWN); + key(KEY_INSERT); + key(KEY_DELETE); + key(KEY_MACRO); + key(KEY_MUTE); + key(KEY_VOLUMEDOWN); + key(KEY_VOLUMEUP); + key(KEY_POWER); + key(KEY_KPEQUAL); + key(KEY_KPPLUSMINUS); + key(KEY_PAUSE); + key(KEY_SCALE); + key(KEY_KPCOMMA); + key(KEY_HANGEUL); + key(KEY_HANGUEL); + key(KEY_HANJA); + key(KEY_YEN); + key(KEY_LEFTMETA); + key(KEY_RIGHTMETA); + key(KEY_COMPOSE); + key(KEY_STOP); + key(KEY_AGAIN); + key(KEY_PROPS); + key(KEY_UNDO); + key(KEY_FRONT); + key(KEY_COPY); + key(KEY_OPEN); + key(KEY_PASTE); + key(KEY_FIND); + key(KEY_CUT); + key(KEY_HELP); + key(KEY_MENU); + key(KEY_CALC); + key(KEY_SETUP); + key(KEY_SLEEP); + key(KEY_WAKEUP); + key(KEY_FILE); + key(KEY_SENDFILE); + key(KEY_DELETEFILE); + key(KEY_XFER); + key(KEY_PROG1); + key(KEY_PROG2); + key(KEY_WWW); + key(KEY_MSDOS); + key(KEY_COFFEE); + key(KEY_SCREENLOCK); + key(KEY_ROTATE_DISPLAY); + key(KEY_DIRECTION); + key(KEY_CYCLEWINDOWS); + key(KEY_MAIL); + key(KEY_BOOKMARKS); + key(KEY_COMPUTER); + key(KEY_BACK); + key(KEY_FORWARD); + key(KEY_CLOSECD); + key(KEY_EJECTCD); + key(KEY_EJECTCLOSECD); + key(KEY_NEXTSONG); + key(KEY_PLAYPAUSE); + key(KEY_PREVIOUSSONG); + key(KEY_STOPCD); + key(KEY_RECORD); + key(KEY_REWIND); + key(KEY_PHONE); + key(KEY_ISO); + key(KEY_CONFIG); + key(KEY_HOMEPAGE); + key(KEY_REFRESH); + key(KEY_EXIT); + key(KEY_MOVE); + key(KEY_EDIT); + key(KEY_SCROLLUP); + key(KEY_SCROLLDOWN); + key(KEY_KPLEFTPAREN); + key(KEY_KPRIGHTPAREN); + key(KEY_NEW); + key(KEY_REDO); + key(KEY_F13); + key(KEY_F14); + key(KEY_F15); + key(KEY_F16); + key(KEY_F17); + key(KEY_F18); + key(KEY_F19); + key(KEY_F20); + key(KEY_F21); + key(KEY_F22); + key(KEY_F23); + key(KEY_F24); + key(KEY_PLAYCD); + key(KEY_PAUSECD); + key(KEY_PROG3); + key(KEY_PROG4); + //key(KEY_ALL_APPLICATIONS); + key(KEY_DASHBOARD); + key(KEY_SUSPEND); + key(KEY_CLOSE); + key(KEY_PLAY); + key(KEY_FASTFORWARD); + key(KEY_BASSBOOST); + key(KEY_PRINT); + key(KEY_HP); + key(KEY_CAMERA); + key(KEY_SOUND); + key(KEY_QUESTION); + key(KEY_EMAIL); + key(KEY_CHAT); + key(KEY_SEARCH); + key(KEY_CONNECT); + key(KEY_FINANCE); + key(KEY_SPORT); + key(KEY_SHOP); + key(KEY_ALTERASE); + key(KEY_CANCEL); + key(KEY_BRIGHTNESSDOWN); + key(KEY_BRIGHTNESSUP); + key(KEY_MEDIA); + key(KEY_SWITCHVIDEOMODE); + key(KEY_KBDILLUMTOGGLE); + key(KEY_KBDILLUMDOWN); + key(KEY_KBDILLUMUP); + key(KEY_SEND); + key(KEY_REPLY); + key(KEY_FORWARDMAIL); + key(KEY_SAVE); + key(KEY_DOCUMENTS); + key(KEY_BATTERY); + key(KEY_BLUETOOTH); + key(KEY_WLAN); + key(KEY_UWB); + key(KEY_UNKNOWN); + key(KEY_VIDEO_NEXT); + key(KEY_VIDEO_PREV); + key(KEY_BRIGHTNESS_CYCLE); + key(KEY_BRIGHTNESS_AUTO); + key(KEY_BRIGHTNESS_ZERO); + key(KEY_DISPLAY_OFF); + key(KEY_WWAN); + key(KEY_WIMAX); + key(KEY_RFKILL); + key(KEY_MICMUTE); + key(KEY_OK); + key(KEY_SELECT); + key(KEY_GOTO); + key(KEY_CLEAR); + key(KEY_POWER2); + key(KEY_OPTION); + key(KEY_INFO); + key(KEY_TIME); + key(KEY_VENDOR); + key(KEY_ARCHIVE); + key(KEY_PROGRAM); + key(KEY_CHANNEL); + key(KEY_FAVORITES); + key(KEY_EPG); + key(KEY_PVR); + key(KEY_MHP); + key(KEY_LANGUAGE); + key(KEY_TITLE); + key(KEY_SUBTITLE); + key(KEY_ANGLE); + //key(KEY_FULL_SCREEN); + key(KEY_ZOOM); + key(KEY_MODE); + key(KEY_KEYBOARD); + //key(KEY_ASPECT_RATIO); + key(KEY_SCREEN); + key(KEY_PC); + key(KEY_TV); + key(KEY_TV2); + key(KEY_VCR); + key(KEY_VCR2); + key(KEY_SAT); + key(KEY_SAT2); + key(KEY_CD); + key(KEY_TAPE); + key(KEY_RADIO); + key(KEY_TUNER); + key(KEY_PLAYER); + key(KEY_TEXT); + key(KEY_DVD); + key(KEY_AUX); + key(KEY_MP3); + key(KEY_AUDIO); + key(KEY_VIDEO); + key(KEY_DIRECTORY); + key(KEY_LIST); + key(KEY_MEMO); + key(KEY_CALENDAR); + key(KEY_RED); + key(KEY_GREEN); + key(KEY_YELLOW); + key(KEY_BLUE); + key(KEY_CHANNELUP); + key(KEY_CHANNELDOWN); + key(KEY_FIRST); + key(KEY_LAST); + key(KEY_AB); + key(KEY_NEXT); + key(KEY_RESTART); + key(KEY_SLOW); + key(KEY_SHUFFLE); + key(KEY_BREAK); + key(KEY_PREVIOUS); + key(KEY_DIGITS); + key(KEY_TEEN); + key(KEY_TWEN); + key(KEY_VIDEOPHONE); + key(KEY_GAMES); + key(KEY_ZOOMIN); + key(KEY_ZOOMOUT); + key(KEY_ZOOMRESET); + key(KEY_WORDPROCESSOR); + key(KEY_EDITOR); + key(KEY_SPREADSHEET); + key(KEY_GRAPHICSEDITOR); + key(KEY_PRESENTATION); + key(KEY_DATABASE); + key(KEY_NEWS); + key(KEY_VOICEMAIL); + key(KEY_ADDRESSBOOK); + key(KEY_MESSENGER); + key(KEY_DISPLAYTOGGLE); + key(KEY_BRIGHTNESS_TOGGLE); + key(KEY_SPELLCHECK); + key(KEY_LOGOFF); + key(KEY_DOLLAR); + key(KEY_EURO); + key(KEY_FRAMEBACK); + key(KEY_FRAMEFORWARD); + key(KEY_CONTEXT_MENU); + key(KEY_MEDIA_REPEAT); + key(KEY_10CHANNELSUP); + key(KEY_10CHANNELSDOWN); + key(KEY_IMAGES); + //key(KEY_NOTIFICATION_CENTER); + //key(KEY_PICKUP_PHONE); + //key(KEY_HANGUP_PHONE); + key(KEY_DEL_EOL); + key(KEY_DEL_EOS); + key(KEY_INS_LINE); + key(KEY_DEL_LINE); + key(KEY_FN); + key(KEY_FN_ESC); + key(KEY_FN_F1); + key(KEY_FN_F2); + key(KEY_FN_F3); + key(KEY_FN_F4); + key(KEY_FN_F5); + key(KEY_FN_F6); + key(KEY_FN_F7); + key(KEY_FN_F8); + key(KEY_FN_F9); + key(KEY_FN_F10); + key(KEY_FN_F11); + key(KEY_FN_F12); + key(KEY_FN_1); + key(KEY_FN_2); + key(KEY_FN_D); + key(KEY_FN_E); + key(KEY_FN_F); + key(KEY_FN_S); + key(KEY_FN_B); + //key(KEY_FN_RIGHT_SHIFT); + key(KEY_BRL_DOT1); + key(KEY_BRL_DOT2); + key(KEY_BRL_DOT3); + key(KEY_BRL_DOT4); + key(KEY_BRL_DOT5); + key(KEY_BRL_DOT6); + key(KEY_BRL_DOT7); + key(KEY_BRL_DOT8); + key(KEY_BRL_DOT9); + key(KEY_BRL_DOT10); + key(KEY_NUMERIC_0); + key(KEY_NUMERIC_1); + key(KEY_NUMERIC_2); + key(KEY_NUMERIC_3); + key(KEY_NUMERIC_4); + key(KEY_NUMERIC_5); + key(KEY_NUMERIC_6); + key(KEY_NUMERIC_7); + key(KEY_NUMERIC_8); + key(KEY_NUMERIC_9); + key(KEY_NUMERIC_STAR); + key(KEY_NUMERIC_POUND); + key(KEY_NUMERIC_A); + key(KEY_NUMERIC_B); + key(KEY_NUMERIC_C); + key(KEY_NUMERIC_D); + key(KEY_CAMERA_FOCUS); + key(KEY_WPS_BUTTON); + key(KEY_TOUCHPAD_TOGGLE); + key(KEY_TOUCHPAD_ON); + key(KEY_TOUCHPAD_OFF); + key(KEY_CAMERA_ZOOMIN); + key(KEY_CAMERA_ZOOMOUT); + key(KEY_CAMERA_UP); + key(KEY_CAMERA_DOWN); + key(KEY_CAMERA_LEFT); + key(KEY_CAMERA_RIGHT); + key(KEY_ATTENDANT_ON); + key(KEY_ATTENDANT_OFF); + key(KEY_ATTENDANT_TOGGLE); + key(KEY_LIGHTS_TOGGLE); + key(KEY_ALS_TOGGLE); + //key(KEY_ROTATE_LOCK_TOGGLE); + key(KEY_BUTTONCONFIG); + key(KEY_TASKMANAGER); + key(KEY_JOURNAL); + key(KEY_CONTROLPANEL); + key(KEY_APPSELECT); + key(KEY_SCREENSAVER); + key(KEY_VOICECOMMAND); + //key(KEY_ASSISTANT); + //key(KEY_KBD_LAYOUT_NEXT); + //key(KEY_EMOJI_PICKER); + //key(KEY_DICTATE); + //key(KEY_CAMERA_ACCESS_ENABLE); + //key(KEY_CAMERA_ACCESS_DISABLE); + //key(KEY_CAMERA_ACCESS_TOGGLE); + key(KEY_BRIGHTNESS_MIN); + key(KEY_BRIGHTNESS_MAX); + key(KEY_KBDINPUTASSIST_PREV); + key(KEY_KBDINPUTASSIST_NEXT); + key(KEY_KBDINPUTASSIST_PREVGROUP); + key(KEY_KBDINPUTASSIST_NEXTGROUP); + key(KEY_KBDINPUTASSIST_ACCEPT); + key(KEY_KBDINPUTASSIST_CANCEL); + key(KEY_RIGHT_UP); + key(KEY_RIGHT_DOWN); + key(KEY_LEFT_UP); + key(KEY_LEFT_DOWN); + key(KEY_ROOT_MENU); + key(KEY_MEDIA_TOP_MENU); + key(KEY_NUMERIC_11); + key(KEY_NUMERIC_12); + key(KEY_AUDIO_DESC); + key(KEY_3D_MODE); + key(KEY_NEXT_FAVORITE); + key(KEY_STOP_RECORD); + key(KEY_PAUSE_RECORD); + key(KEY_VOD); + key(KEY_UNMUTE); + key(KEY_FASTREVERSE); + key(KEY_SLOWREVERSE); + key(KEY_DATA); + //key(KEY_ONSCREEN_KEYBOARD); + //key(KEY_PRIVACY_SCREEN_TOGGLE); + //key(KEY_SELECTIVE_SCREENSHOT); + //key(KEY_NEXT_ELEMENT); + //key(KEY_PREVIOUS_ELEMENT); + //key(KEY_AUTOPILOT_ENGAGE_TOGGLE); + //key(KEY_MARK_WAYPOINT); + //key(KEY_SOS); + //key(KEY_NAV_CHART); + //key(KEY_FISHING_CHART); + //key(KEY_SINGLE_RANGE_RADAR); + //key(KEY_DUAL_RANGE_RADAR); + //key(KEY_RADAR_OVERLAY); + //key(KEY_TRADITIONAL_SONAR); + //key(KEY_CLEARVU_SONAR); + //key(KEY_SIDEVU_SONAR); + //key(KEY_NAV_INFO); + //key(KEY_BRIGHTNESS_MENU); + //key(KEY_MACRO1); + //key(KEY_MACRO2); + //key(KEY_MACRO3); + //key(KEY_MACRO4); + //key(KEY_MACRO5); + //key(KEY_MACRO6); + //key(KEY_MACRO7); + //key(KEY_MACRO8); + //key(KEY_MACRO9); + //key(KEY_MACRO10); + //key(KEY_MACRO11); + //key(KEY_MACRO12); + //key(KEY_MACRO13); + //key(KEY_MACRO14); + //key(KEY_MACRO15); + //key(KEY_MACRO16); + //key(KEY_MACRO17); + //key(KEY_MACRO18); + //key(KEY_MACRO19); + //key(KEY_MACRO20); + //key(KEY_MACRO21); + //key(KEY_MACRO22); + //key(KEY_MACRO23); + //key(KEY_MACRO24); + //key(KEY_MACRO25); + //key(KEY_MACRO26); + //key(KEY_MACRO27); + //key(KEY_MACRO28); + //key(KEY_MACRO29); + //key(KEY_MACRO30); + //key(KEY_MACRO_RECORD_START); + //key(KEY_MACRO_RECORD_STOP); + //key(KEY_MACRO_PRESET_CYCLE); + //key(KEY_MACRO_PRESET1); + //key(KEY_MACRO_PRESET2); + //key(KEY_MACRO_PRESET3); + //key(KEY_KBD_LCD_MENU1); + //key(KEY_KBD_LCD_MENU2); + //key(KEY_KBD_LCD_MENU3); + //key(KEY_KBD_LCD_MENU4); + //key(KEY_KBD_LCD_MENU5); + key(KEY_MIN_INTERESTING); + key(KEY_MAX); + key(KEY_CNT); + + key(BTN_MISC); + key(BTN_0); + key(BTN_1); + key(BTN_2); + key(BTN_3); + key(BTN_4); + key(BTN_5); + key(BTN_6); + key(BTN_7); + key(BTN_8); + key(BTN_9); + key(BTN_MOUSE); + key(BTN_LEFT); + key(BTN_RIGHT); + key(BTN_MIDDLE); + key(BTN_SIDE); + key(BTN_EXTRA); + key(BTN_FORWARD); + key(BTN_BACK); + key(BTN_TASK); + key(BTN_JOYSTICK); + key(BTN_TRIGGER); + key(BTN_THUMB); + key(BTN_THUMB2); + key(BTN_TOP); + key(BTN_TOP2); + key(BTN_PINKIE); + key(BTN_BASE); + key(BTN_BASE2); + key(BTN_BASE3); + key(BTN_BASE4); + key(BTN_BASE5); + key(BTN_BASE6); + key(BTN_DEAD); + key(BTN_GAMEPAD); + key(BTN_SOUTH); + key(BTN_A); + key(BTN_EAST); + key(BTN_B); + key(BTN_C); + key(BTN_NORTH); + key(BTN_X); + key(BTN_WEST); + key(BTN_Y); + key(BTN_Z); + key(BTN_TL); + key(BTN_TR); + key(BTN_TL2); + key(BTN_TR2); + key(BTN_SELECT); + key(BTN_START); + key(BTN_MODE); + key(BTN_THUMBL); + key(BTN_THUMBR); + key(BTN_DIGI); + key(BTN_TOOL_PEN); + key(BTN_TOOL_RUBBER); + key(BTN_TOOL_BRUSH); + key(BTN_TOOL_PENCIL); + key(BTN_TOOL_AIRBRUSH); + key(BTN_TOOL_FINGER); + key(BTN_TOOL_MOUSE); + key(BTN_TOOL_LENS); + key(BTN_TOOL_QUINTTAP); + //key(BTN_STYLUS3); + key(BTN_TOUCH); + key(BTN_STYLUS); + key(BTN_STYLUS2); + key(BTN_TOOL_DOUBLETAP); + key(BTN_TOOL_TRIPLETAP); + key(BTN_TOOL_QUADTAP); + key(BTN_WHEEL); + key(BTN_GEAR_DOWN); + key(BTN_GEAR_UP); + key(BTN_TRIGGER_HAPPY); + key(BTN_TRIGGER_HAPPY1); + key(BTN_TRIGGER_HAPPY2); + key(BTN_TRIGGER_HAPPY3); + key(BTN_TRIGGER_HAPPY4); + key(BTN_TRIGGER_HAPPY5); + key(BTN_TRIGGER_HAPPY6); + key(BTN_TRIGGER_HAPPY7); + key(BTN_TRIGGER_HAPPY8); + key(BTN_TRIGGER_HAPPY9); + key(BTN_TRIGGER_HAPPY10); + key(BTN_TRIGGER_HAPPY11); + key(BTN_TRIGGER_HAPPY12); + key(BTN_TRIGGER_HAPPY13); + key(BTN_TRIGGER_HAPPY14); + key(BTN_TRIGGER_HAPPY15); + key(BTN_TRIGGER_HAPPY16); + key(BTN_TRIGGER_HAPPY17); + key(BTN_TRIGGER_HAPPY18); + key(BTN_TRIGGER_HAPPY19); + key(BTN_TRIGGER_HAPPY20); + key(BTN_TRIGGER_HAPPY21); + key(BTN_TRIGGER_HAPPY22); + key(BTN_TRIGGER_HAPPY23); + key(BTN_TRIGGER_HAPPY24); + key(BTN_TRIGGER_HAPPY25); + key(BTN_TRIGGER_HAPPY26); + key(BTN_TRIGGER_HAPPY27); + key(BTN_TRIGGER_HAPPY28); + key(BTN_TRIGGER_HAPPY29); + key(BTN_TRIGGER_HAPPY30); + key(BTN_TRIGGER_HAPPY31); + key(BTN_TRIGGER_HAPPY32); + key(BTN_TRIGGER_HAPPY33); + key(BTN_TRIGGER_HAPPY34); + key(BTN_TRIGGER_HAPPY35); + key(BTN_TRIGGER_HAPPY36); + key(BTN_TRIGGER_HAPPY37); + key(BTN_TRIGGER_HAPPY38); + key(BTN_TRIGGER_HAPPY39); + key(BTN_TRIGGER_HAPPY40); + qDebug() << "Unknown EV_KEY event code:" << code.c_str(); + return false; +} + +bool process_EV_MSC(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + msc(MSC_SERIAL); + msc(MSC_PULSELED); + msc(MSC_GESTURE); + msc(MSC_RAW); + msc(MSC_SCAN); + msc(MSC_TIMESTAMP); + msc(MSC_MAX); + msc(MSC_CNT); + qDebug() << "Unknown EV_MSC event code:" << code.c_str(); + return false; +} + +bool process_EV_SW(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + sw(SW_LID); + sw(SW_TABLET_MODE); + sw(SW_HEADPHONE_INSERT); + sw(SW_RFKILL_ALL); + sw(SW_RADIO); + sw(SW_MICROPHONE_INSERT); + sw(SW_DOCK); + sw(SW_LINEOUT_INSERT); + sw(SW_JACK_PHYSICAL_INSERT); + sw(SW_VIDEOOUT_INSERT); + sw(SW_CAMERA_LENS_COVER); + sw(SW_KEYPAD_SLIDE); + sw(SW_FRONT_PROXIMITY); + sw(SW_ROTATE_LOCK); + sw(SW_LINEIN_INSERT); + sw(SW_MUTE_DEVICE); + sw(SW_PEN_INSERTED); + //sw(SW_MACHINE_COVER); + sw(SW_MAX); + sw(SW_CNT); + qDebug() << "Unknown EV_SW event code:" << code.c_str(); + return false; +} + +bool process_EV_LED(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + led(LED_NUML); + led(LED_CAPSL); + led(LED_SCROLLL); + led(LED_COMPOSE); + led(LED_KANA); + led(LED_SLEEP); + led(LED_SUSPEND); + led(LED_MUTE); + led(LED_MISC); + led(LED_MAIL); + led(LED_CHARGING); + led(LED_MAX); + led(LED_CNT); + qDebug() << "Unknown EV_LED event code:" << code.c_str(); + return false; +} + +bool process_EV_SND(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + snd(SND_CLICK); + snd(SND_BELL); + snd(SND_TONE); + snd(SND_MAX); + snd(SND_CNT); + qDebug() << "Unknown EV_SND event code:" << code.c_str(); + return false; +} + +bool process_EV_REP(const QStringList& args){ + auto code = args.at(1).toStdString(); + int value = 0; + if(args.count() > 2){ + bool ok; + QString arg = args.at(2); + value = arg.toInt(&ok); + if(!ok){ + qDebug() << "Third argument must be a valid integer:" << args; + return false; + } + } + rep(REP_DELAY); + rep(REP_PERIOD); + rep(REP_MAX); + rep(REP_CNT); + qDebug() << "Unknown EV_REP event code:" << code.c_str(); + return false; +} + +#define process_type(eventType) if(type == #eventType){ return process_##eventType(args); } + +bool process(const QStringList& args){ + if(args.count() < 2 || args.count() > 3){ + qDebug() << "Incorrect number of arguments."; + if(debugEnabled()){ + qDebug() << "Arguments: " << args.count(); + } + return false; + } + auto type = args.first().toStdString(); + process_type(EV_SYN); + process_type(EV_ABS); + process_type(EV_REL); + process_type(EV_KEY); + process_type(EV_MSC); + process_type(EV_SW); + process_type(EV_LED); + process_type(EV_SND); + process_type(EV_REP); + qDebug() << "Unknown event type:" << type.c_str(); + return false; +} + +int main(int argc, char *argv[]){ + QCoreApplication app(argc, argv); + sentry_init("inject_evdev", argv); + app.setOrganizationName("Eeems"); + app.setOrganizationDomain(OXIDE_SERVICE); + app.setApplicationName("inject_evdev"); + app.setApplicationVersion(APP_VERSION); + QCommandLineParser parser; + parser.setApplicationDescription("Inject evdev events."); + parser.applicationDescription(); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument("device", "Device to emit events to. See /dev/input for possible values."); + parser.process(app); + QStringList args = parser.positionalArguments(); + if (args.isEmpty() || args.count() > 1) { + parser.showHelp(EXIT_FAILURE); + } + auto name = args.first(); + QString path = QString("/dev/input/%1").arg(name); + if(!QFile::exists(path)){ + qDebug() << "Device does not exist:" << name.toStdString().c_str(); + return EXIT_FAILURE; + } + device = new event_device(path.toStdString(), O_RDWR); + if(device->error > 0){ + qDebug() << "Failed to open device:" << name.toStdString().c_str(); + qDebug() << strerror(device->error); + return EXIT_FAILURE; + } + int fd = fileno(stdin); + bool isStream = !isatty(fd); + QSocketNotifier notifier(fd, QSocketNotifier::Read); + QObject::connect(¬ifier, &QSocketNotifier::activated, [&app, &isStream](){ + std::string input; + std::getline(std::cin, input); + auto args = QString(input.c_str()).simplified().split(QRegExp("\\s+"), Qt::SkipEmptyParts); + auto count = args.count(); + if(count && debugEnabled()){ + qDebug() << args; + } + if(!isStream && count == 1 && args.first().toLower() == "exit"){ + app.exit(EXIT_SUCCESS); + return; + } + if(count && !process(args) && isStream){ + app.exit(EXIT_FAILURE); + return; + } + if(!isStream){ + std::cout << "> " << std::flush; + }else if(std::cin.eof()){ + app.exit(EXIT_SUCCESS); + return; + } + }); + if(!isStream){ + qDebug() << "Input is expected in the following format:"; + qDebug() << " TYPE CODE [VALUE]"; + qDebug() << ""; + qDebug() << "For example:"; + qDebug() << " ABS_MT_TRACKING_ID -1"; + qDebug() << " EV_SYN SYN_REPORT"; + qDebug() << ""; + std::cout << "> " << std::flush; + } + return app.exec(); +} diff --git a/applications/system-service/buttonhandler.cpp b/applications/system-service/buttonhandler.cpp index 627a479b1..517c4a2fe 100644 --- a/applications/system-service/buttonhandler.cpp +++ b/applications/system-service/buttonhandler.cpp @@ -1,13 +1,13 @@ #include "buttonhandler.h" -#include - #include "dbusservice.h" +using namespace Oxide; + void button_exit_handler(){ // Release lock - unlock_device(buttons); - close(buttons.fd); + buttons.unlock(); + buttons.close(); } void flush_stream(istream* stream){ @@ -20,16 +20,16 @@ void press_button(event_device& evdev, int code, istream* stream){ #ifdef DEBUG qDebug() << "inject button " << code; #endif - unlock_device(evdev); - ev_key(evdev, code, 1); + evdev.unlock(); + evdev.write(EV_KEY, code, 1); flush_stream(stream); - ev_syn(evdev); + evdev.ev_syn(); flush_stream(stream); - ev_key(evdev, code, 0); + evdev.write(EV_KEY, code, 0); flush_stream(stream); - ev_syn(evdev); + evdev.ev_syn(); flush_stream(stream); - lock_device(evdev); + evdev.lock(); } ButtonHandler* ButtonHandler::init(){ @@ -56,7 +56,7 @@ void ButtonHandler::run(){ memset(name, 0, sizeof(name)); ioctl(buttons.fd, EVIOCGNAME(sizeof(name)), name); qDebug() << "Reading From : " << buttons.device.c_str() << " (" << name << ")"; - lock_device(buttons); + buttons.lock(); qDebug() << "Registering exit handler..."; // Mapping the correct button IDs. unordered_map map; diff --git a/applications/system-service/buttonhandler.h b/applications/system-service/buttonhandler.h index 370ae35e7..a4208ded7 100644 --- a/applications/system-service/buttonhandler.h +++ b/applications/system-service/buttonhandler.h @@ -23,10 +23,10 @@ #include #include #include - -#include "event_device.h" +#include using namespace std; +using namespace Oxide; #define buttonHandler ButtonHandler::init() diff --git a/applications/system-service/digitizerhandler.h b/applications/system-service/digitizerhandler.h index 6a20ed124..f9fe4222f 100644 --- a/applications/system-service/digitizerhandler.h +++ b/applications/system-service/digitizerhandler.h @@ -12,10 +12,10 @@ #include #include #include - -#include "event_device.h" +#include using namespace std; +using namespace Oxide; #define touchHandler DigitizerHandler::singleton_touchScreen() #define wacomHandler DigitizerHandler::singleton_wacom() @@ -80,12 +80,12 @@ class DigitizerHandler : public QThread { } void grab(){ if(!grabbed()){ - lock_device(device); + device.lock(); } } void ungrab(){ if(grabbed()){ - unlock_device(device); + device.unlock(); } } bool grabbed() { return device.locked; } diff --git a/applications/system-service/event_device.cpp b/applications/system-service/event_device.cpp deleted file mode 100644 index c5c79ea29..000000000 --- a/applications/system-service/event_device.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "event_device.h" - -int lock_device(event_device& evdev){ - qDebug() << "locking " << evdev.device.c_str(); - int result = ioctl(evdev.fd, EVIOCGRAB, 1); - if(result == EBUSY){ - qDebug() << "Device is busy"; - }else if(result != 0){ - qDebug() << "Unknown error: " << result; - }else{ - evdev.locked = true; - qDebug() << evdev.device.c_str() << " locked"; - } - return result; -} -int unlock_device(event_device& evdev){ - int result = ioctl(evdev.fd, EVIOCGRAB, 0); - if(result){ - qDebug() << "Failed to unlock " << evdev.device.c_str() << ": " << result; - }else{ - evdev.locked = false; - qDebug() << "Unlocked " << evdev.device.c_str(); - } - return result; -} -void write_event(event_device& evdev, input_event ie){ -#ifdef DEBUG - qDebug() << "WRITE: " << ie.type << ", " << ie.code << ", " << ie.value << " to " << evdev.device.c_str(); -#endif - write(evdev.fd, &ie,sizeof(ie)); -} -void ev_syn(event_device& evdev){ - struct input_event key_input_event; - key_input_event.type = EV_SYN; - key_input_event.code = SYN_REPORT; - write_event(evdev, key_input_event); -} -void ev_dropped(event_device& evdev){ - struct input_event key_input_event; - key_input_event.type = EV_SYN; - key_input_event.code = SYN_DROPPED; - write_event(evdev, key_input_event); -} -void ev_key(event_device& evdev, int code, int value){ - struct input_event key_input_event; - key_input_event.type = EV_KEY; - key_input_event.code = code; - key_input_event.value = value; - write_event(evdev, key_input_event); -} diff --git a/applications/system-service/event_device.h b/applications/system-service/event_device.h deleted file mode 100644 index 4f4314ed3..000000000 --- a/applications/system-service/event_device.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef EVENT_DEVICE_H -#define EVENT_DEVICE_H - -#include - -#include -#include -#include -#include - -using namespace std; - -struct event_device { - string device; - int fd; - bool locked = false; - event_device(string path, int flags){ - device = path; - fd = open(path.c_str(), flags); - } -}; - -int lock_device(event_device& evdev); -int unlock_device(event_device& evdev); -void write_event(event_device& evdev, input_event ie); -void ev_syn(event_device& evdev); -void ev_dropped(event_device& evdev); -void ev_key(event_device& evdev, int code, int value = 0); - -#endif // EVENT_DEVICE_H diff --git a/applications/system-service/system-service.pro b/applications/system-service/system-service.pro index ed26c2a78..2e2109a57 100644 --- a/applications/system-service/system-service.pro +++ b/applications/system-service/system-service.pro @@ -16,7 +16,6 @@ SOURCES += \ appsapi.cpp \ bss.cpp \ buttonhandler.cpp \ - event_device.cpp \ network.cpp \ notification.cpp \ screenapi.cpp \ @@ -59,7 +58,6 @@ HEADERS += \ buttonhandler.h \ dbusservice.h \ digitizerhandler.h \ - event_device.h \ fifohandler.h \ mxcfb.h \ network.h \ diff --git a/package b/package index c387ba5c2..e99c17b3b 100644 --- a/package +++ b/package @@ -2,7 +2,7 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT -pkgnames=(erode fret oxide rot tarnish decay corrupt anxiety liboxide libsentry oxide-utils) +pkgnames=(erode fret oxide rot tarnish decay corrupt anxiety liboxide libsentry oxide-utils inject_evdev) pkgver="2.6~VERSION~" timestamp="$(date -u +%Y-%m-%dT%H:%MZ)" maintainer="Eeems " @@ -227,6 +227,16 @@ oxide-utils() { } } +inject_evdev() { + pkgdesc="Inject input events" + section=utils + installdepends=("liboxide=$pkgver" "libsentry=$_sentry") + + package() { + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/inject_evdev + } +} + liboxide() { pkgdesc="Shared library for oxide applications" section=devel diff --git a/shared/liboxide/applications.cpp b/shared/liboxide/applications.cpp index a8ff8a5cc..063a21b32 100644 --- a/shared/liboxide/applications.cpp +++ b/shared/liboxide/applications.cpp @@ -125,6 +125,7 @@ namespace Oxide::Applications{ return false; }; #define isError(level) (level == ErrorLevel::Error || level == ErrorLevel::Critical) +#undef addError #define addError(_level, _msg) errors.append(ValidationError { .level = _level, .msg = _msg }); if(exitEarly && isError(_level)){ return errors; } #define shouldExit if(exitEarly && std::any_of(errors.constBegin(), errors.constEnd(), [](const ValidationError& error){ return isError(error.level); })){ return errors; } QString type = app.contains("type") ? app["type"].toString().toLower() : ""; diff --git a/shared/liboxide/event_device.cpp b/shared/liboxide/event_device.cpp new file mode 100644 index 000000000..5bdbff2ea --- /dev/null +++ b/shared/liboxide/event_device.cpp @@ -0,0 +1,80 @@ +#include "event_device.h" +#include "debug.h" + +namespace Oxide { + input_event event_device::create_event(ushort type, ushort code, int value){ + struct input_event event; + event.type = type; + event.code = code; + event.value = value; + return event; + } + + event_device::event_device(const string& path, int flags) : device(path), flags(flags){ + this->open(); + } + event_device::~event_device(){ + this->close(); + } + + void event_device::open(){ + if(fd > 0){ + this->close(); + } + fd = ::open(device.c_str(), flags); + error = fd < 0 ? errno : 0; + } + + void event_device::close(){ + if(fd < 0){ + ::close(fd); + } + fd = 0; + } + + int event_device::lock(){ + O_DEBUG("locking " << device.c_str()); + int result = ioctl(fd, EVIOCGRAB, 1); + if(result == EBUSY){ + O_WARNING("Device is busy"); + }else if(result != 0){ + O_WARNING("Unknown error: " << result); + }else{ + locked = true; + O_DEBUG(device.c_str() << " locked"); + } + return result; + } + + int event_device::unlock(){ + int result = ioctl(fd, EVIOCGRAB, 0); + if(result){ + O_WARNING("Failed to unlock " << device.c_str() << ": " << result); + }else{ + locked = false; + O_DEBUG("Unlocked " << device.c_str()); + } + return result; + } + + void event_device::write(input_event ie){ + if(fd <= 0){ + O_WARNING("Failed to write event to " << device.c_str() << ". Device not open.") + return; + } + O_DEBUG("WRITE: " << ie.type << ", " << ie.code << ", " << ie.value << " to " << device.c_str()); + if(::write(fd, &ie,sizeof(ie)) < 0){ + O_WARNING("Failed to write to " << device.c_str() << ". " << strerror(errno)) + } + } + + void event_device::write(ushort type, ushort code, int value){ + this->write(create_event(type, code, value)); + } + void event_device::ev_syn(){ + this->write(create_event(EV_SYN, SYN_REPORT, 0)); + } + void event_device::ev_dropped(){ + this->write(create_event(EV_SYN, SYN_DROPPED, 0)); + } +} diff --git a/shared/liboxide/event_device.h b/shared/liboxide/event_device.h new file mode 100644 index 000000000..b5ababe88 --- /dev/null +++ b/shared/liboxide/event_device.h @@ -0,0 +1,91 @@ +/*! + * \addtogroup Oxide + * @{ + * \file + */ +#pragma once + +#include "liboxide_global.h" + +#include + +#include +#include +#include +#include + +using namespace std; +namespace Oxide { + /*! + * \brief The event_device class + */ + class LIBOXIDE_EXPORT event_device { + public: + static input_event create_event(ushort type, ushort code, int value); + /*! + * \brief event_device + * \param path + * \param flags + */ + event_device(const string& path, int flags); + ~event_device(); + /*! + * \brief close + */ + void close(); + /*! + * \brief open + */ + void open(); + /*! + * \brief lock + * \return + */ + int lock(); + /*! + * \brief unlock + * \return + */ + int unlock(); + /*! + * \brief write + * \param ie + */ + void write(input_event ie); + /*! + * \brief write_event + * \param device + * \param type + * \param code + * \param value + */ + void write(ushort type, ushort code, int value); + /*! + * \brief ev_syn + */ + void ev_syn(); + /*! + * \brief ev_dropped + */ + void ev_dropped(); + /*! + * \brief error + */ + int error; + /*! + * \brief fd + */ + int fd; + /*! + * \brief device + */ + string device; + /*! + * \brief locked + */ + bool locked = false; + private: + int flags; + }; +} +/*! @} */ diff --git a/shared/liboxide/eventfilter.h b/shared/liboxide/eventfilter.h index 8faa1c62a..f35dd23bc 100644 --- a/shared/liboxide/eventfilter.h +++ b/shared/liboxide/eventfilter.h @@ -5,6 +5,8 @@ */ #pragma once +#include "liboxide_global.h" + #include #include #include @@ -12,7 +14,7 @@ namespace Oxide{ /*! * \brief An event filter that maps pen events to Qt touch events */ - class EventFilter : public QObject + class LIBOXIDE_EXPORT EventFilter : public QObject { Q_OBJECT public: diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index e262925b0..d5526977f 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -14,6 +14,7 @@ DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs depr SOURCES += \ applications.cpp \ debug.cpp \ + event_device.cpp \ eventfilter.cpp \ json.cpp \ liboxide.cpp \ @@ -28,6 +29,7 @@ HEADERS += \ applications.h \ dbus.h \ debug.h \ + event_device.h \ eventfilter.h \ liboxide_global.h \ liboxide.h \ From f50c2e82dd62e5ae768ecb7e860300ff84b1f9a8 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 9 May 2023 17:49:53 -0600 Subject: [PATCH 10/87] Update to python 3.10 --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 196d7cdda..8d92b3b8a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,7 @@ on: branches: - master paths: + - '.github/workflows/build.yml' - 'applications/**' - 'shared/**' - 'assets/**' @@ -15,6 +16,7 @@ on: - 'package' pull_request: paths: + - '.github/workflows/build.yml' - 'applications/**' - 'shared/**' - 'assets/**' @@ -32,7 +34,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: '3.10' - name: Install toltecmk run: pip install toltecmk - name: Build packages From 473c5ede1efd0ab5bbd08068a756b83a5f74a1d3 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 9 May 2023 18:01:36 -0600 Subject: [PATCH 11/87] Pin requests version --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8d92b3b8a..6cda89c0c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: with: python-version: '3.10' - name: Install toltecmk - run: pip install toltecmk + run: pip install toltecmk requests==2.26.0 - name: Build packages run: make package timeout-minutes: 15 From b27e56ce269b64671166ea725a4176b57245f6e1 Mon Sep 17 00:00:00 2001 From: Alistair Francis Date: Wed, 10 May 2023 12:04:14 +1000 Subject: [PATCH 12/87] liboxide: Catch stoi() exceptions (#302) * liboxide: Catch stoi exceptions Avoid crashing tarnish if the string provided to SysObject isn't a valid string. Signed-off-by: Alistair Francis Co-authored-by: Nathaniel van Diepen --- shared/liboxide/sysobject.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/shared/liboxide/sysobject.cpp b/shared/liboxide/sysobject.cpp index 8b52c59ec..ddb5c677c 100644 --- a/shared/liboxide/sysobject.cpp +++ b/shared/liboxide/sysobject.cpp @@ -25,7 +25,13 @@ namespace Oxide{ return dir.exists(); } int SysObject::intProperty(const std::string& name){ - return std::stoi(strProperty(name)); + try { + return std::stoi(strProperty(name)); + } + catch (const std::invalid_argument& e) { + O_DEBUG("Property value is not an integer: " << name.c_str()); + return 0; + } } std::string SysObject::strProperty(const std::string& name){ auto path = propertyPath(name); From 80cd88f4ce894328292c0b026380afca115b484e Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 18 May 2023 14:32:24 -0600 Subject: [PATCH 13/87] Add more doc (#303) * Add EventFilter example * Fix make dev handling of new files in lliboxide * Add SysObject example --- shared/liboxide/Makefile | 2 +- shared/liboxide/eventfilter.h | 11 +++++++- shared/liboxide/examples/oxide.cpp | 42 ++++++++++++++++++++++++++++++ shared/liboxide/sysobject.h | 2 ++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/shared/liboxide/Makefile b/shared/liboxide/Makefile index 8530835d3..8c3fa0dc9 100644 --- a/shared/liboxide/Makefile +++ b/shared/liboxide/Makefile @@ -11,7 +11,7 @@ $(DIST): html prod: $(DIST) dev: clean prod - while inotifywait -e close_write *.h *.cpp examples/*.cpp; do $(MAKE) clean prod; done + while inotifywait -re close_write,create,delete .; do $(MAKE) clean prod; done clean: rm -rf $(DIST) diff --git a/shared/liboxide/eventfilter.h b/shared/liboxide/eventfilter.h index f35dd23bc..ede694155 100644 --- a/shared/liboxide/eventfilter.h +++ b/shared/liboxide/eventfilter.h @@ -12,7 +12,14 @@ #include namespace Oxide{ /*! - * \brief An event filter that maps pen events to Qt touch events + * \brief An event filter that maps pen events to Qt touch events. + * + * It works by handling tablet events and translating them to mouse events. + * They are then sent to every enabled/visible widget at the x/y coordinate that have a parent widget, and accept left mouse button input. + * This doens't always work as some widgets aren't found with the current method of finding widgets at a location. + * + * The following is an example of adding it to an application: + * \snippet examples/oxide.cpp EventFilter */ class LIBOXIDE_EXPORT EventFilter : public QObject { @@ -20,6 +27,8 @@ namespace Oxide{ public: /*! * \brief The root element in the Qt application + * + * This is needed to find wigets to send mouse events when a pen touch is detected */ QQuickItem* root; /*! diff --git a/shared/liboxide/examples/oxide.cpp b/shared/liboxide/examples/oxide.cpp index 4fa0c3b94..2f5e3fed7 100644 --- a/shared/liboxide/examples/oxide.cpp +++ b/shared/liboxide/examples/oxide.cpp @@ -34,3 +34,45 @@ try{ qDebug() << "Failed to get user: " << e.what(); } //! [getUID] +//! [EventFilter] +#include +#include +#include +#include + +#import + +#ifdef __arm__ +Q_IMPORT_PLUGIN(QsgEpaperPlugin) +#endif + +using namespace Oxide; +int main(int argc, char *argv[]){ + QGuiApplication app(argc, argv); + + auto filter = new EventFilter(&app); + app.installEventFilter(filter); + + QQmlApplicationEngine engine; + QQmlContext* context = engine.rootContext(); + context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()){ + qDebug() << "Nothing to display"; + return -1; + } + + auto root = engine.rootObjects().first(); + filter->root = (QQuickItem*)root; + return app.exec(); +} +//! [EventFilter] +//! [SysObject] +SysObject lo("/sys/class/net/lo"); +if(lo.exists()){ + qDebug() << "Loop back mac address: " << lo.strProperty("address").c_str(); + qDebug() << "Does " << lo.propertyPath("power").c_str() << " exist?" << lo.hasDirectory("power"); +}else{ + qCritical("Loopback is missing?"); +} +//! [SysObject] diff --git a/shared/liboxide/sysobject.h b/shared/liboxide/sysobject.h index fe0a252c2..5b4579899 100644 --- a/shared/liboxide/sysobject.h +++ b/shared/liboxide/sysobject.h @@ -16,6 +16,8 @@ namespace Oxide { /*! * \brief A class to make interacting with sysfs easier + * + * \snippet examples/oxide.cpp SysObject */ class LIBOXIDE_EXPORT SysObject { public: From 33f03186712697fd2866386a6cd279c39bbd4fe0 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 5 Jun 2023 17:08:21 -0600 Subject: [PATCH 14/87] Add inject_evdev documentation --- web/src/documentation/02_oxide-utils.rst | 32 ++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/web/src/documentation/02_oxide-utils.rst b/web/src/documentation/02_oxide-utils.rst index 844d37432..6dbd9663c 100644 --- a/web/src/documentation/02_oxide-utils.rst +++ b/web/src/documentation/02_oxide-utils.rst @@ -45,3 +45,35 @@ notify-send =========== https://man.archlinux.org/man/notify-send.1.en + +inject_evdev +============ + +This application allows you to script input events. This can be used for things like injecting screen swipes from a script. It functions by taking a string on stdin and parsing the `linux event codes `_ and then passing them to the specified input device. + +.. code:: shell + + Usage: inject_evdev [options] device + Inject evdev events. + + Options: + -h, --help Displays help on commandline options. + --help-all Displays help including Qt specific options. + -v, --version Displays version information. + + Arguments: + device Device to emit events to. See /dev/input for possible values. + + +Example usage: + +.. code:: bash + + inject_evdev event2 << EOF + EV_ABS ABS_MT_TRACKING_ID 123 + EV_SYN SYN_MT_REPORT + EV_SYN SYN_REPORT + EV_ABS ABS_MT_TRACKING_ID -1 + EV_SYN SYN_MT_REPORT + EV_SYN SYN_REPORT + EOF From 55a77713450d06c4717b049e71329009c8f674d0 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 5 Jun 2023 17:18:41 -0600 Subject: [PATCH 15/87] Update interface to 2.6 --- shared/liboxide/meta.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/liboxide/meta.h b/shared/liboxide/meta.h index 2a7a8150a..6acc961b8 100644 --- a/shared/liboxide/meta.h +++ b/shared/liboxide/meta.h @@ -30,7 +30,7 @@ * \def OXIDE_INTERFACE_VERSION * \brief Version of Tarnish and liboxide */ -#define OXIDE_INTERFACE_VERSION "2.5.0" +#define OXIDE_INTERFACE_VERSION "2.6.0" /*! * \def OXIDE_GENERAL_INTERFACE * \brief DBus service for the general API From 706ba37de6e3e7f592cf3d262301c76805305141 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 5 Jun 2023 17:52:15 -0600 Subject: [PATCH 16/87] Make package more like toltec version --- package | 66 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/package b/package index e99c17b3b..b066c708b 100644 --- a/package +++ b/package @@ -2,16 +2,18 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT -pkgnames=(erode fret oxide rot tarnish decay corrupt anxiety liboxide libsentry oxide-utils inject_evdev) -pkgver="2.6~VERSION~" +pkgnames=(erode fret oxide rot tarnish decay corrupt anxiety oxide-utils inject_evdev liboxide libsentry) +_oxidever=2.6 +pkgver="$_oxidever~VERSION~" +_sentryver=0.5.0 timestamp="$(date -u +%Y-%m-%dT%H:%MZ)" maintainer="Eeems " url=https://oxide.eeems.codes license=MIT +flags=(patch_rm2fb) +image=qt:latest source=(oxide.tar.gz) sha256sums=(SKIP) -image=qt:latest -_sentry=0.5.0 ######################################## # These functions come from install-lib: # https://raw.githubusercontent.com/toltec-dev/toltec/master/scripts/install-lib @@ -60,8 +62,8 @@ build() { erode() { pkgdesc="Task manager" - section=utils - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentry") + section="admin" + installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/erode @@ -79,8 +81,8 @@ erode() { fret() { pkgdesc="Take screenshots" - section=utils - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentry") + section="utils" + installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/fret @@ -96,8 +98,8 @@ fret() { oxide() { pkgdesc="Launcher application" - section=launchers - installdepends=("erode=$pkgver" "fret=$pkgver" "tarnish=$pkgver" "rot=$pkgver" "decay=$pkgver" "corrupt=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" display "libsentry=$_sentry") + section="launchers" + installdepends=("erode=$pkgver" "fret=$pkgver" "tarnish=$pkgver" "rot=$pkgver" "decay=$pkgver" "corrupt=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" display "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/oxide @@ -115,8 +117,8 @@ oxide() { rot() { pkgdesc="Manage Oxide settings through the command line" - section=utils - installdepends=("tarnish=$pkgver" "liboxide=$pkgver" "libsentry=$_sentry") + section="admin" + installdepends=("tarnish=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/rot @@ -125,8 +127,8 @@ rot() { tarnish() { pkgdesc="Service managing power states, connectivity and buttons" - section=utils - installdepends=("liboxide=$pkgver" "libsentry=$_sentry") + section="devel" + installdepends=("liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 644 -t "$pkgdir"/etc/dbus-1/system.d "$srcdir"/release/etc/dbus-1/system.d/codes.eeems.oxide.conf @@ -145,9 +147,13 @@ tarnish() { } preremove() { - if systemctl list-units --full -all | grep -Fq 'tarnish.service'; then - echo "Disabling $pkgname" - systemctl disable --now tarnish + if is-active tarnish; then + echo "Stopping tarnish" + systemctl stop tarnish + fi + if is-enabled tarnish; then + echo "Disabling tarnish" + systemctl disable tarnish fi } @@ -158,8 +164,8 @@ tarnish() { decay() { pkgdesc="Lockscreen application" - section=utils - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentry") + section="utils" + installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/decay @@ -175,8 +181,8 @@ decay() { corrupt() { pkgdesc="Task Switcher for Oxide" - section=utils - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentry") + section="utils" + installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/corrupt @@ -192,8 +198,8 @@ corrupt() { anxiety() { pkgdesc="Screenshot viewer for Oxide" - section=utils - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentry") + section="utils" + installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/anxiety @@ -211,8 +217,8 @@ anxiety() { oxide-utils() { pkgdesc="Command line tools for Oxide" - section=utils - installdepends=("tarnish=$pkgver" "liboxide=$pkgver" "libsentry=$_sentry") + section="admin" + installdepends=("tarnish=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") replaces=(notify-send update-desktop-database desktop-file-validate) conflicts=(notify-send update-desktop-database desktop-file-validate) @@ -229,8 +235,8 @@ oxide-utils() { inject_evdev() { pkgdesc="Inject input events" - section=utils - installdepends=("liboxide=$pkgver" "libsentry=$_sentry") + section="utils" + installdepends=("liboxide=$pkgver" "libsentry=$_sentryver") package() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/inject_evdev @@ -239,7 +245,7 @@ inject_evdev() { liboxide() { pkgdesc="Shared library for oxide applications" - section=devel + section="devel" package() { install -D -m 755 -t "$pkgdir"/opt/lib "$srcdir"/release/opt/lib/libliboxide.so* @@ -248,9 +254,9 @@ liboxide() { libsentry() { pkgdesc="Sentry SDK for C, C++ and native applications." - section=devel + section="devel" url=https://github.com/getsentry/sentry-native - pkgver="$_sentry" + pkgver="$_sentryver" timestamp="2021-12-20T14:25:11Z" package() { From 6125e9bf47d8a94d6175971c99352e49e1db6e12 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 7 Jun 2023 13:18:07 -0600 Subject: [PATCH 17/87] Update video (#305) * Update video * Add link to videos wiki page --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c4c428e05..1df91e8c3 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,10 @@ A launcher application for the [reMarkable tablet](https://remarkable.com/). Head over to the [releases](https://github.com/Eeems/oxide/releases) page for more information on the latest release. You can also see some (likely outdated) [screenshots here](https://github.com/Eeems/oxide/wiki/Screenshots). -Here is an outdated video of it in action: -[![Oxide v2.0-beta](https://i.imgur.com/1Q9A4NF.png)](https://youtu.be/rIRKgqy21L0 "Oxide v2.0-beta") +Here is a video of it in action: +[![Oxide v2.6](https://i.imgur.com/IA7wAsE.png[/img])]([https://youtu.be/rIRKgqy21L0](https://youtu.be/FdgWUUUST9o) "Oxide v2.6") + +You can find other (likely outdated) [videos here](https://github.com/Eeems/oxide/wiki/Videos). ## Building From 367ec485c0573a213b628c2b5a06c450b6d8b320 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 28 Jun 2023 11:25:02 -0600 Subject: [PATCH 18/87] Fix draft files missing a name breaking import --- .gitignore | 1 + applications/update-desktop-database/main.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index 65e6f2195..305ead5b5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ oxide.tar.gz build/ dist/ version.txt +*.pro.user.* diff --git a/applications/update-desktop-database/main.cpp b/applications/update-desktop-database/main.cpp index 45ad8b893..e8c6c64f7 100644 --- a/applications/update-desktop-database/main.cpp +++ b/applications/update-desktop-database/main.cpp @@ -128,6 +128,11 @@ int main(int argc, char *argv[]){ } } file.close(); + if(!properties.contains("name")){ + LOG_VERBOSE("No name in properties"); + LOG("Failed to import"); + continue; + } auto name = properties["name"].toString(); path = apps.getApplicationPath(name); if(path.path() != "/"){ @@ -143,6 +148,9 @@ int main(int argc, char *argv[]){ continue; } LOG_VERBOSE("Not found, creating..."); + if(Oxide::debugEnabled()){ + LOG_VERBOSE(properties); + } properties.insert("displayName", name); path = apps.registerApplication(properties); if(path.path() == "/"){ From 171bb8f4933df18731da13a6c95eaac1f149e2bb Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 28 Jun 2023 15:12:48 -0600 Subject: [PATCH 19/87] Simplify package layout (#306) - Merges erode, tarnish, decay, and corrupt into the oxide package - Merges fret and anxiety into the oxide-extra package - Merges rot into the oxide-utils package --- package | 142 ++++++++++++++------------------------------------------ 1 file changed, 35 insertions(+), 107 deletions(-) diff --git a/package b/package index b066c708b..25c7ebb91 100644 --- a/package +++ b/package @@ -2,7 +2,7 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT -pkgnames=(erode fret oxide rot tarnish decay corrupt anxiety oxide-utils inject_evdev liboxide libsentry) +pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide libsentry) _oxidever=2.6 pkgver="$_oxidever~VERSION~" _sentryver=0.5.0 @@ -56,88 +56,43 @@ build() { find . -name "*.pro" -type f -print0 \ | xargs -r -0 sed -i 's/linux-oe-g++/linux-arm-remarkable-g++/g' CMAKE_TOOLCHAIN_FILE="/usr/share/cmake/$CHOST.cmake" make FEATURES=sentry release - # Cleanup build files - rm -r .build } -erode() { - pkgdesc="Task manager" - section="admin" - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") +oxide() { + pkgdesc="Launcher application" + section="launchers" + installdepends=("oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") + replaces=(erode tarnish decay corrupt) + conflicts=(erode tarnish decay corrupt) - package() { + package(){ + # System service + install -D -m 644 -t "$pkgdir"/etc/dbus-1/system.d "$srcdir"/release/etc/dbus-1/system.d/codes.eeems.oxide.conf + install -D -m 644 -t "$pkgdir"/lib/systemd/system "$srcdir"/release/etc/systemd/system/tarnish.service + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/tarnish + # Task manager install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/erode install -D -m 644 -t "$pkgdir"/opt/usr/share/icons/oxide/48x48/apps "$srcdir"/release/opt/usr/share/icons/oxide/48x48/apps/erode.png install -D -m 644 -t "$pkgdir"/opt/usr/share/icons/oxide/702x702/splash "$srcdir"/release/opt/usr/share/icons/oxide/702x702/splash/erode.png install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.erode.oxide - } - - configure() { - if is-active "tarnish.service"; then - update-desktop-database - fi - } -} - -fret() { - pkgdesc="Take screenshots" - section="utils" - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") - - package() { - install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/fret - install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.fret.oxide - } - - configure() { - if is-active "tarnish.service"; then - update-desktop-database - fi - } -} - -oxide() { - pkgdesc="Launcher application" - section="launchers" - installdepends=("erode=$pkgver" "fret=$pkgver" "tarnish=$pkgver" "rot=$pkgver" "decay=$pkgver" "corrupt=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" display "libsentry=$_sentryver") - - package() { + # Launcher install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/oxide install -D -m 644 -t "$pkgdir"/opt/etc "$srcdir"/release/opt/etc/oxide.conf install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.oxide.oxide install -D -m 644 -t "$pkgdir"/opt/usr/share/icons/oxide/702x702/splash "$srcdir"/release/opt/usr/share/icons/oxide/702x702/splash/oxide.png + # Lockscreen + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/decay + install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.decay.oxide + # Task switcher + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/corrupt + install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.corrupt.oxide } - configure() { + configure(){ + systemctl daemon-reload if is-active "tarnish.service"; then update-desktop-database fi - } -} - -rot() { - pkgdesc="Manage Oxide settings through the command line" - section="admin" - installdepends=("tarnish=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") - - package() { - install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/rot - } -} - -tarnish() { - pkgdesc="Service managing power states, connectivity and buttons" - section="devel" - installdepends=("liboxide=$pkgver" "libsentry=$_sentryver") - - package() { - install -D -m 644 -t "$pkgdir"/etc/dbus-1/system.d "$srcdir"/release/etc/dbus-1/system.d/codes.eeems.oxide.conf - install -D -m 644 -t "$pkgdir"/lib/systemd/system "$srcdir"/release/etc/systemd/system/tarnish.service - install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/tarnish - } - - configure() { - systemctl daemon-reload if ! is-enabled "tarnish.service"; then echo "" echo "Run the following command(s) to use $pkgname as your launcher" @@ -162,46 +117,18 @@ tarnish() { } } -decay() { - pkgdesc="Lockscreen application" +oxide-extra() { + pkgdesc="Extra applications for oxide" section="utils" - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") - - package() { - install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/decay - install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.decay.oxide - } - - configure() { - if is-active "tarnish.service"; then - update-desktop-database - fi - } -} - -corrupt() { - pkgdesc="Task Switcher for Oxide" - section="utils" - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") - - package() { - install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/corrupt - install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.corrupt.oxide - } - - configure() { - if is-active "tarnish.service"; then - update-desktop-database - fi - } -} - -anxiety() { - pkgdesc="Screenshot viewer for Oxide" - section="utils" - installdepends=("tarnish=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") + installdepends=("oxide=$pkgver" "oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") + replaces=(fret anxiety) + conflicts=(fret anxiety) package() { + # Screenshot daemon + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/fret + install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.fret.oxide + # Screenshot viewer install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/anxiety install -D -m 644 -t "$pkgdir"/opt/usr/share/applications "$srcdir"/release/opt/usr/share/applications/codes.eeems.anxiety.oxide install -D -m 644 -t "$pkgdir"/opt/usr/share/icons/oxide/48x48/apps "$srcdir"/release/opt/usr/share/icons/oxide/48x48/apps/image.png @@ -218,11 +145,12 @@ anxiety() { oxide-utils() { pkgdesc="Command line tools for Oxide" section="admin" - installdepends=("tarnish=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") - replaces=(notify-send update-desktop-database desktop-file-validate) - conflicts=(notify-send update-desktop-database desktop-file-validate) + installdepends=("oxide=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") + replaces=(rot notify-send update-desktop-database desktop-file-validate) + conflicts=(rot notify-send update-desktop-database desktop-file-validate) package() { + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/rot install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/notify-send install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/update-desktop-database install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/desktop-file-validate From 0f27d484865f235fc0e975218423d2835f290b07 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 28 Jun 2023 15:46:51 -0600 Subject: [PATCH 20/87] Fix #304 (#307) Notifications will now properly handle newlines and word wrap. They will auto resize to fill up to half the width, and the bottom eighth of the screen. --- applications/system-service/notificationapi.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/applications/system-service/notificationapi.h b/applications/system-service/notificationapi.h index f1ec8002d..05f6999a8 100644 --- a/applications/system-service/notificationapi.h +++ b/applications/system-service/notificationapi.h @@ -111,13 +111,13 @@ class NotificationAPI : public APIBase { auto frameBuffer = EPFrameBuffer::framebuffer(); QPainter painter(frameBuffer); auto size = frameBuffer->size(); - auto fm = painter.fontMetrics(); auto padding = 10; auto radius = 10; QImage icon(iconPath); auto iconSize = icon.isNull() ? 0 : 50; - auto width = fm.horizontalAdvance(text) + iconSize + (padding * 3); - auto height = max(fm.height(), iconSize) + (padding * 2); + auto boundingRect = painter.fontMetrics().boundingRect(QRect(0, 0, size.width() / 2, size.height() / 8), Qt::AlignCenter | Qt::TextWordWrap, text); + auto width = boundingRect.width() + iconSize + (padding * 3); + auto height = max(boundingRect.height(), iconSize) + (padding * 2); auto left = size.width() - width; auto top = size.height() - height; QRect updateRect(left, top, width, height); @@ -126,7 +126,7 @@ class NotificationAPI : public APIBase { painter.drawRoundedRect(updateRect, radius, radius); painter.setPen(Qt::white); QRect textRect(left + padding, top + padding, width - iconSize - (padding * 2), height - padding); - painter.drawText(textRect, Qt::AlignCenter, text); + painter.drawText(textRect, Qt::AlignCenter | Qt::TextWordWrap, text); painter.end(); qDebug() << "Updating screen " << updateRect << "..."; EPFrameBuffer::sendUpdate(updateRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); From 7ca1f646314830d32acb09a0be564a8a016f57cc Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 28 Jun 2023 17:56:29 -0600 Subject: [PATCH 21/87] Fix #253 (#308) * Fix #253 - Add dropdown for locale to options menu * Fix #117 - Add dropdown for timezone to options menu --- applications/launcher/controller.h | 48 +++++++++++++------ applications/launcher/main.qml | 4 +- .../launcher/widgets/CalendarMenu.qml | 2 +- .../launcher/widgets/SettingsPopup.qml | 34 +++++++++++++ applications/system-service/application.cpp | 2 +- shared/liboxide/eventfilter.cpp | 28 +++++++---- shared/liboxide/liboxide.cpp | 44 +++++++++++++++++ shared/liboxide/liboxide.h | 30 ++++++++++++ 8 files changed, 165 insertions(+), 27 deletions(-) diff --git a/applications/launcher/controller.h b/applications/launcher/controller.h index c5cbe6ec5..69ca99132 100644 --- a/applications/launcher/controller.h +++ b/applications/launcher/controller.h @@ -31,27 +31,31 @@ enum SwipeDirection { None, Right, Left, Up, Down }; class Controller : public QObject { Q_OBJECT - Q_PROPERTY(bool automaticSleep MEMBER m_automaticSleep WRITE setAutomaticSleep NOTIFY automaticSleepChanged); - Q_PROPERTY(int columns MEMBER m_columns WRITE setColumns NOTIFY columnsChanged); - Q_PROPERTY(int swipeLengthRight MEMBER m_swipeLengthRight WRITE setSwipeLengthRight NOTIFY swipeLengthRightChanged); - Q_PROPERTY(int swipeLengthLeft MEMBER m_swipeLengthLeft WRITE setSwipeLengthLeft NOTIFY swipeLengthLeftChanged); - Q_PROPERTY(int swipeLengthUp MEMBER m_swipeLengthUp WRITE setSwipeLengthUp NOTIFY swipeLengthUpChanged); - Q_PROPERTY(int swipeLengthDown MEMBER m_swipeLengthDown WRITE setSwipeLengthDown NOTIFY swipeLengthDownChanged); - Q_PROPERTY(bool showWifiDb MEMBER m_showWifiDb WRITE setShowWifiDb NOTIFY showWifiDbChanged); - Q_PROPERTY(bool showBatteryPercent MEMBER m_showBatteryPercent WRITE setShowBatteryPercent NOTIFY showBatteryPercentChanged); - Q_PROPERTY(bool showBatteryTemperature MEMBER m_showBatteryTemperature WRITE setShowBatteryTemperature NOTIFY showBatteryTemperatureChanged); - Q_PROPERTY(int sleepAfter MEMBER m_sleepAfter WRITE setSleepAfter NOTIFY sleepAfterChanged); + Q_PROPERTY(bool automaticSleep MEMBER m_automaticSleep WRITE setAutomaticSleep NOTIFY automaticSleepChanged) + Q_PROPERTY(int columns MEMBER m_columns WRITE setColumns NOTIFY columnsChanged) + Q_PROPERTY(int swipeLengthRight MEMBER m_swipeLengthRight WRITE setSwipeLengthRight NOTIFY swipeLengthRightChanged) + Q_PROPERTY(int swipeLengthLeft MEMBER m_swipeLengthLeft WRITE setSwipeLengthLeft NOTIFY swipeLengthLeftChanged) + Q_PROPERTY(int swipeLengthUp MEMBER m_swipeLengthUp WRITE setSwipeLengthUp NOTIFY swipeLengthUpChanged) + Q_PROPERTY(int swipeLengthDown MEMBER m_swipeLengthDown WRITE setSwipeLengthDown NOTIFY swipeLengthDownChanged) + Q_PROPERTY(bool showWifiDb MEMBER m_showWifiDb WRITE setShowWifiDb NOTIFY showWifiDbChanged) + Q_PROPERTY(bool showBatteryPercent MEMBER m_showBatteryPercent WRITE setShowBatteryPercent NOTIFY showBatteryPercentChanged) + Q_PROPERTY(bool showBatteryTemperature MEMBER m_showBatteryTemperature WRITE setShowBatteryTemperature NOTIFY showBatteryTemperatureChanged) + Q_PROPERTY(int sleepAfter MEMBER m_sleepAfter WRITE setSleepAfter NOTIFY sleepAfterChanged) Q_PROPERTY(WifiNetworkList* networks MEMBER networks READ getNetworks NOTIFY networksChanged) Q_PROPERTY(NotificationList* notifications MEMBER notifications READ getNotifications NOTIFY notificationsChanged) + Q_PROPERTY(QStringList locales READ locales) + Q_PROPERTY(QString locale READ locale WRITE setLocale NOTIFY localeChanged) + Q_PROPERTY(QStringList timezones READ timezones) + Q_PROPERTY(QString timezone READ timezone WRITE setTimezone NOTIFY timezoneChanged) Q_PROPERTY(bool wifiOn MEMBER m_wifion READ wifiOn NOTIFY wifiOnChanged) Q_PROPERTY(QString autoStartApplication READ autoStartApplication WRITE setAutoStartApplication NOTIFY autoStartApplicationChanged) Q_PROPERTY(bool powerOffInhibited READ powerOffInhibited NOTIFY powerOffInhibitedChanged) Q_PROPERTY(bool sleepInhibited READ sleepInhibited NOTIFY sleepInhibitedChanged) - Q_PROPERTY(bool showDate MEMBER m_showDate WRITE setShowDate NOTIFY showDateChanged); - Q_PROPERTY(bool hasNotification MEMBER m_hasNotification NOTIFY hasNotificationChanged); - Q_PROPERTY(QString notificationText MEMBER m_notificationText NOTIFY notificationTextChanged); - Q_PROPERTY(int maxTouchWidth READ maxTouchWidth); - Q_PROPERTY(int maxTouchHeight READ maxTouchHeight); + Q_PROPERTY(bool showDate MEMBER m_showDate WRITE setShowDate NOTIFY showDateChanged) + Q_PROPERTY(bool hasNotification MEMBER m_hasNotification NOTIFY hasNotificationChanged) + Q_PROPERTY(QString notificationText MEMBER m_notificationText NOTIFY notificationTextChanged) + Q_PROPERTY(int maxTouchWidth READ maxTouchWidth) + Q_PROPERTY(int maxTouchHeight READ maxTouchHeight) public: static std::string exec(const char* cmd); EventFilter* filter; @@ -318,6 +322,18 @@ class Controller : public QObject bool getPowerConnected(){ return m_powerConnected; } WifiNetworkList* getNetworks(){ return networks; } NotificationList* getNotifications() { return notifications; } + QStringList locales() { return deviceSettings.getLocales(); } + QString locale() { return deviceSettings.getLocale(); } + void setLocale(const QString& locale) { + deviceSettings.setLocale(locale); + emit localeChanged(locale); + } + QStringList timezones() { return deviceSettings.getTimezones(); } + QString timezone() { return deviceSettings.getTimezone(); } + void setTimezone(const QString& timezone) { + deviceSettings.setTimezone(timezone); + emit timezoneChanged(timezone); + } bool powerOffInhibited(){ return systemApi->powerOffInhibited(); } bool sleepInhibited(){ return systemApi->sleepInhibited(); } int maxTouchWidth(){ return deviceSettings.getTouchWidth() * 0.9; } @@ -375,6 +391,8 @@ class Controller : public QObject void showBatteryTemperatureChanged(bool); void sleepAfterChanged(int); void networksChanged(WifiNetworkList*); + void localeChanged(QString); + void timezoneChanged(QString); void wifiOnChanged(bool); void autoStartApplicationChanged(QString); void powerOffInhibitedChanged(bool); diff --git a/applications/launcher/main.qml b/applications/launcher/main.qml index 28a0fb5f0..c1c37f1fa 100755 --- a/applications/launcher/main.qml +++ b/applications/launcher/main.qml @@ -21,7 +21,9 @@ ApplicationWindow { } Connections { target: controller - onReload: appsView.model = controller.getApps() + function onReload() { + appsView.model = controller.getApps(); + } } header: Rectangle { enabled: stateController.state === "loaded" diff --git a/applications/launcher/widgets/CalendarMenu.qml b/applications/launcher/widgets/CalendarMenu.qml index 43b09c5a3..ac56a61bb 100644 --- a/applications/launcher/widgets/CalendarMenu.qml +++ b/applications/launcher/widgets/CalendarMenu.qml @@ -45,7 +45,7 @@ Item { id: grid month: currentDate.getMonth() year: currentDate.getFullYear() - locale: Qt.locale("en_US") + locale: Qt.locale(controller.locale) Layout.fillWidth: true Layout.fillHeight: true delegate: Label { diff --git a/applications/launcher/widgets/SettingsPopup.qml b/applications/launcher/widgets/SettingsPopup.qml index 983141458..23704ae02 100644 --- a/applications/launcher/widgets/SettingsPopup.qml +++ b/applications/launcher/widgets/SettingsPopup.qml @@ -18,6 +18,40 @@ Item { columns: 3 rows: 10 anchors.fill: parent + RowLayout { + Layout.columnSpan: parent.columns + Label { + text: "Locale" + Layout.columnSpan: parent.columns - 1 + Layout.fillWidth: true + } + ComboBox { + Layout.columnSpan: 1 + Layout.fillWidth: true + flat: true + + model: controller.locales + onActivated: controller.locale = textAt(currentIndex) + Component.onCompleted: currentIndex = indexOfValue(controller.locale) + } + } + RowLayout { + Layout.columnSpan: parent.columns + Label { + text: "Timezone" + Layout.columnSpan: parent.columns - 1 + Layout.fillWidth: true + } + ComboBox { + Layout.columnSpan: 1 + Layout.fillWidth: true + flat: true + + model: controller.timezones + onActivated: controller.timezone = textAt(currentIndex) + Component.onCompleted: currentIndex = indexOfValue(controller.timezone) + } + } RowLayout { Layout.columnSpan: parent.columns Label { diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index c80707f1f..6c3f55922 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -520,7 +520,7 @@ void Application::showSplashScreen(){ EPFrameBuffer::waitForLastUpdate(); }); }); - qDebug() << "Finished paining splash screen for" << name(); + qDebug() << "Finished painting splash screen for" << name(); } void Application::powerStateDataRecieved(FifoHandler* handler, const QString& data){ Q_UNUSED(handler); diff --git a/shared/liboxide/eventfilter.cpp b/shared/liboxide/eventfilter.cpp index dd9b523bf..9d1e2dd16 100644 --- a/shared/liboxide/eventfilter.cpp +++ b/shared/liboxide/eventfilter.cpp @@ -64,15 +64,25 @@ namespace Oxide{ QList result; auto children = root->findChildren(); for(auto child : children){ - if(isAt(child, pos)){ - if(child->isVisible() && child->isEnabled() && child->acceptedMouseButtons() & Qt::LeftButton){ - if(!result.contains(child)){ - result.append((QObject*)child); - for(auto item : widgetsAt(child, pos)){ - if(!result.contains(item)){ - result.append(item); - } - } + if(result.contains(child)){ + continue; + } + if(!child->isVisible() || !child->isEnabled()){ + continue; + } + if(child->acceptedMouseButtons() & Qt::LeftButton && isAt(child, pos)){ + result.append((QObject*)child); + for(auto item : widgetsAt(child, pos)){ + if(!result.contains(item)){ + result.append(item); + } + } + continue; + } + if(!child->clip()){ + for(auto item : widgetsAt(child, pos)){ + if(!result.contains(item)){ + result.append(item); } } } diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index fa839d2a5..d5e6f27c1 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -263,6 +263,50 @@ namespace Oxide { return 0; } } + const QStringList DeviceSettings::getLocales() { + return execute("localectl", QStringList() << "list-locales" << "--no-pager").split("\n"); + } + QString DeviceSettings::getLocale() { + QFile file("/etc/locale.conf"); + if(file.open(QFile::ReadOnly)){ + while(!file.atEnd()){ + QString line = file.readLine(); + QStringList fields = line.split("="); + if(fields.first().trimmed() != "LANG"){ + continue; + } + return fields.at(1).trimmed(); + } + } + return qEnvironmentVariable("LANG", "C"); + } + void DeviceSettings::setLocale(const QString& locale) { + if(debugEnabled()){ + qDebug() << "Setting locale:" << locale; + } + qputenv("LANG", locale.toUtf8()); + QProcess::execute("localectl", QStringList() << "set-locale" << locale); + } + const QStringList DeviceSettings::getTimezones() { + return execute("timedatectl", QStringList() << "list-timezones" << "--no-pager").split("\n"); + } + QString DeviceSettings::getTimezone() { + auto lines = execute("timedatectl", QStringList() << "show").split("\n"); + for(auto line : lines){ + QStringList fields = line.split("="); + if(fields.first().trimmed() != "Timezone"){ + continue; + } + return fields.at(1).trimmed(); + } + return "UTC"; + } + void DeviceSettings::setTimezone(const QString& timezone) { + if(debugEnabled()){ + qDebug() << "Setting timezone:" << timezone; + } + QProcess::execute("timedatectl", QStringList() << "set-timezone" << timezone); + } WifiNetworks XochitlSettings::wifinetworks(){ beginGroup("wifinetworks"); QMap wifinetworks; diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index 68e663f1b..c33dbb7a6 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -177,6 +177,36 @@ namespace Oxide { * \return Max height for touch input */ int getTouchHeight() const; + /*! + * \brief Get the list of possible locales on the device + * \return The list of possible locales on the device + */ + const QStringList getLocales(); + /*! + * \brief Get the current set locale + * \return The current locale + */ + QString getLocale(); + /*! + * \brief Set the current locale + * \param locale Locale to set + */ + void setLocale(const QString& locale); + /*! + * \brief Get the list of possible timezones on the device + * \return The list of possible timezones on the device + */ + const QStringList getTimezones(); + /*! + * \brief Get the current set timezone + * \return The current timezone + */ + QString getTimezone(); + /*! + * \brief Set the current timezone + * \param locale Timezone to set + */ + void setTimezone(const QString& timezone); private: DeviceType _deviceType; From 2ce510f462aece0dd026e64fde79862ee0e8dfe8 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 28 Jun 2023 18:12:11 -0600 Subject: [PATCH 22/87] Fix #232 Change default autosleep time to 5 minutes (#309) --- applications/launcher/controller.h | 28 ++++++++++++++-------------- shared/liboxide/liboxide.cpp | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/applications/launcher/controller.h b/applications/launcher/controller.h index 69ca99132..624a3c84e 100644 --- a/applications/launcher/controller.h +++ b/applications/launcher/controller.h @@ -261,27 +261,27 @@ class Controller : public QObject #endif } void updateBatteryLevel(); - bool automaticSleep() const { return m_automaticSleep; }; + bool automaticSleep() const { return m_automaticSleep; } void setAutomaticSleep(bool); - int columns() const { return m_columns; }; + int columns() const { return m_columns; } void setColumns(int); - int swipeLengthRight() const { return m_swipeLengthRight; }; - void setSwipeLengthRight(int length) { setSwipeLength(1, length); }; - int swipeLengthLeft() const { return m_swipeLengthLeft; }; - void setSwipeLengthLeft(int length) { setSwipeLength(2, length); }; - int swipeLengthUp() const { return m_swipeLengthUp; }; - void setSwipeLengthUp(int length) { setSwipeLength(3, length); }; - int swipeLengthDown() const { return m_swipeLengthDown; }; - void setSwipeLengthDown(int length) { setSwipeLength(4, length); }; + int swipeLengthRight() const { return m_swipeLengthRight; } + void setSwipeLengthRight(int length) { setSwipeLength(1, length); } + int swipeLengthLeft() const { return m_swipeLengthLeft; } + void setSwipeLengthLeft(int length) { setSwipeLength(2, length); } + int swipeLengthUp() const { return m_swipeLengthUp; } + void setSwipeLengthUp(int length) { setSwipeLength(3, length); } + int swipeLengthDown() const { return m_swipeLengthDown; } + void setSwipeLengthDown(int length) { setSwipeLength(4, length); } int getSwipeLength(int direction); void setSwipeLength(int direction, int length); - bool showWifiDb() const { return m_showWifiDb; }; + bool showWifiDb() const { return m_showWifiDb; } void setShowWifiDb(bool); - bool showBatteryPercent() const { return m_showBatteryPercent; }; + bool showBatteryPercent() const { return m_showBatteryPercent; } void setShowBatteryPercent(bool); - bool showBatteryTemperature() const { return m_showBatteryTemperature; }; + bool showBatteryTemperature() const { return m_showBatteryTemperature; } void setShowBatteryTemperature(bool); - int sleepAfter() const { return systemApi->autoSleep(); }; + int sleepAfter() const { return systemApi->autoSleep(); } void setSleepAfter(int); void setShowDate(bool showDate){ m_showDate = showDate; diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index d5e6f27c1..a455a2691 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -347,7 +347,7 @@ namespace Oxide { O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, telemetry, false) O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, applicationUsage, false) O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, crashReport, true) - O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoSleep, 1) + O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoSleep, 5) O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, pin) O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onLogin) O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onFailedLogin) From aa185ff442262a877c7d675ce03413361d96ed97 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Fri, 30 Jun 2023 18:32:55 -0600 Subject: [PATCH 23/87] Don't show pin button presses and fix animation (#311) --- applications/lockscreen/main.qml | 1 + applications/lockscreen/widgets/PinButton.qml | 5 ++- applications/lockscreen/widgets/PinPad.qml | 39 +++++++++++++------ 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/applications/lockscreen/main.qml b/applications/lockscreen/main.qml index a91431e06..05fbf1e5c 100644 --- a/applications/lockscreen/main.qml +++ b/applications/lockscreen/main.qml @@ -140,6 +140,7 @@ ApplicationWindow { id: pinEntry objectName: "pinEntry" visible: false + showPress: false anchors.centerIn: parent label: { switch(stateController.state){ diff --git a/applications/lockscreen/widgets/PinButton.qml b/applications/lockscreen/widgets/PinButton.qml index ccd224e4c..996ba1d9a 100644 --- a/applications/lockscreen/widgets/PinButton.qml +++ b/applications/lockscreen/widgets/PinButton.qml @@ -5,6 +5,7 @@ Button { id: control flat: true property bool hideBorder: false + property bool showPress: true implicitWidth: 150 implicitHeight: implicitWidth font.pixelSize: width / 2 @@ -12,14 +13,14 @@ Button { contentItem: Text { text: control.text font: control.font - color: control.down || control.hideBorder ? "black" : "white" + color: control.showPress && control.down || control.hideBorder ? "black" : "white" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } background: Rectangle { anchors.fill: control - color: control.down && !control.hideBorder ? "white" : "black" + color: control.showPress && control.down && !control.hideBorder ? "white" : "black" border.color: control.hideBorder ? "transparent" : "white" border.width: 3 radius: control.width / 2 diff --git a/applications/lockscreen/widgets/PinPad.qml b/applications/lockscreen/widgets/PinPad.qml index 47721081b..33aace467 100644 --- a/applications/lockscreen/widgets/PinPad.qml +++ b/applications/lockscreen/widgets/PinPad.qml @@ -8,6 +8,7 @@ GridLayout { property string value: "" property string label: "PIN" property string message: "" + property bool showPress: true signal submit(string pin) anchors.centerIn: parent @@ -16,13 +17,25 @@ GridLayout { columns: 3 rows: 6 - function buttonsEnabled(){ return value.length < 4; } + function buttonsEnabled(){ return !submitTimer.running && value.length < 4; } function add(text){ + if(!buttonsEnabled()){ + return; + } value += text; if(value.length < 4){ return; } - submit(value); + submitTimer.start(); + } + + Timer { + id: submitTimer + repeat: false + interval: 100 + onTriggered: { + submit(value) + } } ColumnLayout { @@ -39,6 +52,7 @@ GridLayout { } RowLayout { + id: display spacing: root.columnSpacing property int itemSize: 50 Layout.fillWidth: true @@ -90,20 +104,20 @@ GridLayout { Item { Layout.fillWidth: true } } - PinButton { text: "1"; onClicked: root.add(text); enabled: root.buttonsEnabled() } - PinButton { text: "2"; onClicked: root.add(text); enabled: root.buttonsEnabled() } - PinButton { text: "3"; onClicked: root.add(text); enabled: root.buttonsEnabled() } + PinButton { text: "1"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { text: "2"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { text: "3"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "4"; onClicked: root.add(text); enabled: root.buttonsEnabled() } - PinButton { text: "5"; onClicked: root.add(text); enabled: root.buttonsEnabled() } - PinButton { text: "6"; onClicked: root.add(text); enabled: root.buttonsEnabled() } + PinButton { text: "4"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { text: "5"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { text: "6"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "7"; onClicked: root.add(text); enabled: root.buttonsEnabled() } - PinButton { text: "8"; onClicked: root.add(text); enabled: root.buttonsEnabled() } - PinButton { text: "9"; onClicked: root.add(text); enabled: root.buttonsEnabled() } + PinButton { text: "7"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { text: "8"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { text: "9"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } Item { Layout.fillWidth: true } - PinButton { text: "0"; onClicked: root.add(text); enabled: root.buttonsEnabled() } + PinButton { text: "0"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } PinButton { contentItem: Item { Image { @@ -117,5 +131,6 @@ GridLayout { hideBorder: true onClicked: root.value = root.value.slice(0, -1) enabled: root.value.length + showPress: root.showPress } } From 2d74c64d29b678de8914f5fcffca981470c2fabb Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Fri, 30 Jun 2023 18:44:01 -0600 Subject: [PATCH 24/87] Fix #278 - Implement automatic locking (#312) * Fix #278 - Implement automatic locking * bump version to 2.7 --- applications/launcher/controller.cpp | 41 +++++++++ applications/launcher/controller.h | 14 +++ .../launcher/widgets/SettingsPopup.qml | 90 +++++++++++++++++-- applications/system-service/appsapi.h | 3 + applications/system-service/systemapi.cpp | 75 +++++++++++++++- applications/system-service/systemapi.h | 31 ++++++- interfaces/systemapi.xml | 8 ++ qmake/common.pri | 2 +- shared/liboxide/liboxide.cpp | 2 + shared/liboxide/liboxide.h | 34 ++++++- shared/liboxide/meta.h | 2 +- 11 files changed, 284 insertions(+), 18 deletions(-) diff --git a/applications/launcher/controller.cpp b/applications/launcher/controller.cpp index 583b7b0f4..4719e9f38 100644 --- a/applications/launcher/controller.cpp +++ b/applications/launcher/controller.cpp @@ -76,6 +76,13 @@ void Controller::loadSettings(){ qDebug() << "Automatic sleep" << sleepAfter; setAutomaticSleep(sleepAfter); setSleepAfter(sleepAfter); + auto lockOnSuspend = systemApi->lockOnSuspend(); + qDebug() << "Lock on suspend" << lockOnSuspend; + setLockOnSuspend(lockOnSuspend); + auto autoLock = systemApi->autoLock(); + qDebug() << "Automatic lock" << autoLock; + setAutomaticLock(autoLock); + setLockAfter(autoLock); for(short i = 1; i <= 4; i++){ setSwipeLength(i, systemApi->getSwipeLength(i)); } @@ -188,6 +195,17 @@ void Controller::saveSettings(){ setAutomaticSleep(sleepAfter); } } + systemApi->setLockOnSuspend(m_lockOnSuspend); + if(!m_automaticLock){ + systemApi->setAutoLock(0); + }else{ + systemApi->setAutoLock(m_lockAfter); + auto lockAfter = systemApi->autoLock(); + if(lockAfter != m_lockAfter){ + setLockAfter(lockAfter); + setAutomaticLock(lockAfter); + } + } for(short i = 1; i <= 4; i++) { systemApi->setSwipeLength(i, getSwipeLength(i)); } @@ -300,6 +318,24 @@ void Controller::setAutomaticSleep(bool state){ } emit automaticSleepChanged(state); } +void Controller::setLockOnSuspend(bool state){ + m_lockOnSuspend = state; + if(state){ + qDebug() << "Enabling lock on suspend"; + }else{ + qDebug() << "Disabling lock on suspend"; + } + emit lockOnSuspendChanged(state); +} +void Controller::setAutomaticLock(bool state){ + m_automaticLock = state; + if(state){ + qDebug() << "Enabling automatic lock"; + }else{ + qDebug() << "Disabling automatic lock"; + } + emit automaticLockChanged(state); +} void Controller::setColumns(int columns){ m_columns = columns; if(root != nullptr){ @@ -374,3 +410,8 @@ void Controller::setSleepAfter(int sleepAfter){ qDebug() << "Sleep After: " << sleepAfter << " minutes"; emit sleepAfterChanged(m_sleepAfter); } +void Controller::setLockAfter(int lockAfter){ + m_lockAfter = lockAfter; + qDebug() << "Lock After: " << lockAfter << " minutes"; + emit lockAfterChanged(m_lockAfter); +} diff --git a/applications/launcher/controller.h b/applications/launcher/controller.h index 624a3c84e..1f946872f 100644 --- a/applications/launcher/controller.h +++ b/applications/launcher/controller.h @@ -32,6 +32,8 @@ class Controller : public QObject { Q_OBJECT Q_PROPERTY(bool automaticSleep MEMBER m_automaticSleep WRITE setAutomaticSleep NOTIFY automaticSleepChanged) + Q_PROPERTY(bool lockOnSuspend MEMBER m_lockOnSuspend WRITE setLockOnSuspend NOTIFY lockOnSuspendChanged) + Q_PROPERTY(bool automaticLock MEMBER m_automaticLock WRITE setAutomaticLock NOTIFY automaticLockChanged) Q_PROPERTY(int columns MEMBER m_columns WRITE setColumns NOTIFY columnsChanged) Q_PROPERTY(int swipeLengthRight MEMBER m_swipeLengthRight WRITE setSwipeLengthRight NOTIFY swipeLengthRightChanged) Q_PROPERTY(int swipeLengthLeft MEMBER m_swipeLengthLeft WRITE setSwipeLengthLeft NOTIFY swipeLengthLeftChanged) @@ -41,6 +43,7 @@ class Controller : public QObject Q_PROPERTY(bool showBatteryPercent MEMBER m_showBatteryPercent WRITE setShowBatteryPercent NOTIFY showBatteryPercentChanged) Q_PROPERTY(bool showBatteryTemperature MEMBER m_showBatteryTemperature WRITE setShowBatteryTemperature NOTIFY showBatteryTemperatureChanged) Q_PROPERTY(int sleepAfter MEMBER m_sleepAfter WRITE setSleepAfter NOTIFY sleepAfterChanged) + Q_PROPERTY(int lockAfter MEMBER m_lockAfter WRITE setLockAfter NOTIFY lockAfterChanged) Q_PROPERTY(WifiNetworkList* networks MEMBER networks READ getNetworks NOTIFY networksChanged) Q_PROPERTY(NotificationList* notifications MEMBER notifications READ getNotifications NOTIFY notificationsChanged) Q_PROPERTY(QStringList locales READ locales) @@ -263,6 +266,9 @@ class Controller : public QObject void updateBatteryLevel(); bool automaticSleep() const { return m_automaticSleep; } void setAutomaticSleep(bool); + bool lockOnSuspend() const { return m_lockOnSuspend; } + void setLockOnSuspend(bool); + void setAutomaticLock(bool); int columns() const { return m_columns; } void setColumns(int); int swipeLengthRight() const { return m_swipeLengthRight; } @@ -283,6 +289,8 @@ class Controller : public QObject void setShowBatteryTemperature(bool); int sleepAfter() const { return systemApi->autoSleep(); } void setSleepAfter(int); + int lockAfter() const { return systemApi->autoLock(); } + void setLockAfter(int); void setShowDate(bool showDate){ m_showDate = showDate; emit showDateChanged(showDate); @@ -380,6 +388,8 @@ class Controller : public QObject signals: void reload(); void automaticSleepChanged(bool); + void lockOnSuspendChanged(bool); + void automaticLockChanged(bool); void columnsChanged(int); void swipeLengthRightChanged(int); void swipeLengthLeftChanged(int); @@ -390,6 +400,7 @@ class Controller : public QObject void showBatteryPercentChanged(bool); void showBatteryTemperatureChanged(bool); void sleepAfterChanged(int); + void lockAfterChanged(int); void networksChanged(WifiNetworkList*); void localeChanged(QString); void timezoneChanged(QString); @@ -649,6 +660,8 @@ private slots: private: void checkUITimer(); bool m_automaticSleep = true; + bool m_lockOnSuspend = true; + bool m_automaticLock = true; int m_columns = 6; int m_swipeLengthRight = 30; int m_swipeLengthLeft = 30; @@ -656,6 +669,7 @@ private slots: int m_swipeLengthDown = 30; int m_fontSize = 23; int m_sleepAfter; + int m_lockAfter; bool m_showWifiDb = false; bool m_showBatteryPercent = false; bool m_showBatteryTemperature = false; diff --git a/applications/launcher/widgets/SettingsPopup.qml b/applications/launcher/widgets/SettingsPopup.qml index 23704ae02..a05d994bf 100644 --- a/applications/launcher/widgets/SettingsPopup.qml +++ b/applications/launcher/widgets/SettingsPopup.qml @@ -10,23 +10,23 @@ Item { Popup { id: settings width: 1000 - height: 1100 + height: 1400 closePolicy: Popup.NoAutoClose onClosed: parent.closed() visible: parent.visible GridLayout { columns: 3 - rows: 10 + rows: 20 anchors.fill: parent RowLayout { Layout.columnSpan: parent.columns Label { text: "Locale" - Layout.columnSpan: parent.columns - 1 + Layout.columnSpan: 1 Layout.fillWidth: true } ComboBox { - Layout.columnSpan: 1 + Layout.columnSpan: parent.columns - 1 Layout.fillWidth: true flat: true @@ -39,11 +39,11 @@ Item { Layout.columnSpan: parent.columns Label { text: "Timezone" - Layout.columnSpan: parent.columns - 1 + Layout.columnSpan: 1 Layout.fillWidth: true } ComboBox { - Layout.columnSpan: 1 + Layout.columnSpan: parent.columns - 1 Layout.fillWidth: true flat: true @@ -52,6 +52,23 @@ Item { Component.onCompleted: currentIndex = indexOfValue(controller.timezone) } } + RowLayout { + Layout.columnSpan: parent.columns + Label { + text: "Lock after sleep" + Layout.columnSpan: parent.columns - 1 + Layout.fillWidth: true + } + BetterCheckBox { + tristate: false + checkState: controller.lockOnSuspend ? Qt.Checked : Qt.Unchecked + onClicked: { + controller.lockOnSuspend = this.checkState === Qt.Checked + } + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.fillWidth: false + } + } RowLayout { Layout.columnSpan: parent.columns Label { @@ -113,6 +130,67 @@ Item { Layout.preferredWidth: 300 } } + RowLayout { + Layout.columnSpan: parent.columns + Label { + text: "Automatic lock" + Layout.columnSpan: parent.columns - 1 + Layout.fillWidth: true + } + BetterCheckBox { + tristate: false + checkState: controller.automaticLock ? Qt.Checked : Qt.Unchecked + onClicked: { + controller.automaticLock = this.checkState === Qt.Checked + controller.lockAfter = lockAfterSpinBox.value + } + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.fillWidth: false + } + } + RowLayout { + Layout.columnSpan: parent.columns + Layout.preferredWidth: parent.width + enabled: controller.automaticLock + Label { + text: "Lock After (minutes)" + Layout.fillWidth: true + } + BetterSpinBox { + id: lockAfterSpinBox + objectName: "lockAfterSpinBox" + from: 1 + to: 360 + stepSize: 1 + value: controller.lockAfter + onDownPressedChanged: { + if(this.value <= 10){ + this.stepSize = 1; + return; + } + if(this.value <= 60){ + this.stepSize = 5; + return; + } + this.stepSize = 15; + } + onUpPressedChanged: { + if(this.value < 10){ + this.stepSize = 1; + return; + } + if(this.value < 60){ + this.stepSize = 5; + return; + } + this.stepSize = 15; + } + onValueChanged: { + controller.lockAfter = this.value; + } + Layout.preferredWidth: 300 + } + } RowLayout { Layout.columnSpan: parent.columns Label { diff --git a/applications/system-service/appsapi.h b/applications/system-service/appsapi.h index 80c8b3b93..8ffabc274 100644 --- a/applications/system-service/appsapi.h +++ b/applications/system-service/appsapi.h @@ -401,6 +401,9 @@ class AppsAPI : public APIBase { } auto currentApplication = getApplication(this->currentApplicationNoSecurityCheck()); if(currentApplication != nullptr){ + if(currentApplication == application){ + continue; + } currentApplication->pauseNoSecurityCheck(false); } application->launchNoSecurityCheck(); diff --git a/applications/system-service/systemapi.cpp b/applications/system-service/systemapi.cpp index cac8229f3..b03d92fab 100644 --- a/applications/system-service/systemapi.cpp +++ b/applications/system-service/systemapi.cpp @@ -21,6 +21,10 @@ void SystemAPI::PrepareForSleep(bool suspending){ auto device = deviceSettings.getDeviceType(); if(suspending){ Oxide::Sentry::sentry_transaction("system", "suspend", [this, device](Oxide::Sentry::Transaction* t){ + if(autoLock()){ + lockTimestamp = QDateTime::currentMSecsSinceEpoch() + lockTimer.remainingTime(); + qDebug() << "Auto Lock timestamp:" << lockTimestamp; + } qDebug() << "Preparing for suspend..."; Oxide::Sentry::sentry_span(t, "prepare", "Prepare for suspend", [this]{ wifiAPI->stopUpdating(); @@ -30,7 +34,9 @@ void SystemAPI::PrepareForSleep(bool suspending){ if(path.path() != "/"){ resumeApp = appsAPI->getApplication(path); resumeApp->pauseNoSecurityCheck(false); + qDebug() << "Resume app set to " << resumeApp->name(); }else{ + qDebug() << "Unable to set resume app"; resumeApp = nullptr; } }); @@ -69,15 +75,32 @@ void SystemAPI::PrepareForSleep(bool suspending){ QCoreApplication::processEvents(QEventLoop::AllEvents, 100); }); Oxide::Sentry::sentry_span(t, "resume", "Resume running application or go to lockscreen", [this]{ - auto lockscreenApp = appsAPI->getApplication(appsAPI->lockscreenApplication()); - if(lockscreenApp != nullptr){ - resumeApp = lockscreenApp; + auto now = QDateTime::currentMSecsSinceEpoch(); + bool lockTimeout = autoLock(); + if(lockTimeout){ + qDebug() << "Current timestamp:" << now; + lockTimeout = now >= lockTimestamp; + } + if(lockOnSuspend() || lockTimeout){ + if(lockTimeout){ + qDebug() << "Lock timer expired while suspended"; + }else{ + qDebug() << "Always locking after suspend"; + } + auto lockscreenApp = appsAPI->getApplication(appsAPI->lockscreenApplication()); + if(lockscreenApp != nullptr){ + qDebug() << "Resume app set to lockscreen application"; + resumeApp = lockscreenApp; + } } if(resumeApp == nullptr){ + qDebug() << "Resume app set to startup application"; resumeApp = appsAPI->getApplication(appsAPI->startupApplication()); } if(resumeApp != nullptr){ resumeApp->resumeNoSecurityCheck(); + }else{ + qDebug() << "Unable to find an app to resume"; } }); Oxide::Sentry::sentry_span(t, "enable", "Enable various services", [this, device]{ @@ -87,6 +110,10 @@ void SystemAPI::PrepareForSleep(bool suspending){ qDebug() << "Suspend timer re-enabled due to resume"; suspendTimer.start(autoSleep() * 60 * 1000); } + if(autoLock()){ + qDebug() << "Lock timer re-enabled due to resume"; + lockTimer.start(autoLock() * 60 * 1000); + } if(device == Oxide::DeviceSettings::DeviceType::RM2){ system("modprobe brcmfmac"); if(wifiWasOn){ @@ -112,6 +139,22 @@ void SystemAPI::setAutoSleep(int _autoSleep){ sharedSettings.sync(); emit autoSleepChanged(_autoSleep); } +void SystemAPI::setAutoLock(int _autoLock){ + if(_autoLock < 0 || _autoLock > 360){ + return; + } + qDebug() << "Auto Lock" << _autoLock; + sharedSettings.set_autoLock(_autoLock); + lockTimer.setInterval(_autoLock * 60 * 1000); + sharedSettings.sync(); + emit autoLockChanged(_autoLock); +} +void SystemAPI::setLockOnSuspend(bool _lockOnSuspend){ + sharedSettings.set_lockOnSuspend(_lockOnSuspend); + qDebug() << "Lock on Suspend" << _lockOnSuspend; + sharedSettings.sync(); + emit lockOnSuspendChanged(_lockOnSuspend); +} void SystemAPI::uninhibitAll(QString name){ if(powerOffInhibited()){ powerOffInhibitors.removeAll(name); @@ -136,6 +179,12 @@ void SystemAPI::startSuspendTimer(){ suspendTimer.start(autoSleep() * 60 * 1000); } } +void SystemAPI::startLockTimer(){ + if(autoLock() && !lockTimer.isActive()){ + qDebug() << "Lock timer re-enabled due to start lock timer"; + lockTimer.start(autoSleep() * 60 * 1000); + } +} void SystemAPI::activity(){ auto active = suspendTimer.isActive(); suspendTimer.stop(); @@ -147,6 +196,15 @@ void SystemAPI::activity(){ }else if(active){ qDebug() << "Suspend timer disabled"; } + active = lockTimer.isActive(); + if(autoLock()){ + if(!active){ + qDebug() << "Lock timer re-enabled due to activity"; + } + lockTimer.start(autoLock() * 60 * 1000); + }else if(active){ + qDebug() << "Lock timer disabled"; + } } void SystemAPI::uninhibitSleep(QDBusMessage message){ @@ -165,12 +223,21 @@ void SystemAPI::uninhibitSleep(QDBusMessage message){ emit sleepInhibitedChanged(false); } } -void SystemAPI::timeout(){ +void SystemAPI::suspendTimeout(){ if(autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected){ qDebug() << "Automatic suspend due to inactivity..."; suspend(); } } +void SystemAPI::lockTimeout(){ + if(autoLock()){ + auto lockscreenApp = appsAPI->getApplication(appsAPI->lockscreenApplication()); + if(lockscreenApp != nullptr){ + qDebug() << "Automatic lock due to inactivity..."; + lockscreenApp->resumeNoSecurityCheck(); + } + } +} void SystemAPI::toggleSwipes(){ bool state = !swipeStates[Up]; setSwipeEnabled(Left, state); diff --git a/applications/system-service/systemapi.h b/applications/system-service/systemapi.h index 238d36f12..2ff172466 100644 --- a/applications/system-service/systemapi.h +++ b/applications/system-service/systemapi.h @@ -67,6 +67,8 @@ class SystemAPI : public APIBase { Q_OBJECT Q_CLASSINFO("D-Bus Interface", OXIDE_SYSTEM_INTERFACE) Q_PROPERTY(int autoSleep READ autoSleep WRITE setAutoSleep NOTIFY autoSleepChanged) + Q_PROPERTY(int autoLock READ autoLock WRITE setAutoLock NOTIFY autoLockChanged) + Q_PROPERTY(bool lockOnSuspend READ lockOnSuspend WRITE setLockOnSuspend NOTIFY lockOnSuspendChanged) Q_PROPERTY(bool sleepInhibited READ sleepInhibited NOTIFY sleepInhibitedChanged) Q_PROPERTY(bool powerOffInhibited READ powerOffInhibited NOTIFY powerOffInhibitedChanged) @@ -83,6 +85,7 @@ class SystemAPI : public APIBase { SystemAPI(QObject* parent) : APIBase(parent), suspendTimer(this), + lockTimer(this), settings(this), sleepInhibitors(), powerOffInhibitors(), @@ -112,7 +115,8 @@ class SystemAPI : public APIBase { Oxide::Sentry::sentry_span(s, "connect", "Connect to signals", [this]{ // Handle Systemd signals connect(systemd, &Manager::PrepareForSleep, this, &SystemAPI::PrepareForSleep); - connect(&suspendTimer, &QTimer::timeout, this, &SystemAPI::timeout); + connect(&suspendTimer, &QTimer::timeout, this, &SystemAPI::suspendTimeout); + connect(&lockTimer, &QTimer::timeout, this, &SystemAPI::lockTimeout); }); }); Oxide::Sentry::sentry_span(t, "autoSleep", "Setup automatic sleep", [this](Oxide::Sentry::Span* s){ @@ -147,12 +151,17 @@ class SystemAPI : public APIBase { sharedSettings.set_autoSleep(10); } qDebug() << "Auto Sleep" << autoSleep(); - Oxide::Sentry::sentry_span(s, "timer", "Setup timer", [this]{ + Oxide::Sentry::sentry_span(s, "timer", "Setup timers", [this]{ if(autoSleep()){ suspendTimer.start(autoSleep() * 60 * 1000); - }else if(!autoSleep()){ + }else{ suspendTimer.stop(); } + if(autoLock()){ + lockTimer.start(autoLock() * 60 * 1000); + }else{ + lockTimer.stop(); + } }); connect(&sharedSettings, &Oxide::SharedSettings::autoSleepChanged, [=](int _autoSleep){ emit autoSleepChanged(_autoSleep); @@ -213,6 +222,10 @@ class SystemAPI : public APIBase { } int autoSleep(){return sharedSettings.autoSleep(); } void setAutoSleep(int _autoSleep); + int autoLock(){return sharedSettings.autoLock(); } + void setAutoLock(int _autoLock); + bool lockOnSuspend(){return sharedSettings.lockOnSuspend(); } + void setLockOnSuspend(bool _lockOnSuspend); bool sleepInhibited(){ return sleepInhibitors.length(); } bool powerOffInhibited(){ return powerOffInhibitors.length(); } void uninhibitAll(QString name); @@ -220,7 +233,12 @@ class SystemAPI : public APIBase { qDebug() << "Suspend timer disabled"; suspendTimer.stop(); } + void stopLockTimer(){ + qDebug() << "Lock timer disabled"; + lockTimer.stop(); + } void startSuspendTimer(); + void startLockTimer(); void lock(){ mutex.lock(); } void unlock() { mutex.unlock(); } Q_INVOKABLE void setSwipeEnabled(int direction, bool enabled){ @@ -416,13 +434,16 @@ public slots: void sleepInhibitedChanged(bool); void powerOffInhibitedChanged(bool); void autoSleepChanged(int); + void autoLockChanged(int); + void lockOnSuspendChanged(bool); void swipeLengthChanged(int, int); void deviceSuspending(); void deviceResuming(); private slots: void PrepareForSleep(bool suspending); - void timeout(); + void suspendTimeout(); + void lockTimeout(); void touchEvent(const input_event& event){ switch(event.type){ case EV_SYN: @@ -536,7 +557,9 @@ private slots: Manager* systemd; QList inhibitors; Application* resumeApp; + qint64 lockTimestamp = 0; QTimer suspendTimer; + QTimer lockTimer; QSettings settings; QStringList sleepInhibitors; QStringList powerOffInhibitors; diff --git a/interfaces/systemapi.xml b/interfaces/systemapi.xml index 07af4a184..753803e2d 100644 --- a/interfaces/systemapi.xml +++ b/interfaces/systemapi.xml @@ -2,6 +2,8 @@ + + @@ -25,6 +27,12 @@ + + + + + + diff --git a/qmake/common.pri b/qmake/common.pri index c8b3ac4fa..7c231cbf5 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -1,3 +1,3 @@ QMAKE_RPATHDIR += /lib /usr/lib /opt/lib /opt/usr/lib -VERSION = 2.6 +VERSION = 2.7 DEFINES += APP_VERSION=\\\"$$VERSION\\\" diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index a455a2691..b8cb0dfe0 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -347,7 +347,9 @@ namespace Oxide { O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, telemetry, false) O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, applicationUsage, false) O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, crashReport, true) + O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, lockOnSuspend, true) O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoSleep, 5) + O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoLock, 5) O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, pin) O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onLogin) O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onFailedLogin) diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index c33dbb7a6..34c6396ff 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -31,7 +31,7 @@ #ifdef APP_VERSION #define VERSION APP_VERSION #else -#define VERSION "2.6" +#define VERSION "2.7" #endif #endif #ifndef APP_VERSION @@ -384,6 +384,21 @@ namespace Oxide { * \brief If crash reporting has been enabled or disabled */ O_SETTINGS_PROPERTY(bool, General, crashReport, true) + /*! + * \property lockOnSuspend + * \brief If the device should lock on suspend or not + * \sa set_lockOnSuspend, lockOnSuspendChanged + */ + /*! + * \fn set_lockOnSuspend + * \param _arg_lockOnSuspend + * \brief Enable or disable locking on suspend + */ + /*! + * \fn lockOnSuspendChanged + * \brief If lock on suspend has been enabled or disabled + */ + O_SETTINGS_PROPERTY(bool, General, lockOnSuspend, true) /*! * \property autoSleep * \brief How long without activity before the device should suspend @@ -398,7 +413,22 @@ namespace Oxide { * \fn autoSleepChanged * \brief If autoSleep has been changed */ - O_SETTINGS_PROPERTY(int, General, autoSleep, 1) + O_SETTINGS_PROPERTY(int, General, autoSleep, 5) + /*! + * \property autoLock + * \brief How long without activity before the device should suspend + * \sa set_autoLock, autoLockChanged + */ + /*! + * \fn set_autoLock + * \param _arg_autoLock + * \brief Change autoLock + */ + /*! + * \fn autoLockChanged + * \brief If autoLock has been changed + */ + O_SETTINGS_PROPERTY(int, General, autoLock, 5) /*! * \property pin * \brief The lockscreen pin diff --git a/shared/liboxide/meta.h b/shared/liboxide/meta.h index 6acc961b8..f119fca87 100644 --- a/shared/liboxide/meta.h +++ b/shared/liboxide/meta.h @@ -30,7 +30,7 @@ * \def OXIDE_INTERFACE_VERSION * \brief Version of Tarnish and liboxide */ -#define OXIDE_INTERFACE_VERSION "2.6.0" +#define OXIDE_INTERFACE_VERSION "2.7.0" /*! * \def OXIDE_GENERAL_INTERFACE * \brief DBus service for the general API From e687472a2e86efc159f8c7961d96c42d9bf8ddce Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Fri, 30 Jun 2023 20:13:55 -0600 Subject: [PATCH 25/87] Fix #199 display error if no application can be launched on startup (#313) * Fix #199 display error if no application can be launched on startup --- applications/system-service/appsapi.cpp | 62 ++++++++++++++++++- applications/system-service/appsapi.h | 25 ++------ applications/system-service/notificationapi.h | 13 ++++ 3 files changed, 78 insertions(+), 22 deletions(-) diff --git a/applications/system-service/appsapi.cpp b/applications/system-service/appsapi.cpp index 8197c3ddf..9b961d91a 100644 --- a/applications/system-service/appsapi.cpp +++ b/applications/system-service/appsapi.cpp @@ -96,6 +96,11 @@ AppsAPI::AppsAPI(QObject* parent) void AppsAPI::startup(){ Oxide::Sentry::sentry_transaction("apps", "startup", [this](Oxide::Sentry::Transaction* t){ + if(applications.isEmpty()){ + qDebug() << "No applications found"; + notificationAPI->errorNotification(_noApplicationsMessage); + return; + } Oxide::Sentry::sentry_span(t, "autoStart", "Launching auto start applications", [this](Oxide::Sentry::Span* s){ for(auto app : applications){ if(app->autoStart()){ @@ -117,14 +122,65 @@ void AppsAPI::startup(){ app = getApplication(m_startupApplication); } if(app == nullptr){ - qDebug() << "could not find startup application"; - return; + qDebug() << "Could not find startup application"; + qDebug() << "Using xochitl due to invalid configuration"; + app = getApplication("xochitl"); + } + if(app == nullptr){ + qDebug() << "Could not find xochitl"; + qWarning() << "Using the first application in the list due to invalid configuration"; + app = applications.first(); } qDebug() << "Starting initial application" << app->name(); app->launchNoSecurityCheck(); - m_starting = false; + ensureForegroundApp(); }); }); } +void AppsAPI::resumeIfNone(){ + if(m_stopping || m_starting){ + return; + } + for(auto app : applications){ + if(app->stateNoSecurityCheck() == Application::InForeground){ + return; + } + } + if(previousApplicationNoSecurityCheck()){ + return; + } + auto app = getApplication(m_startupApplication); + if(app == nullptr){ + app = getApplication("xochitl"); + } + if(app == nullptr){ + if(applications.isEmpty()){ + qDebug() << "No applications found"; + notificationAPI->errorNotification(_noApplicationsMessage); + return; + } + app = applications.first(); + } + app->launchNoSecurityCheck(); + m_starting = true; + ensureForegroundApp(); +} + bool AppsAPI::locked(){ return notificationAPI->locked(); } + +void AppsAPI::ensureForegroundApp() { + QTimer::singleShot(300, [this]{ + m_starting = false; + auto path = appsAPI->currentApplicationNoSecurityCheck(); + if(path.path() == "/"){ + notificationAPI->errorNotification(_noForegroundAppMessage); + return; + } + auto app = appsAPI->getApplication(path); + if(app == nullptr || app->state() == Application::Inactive){ + notificationAPI->errorNotification(_noForegroundAppMessage); + return; + } + }); +} diff --git a/applications/system-service/appsapi.h b/applications/system-service/appsapi.h index 8ffabc274..247729efa 100644 --- a/applications/system-service/appsapi.h +++ b/applications/system-service/appsapi.h @@ -316,23 +316,7 @@ class AppsAPI : public APIBase { app->pauseNoSecurityCheck(false); } } - void resumeIfNone(){ - if(m_stopping || m_starting){ - return; - } - for(auto app : applications){ - if(app->stateNoSecurityCheck() == Application::InForeground){ - return; - } - } - if(previousApplicationNoSecurityCheck()){ - return; - } - auto app = getApplication(m_startupApplication); - if(app != nullptr){ - app->launchNoSecurityCheck(); - } - } + void resumeIfNone(); Application* getApplication(QDBusObjectPath path){ for(auto app : applications){ if(app->path() == path.path()){ @@ -342,7 +326,7 @@ class AppsAPI : public APIBase { return nullptr; } QStringList getPreviousApplications(){ return previousApplications; } - Q_INVOKABLE QDBusObjectPath getApplicationPath(QString name){ + Q_INVOKABLE QDBusObjectPath getApplicationPath(const QString& name){ if(!hasPermission("apps")){ return QDBusObjectPath("/"); } @@ -352,7 +336,7 @@ class AppsAPI : public APIBase { } return app->qPath(); } - Application* getApplication(QString name){ + Application* getApplication(const QString& name){ if(applications.contains(name)){ return applications[name]; } @@ -579,6 +563,8 @@ public slots: static const QUuid NS = QUuid::fromString(QLatin1String("{d736a9e1-10a9-4258-9634-4b0fa91189d5}")); return QString(OXIDE_SERVICE_PATH) + "/apps/" + QUuid::createUuidV5(NS, name).toString(QUuid::Id128); } + QString _noApplicationsMessage = "No applications have been found. This is the result of invalid configuration. Open an issue on\nhttps://github.com/Eeems-Org/oxide\nto get support resolving this."; + QString _noForegroundAppMessage = "No foreground application currently running. Open an issue on\nhttps://github.com/Eeems-Org/oxide\nto get support resolving this."; void writeApplications(){ auto apps = applications.values(); @@ -735,5 +721,6 @@ public slots: settings->sync(); } bool locked(); + void ensureForegroundApp(); }; #endif // APPSAPI_H diff --git a/applications/system-service/notificationapi.h b/applications/system-service/notificationapi.h index 05f6999a8..2ebb34215 100644 --- a/applications/system-service/notificationapi.h +++ b/applications/system-service/notificationapi.h @@ -141,6 +141,19 @@ class NotificationAPI : public APIBase { EPFrameBuffer::waitForLastUpdate(); return updateRect; } + void errorNotification(const QString& text){ + auto frameBuffer = EPFrameBuffer::framebuffer(); + qDebug() << "Waiting for other painting to finish..."; + while(frameBuffer->paintingActive()){ + EPFrameBuffer::waitForLastUpdate(); + } + qDebug() << "Displaying error text"; + QPainter painter(frameBuffer); + painter.fillRect(frameBuffer->rect(), Qt::white); + painter.end(); + EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + notificationAPI->paintNotification(text, ""); + } public slots: QDBusObjectPath add(const QString& identifier, const QString& application, const QString& text, const QString& icon, QDBusMessage message){ From fd4b65c27f18256829ae521028dbb43b0db262ac Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sat, 1 Jul 2023 21:28:56 -0600 Subject: [PATCH 26/87] Minor fixes (#315) * Minor fixes * Fix #77 --- applications/system-service/buttonhandler.cpp | 1 + applications/system-service/digitizerhandler.h | 3 ++- applications/system-service/fifohandler.h | 5 +++-- applications/system-service/wifiapi.h | 7 +++++++ shared/liboxide/debug.h | 5 +++++ 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/applications/system-service/buttonhandler.cpp b/applications/system-service/buttonhandler.cpp index 517c4a2fe..cbb8693fa 100644 --- a/applications/system-service/buttonhandler.cpp +++ b/applications/system-service/buttonhandler.cpp @@ -86,6 +86,7 @@ void ButtonHandler::run(){ emit keyUp(map[ie.code].keyCode); } }else{ + qApp->processEvents(QEventLoop::AllEvents, 100); yieldCurrentThread(); } } diff --git a/applications/system-service/digitizerhandler.h b/applications/system-service/digitizerhandler.h index f9fe4222f..98bd5d3b8 100644 --- a/applications/system-service/digitizerhandler.h +++ b/applications/system-service/digitizerhandler.h @@ -146,7 +146,8 @@ class DigitizerHandler : public QThread { qDebug() << "Reading From : " << device.device.c_str() << " (" << name << ")"; qDebug() << "Listening for events..."; while(handle_events()){ - yieldCurrentThread(); + qApp->processEvents(QEventLoop::AllEvents, 100); + QThread::yieldCurrentThread(); } } bool handle_events(){ diff --git a/applications/system-service/fifohandler.h b/applications/system-service/fifohandler.h index 799856aed..205ba540b 100644 --- a/applications/system-service/fifohandler.h +++ b/applications/system-service/fifohandler.h @@ -77,12 +77,13 @@ class FifoHandler : public QObject { QString line(data.c_str()); line = line.trimmed(); emit dataRecieved(this, line); - thread()->yieldCurrentThread(); + qApp->processEvents(QEventLoop::AllEvents, 100); + QThread::yieldCurrentThread(); } if(in.eof()){ in.clear(); } - thread()->yieldCurrentThread(); + QThread::yieldCurrentThread(); } private: diff --git a/applications/system-service/wifiapi.h b/applications/system-service/wifiapi.h index f74d8cf43..05974c025 100644 --- a/applications/system-service/wifiapi.h +++ b/applications/system-service/wifiapi.h @@ -238,6 +238,10 @@ class WifiAPI : public APIBase { if(m_state == Off){ setState(Disconnected); } + if(system("rfkill unblock wifi")){ + qDebug() << "Failed to enable wifi devices"; + return false; + } for(auto wlan : wlans){ if(!wlan->isUp() && !wlan->up()){ qDebug() << "Failed to enable " + wlan->iface(); @@ -265,6 +269,9 @@ class WifiAPI : public APIBase { qDebug() << "Failed to disable " + wlan->iface(); } } + if(system("rfkill block wifi")){ + qDebug() << "Failed to disable wifi devices"; + } flushBSSCache(0); xochitlSettings.set_wifion(false); } diff --git a/shared/liboxide/debug.h b/shared/liboxide/debug.h index 84644e83c..7a12cec5f 100644 --- a/shared/liboxide/debug.h +++ b/shared/liboxide/debug.h @@ -13,6 +13,11 @@ * \brief Log a debug message if compiled with DEBUG mode, and debugging is enabled * \param msg Debug message to log */ +#ifndef DEBUG +#ifndef QT_NO_DEBUG +#define DEBUG +#endif +#endif #ifdef DEBUG #define O_DEBUG(msg) if(Oxide::debugEnabled()){ qDebug() << msg; } #else From 527dc6e1771d04bf46103601de2e3f2f98850e20 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sun, 9 Jul 2023 17:59:49 -0600 Subject: [PATCH 27/87] Move all screen updates to main thread (#316) --- applications/system-service/application.cpp | 88 +++++++++-------- applications/system-service/application.h | 25 ++--- applications/system-service/appsapi.h | 96 ++++++++++--------- applications/system-service/notification.cpp | 18 ++-- applications/system-service/notificationapi.h | 90 ++++++++--------- applications/system-service/screenapi.cpp | 30 +++--- applications/system-service/screenapi.h | 28 +++--- shared/liboxide/liboxide.cpp | 14 +-- shared/liboxide/liboxide.h | 26 +++++ 9 files changed, 228 insertions(+), 187 deletions(-) diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index 6c3f55922..98788cd4a 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -470,54 +470,60 @@ void Application::showSplashScreen(){ Q_UNUSED(t); #endif Oxide::Sentry::sentry_span(t, "wait", "Wait for screen to be ready", [frameBuffer](){ - while(frameBuffer->paintingActive()){ - EPFrameBuffer::waitForLastUpdate(); - } + dispatchToMainThread([frameBuffer]{ + while(frameBuffer->paintingActive()){ + EPFrameBuffer::waitForLastUpdate(); + } + }); }); qDebug() << "Displaying splashscreen for" << name(); Oxide::Sentry::sentry_span(t, "paint", "Draw splash screen", [this, frameBuffer](){ - QPainter painter(frameBuffer); - auto fm = painter.fontMetrics(); - auto size = frameBuffer->size(); - painter.fillRect(frameBuffer->rect(), Qt::white); - QString splashPath = splash(); - if(splashPath.isEmpty() || !QFile::exists(splashPath)){ - splashPath = icon(); - } - if(!splashPath.isEmpty() && QFile::exists(splashPath)){ - qDebug() << "Using image" << splashPath; - int splashWidth = size.width() / 2; - QSize splashSize(splashWidth, splashWidth); - QImage splash = QImage(splashPath).scaled(splashSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - QRect splashRect( - QPoint( - (size.width() / 2) - (splashWidth / 2), - (size.height() / 2) - (splashWidth / 2) - ), - splashSize + dispatchToMainThread([this, frameBuffer]{ + QPainter painter(frameBuffer); + auto fm = painter.fontMetrics(); + auto size = frameBuffer->size(); + painter.fillRect(frameBuffer->rect(), Qt::white); + QString splashPath = splash(); + if(splashPath.isEmpty() || !QFile::exists(splashPath)){ + splashPath = icon(); + } + if(!splashPath.isEmpty() && QFile::exists(splashPath)){ + qDebug() << "Using image" << splashPath; + int splashWidth = size.width() / 2; + QSize splashSize(splashWidth, splashWidth); + QImage splash = QImage(splashPath).scaled(splashSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + QRect splashRect( + QPoint( + (size.width() / 2) - (splashWidth / 2), + (size.height() / 2) - (splashWidth / 2) + ), + splashSize + ); + painter.drawImage(splashRect, splash, splash.rect()); + EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); + } + painter.setPen(Qt::black); + auto text = "Loading " + displayName() + "..."; + int padding = 10; + int textHeight = fm.height() + padding; + QRect textRect( + QPoint(0 + padding, size.height() - textHeight), + QSize(size.width() - padding * 2, textHeight) ); - painter.drawImage(splashRect, splash, splash.rect()); - EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); - } - painter.setPen(Qt::black); - auto text = "Loading " + displayName() + "..."; - int padding = 10; - int textHeight = fm.height() + padding; - QRect textRect( - QPoint(0 + padding, size.height() - textHeight), - QSize(size.width() - padding * 2, textHeight) - ); - painter.drawText( - textRect, - Qt::AlignVCenter | Qt::AlignRight, - text - ); - EPFrameBuffer::sendUpdate(textRect, EPFrameBuffer::Grayscale, EPFrameBuffer::PartialUpdate, true); - painter.end(); + painter.drawText( + textRect, + Qt::AlignVCenter | Qt::AlignRight, + text + ); + EPFrameBuffer::sendUpdate(textRect, EPFrameBuffer::Grayscale, EPFrameBuffer::PartialUpdate, true); + painter.end(); + }); }); qDebug() << "Waitng for screen to finish..."; Oxide::Sentry::sentry_span(t, "wait", "Wait for screen finish updating", [](){ - EPFrameBuffer::waitForLastUpdate(); + dispatchToMainThread([]{ + EPFrameBuffer::waitForLastUpdate(); + }); }); }); qDebug() << "Finished painting splash screen for" << name(); diff --git a/applications/system-service/application.h b/applications/system-service/application.h index 243645166..65c6e5069 100644 --- a/applications/system-service/application.h +++ b/applications/system-service/application.h @@ -369,9 +369,11 @@ class Application : public QObject{ Oxide::Sentry::sentry_span(t, "save", "Save the framebuffer", [&bytes]{ QBuffer buffer(&bytes); buffer.open(QIODevice::WriteOnly); - if(!EPFrameBuffer::framebuffer()->save(&buffer, "JPG", 100)){ - O_WARNING("Failed to save buffer"); - } + dispatchToMainThread([&buffer]{ + if(!EPFrameBuffer::framebuffer()->save(&buffer, "JPG", 100)){ + O_WARNING("Failed to save buffer"); + } + }); }); qDebug() << "Compressing data..."; Oxide::Sentry::sentry_span(t, "compress", "Compress the framebuffer", [this, bytes]{ @@ -398,14 +400,15 @@ class Application : public QObject{ } qDebug() << "Recalling screen..."; Oxide::Sentry::sentry_span(t, "recall", "Recall the screen", [this, img]{ - auto size = EPFrameBuffer::framebuffer()->size(); - QRect rect(0, 0, size.width(), size.height()); - QPainter painter(EPFrameBuffer::framebuffer()); - painter.drawImage(rect, img); - painter.end(); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); - EPFrameBuffer::waitForLastUpdate(); - + dispatchToMainThread([img]{ + auto size = EPFrameBuffer::framebuffer()->size(); + QRect rect(0, 0, size.width(), size.height()); + QPainter painter(EPFrameBuffer::framebuffer()); + painter.drawImage(rect, img); + painter.end(); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); + EPFrameBuffer::waitForLastUpdate(); + }); delete m_screenCapture; m_screenCapture = nullptr; }); diff --git a/applications/system-service/appsapi.h b/applications/system-service/appsapi.h index 247729efa..6d0b54a65 100644 --- a/applications/system-service/appsapi.h +++ b/applications/system-service/appsapi.h @@ -51,55 +51,57 @@ class AppsAPI : public APIBase { m_stopping = true; writeApplications(); settings.sync(); - auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; - while(frameBuffer->paintingActive()){ - EPFrameBuffer::waitForLastUpdate(); - } - QPainter painter(frameBuffer); - auto rect = frameBuffer->rect(); - auto fm = painter.fontMetrics(); - auto size = frameBuffer->size(); - qDebug() << "Clearing screen..."; - painter.setPen(Qt::white); - painter.fillRect(rect, Qt::black); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); - EPFrameBuffer::waitForLastUpdate(); - qDebug() << "Stopping applications..."; - for(auto app : applications){ - if(app->stateNoSecurityCheck() != Application::Inactive){ - auto text = "Stopping " + app->displayName() + "..."; - qDebug() << text.toStdString().c_str(); - int padding = 10; - int textHeight = fm.height() + padding; - QRect textRect( - QPoint(0 + padding, size.height() - textHeight), - QSize(size.width() - padding * 2, textHeight) - ); - painter.fillRect(textRect, Qt::black); - painter.drawText( - textRect, - Qt::AlignVCenter | Qt::AlignRight, - text - ); - EPFrameBuffer::sendUpdate(textRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); + dispatchToMainThread([this]{ + auto frameBuffer = EPFrameBuffer::framebuffer(); + qDebug() << "Waiting for other painting to finish..."; + while(frameBuffer->paintingActive()){ EPFrameBuffer::waitForLastUpdate(); } - app->stopNoSecurityCheck(); - } - qDebug() << "Ensuring all applications have stopped..."; - for(auto app : applications){ - app->waitForFinished(); - app->deleteLater(); - } - applications.clear(); - qDebug() << "Displaying final quit message..."; - painter.fillRect(rect, Qt::black); - painter.drawText(rect, Qt::AlignCenter,"Goodbye!"); - EPFrameBuffer::waitForLastUpdate(); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); - painter.end(); - EPFrameBuffer::waitForLastUpdate(); + QPainter painter(frameBuffer); + auto rect = frameBuffer->rect(); + auto fm = painter.fontMetrics(); + auto size = frameBuffer->size(); + qDebug() << "Clearing screen..."; + painter.setPen(Qt::white); + painter.fillRect(rect, Qt::black); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + EPFrameBuffer::waitForLastUpdate(); + qDebug() << "Stopping applications..."; + for(auto app : applications){ + if(app->stateNoSecurityCheck() != Application::Inactive){ + auto text = "Stopping " + app->displayName() + "..."; + qDebug() << text.toStdString().c_str(); + int padding = 10; + int textHeight = fm.height() + padding; + QRect textRect( + QPoint(0 + padding, size.height() - textHeight), + QSize(size.width() - padding * 2, textHeight) + ); + painter.fillRect(textRect, Qt::black); + painter.drawText( + textRect, + Qt::AlignVCenter | Qt::AlignRight, + text + ); + EPFrameBuffer::sendUpdate(textRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); + EPFrameBuffer::waitForLastUpdate(); + } + app->stopNoSecurityCheck(); + } + qDebug() << "Ensuring all applications have stopped..."; + for(auto app : applications){ + app->waitForFinished(); + app->deleteLater(); + } + applications.clear(); + qDebug() << "Displaying final quit message..."; + painter.fillRect(rect, Qt::black); + painter.drawText(rect, Qt::AlignCenter,"Goodbye!"); + EPFrameBuffer::waitForLastUpdate(); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + painter.end(); + EPFrameBuffer::waitForLastUpdate(); + }); } void startup(); int state() { return 0; } // Ignore this, it's a kludge to get the xml to generate diff --git a/applications/system-service/notification.cpp b/applications/system-service/notification.cpp index 08d091956..d876af7d0 100644 --- a/applications/system-service/notification.cpp +++ b/applications/system-service/notification.cpp @@ -54,17 +54,21 @@ void Notification::remove(){ void Notification::paintNotification(Application* resumeApp){ qDebug() << "Painting notification" << identifier(); - screenBackup = screenAPI->copy(); + dispatchToMainThread([this]{ + screenBackup = screenAPI->copy(); + }); updateRect = notificationAPI->paintNotification(text(), m_icon); qDebug() << "Painted notification" << identifier(); emit displayed(); QTimer::singleShot(2000, [this, resumeApp]{ - QPainter painter(EPFrameBuffer::framebuffer()); - painter.drawImage(updateRect, screenBackup, updateRect); - painter.end(); - EPFrameBuffer::sendUpdate(updateRect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); - qDebug() << "Finished displaying notification" << identifier(); - EPFrameBuffer::waitForLastUpdate(); + dispatchToMainThread([this]{ + QPainter painter(EPFrameBuffer::framebuffer()); + painter.drawImage(updateRect, screenBackup, updateRect); + painter.end(); + EPFrameBuffer::sendUpdate(updateRect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + qDebug() << "Finished displaying notification" << identifier(); + EPFrameBuffer::waitForLastUpdate(); + }); if(!notificationAPI->notificationDisplayQueue.isEmpty()){ Oxide::dispatchToMainThread([resumeApp] { notificationAPI->notificationDisplayQueue.takeFirst()->paintNotification(resumeApp); diff --git a/applications/system-service/notificationapi.h b/applications/system-service/notificationapi.h index 2ebb34215..5c47fe100 100644 --- a/applications/system-service/notificationapi.h +++ b/applications/system-service/notificationapi.h @@ -107,51 +107,55 @@ class NotificationAPI : public APIBase { return m_notifications.value(identifier); } QRect paintNotification(const QString& text, const QString& iconPath){ - qDebug() << "Painting to framebuffer..."; - auto frameBuffer = EPFrameBuffer::framebuffer(); - QPainter painter(frameBuffer); - auto size = frameBuffer->size(); - auto padding = 10; - auto radius = 10; - QImage icon(iconPath); - auto iconSize = icon.isNull() ? 0 : 50; - auto boundingRect = painter.fontMetrics().boundingRect(QRect(0, 0, size.width() / 2, size.height() / 8), Qt::AlignCenter | Qt::TextWordWrap, text); - auto width = boundingRect.width() + iconSize + (padding * 3); - auto height = max(boundingRect.height(), iconSize) + (padding * 2); - auto left = size.width() - width; - auto top = size.height() - height; - QRect updateRect(left, top, width, height); - painter.fillRect(updateRect, Qt::black); - painter.setPen(Qt::black); - painter.drawRoundedRect(updateRect, radius, radius); - painter.setPen(Qt::white); - QRect textRect(left + padding, top + padding, width - iconSize - (padding * 2), height - padding); - painter.drawText(textRect, Qt::AlignCenter | Qt::TextWordWrap, text); - painter.end(); - qDebug() << "Updating screen " << updateRect << "..."; - EPFrameBuffer::sendUpdate(updateRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); - if(!icon.isNull()){ - QPainter painter2(frameBuffer); - QRect iconRect(size.width() - iconSize - padding, top + padding, iconSize, iconSize); - painter2.fillRect(iconRect, Qt::white); - painter2.drawImage(iconRect, icon); - painter2.end(); - EPFrameBuffer::sendUpdate(iconRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); - } - EPFrameBuffer::waitForLastUpdate(); - return updateRect; + return dispatchToMainThread([text, iconPath]{ + qDebug() << "Painting to framebuffer..."; + auto frameBuffer = EPFrameBuffer::framebuffer(); + QPainter painter(frameBuffer); + auto size = frameBuffer->size(); + auto padding = 10; + auto radius = 10; + QImage icon(iconPath); + auto iconSize = icon.isNull() ? 0 : 50; + auto boundingRect = painter.fontMetrics().boundingRect(QRect(0, 0, size.width() / 2, size.height() / 8), Qt::AlignCenter | Qt::TextWordWrap, text); + auto width = boundingRect.width() + iconSize + (padding * 3); + auto height = max(boundingRect.height(), iconSize) + (padding * 2); + auto left = size.width() - width; + auto top = size.height() - height; + QRect updateRect(left, top, width, height); + painter.fillRect(updateRect, Qt::black); + painter.setPen(Qt::black); + painter.drawRoundedRect(updateRect, radius, radius); + painter.setPen(Qt::white); + QRect textRect(left + padding, top + padding, width - iconSize - (padding * 2), height - padding); + painter.drawText(textRect, Qt::AlignCenter | Qt::TextWordWrap, text); + painter.end(); + qDebug() << "Updating screen " << updateRect << "..."; + EPFrameBuffer::sendUpdate(updateRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); + if(!icon.isNull()){ + QPainter painter2(frameBuffer); + QRect iconRect(size.width() - iconSize - padding, top + padding, iconSize, iconSize); + painter2.fillRect(iconRect, Qt::white); + painter2.drawImage(iconRect, icon); + painter2.end(); + EPFrameBuffer::sendUpdate(iconRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); + } + EPFrameBuffer::waitForLastUpdate(); + return updateRect; + }); } void errorNotification(const QString& text){ - auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; - while(frameBuffer->paintingActive()){ - EPFrameBuffer::waitForLastUpdate(); - } - qDebug() << "Displaying error text"; - QPainter painter(frameBuffer); - painter.fillRect(frameBuffer->rect(), Qt::white); - painter.end(); - EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + dispatchToMainThread([]{ + auto frameBuffer = EPFrameBuffer::framebuffer(); + qDebug() << "Waiting for other painting to finish..."; + while(frameBuffer->paintingActive()){ + EPFrameBuffer::waitForLastUpdate(); + } + qDebug() << "Displaying error text"; + QPainter painter(frameBuffer); + painter.fillRect(frameBuffer->rect(), Qt::white); + painter.end(); + EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + }); notificationAPI->paintNotification(text, ""); } diff --git a/applications/system-service/screenapi.cpp b/applications/system-service/screenapi.cpp index 6d3d7de39..640e4ea65 100644 --- a/applications/system-service/screenapi.cpp +++ b/applications/system-service/screenapi.cpp @@ -10,18 +10,20 @@ QDBusObjectPath ScreenAPI::screenshot(){ #ifdef DEBUG qDebug() << "Using path" << filePath; #endif - QImage screen = copy(); - QRect rect = notificationAPI->paintNotification("Taking Screenshot...", ""); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); - QDBusObjectPath path("/"); - if(!screen.save(filePath)){ - qDebug() << "Failed to take screenshot"; - }else{ - path = addScreenshot(filePath)->qPath(); - } - QPainter painter(EPFrameBuffer::framebuffer()); - painter.drawImage(rect, screen, rect); - painter.end(); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::PartialUpdate, true); - return path; + return dispatchToMainThread([this, filePath]{ + QImage screen = copy(); + QRect rect = notificationAPI->paintNotification("Taking Screenshot...", ""); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); + QDBusObjectPath path("/"); + if(!screen.save(filePath)){ + qDebug() << "Failed to take screenshot"; + }else{ + path = addScreenshot(filePath)->qPath(); + } + QPainter painter(EPFrameBuffer::framebuffer()); + painter.drawImage(rect, screen, rect); + painter.end(); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::PartialUpdate, true); + return path; + }); } diff --git a/applications/system-service/screenapi.h b/applications/system-service/screenapi.h index 430a3e7ff..446d92440 100644 --- a/applications/system-service/screenapi.h +++ b/applications/system-service/screenapi.h @@ -103,24 +103,28 @@ class ScreenAPI : public APIBase { } Oxide::Sentry::sentry_transaction("screen", "drawFullscrenImage", [img, path](Oxide::Sentry::Transaction* t){ Q_UNUSED(t); - QRect rect = EPFrameBuffer::framebuffer()->rect(); - QPainter painter(EPFrameBuffer::framebuffer()); - painter.drawImage(rect, img); - painter.end(); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); - EPFrameBuffer::waitForLastUpdate(); + Oxide::dispatchToMainThread([img]{ + QRect rect = EPFrameBuffer::framebuffer()->rect(); + QPainter painter(EPFrameBuffer::framebuffer()); + painter.drawImage(rect, img); + painter.end(); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); + EPFrameBuffer::waitForLastUpdate(); + }); }); return true; } Q_INVOKABLE QDBusObjectPath screenshot(); QImage copy(){ - auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; - while(frameBuffer->paintingActive()){ - EPFrameBuffer::waitForLastUpdate(); - } - return frameBuffer->copy(); + return Oxide::dispatchToMainThread([]{ + auto frameBuffer = EPFrameBuffer::framebuffer(); + qDebug() << "Waiting for other painting to finish..."; + while(frameBuffer->paintingActive()){ + EPFrameBuffer::waitForLastUpdate(); + } + return frameBuffer->copy(); + }); } public slots: diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index b8cb0dfe0..0687c471f 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -97,20 +97,10 @@ namespace Oxide { return pids; } void dispatchToMainThread(std::function callback){ - if(QThread::currentThread() == qApp->thread()){ + dispatchToMainThread([callback]{ callback(); - return; - } - // any thread - QTimer* timer = new QTimer(); - timer->moveToThread(qApp->thread()); - timer->setSingleShot(true); - QObject::connect(timer, &QTimer::timeout, [=](){ - // main thread - callback(); - timer->deleteLater(); + return 0; }); - QMetaObject::invokeMethod(timer, "start", Qt::BlockingQueuedConnection, Q_ARG(int, 0)); } uid_t getUID(const QString& name){ char buffer[1024]; diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index 34c6396ff..30674200d 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -102,6 +102,32 @@ namespace Oxide { * \snippet examples/oxide.cpp dispatchToMainThread */ LIBOXIDE_EXPORT void dispatchToMainThread(std::function callback); + /*! + * \brief Run code on the main Qt thread + * \param callback The code to run on the main thread + * \return Return value of callback + * + * \snippet examples/oxide.cpp dispatchToMainThread + */ + template LIBOXIDE_EXPORT T dispatchToMainThread(std::function callback){ + if(QThread::currentThread() == qApp->thread()){ + return callback(); + } + // any thread + QTimer* timer = new QTimer(); + timer->moveToThread(qApp->thread()); + timer->setSingleShot(true); + struct _ { + T value; + } result; + QObject::connect(timer, &QTimer::timeout, [timer, &result, callback](){ + // main thread + result.value = callback(); + timer->deleteLater(); + }); + QMetaObject::invokeMethod(timer, "start", Qt::BlockingQueuedConnection, Q_ARG(int, 0)); + return result.value; + } /*! * \brief Get the UID for a username * \param name Username to search for From eac17d1d1ae1ec16e196e364fc4e41ebdb80e1f6 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sun, 9 Jul 2023 18:12:53 -0600 Subject: [PATCH 28/87] Simplify gui application setup with liboxide (#317) Embed libqsepaper in liboxide --- applications/launcher/launcher.pro | 1 - applications/launcher/main.cpp | 20 ++----------------- applications/lockscreen/lockscreen.pro | 1 - applications/lockscreen/main.cpp | 18 +---------------- applications/process-manager/main.cpp | 19 +----------------- .../process-manager/process-manager.pro | 1 - .../screenshot-tool/screenshot-tool.pro | 1 - applications/screenshot-viewer/main.cpp | 18 +---------------- .../screenshot-viewer/screenshot-viewer.pro | 1 - applications/system-service/main.cpp | 10 +--------- .../system-service/system-service.pro | 2 +- applications/task-switcher/main.cpp | 18 +---------------- applications/task-switcher/task-switcher.pro | 1 - qmake/epaper.pri | 4 ++-- shared/epaper/epframebuffer.h | 12 ++++++++++- shared/liboxide/examples/oxide.cpp | 10 ++++++++++ shared/liboxide/liboxide.cpp | 15 +++++++++++++- shared/liboxide/liboxide.h | 14 +++++++------ shared/liboxide/liboxide.pro | 7 +++++-- 19 files changed, 58 insertions(+), 115 deletions(-) diff --git a/applications/launcher/launcher.pro b/applications/launcher/launcher.pro index 18a06de04..58940d7b9 100644 --- a/applications/launcher/launcher.pro +++ b/applications/launcher/launcher.pro @@ -49,6 +49,5 @@ HEADERS += \ PRECOMPILED_HEADER = \ oxide_stable.h -include(../../qmake/epaper.pri) include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) diff --git a/applications/launcher/main.cpp b/applications/launcher/main.cpp index f9a9d6836..3010c4748 100644 --- a/applications/launcher/main.cpp +++ b/applications/launcher/main.cpp @@ -19,31 +19,15 @@ #include "controller.h" -#ifdef __arm__ -Q_IMPORT_PLUGIN(QsgEpaperPlugin) -#endif - using namespace std; using namespace Oxide; using namespace Oxide::Sentry; -const char *qt_version = qVersion(); - function shutdown_handler; void signalHandler2(int signal) { shutdown_handler(signal); } -int main(int argc, char *argv[]){ - if (strcmp(qt_version, QT_VERSION_STR) != 0){ - qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; - } -#ifdef __arm__ - // Setup epaper - qputenv("QMLSCENE_DEVICE", "epaper"); - qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); - qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); - qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); -// qputenv("QT_DEBUG_BACKINGSTORE", "1"); -#endif +int main(int argc, char* argv[]){ + deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("oxide", argv); auto filter = new EventFilter(&app); diff --git a/applications/lockscreen/lockscreen.pro b/applications/lockscreen/lockscreen.pro index 4018bfef9..8c79b51b5 100644 --- a/applications/lockscreen/lockscreen.pro +++ b/applications/lockscreen/lockscreen.pro @@ -27,6 +27,5 @@ HEADERS += \ RESOURCES += \ qml.qrc -include(../../qmake/epaper.pri) include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) diff --git a/applications/lockscreen/main.cpp b/applications/lockscreen/main.cpp index 946ad7d06..d187c2aad 100644 --- a/applications/lockscreen/main.cpp +++ b/applications/lockscreen/main.cpp @@ -9,28 +9,12 @@ #include "controller.h" -#ifdef __arm__ -Q_IMPORT_PLUGIN(QsgEpaperPlugin) -#endif - using namespace codes::eeems::oxide1; using namespace Oxide; using namespace Oxide::Sentry; -const char* qt_version = qVersion(); - int main(int argc, char *argv[]){ - if (strcmp(qt_version, QT_VERSION_STR) != 0){ - qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; - } -#ifdef __arm__ - // Setup epaper - qputenv("QMLSCENE_DEVICE", "epaper"); - qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); - qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); - qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); -// qputenv("QT_DEBUG_BACKINGSTORE", "1"); -#endif + deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("decay", argv); auto filter = new EventFilter(&app); diff --git a/applications/process-manager/main.cpp b/applications/process-manager/main.cpp index ad47fb2a5..57286d8d9 100755 --- a/applications/process-manager/main.cpp +++ b/applications/process-manager/main.cpp @@ -12,29 +12,12 @@ #include "controller.h" - -#ifdef __arm__ -Q_IMPORT_PLUGIN(QsgEpaperPlugin) -#endif - using namespace std; using namespace Oxide; using namespace Oxide::Sentry; -const char *qt_version = qVersion(); - int main(int argc, char *argv[]){ - if (strcmp(qt_version, QT_VERSION_STR) != 0){ - qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; - } -#ifdef __arm__ - // Setup epaper - qputenv("QMLSCENE_DEVICE", "epaper"); - qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); - qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); - qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); -// qputenv("QT_DEBUG_BACKINGSTORE", "1"); -#endif + deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("erode", argv); app.setOrganizationName("Eeems"); diff --git a/applications/process-manager/process-manager.pro b/applications/process-manager/process-manager.pro index 2d3552b4b..7933c4388 100755 --- a/applications/process-manager/process-manager.pro +++ b/applications/process-manager/process-manager.pro @@ -40,6 +40,5 @@ PRECOMPILED_HEADER = \ LIBS += -lsystemd -include(../../qmake/epaper.pri) include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) diff --git a/applications/screenshot-tool/screenshot-tool.pro b/applications/screenshot-tool/screenshot-tool.pro index 4342a9b2f..5a68359d5 100644 --- a/applications/screenshot-tool/screenshot-tool.pro +++ b/applications/screenshot-tool/screenshot-tool.pro @@ -19,6 +19,5 @@ applications.files = ../../assets/opt/usr/share/applications/codes.eeems.fret.ox applications.path = /opt/usr/share/applications/ INSTALLS += applications -include(../../qmake/epaper.pri) include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) diff --git a/applications/screenshot-viewer/main.cpp b/applications/screenshot-viewer/main.cpp index aedc4c3ef..e2ce0ab6f 100644 --- a/applications/screenshot-viewer/main.cpp +++ b/applications/screenshot-viewer/main.cpp @@ -9,33 +9,17 @@ #include "controller.h" -#ifdef __arm__ -Q_IMPORT_PLUGIN(QsgEpaperPlugin) -#endif - using namespace std; using namespace Oxide; using namespace Oxide::Sentry; -const char* qt_version = qVersion(); - void sigHandler(int signal){ ::signal(signal, SIG_DFL); qApp->quit(); } int main(int argc, char *argv[]){ - if (strcmp(qt_version, QT_VERSION_STR) != 0){ - qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; - } -#ifdef __arm__ - // Setup epaper - qputenv("QMLSCENE_DEVICE", "epaper"); - qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); - qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); - qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); -// qputenv("QT_DEBUG_BACKINGSTORE", "1"); -#endif + deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("anxiety", argv); auto filter = new EventFilter(&app); diff --git a/applications/screenshot-viewer/screenshot-viewer.pro b/applications/screenshot-viewer/screenshot-viewer.pro index 789474b8a..3d162fce0 100644 --- a/applications/screenshot-viewer/screenshot-viewer.pro +++ b/applications/screenshot-viewer/screenshot-viewer.pro @@ -40,6 +40,5 @@ RESOURCES += \ PRECOMPILED_HEADER = \ anxiety_stable.h -include(../../qmake/epaper.pri) include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) diff --git a/applications/system-service/main.cpp b/applications/system-service/main.cpp index 066b65cf4..9c2856789 100755 --- a/applications/system-service/main.cpp +++ b/applications/system-service/main.cpp @@ -11,7 +11,6 @@ using namespace std; using namespace Oxide::Sentry; -const char* qt_version = qVersion(); const std::string runPath = "/run/oxide"; const char* pidPath = "/run/oxide/oxide.pid"; const char* lockPath = "/run/oxide/oxide.lock"; @@ -45,14 +44,7 @@ int main(int argc, char* argv[]){ O_WARNING("rm2fb not detected. Running xochitl instead!"); return QProcess::execute("/usr/bin/xochitl", QStringList()); } - if (strcmp(qt_version, QT_VERSION_STR) != 0){ - O_WARNING("Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR); - } -#ifdef __arm__ - // Setup epaper - qputenv("QMLSCENE_DEVICE", "epaper"); - qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); -#endif + deviceSettings.setupQtEnvironment(false); QGuiApplication app(argc, argv); sentry_init("tarnish", argv); app.setOrganizationName("Eeems"); diff --git a/applications/system-service/system-service.pro b/applications/system-service/system-service.pro index 2e2109a57..299619627 100644 --- a/applications/system-service/system-service.pro +++ b/applications/system-service/system-service.pro @@ -1,4 +1,5 @@ QT += dbus +QT += quick CONFIG += c++17 CONFIG += console @@ -85,7 +86,6 @@ DISTFILES += \ generate_xml.sh \ org.freedesktop.login1.xml -include(../../qmake/epaper.pri) include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) diff --git a/applications/task-switcher/main.cpp b/applications/task-switcher/main.cpp index c56934d0f..a975a2e48 100644 --- a/applications/task-switcher/main.cpp +++ b/applications/task-switcher/main.cpp @@ -12,33 +12,17 @@ #include "screenprovider.h" -#ifdef __arm__ -Q_IMPORT_PLUGIN(QsgEpaperPlugin) -#endif - using namespace std; using namespace Oxide; using namespace Oxide::Sentry; -const char* qt_version = qVersion(); - void sigHandler(int signal){ ::signal(signal, SIG_DFL); qApp->quit(); } int main(int argc, char *argv[]){ - if (strcmp(qt_version, QT_VERSION_STR) != 0){ - qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; - } -#ifdef __arm__ - // Setup epaper - qputenv("QMLSCENE_DEVICE", "epaper"); - qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); - qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); - qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); -// qputenv("QT_DEBUG_BACKINGSTORE", "1"); -#endif + deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("corrupt", argv); auto filter = new EventFilter(&app); diff --git a/applications/task-switcher/task-switcher.pro b/applications/task-switcher/task-switcher.pro index 5f7faa0f2..8abc482a7 100644 --- a/applications/task-switcher/task-switcher.pro +++ b/applications/task-switcher/task-switcher.pro @@ -35,6 +35,5 @@ RESOURCES += \ PRECOMPILED_HEADER = \ corrupt_stable.h -include(../../qmake/epaper.pri) include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) diff --git a/qmake/epaper.pri b/qmake/epaper.pri index f74112c42..bde708a3d 100644 --- a/qmake/epaper.pri +++ b/qmake/epaper.pri @@ -1,2 +1,2 @@ -LIBS += -L$$PWD/../shared/epaper -lqsgepaper -INCLUDEPATH += $$PWD/../shared/epaper +#LIBS += -L$$PWD/../shared/epaper -lqsgepaper +#INCLUDEPATH += $$PWD/../shared/epaper diff --git a/shared/epaper/epframebuffer.h b/shared/epaper/epframebuffer.h index 3c1d7a4a8..868e0ad3c 100644 --- a/shared/epaper/epframebuffer.h +++ b/shared/epaper/epframebuffer.h @@ -10,7 +10,17 @@ #include #include -class EPFrameBuffer : public QObject +#if defined(LIBOXIDE_LIBRARY) +#include "liboxide_global.h" +#ifdef __arm__ +Q_IMPORT_PLUGIN(QsgEpaperPlugin) +#endif +#else +#include +#endif + + +class LIBOXIDE_EXPORT EPFrameBuffer : public QObject { Q_OBJECT diff --git a/shared/liboxide/examples/oxide.cpp b/shared/liboxide/examples/oxide.cpp index 2f5e3fed7..874caa102 100644 --- a/shared/liboxide/examples/oxide.cpp +++ b/shared/liboxide/examples/oxide.cpp @@ -76,3 +76,13 @@ if(lo.exists()){ qCritical("Loopback is missing?"); } //! [SysObject] +//! [setupQtEnvironment] +#include +#ifdef __arm__ +Q_IMPORT_PLUGIN(QsgEpaperPlugin) +#endif + +int main(int argc, char* argv[]){ + deviceSettings.setupQtEnvironment(); +} +//! [setupQtEnvironment] diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index 0687c471f..4f33ee826 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -12,7 +12,6 @@ #include #include - #define BITS_PER_LONG (sizeof(long) * 8) #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) #define OFF(x) ((x)%BITS_PER_LONG) @@ -297,6 +296,20 @@ namespace Oxide { } QProcess::execute("timedatectl", QStringList() << "set-timezone" << timezone); } + void DeviceSettings::setupQtEnvironment(bool touch){ + auto qt_version = qVersion(); + if (strcmp(qt_version, QT_VERSION_STR) != 0){ + qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; + } +#ifdef __arm__ + qputenv("QMLSCENE_DEVICE", "epaper"); + qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); +#endif + if(touch){ + qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); + qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); + } + } WifiNetworks XochitlSettings::wifinetworks(){ beginGroup("wifinetworks"); QMap wifinetworks; diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index 30674200d..d5aed29f9 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -53,7 +53,6 @@ */ #define sharedSettings Oxide::SharedSettings::instance() - /*! * \brief Wifi Network definition */ @@ -117,16 +116,14 @@ namespace Oxide { QTimer* timer = new QTimer(); timer->moveToThread(qApp->thread()); timer->setSingleShot(true); - struct _ { - T value; - } result; + T result; QObject::connect(timer, &QTimer::timeout, [timer, &result, callback](){ // main thread - result.value = callback(); + result = callback(); timer->deleteLater(); }); QMetaObject::invokeMethod(timer, "start", Qt::BlockingQueuedConnection, Q_ARG(int, 0)); - return result.value; + return result; } /*! * \brief Get the UID for a username @@ -233,6 +230,11 @@ namespace Oxide { * \param locale Timezone to set */ void setTimezone(const QString& timezone); + /*! + * \brief Setup the Qt environment + * \snippet examples/oxide.cpp setupQtEnvironment + */ + void setupQtEnvironment(bool touch = true); private: DeviceType _deviceType; diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index d5526977f..f5c9f6413 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -26,6 +26,7 @@ SOURCES += \ signalhandler.cpp HEADERS += \ + ../epaper/epframebuffer.h \ applications.h \ dbus.h \ debug.h \ @@ -65,7 +66,8 @@ liboxide_liboxide_h.target = include/liboxide/liboxide.h liboxide_liboxide_h.commands = \ mkdir -p include/liboxide && \ echo $$HEADERS | xargs -rn1 | xargs -rI {} cp $$PWD/{} include/liboxide/ && \ - echo $$DBUS_INTERFACES | xargs -rn1 | xargs -rI {} basename \"{}\" .xml | xargs -rI {} cp $$OUT_PWD/\"{}\"_interface.h include/liboxide/ + echo $$DBUS_INTERFACES | xargs -rn1 | xargs -rI {} basename \"{}\" .xml | xargs -rI {} cp $$OUT_PWD/\"{}\"_interface.h include/liboxide/ && \ + mv $$OUT_PWD/include/liboxide/epframebuffer.h $$OUT_PWD/include/ liboxide_h.target = include/liboxide.h liboxide_h.depends += liboxide_liboxide_h @@ -85,5 +87,6 @@ include(../../qmake/common.pri) target.path = /opt/lib INSTALLS += target -include(../../qmake/epaper.pri) +LIBS += -L$$PWD/../epaper -lqsgepaper +INCLUDEPATH += $$PWD/../epaper include(../../qmake/sentry.pri) From abd551b0b058acf57f7bd8f34811567354180441 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sun, 9 Jul 2023 18:22:59 -0600 Subject: [PATCH 29/87] Fix issues with wlan (#318) * QML binding error when viewing the wifi list * Use wpa_supplicant to get wlan link speed and rssi, fallback to /proc/net/wireless on failure --- applications/launcher/widgets/WifiMenu.qml | 2 +- applications/system-service/wlan.h | 42 +++++++++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/applications/launcher/widgets/WifiMenu.qml b/applications/launcher/widgets/WifiMenu.qml index b6aad2c1f..aca67bafd 100644 --- a/applications/launcher/widgets/WifiMenu.qml +++ b/applications/launcher/widgets/WifiMenu.qml @@ -79,7 +79,7 @@ Item { boundsBehavior: Flickable.StopAtBounds delegate: Rectangle { id: item - width: parent.width - scrollbar.width + width: networks.width - scrollbar.width height: networkRow.implicitHeight visible: !!model.display RowLayout { diff --git a/applications/system-service/wlan.h b/applications/system-service/wlan.h index 049480b4a..c21e0e420 100644 --- a/applications/system-service/wlan.h +++ b/applications/system-service/wlan.h @@ -56,6 +56,17 @@ class Wlan : public QObject, public SysObject { return ip != "" && (pingIP(ip, "53") || pingIP(ip, "80")); } int link(){ + QDBusPendingReply res = m_interface->SignalPoll(); + res.waitForFinished(); + if(!res.isError()){ + auto props = qdbus_cast(res.value()); + auto result = props["linkspeed"].toInt(); + if(result < 0){ + return 0; + } + return result; + } + O_WARNING("SignalPoll error: " << res.error()); auto out = exec("grep " + iface() + " /proc/net/wireless | awk '{print $3}'"); if(QString(out.c_str()).isEmpty()){ return 0; @@ -67,19 +78,32 @@ class Wlan : public QObject, public SysObject { qDebug() << "link failed: " << out.c_str(); return 0; } + return -100; } signed int rssi(){ - QDBusMessage message = m_interface->call("SignalPoll"); - if (message.type() == QDBusMessage::ErrorMessage) { - O_WARNING("SignalPoll error: " << message.errorMessage()); - return -100; + QDBusPendingReply res = m_interface->SignalPoll(); + res.waitForFinished(); + if(!res.isError()){ + auto props = qdbus_cast(res.value()); + auto result = props["rssi"].toInt(); + if(result >= 0){ + return -100; + } + return result; } - auto props = qdbus_cast(message.arguments().at(0).value().variant().value()); - auto result = props["rssi"].toInt(); - if(result >= 0){ - return -100; + O_WARNING("SignalPoll error: " << res.error()); + auto out = exec("grep " + iface() + " /proc/net/wireless | awk '{print $4}'"); + if(QString(out.c_str()).isEmpty()){ + return 0; + } + try { + return std::stoi(out); + } + catch (const std::invalid_argument& e) { + qDebug() << "signal failed: " << out.c_str(); + return 0; } - return result; + return -100; } signals: void BSSAdded(Wlan*, QDBusObjectPath, QVariantMap); From 2ff7c70064f1b17512f3b20fe7e3a8fe56ef708c Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sun, 9 Jul 2023 19:38:14 -0600 Subject: [PATCH 30/87] Fix #145 Detect usb cable (#319) Fix #145 Detect usb cable --- shared/liboxide/power.cpp | 52 ++++++++++++++++++++++++++++++++++- shared/liboxide/power.h | 5 ++++ shared/liboxide/sysobject.cpp | 29 ++++++++++++++++++- shared/liboxide/sysobject.h | 5 ++++ 4 files changed, 89 insertions(+), 2 deletions(-) diff --git a/shared/liboxide/power.cpp b/shared/liboxide/power.cpp index 64dfa6697..17a3d251f 100644 --- a/shared/liboxide/power.cpp +++ b/shared/liboxide/power.cpp @@ -1,5 +1,6 @@ #include "power.h" #include "debug.h" +#include "liboxide.h" #include #include @@ -9,6 +10,7 @@ using Oxide::SysObject; QList* _batteries = nullptr; QList* _chargers = nullptr; +QList* _usbs = nullptr; void _setup(){ if(_batteries != nullptr && _chargers != nullptr){ @@ -24,6 +26,11 @@ void _setup(){ }else{ _chargers = new QList(); } + if(_usbs != nullptr){ + _usbs->clear(); + }else{ + _usbs = new QList(); + } QDir dir("/sys/class/power_supply"); O_DEBUG("Looking for batteries and chargers..."); for(auto& path : dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Readable)){ @@ -53,6 +60,29 @@ void _setup(){ _chargers->append(battery); } } + auto deviceType = deviceSettings.getDeviceType(); + if(deviceType != Oxide::DeviceSettings::Unknown){ + O_DEBUG("Looking for usbs..."); + dir.setPath("/sys/bus/platform/devices"); + for(QString& path : dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Readable)){ + if( + (deviceType == Oxide::DeviceSettings::RM1 && !path.endsWith(".usbphy")) || + (deviceType == Oxide::DeviceSettings::RM2 && !path.startsWith("usbphy")) + ){ + continue; + } + O_DEBUG((" Checking " + path + "...").toStdString().c_str()); + SysObject item(dir.path() + "/" + path); + if(!item.hasProperty("uevent")){ + O_DEBUG(" Missing uevent property"); + continue; + } + O_DEBUG(" Found USB!"); + _usbs->append(item); + } + }else{ + O_WARNING("Unable to detect usbs due to unknown device type"); + } } int _batteryInt(const QString& property){ int result = 0; @@ -78,6 +108,14 @@ int _chargerInt(const QString& property){ } return result; } +bool _usbPropIs(const QString& property, const QString& value){ + for(SysObject usb : *Oxide::Power::usbs()){ + if(usb.uevent().value(property, "") == value){ + return true; + } + } + return false; +} static const QSet _batteryAlertState { "Overheat", "Dead", @@ -104,6 +142,10 @@ namespace Oxide::Power { _setup(); return _chargers; } + const QList* usbs(){ + _setup(); + return _usbs; + } int batteryLevel(){ return _batteryInt("capacity") / _batteries->length(); } int batteryTemperature(){ return _batteryIntMax("temp") / 10; } bool batteryCharging(){ @@ -156,5 +198,13 @@ namespace Oxide::Power { } bool batteryHasWarning(){ return batteryWarning().length(); } bool batteryHasAlert(){ return batteryAlert().length(); } - bool chargerConnected(){ return batteryCharging() || _chargerInt("online"); } + bool chargerConnected(){ + if(batteryCharging() || _chargerInt("online")){ + return true; + } + if(deviceSettings.getDeviceType() == DeviceSettings::DeviceType::Unknown){ + return false; + } + return _usbPropIs("USB_CHARGER_STATE", "USB_CHARGER_PRESENT"); + } } diff --git a/shared/liboxide/power.h b/shared/liboxide/power.h index c4b849b71..808216baf 100644 --- a/shared/liboxide/power.h +++ b/shared/liboxide/power.h @@ -27,6 +27,11 @@ namespace Oxide::Power { * \return The list of charger objects */ LIBOXIDE_EXPORT const QList* chargers(); + /*! + * \brief Get a list of usb objects + * \return The list of usb objects + */ + LIBOXIDE_EXPORT const QList* usbs(); /*! * \brief Get the current battery level. This is averaged across the number of batteries connected to the device. * \return The current battery level diff --git a/shared/liboxide/sysobject.cpp b/shared/liboxide/sysobject.cpp index ddb5c677c..972e449fc 100644 --- a/shared/liboxide/sysobject.cpp +++ b/shared/liboxide/sysobject.cpp @@ -25,6 +25,9 @@ namespace Oxide{ return dir.exists(); } int SysObject::intProperty(const std::string& name){ + if(!hasProperty(name)){ + return 0; + } try { return std::stoi(strProperty(name)); } @@ -37,7 +40,7 @@ namespace Oxide{ auto path = propertyPath(name); QFile file(path.c_str()); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){ - O_DEBUG("Couldn't find the file " << path.c_str()); + O_DEBUG("Couldn't find the file:" << path.c_str()); return "0"; } QTextStream in(&file); @@ -48,5 +51,29 @@ namespace Oxide{ }).base(), text.end()); return text; } + QMap SysObject::uevent(){ + auto path = propertyPath("uevent"); + QFile file(path.c_str()); + QMap props; + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){ + O_DEBUG("Couldn't find the file:" << path.c_str()); + return props; + } + QTextStream in(&file); + do{ + auto line = in.readLine(); + // doesn't always properly provide EOF + if(line.trimmed().isEmpty()){ + break; + } + auto parts = line.split("="); + if(parts.length() != 2){ + O_WARNING("Invalid uevent line" << line); + continue; + } + props.insert(parts.first().trimmed(), parts.last().trimmed()); + }while(!in.atEnd()); + return props; + } } diff --git a/shared/liboxide/sysobject.h b/shared/liboxide/sysobject.h index 5b4579899..f58e8d8e3 100644 --- a/shared/liboxide/sysobject.h +++ b/shared/liboxide/sysobject.h @@ -63,6 +63,11 @@ namespace Oxide { * \return The path to the named property */ std::string propertyPath(const std::string& name); + /*! + * \brief Get the contents of uevent for this sysobject + * \return uevent properties + */ + QMap uevent(); private: std::string m_path; From 3b5701a8fd1cf17b299654496b5fa0a737a9cd1f Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 24 Jul 2023 10:07:14 -0600 Subject: [PATCH 31/87] Add gesture faq (#323) --- web/src/faq.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/web/src/faq.rst b/web/src/faq.rst index 45f08d241..e123a271b 100644 --- a/web/src/faq.rst +++ b/web/src/faq.rst @@ -139,3 +139,18 @@ The primary configuration file can be found in one of the following locations: 3. ``/home/root/.config/oxide.conf`` Other configuration files can be found in ``/home/root/.config/Eeems/``. + +Can I disable a specific gesture? +================================= + +Yes, you can disable specific gestures with the following commands: + +.. code:: bash + # Disable swipe from left edge of the screen + rot system call setSwipeEnabled 'int:1' 'bool:false' + # Disable swipe from right edge of the screen + rot system call setSwipeEnabled 'int:2' 'bool:false' + # Disable swipe from bottom of the screen + rot system call setSwipeEnabled 'int:3' 'bool:false' + # Disable swipe from top of the screen + rot system call setSwipeEnabled 'int:4' 'bool:false' From 2bb546bbd7964abce2a51d83313c8017a32ba061 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 24 Jul 2023 10:13:57 -0600 Subject: [PATCH 32/87] Update telemetry faq --- web/src/faq.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/web/src/faq.rst b/web/src/faq.rst index e123a271b..45e930c66 100644 --- a/web/src/faq.rst +++ b/web/src/faq.rst @@ -32,13 +32,23 @@ What kind of information is collected by telemetry? How can I disable the telemetry? ================================ +As of 2.6 you can disable telemetry with the following commands: + .. code:: bash xdg-settings set telemetry false xdg-settings set crashReport false xdg-settings set applicationUsage false -Or you can compile the applications manually without the ``sentry`` feature enabled. +On 2.5 or earlier you can use the following commands to disable telemetry: + +.. code:: bash + + rot settings set telemetry 'bool:false' + rot settings set crashReport 'bool:false' + rot settings set applicationUsage 'bool:false' + +Alternatively, you can compile the applications manually without the ``sentry`` feature enabled. How can I get the time to display in my timezone? ================================================= @@ -146,6 +156,7 @@ Can I disable a specific gesture? Yes, you can disable specific gestures with the following commands: .. code:: bash + # Disable swipe from left edge of the screen rot system call setSwipeEnabled 'int:1' 'bool:false' # Disable swipe from right edge of the screen From 55798234ba7bf525093a18bc35c74a16a968c5f3 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 24 Jul 2023 10:24:06 -0600 Subject: [PATCH 33/87] Switch to using github pages (#324) --- .github/workflows/publish.yml | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fcdb384b1..1e8a369d5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,7 +10,7 @@ on: - '.github/actions/sync-repository/**' workflow_dispatch: jobs: - publish: + build: name: Build and publish the website runs-on: ubuntu-20.04 steps: @@ -20,10 +20,21 @@ jobs: submodules: true - name: Build web uses: ./.github/actions/web - - name: Sync website with the remote repository - uses: ./.github/actions/sync-repository + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 with: - local-path: web/dist/ - ssh-key: ${{ secrets.SSH_PRIVATE_KEY }} - ssh-known-hosts: ${{ secrets.SSH_KNOWN_HOSTS }} - remote-path: ${{ secrets.REMOTE_SSH }}:/_web + path: 'web/dist/' + deploy: + needs: build + if: ${{ github.ref == 'refs/heads/main' }} + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 From a2063495509b367ee5db796a29ea13a4ab3c1d93 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 24 Jul 2023 10:29:19 -0600 Subject: [PATCH 34/87] Fix branch name --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1e8a369d5..8720bae13 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -26,7 +26,7 @@ jobs: path: 'web/dist/' deploy: needs: build - if: ${{ github.ref == 'refs/heads/main' }} + if: ${{ github.ref == 'refs/heads/master' }} permissions: pages: write id-token: write From f545facefc7f4eecee9aa1f7176c6bbb6cd7eee0 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 24 Jul 2023 10:29:55 -0600 Subject: [PATCH 35/87] Update path to run publish on --- .github/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8720bae13..2721234a3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,6 +6,7 @@ on: paths: - 'web/**' - 'shared/liboxide/**' + - '.github/workflows/publish.yml' - '.github/actions/web/**' - '.github/actions/sync-repository/**' workflow_dispatch: From b5b37efe5e7b6e4c461e545ebcec7a7f29a92622 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sat, 29 Jul 2023 12:36:56 -0600 Subject: [PATCH 36/87] Update wiki link (#325) --- web/src/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/index.rst b/web/src/index.rst index 14df8f7d8..8d7456194 100644 --- a/web/src/index.rst +++ b/web/src/index.rst @@ -27,7 +27,7 @@ Install Oxide .. raw:: html
- ⚠️ Warning: Since this changes what application is launched on boot, you'll want to make sure you have your SSH password written down, and it's recommended to setup an SSH key. + ⚠️ Warning: Since this changes what application is launched on boot, you'll want to make sure you have your SSH password written down, and it's recommended to setup an SSH key.

Oxide is available in From 0eba570ae9998cfd16d142639a39dd15b51282c8 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sat, 26 Aug 2023 15:05:22 -0600 Subject: [PATCH 37/87] Fix uninstall instructions --- web/src/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/index.rst b/web/src/index.rst index 8d7456194..1fcb586dc 100644 --- a/web/src/index.rst +++ b/web/src/index.rst @@ -47,4 +47,4 @@ Uninstall Oxide 1. ``systemctl disable --now tarnish`` 2. ``systemctl enable --now xochitl`` -3. ``opkg remove erode fret oxide rot tarnish decay corrupt anxiety liboxide libsentry`` +3. ``opkg remove -force-removal-of-dependent-packages liboxide`` From 956ee15e34b08b57d328438288e7e67c727dcca6 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 6 Sep 2023 23:24:33 -0600 Subject: [PATCH 38/87] Create sentry releases and upload debug files --- .github/workflows/build.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6cda89c0c..c927ad38a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,3 +45,36 @@ jobs: with: name: packages path: release + - name: Save packages + uses: actions/upload-artifact@v3 + with: + name: build + path: package/dist + release: + needs: build + if: ${{ github.ref == 'refs/heads/main' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/download-artifact@v3 + with: + name: build + - name: Create Sentry release + uses: getsentry/action-release@v1 + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: ${{ secrets.SENTRY_ORG }} + SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + SENTRY_URL: https://sentry.eeems.codes + - name: Setup Sentry CLI + uses: mathieu-bour/setup-sentry-cli@v1 + with: + version: latest + url: https://sentry.eeems.codes + token: ${{ secrets.SENTRY_AUTH_TOKEN }} + organization: ${{ secrets.SENTRY_ORG }} + project: ${{ secrets.SENTRY_PROJECT }} + - name: Upload debug artifacts + run: sentry-cli debug-files upload --include-sources . From 0b0d4971b23dc40bfacde82e6e5b9a09a411d9a2 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 6 Sep 2023 23:32:58 -0600 Subject: [PATCH 39/87] Update to python 3.11 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c927ad38a..3a960f58c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: '3.10' + python-version: '3.11' - name: Install toltecmk run: pip install toltecmk requests==2.26.0 - name: Build packages From db577e022a0dc54fc155c783a9b0c5859d494749 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 6 Sep 2023 23:45:34 -0600 Subject: [PATCH 40/87] fix path --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3a960f58c..b1c2d71b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,7 +49,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: build - path: package/dist + path: .build/package/dist release: needs: build if: ${{ github.ref == 'refs/heads/main' }} From d9b858f502bb23a291be1e26f533d0eabaa414b0 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 6 Sep 2023 23:57:57 -0600 Subject: [PATCH 41/87] Fix branch name --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b1c2d71b4..e103f1467 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -52,7 +52,7 @@ jobs: path: .build/package/dist release: needs: build - if: ${{ github.ref == 'refs/heads/main' }} + if: ${{ github.ref == 'refs/heads/master' }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From 527145498558fa53b40902188e06c88234333f1d Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 7 Sep 2023 11:16:17 -0600 Subject: [PATCH 42/87] Download artifact to the same path --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e103f1467..96b31d3b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,6 +61,7 @@ jobs: - uses: actions/download-artifact@v3 with: name: build + path: .build - name: Create Sentry release uses: getsentry/action-release@v1 env: From f5bbb9988584ab2d56d207ff285a2e18f14d8b47 Mon Sep 17 00:00:00 2001 From: Tom Parker-Shemilt Date: Thu, 5 Oct 2023 23:23:32 +0100 Subject: [PATCH 43/87] xdg-settings wasn't getting installed (#329) --- package | 1 + 1 file changed, 1 insertion(+) diff --git a/package b/package index 25c7ebb91..4bd413e2e 100644 --- a/package +++ b/package @@ -157,6 +157,7 @@ oxide-utils() { install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/xdg-desktop-menu install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/xdg-desktop-icon install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/xdg-open + install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/xdg-settings install -D -m 755 -t "$pkgdir"/opt/bin "$srcdir"/release/opt/bin/gio } } From fef85615ac46501f463ab6c38c621d34e7bb604e Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 4 Dec 2023 21:48:26 -0700 Subject: [PATCH 44/87] Bump package version --- package | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package b/package index 4bd413e2e..e44b576f6 100644 --- a/package +++ b/package @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide libsentry) -_oxidever=2.6 +_oxidever=2.7 pkgver="$_oxidever~VERSION~" _sentryver=0.5.0 timestamp="$(date -u +%Y-%m-%dT%H:%MZ)" From 5d773c0415e90aa4713a67fbcd6779af1802b888 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 6 Dec 2023 14:54:01 -0700 Subject: [PATCH 45/87] Add missing reboot-guard dependency --- package | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package b/package index e44b576f6..f67a7f70e 100644 --- a/package +++ b/package @@ -61,7 +61,7 @@ build() { oxide() { pkgdesc="Launcher application" section="launchers" - installdepends=("oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver") + installdepends=("oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver" "reboot-guard") replaces=(erode tarnish decay corrupt) conflicts=(erode tarnish decay corrupt) From 0c1192c3ae8881a2faca5739007ef41722994011 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 12 Dec 2023 18:09:28 -0700 Subject: [PATCH 46/87] Add liboxide-dev package with headers and pkg-conf file (#334) * Install headers and privide pkg-config file * Get package build working --- Makefile | 2 ++ package | 15 ++++++++++++++- shared/liboxide/liboxide.pro | 21 ++++++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 65eb2c40b..c3e3a5a4c 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,8 @@ clean: release: clean build $(RELOBJ) mkdir -p $(DIST) + # Force liboxide makefile to regenerate so that install targets get when being build in toltecmk + cd $(BUILD)/oxide/shared/liboxide && make qmake INSTALL_ROOT=$(DIST) $(MAKE) -C $(BUILD)/oxide install build: $(BUILD) $(OBJ) diff --git a/package b/package index f67a7f70e..27d8a0680 100644 --- a/package +++ b/package @@ -2,7 +2,7 @@ # Copyright (c) 2020 The Toltec Contributors # SPDX-License-Identifier: MIT -pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide libsentry) +pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide liboxide-dev libsentry) _oxidever=2.7 pkgver="$_oxidever~VERSION~" _sentryver=0.5.0 @@ -181,6 +181,19 @@ liboxide() { } } +liboxide-dev() { + pkgdesc="Shared library for oxide applications" + section="devel" + installdepends=("liboxide=$pkgver") + + package() { + install -D -m 755 -t "$pkgdir"/opt/lib/pkgconfig "$srcdir"/release/opt/lib/pkgconfig/liboxide.pc + install -D -m 755 -t "$pkgdir"/opt/include "$srcdir"/release/opt/include/epframebuffer.h + install -D -m 755 -t "$pkgdir"/opt/include "$srcdir"/release/opt/include/liboxide.h + cp -ar "$srcdir"/release/opt/include/liboxide/ "$pkgdir"/opt/include/ + } +} + libsentry() { pkgdesc="Sentry SDK for C, C++ and native applications." section="devel" diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index f5c9f6413..b3eb5a6d9 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -8,6 +8,9 @@ DEFINES += LIBOXIDE_LIBRARY CONFIG += c++11 CONFIG += warn_on CONFIG += precompile_header +CONFIG += create_pc +CONFIG += create_prl +CONFIG += no_install_prl DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 @@ -78,7 +81,15 @@ liboxide_h.commands = \ clean_headers.target = include/.clean-target clean_headers.commands = rm -rf include -QMAKE_EXTRA_TARGETS += liboxide_liboxide_h liboxide_h clean_headers +liboxide_h_install.files = \ + include/liboxide.h \ + include/liboxide \ + include/epframebuffer.h +liboxide_h_install.depends = liboxide_h +liboxide_h_install.path = /opt/include/ +INSTALLS += liboxide_h_install + +QMAKE_EXTRA_TARGETS += liboxide_liboxide_h liboxide_h clean_headers liboxide_h_install PRE_TARGETDEPS += $$clean_headers.target POST_TARGETDEPS += $$liboxide_liboxide_h.target $$liboxide_h.target QMAKE_CLEAN += $$liboxide_h.target include/liboxide/*.h @@ -90,3 +101,11 @@ INSTALLS += target LIBS += -L$$PWD/../epaper -lqsgepaper INCLUDEPATH += $$PWD/../epaper include(../../qmake/sentry.pri) + +QMAKE_PKGCONFIG_NAME = liboxide +QMAKE_PKGCONFIG_DESCRIPTION = Shared library for Oxide application development +QMAKE_PKGCONFIG_VERSION = $$VERSION +QMAKE_PKGCONFIG_PREFIX = /opt +QMAKE_PKGCONFIG_LIBDIR = /opt/lib +QMAKE_PKGCONFIG_INCDIR = /opt/include +QMAKE_PKGCONFIG_DESTDIR = pkgconfig From 92ad08da38309570e22916c43dd74ca585ae1599 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 12 Dec 2023 18:21:29 -0700 Subject: [PATCH 47/87] Fix build artifact upload --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96b31d3b4..e3df07680 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,7 +49,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: build - path: .build/package/dist + path: .build/package/build/rmall/src/release release: needs: build if: ${{ github.ref == 'refs/heads/master' }} From 3115baa97cc4f5644940c99cf1723002bf7e2135 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 14 Dec 2023 22:29:00 -0700 Subject: [PATCH 48/87] Automate testing (#335) * Automate testing * Speed up package build --- .github/workflows/build.yml | 31 ++++++++++- Makefile | 6 ++- applications/applications.pro | 2 +- applications/launcher/appitem.cpp | 2 + applications/launcher/controller.cpp | 2 + applications/system-service/apibase.cpp | 2 + applications/system-service/application.cpp | 2 + applications/system-service/appsapi.cpp | 2 + applications/system-service/bss.cpp | 2 + applications/system-service/buttonhandler.cpp | 2 + applications/system-service/network.cpp | 2 + applications/system-service/notification.cpp | 2 + applications/system-service/screenapi.cpp | 2 + applications/system-service/screenshot.cpp | 2 + applications/system-service/systemapi.cpp | 2 + applications/system-service/wlan.cpp | 2 + .../system-service/wpa_supplicant.cpp | 1 + applications/task-switcher/appitem.cpp | 2 + shared/liboxide/eventfilter.cpp | 2 + shared/liboxide/liboxide.cpp | 2 + shared/liboxide/settingsfile.cpp | 2 + shared/liboxide/signalhandler.cpp | 2 + .../breakpad/src/client/mac/gcov/libgcov.a | Bin 0 -> 35048 bytes shared/sentry/src/external/crashpad/Makefile | 36 +++++++++++++ .../crashpad/third_party/libfuzzer/BUILD.gn | 49 ++++++++++++++++++ web/src/index.rst | 2 +- 26 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 shared/sentry/src/external/breakpad/src/client/mac/gcov/libgcov.a create mode 100644 shared/sentry/src/external/crashpad/Makefile create mode 100644 shared/sentry/src/external/crashpad/third_party/libfuzzer/BUILD.gn diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e3df07680..5c253f2da 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,8 +50,37 @@ jobs: with: name: build path: .build/package/build/rmall/src/release + - name: Save repo + uses: actions/upload-artifact@v3 + with: + name: repo + path: .build/package/dist/rmall + test: + name: Test packages + runs-on: ubuntu-latest + needs: [build] + steps: + - uses: actions/download-artifact@v3 + id: download + with: + name: repo + - uses: Eeems-Org/run-in-remarkable-action@v1 + with: + setup: | + set -ex + echo "src/gz local-rmall file:///opt/tmp/src" > /opt/etc/opkg.conf.d/16-local.conf + run: | + set -ex + echo Y | toltecctl generate-opkg-conf + opkg update + opkg install oxide + # systemctl disable --now xochitl + # systemctl enable --now tarnish + # TODO install and run tests + opkg remove --force-removal-of-dependent-packages liboxide + path: ${{ steps.download.outputs.download-path }} release: - needs: build + needs: [build,test] if: ${{ github.ref == 'refs/heads/master' }} runs-on: ubuntu-latest steps: diff --git a/Makefile b/Makefile index c3e3a5a4c..eaafe5c3a 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ all: release .NOTPARALLEL: +MAKEFLAGS := --jobs=$(shell nproc) + # FEATURES += sentry DIST=$(CURDIR)/release @@ -25,10 +27,10 @@ release: clean build $(RELOBJ) mkdir -p $(DIST) # Force liboxide makefile to regenerate so that install targets get when being build in toltecmk cd $(BUILD)/oxide/shared/liboxide && make qmake - INSTALL_ROOT=$(DIST) $(MAKE) -C $(BUILD)/oxide install + INSTALL_ROOT=$(DIST) $(MAKE) --output-sync=target -C $(BUILD)/oxide install build: $(BUILD) $(OBJ) - $(MAKE) -C $(BUILD)/oxide all + $(MAKE) --output-sync=target -C $(BUILD)/oxide all package: REV="~r$(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)" package: diff --git a/applications/applications.pro b/applications/applications.pro index b841c24a1..5af838250 100644 --- a/applications/applications.pro +++ b/applications/applications.pro @@ -38,7 +38,7 @@ xdg-open.depends = system-service gio.depends = system-service xdg-settings.depends = system-service xdg-icon-resource.depends = system-service -desktop-file-edit.depends = desktop-file-edit +desktop-file-edit.depends = desktop-file-install.depends = inject_evdev.depends = diff --git a/applications/launcher/appitem.cpp b/applications/launcher/appitem.cpp index 3f238f93f..05c7c53e8 100755 --- a/applications/launcher/appitem.cpp +++ b/applications/launcher/appitem.cpp @@ -61,3 +61,5 @@ Application* AppItem::getApp(){ app = instance; return app; } + +#include "moc_appitem.cpp" diff --git a/applications/launcher/controller.cpp b/applications/launcher/controller.cpp index 4719e9f38..0a2564219 100644 --- a/applications/launcher/controller.cpp +++ b/applications/launcher/controller.cpp @@ -415,3 +415,5 @@ void Controller::setLockAfter(int lockAfter){ qDebug() << "Lock After: " << lockAfter << " minutes"; emit lockAfterChanged(m_lockAfter); } + +#include "moc_controller.cpp" diff --git a/applications/system-service/apibase.cpp b/applications/system-service/apibase.cpp index 696d1c70b..c295f2183 100644 --- a/applications/system-service/apibase.cpp +++ b/applications/system-service/apibase.cpp @@ -20,3 +20,5 @@ int APIBase::hasPermission(QString permission, const char* sender){ qDebug() << "app not found, permission granted"; return true; } + +#include "moc_apibase.cpp" diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index 98788cd4a..641cbd638 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -554,3 +554,5 @@ void Application::startSpan(std::string operation, std::string description){ } span = Oxide::Sentry::start_span(transaction, operation, description); } + +#include "moc_application.cpp" diff --git a/applications/system-service/appsapi.cpp b/applications/system-service/appsapi.cpp index 9b961d91a..0976e541e 100644 --- a/applications/system-service/appsapi.cpp +++ b/applications/system-service/appsapi.cpp @@ -184,3 +184,5 @@ void AppsAPI::ensureForegroundApp() { } }); } + +#include "moc_appsapi.cpp" diff --git a/applications/system-service/bss.cpp b/applications/system-service/bss.cpp index fee45ab41..e58d531fe 100644 --- a/applications/system-service/bss.cpp +++ b/applications/system-service/bss.cpp @@ -36,3 +36,5 @@ QDBusObjectPath BSS::network(){ } bool BSS::hasPermission(QString permission, const char* sender){ return wifiAPI->hasPermission(permission,sender); } + +#include "moc_bss.cpp" diff --git a/applications/system-service/buttonhandler.cpp b/applications/system-service/buttonhandler.cpp index cbb8693fa..b2e58ac0a 100644 --- a/applications/system-service/buttonhandler.cpp +++ b/applications/system-service/buttonhandler.cpp @@ -111,3 +111,5 @@ void ButtonHandler::pressKey(Qt::Key key){ } press_button(buttons, code, &stream); } + +#include "moc_buttonhandler.cpp" diff --git a/applications/system-service/network.cpp b/applications/system-service/network.cpp index 86dc0da4c..fdd5d6b08 100644 --- a/applications/system-service/network.cpp +++ b/applications/system-service/network.cpp @@ -71,3 +71,5 @@ QList Network::bSSs(){ } bool Network::hasPermission(QString permission, const char* sender){ return wifiAPI->hasPermission(permission, sender); } + +#include "moc_network.cpp" diff --git a/applications/system-service/notification.cpp b/applications/system-service/notification.cpp index d876af7d0..db410c360 100644 --- a/applications/system-service/notification.cpp +++ b/applications/system-service/notification.cpp @@ -99,3 +99,5 @@ void Notification::setIcon(QString icon){ } bool Notification::hasPermission(QString permission, const char* sender){ return notificationAPI->hasPermission(permission, sender); } + +#include "moc_notification.cpp" diff --git a/applications/system-service/screenapi.cpp b/applications/system-service/screenapi.cpp index 640e4ea65..003850fb9 100644 --- a/applications/system-service/screenapi.cpp +++ b/applications/system-service/screenapi.cpp @@ -27,3 +27,5 @@ QDBusObjectPath ScreenAPI::screenshot(){ return path; }); } + +#include "moc_screenapi.cpp" diff --git a/applications/system-service/screenshot.cpp b/applications/system-service/screenshot.cpp index 7e668f0f5..3495e34ae 100644 --- a/applications/system-service/screenshot.cpp +++ b/applications/system-service/screenshot.cpp @@ -2,3 +2,5 @@ #include"screenapi.h" bool Screenshot::hasPermission(QString permission, const char* sender){ return screenAPI->hasPermission(permission, sender); } + +#include "moc_screenshot.cpp" diff --git a/applications/system-service/systemapi.cpp b/applications/system-service/systemapi.cpp index b03d92fab..2becc5c76 100644 --- a/applications/system-service/systemapi.cpp +++ b/applications/system-service/systemapi.cpp @@ -260,3 +260,5 @@ void SystemAPI::toggleSwipes(){ notification->setText(message); notification->display(); } + +#include "moc_systemapi.cpp" diff --git a/applications/system-service/wlan.cpp b/applications/system-service/wlan.cpp index 1de1bd596..0703cec26 100644 --- a/applications/system-service/wlan.cpp +++ b/applications/system-service/wlan.cpp @@ -65,3 +65,5 @@ std::string Wlan::exec(QString cmd) { } return result; } + +#include "moc_wlan.cpp" diff --git a/applications/system-service/wpa_supplicant.cpp b/applications/system-service/wpa_supplicant.cpp index f5b5bc495..d4631dfd5 100644 --- a/applications/system-service/wpa_supplicant.cpp +++ b/applications/system-service/wpa_supplicant.cpp @@ -63,3 +63,4 @@ FiW1Wpa_supplicant1NetworkInterface::~FiW1Wpa_supplicant1NetworkInterface() { } +#include "moc_wpa_supplicant.cpp" diff --git a/applications/task-switcher/appitem.cpp b/applications/task-switcher/appitem.cpp index 9f860158f..2039d5b13 100755 --- a/applications/task-switcher/appitem.cpp +++ b/applications/task-switcher/appitem.cpp @@ -60,3 +60,5 @@ Application* AppItem::getApp(){ app = instance; return app; } + +#include "moc_appitem.cpp" diff --git a/shared/liboxide/eventfilter.cpp b/shared/liboxide/eventfilter.cpp index 9d1e2dd16..c207f825d 100644 --- a/shared/liboxide/eventfilter.cpp +++ b/shared/liboxide/eventfilter.cpp @@ -152,3 +152,5 @@ namespace Oxide{ return filtered; } } + +#include "moc_eventfilter.cpp" diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index 4f33ee826..da5e27ba4 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -357,3 +357,5 @@ namespace Oxide { O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onLogin) O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onFailedLogin) } + +#include "moc_liboxide.cpp" diff --git a/shared/liboxide/settingsfile.cpp b/shared/liboxide/settingsfile.cpp index e8223351e..55f935f55 100644 --- a/shared/liboxide/settingsfile.cpp +++ b/shared/liboxide/settingsfile.cpp @@ -147,3 +147,5 @@ namespace Oxide { return property(propertyName.toStdString().c_str()).toString(); } } + +#include "moc_settingsfile.cpp" diff --git a/shared/liboxide/signalhandler.cpp b/shared/liboxide/signalhandler.cpp index 3ea1059fd..5c4413981 100644 --- a/shared/liboxide/signalhandler.cpp +++ b/shared/liboxide/signalhandler.cpp @@ -82,3 +82,5 @@ namespace Oxide { snUsr2->setEnabled(true); } } + +#include "moc_signalhandler.cpp" diff --git a/shared/sentry/src/external/breakpad/src/client/mac/gcov/libgcov.a b/shared/sentry/src/external/breakpad/src/client/mac/gcov/libgcov.a new file mode 100644 index 0000000000000000000000000000000000000000..f45a58d71d01b554fbf4db03f4805f2123797e18 GIT binary patch literal 35048 zcmeHw4}4VBmH&N{2|QrpOk|{EjXFqJp&}%0(8(V)NtqA?Y+Mte6-`1C{;d3oWP-s? z$i&ImynRd?3j9i2u%S|ymGoEo6D(F@15y%N+8?#F%dchIxMjDK6}z#rHd@O3zUSWi zX5NH^NWk6gZr_KObM8I&o_p@O=bU@refJGNxcJ>y8DkdQV{s?p&R{I33y|`z$Biqe zpRt7lKrEBU|1hB{LXX0@#*`mI3=`GWIxNeimb`fUO?J zHUL)K#n^SS-p7&le2lR)nf?Qy<2J@_p?bG7HV&{Pow4bXj;g%9`4U!0xL(4bgkP5M zTN3t2_-hHbgKv3x`SPl@>&vTFt*xtxrIxL#uUipItz5Ix7fY(|t+T)w8JI+j~kQ}cK%@#MOdzM4z8iQK{LM6R!LdHJfE zHOqZ*Sp~t|(8{|!cgiPuY`oyy9YZ!x_W_~XnXwFwNGTM6y?4INcHI+ zBg>VS`)V3|@k-_8rQXG*@ibwFQ$>Bk&)vY-^MqJgfB;?P+%f@Bya(VgR)UU2B_f;;%aN{a3 zpSQ3C-ffi41&@-g&6 z^Y-e&jX=8dsY3uZ0r*gL=R3eK+MQ3rvFPzSWpw)uz>0VW{rboIUm3A!DWpDi= z3WXa_YW{SU%8Wx&%Sw-Y1qDJ~zVVS4fCN2O-><^K7hzEv$`HLC+4?Iagf(*bK3yMAlE!(KC#5Zj1BpxJ8xG0U9d=HWbBZ_Zqcaf7yC>yQQ zH>$y-X}odpeE6Z@IY*=hEcF-9qp*Hm=(sOkFH%EY^)ta8JdPu~n+%S17jb=ylHEmQ zFibCU29G)(c??~7*cEzx!w(~W4Sl?M)R5N}QKh_J0-xrMY7`UhlQ*D+u+yVGtcK@2 zlNLN`9Dj|stks;epbYJzR%<1d%W9nTuu)AfvuPz(Ss5zP>q)EJDx~FnpNevYv;YflwCY7xKB|;I zm!pq!RMi*RK+sCltr4;feXc`a~<2f#UQJMyeEVDs*5UOu3vJI7`MSgZc3~@Dj zkFM(v+om7Me!s3*DYAxMuU{N~Ag#NI+r0L$Ep7r75lCoZ3Y$r|pW6{nBbKBhn^t7Y z?tXHb{-Wd=E`25~Y#pl=soF`y9>7<(HbdQSwomU?Hag^ZXTJXCFCm*Sl^lqszjz#c z#TX?=mi`G&2MgrZ;8hRzTF3x}s=i3&xYBA!k^zfWWR>Ouj47i45) z`D(P2ha;|5?|FibR`0(PR9n68wwC?jn72RcnD_0BW8UB6ey1ReQghNBVQ)YAfL>q& zP{YA*BR+8ff<82vybofLCVH`C%Ipdr&3fd~*SN_D)X@2iNG0UJQ0oq87#=c%TV#X` z1a4jl+tQ!1>0AB;Hujgswt7!%hY!EudX=13>&ZNMc;MEl-?{m)Re3%0h;lsmJ0*BA zTK_M>ZY9uon$`bE;}v!NJyeH-P0@pdk--*PwJjX?s@oxK9JnU;HwS*#Rdihu*cfY=moS2To8->ZHHH?li5F zfvATl`EI^TvA48ynfL44C@ZND-n3sYOhaIAc?Oj3&}n1?VS4=`y|GI>(1og_oZf`kET@9^5X42d=jU)P8t`0v6bcbka zs4;G(zjaulXpMtcUf8+y=P z=tAXaccEAW6^hl5jKDMj@PW3FF0Q9Oaz^ACIbbVVdAHD|_!j7)1>h6xQZ#`?;8$~K ztrRLoelE8nd&|AZ2?ytij@sm470UjXA-nI7Gz6VgClswer5{Kq?A`hw=-#bpHuTrf zr5>I}na9xpr9xCh^S0?B%GSJF_0SBCY}Z2>9ND3VvN+PNhddnFt%veBvPTc)bEHF# z`$n>ycQ3J=ZeckGP6dydEk_UTq;L~*g9mAgCZ29YZ0X6T6{E!Op0irU8NLQRQ8JsBdT;%U~85&L+g&S#+)BG+JKLE#l3IRK& zQ~RbRAcnWNNk9xJts(Sag4Mb(+I?QCRJJMfx;^wBxaM*#+Cy&v4=-%f!dnU9!=N2# z0p1rwZHVK==2_v@EcS;xZfCY;UmWUdSGaa z4`3$j_HKesqkVii$*o7@mZXPDkgabk#or_zHzvveMEM%e*F%0PQx?eHwgia%^Up&* zB~$@Cbz3!&cqh5BlFeXMYj62AH&(KxTOZe0~d;7i#$MxH? zLyJMO2g#i@j%&OZeYwP^keg4KWaa*=-*45|smj}0nEX02WdN1vk)&lJS%wqI=8I_K zIs4Wl_Ltrd4ve#h{AeZ=wTCXic{p*GJ+uOOdWhR2JbfOjN%j`v^*eI2LMPBr1ZXJg zYt^}7=5q5#oFmaXNdm2tOtbGBv;YzrdFhb}FwnkCbh|qg0TuEf4(*nhzKt*u#F9#! z+O{)Dk}si;Ojx}V*?JyD!bH&(ibV@4eSoLM$~g}i-Jw&GXLra3i9|blc-}7M&0B(; zt~7^4mW2g7sX{W06h-+QVSg!1SwHO+(I8ah@*USZiJ2bat@#hCTIV?w(FT+*J`rpq zZkjVa(*F+0$jkb|r=X}%<@506aF8}P`ZS>Nm4N7X-ycyp{@}9bcMy0p zIae^B!kPChmJ~Df#G`Zg3=b~aS#s=t{g!;8uFzttC>)v@kbcs6vr{&nM_ zLmzv%H%VV)rOC%wNsyn=PD-%b_T~``-nu)Mvf6cPm#tidJ-D2ybvX}X`)cLdHSX0b z>sD9#s#dt~bk{W0)>Qdws@+p(X4Scuuk~?cd}6&%R<2nC3T+ExnUY9*0E9|6?MAw* zD}9x2v{o~oEvsKsCBaUsdurXFc0aYgX5F$?YoBz}-Yohs zi0oar4z*&mM7idzS--Zbl4OWCa;Lj)?dqDioOSNil^fhED%aPzm)6v*aj&acy>@*~ z^;8I(ptqPDwDUZi95LGYYkZL#(xs=Rzs3$?Zw8Z3a(OD-O?#iXb}dHUr*UKGlS=`S zol*e$7bHE34a^xx--mrDDo<$#(ha8cx3DEa_4i0P&yiUF-|&b|^fMA3k?<7>gLbx? z8aDXjk$(4=O#G+Ia{KX!OnllTOp)*cf*s|blkf!zLn&Mj4U@rLZ^fX zo(biCfelj9+m9x&-LzM0$oU%5`%Q9oApN2#T`23#9#rpkq;ECx8HaKt|GRJyg0D;X zZ3){Yd}e%Ne||EK?JhO7_g$omP3c-JVo2@+mfs}HHw`LZkF?w%=5|vp%YS4{-2TX({)ijuNa+Qn_J1bf4-9eoz{l^a=F$t#Lh5`NMAA2yVv2)!Tn{4|102LiQf$U9+EiT zv#=i!jy#GvKbJV!-5atD*(8cFJJO%WO|C@v{SeYE@y#f3r^Epm$wXxyLfubE{O^EQ zOFS3&Qxbm}ZGTSU)fls#65j>YRbRUglC!XJQMCU;TZo|yAPT0&zSH^6TZ@fKVib@y}2PzlL^P` zF7{E}>A3OAi`|O*Be>}m5?*03H}2bTPsTk3_f*{U+T%vtx8RT@A>B1<bt{)qF z(;;7RsCX^XV2zL$E5}m*f!^$8Xbsk2mx`BhLGO7*_ny!8+UkEMEAl1xU!gQ)PB!8* zwMl+lgf!~SEV8}o>Svo3T#{(XJvf= zmH|a!s-ej&K!C21?1$=;{Y)dnFkM60Pch0+F`C0N07q*-6{v5Fo2f}A?I+{l-WOhY z;SV*opZu#Nx6w?{8K zp)Wkeh3Z=eg7So#y1~{*Ww=qJnP%KjLvn+Jt0gqsIn8sIxAQ^Aof1u*jmLGR_I`JU zamp^y-uW4-xVeuyUS4Z^Cw+Zb_FjSk!aueOf3C*fSD^mo>>cqE#{{r-bcwAO30vO+ zA>y`PplT1=3}bg_8=NL%ccngIX$9z;V>Lo%(239gm!ZzMF^JmIw6Y==<&<2dpai=H~7)UcUt38d?z@X_)gDB#`>TFe4x84 zvUjSFZ3Myqkuk_V-ba&8d{d3l zvmM!mTt6ku_tXc&9_Sgtz^O}y9LD^gaJo|-hvj)FYsAAL?c(mC&u88hJI!g>1wSMj zGmO#N#n&MZjVr;?*u{2P9{{I2uG}uDKH0??QljY^$}VV6f$W0z8?MGK(oi4&F1h5q z?~dpog}sP4I4g5rp%K3^$!6uTw>MA`gI)X`8*CWWWQJcCcQ_dH7H(=QNRh;4A3frw{cKK z#+(1!WS+748e4MQPR;R(_6rP~benK$+UT!gpWJ$4Yg1{U;$-o)w9i_@K>w%N=Sa^r z#&}?8F1h}@+9$S6(R%WV;%Dq>DJvCkQ(&*e0=M`$d5ehrD?<7eHq zjh}j1KaaxwbU+NJW#ZwK?CsKU`ZaSnWo;;fz9bJ7PlvNt>bs%tgm@bNM#F5cH7I_? z_L}9v$3qG0Kpvb8a~<__56zoouLMV9ue9Gu_32s#$nD???3L=1y)HErNQ`g|Wv_me zA$#2ecs28VyCElUDgKAstKO*Mn0ExP3Yk`K(;8Jeh@H47q`hIX5u1cpGv~%X+%cQT zDD2~s{UB~1S3TeUx!T9o#Iq06K8A}SWd7WD0L?MP^eLCwK=_m3n#airBdG^FSm0v{9bPdtd3c>*H4rPxC6j|iG$%W$?sG8o-X zu${}yKcoGAb+*T3KSO-K3Q_jq#${=PRJSvB_d&opjO8Ownax=4X~2gt+6XO5E#79L zyi&>7+!ZK*u*>Tq#AY=h4Xsg{{Tg4ZE=D;#qi0b5+gPy#0H;g(T@uchutGv?F!B09 z3GoRlPk&3o9s!krp|}6O->vd@RhPbo5IKW3Y(-|`ZdSq$M&jclPsJDKJQ=q=J`oKU z)Ho3gS`r8*iDnqBs^Dx7GsA0S^_BF84^^xT0=h0 zBYop4`){-vs|QA;OMaD?uc|B;eJQW?(R1J8=EQBqZNsg$jbn~t zc6~CH2mcKP0k*$_pW-uE^v+)*c; z$|Fw+EJ42l;C%~>eKH@?De<{W#`FqxTs7 z3BHOtjavdickQd(c<)jzCg0 zeZ+!_cW3z@aV)nq!W@o`!<&5Px>ckX_X@fGN}Hl`-Kdq zu`$Mjk3$7?i?O3IKp$5UpDoXUC-R8*D?{isCjZVU4b%ru1t#4%kEu=C#oDI79aC%Y z+Wbjo<$5s5K)j7R#!vF{gKwPQ#h*z&)-6FH*I+w~)ki(@o7|nSiMTx9ps_;VQUI-h z$pJsXi+=)C13Q=vd6~c+z@5OSa$Wi{emh``;A6B08rKPLuQGa$^fzey+9^H+&!k4k zPBC7##@kp)ljh2Y4Q(R(oux6B4IB4cEKagr^6SzgJc&0I)xlqjJdzr0liX(@7 z0ew=oY^1ULjMLNZfNxxvO1w*}`d{@YS)5HfSw8C8U@OzmuEWnFB^VQiIyOJMp4vg2 zVbctK2bMrS*hcnJmezQW#aYT6Ih$_-{|fM*%qn=FsejU!d4I_cF72=MTgL$6hv7Hs z{OE;LiYJS9J96OXB=2DnUsC=b>DFI0sTMIx*u*gQwdIZI1^?2U8vK7dh3gpoiN%XN zmX!f}ZLeS%1x+p7Z>#f~upgD*a&O@4%=YC1mRqV9-5aQK1aP(`o8lz=GArB7GQM2N zJY|JP?nQo{r{%h?FHdIo;=X5l0n0&|0#6m&=Q#}88_a_;_d)ilq)S6DL6U1wjEm`K z<0ba6F94gJC1h-e{Y;m!Wm8@h@8Tb0w&vyb-c~%=AeO5Bc}dUv)v>;^ab4FLV@0sh z{h1AU`PRb~g*Sf(bA(FsMOlTKS2kVE^Ut?56tZaVtXA07{Y=S!HoE`5@4R$;T_hH6^^dI-BKPgmiMiLbEH0&IZ zk84sAp9hB059*s@#D&Az6_6LQ`Bz}xdm4VWf?1nkq%`KFZ~y#>4UG$cL$1cEM;aPi zs)po^qAceBu+KrhKd(*regPo)es&x8{pb^bYMb!=8sHA#Xwrz+bJ#kA3*=x(f{3^-a-BE9k&1N=>Kk0|Mv{j{|;0C_n`kBy#K#N{{x=94-2p{eSZ4fCV#Zx(UMl85{o0yn{q zQ9u7#OEGW<#gKw$m1_7$TQHaWNWUDI#H=!%k(-bGq+ZzPP0%C8+Fy7w!(YTmPY2PjITcKdX>K4IowXwx zrM|%C9b{jgBetz5W0QEhNk1LMOnssldk<-gnC;;KM^2;X|2X}HziT>C2xSf`GiQB;S#v+bCHHc>=go#^VmsYwixRrC!+5Maaxl zUgrU34P3|6jaVOGTr|i@@v#GV<8k@VUX09yjtahrHF70810K#i zwu_GiXeY?8Q171uk0r=4$0SF3!55=#q(k`onLuGmgkk{X_itoD_$DjCy2Z(L{Iu;P z(vAwWC)52j9v;|aF&nGQkDlL&km90w0p(m&&bTQr2RF$|eiB#%i032n`L+iThtX%m zP=@b#T(IkH`CnvC>Q6i-j8Vu&L_Ab70tKv#dL2T-RtvMk7cEsO9qyylGP-eU6 z%b$)0-e7x>ccQtH9c^xAJ)pG*D%tL4g~7)?tZ@Ni;~hLU9z|^EF~z`>O@Vw`yV=^_ zU?(;!>}2y~b{6$dq5f(3u!8lRf|z=?u^2pV=R8h<$7v~331sS(GWDWfiIgb=GSND# zA2LNC(>c%+gt(g^Qw03ZnPfU|lBpjuok!gP)V*MmVE}b5pk1274hfsPa0qy> z#P^|21I1ACQ|c3~OW|8{s0?W5&?j1h`;d-6#{uM>N7|2cKhmv8UqHGA=>eqMfNw&3 zi;=FCHogG(*(T9OKE~7MX=c3`XLm76$`tVi>s1-s@_r4Q;PEZR<~f$K7`F6H{tOL% zu%Bc;C%6$W8Db~aaQ<;g&wCzW?nYK@#8xNy8tlT>HUZ@@=h67k+KB8muVQ&sULY%j zY`mhXy0W4rqX2TBnIC;8gt&`%`}?=ZCrNhb;cO0IP6bnPV3)yHV2=T2$*WKpk6B&x zJn_!L``pSde|=={syD+Mkh&HVhv0{1U)3P42IllH1AKX>QulPktJqIypZ_z6){n zJIYL|LviT7Y-W+MsD=8KvlTxBb>NH6rmcML&d96S#Wto>eE9wMXJPjSZQ3>_1(7~~ zLte#m3}Xe|{QmFZi#89K&X2zRqxsSPm*u!+z$Zi;emZ3d#$CkWr&Ij#m|%I!kU#iY ztPj3Qwl;ugcZKX;ZLVb2m$81LwPIs!vpZpZMf)*${uumhH9z{UMq?R#+S*3?g3J}U z7^B=nEGpzMo(4VdJ8!iv#hi@A4&3abo7W(W7?trY| z4ZH(uK`!enre`5G#6@dClC^P#<@tLar}b#k^C3NHd!t5sAy)S=bpHtSiV^5@Mxaj{ zfo{7z-O@h-{nQBbgCo#)j6e^JK(8KwUOWPQ#t3xB<>|`#5$LB4`hViL)A5g|VYk=# z`{~5*ng@MAo$$@`RenEBE|5}=|Yy+N7O^O>{Vo?o@dPR+Fq8rkM`1caZaf_ zI#_ClNLvw2QxQQ@_h71e4X{*}N0_|fs3@-%qx>9^PVr;uR}6l6Nbfe$G3`-0WeL&2 zXPV@fE}=_8?0Zu?jtde(E}jlZSRx^K@cb+ZtpeJ4y}itiz41vI@%HV#BApTu?c2AC ze%R5!8`_O>sJ98}QX}2L>@9+xvY6^24LOLO0y(K4_FCeD&pF#AM17uyK1jZle9=w{ zzvA^k$M{lO&~bWsK-8ZAIjKJrAP?EggcDero;TX-U=xmt zw5>z%ozR7J#6&+N(zbR<-;eYe6MdgZ+b}Mq*9j|RdytQ}nLAfB+q!rMdinBqVj-#QEwdN zjO%YN8@B}M^f;e!s2|s72OC!+=qYD}9#kLF((lMFRLDo^l(V8;b(LsO1z&1cRfQa5 zFG$!gA^J=5jYU5>JS`#k@pJ~ky=)A|(`au@3DT$^Pvci^&xwAG0Y6px&zO=9HiqOu zS^aw=JF>6-Hv|p^8P_|>Nm>UIX{$HA>Y$K>4|EE(k} zeO(up&%5`sWNKgPnbTo^ly(G&jvM?)U&$2`mWci*=cAnTljIEW%@b({+Dp#Z%dDgi zNw=b`b)S&Oiu&>V4rW~-(y0-Yp>orN{8pQUOu(e`5<;&u4oT1>htLa$J0t`@o>mF& zWtOgZdzJuXK%aPin>oLOSvHCE#62hzK)vEPT|t}lE}87xk})VhUGP&bnDaZB0zFVa z@#xK{zOq%+S6WTwYEiC5mOF?twYalnIq)^~#2m;+e`p*S_;QGTlRT^^u^c-p^U-f7 zR`dLFbl~@qMA}(`9Pnd%Bp>LF^YhDk3kLBkrhL?&A@V1=s6O=IMA|L*JK=8@n@B6C z(GKFFg7KP^Ch61A&vPP8`OayepFX{QSM36ZuyHm3^uex#kE{=^9A9U^U+f!Dba z(6=J(kn|qVH;FWj+r%EweMs9ReGllXMA}jf`X10rkya(W74!unO*S&I74$5mt&+Y1 zbhJxp3-mQ{1?WzsnWPtkZWCz>^gOW`<8mJJ&IL)I)`6c;7HP{V(5Hb8c*B6CtDv6{ zX-hxoD(L%>mh-~(5zz6E(n&U)8Hj+s73qFa|N0&fH;Hu8G|+oM_aS{w()WPAN~DwK zfW8OxQlul2-U|8xkxr@ry%qEsi@1` z0w0qP{7!)b!khj#zC_of9Iik!>a0XI$Tx0 zbmf|A{B&0Nikelm^dCu>e(vEz`vC}yy>TAb1<3p-obcsE3kj~S*8S^Wi0qAvlinu zeA8D>v&Ki=&c?hOoty8)d-uoqUZRTq!_z1pJ2&tO@s#HVkUi`*^j;xz8GA{xBF2fY z2`MJE?-H3bx7%cz;veY;mxXjA=P{lkezJ$7><&Y@NE$ke#kiQI#&QzAcplatFY716 zo%ftQ_&aFx!PU5{jNVU_YIG4gAvhX8QPM?yZl~wKBMCMxw1~eW`-zf|Vs4B_4dz5~XMD}xuA8|iX zqP>QXFs~5eIRW3hg?Zw)e!}5#GxjXxoW*F)sM{45~}F$9PvjI=Oa!4)ORi8`jnwW)Ku> za-~A}y&~7-JPp5BP=~Hd{QgEbIQckTGYtedp*(41!_z3(xhxJMS{oj2R{_ldpa6bpXI}HRlp*)%B z|A}9Re6X2+nC}`d)B1<6ivdS7-?M45KFzld@W6r*sJup= z?^!;I;#PV9X6z^Jgi2`!}il@_%CHJpbK+@%0$g@sYWI! zgwhxoFg9f-d{HI8?&NvHuAHyjf3mX&ubcVTS+NE4=>11ofiAV;1{{t5&^|WzKj@e5 zU0tF7C~mZykGgvRX}t_^rT(K-P#y4y0Ah@i@&z2qf5h0MOdHBjxl#HL9t(!^ANu}5 z&Wpx#rT^Xu4VatS+FoUWwqLQ9wu`KF^DS%><{CQR_?G7u7Rau^+38!Drvi*IuX*sj zOCI5LH{Z)Vo^i}d^Z?eb@=TZ0lh0qm#nz`(j?S50S~eOfTZ(h~7Iq8Hbg?^hzF~fs zpW(Zn0%eUqeL};Rb~9Q-&&Yl}8f{#O^R3m4=GQ#bp?33{Z^Lu%9pcOt&Ra#Ag1@14 z{eywYkeA|v>AMezJmfWu|Bog<^kb+gJ|Hd_@jze2kxn{l=<^-Hf)3#@^?@!Gr!{h zrIib8V}9kW#(p>8FY#ei@nH_e^Dpt?FY#fd_%P8F6DFJR=^r>g#6P<>2Z-9?BSd_k zI>Q~mV*AusE{J^b*Z6;{hlvxh-;MZBj1ySf{@Jc0{)@y3CFRd?9YJdhT1yz~jKJ6V zf_-ve^6=}5YqyRd5B(2YM|_YtVO~S<@L@c!^BFz1#HG*c)VlG%hhNou ztXApgfTMZdV6zj}P;EU01#yA7-At+hfei=JojcYp@=_>iw=iXaBj1 zdG<2 getsentry.patch +.PHONY: get-sentry-patch diff --git a/shared/sentry/src/external/crashpad/third_party/libfuzzer/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/libfuzzer/BUILD.gn new file mode 100644 index 000000000..0841a41d2 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/libfuzzer/BUILD.gn @@ -0,0 +1,49 @@ +# Copyright 2018 The Crashpad Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source_set("libfuzzer") { + if (crashpad_use_libfuzzer) { + sources = [ + "src/FuzzerClangCounters.cpp", + "src/FuzzerCrossOver.cpp", + "src/FuzzerDriver.cpp", + "src/FuzzerExtFunctionsDlsym.cpp", + "src/FuzzerExtFunctionsDlsymWin.cpp", + "src/FuzzerExtFunctionsWeak.cpp", + "src/FuzzerExtFunctionsWeakAlias.cpp", + "src/FuzzerExtraCounters.cpp", + "src/FuzzerIO.cpp", + "src/FuzzerIOPosix.cpp", + "src/FuzzerIOWindows.cpp", + "src/FuzzerLoop.cpp", + "src/FuzzerMain.cpp", + "src/FuzzerMerge.cpp", + "src/FuzzerMutate.cpp", + "src/FuzzerSHA1.cpp", + "src/FuzzerShmemPosix.cpp", + "src/FuzzerShmemWindows.cpp", + "src/FuzzerTracePC.cpp", + "src/FuzzerUtil.cpp", + "src/FuzzerUtilDarwin.cpp", + "src/FuzzerUtilLinux.cpp", + "src/FuzzerUtilPosix.cpp", + "src/FuzzerUtilWindows.cpp", + ] + + configs -= [ + "//third_party/mini_chromium/mini_chromium/build:Wexit_time_destructors", + "//build:crashpad_fuzzer_flags", + ] + } +} diff --git a/web/src/index.rst b/web/src/index.rst index 1fcb586dc..f05118098 100644 --- a/web/src/index.rst +++ b/web/src/index.rst @@ -47,4 +47,4 @@ Uninstall Oxide 1. ``systemctl disable --now tarnish`` 2. ``systemctl enable --now xochitl`` -3. ``opkg remove -force-removal-of-dependent-packages liboxide`` +3. ``opkg remove --force-removal-of-dependent-packages liboxide`` From 1c997c4e9470feec08e4748942f17e517c5efa49 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 25 Dec 2023 02:54:55 -0700 Subject: [PATCH 49/87] Add python-liboxide option --- web/src/documentation/api/00_overview.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/src/documentation/api/00_overview.rst b/web/src/documentation/api/00_overview.rst index 8381d1575..d49d507e9 100644 --- a/web/src/documentation/api/00_overview.rst +++ b/web/src/documentation/api/00_overview.rst @@ -23,11 +23,12 @@ Options for interacting with the API There are a number of options for interacting with the API. - 1. Using the `rot` command line tool and :doc:`../02_oxide-utils`. + 1. Using the ``rot`` command line tool and :doc:`../02_oxide-utils`. 2. Making calls using `dbus-send `_. 3. Generating classes using the `automatic interface xml files `_. 4. Making D-Bus calls manually in your language of choice. + 5. Using the python wrapper for the ``rot`` command line `python-liboxide `_ For the purposes of this documentation we will document using :ref:`rot` as well as using Qt generated classes. From 8ed7accd3233001eb7dea77e4d96064beb8fb7f7 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sun, 14 Jan 2024 01:53:55 -0700 Subject: [PATCH 50/87] Simplify pen to mouse events logic (#310) * Simplify pen to mouse events logic * Remove EventFilter::root and fix bug * Fix button logic * Fix compile * Filter handled events * Use TabletEvent::button() instead of hard coded * Update eventfilter.cpp --- applications/launcher/controller.h | 3 - applications/launcher/main.cpp | 6 +- applications/lockscreen/main.cpp | 5 +- applications/process-manager/main.cpp | 4 +- applications/screenshot-viewer/main.cpp | 4 +- applications/task-switcher/main.cpp | 4 +- shared/liboxide/eventfilter.cpp | 171 ++++++++---------------- shared/liboxide/eventfilter.h | 6 - shared/liboxide/examples/oxide.cpp | 7 +- shared/liboxide/liboxide.pro | 1 + 10 files changed, 67 insertions(+), 144 deletions(-) diff --git a/applications/launcher/controller.h b/applications/launcher/controller.h index 1f946872f..ba4ef43d8 100644 --- a/applications/launcher/controller.h +++ b/applications/launcher/controller.h @@ -6,7 +6,6 @@ #include #include #include -#include #include #include "appitem.h" @@ -19,7 +18,6 @@ using namespace codes::eeems::oxide1; using codes::eeems::oxide1::Power; using Oxide::SysObject; -using Oxide::EventFilter; using namespace Oxide::Sentry; enum State { Normal, PowerSaving }; @@ -61,7 +59,6 @@ class Controller : public QObject Q_PROPERTY(int maxTouchHeight READ maxTouchHeight) public: static std::string exec(const char* cmd); - EventFilter* filter; QObject* stateController; QObject* root = nullptr; explicit Controller(QObject* parent = 0) diff --git a/applications/launcher/main.cpp b/applications/launcher/main.cpp index 3010c4748..65e3072d8 100644 --- a/applications/launcher/main.cpp +++ b/applications/launcher/main.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "controller.h" @@ -30,16 +31,13 @@ int main(int argc, char* argv[]){ deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("oxide", argv); - auto filter = new EventFilter(&app); app.setOrganizationName("Eeems"); app.setOrganizationDomain(OXIDE_SERVICE); app.setApplicationName("oxide"); app.setApplicationDisplayName("Launcher"); - app.installEventFilter(filter); QQmlApplicationEngine engine; QQmlContext* context = engine.rootContext(); Controller* controller = new Controller(); - controller->filter = filter; qmlRegisterAnonymousType("codes.eeems.oxide", 2); qmlRegisterAnonymousType("codes.eeems.oxide", 2); context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); @@ -52,7 +50,7 @@ int main(int argc, char* argv[]){ } QObject* root = engine.rootObjects().first(); controller->root = root; - filter->root = (QQuickItem*)root; + root->installEventFilter(new EventFilter(&app)); QObject* stateController = root->findChild("stateController"); if(!stateController){ qDebug() << "Can't find stateController"; diff --git a/applications/lockscreen/main.cpp b/applications/lockscreen/main.cpp index d187c2aad..aeaae8663 100644 --- a/applications/lockscreen/main.cpp +++ b/applications/lockscreen/main.cpp @@ -17,8 +17,6 @@ int main(int argc, char *argv[]){ deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("decay", argv); - auto filter = new EventFilter(&app); - app.installEventFilter(filter); app.setOrganizationName("Eeems"); app.setOrganizationDomain(OXIDE_SERVICE); app.setApplicationName("decay"); @@ -34,7 +32,8 @@ int main(int argc, char *argv[]){ return -1; } auto root = engine.rootObjects().first(); - filter->root = (QQuickItem*)root; + root->installEventFilter(new EventFilter(&app)); controller.setRoot(root); + qDebug() << root; return app.exec(); } diff --git a/applications/process-manager/main.cpp b/applications/process-manager/main.cpp index 57286d8d9..af506fd5b 100755 --- a/applications/process-manager/main.cpp +++ b/applications/process-manager/main.cpp @@ -25,8 +25,6 @@ int main(int argc, char *argv[]){ app.setApplicationName("tarnish"); app.setApplicationDisplayName("Process Monitor"); app.setApplicationVersion(APP_VERSION); - EventFilter filter; - app.installEventFilter(&filter); QQmlApplicationEngine engine; QQmlContext* context = engine.rootContext(); Controller controller(&engine); @@ -38,7 +36,7 @@ int main(int argc, char *argv[]){ return -1; } QObject* root = engine.rootObjects().first(); - filter.root = (QQuickItem*)root; + root->installEventFilter(new EventFilter(&app)); QQuickItem* tasksView = root->findChild("tasksView"); if(!tasksView){ qDebug() << "Can't find tasksView"; diff --git a/applications/screenshot-viewer/main.cpp b/applications/screenshot-viewer/main.cpp index e2ce0ab6f..a41248e98 100644 --- a/applications/screenshot-viewer/main.cpp +++ b/applications/screenshot-viewer/main.cpp @@ -22,8 +22,6 @@ int main(int argc, char *argv[]){ deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("anxiety", argv); - auto filter = new EventFilter(&app); - app.installEventFilter(filter); app.setOrganizationName("Eeems"); app.setOrganizationDomain(OXIDE_SERVICE); app.setApplicationName("anxiety"); @@ -40,7 +38,7 @@ int main(int argc, char *argv[]){ return -1; } auto root = engine.rootObjects().first(); - filter->root = (QQuickItem*)root; + root->installEventFilter(new EventFilter(&app)); controller.setRoot(root); signal(SIGINT, sigHandler); diff --git a/applications/task-switcher/main.cpp b/applications/task-switcher/main.cpp index a975a2e48..2180c6c2c 100644 --- a/applications/task-switcher/main.cpp +++ b/applications/task-switcher/main.cpp @@ -25,8 +25,6 @@ int main(int argc, char *argv[]){ deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); sentry_init("corrupt", argv); - auto filter = new EventFilter(&app); - app.installEventFilter(filter); app.setOrganizationName("Eeems"); app.setOrganizationDomain(OXIDE_SERVICE); app.setApplicationName("corrupt"); @@ -46,7 +44,7 @@ int main(int argc, char *argv[]){ return -1; } auto root = engine.rootObjects().first(); - filter->root = (QQuickItem*)root; + root->installEventFilter(new EventFilter(&app)); controller.setRoot(root); signal(SIGINT, sigHandler); diff --git a/shared/liboxide/eventfilter.cpp b/shared/liboxide/eventfilter.cpp index c207f825d..1ccc2f87c 100644 --- a/shared/liboxide/eventfilter.cpp +++ b/shared/liboxide/eventfilter.cpp @@ -7,11 +7,13 @@ #include #include +#include +#include + #define DISPLAYWIDTH 1404 #define DISPLAYHEIGHT 1872.0 #define WACOM_X_SCALAR (float(DISPLAYWIDTH) / float(DISPLAYHEIGHT)) #define WACOM_Y_SCALAR (float(DISPLAYHEIGHT) / float(DISPLAYWIDTH)) -//#define DEBUG_EVENTS #ifdef DEBUG_EVENTS #define O_DEBUG_EVENT(msg) O_DEBUG(msg) #else @@ -19,7 +21,7 @@ #endif namespace Oxide{ - EventFilter::EventFilter(QObject *parent) : QObject(parent), root(nullptr){} + EventFilter::EventFilter(QObject *parent) : QObject(parent) {} QPointF swap(QPointF pointF){ return QPointF(pointF.y(), pointF.x()); @@ -32,124 +34,65 @@ namespace Oxide{ pointF.setY((DISPLAYWIDTH - pointF.y()) * WACOM_Y_SCALAR); return pointF; } - QPointF globalPos(QQuickItem* obj){ - qreal x = obj->x(); - qreal y = obj->y(); - while(obj->parentItem() != nullptr){ - obj = obj->parentItem(); - x += obj->x(); - y += obj->y(); + + bool EventFilter::eventFilter(QObject* obj, QEvent* ev){ + auto type = ev->type(); + if(QObject::eventFilter(obj, ev)){ + return true; } - return QPointF(x, y); - } - QMouseEvent* toMouseEvent(QEvent::Type type, QEvent* ev){ - auto tabletEvent = (QTabletEvent*)ev; - auto button = tabletEvent->pressure() > 0 || type == QMouseEvent::MouseButtonRelease ? Qt::LeftButton : Qt::NoButton; - return new QMouseEvent( - type, - transpose(tabletEvent->posF()), - transpose(tabletEvent->globalPosF()), - transpose(tabletEvent->globalPosF()), - button, - button, - tabletEvent->modifiers() - ); - } - bool isAt(QQuickItem* item, QPointF pos){ - auto itemPos = globalPos(item); - auto otherItemPos = QPointF(itemPos.x() + item->width(), itemPos.y() + item->height()); - return pos.x() >= itemPos.x() && pos.x() <= otherItemPos.x() && pos.y() >= itemPos.y() && pos.y() <= otherItemPos.y(); - } - QList widgetsAt(QQuickItem* root, QPointF pos){ - QList result; - auto children = root->findChildren(); - for(auto child : children){ - if(result.contains(child)){ - continue; - } - if(!child->isVisible() || !child->isEnabled()){ - continue; - } - if(child->acceptedMouseButtons() & Qt::LeftButton && isAt(child, pos)){ - result.append((QObject*)child); - for(auto item : widgetsAt(child, pos)){ - if(!result.contains(item)){ - result.append(item); - } - } - continue; - } - if(!child->clip()){ - for(auto item : widgetsAt(child, pos)){ - if(!result.contains(item)){ - result.append(item); - } - } - } + if(type == QEvent::TabletPress){ + O_DEBUG_EVENT(ev); + auto tabletEvent = (QTabletEvent*)ev; + QWindowSystemInterface::handleMouseEvent( + nullptr, + transpose(tabletEvent->posF()), + transpose(tabletEvent->globalPosF()), + tabletEvent->buttons(), + tabletEvent->button(), + QEvent::MouseButtonPress + ); + tabletEvent->accept(); + return true; } - return result; - } - int parentCount(QQuickItem* obj){ - int count = 0; - while(obj->parentItem()){ - count++; - obj = obj->parentItem(); + if(type == QEvent::TabletRelease){ + O_DEBUG_EVENT(ev); + auto tabletEvent = (QTabletEvent*)ev; + QWindowSystemInterface::handleMouseEvent( + nullptr, + transpose(tabletEvent->posF()), + transpose(tabletEvent->globalPosF()), + tabletEvent->buttons(), + tabletEvent->button(), + QEvent::MouseButtonRelease + ); + tabletEvent->accept(); + return true; } - return count; - } - void postEvent(QEvent::Type type, QEvent* ev, QQuickItem* root){ - auto mouseEvent = toMouseEvent(type, ev); - auto pos = mouseEvent->globalPos(); - for(auto postWidget : widgetsAt(root, pos)){ - if(parentCount((QQuickItem*)postWidget)){ - O_DEBUG_EVENT("postWidget: " << postWidget); - auto event = new QMouseEvent( - mouseEvent->type(), mouseEvent->localPos(), mouseEvent->windowPos(), - mouseEvent->screenPos(), mouseEvent->button(), mouseEvent->buttons(), - mouseEvent->modifiers() - ); - auto widgetPos = globalPos((QQuickItem*)postWidget); - auto localPos = event->localPos(); - localPos.setX(pos.x() - widgetPos.x()); - localPos.setY((pos.y()) - widgetPos.y()); - event->setLocalPos(localPos); - QGuiApplication::postEvent(postWidget, event); - } + if(type == QEvent::TabletMove){ + O_DEBUG_EVENT(ev); + auto tabletEvent = (QTabletEvent*)ev; + QWindowSystemInterface::handleMouseEvent( + nullptr, + transpose(tabletEvent->posF()), + transpose(tabletEvent->globalPosF()), + tabletEvent->buttons(), + tabletEvent->button(), + QEvent::MouseMove + ); + tabletEvent->accept(); + return true; } - delete mouseEvent; - } - - bool EventFilter::eventFilter(QObject* obj, QEvent* ev){ - auto type = ev->type(); - bool filtered = QObject::eventFilter(obj, ev); - if(!filtered){ - if(type == QEvent::TabletPress){ - O_DEBUG_EVENT(ev); - postEvent(QMouseEvent::MouseButtonPress, ev, root); - }else if(type == QEvent::TabletRelease){ - O_DEBUG_EVENT(ev); - postEvent(QMouseEvent::MouseButtonRelease, ev, root); - }else if(type == QEvent::TabletMove){ - O_DEBUG_EVENT(ev); - postEvent(QMouseEvent::MouseMove, ev, root); - } #ifdef DEBUG_EVENTS - else if( - type == QEvent::MouseMove - || type == QEvent::MouseButtonPress - || type == QEvent::MouseButtonRelease - ){ - for(auto widget : widgetsAt(root, ((QMouseEvent*)ev)->globalPos())){ - if(parentCount((QQuickItem*)widget)){ - O_DEBUG("postWidget: " << widget); - } - } - O_DEBUG(obj); - O_DEBUG(ev); - } -#endif + if( + type == QEvent::MouseMove + || type == QEvent::MouseButtonPress + || type == QEvent::MouseButtonRelease + ){ + O_DEBUG(obj); + O_DEBUG(ev); } - return filtered; +#endif + return false; } } diff --git a/shared/liboxide/eventfilter.h b/shared/liboxide/eventfilter.h index ede694155..17260a799 100644 --- a/shared/liboxide/eventfilter.h +++ b/shared/liboxide/eventfilter.h @@ -25,12 +25,6 @@ namespace Oxide{ { Q_OBJECT public: - /*! - * \brief The root element in the Qt application - * - * This is needed to find wigets to send mouse events when a pen touch is detected - */ - QQuickItem* root; /*! * \brief Create a new EventFilter instance * \param parent The parent object. Usually should be qApp diff --git a/shared/liboxide/examples/oxide.cpp b/shared/liboxide/examples/oxide.cpp index 874caa102..b4b154838 100644 --- a/shared/liboxide/examples/oxide.cpp +++ b/shared/liboxide/examples/oxide.cpp @@ -41,6 +41,7 @@ try{ #include #import +#include #ifdef __arm__ Q_IMPORT_PLUGIN(QsgEpaperPlugin) @@ -49,10 +50,6 @@ Q_IMPORT_PLUGIN(QsgEpaperPlugin) using namespace Oxide; int main(int argc, char *argv[]){ QGuiApplication app(argc, argv); - - auto filter = new EventFilter(&app); - app.installEventFilter(filter); - QQmlApplicationEngine engine; QQmlContext* context = engine.rootContext(); context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); @@ -63,7 +60,7 @@ int main(int argc, char *argv[]){ } auto root = engine.rootObjects().first(); - filter->root = (QQuickItem*)root; + root->installEventFilter(new EventFilter(&app)); return app.exec(); } //! [EventFilter] diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index b3eb5a6d9..262fdbb8a 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -1,6 +1,7 @@ QT -= gui QT += quick QT += dbus +QT += gui-private TEMPLATE = lib DEFINES += LIBOXIDE_LIBRARY From f4b81edfbd9b016839f625d164ce08ce7706c274 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sun, 14 Jan 2024 18:23:32 -0700 Subject: [PATCH 51/87] Folio support (#337) * Simplify pen to mouse events logic * Remove EventFilter::root and fix bug * Fix button logic * Fix compile * Filter handled events * Use TabletEvent::button() instead of hard coded * Update eventfilter.cpp * qt creator automatically applied this change * Resolve compile warning * Force debug output when switching to xochitl * Force use built in commands and sysfs_preload * Allow lockscreen to rotate and use type folio for pin * Get launcher and lockscreen fully supporting rotation * Stop using ccache * Bump version to 2.8 * landscape support for screenshot viewer * Add landscape support to process manager * Get task switcher to support landscape * Add some keyboard shortcuts to tarnish and fix keyboard detection * Add more keyboard shortcuts * Shortcuts are only up to 4 keys * Add keyd config and remove uneeded shortcuts * Fix keyd config * alt-f4 * Rotate splashscreens * Rotate screenshots if in landscape * Make notifications use landscape * Landscape goodbye message * Landscape (stretched) suspend screen * Scale suspend image to fit * Lint fix * Fix up some error messages --- applications/gio/common.h | 5 +- applications/launcher/main.cpp | 4 +- applications/launcher/main.qml | 389 +++++++++--------- applications/launcher/qml.qrc | 1 - applications/lockscreen/main.cpp | 6 +- applications/lockscreen/main.qml | 312 +++++++------- applications/lockscreen/qml.qrc | 1 - .../lockscreen/widgets/BetterMenu.qml | 66 --- applications/lockscreen/widgets/PinPad.qml | 107 +++-- applications/process-manager/main.cpp | 4 +- applications/process-manager/main.qml | 59 ++- applications/screenshot-viewer/main.cpp | 4 +- applications/screenshot-viewer/main.qml | 173 ++++---- applications/system-service/application.cpp | 70 +++- applications/system-service/application.h | 50 +-- applications/system-service/appsapi.cpp | 54 +++ applications/system-service/appsapi.h | 87 ++-- applications/system-service/controller.h | 42 ++ applications/system-service/dbusservice.h | 8 +- .../system-service/digitizerhandler.h | 3 - applications/system-service/eventlistener.cpp | 37 ++ applications/system-service/eventlistener.h | 21 + applications/system-service/main.cpp | 25 ++ applications/system-service/main.qml | 39 ++ applications/system-service/notification.cpp | 67 +-- applications/system-service/notification.h | 2 +- .../system-service/notificationapi.cpp | 137 ++++++ applications/system-service/notificationapi.h | 56 +-- applications/system-service/qml.qrc | 4 +- applications/system-service/screenapi.cpp | 68 ++- applications/system-service/screenapi.h | 27 +- .../system-service/system-service.pro | 11 + applications/system-service/systemapi.cpp | 13 +- applications/system-service/systemapi.h | 31 +- applications/system-service/wifiapi.h | 8 +- applications/system-service/wlan.h | 14 +- .../system-service/wpa_supplicant.cpp | 1 - applications/task-switcher/main.cpp | 4 +- applications/task-switcher/main.qml | 31 +- assets/opt/etc/keyd/oxide.conf | 39 ++ .../opt/usr/share/applications/xochitl.oxide | 31 +- interfaces/appsapi.xml | 2 + interfaces/systemapi.xml | 4 + package | 2 +- qmake/common.pri | 2 +- qmake/liboxide.pri | 1 + .../liboxide/OxideMenu.qml | 20 +- shared/liboxide/OxideWindow.qml | 75 ++++ shared/liboxide/liboxide.cpp | 96 ++++- shared/liboxide/liboxide.h | 10 + shared/liboxide/liboxide.pro | 14 + shared/liboxide/oxide.qrc | 6 + shared/liboxide/oxideqml.cpp | 25 ++ shared/liboxide/oxideqml.h | 25 ++ 54 files changed, 1526 insertions(+), 867 deletions(-) delete mode 100644 applications/lockscreen/widgets/BetterMenu.qml create mode 100644 applications/system-service/controller.h create mode 100644 applications/system-service/eventlistener.cpp create mode 100644 applications/system-service/eventlistener.h create mode 100644 applications/system-service/main.qml create mode 100644 applications/system-service/notificationapi.cpp create mode 100644 assets/opt/etc/keyd/oxide.conf rename applications/launcher/widgets/BetterMenu.qml => shared/liboxide/OxideMenu.qml (73%) create mode 100644 shared/liboxide/OxideWindow.qml create mode 100644 shared/liboxide/oxide.qrc create mode 100644 shared/liboxide/oxideqml.cpp create mode 100644 shared/liboxide/oxideqml.h diff --git a/applications/gio/common.h b/applications/gio/common.h index ecf06c61e..53dda3bce 100644 --- a/applications/gio/common.h +++ b/applications/gio/common.h @@ -74,7 +74,10 @@ class ICommand { ICommand(bool allowEmpty); virtual int arguments(){ return EXIT_FAILURE; } - virtual int command(const QStringList& args){ return EXIT_FAILURE; } + virtual int command(const QStringList& args){ + Q_UNUSED(args); + return EXIT_FAILURE; + } protected: bool allowEmpty = false; diff --git a/applications/launcher/main.cpp b/applications/launcher/main.cpp index 65e3072d8..6dcf6667d 100644 --- a/applications/launcher/main.cpp +++ b/applications/launcher/main.cpp @@ -16,12 +16,14 @@ #include #include #include +#include #include #include "controller.h" using namespace std; using namespace Oxide; +using namespace Oxide::QML; using namespace Oxide::Sentry; function shutdown_handler; @@ -40,7 +42,7 @@ int main(int argc, char* argv[]){ Controller* controller = new Controller(); qmlRegisterAnonymousType("codes.eeems.oxide", 2); qmlRegisterAnonymousType("codes.eeems.oxide", 2); - context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); + registerQML(&engine); context->setContextProperty("apps", QVariant::fromValue(controller->getApps())); context->setContextProperty("controller", controller); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); diff --git a/applications/launcher/main.qml b/applications/launcher/main.qml index c1c37f1fa..6f524a012 100755 --- a/applications/launcher/main.qml +++ b/applications/launcher/main.qml @@ -2,15 +2,16 @@ import QtQuick 2.10 import QtQuick.Window 2.3 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.0 +import "qrc:/codes.eeems.oxide" import "widgets" -ApplicationWindow { +OxideWindow { id: window objectName: "window" visible: true - width: screenGeometry.width - height: screenGeometry.height title: qsTr("Oxide") + focus: true + backgroundColor: "white" FontLoader { id: iconFont; source: "/font/icomoon.ttf" } onAfterSynchronizing: { if (stateController.state == "loading") { @@ -25,183 +26,83 @@ ApplicationWindow { appsView.model = controller.getApps(); } } - header: Rectangle { - enabled: stateController.state === "loaded" - color: "black" - height: menu.height - RowLayout { - id: menu - width: parent.width - RowLayout { - Layout.fillWidth: true - CustomMenu { - BetterMenu { - id: optionsMenu - title: qsTr(""); - font: iconFont.name - width: 310 - Action { text: qsTr(" Reload"); onTriggered: { - controller.breadcrumb("menu.reload", "click", "ui"); - controller.startup(); - appsView.model = controller.getApps(); - }} - Action { - text: qsTr(" Import Apps"); - onTriggered:{ - controller.breadcrumb("menu.import", "click", "ui"); - controller.importDraftApps(); - appsView.model = controller.getApps(); - } - } - Action { - text: qsTr(" Options") - onTriggered: { - controller.breadcrumb("menu.options", "click", "ui"); - stateController.state = "settings"; - } - } - } - } - StatusIcon { - source: "qrc:/img/notifications/white.png" - text: controller.notificationText - visible: controller.hasNotification - clip: true - Layout.maximumWidth: 300 - MouseArea { - anchors.fill: parent - enabled: parent.visible - onClicked: { - controller.breadcrumb("notifications", "click", "ui"); - stateController.state = "notifications"; - } + Shortcut{ + sequence: "Option+L" + context: Qt.ApplicationShortcut + onActivated: controller.lock() + } + Shortcut{ + sequence: "Option+S" + context: Qt.ApplicationShortcut + onActivated: controller.suspend() + } + Shortcut{ + sequence: StandardKey.Refresh + context: Qt.ApplicationShortcut + onActivated: controller.reload() + } + Shortcut{ + sequence: "Ctrl+I" + context: Qt.ApplicationShortcut + onActivated: controller.importDraftApps() + } + Shortcut{ + sequence: StandardKey.Quit + context: Qt.ApplicationShortcut + onActivated: Qt.quit() + } + leftMenu: [ + CustomMenu { + OxideMenu { + id: optionsMenu + title: qsTr(""); + font: iconFont.name + width: 310 + Action { + text: qsTr(" Reload") + onTriggered: { + controller.breadcrumb("menu.reload", "click", "ui"); + controller.startup(); + appsView.model = controller.getApps(); } } - } - Label { Layout.fillWidth: true } - RowLayout { - Layout.fillWidth: true - Layout.alignment: Qt.AlignRight - StatusIcon { - id: wifiState - objectName: "wifiState" - property string state: "unknown" - property int rssi: 0 - property bool connected: false - source: { - var icon; - if(state === "unknown"){ - icon = "unknown"; - }else if(state === "down"){ - icon = "down"; - }else if(!connected){ - icon = "disconnected"; - }else if(rssi > -50) { - icon = "4_bar"; - }else if(rssi > -60){ - icon = "3_bar"; - }else if(rssi > -70){ - icon = "2_bar"; - }else if(rssi > -80){ - icon = "1_bar"; - }else{ - icon = "0_bar"; - } - return "qrc:/img/wifi/" + icon + ".png"; - } - text: controller.showWifiDb ? rssi + "dBm" : "" - MouseArea { - anchors.fill: parent - onClicked: { - controller.breadcrumb("wifi", "click", "ui"); - stateController.state = "wifi"; - } + Action { + text: qsTr(" Import Apps") + onTriggered:{ + controller.breadcrumb("menu.import", "click", "ui"); + controller.importDraftApps(); + appsView.model = controller.getApps(); } } - StatusIcon { - id: batteryLevel - objectName: "batteryLevel" - property bool alert: false - property bool warning: false - property bool charging: false - property bool connected: false - property bool present: true - property int level: 0 - property int temperature: 0 - source: { - var icon = ""; - if(alert || !present){ - icon = "alert"; - }else if(warning){ - icon = "unknown"; - }else{ - if(charging || connected){ - icon = "charging_"; - } - if(level < 25){ - icon += "20"; - }else if(level < 35){ - icon += "30"; - }else if(level < 55){ - icon += "50"; - }else if(level < 65){ - icon += "60"; - }else if(level < 85){ - icon += "80"; - }else if(level < 95){ - icon += "90"; - }else{ - icon += 100; - } - } - return "qrc:/img/battery/" + icon + ".png"; + Action { + text: qsTr(" Options") + onTriggered: { + controller.breadcrumb("menu.options", "click", "ui"); + stateController.state = "settings"; } - text: (controller.showBatteryPercent ? level + "% " : "") + (controller.showBatteryTemperature ? temperature + "C" : "") } - CustomMenu { - BetterMenu { - id: powerMenu - title: qsTr(""); - font: iconFont.name - width: 260 - Action { - text: qsTr(" Suspend") - enabled: !controller.sleepInhibited - onTriggered: { - controller.breadcrumb("menu.suspend", "click", "ui"); - controller.suspend(); - } - } - Action { - text: qsTr(" Reboot") - enabled: !controller.powerOffInhibited - onTriggered: { - controller.breadcrumb("menu.reboot", "click", "ui"); - controller.reboot(); - } - } - Action { - text: qsTr(" Shutdown") - enabled: !controller.powerOffInhibited - onTriggered: { - controller.breadcrumb("menu.shutdown", "click", "ui"); - controller.powerOff(); - } - } - Action { - text: qsTr(" Lock") - onTriggered: { - controller.breadcrumb("menu.lock", "click", "ui"); - controller.lock(); - } - } - } + } + }, + StatusIcon { + source: "qrc:/img/notifications/white.png" + text: controller.notificationText + visible: controller.hasNotification + clip: true + Layout.maximumWidth: 300 + MouseArea { + anchors.fill: parent + enabled: parent.visible + onClicked: { + controller.breadcrumb("notifications", "click", "ui"); + stateController.state = "notifications"; } } } + ] + centerMenu: [ Label { objectName: "clock" - anchors.centerIn: parent + Layout.alignment: Qt.AlignCenter color: "white" MouseArea { anchors.fill: parent @@ -211,13 +112,127 @@ ApplicationWindow { } } } - } - background: Rectangle { color: "white" } - contentData: [ - Rectangle { - anchors.fill: parent - color: "white" + ] + rightMenu: [ + StatusIcon { + id: wifiState + objectName: "wifiState" + property string state: "unknown" + property int rssi: 0 + property bool connected: false + source: { + var icon; + if(state === "unknown"){ + icon = "unknown"; + }else if(state === "down"){ + icon = "down"; + }else if(!connected){ + icon = "disconnected"; + }else if(rssi > -50) { + icon = "4_bar"; + }else if(rssi > -60){ + icon = "3_bar"; + }else if(rssi > -70){ + icon = "2_bar"; + }else if(rssi > -80){ + icon = "1_bar"; + }else{ + icon = "0_bar"; + } + return "qrc:/img/wifi/" + icon + ".png"; + } + text: controller.showWifiDb ? rssi + "dBm" : "" + MouseArea { + anchors.fill: parent + onClicked: { + controller.breadcrumb("wifi", "click", "ui"); + stateController.state = "wifi"; + } + } + }, + StatusIcon { + id: batteryLevel + objectName: "batteryLevel" + property bool alert: false + property bool warning: false + property bool charging: false + property bool connected: false + property bool present: true + property int level: 0 + property int temperature: 0 + source: { + var icon = ""; + if(alert || !present){ + icon = "alert"; + }else if(warning){ + icon = "unknown"; + }else{ + if(charging || connected){ + icon = "charging_"; + } + if(level < 25){ + icon += "20"; + }else if(level < 35){ + icon += "30"; + }else if(level < 55){ + icon += "50"; + }else if(level < 65){ + icon += "60"; + }else if(level < 85){ + icon += "80"; + }else if(level < 95){ + icon += "90"; + }else{ + icon += 100; + } + } + return "qrc:/img/battery/" + icon + ".png"; + } + text: (controller.showBatteryPercent ? level + "% " : "") + (controller.showBatteryTemperature ? temperature + "C" : "") }, + CustomMenu { + OxideMenu { + id: powerMenu + title: qsTr(""); + font: iconFont.name + width: 260 + Action { + text: qsTr(" Suspend") + enabled: !controller.sleepInhibited + onTriggered: { + controller.breadcrumb("menu.suspend", "click", "ui"); + controller.suspend(); + } + } + Action { + text: qsTr(" Reboot") + enabled: !controller.powerOffInhibited + onTriggered: { + controller.breadcrumb("menu.reboot", "click", "ui"); + controller.reboot(); + } + } + Action { + text: qsTr(" Shutdown") + enabled: !controller.powerOffInhibited + onTriggered: { + controller.breadcrumb("menu.shutdown", "click", "ui"); + controller.powerOff(); + } + } + Action { + text: qsTr(" Lock") + onTriggered: { + controller.breadcrumb("menu.lock", "click", "ui"); + controller.lock(); + } + } + } + } + ] + background: Rectangle { color: "white" } + initialItem: Item{ + anchors.fill: parent GridView { id: appsView enabled: stateController.state === "loaded" @@ -264,7 +279,7 @@ ApplicationWindow { model.modelData.execute(); } } - }, + } Popup { id: itemInfo visible: false @@ -378,31 +393,30 @@ ApplicationWindow { } } } - }, + } SettingsPopup { id: settings onClosed: stateController.state = "loaded" visible: false - }, + } WifiMenu { id: wifi onClosed: stateController.state = "loaded" visible: false model: controller.networks - }, + } CalendarMenu { id: calendar onClosed: stateController.state = "loaded" visible: false - }, + } NotificationsPopup { id: notifications onClosed: stateController.state = "loaded" visible: false model: controller.notifications } - - ] + } StateGroup { id: stateController property string previousState; @@ -430,7 +444,6 @@ ApplicationWindow { PropertyAction { target: wifi; property: "visible"; value: false } PropertyAction { target: calendar; property: "visible"; value: false } PropertyAction { target: notifications; property: "visible"; value: false } - PropertyAction { target: menu; property: "focus"; value: false } } }, Transition { @@ -445,7 +458,6 @@ ApplicationWindow { PropertyAction { target: calendar; property: "visible"; value: false } PropertyAction { target: settings; property: "visible"; value: false } PropertyAction { target: notifications; property: "visible"; value: false } - PropertyAction { target: menu; property: "focus"; value: false } } }, Transition { @@ -460,7 +472,6 @@ ApplicationWindow { PropertyAction { target: settings; property: "visible"; value: false } PropertyAction { target: wifi; property: "visible"; value: false } PropertyAction { target: notifications; property: "visible"; value: false } - PropertyAction { target: menu; property: "focus"; value: false } } }, Transition { @@ -475,7 +486,6 @@ ApplicationWindow { PropertyAction { target: calendar; property: "visible"; value: false } PropertyAction { target: settings; property: "visible"; value: false } PropertyAction { target: wifi; property: "visible"; value: false } - PropertyAction { target: menu; property: "focus"; value: false } } }, Transition { @@ -486,22 +496,19 @@ ApplicationWindow { console.log("Viewing item info"); } } PropertyAction { target: itemInfo; property: "visible"; value: true } - PropertyAction { target: menu; property: "focus"; value: false } } }, Transition { from: "*"; to: "loaded" SequentialAnimation { ScriptAction { script: { - controller.breadcrumb("navigation", "main", "navigation"); - console.log("Main display"); + controller.breadcrumb("navigation", "main", "navigation"); + console.log("Main display"); } } PropertyAction { target: calendar; property: "visible"; value: false } PropertyAction { target: settings; property: "visible"; value: false } PropertyAction { target: wifi; property: "visible"; value: false } PropertyAction { target: notifications; property: "visible"; value: false } - PropertyAction { target: menu; property: "focus"; value: false } - PropertyAction { target: appsView; property: "focus"; value: true } } } ] diff --git a/applications/launcher/qml.qrc b/applications/launcher/qml.qrc index 5403ab798..12c1bd624 100644 --- a/applications/launcher/qml.qrc +++ b/applications/launcher/qml.qrc @@ -7,7 +7,6 @@ widgets/BetterButton.qml widgets/BetterCheckBox.qml widgets/BetterSpinBox.qml - widgets/BetterMenu.qml img/icon.png img/wifi/0_bar.png img/wifi/1_bar.png diff --git a/applications/lockscreen/main.cpp b/applications/lockscreen/main.cpp index aeaae8663..c71313c6e 100644 --- a/applications/lockscreen/main.cpp +++ b/applications/lockscreen/main.cpp @@ -6,13 +6,17 @@ #include #include #include +#include #include "controller.h" using namespace codes::eeems::oxide1; using namespace Oxide; +using namespace Oxide::QML; using namespace Oxide::Sentry; +#define DEBUG_EVENTS + int main(int argc, char *argv[]){ deviceSettings.setupQtEnvironment(); QGuiApplication app(argc, argv); @@ -23,8 +27,8 @@ int main(int argc, char *argv[]){ app.setApplicationVersion(APP_VERSION); Controller controller(&app); QQmlApplicationEngine engine; + registerQML(&engine); QQmlContext* context = engine.rootContext(); - context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); context->setContextProperty("controller", &controller); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()){ diff --git a/applications/lockscreen/main.qml b/applications/lockscreen/main.qml index 05fbf1e5c..aecee5bb3 100644 --- a/applications/lockscreen/main.qml +++ b/applications/lockscreen/main.qml @@ -2,144 +2,139 @@ import QtQuick 2.10 import QtQuick.Window 2.3 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.0 +import "qrc:/codes.eeems.oxide" import "widgets" -ApplicationWindow { +OxideWindow { id: window objectName: "window" visible: stateController.state != "loading" - width: screenGeometry.width - height: screenGeometry.height title: qsTr("Oxide") property int itemPadding: 10 FontLoader { id: iconFont; source: "/font/icomoon.ttf" } - Component.onCompleted: controller.startup() - header: Rectangle { - color: "black" - height: menu.height - RowLayout { - id: menu - width: parent.width - Label { Layout.fillWidth: true } - RowLayout { - Layout.fillWidth: true - Layout.alignment: Qt.AlignRight - StatusIcon { - id: wifiState - objectName: "wifiState" - property string state: "unknown" - property int rssi: 0 - property bool connected: false - source: { - var icon; - if(state === "unknown"){ - icon = "unknown"; - }else if(state === "down"){ - icon = "down"; - }else if(!connected){ - icon = "disconnected"; - }else if(rssi > -50) { - icon = "4_bar"; - }else if(rssi > -60){ - icon = "3_bar"; - }else if(rssi > -70){ - icon = "2_bar"; - }else if(rssi > -80){ - icon = "1_bar"; - }else{ - icon = "0_bar"; - } - return "qrc:/img/wifi/" + icon + ".png"; + Component.onCompleted: { + controller.startup(); + pinEntry.forceActiveFocus(); + } + centerMenu: [ + Label { + objectName: "clock" + Layout.alignment: Qt.AlignCenter + color: "white" + } + ] + rightMenu: [ + StatusIcon { + id: wifiState + objectName: "wifiState" + property string state: "unknown" + property int rssi: 0 + property bool connected: false + source: { + var icon; + if(state === "unknown"){ + icon = "unknown"; + }else if(state === "down"){ + icon = "down"; + }else if(!connected){ + icon = "disconnected"; + }else if(rssi > -50) { + icon = "4_bar"; + }else if(rssi > -60){ + icon = "3_bar"; + }else if(rssi > -70){ + icon = "2_bar"; + }else if(rssi > -80){ + icon = "1_bar"; + }else{ + icon = "0_bar"; + } + return "qrc:/img/wifi/" + icon + ".png"; + } + }, + StatusIcon { + id: batteryLevel + objectName: "batteryLevel" + property bool alert: false + property bool warning: false + property bool charging: false + property bool connected: false + property bool present: true + property int level: 0 + source: { + var icon = ""; + if(alert || !present){ + icon = "alert"; + }else if(warning){ + icon = "unknown"; + }else{ + if(charging || connected){ + icon = "charging_"; + } + if(level < 25){ + icon += "20"; + }else if(level < 35){ + icon += "30"; + }else if(level < 55){ + icon += "50"; + }else if(level < 65){ + icon += "60"; + }else if(level < 85){ + icon += "80"; + }else if(level < 95){ + icon += "90"; + }else{ + icon += 100; } } - StatusIcon { - id: batteryLevel - objectName: "batteryLevel" - property bool alert: false - property bool warning: false - property bool charging: false - property bool connected: false - property bool present: true - property int level: 0 - source: { - var icon = ""; - if(alert || !present){ - icon = "alert"; - }else if(warning){ - icon = "unknown"; - }else{ - if(charging || connected){ - icon = "charging_"; - } - if(level < 25){ - icon += "20"; - }else if(level < 35){ - icon += "30"; - }else if(level < 55){ - icon += "50"; - }else if(level < 65){ - icon += "60"; - }else if(level < 85){ - icon += "80"; - }else if(level < 95){ - icon += "90"; - }else{ - icon += 100; - } - } - return "qrc:/img/battery/" + icon + ".png"; + return "qrc:/img/battery/" + icon + ".png"; + } + }, + CustomMenu { + OxideMenu { + id: powerMenu + title: qsTr(""); + font: iconFont.name + width: 260 + color: "white" + backgroundColor: "black" + activeColor: "black" + activeBackgroundColor: "white" + borderColor: "white" + Action { + text: qsTr(" Suspend") + enabled: !controller.sleepInhibited + onTriggered: { + controller.breadcrumb("menu.suspend", "clicked", "ui"); + controller.suspend(); } } - CustomMenu { - BetterMenu { - id: powerMenu - title: qsTr(""); - font: iconFont.name - width: 260 - Action { - text: qsTr(" Suspend") - enabled: !controller.sleepInhibited - onTriggered: { - controller.breadcrumb("menu.suspend", "clicked", "ui"); - controller.suspend(); - } - } - Action { - text: qsTr(" Reboot") - enabled: !controller.powerOffInhibited - onTriggered: { - controller.breadcrumb("menu.reboot", "clicked", "ui"); - controller.reboot(); - } - } - Action { - text: qsTr(" Shutdown") - enabled: !controller.powerOffInhibited - onTriggered: { - controller.breadcrumb("menu.shutdown", "clicked", "ui"); - controller.powerOff(); - } - } + Action { + text: qsTr(" Reboot") + enabled: !controller.powerOffInhibited + onTriggered: { + controller.breadcrumb("menu.reboot", "clicked", "ui"); + controller.reboot(); + } + } + Action { + text: qsTr(" Shutdown") + enabled: !controller.powerOffInhibited + onTriggered: { + controller.breadcrumb("menu.shutdown", "clicked", "ui"); + controller.powerOff(); } } } } - Label { - objectName: "clock" - anchors.centerIn: parent - color: "white" - } - } - background: Rectangle { color: "black" } - contentData: [ - Rectangle { - anchors.fill: parent - color: "black" - }, + ] + initialItem: Item { + anchors.fill: parent PinPad { id: pinEntry + focus: true objectName: "pinEntry" - visible: false + buttonsVisible: !window.landscape showPress: false anchors.centerIn: parent label: { @@ -166,16 +161,18 @@ ApplicationWindow { } message = ""; } - }, - Popup { - visible: stateController.state == "import" - x: (parent.width / 2) - (width / 2) - y: (parent.height / 2) - (height / 2) + } + } + Component { + id: importDialog + Rectangle{ + color: "white" + anchors.centerIn: parent width: 1000 + height: contentItem.implicitHeight clip: true - closePolicy: Popup.NoAutoClose ColumnLayout { - anchors.fill: parent + anchors.centerIn: parent RowLayout { Item { Layout.fillWidth: true } Label { @@ -209,16 +206,18 @@ ApplicationWindow { } } } - }, - Popup { - visible: stateController.state == "pinPrompt" - x: (parent.width / 2) - (width / 2) - y: (parent.height / 2) - (height / 2) + } + } + Component { + id: pinPrompt + Rectangle{ + color: "white" + anchors.centerIn: parent width: 1000 + height: contentItem.implicitHeight clip: true - closePolicy: Popup.NoAutoClose ColumnLayout { - anchors.fill: parent + anchors.centerIn: parent RowLayout { Item { Layout.fillWidth: true } Label { @@ -252,16 +251,18 @@ ApplicationWindow { } } } - }, - Popup { - visible: stateController.state == "telemetry" - x: (parent.width / 2) - (width / 2) - y: (parent.height / 2) - (height / 2) + } + } + Component { + id: telemetryDialog + Rectangle{ + color: "white" + anchors.centerIn: parent + height: contentItem.implicitHeight width: 1000 clip: true - closePolicy: Popup.NoAutoClose ColumnLayout { - anchors.fill: parent + anchors.centerIn: parent RowLayout { Item { Layout.fillWidth: true } Label { @@ -272,7 +273,6 @@ ApplicationWindow { } Label { text: "Oxide has basic telemetry and crash reporting.\nWould you like to enable it?\nSee https://oxide.eeems.codes/faq.html for more\ninformation." - Layout.fillWidth: true } Item { @@ -333,9 +333,9 @@ ApplicationWindow { } } } - } } - ] + } + } StateGroup { id: stateController objectName: "stateController" @@ -358,27 +358,28 @@ ApplicationWindow { controller.breadcrumb("navigation", "main", "navigation"); console.log("PIN Entry"); pinEntry.value = ""; + pinEntry.forceActiveFocus(); + window.stack.pop(window.stack.initialItem); } } - PropertyAction { target: pinEntry; property: "visible"; value: true } } }, Transition { from: "*"; to: "pinPrompt" SequentialAnimation { - PropertyAction { target: pinEntry; property: "visible"; value: false } ScriptAction { script: { - controller.breadcrumb("navigation", "pinPrompt", "navigation"); + controller.breadcrumb("navigation", "pinPrompt", "navigation"); console.log("Prompt for PIN creation"); + window.stack.push(pinPrompt); } } } }, Transition { from: "*"; to: "telemetry" SequentialAnimation { - PropertyAction { target: pinEntry; property: "visible"; value: false } ScriptAction { script: { - controller.breadcrumb("navigation", "telemetry", "navigation"); + controller.breadcrumb("navigation", "telemetry", "navigation"); console.log("Telemetry opt-in screen"); + window.stack.push(telemetryDialog); } } } }, @@ -389,8 +390,9 @@ ApplicationWindow { controller.breadcrumb("navigation", "confirmPin", "navigation"); console.log("PIN Confirmation"); pinEntry.value = ""; + pinEntry.forceActiveFocus(); + window.stack.pop(window.stack.initialItem); } } - PropertyAction { target: pinEntry; property: "visible"; value: true } } }, Transition { @@ -399,8 +401,8 @@ ApplicationWindow { ScriptAction { script: { controller.breadcrumb("navigation", "import", "navigation"); console.log("Import PIN"); + window.stack.push(importDialog); } } - PropertyAction { target: pinEntry; property: "visible"; value: false } } }, Transition { @@ -410,28 +412,30 @@ ApplicationWindow { controller.breadcrumb("navigation", "prompt", "navigation"); console.log("PIN Setup"); pinEntry.value = ""; + pinEntry.forceActiveFocus(); + window.stack.pop(window.stack.initialItem); } } - PropertyAction { target: pinEntry; property: "visible"; value: true } } }, Transition { from: "*"; to: "noPin" SequentialAnimation { ScriptAction { script: controller.breadcrumb("navigation", "noPin", "navigation"); } - PropertyAction { target: pinEntry; property: "visible"; value: false } } }, Transition { from: "*"; to: "loading" SequentialAnimation { - PropertyAction { target: pinEntry; property: "visible"; value: false } ScriptAction { script: { - controller.breadcrumb("navigation", "loading", "navigation"); + controller.breadcrumb("navigation", "loading", "navigation"); console.log("Loading display"); controller.startup(); + window.stack.pop(window.stack.initialItem); } } } } ] } + onKeyPressed: (event) => pinEntry.keyPress(event) + onKeyReleased: (event) => pinEntry.keyRelease(event) } diff --git a/applications/lockscreen/qml.qrc b/applications/lockscreen/qml.qrc index 145bc8d50..0adbaf035 100644 --- a/applications/lockscreen/qml.qrc +++ b/applications/lockscreen/qml.qrc @@ -20,7 +20,6 @@ img/battery/20.png font/icomoon.ttf widgets/CustomMenu.qml - widgets/BetterMenu.qml img/wifi/unknown.png img/wifi/down.png img/wifi/disconnected.png diff --git a/applications/lockscreen/widgets/BetterMenu.qml b/applications/lockscreen/widgets/BetterMenu.qml deleted file mode 100644 index 935b650ea..000000000 --- a/applications/lockscreen/widgets/BetterMenu.qml +++ /dev/null @@ -1,66 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.4 - -Menu { - id: root - property color backgroundColor: "black" - property color textColor: "white" - property color borderColor: "black" - delegate: MenuItem { - id: menuItem - implicitWidth: 250 - implicitHeight: 60 - arrow: Canvas { - x: parent.width - width - implicitWidth: 40 - implicitHeight: 40 - visible: menuItem.subMenu - onPaint: { - var ctx = getContext("2d") - ctx.fillStyle = root.textColor - ctx.moveTo(15, 15) - ctx.lineTo(width - 15, height / 2) - ctx.lineTo(15, height - 15) - ctx.closePath() - ctx.fill() - } - } - indicator: Item { - implicitWidth: 40 - implicitHeight: 40 - Rectangle { - width: 26 - height: 26 - anchors.centerIn: parent - visible: menuItem.checkable - border.color: root.borderColor - radius: 3 - Rectangle { - width: 14 - height: 14 - anchors.centerIn: parent - visible: menuItem.checked - color: root.backgroundColor - radius: 2 - } - } - } - contentItem: Text { - leftPadding: menuItem.checkable ? menuItem.indicator.width : 0 - rightPadding: menuItem.subMenu ? menuItem.arrow.width : 0 - text: menuItem.text - font: menuItem.font - opacity: enabled ? 1.0 : 0.3 - color: root.textColor - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - } - background: Rectangle { - implicitWidth: menuItem.implicitWidth - implicitHeight: menuItem.implicitHeight - opacity: enabled ? 1 : 0.3 - color: root.backgroundColor - } - } -} diff --git a/applications/lockscreen/widgets/PinPad.qml b/applications/lockscreen/widgets/PinPad.qml index 33aace467..6a8fc626b 100644 --- a/applications/lockscreen/widgets/PinPad.qml +++ b/applications/lockscreen/widgets/PinPad.qml @@ -5,15 +5,17 @@ import "." GridLayout { id: root + focus: true property string value: "" property string label: "PIN" property string message: "" property bool showPress: true + property alias buttonsVisible: buttons.visible signal submit(string pin) anchors.centerIn: parent - rowSpacing: children[3].width / 2 - columnSpacing: children[3].width / 2 + rowSpacing: buttons.rowSpacing + columnSpacing: buttons.columnSpacing columns: 3 rows: 6 @@ -28,6 +30,49 @@ GridLayout { } submitTimer.start(); } + function keyPress(event){ + event.accepted = true; + + } + + function keyRelease(event){ + switch(event.key){ + case Qt.Key_0: + button0.clicked(); + break; + case Qt.Key_1: + button1.clicked(); + break; + case Qt.Key_2: + button2.clicked(); + break; + case Qt.Key_3: + button3.clicked(); + break; + case Qt.Key_4: + button4.clicked(); + break; + case Qt.Key_5: + button5.clicked(); + break; + case Qt.Key_6: + button6.clicked(); + break; + case Qt.Key_7: + button7.clicked(); + break; + case Qt.Key_8: + button8.clicked(); + break; + case Qt.Key_9: + button9.clicked(); + break; + case Qt.Key_Backspace: + buttonBackspace.clicked(); + break; + } + event.accepted = true; + } Timer { id: submitTimer @@ -103,34 +148,44 @@ GridLayout { } Item { Layout.fillWidth: true } } + GridLayout { + id: buttons + rowSpacing: children[3].width / 2 + columnSpacing: children[3].width / 2 + Layout.columnSpan: 3 + Layout.rowSpan: 4 + columns: 3 + rows: 4 + PinButton { id: button1; text: "1"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button2; text: "2"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button3; text: "3"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "1"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "2"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "3"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - - PinButton { text: "4"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "5"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "6"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button4; text: "4"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button5; text: "5"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button6; text: "6"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "7"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "8"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { text: "9"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button7; text: "7"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button8; text: "8"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { id: button9; text: "9"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - Item { Layout.fillWidth: true } - PinButton { text: "0"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } - PinButton { - contentItem: Item { - Image { - anchors.centerIn: parent - width: parent.width / 2 - height: width - source: "qrc:/img/backspace.png" - fillMode: Image.PreserveAspectFit + Item { Layout.fillWidth: true } + PinButton { id: button0; text: "0"; onClicked: root.add(text); enabled: root.buttonsEnabled(); showPress: root.showPress } + PinButton { + id: buttonBackspace + contentItem: Item { + Image { + anchors.centerIn: parent + width: parent.width / 2 + height: width + source: "qrc:/img/backspace.png" + fillMode: Image.PreserveAspectFit + } } + hideBorder: true + onClicked: root.value = root.value.slice(0, -1) + enabled: root.value.length + showPress: root.showPress } - hideBorder: true - onClicked: root.value = root.value.slice(0, -1) - enabled: root.value.length - showPress: root.showPress } + Keys.onPressed: keyPress } diff --git a/applications/process-manager/main.cpp b/applications/process-manager/main.cpp index af506fd5b..2e8630a2a 100755 --- a/applications/process-manager/main.cpp +++ b/applications/process-manager/main.cpp @@ -9,11 +9,13 @@ #include #include #include +#include #include "controller.h" using namespace std; using namespace Oxide; +using namespace Oxide::QML; using namespace Oxide::Sentry; int main(int argc, char *argv[]){ @@ -26,9 +28,9 @@ int main(int argc, char *argv[]){ app.setApplicationDisplayName("Process Monitor"); app.setApplicationVersion(APP_VERSION); QQmlApplicationEngine engine; + registerQML(&engine); QQmlContext* context = engine.rootContext(); Controller controller(&engine); - context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); context->setContextProperty("controller", &controller); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()){ diff --git a/applications/process-manager/main.qml b/applications/process-manager/main.qml index 765f187af..88fe76f26 100755 --- a/applications/process-manager/main.qml +++ b/applications/process-manager/main.qml @@ -2,13 +2,13 @@ import QtQuick 2.10 import QtQuick.Window 2.3 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.11 +import "qrc:/codes.eeems.oxide" import "widgets" -ApplicationWindow { +OxideWindow { id: window visible: true - width: screenGeometry.width - height: screenGeometry.height + backgroundColor: "white" onAfterSynchronizing: { if (stateController.state == "loading") { stateController.state = "loaded"; @@ -21,37 +21,30 @@ ApplicationWindow { running: true onTriggered: controller.reload() } - - menuBar: ColumnLayout { - width: parent.width - ToolBar { - Layout.fillWidth: true - background: Rectangle { color: "black" } - RowLayout { - width: parent.width - BetterButton { - text: "⬅️" - onClicked: quitTimer.start() - Timer { - id: quitTimer - interval: 1000 - onTriggered: { - controller.breadcrumb("back", "click", "ui"); - Qt.quit(); - } - } - } - Item { Layout.fillWidth: true } - Label { - text: "Process Manager" - color: "white" - anchors.centerIn: parent + leftMenu: [ + BetterButton { + text: "⬅️" + onClicked: quitTimer.start() + Timer { + id: quitTimer + interval: 1000 + onTriggered: { + controller.breadcrumb("back", "click", "ui"); + Qt.quit(); } } } + ] + centerMenu: [ + Label { + text: "Process Manager" + color: "white" + } + ] + initialItem: Item{ RowLayout { id: tasksViewHeaderContent - Layout.fillWidth: true + width: parent.width Label { text: "Process" color: "black" @@ -124,11 +117,9 @@ ApplicationWindow { } Item { width: scrollbar.width } } - } - background: Rectangle { color: "white" } - contentData: [ ColumnLayout { anchors.fill: parent + anchors.topMargin: tasksViewHeaderContent.height BetterButton { text: "▲" visible: !tasksView.atYBeginning @@ -336,8 +327,8 @@ ApplicationWindow { } } } - ] - footer: ToolBar { + } + page.footer: ToolBar { background: Rectangle { color: "black" } } StateGroup { diff --git a/applications/screenshot-viewer/main.cpp b/applications/screenshot-viewer/main.cpp index a41248e98..597f24245 100644 --- a/applications/screenshot-viewer/main.cpp +++ b/applications/screenshot-viewer/main.cpp @@ -6,11 +6,13 @@ #include #include #include +#include #include "controller.h" using namespace std; using namespace Oxide; +using namespace Oxide::QML; using namespace Oxide::Sentry; void sigHandler(int signal){ @@ -29,8 +31,8 @@ int main(int argc, char *argv[]){ app.setApplicationVersion(APP_VERSION); Controller controller(&app); QQmlApplicationEngine engine; + registerQML(&engine); QQmlContext* context = engine.rootContext(); - context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); context->setContextProperty("controller", &controller); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()){ diff --git a/applications/screenshot-viewer/main.qml b/applications/screenshot-viewer/main.qml index f2a00c506..e889b2148 100644 --- a/applications/screenshot-viewer/main.qml +++ b/applications/screenshot-viewer/main.qml @@ -2,14 +2,14 @@ import QtQuick 2.10 import QtQuick.Window 2.3 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.0 +import "qrc:/codes.eeems.oxide" import "./widgets" -ApplicationWindow { +OxideWindow { id: window objectName: "window" visible: stateController.state !== "loading" - width: screenGeometry.width - height: screenGeometry.height + backgroundColor: "white" title: { if(stateController.state !== "viewing" || !viewer.model){ return Qt.application.displayName; @@ -17,96 +17,103 @@ ApplicationWindow { return viewer.model.display.path; } FontLoader { id: iconFont; source: "/font/icomoon.ttf" } - Component.onCompleted: { - controller.startup(); + Component.onCompleted: controller.startup() + Shortcut{ + sequence: StandardKey.Quit + context: Qt.ApplicationShortcut + onActivated: Qt.quit() } - header: Rectangle { - color: "black" - height: menu.height - RowLayout { - id: menu - anchors.left: parent.left - anchors.right: parent.right - Label { - text: "⬅️" - color: "white" - topPadding: 5 - bottomPadding: 5 - leftPadding: 10 - rightPadding: 10 - MouseArea { - anchors.fill: parent - onClicked: { - controller.breadcrumb("back", "click", "ui"); - if(stateController.state !== "viewing"){ - Qt.quit(); - return; - } - viewer.model = undefined; - stateController.state = "loaded"; + Shortcut{ + sequences: [StandardKey.Cancel, Qt.Key_Backspace] + context: Qt.ApplicationShortcut + onActivated: backButton.clicked() + } + Shortcut{ + sequence: StandardKey.Delete + context: Qt.ApplicationShortcut + onActivated: deleteButton.clicked() + } + + leftMenu: [ + Label { + text: "⬅️" + color: "white" + topPadding: 5 + bottomPadding: 5 + leftPadding: 10 + rightPadding: 10 + MouseArea { + id: backButton + anchors.fill: parent + onClicked: { + controller.breadcrumb("back", "click", "ui"); + if(stateController.state !== "viewing"){ + Qt.quit(); + return; } + viewer.model = undefined; + stateController.state = "loaded"; } } - Item { Layout.fillWidth: true } - Label { - color: "white" - text: window.title - } - Item { Layout.fillWidth: true } - Label { - text: "Delete" - color: "white" - visible: stateController.state === "viewing" - topPadding: 5 - bottomPadding: 5 - leftPadding: 10 - rightPadding: 10 - MouseArea { - anchors.fill: parent - onClicked: { - controller.breadcrumb("menu.delete", "click", "ui"); - controller.screenshots.remove(viewer.model.display.path); - viewer.model = undefined; - stateController.state = "loading"; - } + } + ] + centerMenu: [ + Label { + color: "white" + text: window.title + } + ] + rightMenu: [ + Label { + text: "Delete" + color: "white" + visible: stateController.state === "viewing" + topPadding: 5 + bottomPadding: 5 + leftPadding: 10 + rightPadding: 10 + MouseArea { + id: deleteButton + anchors.fill: parent + onClicked: { + controller.breadcrumb("menu.delete", "click", "ui"); + controller.screenshots.remove(viewer.model.display.path); + viewer.model = undefined; + stateController.state = "loading"; } } - CustomMenu { - visible: stateController.state === "loaded" - BetterMenu { - title: qsTr(""); - font: iconFont.name - width: 310 - Action { - text: controller.columns === 4 ? "* Small" : "Small" - onTriggered: { - controller.breadcrumb("menu.small", "click", "ui"); - controller.columns = 4; - } + }, + CustomMenu { + visible: stateController.state === "loaded" + OxideMenu { + title: qsTr(""); + font: iconFont.name + width: 310 + Action { + text: controller.columns === 4 ? "* Small" : "Small" + onTriggered: { + controller.breadcrumb("menu.small", "click", "ui"); + controller.columns = 4; } - Action { - text: controller.columns === 3 ? "* Medium" : "Medium" - onTriggered: { - controller.breadcrumb("menu.medium", "click", "ui"); - controller.columns = 3; - } + } + Action { + text: controller.columns === 3 ? "* Medium" : "Medium" + onTriggered: { + controller.breadcrumb("menu.medium", "click", "ui"); + controller.columns = 3; } - Action { - text: controller.columns === 2 ? "* Large" : "Large" - onTriggered: { - controller.breadcrumb("menu.large", "click", "ui"); - controller.columns = 2; - } + } + Action { + text: controller.columns === 2 ? "* Large" : "Large" + onTriggered: { + controller.breadcrumb("menu.large", "click", "ui"); + controller.columns = 2; } } } } - } - contentData: [ - Rectangle { - anchors.fill: parent - color: "white" - }, + ] + initialItem: Item{ ColumnLayout { anchors.fill: parent enabled: stateController.state == "loaded" @@ -199,7 +206,7 @@ ApplicationWindow { } } } - }, + } Item { id: viewer anchors.fill: parent @@ -221,7 +228,7 @@ ApplicationWindow { sourceSize.height: height } } - ] + } StateGroup { id: stateController objectName: "stateController" diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index 641cbd638..2632c5f37 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -9,6 +10,7 @@ #include "systemapi.h" #include "buttonhandler.h" #include "digitizerhandler.h" +#include "notificationapi.h" using namespace Oxide::Applications; @@ -480,9 +482,10 @@ void Application::showSplashScreen(){ Oxide::Sentry::sentry_span(t, "paint", "Draw splash screen", [this, frameBuffer](){ dispatchToMainThread([this, frameBuffer]{ QPainter painter(frameBuffer); - auto fm = painter.fontMetrics(); auto size = frameBuffer->size(); - painter.fillRect(frameBuffer->rect(), Qt::white); + auto rect = frameBuffer->rect(); + auto fm = painter.fontMetrics(); + painter.fillRect(rect, Qt::white); QString splashPath = splash(); if(splashPath.isEmpty() || !QFile::exists(splashPath)){ splashPath = icon(); @@ -491,7 +494,11 @@ void Application::showSplashScreen(){ qDebug() << "Using image" << splashPath; int splashWidth = size.width() / 2; QSize splashSize(splashWidth, splashWidth); - QImage splash = QImage(splashPath).scaled(splashSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + QImage splash = QImage(splashPath); + if(systemAPI->landscape()){ + splash = splash.transformed(QTransform().rotate(90.0)); + } + splash = splash.scaled(splashSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); QRect splashRect( QPoint( (size.width() / 2) - (splashWidth / 2), @@ -502,21 +509,8 @@ void Application::showSplashScreen(){ painter.drawImage(splashRect, splash, splash.rect()); EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); } - painter.setPen(Qt::black); - auto text = "Loading " + displayName() + "..."; - int padding = 10; - int textHeight = fm.height() + padding; - QRect textRect( - QPoint(0 + padding, size.height() - textHeight), - QSize(size.width() - padding * 2, textHeight) - ); - painter.drawText( - textRect, - Qt::AlignVCenter | Qt::AlignRight, - text - ); - EPFrameBuffer::sendUpdate(textRect, EPFrameBuffer::Grayscale, EPFrameBuffer::PartialUpdate, true); painter.end(); + notificationAPI->drawNotificationText("Loading " + displayName() + "..."); }); }); qDebug() << "Waitng for screen to finish..."; @@ -555,4 +549,46 @@ void Application::startSpan(std::string operation, std::string description){ span = Oxide::Sentry::start_span(transaction, operation, description); } +void Application::recallScreen() { + if (m_screenCapture == nullptr) { + return; + } + Oxide::Sentry::sentry_transaction( + "application", "recallScreen", [this](Oxide::Sentry::Transaction *t) { + qDebug() << "Uncompressing screen..."; + QImage img; + Oxide::Sentry::sentry_span( + t, "decompress", "Decompress the framebuffer", [this, &img] { + img = QImage::fromData(screenCaptureNoSecurityCheck(), "JPG"); + }); + if (img.isNull()) { + qDebug() << "Screen capture was corrupt"; + qDebug() << m_screenCapture->size(); + delete m_screenCapture; + return; + } + qDebug() << "Recalling screen..."; + Oxide::Sentry::sentry_span( + t, "recall", "Recall the screen", [this, img] { + dispatchToMainThread([img] { + auto size = EPFrameBuffer::framebuffer()->size(); + QRect rect(0, 0, size.width(), size.height()); + auto frameBuffer = EPFrameBuffer::framebuffer(); + QPainter painter(frameBuffer); + painter.drawImage(rect, img); + painter.end(); + EPFrameBuffer::sendUpdate( + rect, + EPFrameBuffer::HighQualityGrayscale, + EPFrameBuffer::FullUpdate, + true + ); + EPFrameBuffer::waitForLastUpdate(); + }); + delete m_screenCapture; + m_screenCapture = nullptr; + }); + qDebug() << "Screen recalled."; + }); +} #include "moc_application.cpp" diff --git a/applications/system-service/application.h b/applications/system-service/application.h index 65c6e5069..6bed93a00 100644 --- a/applications/system-service/application.h +++ b/applications/system-service/application.h @@ -382,39 +382,7 @@ class Application : public QObject{ qDebug() << "Screen saved " << m_screenCapture->size() << "bytes"; }); } - void recallScreen(){ - if(m_screenCapture == nullptr){ - return; - } - Oxide::Sentry::sentry_transaction("application", "recallScreen", [this](Oxide::Sentry::Transaction* t){ - qDebug() << "Uncompressing screen..."; - QImage img; - Oxide::Sentry::sentry_span(t, "decompress", "Decompress the framebuffer", [this, &img]{ - img = QImage::fromData(screenCaptureNoSecurityCheck(), "JPG"); - }); - if(img.isNull()){ - qDebug() << "Screen capture was corrupt"; - qDebug() << m_screenCapture->size(); - delete m_screenCapture; - return; - } - qDebug() << "Recalling screen..."; - Oxide::Sentry::sentry_span(t, "recall", "Recall the screen", [this, img]{ - dispatchToMainThread([img]{ - auto size = EPFrameBuffer::framebuffer()->size(); - QRect rect(0, 0, size.width(), size.height()); - QPainter painter(EPFrameBuffer::framebuffer()); - painter.drawImage(rect, img); - painter.end(); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); - EPFrameBuffer::waitForLastUpdate(); - }); - delete m_screenCapture; - m_screenCapture = nullptr; - }); - qDebug() << "Screen recalled."; - }); - } + void recallScreen(); void waitForFinished(){ if(m_process->processId()){ m_process->waitForFinished(); @@ -541,14 +509,26 @@ private slots: } void updateEnvironment(){ auto env = QProcessEnvironment::systemEnvironment(); + auto envPath = env.value("PATH", DEFAULT_PATH).split(":"); auto defaults = QString(DEFAULT_PATH).split(":"); - auto envPath = env.value("PATH", DEFAULT_PATH); for(auto item : defaults){ if(!envPath.contains(item)){ envPath.append(item); } } - env.insert("PATH", envPath); + env.insert("PATH", envPath.join(":")); + auto preload = env.value("LD_PRELOAD", "").split(":"); + QString sysfs_preload("/opt/lib/libsysfs_preload.so"); + if(!preload.contains(sysfs_preload)){ + preload.append(sysfs_preload); + } + if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ + QString rm2fb_client("/opt/lib/librm2fb_client.so"); + if(!preload.contains(rm2fb_client)){ + preload.append(rm2fb_client); + } + } + env.insert("LD_PRELOAD", preload.join(":")); for(auto key : environment().keys()){ env.insert(key, environment().value(key, "").toString()); } diff --git a/applications/system-service/appsapi.cpp b/applications/system-service/appsapi.cpp index 0976e541e..d146188bf 100644 --- a/applications/system-service/appsapi.cpp +++ b/applications/system-service/appsapi.cpp @@ -2,6 +2,7 @@ #include "appsapi.h" #include "notificationapi.h" +#include "systemapi.h" using namespace Oxide; @@ -185,4 +186,57 @@ void AppsAPI::ensureForegroundApp() { }); } +AppsAPI::~AppsAPI() { + m_stopping = true; + writeApplications(); + settings.sync(); + dispatchToMainThread([this] { + auto frameBuffer = EPFrameBuffer::framebuffer(); + qDebug() << "Waiting for other painting to finish..."; + while (frameBuffer->paintingActive()) { + EPFrameBuffer::waitForLastUpdate(); + } + QPainter painter(frameBuffer); + auto rect = frameBuffer->rect(); + auto fm = painter.fontMetrics(); + qDebug() << "Clearing screen..."; + painter.setPen(Qt::white); + painter.fillRect(rect, Qt::black); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + EPFrameBuffer::waitForLastUpdate(); + painter.end(); + qDebug() << "Stopping applications..."; + for (auto app : applications) { + if (app->stateNoSecurityCheck() != Application::Inactive) { + auto text = "Stopping " + app->displayName() + "..."; + qDebug() << text.toStdString().c_str(); + notificationAPI->drawNotificationText(text, Qt::white, Qt::black); + EPFrameBuffer::waitForLastUpdate(); + } + app->stopNoSecurityCheck(); + } + qDebug() << "Ensuring all applications have stopped..."; + for (auto app : applications) { + app->waitForFinished(); + app->deleteLater(); + } + applications.clear(); + QPainter painter2(frameBuffer); + qDebug() << "Displaying final quit message..."; + painter2.fillRect(rect, Qt::black); + painter2.setPen(Qt::white); + if(systemAPI->landscape()){ + auto x = rect.width() / 2; + auto y = rect.height() / 2; + painter2.translate(x, y); + painter2.rotate(90.0); + painter2.translate(-x, -y); + } + painter2.drawText(rect, Qt::AlignCenter, "Goodbye!"); + EPFrameBuffer::waitForLastUpdate(); + EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); + painter2.end(); + EPFrameBuffer::waitForLastUpdate(); + }); +} #include "moc_appsapi.cpp" diff --git a/applications/system-service/appsapi.h b/applications/system-service/appsapi.h index 6d0b54a65..3d1574804 100644 --- a/applications/system-service/appsapi.h +++ b/applications/system-service/appsapi.h @@ -47,62 +47,7 @@ class AppsAPI : public APIBase { return instance; } AppsAPI(QObject* parent); - ~AppsAPI() { - m_stopping = true; - writeApplications(); - settings.sync(); - dispatchToMainThread([this]{ - auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; - while(frameBuffer->paintingActive()){ - EPFrameBuffer::waitForLastUpdate(); - } - QPainter painter(frameBuffer); - auto rect = frameBuffer->rect(); - auto fm = painter.fontMetrics(); - auto size = frameBuffer->size(); - qDebug() << "Clearing screen..."; - painter.setPen(Qt::white); - painter.fillRect(rect, Qt::black); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); - EPFrameBuffer::waitForLastUpdate(); - qDebug() << "Stopping applications..."; - for(auto app : applications){ - if(app->stateNoSecurityCheck() != Application::Inactive){ - auto text = "Stopping " + app->displayName() + "..."; - qDebug() << text.toStdString().c_str(); - int padding = 10; - int textHeight = fm.height() + padding; - QRect textRect( - QPoint(0 + padding, size.height() - textHeight), - QSize(size.width() - padding * 2, textHeight) - ); - painter.fillRect(textRect, Qt::black); - painter.drawText( - textRect, - Qt::AlignVCenter | Qt::AlignRight, - text - ); - EPFrameBuffer::sendUpdate(textRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); - EPFrameBuffer::waitForLastUpdate(); - } - app->stopNoSecurityCheck(); - } - qDebug() << "Ensuring all applications have stopped..."; - for(auto app : applications){ - app->waitForFinished(); - app->deleteLater(); - } - applications.clear(); - qDebug() << "Displaying final quit message..."; - painter.fillRect(rect, Qt::black); - painter.drawText(rect, Qt::AlignCenter,"Goodbye!"); - EPFrameBuffer::waitForLastUpdate(); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); - painter.end(); - EPFrameBuffer::waitForLastUpdate(); - }); - } + ~AppsAPI(); void startup(); int state() { return 0; } // Ignore this, it's a kludge to get the xml to generate @@ -547,6 +492,36 @@ public slots: qDebug() << "Opening task switcher"; app->launchNoSecurityCheck(); } + void openTerminal(){ + if(locked() || !hasPermission("apps")){ + return; + } + auto path = this->currentApplicationNoSecurityCheck(); + if(path.path() != "/"){ + auto currentApplication = getApplication(path); + if( + currentApplication != nullptr + && currentApplication->stateNoSecurityCheck() != Application::Inactive + ){ + if(path == m_lockscreenApplication){ + qDebug() << "Can't open task switcher, on the lockscreen"; + return; + } + } + } + auto app = getApplication("yaft"); + if(app != nullptr){ + app->launchNoSecurityCheck(); + return; + } + app = getApplication("fingerterm"); + if(app == nullptr){ + qDebug() << "Unable to find terminal application"; + return; + } + qDebug() << "Opening terminal"; + app->launchNoSecurityCheck(); + } private: bool m_stopping; diff --git a/applications/system-service/controller.h b/applications/system-service/controller.h new file mode 100644 index 000000000..b95d47bae --- /dev/null +++ b/applications/system-service/controller.h @@ -0,0 +1,42 @@ +#pragma once + +#include + +#include "appsapi.h" +#include "screenapi.h" + +class Controller : public QObject{ + Q_OBJECT + +public: + explicit Controller(QObject* parent = nullptr) : QObject(parent){} + Q_INVOKABLE void screenshot(){ screenAPI->screenshot(); } + Q_INVOKABLE void taskSwitcher(){ appsAPI->openTaskSwitcher(); } + Q_INVOKABLE void processManager(){ appsAPI->openTaskManager(); } + Q_INVOKABLE void back(){ appsAPI->previousApplication(); } + Q_INVOKABLE void lock(){ appsAPI->openLockScreen(); } + Q_INVOKABLE void terminal(){ appsAPI->openTerminal(); } + Q_INVOKABLE void close(){ + auto path = appsAPI->currentApplicationNoSecurityCheck(); + if(path.path() == "/"){ + return; + } + if(path == appsAPI->lockscreenApplication()){ + return; + } + if(path == appsAPI->startupApplication()){ + return; + } + if(path == appsAPI->taskSwitcherApplication()){ + return; + } + auto currentApplication = appsAPI->getApplication(path); + if( + currentApplication == nullptr + || currentApplication->stateNoSecurityCheck() == Application::Inactive + ){ + return; + } + currentApplication->stop(); + } +}; diff --git a/applications/system-service/dbusservice.h b/applications/system-service/dbusservice.h index 4ae7a5254..5aac4509e 100644 --- a/applications/system-service/dbusservice.h +++ b/applications/system-service/dbusservice.h @@ -141,9 +141,11 @@ class DBusService : public APIBase { sentry_breadcrumb("dbusservice", "Connecting button handler events", "info"); #endif Oxide::Sentry::sentry_span(t, "connect", "Connect events", []{ - connect(buttonHandler, &ButtonHandler::leftHeld, systemAPI, &SystemAPI::leftAction); - connect(buttonHandler, &ButtonHandler::homeHeld, systemAPI, &SystemAPI::homeAction); - connect(buttonHandler, &ButtonHandler::rightHeld, systemAPI, &SystemAPI::rightAction); + if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM1){ + connect(buttonHandler, &ButtonHandler::leftHeld, systemAPI, &SystemAPI::leftAction); + connect(buttonHandler, &ButtonHandler::homeHeld, systemAPI, &SystemAPI::homeAction); + connect(buttonHandler, &ButtonHandler::rightHeld, systemAPI, &SystemAPI::rightAction); + } connect(buttonHandler, &ButtonHandler::powerHeld, systemAPI, &SystemAPI::powerAction); connect(buttonHandler, &ButtonHandler::powerPress, systemAPI, &SystemAPI::suspend); connect(buttonHandler, &ButtonHandler::activity, systemAPI, &SystemAPI::activity); diff --git a/applications/system-service/digitizerhandler.h b/applications/system-service/digitizerhandler.h index 98bd5d3b8..e0e8e7c2b 100644 --- a/applications/system-service/digitizerhandler.h +++ b/applications/system-service/digitizerhandler.h @@ -54,9 +54,6 @@ class DigitizerHandler : public QThread { instance->start(); return instance; } - static string exec(const char* cmd); - static vector split_string_by_newline(const std::string& str); - static int is_uint(string input); DigitizerHandler(event_device& device) : QThread(), diff --git a/applications/system-service/eventlistener.cpp b/applications/system-service/eventlistener.cpp new file mode 100644 index 000000000..1139fc54b --- /dev/null +++ b/applications/system-service/eventlistener.cpp @@ -0,0 +1,37 @@ +#include "eventlistener.h" + +#include + +EventListener* EventListener::instance(){ + static EventListener* instance = nullptr; + if(instance == nullptr){ + instance = new EventListener(); + qApp->installEventFilter(static_cast(instance)); + } + return instance; +} + +EventListener::EventListener() : QObject(){} + +bool EventListener::eventFilter(QObject* object, QEvent* event){ + QMutexLocker locker(&m_mutex); + Q_UNUSED(locker); + for(auto hook : m_hooks){ + if(hook(object, event)){ + return true; + } + } + return false; +} + +void EventListener::append(std::function hook){ + QMutexLocker locker(&m_mutex); + Q_UNUSED(locker); + m_hooks.append(hook); +} + +void EventListener::clear(){ + QMutexLocker locker(&m_mutex); + Q_UNUSED(locker); + m_hooks.clear(); +} diff --git a/applications/system-service/eventlistener.h b/applications/system-service/eventlistener.h new file mode 100644 index 000000000..4da724c42 --- /dev/null +++ b/applications/system-service/eventlistener.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#define eventListener EventListener::instance() + +class EventListener : QObject +{ + Q_OBJECT +public: + static EventListener* instance(); + EventListener(); + + bool eventFilter(QObject* object, QEvent* event); + void append(std::function hook); + void clear(); + +private: + QMutex m_mutex; + QList> m_hooks; +}; diff --git a/applications/system-service/main.cpp b/applications/system-service/main.cpp index 9c2856789..95b658bc1 100755 --- a/applications/system-service/main.cpp +++ b/applications/system-service/main.cpp @@ -1,12 +1,17 @@ #include #include #include +#include +#include +#include +#include #include #include #include #include "dbusservice.h" +#include "controller.h" using namespace std; using namespace Oxide::Sentry; @@ -41,7 +46,14 @@ bool stopProcess(pid_t pid){ int main(int argc, char* argv[]){ if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2 && getenv("RM2FB_ACTIVE") == nullptr){ + bool enabled = Oxide::debugEnabled(); + if(!enabled){ + qputenv("DEBUG", "1"); + } O_WARNING("rm2fb not detected. Running xochitl instead!"); + if(!enabled){ + qputenv("DEBUG", "0"); + } return QProcess::execute("/usr/bin/xochitl", QStringList()); } deviceSettings.setupQtEnvironment(false); @@ -130,5 +142,18 @@ int main(int argc, char* argv[]){ QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ remove(pidPath); }); + QQmlApplicationEngine engine; + QQmlContext* context = engine.rootContext(); + Controller controller(&app); + context->setContextProperty("controller", &controller); + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()){ + QScreen* screen = app.primaryScreen(); + QWindow window(screen); + window.resize(screen->size()); + window.setPosition(0, 0); + window.setOpacity(0); + window.show(); + } return app.exec(); } diff --git a/applications/system-service/main.qml b/applications/system-service/main.qml new file mode 100644 index 000000000..2e7ba608f --- /dev/null +++ b/applications/system-service/main.qml @@ -0,0 +1,39 @@ +import QtQuick 2.15 +import QtQuick.Window 2.15 + +Window{ + width: Screen.width + height: Screen.width + x: 0 + y: 0 + opacity: 0 + visible: true + Shortcut{ + sequences: ["Alt+Tab"] + onActivated: controller.taskSwitcher() + } + Shortcut{ + sequences: ["Shift+Meta+S", "Shift+End+S", StandardKey.Print] + onActivated: controller.screenshot() + } + Shortcut{ + sequences: ["Ctrl+Shift+Esc", "Ctrl+Shift+1", Qt.Key_Launch0] + onActivated: controller.processManager() + } + Shortcut{ + sequences: ["Meta+Backspace", "End+Backspace"] + onActivated: controller.back() + } + Shortcut{ + sequences: [Qt.Key_LogOff, Qt.Key_ScreenSaver, "End+L", "Meta+L"] + onActivated: controller.lock() + } + Shortcut{ + sequences: [Qt.Key_Terminal, "Ctrl+Alt+T"] + onActivated: controller.terminal() + } + Shortcut{ + sequences: ["End+Alt+4", "Alt+F4"] + onActivated: controller.close() + } +} diff --git a/applications/system-service/notification.cpp b/applications/system-service/notification.cpp index db410c360..1ba94d706 100644 --- a/applications/system-service/notification.cpp +++ b/applications/system-service/notification.cpp @@ -3,6 +3,7 @@ #include "notification.h" #include "notificationapi.h" #include "appsapi.h" +#include "systemapi.h" Notification::Notification(const QString& path, const QString& identifier, const QString& owner, const QString& application, const QString& text, const QString& icon, QObject* parent) : QObject(parent), @@ -52,35 +53,7 @@ void Notification::remove(){ emit removed(); } -void Notification::paintNotification(Application* resumeApp){ - qDebug() << "Painting notification" << identifier(); - dispatchToMainThread([this]{ - screenBackup = screenAPI->copy(); - }); - updateRect = notificationAPI->paintNotification(text(), m_icon); - qDebug() << "Painted notification" << identifier(); - emit displayed(); - QTimer::singleShot(2000, [this, resumeApp]{ - dispatchToMainThread([this]{ - QPainter painter(EPFrameBuffer::framebuffer()); - painter.drawImage(updateRect, screenBackup, updateRect); - painter.end(); - EPFrameBuffer::sendUpdate(updateRect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); - qDebug() << "Finished displaying notification" << identifier(); - EPFrameBuffer::waitForLastUpdate(); - }); - if(!notificationAPI->notificationDisplayQueue.isEmpty()){ - Oxide::dispatchToMainThread([resumeApp] { - notificationAPI->notificationDisplayQueue.takeFirst()->paintNotification(resumeApp); - }); - return; - } - if(resumeApp != nullptr){ - resumeApp->uninterruptApplication(); - } - notificationAPI->unlock(); - }); -} + void Notification::setIcon(QString icon){ if(!hasPermission("notification")){ @@ -100,4 +73,40 @@ void Notification::setIcon(QString icon){ bool Notification::hasPermission(QString permission, const char* sender){ return notificationAPI->hasPermission(permission, sender); } +void Notification::paintNotification(Application *resumeApp) { + qDebug() << "Painting notification" << identifier(); + dispatchToMainThread([this] { screenBackup = screenAPI->copy(); }); + updateRect = notificationAPI->paintNotification(text(), m_icon); + qDebug() << "Painted notification" << identifier(); + emit displayed(); + QTimer::singleShot(2000, [this, resumeApp] { + dispatchToMainThread([this] { + auto frameBuffer = EPFrameBuffer::framebuffer(); + QPainter painter(frameBuffer); + painter.drawImage(updateRect, screenBackup, updateRect); + painter.end(); + EPFrameBuffer::sendUpdate( + updateRect, + EPFrameBuffer::Mono, + EPFrameBuffer::FullUpdate, + true + ); + qDebug() << "Finished displaying notification" << identifier(); + EPFrameBuffer::waitForLastUpdate(); + }); + if (!notificationAPI->notificationDisplayQueue.isEmpty()) { + Oxide::dispatchToMainThread([resumeApp] { + notificationAPI + ->notificationDisplayQueue + .takeFirst() + ->paintNotification(resumeApp); + }); + return; + } + if (resumeApp != nullptr) { + resumeApp->uninterruptApplication(); + } + notificationAPI->unlock(); + }); +} #include "moc_notification.cpp" diff --git a/applications/system-service/notification.h b/applications/system-service/notification.h index a4aa9d5e3..c5d4147be 100644 --- a/applications/system-service/notification.h +++ b/applications/system-service/notification.h @@ -115,7 +115,7 @@ class Notification : public QObject{ } emit clicked(); } - void paintNotification(Application* resumeApp); + void paintNotification(Application *resumeApp); signals: void changed(QVariantMap); diff --git a/applications/system-service/notificationapi.cpp b/applications/system-service/notificationapi.cpp new file mode 100644 index 000000000..9fb1bfaed --- /dev/null +++ b/applications/system-service/notificationapi.cpp @@ -0,0 +1,137 @@ +#include + +#include "notificationapi.h" +#include "systemapi.h" + +QRect NotificationAPI::paintNotification(const QString &text, const QString &iconPath){ + QImage notification = notificationImage(text, iconPath); + return dispatchToMainThread([¬ification]{ + qDebug() << "Painting to framebuffer..."; + auto frameBuffer = EPFrameBuffer::framebuffer(); + QPainter painter(frameBuffer); + QPoint pos(0, frameBuffer->height() - notification.height()); + if(systemAPI->landscape()){ + notification = notification.transformed(QTransform().rotate(90.0)); + pos.setX(0); + pos.setY(frameBuffer->height() - notification.height()); + } + auto updateRect = notification.rect().translated(pos); + painter.drawImage(updateRect, notification); + painter.end(); + qDebug() << "Updating screen " << updateRect << "..."; + EPFrameBuffer::sendUpdate( + updateRect, + EPFrameBuffer::Grayscale, + EPFrameBuffer::PartialUpdate, + true + ); + EPFrameBuffer::waitForLastUpdate(); + return updateRect; + }); +} +void NotificationAPI::errorNotification(const QString &text) { + dispatchToMainThread([] { + auto frameBuffer = EPFrameBuffer::framebuffer(); + qDebug() << "Waiting for other painting to finish..."; + while (frameBuffer->paintingActive()) { + EPFrameBuffer::waitForLastUpdate(); + } + qDebug() << "Displaying error text"; + QPainter painter(frameBuffer); + painter.fillRect(frameBuffer->rect(), Qt::white); + painter.end(); + EPFrameBuffer::sendUpdate( + frameBuffer->rect(), + EPFrameBuffer::Mono, + EPFrameBuffer::FullUpdate, + true + ); + }); + notificationAPI->paintNotification(text, ""); +} +QImage NotificationAPI::notificationImage(const QString& text, const QString& iconPath){ + auto padding = 10; + auto radius = 10; + auto frameBuffer = EPFrameBuffer::framebuffer(); + auto size = frameBuffer->size(); + auto boundingRect = QPainter(frameBuffer).fontMetrics().boundingRect( + QRect(0, 0, size.width() / 2, size.height() / 8), + Qt::AlignCenter | Qt::TextWordWrap, text + ); + QImage icon(iconPath); + auto iconSize = icon.isNull() ? 0 : 50; + auto width = boundingRect.width() + iconSize + (padding * 3); + auto height = max(boundingRect.height(), iconSize) + (padding * 2); + QImage image(width, height, QImage::Format_ARGB32_Premultiplied); + image.fill(Qt::transparent); + QPainter painter(&image); + painter.setRenderHint(QPainter::Antialiasing); + QPainterPath path; + path.addRoundedRect(image.rect(), radius, radius); + QPen pen(Qt::white, 1); + painter.setPen(pen); + painter.fillPath(path, Qt::black); + painter.drawPath(path); + painter.setPen(Qt::white); + QRect textRect( + padding, + padding, + image.width() - iconSize - (padding * 2), + image.height() - padding + ); + painter.drawText(textRect, Qt::AlignCenter | Qt::TextWordWrap, text); + if(!icon.isNull()){ + QRect iconRect( + image.width() - iconSize - padding, + padding, + iconSize, + iconSize + ); + painter.fillRect(iconRect, Qt::white); + painter.drawImage(iconRect, icon); + } + painter.end(); + return image; +} + +void NotificationAPI::drawNotificationText(const QString& text, QColor color, QColor background){ + auto frameBuffer = EPFrameBuffer::framebuffer(); + dispatchToMainThread([frameBuffer, text, color, background]{ + QPainter painter(frameBuffer); + int padding = 10; + auto size = frameBuffer->size(); + auto fm = painter.fontMetrics(); + int textHeight = fm.height() + padding; + QImage textImage( + size.width() - padding * 2, + textHeight, + background == Qt::transparent + ? QImage::Format_ARGB32_Premultiplied + : QImage::Format_RGB16 + ); + textImage.fill(Qt::transparent); + QPainter painter2(&textImage); + painter2.setPen(color); + painter2.drawText( + textImage.rect(), + Qt::AlignVCenter | Qt::AlignRight, + text + ); + painter2.end(); + QPoint textPos(0 + padding, size.height() - textHeight); + if(systemAPI->landscape()){ + textImage = textImage.transformed(QTransform().rotate(90.0)); + textPos.setX(0); + textPos.setY(size.height() - textImage.height() - padding); + } + auto textRect = textImage.rect().translated(textPos); + painter.drawImage(textRect, textImage); + EPFrameBuffer::sendUpdate( + textRect, + EPFrameBuffer::Grayscale, + EPFrameBuffer::PartialUpdate, + true + ); + painter.end(); + }); +} diff --git a/applications/system-service/notificationapi.h b/applications/system-service/notificationapi.h index 5c47fe100..2ec91da53 100644 --- a/applications/system-service/notificationapi.h +++ b/applications/system-service/notificationapi.h @@ -106,58 +106,10 @@ class NotificationAPI : public APIBase { } return m_notifications.value(identifier); } - QRect paintNotification(const QString& text, const QString& iconPath){ - return dispatchToMainThread([text, iconPath]{ - qDebug() << "Painting to framebuffer..."; - auto frameBuffer = EPFrameBuffer::framebuffer(); - QPainter painter(frameBuffer); - auto size = frameBuffer->size(); - auto padding = 10; - auto radius = 10; - QImage icon(iconPath); - auto iconSize = icon.isNull() ? 0 : 50; - auto boundingRect = painter.fontMetrics().boundingRect(QRect(0, 0, size.width() / 2, size.height() / 8), Qt::AlignCenter | Qt::TextWordWrap, text); - auto width = boundingRect.width() + iconSize + (padding * 3); - auto height = max(boundingRect.height(), iconSize) + (padding * 2); - auto left = size.width() - width; - auto top = size.height() - height; - QRect updateRect(left, top, width, height); - painter.fillRect(updateRect, Qt::black); - painter.setPen(Qt::black); - painter.drawRoundedRect(updateRect, radius, radius); - painter.setPen(Qt::white); - QRect textRect(left + padding, top + padding, width - iconSize - (padding * 2), height - padding); - painter.drawText(textRect, Qt::AlignCenter | Qt::TextWordWrap, text); - painter.end(); - qDebug() << "Updating screen " << updateRect << "..."; - EPFrameBuffer::sendUpdate(updateRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); - if(!icon.isNull()){ - QPainter painter2(frameBuffer); - QRect iconRect(size.width() - iconSize - padding, top + padding, iconSize, iconSize); - painter2.fillRect(iconRect, Qt::white); - painter2.drawImage(iconRect, icon); - painter2.end(); - EPFrameBuffer::sendUpdate(iconRect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); - } - EPFrameBuffer::waitForLastUpdate(); - return updateRect; - }); - } - void errorNotification(const QString& text){ - dispatchToMainThread([]{ - auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; - while(frameBuffer->paintingActive()){ - EPFrameBuffer::waitForLastUpdate(); - } - qDebug() << "Displaying error text"; - QPainter painter(frameBuffer); - painter.fillRect(frameBuffer->rect(), Qt::white); - painter.end(); - EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); - }); - notificationAPI->paintNotification(text, ""); - } + QRect paintNotification(const QString& text, const QString& iconPath); + void errorNotification(const QString& text); + QImage notificationImage(const QString& text, const QString& iconPath); + void drawNotificationText(const QString& text, QColor color = Qt::black, QColor background = Qt::transparent); public slots: QDBusObjectPath add(const QString& identifier, const QString& application, const QString& text, const QString& icon, QDBusMessage message){ diff --git a/applications/system-service/qml.qrc b/applications/system-service/qml.qrc index 4d8ed6621..5f6483ac3 100644 --- a/applications/system-service/qml.qrc +++ b/applications/system-service/qml.qrc @@ -1,3 +1,5 @@ - + + main.qml + diff --git a/applications/system-service/screenapi.cpp b/applications/system-service/screenapi.cpp index 003850fb9..d1efe0e5c 100644 --- a/applications/system-service/screenapi.cpp +++ b/applications/system-service/screenapi.cpp @@ -1,5 +1,6 @@ #include "screenapi.h" #include "notificationapi.h" +#include "systemapi.h" QDBusObjectPath ScreenAPI::screenshot(){ if(!hasPermission("screen")){ @@ -15,17 +16,80 @@ QDBusObjectPath ScreenAPI::screenshot(){ QRect rect = notificationAPI->paintNotification("Taking Screenshot...", ""); EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::PartialUpdate, true); QDBusObjectPath path("/"); - if(!screen.save(filePath)){ + bool saved = ( + systemAPI->landscape() + ? screen.transformed(QTransform().rotate(270.0)) + : screen + ).save(filePath); + if(!saved){ qDebug() << "Failed to take screenshot"; }else{ path = addScreenshot(filePath)->qPath(); } - QPainter painter(EPFrameBuffer::framebuffer()); + auto frameBuffer = EPFrameBuffer::framebuffer(); + QPainter painter(frameBuffer); painter.drawImage(rect, screen, rect); painter.end(); EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::PartialUpdate, true); + notificationAPI->add( + QUuid::createUuid().toString(), + "codes.eeems.tarnish", + "codes.eeems.tarnish", + saved ? "Screenshot taken" : "Failed to take screenshot", + saved ? filePath : "" + )->display(); return path; }); } +bool ScreenAPI::drawFullscreenImage(QString path, float rotate) { + if (!hasPermission("screen")) { + return false; + } + if (!QFile(path).exists()) { + qDebug() << "Can't find image" << path; + return false; + } + QImage img(path); + if (img.isNull()) { + qDebug() << "Image data invalid" << path; + return false; + } + if(rotate){ + img = img.transformed(QTransform().rotate(rotate)); + } + Oxide::Sentry::sentry_transaction( + "screen", "drawFullscrenImage", + [img, path](Oxide::Sentry::Transaction *t) { + Q_UNUSED(t); + Oxide::dispatchToMainThread([img] { + auto frameBuffer = EPFrameBuffer::framebuffer(); + QRect rect = frameBuffer->rect(); + QPainter painter(frameBuffer); + painter.fillRect(rect, Qt::white); + painter.setRenderHints( + QPainter::Antialiasing | QPainter::SmoothPixmapTransform, + 1 + ); + QPixmap pxmap; + QPoint center(rect.width() / 2, rect.height() / 2); + painter.translate(center); + painter.scale( + 1* (rect.width() / qreal(img.height())), + 1 * (rect.width() / qreal(img.height())) + ); + painter.translate(0 - img.width() / 2, 0 - img.height() / 2); + painter.drawPixmap(img.rect(), QPixmap::fromImage(img)); + painter.end(); + EPFrameBuffer::sendUpdate( + frameBuffer->rect(), + EPFrameBuffer::HighQualityGrayscale, + EPFrameBuffer::FullUpdate, + true + ); + EPFrameBuffer::waitForLastUpdate(); + }); + }); + return true; +} #include "moc_screenapi.cpp" diff --git a/applications/system-service/screenapi.h b/applications/system-service/screenapi.h index 446d92440..cc23dfb82 100644 --- a/applications/system-service/screenapi.h +++ b/applications/system-service/screenapi.h @@ -88,32 +88,7 @@ class ScreenAPI : public APIBase { return list; } - Q_INVOKABLE bool drawFullscreenImage(QString path){ - if(!hasPermission("screen")){ - return false; - } - if(!QFile(path).exists()){ - qDebug() << "Can't find image" << path; - return false; - } - QImage img(path); - if(img.isNull()){ - qDebug() << "Image data invalid" << path; - return false; - } - Oxide::Sentry::sentry_transaction("screen", "drawFullscrenImage", [img, path](Oxide::Sentry::Transaction* t){ - Q_UNUSED(t); - Oxide::dispatchToMainThread([img]{ - QRect rect = EPFrameBuffer::framebuffer()->rect(); - QPainter painter(EPFrameBuffer::framebuffer()); - painter.drawImage(rect, img); - painter.end(); - EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); - EPFrameBuffer::waitForLastUpdate(); - }); - }); - return true; - } + Q_INVOKABLE bool drawFullscreenImage(QString path, float rotate = 0); Q_INVOKABLE QDBusObjectPath screenshot(); QImage copy(){ diff --git a/applications/system-service/system-service.pro b/applications/system-service/system-service.pro index 299619627..faaf51555 100644 --- a/applications/system-service/system-service.pro +++ b/applications/system-service/system-service.pro @@ -17,8 +17,10 @@ SOURCES += \ appsapi.cpp \ bss.cpp \ buttonhandler.cpp \ + eventlistener.cpp \ network.cpp \ notification.cpp \ + notificationapi.cpp \ screenapi.cpp \ screenshot.cpp \ systemapi.cpp \ @@ -39,6 +41,10 @@ service.files = ../../assets/etc/systemd/system/tarnish.service service.path = /etc/systemd/system/ INSTALLS += service +keyd.files = ../../assets/opt/etc/keyd/oxide.conf +keyd.path = /opt/etc/keyd/ +INSTALLS += keyd + applications.files = ../../assets/opt/usr/share/applications/xochitl.oxide applications.path = /opt/usr/share/applications/ INSTALLS += applications @@ -57,8 +63,10 @@ HEADERS += \ appsapi.h \ bss.h \ buttonhandler.h \ + controller.h \ dbusservice.h \ digitizerhandler.h \ + eventlistener.h \ fifohandler.h \ mxcfb.h \ network.h \ @@ -90,3 +98,6 @@ include(../../qmake/liboxide.pri) include(../../qmake/sentry.pri) QMAKE_POST_LINK += sh $$_PRO_FILE_PWD_/generate_xml.sh + +RESOURCES += \ + qml.qrc diff --git a/applications/system-service/systemapi.cpp b/applications/system-service/systemapi.cpp index 2becc5c76..5428f0367 100644 --- a/applications/system-service/systemapi.cpp +++ b/applications/system-service/systemapi.cpp @@ -40,11 +40,12 @@ void SystemAPI::PrepareForSleep(bool suspending){ resumeApp = nullptr; } }); - Oxide::Sentry::sentry_span(t, "screen", "Update screen with suspend image", []{ + auto rotate = landscape() ? 90 : 0; + Oxide::Sentry::sentry_span(t, "screen", "Update screen with suspend image", [rotate]{ if(QFile::exists("/usr/share/remarkable/sleeping.png")){ - screenAPI->drawFullscreenImage("/usr/share/remarkable/sleeping.png"); + screenAPI->drawFullscreenImage("/usr/share/remarkable/sleeping.png", rotate); }else{ - screenAPI->drawFullscreenImage("/usr/share/remarkable/suspended.png"); + screenAPI->drawFullscreenImage("/usr/share/remarkable/suspended.png", rotate); } }); Oxide::Sentry::sentry_span(t, "disable", "Disable various services", [this, device]{ @@ -54,11 +55,11 @@ void SystemAPI::PrepareForSleep(bool suspending){ wifiWasOn = true; wifiAPI->disable(); } - system("rmmod brcmfmac"); + system("/sbin/rmmod brcmfmac"); } releaseSleepInhibitors(); }); - Oxide::Sentry::sentry_span(t, "clear-input", "Clear input buffers", [this]{ + Oxide::Sentry::sentry_span(t, "clear-input", "Clear input buffers", []{ touchHandler->clear_buffer(); wacomHandler->clear_buffer(); buttonHandler->clear_buffer(); @@ -115,7 +116,7 @@ void SystemAPI::PrepareForSleep(bool suspending){ lockTimer.start(autoLock() * 60 * 1000); } if(device == Oxide::DeviceSettings::DeviceType::RM2){ - system("modprobe brcmfmac"); + system("/sbin/modprobe brcmfmac"); if(wifiWasOn){ wifiAPI->enable(); } diff --git a/applications/system-service/systemapi.h b/applications/system-service/systemapi.h index 2ff172466..e1dfd7203 100644 --- a/applications/system-service/systemapi.h +++ b/applications/system-service/systemapi.h @@ -13,6 +13,7 @@ #include "application.h" #include "screenapi.h" #include "digitizerhandler.h" +#include "eventlistener.h" #include "login1_interface.h" #define systemAPI SystemAPI::singleton() @@ -71,6 +72,7 @@ class SystemAPI : public APIBase { Q_PROPERTY(bool lockOnSuspend READ lockOnSuspend WRITE setLockOnSuspend NOTIFY lockOnSuspendChanged) Q_PROPERTY(bool sleepInhibited READ sleepInhibited NOTIFY sleepInhibitedChanged) Q_PROPERTY(bool powerOffInhibited READ powerOffInhibited NOTIFY powerOffInhibitedChanged) + Q_PROPERTY(bool landscape READ landscape NOTIFY landscapeChanged) public: enum SwipeDirection { None, Right, Left, Up, Down }; @@ -198,10 +200,33 @@ class SystemAPI : public APIBase { }); qRegisterMetaType(); Oxide::Sentry::sentry_span(t, "input", "Connect input events", [this]{ - connect(touchHandler, &DigitizerHandler::activity, this, &SystemAPI::activity); connect(touchHandler, &DigitizerHandler::inputEvent, this, &SystemAPI::touchEvent); - connect(wacomHandler, &DigitizerHandler::activity, this, &SystemAPI::activity); connect(wacomHandler, &DigitizerHandler::inputEvent, this, &SystemAPI::penEvent); + eventListener->append([this](QObject* object, QEvent* event){ + Q_UNUSED(object); + switch(event->type()){ + case QEvent::KeyRelease: + case QEvent::KeyPress: + case QEvent::TabletPress: + case QEvent::TabletMove: + case QEvent::TabletRelease: + case QEvent::TabletTrackingChange: + case QEvent::TabletEnterProximity: + case QEvent::TabletLeaveProximity: + case QEvent::TouchBegin: + case QEvent::TouchCancel: + case QEvent::TouchEnd: + case QEvent::TouchUpdate: + activity(); + break; + default: + break; + } + return false; + }); + deviceSettings.onKeyboardAttachedChanged([this]{ + emit landscapeChanged(landscape()); + }); }); qDebug() << "System API ready to use"; }); @@ -228,6 +253,7 @@ class SystemAPI : public APIBase { void setLockOnSuspend(bool _lockOnSuspend); bool sleepInhibited(){ return sleepInhibitors.length(); } bool powerOffInhibited(){ return powerOffInhibitors.length(); } + bool landscape(){ return deviceSettings.keyboardAttached(); } void uninhibitAll(QString name); void stopSuspendTimer(){ qDebug() << "Suspend timer disabled"; @@ -437,6 +463,7 @@ public slots: void autoLockChanged(int); void lockOnSuspendChanged(bool); void swipeLengthChanged(int, int); + void landscapeChanged(bool); void deviceSuspending(); void deviceResuming(); diff --git a/applications/system-service/wifiapi.h b/applications/system-service/wifiapi.h index 05974c025..2fa23f9d7 100644 --- a/applications/system-service/wifiapi.h +++ b/applications/system-service/wifiapi.h @@ -238,7 +238,7 @@ class WifiAPI : public APIBase { if(m_state == Off){ setState(Disconnected); } - if(system("rfkill unblock wifi")){ + if(system("/usr/sbin/rfkill unblock wifi")){ qDebug() << "Failed to enable wifi devices"; return false; } @@ -269,7 +269,7 @@ class WifiAPI : public APIBase { qDebug() << "Failed to disable " + wlan->iface(); } } - if(system("rfkill block wifi")){ + if(system("/usr/sbin/rfkill block wifi")){ qDebug() << "Failed to disable wifi devices"; } flushBSSCache(0); @@ -722,9 +722,9 @@ private slots: QDBusConnection bus = QDBusConnection::systemBus(); QStringList serviceNames = bus.interface()->registeredServiceNames(); if (!serviceNames.contains(WPA_SUPPLICANT_SERVICE)){ - if(system("systemctl --quiet is-active wpa_supplicant")){ + if(system("/bin/systemctl --quiet is-active wpa_supplicant")){ qDebug() << "Starting wpa_supplicant..."; - if(system("systemctl --quiet start wpa_supplicant")){ + if(system("/bin/systemctl --quiet start wpa_supplicant")){ qCritical() << "Failed to start wpa_supplicant"; throw QException(); } diff --git a/applications/system-service/wlan.h b/applications/system-service/wlan.h index c21e0e420..bfe38874f 100644 --- a/applications/system-service/wlan.h +++ b/applications/system-service/wlan.h @@ -28,9 +28,9 @@ class Wlan : public QObject, public SysObject { } } QString iface() { return m_iface; } - bool up() { return !system(("ifconfig " + iface() + " up").toStdString().c_str()); } - bool down() { return !system(("ifconfig " + iface() + " down").toStdString().c_str()); } - bool isUp(){ return !system(("ip addr show " + iface() + " | grep UP > /dev/null").toStdString().c_str()); } + bool up() { return !system(("/sbin/ifconfig " + iface() + " up").toStdString().c_str()); } + bool down() { return !system(("/sbin/ifconfig " + iface() + " down").toStdString().c_str()); } + bool isUp(){ return !system(("/sbin/ip addr show " + iface() + " | /bin/grep UP > /dev/null").toStdString().c_str()); } Interface* interface() { return m_interface; } QSet blobs(){ return m_blobs; } QString operstate(){ @@ -41,7 +41,7 @@ class Wlan : public QObject, public SysObject { } bool pingIP(std::string ip, const char* port) { auto process = new QProcess(); - process->setProgram("bash"); + process->setProgram("/bin/bash"); std::string cmd("{ echo -n > /dev/tcp/" + ip.substr(0, ip.length() - 1) + "/" + port + "; } > /dev/null 2>&1"); process->setArguments(QStringList() << "-c" << cmd.c_str()); process->start(); @@ -52,7 +52,7 @@ class Wlan : public QObject, public SysObject { return !process->exitCode(); } bool isConnected(){ - auto ip = exec("ip r | grep " + iface() + " | grep default | awk '{print $3}'"); + auto ip = exec("/sbin/ip r | /bin/grep " + iface() + " | /bin/grep default | /usr/bin/awk '{print $3}'"); return ip != "" && (pingIP(ip, "53") || pingIP(ip, "80")); } int link(){ @@ -67,7 +67,7 @@ class Wlan : public QObject, public SysObject { return result; } O_WARNING("SignalPoll error: " << res.error()); - auto out = exec("grep " + iface() + " /proc/net/wireless | awk '{print $3}'"); + auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $3}'"); if(QString(out.c_str()).isEmpty()){ return 0; } @@ -92,7 +92,7 @@ class Wlan : public QObject, public SysObject { return result; } O_WARNING("SignalPoll error: " << res.error()); - auto out = exec("grep " + iface() + " /proc/net/wireless | awk '{print $4}'"); + auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $4}'"); if(QString(out.c_str()).isEmpty()){ return 0; } diff --git a/applications/system-service/wpa_supplicant.cpp b/applications/system-service/wpa_supplicant.cpp index d4631dfd5..f5b5bc495 100644 --- a/applications/system-service/wpa_supplicant.cpp +++ b/applications/system-service/wpa_supplicant.cpp @@ -63,4 +63,3 @@ FiW1Wpa_supplicant1NetworkInterface::~FiW1Wpa_supplicant1NetworkInterface() { } -#include "moc_wpa_supplicant.cpp" diff --git a/applications/task-switcher/main.cpp b/applications/task-switcher/main.cpp index 2180c6c2c..d749bd2df 100644 --- a/applications/task-switcher/main.cpp +++ b/applications/task-switcher/main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "controller.h" @@ -14,6 +15,7 @@ using namespace std; using namespace Oxide; +using namespace Oxide::QML; using namespace Oxide::Sentry; void sigHandler(int signal){ @@ -32,8 +34,8 @@ int main(int argc, char *argv[]){ auto screenProvider = new ScreenProvider(&app); Controller controller(&app, screenProvider); QQmlApplicationEngine engine; + registerQML(&engine); QQmlContext* context = engine.rootContext(); - context->setContextProperty("screenGeometry", app.primaryScreen()->geometry()); context->setContextProperty("apps", QVariant::fromValue(controller.getApps())); context->setContextProperty("controller", &controller); engine.rootContext()->setContextProperty("screenProvider", screenProvider); diff --git a/applications/task-switcher/main.qml b/applications/task-switcher/main.qml index 84aef9453..c76aaf436 100644 --- a/applications/task-switcher/main.qml +++ b/applications/task-switcher/main.qml @@ -2,14 +2,14 @@ import QtQuick 2.10 import QtQuick.Window 2.3 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.0 +import "qrc:/codes.eeems.oxide" import "./widgets" -ApplicationWindow { +OxideWindow { id: window objectName: "window" visible: stateController.state === "loaded" - width: screenGeometry.width - height: screenGeometry.height + backgroundColor: "transparent" title: qsTr("Corrupt") property int itemPadding: 10 Connections{ @@ -25,6 +25,12 @@ ApplicationWindow { } } } + Shortcut{ + sequence: [StandardKey.Cancel, Qt.Key_Backspace] + context: Qt.ApplicationShortcut + onActivated: controller.previousApplication() + } + Component.onCompleted: { controller.startup(); } @@ -45,17 +51,16 @@ ApplicationWindow { } } } - contentData: [ - MouseArea { - anchors.fill: parent - enabled: stateController.state === "loaded" - onClicked: { - controller.breadcrumb("background", "click", "ui"); - controller.previousApplication(); - } + initialItem: MouseArea { + anchors.fill: parent + enabled: stateController.state === "loaded" + onClicked: { + controller.breadcrumb("background", "click", "ui"); + controller.previousApplication(); } - ] - footer: Rectangle { + } + page.header: Item{} + page.footer: Rectangle { id: footer color: "white" border.color: "black" diff --git a/assets/opt/etc/keyd/oxide.conf b/assets/opt/etc/keyd/oxide.conf new file mode 100644 index 000000000..15726d8c1 --- /dev/null +++ b/assets/opt/etc/keyd/oxide.conf @@ -0,0 +1,39 @@ +[ids] +2edd:0001 # type folio + +[main] +end = layer(meta) += = - +\ = ~ + +[shift:S] += = _ +\ = ` + +[meta:G] +1 = esc += = = +\ = \ +0 = + +, = [ +. = ] +right = end +left = home +up = pageup +down = pagedown +backspace = macro(end+backspace) +l = macro(end+l) + +[meta+alt] +4 = macro(leftalt+f4) + +[shift+meta] +\ = | +, = { +. = } +s = macro(leftshift+end+s) + +[ctrl:C] + +[ctrl+shift] +1 = computer diff --git a/assets/opt/usr/share/applications/xochitl.oxide b/assets/opt/usr/share/applications/xochitl.oxide index 046354577..d6da3256e 100644 --- a/assets/opt/usr/share/applications/xochitl.oxide +++ b/assets/opt/usr/share/applications/xochitl.oxide @@ -3,34 +3,5 @@ "description": "Read documents and take notes", "bin": "/opt/bin/xochitl", "icon": "oxide:xochitl-48", - "flags": ["nosplash", "chroot"], - "permissions": ["power"], - "directories": [ - "/dev/shm", - "/etc", - "/home/root", - "/home/root/.local/share", - "/home/root/.local/share/remarkable", - "/opt/etc", - "/run/dbus", - "/run/lock", - "/run/systemd", - "/run/systemd/resolve", - "/run/udev", - "/tmp/runtime-root", - "/usr/share", - "/usr/share/remarkable/templates", - "/usr/local/share/ca-certificates", - "/var/cache/fontconfig", - "/var/lib/dbus", - "/var/volatile/tmp" - ], - "environment": { - "HOME": "/home/root", - "QMLSCENE_DEVICE": "epaper", - "QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS": "rotate=180", - "QT_QPA_PLATFORM": "epaper", - "SYSTEMD_IGNORE_CHROOT": "true", - "XDG_RUNTIME_DIR": "/tmp/runtime-root" - } + "flags": ["nosplash"], } diff --git a/interfaces/appsapi.xml b/interfaces/appsapi.xml index 808e2aa73..7b08df854 100644 --- a/interfaces/appsapi.xml +++ b/interfaces/appsapi.xml @@ -51,6 +51,8 @@ + + diff --git a/interfaces/systemapi.xml b/interfaces/systemapi.xml index 753803e2d..d01f4ef9a 100644 --- a/interfaces/systemapi.xml +++ b/interfaces/systemapi.xml @@ -6,6 +6,7 @@ + @@ -37,6 +38,9 @@ + + + diff --git a/package b/package index 27d8a0680..08eb20054 100644 --- a/package +++ b/package @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide liboxide-dev libsentry) -_oxidever=2.7 +_oxidever=$(grep 'VERSION =' qmake/common.pri | awk '{print $3}') pkgver="$_oxidever~VERSION~" _sentryver=0.5.0 timestamp="$(date -u +%Y-%m-%dT%H:%MZ)" diff --git a/qmake/common.pri b/qmake/common.pri index 7c231cbf5..5be0c3c2d 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -1,3 +1,3 @@ QMAKE_RPATHDIR += /lib /usr/lib /opt/lib /opt/usr/lib -VERSION = 2.7 +VERSION = 2.8 DEFINES += APP_VERSION=\\\"$$VERSION\\\" diff --git a/qmake/liboxide.pri b/qmake/liboxide.pri index fbd942875..84637c608 100644 --- a/qmake/liboxide.pri +++ b/qmake/liboxide.pri @@ -1,2 +1,3 @@ LIBS += -L$$OUT_PWD/../../shared/liboxide -lliboxide INCLUDEPATH += $$OUT_PWD/../../shared/liboxide/include +QML_IMPORT_PATH += qrc:/codes.eeems.oxide diff --git a/applications/launcher/widgets/BetterMenu.qml b/shared/liboxide/OxideMenu.qml similarity index 73% rename from applications/launcher/widgets/BetterMenu.qml rename to shared/liboxide/OxideMenu.qml index 8425cff3a..3b661c27b 100644 --- a/applications/launcher/widgets/BetterMenu.qml +++ b/shared/liboxide/OxideMenu.qml @@ -2,6 +2,22 @@ import QtQuick 2.10 import QtQuick.Controls 2.4 Menu { + id: menu + property color color: "black" + property alias backgroundColor: background.color + property color borderColor: background.border.color + property color activeBackgroundColor: "black" + property color activeColor: "white" + // contentItem.rotation: Oxide.landscape ? 90 : 0 + background: Rectangle{ + id: background + // rotation: contentItem.rotation + implicitWidth: 200 + implicitHeight: 40 + color: "white" + border.color: "black" + radius: 2 + } delegate: MenuItem { id: menuItem implicitWidth: 250 @@ -47,7 +63,7 @@ Menu { text: menuItem.text font: menuItem.font opacity: enabled ? 1.0 : 0.3 - color: "black" + color: menuItem.highlighted ? menu.activeColor : menu.color horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter elide: Text.ElideRight @@ -56,7 +72,7 @@ Menu { implicitWidth: menuItem.implicitWidth implicitHeight: menuItem.implicitHeight opacity: enabled ? 1 : 0.3 - color: "transparent" + color: menuItem.highlighted ? menu.activeBackgroundColor : "transparent" } } } diff --git a/shared/liboxide/OxideWindow.qml b/shared/liboxide/OxideWindow.qml new file mode 100644 index 000000000..7b8761aac --- /dev/null +++ b/shared/liboxide/OxideWindow.qml @@ -0,0 +1,75 @@ +import QtQuick 2.10 +import QtQuick.Window 2.15 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.0 + +ApplicationWindow { + id: window + property alias page: page + property alias focus: page.focus + property alias leftMenu: leftMenu.children + property alias rightMenu: rightMenu.children + property alias centerMenu: centerMenu.children + property alias stack: stack + property alias initialItem: stack.initialItem + property alias backgroundColor: background.color + property alias headerBackgroundColor: header.color + property bool landscape: Oxide.landscape + Component.onCompleted: stack.forceActiveFocus() + function orientationWidth(){ return landscape ? height : width; } + function orientationHeight(){ return landscape ? width : height; } + signal keyPressed(var event) + signal keyReleased(var event) + width: Screen.width + height: Screen.height + contentOrientation: landscape ? Qt.LandscapeOrientation : Qt.PortraitOrientation + Page { + id: page + focus: true + title: window.title + visible: window.visible + rotation: landscape ? 90 : 0 + // Must centerIn and specify width/height to force rotation to actually work + anchors.centerIn: parent + width: window.orientationWidth() + height: window.orientationHeight() + header: Rectangle { + id: header + color: "black" + height: Math.max(leftMenu.height, centerMenu.height, rightMenu.height) + RowLayout { + id: leftMenu + anchors.left: parent.left + } + RowLayout { + id: rightMenu + anchors.right: parent.right + } + // Comes last to make sure it is overtop of any overflow + RowLayout { + id: centerMenu + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.bottom: parent.bottom + } + } + background: Rectangle { + id: background + color: "black" + } + contentData: [ + StackView { + id: stack + anchors.fill: parent + popEnter: Transition{} + popExit: Transition{} + pushEnter: Transition{} + pushExit: Transition{} + replaceEnter: Transition{} + replaceExit: Transition{} + } + ] + Keys.onPressed: (event) => window.keyPressed(event) + Keys.onReleased: (event) => window.keyReleased(event) + } +} diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index da5e27ba4..8e7596330 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -5,6 +5,9 @@ #include #include +#include +#include + #include #include #include @@ -107,7 +110,7 @@ namespace Oxide { struct passwd* result; auto status = getpwnam_r(name.toStdString().c_str(), &user, buffer, sizeof(buffer), &result); if(status != 0){ - throw std::runtime_error("Failed to get user" + status); + throw std::runtime_error(QString("Failed to get user: %1").arg(std::strerror(status)).toStdString()); } if(result == NULL){ throw std::runtime_error("Invalid user name: " + name.toStdString()); @@ -120,7 +123,7 @@ namespace Oxide { struct group* result; auto status = getgrnam_r(name.toStdString().c_str(), &grp, buffer, sizeof(buffer), &result); if(status != 0){ - throw std::runtime_error("Failed to get group" + status); + throw std::runtime_error(QString("Failed to get group: %1").arg(std::strerror(status)).toStdString()); } if(result == NULL){ throw std::runtime_error("Invalid group name: " + name.toStdString()); @@ -143,39 +146,51 @@ namespace Oxide { device.open(QIODevice::ReadOnly); int fd = device.handle(); int version; - if (ioctl(fd, EVIOCGVERSION, &version)){ + if(ioctl(fd, EVIOCGVERSION, &version)){ O_DEBUG(" Invalid"); continue; } unsigned long bit[EV_MAX]; ioctl(fd, EVIOCGBIT(0, EV_MAX), bit); - if (test_bit(EV_KEY, bit)) { - if (checkBitSet(fd, EV_KEY, BTN_STYLUS) && test_bit(EV_ABS, bit)) { + if(test_bit(EV_KEY, bit)){ + if(checkBitSet(fd, EV_KEY, BTN_STYLUS) && test_bit(EV_ABS, bit)){ O_DEBUG(" Wacom input device detected"); - wacomPath = fullPath.toStdString(); + if(wacomPath.empty()){ + wacomPath = fullPath.toStdString(); + } continue; } - if (checkBitSet(fd, EV_KEY, KEY_POWER)) { + if(checkBitSet(fd, EV_KEY, KEY_POWER)){ O_DEBUG(" Buttons input device detected"); - buttonsPath = fullPath.toStdString(); + if(buttonsPath.empty()){ + buttonsPath = fullPath.toStdString(); + } continue; } } - if (checkBitSet(fd, EV_ABS, ABS_MT_SLOT)) { + if(checkBitSet(fd, EV_ABS, ABS_MT_SLOT)){ O_DEBUG(" Touch input device detected"); - touchPath = fullPath.toStdString(); + if(touchPath.empty()){ + touchPath = fullPath.toStdString(); + } continue; } O_DEBUG(" Invalid"); } - if (wacomPath.empty()) { + if(wacomPath.empty()){ O_WARNING("Wacom input device not found"); + }else{ + O_DEBUG(("Wacom input device: " + wacomPath).c_str()); } - if (touchPath.empty()) { + if(touchPath.empty()){ O_WARNING("Touch input device not found"); + }else{ + O_DEBUG(("Touch input device: " + touchPath).c_str()); } - if (buttonsPath.empty()){ + if(buttonsPath.empty()){ O_WARNING("Buttons input device not found"); + }else{ + O_DEBUG(("Buttons input device: " + buttonsPath).c_str()); } } DeviceSettings::~DeviceSettings(){} @@ -303,6 +318,7 @@ namespace Oxide { } #ifdef __arm__ qputenv("QMLSCENE_DEVICE", "epaper"); + qputenv("QT_QUICK_BACKEND","epaper"); qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); #endif if(touch){ @@ -310,6 +326,60 @@ namespace Oxide { qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); } } + bool DeviceSettings::keyboardAttached(){ + QDir dir("/dev/input"); + for(auto path : dir.entryList(QDir::Files | QDir::NoSymLinks | QDir::System)){ + O_DEBUG((" Checking " + path + "...").toStdString().c_str()); + QString fullPath(dir.path() + "/" + path); + if( + fullPath == QString::fromStdString(buttonsPath) + || fullPath == QString::fromStdString(wacomPath) + || fullPath == QString::fromStdString(touchPath) + ){ + continue; + } + QFile device(fullPath); + device.open(QIODevice::ReadOnly); + int fd = device.handle(); + int version; + if(ioctl(fd, EVIOCGVERSION, &version)){ + continue; + } + unsigned long bit[EV_MAX]; + ioctl(fd, EVIOCGBIT(0, EV_MAX), bit); + if(!test_bit(EV_KEY, bit)){ + continue; + } + if(checkBitSet(fd, EV_KEY, BTN_STYLUS) && test_bit(EV_ABS, bit)){ + continue; + } + SysObject sys("/sys/class/input/" + path + "/device"); + auto vendor = sys.strProperty("id/vendor"); + if(vendor == "0000"){ + continue; + } + auto product = sys.strProperty("id/product"); + if(product == "0000"){ + continue; + } + auto id = vendor+":"+product; + if(id == "0fac:0ade" || id == "0fac:1ade"){ + continue; + } + O_DEBUG("Keyboard found: " << sys.strProperty("name").c_str()); + return true; + } + O_DEBUG("No keyboard found"); + return false; + } + void DeviceSettings::onKeyboardAttachedChanged(std::function callback){ + auto manager = QGuiApplicationPrivate::inputDeviceManager(); + QObject::connect(manager, &QInputDeviceManager::deviceListChanged, [callback](QInputDeviceManager::DeviceType type){ + if(type == QInputDeviceManager::DeviceTypeKeyboard){ + callback(); + } + }); + } WifiNetworks XochitlSettings::wifinetworks(){ beginGroup("wifinetworks"); QMap wifinetworks; diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index d5aed29f9..3bf9ae3db 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -235,6 +235,16 @@ namespace Oxide { * \snippet examples/oxide.cpp setupQtEnvironment */ void setupQtEnvironment(bool touch = true); + /*! + * \brief Check if a keyboard is attached + * \return If a keyboard is attached + */ + bool keyboardAttached(); + /*! + * \brief Run a callback when keyboardAttached changes + * \param callback Callback to run + */ + void onKeyboardAttachedChanged(std::function callback); private: DeviceType _deviceType; diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index 262fdbb8a..8668e9e06 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -1,6 +1,7 @@ QT -= gui QT += quick QT += dbus +QT += core_private QT += gui-private TEMPLATE = lib @@ -12,6 +13,10 @@ CONFIG += precompile_header CONFIG += create_pc CONFIG += create_prl CONFIG += no_install_prl +CONFIG += qmltypes + +QML_IMPORT_NAME = codes.eeems.oxide +QML_IMPORT_MAJOR_VERSION = 2 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 @@ -23,6 +28,7 @@ SOURCES += \ json.cpp \ liboxide.cpp \ oxide_sentry.cpp \ + oxideqml.cpp \ power.cpp \ settingsfile.cpp \ slothandler.cpp \ @@ -40,6 +46,7 @@ HEADERS += \ liboxide.h \ meta.h \ oxide_sentry.h \ + oxideqml.h \ power.h \ json.h \ settingsfile.h \ @@ -110,3 +117,10 @@ QMAKE_PKGCONFIG_PREFIX = /opt QMAKE_PKGCONFIG_LIBDIR = /opt/lib QMAKE_PKGCONFIG_INCDIR = /opt/include QMAKE_PKGCONFIG_DESTDIR = pkgconfig + +RESOURCES += \ + oxide.qrc + +DISTFILES += \ + OxideMenu.qml \ + OxideWindow.qml diff --git a/shared/liboxide/oxide.qrc b/shared/liboxide/oxide.qrc new file mode 100644 index 000000000..9522c8f35 --- /dev/null +++ b/shared/liboxide/oxide.qrc @@ -0,0 +1,6 @@ + + + OxideWindow.qml + OxideMenu.qml + + diff --git a/shared/liboxide/oxideqml.cpp b/shared/liboxide/oxideqml.cpp new file mode 100644 index 000000000..8cd0867bf --- /dev/null +++ b/shared/liboxide/oxideqml.cpp @@ -0,0 +1,25 @@ +#include "oxideqml.h" +#include "liboxide.h" + +namespace Oxide { + namespace QML{ + OxideQml::OxideQml(QObject *parent) : QObject{parent}{ + deviceSettings.onKeyboardAttachedChanged([this]{ + emit landscapeChanged(deviceSettings.keyboardAttached()); + }); + } + + bool OxideQml::landscape(){ return deviceSettings.keyboardAttached(); } + + OxideQml* getSingleton(){ + static OxideQml* instance = new OxideQml(qApp); + return instance; + } + + void registerQML(QQmlApplicationEngine* engine){ + QQmlContext* context = engine->rootContext(); + context->setContextProperty("Oxide", getSingleton()); + engine->addImportPath( "qrc:/codes.eeems.oxide" ); + } + } +} diff --git a/shared/liboxide/oxideqml.h b/shared/liboxide/oxideqml.h new file mode 100644 index 000000000..9e4feb7d1 --- /dev/null +++ b/shared/liboxide/oxideqml.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include +#include + +namespace Oxide { + namespace QML{ + class OxideQml : public QObject{ + Q_OBJECT + Q_PROPERTY(bool landscape READ landscape NOTIFY landscapeChanged REVISION 1) + QML_NAMED_ELEMENT(Oxide) + QML_SINGLETON + public: + explicit OxideQml(QObject *parent = nullptr); + bool landscape(); + + signals: + void landscapeChanged(bool); + }; + OxideQml* getSingleton(); + void registerQML(QQmlApplicationEngine* engine); + } +} From b83850623904e9b2ed891e19c66a2a054c57615b Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Sun, 14 Jan 2024 23:50:04 -0700 Subject: [PATCH 52/87] Some cleanup (#338) * Upgrade sentry to 0.7.0 and do some cleanup * Fix install and crash --- Makefile | 98 +- .../desktop-file-edit/desktop-file-edit.pro | 1 - .../desktop-file-install.pro | 1 - .../desktop-file-validate.pro | 1 - applications/gio/gio.pro | 1 - applications/inject_evdev/inject_evdev.pro | 1 - applications/launcher/launcher.pro | 1 - applications/lockscreen/lockscreen.pro | 1 - applications/notify-send/notify-send.pro | 1 - .../process-manager/process-manager.pro | 1 - .../screenshot-tool/screenshot-tool.pro | 1 - applications/screenshot-viewer/controller.h | 3 +- .../screenshot-viewer/screenshot-viewer.pro | 1 - .../settings-manager/settings-manager.pro | 1 - applications/system-service/apibase.cpp | 8 + applications/system-service/apibase.h | 11 +- applications/system-service/application.cpp | 721 +- applications/system-service/application.h | 688 +- applications/system-service/appsapi.cpp | 678 +- applications/system-service/appsapi.h | 665 +- applications/system-service/bss.cpp | 123 + applications/system-service/bss.h | 124 +- applications/system-service/buttonhandler.cpp | 118 +- applications/system-service/buttonhandler.h | 109 +- applications/system-service/dbusservice.cpp | 269 + applications/system-service/dbusservice.h | 268 +- .../system-service/digitizerhandler.cpp | 181 + .../system-service/digitizerhandler.h | 182 +- applications/system-service/fifohandler.cpp | 98 + applications/system-service/fifohandler.h | 97 +- applications/system-service/main.cpp | 2 + applications/system-service/network.cpp | 230 + applications/system-service/network.h | 230 +- applications/system-service/notification.cpp | 104 +- applications/system-service/notification.h | 100 +- .../system-service/notificationapi.cpp | 159 + applications/system-service/notificationapi.h | 165 +- applications/system-service/powerapi.cpp | 195 + applications/system-service/powerapi.h | 205 +- applications/system-service/screenapi.cpp | 147 +- applications/system-service/screenapi.h | 143 +- applications/system-service/screenshot.cpp | 104 + applications/system-service/screenshot.h | 104 +- .../system-service/system-service.pro | 9 +- applications/system-service/systemapi.cpp | 822 ++ applications/system-service/systemapi.h | 824 +- applications/system-service/wifiapi.cpp | 829 ++ applications/system-service/wifiapi.h | 830 +- applications/system-service/wlan.cpp | 101 + applications/system-service/wlan.h | 101 +- applications/task-switcher/task-switcher.pro | 1 - .../update-desktop-database.pro | 1 - .../xdg-desktop-icon/xdg-desktop-icon.pro | 1 - .../xdg-desktop-menu/xdg-desktop-menu.pro | 1 - .../xdg-icon-resource/xdg-icon-resource.pro | 1 - applications/xdg-open/xdg-open.pro | 1 - applications/xdg-settings/xdg-settings.pro | 1 - oxide.pro | 4 +- package | 44 +- qmake/common.pri | 31 +- qmake/epaper.pri | 4 +- qmake/liboxide.pri | 11 +- qmake/sentry.pri | 10 +- shared/epaper/epaper.pro | 26 + shared/epaper/libepaper.so | Bin 199988 -> 0 bytes shared/liboxide/liboxide.h | 7 + shared/liboxide/liboxide.pro | 18 +- shared/liboxide/liboxide_global.h | 5 + shared/liboxide/slothandler.cpp | 26 +- .../system-service => shared/mxcfb}/mxcfb.h | 0 shared/sentry/CMakeLists.txt | 603 -- shared/sentry/external/breakpad/LICENSE | 131 - .../external/breakpad/docs/breakpad.png | Bin 69566 -> 0 bytes .../external/breakpad/src/build/all.gyp | 41 - .../external/breakpad/src/build/common.gypi | 1045 -- .../breakpad/src/build/filename_rules.gypi | 57 - .../external/breakpad/src/build/gyp_breakpad | 67 - .../external/breakpad/src/build/testing.gyp | 90 - .../src/client/windows/breakpad_client.gyp | 66 - .../crash_generation/crash_generation.gyp | 63 - .../windows/handler/exception_handler.gyp | 47 - .../windows/sender/crash_report_sender.gyp | 46 - .../crash_generation_app.gyp | 63 - .../client/windows/unittests/client_tests.gyp | 81 - .../src/client/windows/unittests/testing.gyp | 90 - .../external/breakpad/src/common/common.gyp | 262 - .../src/common/linux/tests/auto_testfile.h | 123 - .../breakpad/src/common/mac/arch_utilities.cc | 268 - .../src/common/windows/common_windows.gyp | 112 - .../src/third_party/libdisasm/libdisasm.gyp | 67 - .../src/third_party/mac_headers/README | 2 - .../mac_headers/mach/i386/vm_param.h | 157 - .../third_party/mac_headers/mach/machine.h | 347 - .../mac_headers/mach/machine/thread_status.h | 1 - .../sentry/external/crashpad/build/BUILD.gn | 68 - .../external/crashpad/build/BUILDCONFIG.gn | 99 - .../crashpad/build/crashpad_buildconfig.gni | 160 - .../crashpad/build/crashpad_fuzzer_test.gni | 58 - .../crashpad/build/install_linux_sysroot.py | 74 - .../external/crashpad/build/ios/Default.png | Bin 624 -> 0 bytes .../crashpad/build/ios/Unittest-Info.plist | 10 - .../build/ios/convert_gn_xcodeproj.py | 559 - .../crashpad/build/ios/setup_ios_gn.config | 39 - .../crashpad/build/ios/setup_ios_gn.py | 404 - .../build/ios/xcodescheme-testable.template | 73 - .../crashpad/build/ios/xcodescheme.template | 78 - .../external/crashpad/build/run_tests.py | 480 - .../sentry/external/crashpad/build/test.gni | 49 - .../crashpad/client/annotation_test.cc | 135 - .../sentry/external/crashpad/doc/layering.png | Bin 20391 -> 0 bytes .../sentry/external/crashpad/doc/overview.png | Bin 25170 -> 0 bytes .../mini_chromium/build/chromeos_buildflags.h | 13 - .../mini_chromium/base/mac/foundation_util.h | 188 - .../mini_chromium/base/mac/foundation_util.mm | 116 - .../mini_chromium/base/mac/mach_logging.h | 163 - .../base/mac/scoped_nsautorelease_pool.mm | 32 - .../mini_chromium/base/mac/scoped_nsobject.h | 70 - .../mini_chromium/base/mac/scoped_typeref.h | 85 - .../mini_chromium/base/template_util.h | 128 - .../mini_chromium/build/BUILD.gn | 37 - .../mini_chromium/build/build_config.h | 139 - .../mini_chromium/build/buildflag.h | 16 - .../mini_chromium/build/buildflag_header.gni | 56 - .../mini_chromium/build/compiler.gni | 7 - .../mini_chromium/build/config/BUILD.gn | 751 -- .../mini_chromium/build/find_mac_sdk.py | 164 - .../build/ios/Application-Info.plist | 114 - .../mini_chromium/build/ios/BUILD.gn | 20 - .../mini_chromium/build/ios/BuildInfo.plist | 35 - .../mini_chromium/build/ios/Module-Info.plist | 26 - .../build/ios/XCTRunnerAddition+Info.plist | 12 - .../mini_chromium/build/ios/codesign.py | 691 -- .../build/ios/entitlements.plist | 8 - .../build/ios/find_signing_identity.py | 89 - .../mini_chromium/build/ios/ios_sdk.gni | 116 - .../mini_chromium/build/ios/plist_util.py | 265 - .../mini_chromium/build/ios/rules.gni | 678 -- .../mini_chromium/build/ios/sdk_info.py | 176 - .../mini_chromium/build/ios/strip_arm64e.py | 69 - .../mini_chromium/build/platform.gni | 38 - .../mini_chromium/build/sysroot.gni | 70 - .../mini_chromium/build/win_helper.py | 230 - .../build/write_buildflag_header.py | 104 - .../crashpad/third_party/zlib/zlib/BUILD.gn | 161 - .../crashpad/third_party/zlib/zlib/OWNERS | 3 - .../crashpad/third_party/zlib/zlib/crc32.c | 469 - .../crashpad/third_party/zlib/zlib/crc32.h | 441 - .../third_party/zlib/zlib/fill_window_sse.c | 175 - .../third_party/zlib/zlib/google.patch | 399 - .../third_party/zlib/zlib/google/DEPS | 5 - .../zlib/zlib/google/compression_utils.cc | 165 - .../zlib/zlib/google/compression_utils.h | 22 - .../third_party/zlib/zlib/google/zip.cc | 219 - .../third_party/zlib/zlib/google/zip.h | 59 - .../zlib/zlib/google/zip_reader.cc | 533 - .../third_party/zlib/zlib/google/zip_reader.h | 281 - .../zlib/zlib/google/zip_reader_unittest.cc | 692 -- .../zlib/zlib/google/zip_unittest.cc | 338 - .../crashpad/third_party/zlib/zlib/inffast.h | 11 - .../third_party/zlib/zlib/simd_stub.c | 35 - .../crashpad/third_party/zlib/zlib/x86.c | 92 - .../crashpad/third_party/zlib/zlib/x86.h | 15 - .../util/misc/capture_context_fuchsia.S | 173 - .../misc/capture_context_test_util_fuchsia.cc | 58 - .../util/thread/thread_log_messages.cc | 88 - shared/sentry/sentry-config.cmake.in | 20 - shared/sentry/sentry.pro | 36 + shared/sentry/src/.vscode/extensions.json | 9 + shared/sentry/src/.vscode/settings.json | 10 + shared/sentry/{ => src}/CHANGELOG.md | 177 +- shared/sentry/src/CMakeLists.txt | 717 +- shared/sentry/{ => src}/CONTRIBUTING.md | 1 + shared/sentry/{ => src}/LICENSE | 0 shared/sentry/{ => src}/README.md | 21 +- shared/sentry/{ => src}/examples/example.c | 4 + .../sentry/{ => src}/external/CMakeLists.txt | 8 + .../{ => src}/external/breakpad/.clang-format | 0 .../.github/workflows/build-test-ci.yml | 0 .../breakpad/.github/workflows/coverity.yml | 0 .../{ => src}/external/breakpad/.gitignore | 5 +- .../{ => src}/external/breakpad/AUTHORS | 0 .../{ => src}/external/breakpad/ChangeLog | 0 .../sentry/{ => src}/external/breakpad/DEPS | 30 +- .../{ => src}/external/breakpad/DIR_METADATA | 0 .../{ => src}/external/breakpad/INSTALL | 0 shared/sentry/src/external/breakpad/LICENSE | 1068 ++ .../{ => src}/external/breakpad/Makefile.am | 519 +- .../{ => src}/external/breakpad/Makefile.in | 4699 ++++---- .../sentry/{ => src}/external/breakpad/NEWS | 0 .../sentry/{ => src}/external/breakpad/OWNERS | 0 .../external/breakpad/README.ANDROID | 0 .../{ => src}/external/breakpad/README.md | 0 .../{ => src}/external/breakpad/aclocal.m4 | 29 - .../breakpad/android/common-functions.sh | 0 .../android/google_breakpad/Android.mk | 0 .../external/breakpad/android/run-checks.sh | 0 .../breakpad/android/sample_app/README | 0 .../android/sample_app/jni/Android.mk | 0 .../android/sample_app/jni/Application.mk | 0 .../android/sample_app/jni/test_breakpad.cpp | 0 .../external/breakpad/android/test-driver | 0 .../external/breakpad/android/test-shell.sh | 0 .../{ => src}/external/breakpad/appveyor.yml | 0 .../external/breakpad/autotools/ar-lib | 0 .../external/breakpad/autotools/compile | 0 .../external/breakpad/autotools/config.guess | 0 .../external/breakpad/autotools/config.sub | 0 .../external/breakpad/autotools/depcomp | 0 .../external/breakpad/autotools/install-sh | 0 .../external/breakpad/autotools/ltmain.sh | 0 .../external/breakpad/autotools/missing | 0 .../breakpad/autotools/root-test-driver | 0 .../external/breakpad/autotools/test-driver | 0 .../external/breakpad/breakpad-client.pc.in | 0 .../external/breakpad/breakpad.pc.in | 0 .../external/breakpad/codereview.settings | 0 .../{ => src}/external/breakpad/configure | 2104 +++- .../{ => src}/external/breakpad/configure.ac | 24 +- .../{ => src}/external/breakpad/default.xml | 7 +- .../{ => src}/external/breakpad/docs/OWNERS | 0 .../src/external/breakpad/docs/breakpad.png | Bin 0 -> 84153 bytes .../external/breakpad/docs/breakpad.svg | 0 .../external/breakpad/docs/client_design.md | 0 .../breakpad/docs/contributing_to_breakpad.md | 0 .../breakpad/docs/exception_handling.md | 0 .../docs/getting_started_with_breakpad.md | 0 .../breakpad/docs/linux_core_handler.md | 0 .../breakpad/docs/linux_starter_guide.md | 0 .../breakpad/docs/linux_system_calls.md | 0 .../docs/mac_breakpad_starter_guide.md | 0 .../breakpad/docs/mozilla_brown_bag_talk.md | 0 .../breakpad/docs/processor_design.md | 0 .../external/breakpad/docs/stack_walking.md | 0 .../breakpad/docs/sym_upload_v2_protocol.md | 0 .../external/breakpad/docs/symbol_files.md | 0 .../docs/windows_client_integration.md | 0 .../breakpad/m4/ax_append_compile_flags.m4 | 0 .../external/breakpad/m4/ax_append_flag.m4 | 0 .../breakpad/m4/ax_check_compile_flag.m4 | 0 .../external/breakpad/m4/ax_check_define.m4 | 0 .../breakpad/m4/ax_cxx_compile_stdcxx.m4 | 0 .../external/breakpad/m4/ax_pthread.m4 | 0 .../breakpad/m4/ax_require_defined.m4 | 0 .../{ => src}/external/breakpad/m4/libtool.m4 | 0 .../external/breakpad/m4/ltoptions.m4 | 0 .../{ => src}/external/breakpad/m4/ltsugar.m4 | 0 .../external/breakpad/m4/ltversion.m4 | 0 .../external/breakpad/m4/lt~obsolete.m4 | 0 .../src/breakpad_googletest_includes.h | 0 .../client/apple/Framework/BreakpadDefines.h | 0 .../breakpad/src/client/ios/Breakpad.h | 0 .../breakpad/src/client/ios/Breakpad.mm | 0 .../ios/Breakpad.xcodeproj/project.pbxproj | 0 .../src/client/ios/BreakpadController.h | 0 .../src/client/ios/BreakpadController.mm | 0 .../src/client/ios/Breakpad_Prefix.pch | 0 .../client/ios/exception_handler_no_mach.cc | 4 + .../client/ios/exception_handler_no_mach.h | 0 .../ios_exception_minidump_generator.h | 0 .../ios_exception_minidump_generator.mm | 0 .../linux/crash_generation/client_info.h | 0 .../crash_generation_client.cc | 12 +- .../crash_generation_client.h | 11 +- .../crash_generation_server.cc | 4 + .../crash_generation_server.h | 0 .../src/client/linux/data/linux-gate-amd.sym | 0 .../client/linux/data/linux-gate-intel.sym | 0 .../linux/dump_writer_common/mapping_info.h | 0 .../dump_writer_common/raw_context_cpu.h | 0 .../linux/dump_writer_common/thread_info.cc | 34 +- .../linux/dump_writer_common/thread_info.h | 0 .../dump_writer_common/ucontext_reader.cc | 32 +- .../dump_writer_common/ucontext_reader.h | 0 .../client/linux/handler/exception_handler.cc | 4 + .../client/linux/handler/exception_handler.h | 0 .../handler/exception_handler_unittest.cc | 4 + .../linux/handler/microdump_extra_info.h | 0 .../linux/handler/minidump_descriptor.cc | 4 + .../linux/handler/minidump_descriptor.h | 1 + .../breakpad/src/client/linux/log/log.cc | 4 + .../breakpad/src/client/linux/log/log.h | 0 .../microdump_writer/microdump_writer.cc | 4 + .../linux/microdump_writer/microdump_writer.h | 0 .../microdump_writer_unittest.cc | 4 + .../client/linux/minidump_writer/cpu_set.h | 0 .../linux/minidump_writer/cpu_set_unittest.cc | 64 +- .../linux/minidump_writer/directory_reader.h | 0 .../directory_reader_unittest.cc | 4 + .../linux/minidump_writer/line_reader.h | 0 .../minidump_writer/line_reader_unittest.cc | 45 +- .../minidump_writer/linux_core_dumper.cc | 4 + .../linux/minidump_writer/linux_core_dumper.h | 0 .../linux_core_dumper_unittest.cc | 4 + .../linux/minidump_writer/linux_dumper.cc | 8 +- .../linux/minidump_writer/linux_dumper.h | 0 .../linux_dumper_unittest_helper.cc | 4 + .../minidump_writer/linux_ptrace_dumper.cc | 12 + .../minidump_writer/linux_ptrace_dumper.h | 0 .../linux_ptrace_dumper_unittest.cc | 4 + .../linux/minidump_writer/minidump_writer.cc | 4 + .../linux/minidump_writer/minidump_writer.h | 0 .../minidump_writer_unittest.cc | 4 + .../minidump_writer_unittest_utils.cc | 4 + .../minidump_writer_unittest_utils.h | 0 .../client/linux/minidump_writer/pe_file.cc | 4 + .../client/linux/minidump_writer/pe_file.h | 0 .../client/linux/minidump_writer/pe_structs.h | 0 .../minidump_writer/proc_cpuinfo_reader.h | 0 .../proc_cpuinfo_reader_unittest.cc | 60 +- .../sender/google_crash_report_sender.cc | 4 + .../mac/Breakpad.xcodeproj/project.pbxproj | 0 .../src/client/mac/Framework/Breakpad.h | 0 .../src/client/mac/Framework/Breakpad.mm | 0 .../client/mac/Framework/Breakpad_Prefix.pch | 0 .../src/client/mac/Framework/Info.plist | 0 .../src/client/mac/Framework/OnDemandServer.h | 0 .../client/mac/Framework/OnDemandServer.mm | 0 .../src/client/mac/UnitTests-Info.plist | 0 .../client/mac/crash_generation/ConfigFile.h | 0 .../client/mac/crash_generation/ConfigFile.mm | 0 .../client/mac/crash_generation/Inspector.h | 0 .../client/mac/crash_generation/Inspector.mm | 0 .../mac/crash_generation/InspectorMain.mm | 0 .../client/mac/crash_generation/client_info.h | 0 .../crash_generation_client.cc | 4 + .../crash_generation_client.h | 0 .../crash_generation_server.cc | 4 + .../crash_generation_server.h | 0 .../client/mac/handler/breakpad_nlist_64.cc | 4 + .../client/mac/handler/breakpad_nlist_64.h | 0 .../src/client/mac/handler/dynamic_images.cc | 4 + .../src/client/mac/handler/dynamic_images.h | 0 .../client/mac/handler/exception_handler.cc | 4 + .../client/mac/handler/exception_handler.h | 0 .../src/client/mac/handler/mach_vm_compat.h | 0 .../client/mac/handler/minidump_generator.cc | 4 + .../client/mac/handler/minidump_generator.h | 0 .../minidump_test.xcodeproj/project.pbxproj | 0 .../mac/handler/minidump_tests32-Info.plist | 0 .../mac/handler/minidump_tests64-Info.plist | 0 .../mac/handler/obj-cTestCases-Info.plist | 0 .../mac/handler/protected_memory_allocator.cc | 4 + .../mac/handler/protected_memory_allocator.h | 0 .../handler/testcases/DynamicImagesTests.cc | 4 + .../handler/testcases/DynamicImagesTests.h | 0 .../handler/testcases/breakpad_nlist_test.cc | 4 + .../handler/testcases/breakpad_nlist_test.h | 0 .../client/mac/handler/testcases/dwarftests.h | 0 .../mac/handler/testcases/dwarftests.mm | 0 .../testcases/testdata/dump_syms_dwarf_data | Bin .../testdata/dump_syms_i386_breakpad.sym | 0 .../src/client/mac/handler/ucontext_compat.h | 0 .../src/client/mac/sender/Breakpad.xib | 0 .../sender/English.lproj/InfoPlist.strings | Bin .../sender/English.lproj/Localizable.strings | Bin .../client/mac/sender/ReporterIcon.graffle | 0 .../mac/sender/crash_report_sender-Info.plist | 0 .../client/mac/sender/crash_report_sender.h | 0 .../mac/sender/crash_report_sender.icns | Bin .../client/mac/sender/crash_report_sender.m | 0 .../mac/sender/da.lproj/InfoPlist.strings | Bin .../mac/sender/da.lproj/Localizable.strings | Bin .../mac/sender/de.lproj/InfoPlist.strings | Bin .../mac/sender/de.lproj/Localizable.strings | Bin .../mac/sender/es.lproj/InfoPlist.strings | Bin .../mac/sender/es.lproj/Localizable.strings | Bin .../mac/sender/fr.lproj/InfoPlist.strings | Bin .../mac/sender/fr.lproj/Localizable.strings | Bin .../src/client/mac/sender/goArrow.png | Bin .../mac/sender/it.lproj/InfoPlist.strings | Bin .../mac/sender/it.lproj/Localizable.strings | Bin .../mac/sender/ja.lproj/InfoPlist.strings | Bin .../mac/sender/ja.lproj/Localizable.strings | Bin .../mac/sender/nl.lproj/InfoPlist.strings | Bin .../mac/sender/nl.lproj/Localizable.strings | Bin .../mac/sender/no.lproj/InfoPlist.strings | Bin .../mac/sender/no.lproj/Localizable.strings | Bin .../mac/sender/sl.lproj/InfoPlist.strings | Bin .../mac/sender/sl.lproj/Localizable.strings | Bin .../mac/sender/sv.lproj/InfoPlist.strings | Bin .../mac/sender/sv.lproj/Localizable.strings | Bin .../mac/sender/tr.lproj/InfoPlist.strings | Bin .../mac/sender/tr.lproj/Localizable.strings | Bin .../breakpad/src/client/mac/sender/uploader.h | 0 .../src/client/mac/sender/uploader.mm | 0 .../src/client/mac/testapp/Controller.h | 0 .../src/client/mac/testapp/Controller.m | 0 .../testapp/English.lproj/InfoPlist.strings | Bin .../mac/testapp/English.lproj/MainMenu.xib | 0 .../src/client/mac/testapp/Info.plist | 0 .../src/client/mac/testapp/TestClass.h | 0 .../src/client/mac/testapp/TestClass.mm | 0 .../breakpad/src/client/mac/testapp/bomb.icns | Bin .../src/client/mac/testapp/crashInMain | Bin .../src/client/mac/testapp/crashduringload | Bin .../breakpad/src/client/mac/testapp/main.m | 0 .../mac/tests/BreakpadFramework_Test.mm | 0 .../mac/tests/crash_generation_server_test.cc | 4 + .../mac/tests/exception_handler_test.cc | 4 + .../mac/tests/minidump_generator_test.cc | 4 + .../tests/minidump_generator_test_helper.cc | 4 + .../client/mac/tests/spawn_child_process.h | 0 .../src/client/mac/tests/testlogging.h | 0 .../src/client/minidump_file_writer-inl.h | 0 .../src/client/minidump_file_writer.cc | 4 + .../src/client/minidump_file_writer.h | 0 .../client/minidump_file_writer_unittest.cc | 4 + .../src/client/solaris/handler/Makefile | 0 .../solaris/handler/exception_handler.cc | 4 + .../solaris/handler/exception_handler.h | 0 .../solaris/handler/exception_handler_test.cc | 4 + .../solaris/handler/minidump_generator.cc | 4 + .../solaris/handler/minidump_generator.h | 0 .../client/solaris/handler/minidump_test.cc | 4 + .../src/client/solaris/handler/solaris_lwp.cc | 4 + .../src/client/solaris/handler/solaris_lwp.h | 0 .../windows/common/auto_critical_section.h | 0 .../src/client/windows/common/ipc_protocol.h | 0 .../windows/crash_generation/ReadMe.txt | 0 .../windows/crash_generation/client_info.cc | 4 + .../windows/crash_generation/client_info.h | 0 .../crash_generation_client.cc | 4 + .../crash_generation_client.h | 0 .../crash_generation_server.cc | 4 + .../crash_generation_server.h | 0 .../crash_generation/minidump_generator.cc | 4 + .../crash_generation/minidump_generator.h | 0 .../windows/handler/exception_handler.cc | 4 + .../windows/handler/exception_handler.h | 0 .../windows/sender/crash_report_sender.cc | 4 + .../windows/sender/crash_report_sender.h | 0 .../crash_generation_app/abstract_class.cc | 4 + .../crash_generation_app/abstract_class.h | 0 .../crash_generation_app.cc | 4 + .../crash_generation_app.h | 0 .../crash_generation_app.ico | Bin .../crash_generation_app.rc | 0 .../tests/crash_generation_app/resource.h | 0 .../tests/crash_generation_app/small.ico | Bin .../unittests/crash_generation_server_test.cc | 4 + .../client/windows/unittests/dump_analysis.cc | 4 + .../client/windows/unittests/dump_analysis.h | 0 .../unittests/exception_handler_death_test.cc | 4 + .../exception_handler_nesting_test.cc | 4 + .../unittests/exception_handler_test.cc | 4 + .../unittests/exception_handler_test.h | 0 .../client/windows/unittests/minidump_test.cc | 4 + .../common/android/include/asm-mips/README.md | 0 .../src/common/android/include/asm-mips/asm.h | 0 .../android/include/asm-mips/fpregdef.h | 0 .../common/android/include/asm-mips/regdef.h | 0 .../breakpad/src/common/android/include/elf.h | 0 .../src/common/android/include/link.h | 0 .../src/common/android/include/stab.h | 0 .../src/common/android/include/sys/procfs.h | 0 .../src/common/android/include/sys/user.h | 0 .../common/android/testing/include/wchar.h | 0 .../src/common/android/testing/mkdtemp.h | 0 .../common/android/testing/pthread_fixes.h | 0 .../external/breakpad/src/common/basictypes.h | 8 - .../breakpad/src/common/byte_cursor.h | 0 .../src/common/byte_cursor_unittest.cc | 4 + .../breakpad/src/common/convert_UTF.cc | 4 + .../breakpad/src/common/convert_UTF.h | 0 .../src/common/dwarf/bytereader-inl.h | 0 .../breakpad/src/common/dwarf/bytereader.cc | 4 + .../breakpad/src/common/dwarf/bytereader.h | 0 .../src/common/dwarf/bytereader_unittest.cc | 4 + .../src/common/dwarf/cfi_assembler.cc | 4 + .../breakpad/src/common/dwarf/cfi_assembler.h | 0 .../src/common/dwarf/dwarf2diehandler.cc | 4 + .../src/common/dwarf/dwarf2diehandler.h | 0 .../common/dwarf/dwarf2diehandler_unittest.cc | 4 + .../breakpad/src/common/dwarf/dwarf2enums.h | 6 +- .../breakpad/src/common/dwarf/dwarf2reader.cc | 150 +- .../breakpad/src/common/dwarf/dwarf2reader.h | 82 +- .../common/dwarf/dwarf2reader_cfi_unittest.cc | 4 + .../common/dwarf/dwarf2reader_die_unittest.cc | 7 +- .../dwarf/dwarf2reader_lineinfo_unittest.cc | 4 + .../dwarf2reader_splitfunctions_unittest.cc | 4 + .../common/dwarf/dwarf2reader_test_common.h | 0 .../breakpad/src/common/dwarf/elf_reader.cc | 46 +- .../breakpad/src/common/dwarf/elf_reader.h | 4 +- .../breakpad/src/common/dwarf/functioninfo.cc | 4 + .../breakpad/src/common/dwarf/functioninfo.h | 0 .../src/common/dwarf/line_state_machine.h | 0 .../breakpad/src/common/dwarf/types.h | 0 .../src/common/dwarf_cfi_to_module.cc | 34 +- .../breakpad/src/common/dwarf_cfi_to_module.h | 10 +- .../common/dwarf_cfi_to_module_unittest.cc | 16 + .../breakpad/src/common/dwarf_cu_to_module.cc | 101 +- .../breakpad/src/common/dwarf_cu_to_module.h | 12 +- .../src/common/dwarf_cu_to_module_unittest.cc | 17 + .../src/common/dwarf_line_to_module.cc | 4 + .../src/common/dwarf_line_to_module.h | 0 .../common/dwarf_line_to_module_unittest.cc | 4 + .../src/common/dwarf_range_list_handler.cc | 4 + .../src/common/dwarf_range_list_handler.h | 0 .../external/breakpad/src/common/language.cc | 4 + .../external/breakpad/src/common/language.h | 0 .../src/common/linux/breakpad_getcontext.S | 0 .../src/common/linux/breakpad_getcontext.h | 4 - .../linux/breakpad_getcontext_unittest.cc | 4 + .../breakpad/src/common/linux/crc32.cc | 4 + .../breakpad/src/common/linux/crc32.h | 0 .../breakpad/src/common/linux/dump_symbols.cc | 235 +- .../breakpad/src/common/linux/dump_symbols.h | 9 +- .../src/common/linux/dump_symbols_unittest.cc | 10 +- .../breakpad/src/common/linux/eintr_wrapper.h | 0 .../src/common/linux/elf_core_dump.cc | 4 + .../breakpad/src/common/linux/elf_core_dump.h | 0 .../common/linux/elf_core_dump_unittest.cc | 4 + .../src/common/linux/elf_gnu_compat.h | 0 .../src/common/linux/elf_symbols_to_module.cc | 11 +- .../src/common/linux/elf_symbols_to_module.h | 0 .../linux/elf_symbols_to_module_unittest.cc | 4 + .../breakpad/src/common/linux/elfutils-inl.h | 0 .../breakpad/src/common/linux/elfutils.cc | 4 + .../breakpad/src/common/linux/elfutils.h | 35 + .../breakpad/src/common/linux/file_id.cc | 4 + .../breakpad/src/common/linux/file_id.h | 0 .../src/common/linux/file_id_unittest.cc | 4 + .../common/linux/google_crashdump_uploader.cc | 4 + .../common/linux/google_crashdump_uploader.h | 0 .../linux/google_crashdump_uploader_test.cc | 4 + .../breakpad/src/common/linux/guid_creator.cc | 2 +- .../breakpad/src/common/linux/guid_creator.h | 0 .../breakpad/src/common/linux/http_upload.cc | 4 + .../breakpad/src/common/linux/http_upload.h | 0 .../breakpad/src/common/linux/ignore_ret.h | 0 .../src/common/linux/libcurl_wrapper.cc | 11 +- .../src/common/linux/libcurl_wrapper.h | 4 + .../src/common/linux/linux_libc_support.cc | 4 + .../src/common/linux/linux_libc_support.h | 0 .../linux/linux_libc_support_unittest.cc | 4 + .../src/common/linux/memory_mapped_file.cc | 11 +- .../src/common/linux/memory_mapped_file.h | 7 +- .../linux/memory_mapped_file_unittest.cc | 4 + .../src/common/linux/safe_readlink.cc | 4 + .../breakpad/src/common/linux/safe_readlink.h | 0 .../common/linux/safe_readlink_unittest.cc | 4 + .../breakpad/src/common/linux/scoped_pipe.cc | 132 + .../breakpad/src/common/linux/scoped_pipe.h | 115 + .../src/common/linux/scoped_pipe_unittest.cc | 75 + .../src/common/linux/scoped_tmpfile.cc | 103 + .../src/common/linux/scoped_tmpfile.h | 85 + .../common/linux/scoped_tmpfile_unittest.cc | 50 + .../common/linux/symbol_collector_client.cc | 4 + .../common/linux/symbol_collector_client.h | 0 .../src/common/linux/symbol_upload.cc | 4 + .../breakpad/src/common/linux/symbol_upload.h | 0 .../breakpad/src/common/linux/synth_elf.cc | 4 + .../breakpad/src/common/linux/synth_elf.h | 0 .../src/common/linux/synth_elf_unittest.cc | 4 + .../src/common/linux/tests/crash_generator.cc | 4 + .../src/common/linux/tests/crash_generator.h | 0 .../src/common/linux/ucontext_constants.h | 0 .../src/common/long_string_dictionary.cc | 4 + .../src/common/long_string_dictionary.h | 0 .../common/long_string_dictionary_unittest.cc | 4 + .../breakpad/src/common/mac/Breakpad.xcconfig | 0 .../src/common/mac/BreakpadDebug.xcconfig | 0 .../src/common/mac/BreakpadRelease.xcconfig | 0 .../breakpad/src/common/mac/GTMDefines.h | 0 .../breakpad/src/common/mac/GTMLogger.h | 0 .../breakpad/src/common/mac/GTMLogger.m | 0 .../breakpad/src/common/mac/HTTPGetRequest.h | 0 .../breakpad/src/common/mac/HTTPGetRequest.m | 0 .../src/common/mac/HTTPMultipartUpload.h | 0 .../src/common/mac/HTTPMultipartUpload.m | 0 .../breakpad/src/common/mac/HTTPPutRequest.h | 0 .../breakpad/src/common/mac/HTTPPutRequest.m | 0 .../breakpad/src/common/mac/HTTPRequest.h | 0 .../breakpad/src/common/mac/HTTPRequest.m | 0 .../src/common/mac/HTTPSimplePostRequest.h | 0 .../src/common/mac/HTTPSimplePostRequest.m | 0 .../breakpad/src/common/mac/MachIPC.h | 0 .../breakpad/src/common/mac/MachIPC.mm | 0 .../src/common/mac/SymbolCollectorClient.h | 0 .../src/common/mac/SymbolCollectorClient.m | 0 .../breakpad/src/common/mac/arch_utilities.cc | 179 + .../breakpad/src/common/mac/arch_utilities.h | 26 +- .../src/common/mac/bootstrap_compat.cc | 4 + .../src/common/mac/bootstrap_compat.h | 0 .../breakpad/src/common/mac/byteswap.h | 0 .../breakpad/src/common/mac/dump_syms.cc | 214 +- .../breakpad/src/common/mac/dump_syms.h | 79 +- .../breakpad/src/common/mac/encoding_util.h | 0 .../breakpad/src/common/mac/encoding_util.m | 0 .../breakpad/src/common/mac/file_id.cc | 4 + .../breakpad/src/common/mac/file_id.h | 0 .../src/common/mac/launch_reporter.cc | 4 + .../breakpad/src/common/mac/launch_reporter.h | 0 .../breakpad/src/common/mac/macho_id.cc | 4 + .../breakpad/src/common/mac/macho_id.h | 0 .../breakpad/src/common/mac/macho_reader.cc | 4 + .../breakpad/src/common/mac/macho_reader.h | 0 .../src/common/mac/macho_reader_unittest.cc | 4 + .../src/common/mac/macho_utilities.cc | 4 + .../breakpad/src/common/mac/macho_utilities.h | 0 .../breakpad/src/common/mac/macho_walker.cc | 13 +- .../breakpad/src/common/mac/macho_walker.h | 0 .../breakpad/src/common/mac/minidump_upload.m | 0 .../src/common/mac/scoped_task_suspend-inl.h | 0 .../src/common/mac/string_utilities.cc | 4 + .../src/common/mac/string_utilities.h | 0 .../breakpad/src/common/mac/super_fat_arch.h | 0 .../src/common/mac/testing/GTMSenTestCase.h | 0 .../src/common/mac/testing/GTMSenTestCase.m | 0 .../external/breakpad/src/common/macros.h | 0 .../external/breakpad/src/common/md5.cc | 4 + .../external/breakpad/src/common/md5.h | 0 .../breakpad/src/common/memory_allocator.h | 0 .../src/common/memory_allocator_unittest.cc | 4 + .../breakpad/src/common/memory_range.h | 0 .../src/common/memory_range_unittest.cc | 4 + .../src/common/minidump_type_helper.h | 0 .../external/breakpad/src/common/module.cc | 125 +- .../external/breakpad/src/common/module.h | 67 +- .../breakpad/src/common/module_unittest.cc | 198 +- .../breakpad/src/common/path_helper.cc | 4 + .../breakpad/src/common/path_helper.h | 0 .../external/breakpad/src/common/safe_math.h | 0 .../breakpad/src/common/safe_math_unittest.cc | 4 + .../external/breakpad/src/common/scoped_ptr.h | 0 .../src/common/simple_string_dictionary.cc | 4 + .../src/common/simple_string_dictionary.h | 8 +- .../simple_string_dictionary_unittest.cc | 4 + .../src/common/solaris/dump_symbols.cc | 4 + .../src/common/solaris/dump_symbols.h | 0 .../breakpad/src/common/solaris/file_id.cc | 4 + .../breakpad/src/common/solaris/file_id.h | 0 .../src/common/solaris/guid_creator.cc | 4 + .../src/common/solaris/guid_creator.h | 0 .../src/common/solaris/message_output.h | 0 .../breakpad/src/common/stabs_reader.cc | 4 + .../breakpad/src/common/stabs_reader.h | 4 - .../src/common/stabs_reader_unittest.cc | 4 + .../breakpad/src/common/stabs_to_module.cc | 10 +- .../breakpad/src/common/stabs_to_module.h | 0 .../src/common/stabs_to_module_unittest.cc | 4 + .../breakpad/src/common/stdio_wrapper.h | 0 .../breakpad/src/common/string_conversion.cc | 4 + .../breakpad/src/common/string_conversion.h | 0 .../src/common/string_conversion_unittest.cc | 4 + .../breakpad/src/common/string_view.h | 0 .../breakpad/src/common/symbol_data.h | 0 .../breakpad/src/common/test_assembler.cc | 4 + .../breakpad/src/common/test_assembler.h | 0 .../src/common/test_assembler_unittest.cc | 4 + .../src/common/testdata/func-line-pairing.h | 0 .../breakpad/src/common/tests/auto_tempdir.h | 0 .../breakpad/src/common/tests/file_utils.cc | 4 + .../breakpad/src/common/tests/file_utils.h | 0 .../external/breakpad/src/common/unordered.h | 0 .../breakpad/src/common/using_std_string.h | 0 .../breakpad/src/common/windows/dia_util.cc | 4 + .../breakpad/src/common/windows/dia_util.h | 0 .../src/common/windows/guid_string.cc | 4 + .../breakpad/src/common/windows/guid_string.h | 0 .../src/common/windows/http_upload.cc | 5 +- .../breakpad/src/common/windows/http_upload.h | 0 .../breakpad/src/common/windows/module_info.h | 0 .../breakpad/src/common/windows/omap.cc | 4 + .../breakpad/src/common/windows/omap.h | 0 .../src/common/windows/omap_internal.h | 0 .../src/common/windows/omap_unittest.cc | 4 + .../common/windows/pdb_source_line_writer.cc | 4 + .../common/windows/pdb_source_line_writer.h | 0 .../common/windows/pe_source_line_writer.cc | 4 + .../common/windows/pe_source_line_writer.h | 7 +- .../breakpad/src/common/windows/pe_util.cc | 4 + .../breakpad/src/common/windows/pe_util.h | 0 .../src/common/windows/string_utils-inl.h | 0 .../src/common/windows/string_utils.cc | 4 + .../common/windows/sym_upload_v2_protocol.cc | 4 + .../common/windows/sym_upload_v2_protocol.h | 0 .../common/windows/symbol_collector_client.cc | 4 + .../common/windows/symbol_collector_client.h | 0 .../external/breakpad/src/config.h.in | 3 + .../google_breakpad/common/breakpad_types.h | 0 .../common/minidump_cpu_amd64.h | 2 +- .../google_breakpad/common/minidump_cpu_arm.h | 0 .../common/minidump_cpu_arm64.h | 0 .../common/minidump_cpu_mips.h | 0 .../google_breakpad/common/minidump_cpu_ppc.h | 0 .../common/minidump_cpu_ppc64.h | 0 .../common/minidump_cpu_riscv.h | 38 +- .../common/minidump_cpu_sparc.h | 0 .../google_breakpad/common/minidump_cpu_x86.h | 0 .../common/minidump_exception_fuchsia.h | 0 .../common/minidump_exception_linux.h | 5 + .../common/minidump_exception_mac.h | 4 + .../common/minidump_exception_ps3.h | 0 .../common/minidump_exception_solaris.h | 0 .../common/minidump_exception_win32.h | 0 .../google_breakpad/common/minidump_format.h | 17 +- .../google_breakpad/common/minidump_size.h | 0 .../processor/basic_source_line_resolver.h | 0 .../google_breakpad/processor/call_stack.h | 0 .../google_breakpad/processor/code_module.h | 0 .../google_breakpad/processor/code_modules.h | 0 .../google_breakpad/processor/dump_context.h | 0 .../google_breakpad/processor/dump_object.h | 0 .../processor/exception_record.h | 0 .../processor/exploitability.h | 0 .../processor/fast_source_line_resolver.h | 0 .../google_breakpad/processor/memory_region.h | 0 .../src/google_breakpad/processor/microdump.h | 0 .../processor/microdump_processor.h | 0 .../src/google_breakpad/processor/minidump.h | 207 +- .../processor/minidump_processor.h | 20 +- .../processor/proc_maps_linux.h | 0 .../processor/process_result.h | 0 .../google_breakpad/processor/process_state.h | 0 .../processor/source_line_resolver_base.h | 0 .../source_line_resolver_interface.h | 0 .../google_breakpad/processor/stack_frame.h | 0 .../processor/stack_frame_cpu.h | 0 .../processor/stack_frame_symbolizer.h | 0 .../google_breakpad/processor/stackwalker.h | 0 .../processor/symbol_supplier.h | 0 .../google_breakpad/processor/system_info.h | 0 .../breakpad/src/third_party/curl/COPYING | 0 .../breakpad/src/third_party/curl/curl.h | 0 .../breakpad/src/third_party/curl/curlbuild.h | 0 .../breakpad/src/third_party/curl/curlrules.h | 0 .../breakpad/src/third_party/curl/curlver.h | 0 .../breakpad/src/third_party/curl/easy.h | 0 .../breakpad/src/third_party/curl/mprintf.h | 0 .../breakpad/src/third_party/curl/multi.h | 0 .../src/third_party/curl/stdcheaders.h | 0 .../src/third_party/curl/typecheck-gcc.h | 0 .../breakpad/src/third_party/curl/types.h | 0 .../src/third_party/libdisasm/LICENSE | 0 .../src/third_party/libdisasm/Makefile.am | 0 .../src/third_party/libdisasm/README.breakpad | 0 .../breakpad/src/third_party/libdisasm/TODO | 0 .../src/third_party/libdisasm/ia32_implicit.c | 0 .../src/third_party/libdisasm/ia32_implicit.h | 0 .../src/third_party/libdisasm/ia32_insn.c | 0 .../src/third_party/libdisasm/ia32_insn.h | 0 .../third_party/libdisasm/ia32_invariant.c | 0 .../third_party/libdisasm/ia32_invariant.h | 0 .../src/third_party/libdisasm/ia32_modrm.c | 0 .../src/third_party/libdisasm/ia32_modrm.h | 0 .../libdisasm/ia32_opcode_tables.c | 0 .../libdisasm/ia32_opcode_tables.h | 0 .../src/third_party/libdisasm/ia32_operand.c | 0 .../src/third_party/libdisasm/ia32_operand.h | 0 .../src/third_party/libdisasm/ia32_reg.c | 0 .../src/third_party/libdisasm/ia32_reg.h | 0 .../src/third_party/libdisasm/ia32_settings.c | 0 .../src/third_party/libdisasm/ia32_settings.h | 0 .../src/third_party/libdisasm/libdis.h | 0 .../src/third_party/libdisasm/qword.h | 0 .../src/third_party/libdisasm/swig/Makefile | 0 .../src/third_party/libdisasm/swig/README | 0 .../third_party/libdisasm/swig/libdisasm.i | 0 .../libdisasm/swig/libdisasm_oop.i | 0 .../libdisasm/swig/perl/Makefile-swig | 0 .../libdisasm/swig/perl/Makefile.PL | 0 .../libdisasm/swig/python/Makefile-swig | 0 .../libdisasm/swig/ruby/Makefile-swig | 0 .../libdisasm/swig/ruby/extconf.rb | 0 .../libdisasm/swig/tcl/Makefile-swig | 0 .../src/third_party/libdisasm/x86_disasm.c | 0 .../src/third_party/libdisasm/x86_format.c | 2 +- .../src/third_party/libdisasm/x86_imm.c | 0 .../src/third_party/libdisasm/x86_imm.h | 0 .../src/third_party/libdisasm/x86_insn.c | 0 .../src/third_party/libdisasm/x86_misc.c | 0 .../third_party/libdisasm/x86_operand_list.c | 0 .../third_party/libdisasm/x86_operand_list.h | 0 .../linux/include/gflags/gflags_completions.h | 0 .../src/third_party/mac_headers/README | 25 + .../mac_headers/architecture/byte_order.h | 16 +- .../src/third_party/mac_headers/arm/_types.h | 16 + .../src/third_party/mac_headers/i386/_types.h | 22 +- .../src/third_party/mac_headers/mach-o/arch.h | 51 +- .../src/third_party/mac_headers/mach-o/fat.h | 25 +- .../third_party/mac_headers/mach-o/loader.h | 236 +- .../third_party/mac_headers/mach-o/nlist.h | 20 +- .../mac_headers/mach/arm/boolean.h | 74 + .../mac_headers/mach/arm/vm_types.h | 159 + .../third_party/mac_headers/mach/boolean.h | 42 +- .../mac_headers/mach/i386/boolean.h | 32 +- .../mac_headers/mach/i386/vm_types.h | 83 +- .../third_party/mac_headers/mach/machine.h | 461 + .../mac_headers/mach/machine/boolean.h | 12 +- .../mac_headers/mach/machine/thread_state.h | 2 +- .../mac_headers/mach/machine/thread_status.h | 1 + .../mac_headers/mach/machine/vm_types.h | 12 +- .../mac_headers/mach/thread_status.h | 42 +- .../third_party/mac_headers/mach/vm_prot.h | 109 +- .../breakpad/src/third_party/musl/COPYRIGHT | 0 .../breakpad/src/third_party/musl/README | 0 .../src/third_party/musl/README.breakpad | 0 .../breakpad/src/third_party/musl/VERSION | 0 .../src/third_party/musl/include/elf.h | 0 .../{ => src}/external/crashpad/.clang-format | 0 .../external/crashpad/.gitattributes | 0 .../src/external/crashpad/.github/CODEOWNERS | 1 + .../crashpad/.github/workflows/build.yml | 14 +- .../{ => src}/external/crashpad/.gitignore | 0 .../{ => src}/external/crashpad/.gitmodules | 0 shared/sentry/{ => src}/external/crashpad/.gn | 0 .../{ => src}/external/crashpad/.style.yapf | 0 .../{ => src}/external/crashpad/.vpython3 | 0 .../{ => src}/external/crashpad/AUTHORS | 1 + .../{ => src}/external/crashpad/BUILD.gn | 7 +- .../external/crashpad/CMakeLists.txt | 27 +- .../{ => src}/external/crashpad/CONTRIBUTORS | 0 .../sentry/{ => src}/external/crashpad/DEPS | 88 +- .../{ => src}/external/crashpad/LICENSE | 0 .../external/crashpad/README.getsentry.md | 0 .../{ => src}/external/crashpad/README.md | 0 .../external/crashpad/client/BUILD.gn | 29 +- .../external/crashpad/client/CMakeLists.txt | 2 + .../external/crashpad/client/annotation.cc | 0 .../external/crashpad/client/annotation.h | 97 +- .../crashpad/client/annotation_list.cc | 34 +- .../crashpad/client/annotation_list.h | 26 + .../crashpad/client/annotation_list_test.cc | 94 + .../crashpad/client/annotation_test.cc | 238 + .../crashpad/client/client_argv_handling.cc | 5 + .../crashpad/client/client_argv_handling.h | 1 + .../crashpad/client/crash_report_database.cc | 0 .../crashpad/client/crash_report_database.h | 0 .../client/crash_report_database_generic.cc | 11 + .../client/crash_report_database_mac.mm | 12 +- .../client/crash_report_database_test.cc | 0 .../client/crash_report_database_win.cc | 14 +- .../crashpad/client/crashpad_client.h | 50 +- .../client/crashpad_client_fuchsia.cc | 1 + .../crashpad/client/crashpad_client_ios.cc | 6 +- .../client/crashpad_client_ios_test.mm | 0 .../crashpad/client/crashpad_client_linux.cc | 40 +- .../client/crashpad_client_linux_test.cc | 112 +- .../crashpad/client/crashpad_client_mac.cc | 62 +- .../crashpad/client/crashpad_client_win.cc | 94 +- .../client/crashpad_client_win_test.cc | 0 .../external/crashpad/client/crashpad_info.cc | 0 .../external/crashpad/client/crashpad_info.h | 0 .../crashpad/client/crashpad_info_note.S | 0 .../client/ios_handler/exception_processor.h | 0 .../client/ios_handler/exception_processor.mm | 61 +- .../ios_handler/exception_processor_test.mm | 0 .../client/ios_handler/in_process_handler.cc | 3 +- .../client/ios_handler/in_process_handler.h | 0 .../ios_handler/in_process_handler_test.cc | 0 .../in_process_intermediate_dump_handler.cc | 49 + .../in_process_intermediate_dump_handler.h | 0 ..._process_intermediate_dump_handler_test.cc | 0 ...rmediate_dumps_and_crash_reports_thread.cc | 0 ...ermediate_dumps_and_crash_reports_thread.h | 0 .../client/length_delimited_ring_buffer.h | 603 ++ .../length_delimited_ring_buffer_test.cc | 348 + .../crashpad/client/prune_crash_reports.cc | 0 .../crashpad/client/prune_crash_reports.h | 0 .../client/prune_crash_reports_test.cc | 0 .../crashpad/client/pthread_create_linux.cc | 1 + .../crashpad/client/ring_buffer_annotation.h | 136 + .../ring_buffer_annotation_load_test_main.cc | 476 + .../client/ring_buffer_annotation_test.cc | 188 + .../external/crashpad/client/settings.cc | 91 +- .../external/crashpad/client/settings.h | 38 +- .../external/crashpad/client/settings_test.cc | 0 .../client/simple_address_range_bag.h | 0 .../client/simple_address_range_bag_test.cc | 0 .../client/simple_string_dictionary.h | 0 .../client/simple_string_dictionary_test.cc | 0 .../external/crashpad/client/simulate_crash.h | 0 .../crashpad/client/simulate_crash_ios.h | 0 .../crashpad/client/simulate_crash_linux.h | 0 .../crashpad/client/simulate_crash_mac.cc | 6 +- .../crashpad/client/simulate_crash_mac.h | 0 .../client/simulate_crash_mac_test.cc | 0 .../crashpad/client/simulate_crash_win.h | 0 .../crashpad/client/upload_behavior_ios.h | 0 .../crashpad/cmake/toolchains/win_arm64.cmake | 6 + .../external/crashpad/codereview.settings | 0 .../external/crashpad/compat/BUILD.gn | 6 +- .../external/crashpad/compat/CMakeLists.txt | 0 .../crashpad/compat/android/dlfcn_internal.cc | 0 .../crashpad/compat/android/dlfcn_internal.h | 0 .../external/crashpad/compat/android/elf.h | 0 .../crashpad/compat/android/linux/elf.h | 0 .../crashpad/compat/android/linux/prctl.h | 0 .../crashpad/compat/android/linux/ptrace.h | 0 .../external/crashpad/compat/android/sched.h | 0 .../crashpad/compat/android/sys/epoll.cc | 0 .../crashpad/compat/android/sys/epoll.h | 0 .../crashpad/compat/android/sys/mman.h | 0 .../crashpad/compat/android/sys/mman_mmap.cc | 0 .../crashpad/compat/android/sys/syscall.h | 0 .../crashpad/compat/android/sys/user.h | 0 .../crashpad/compat/ios/mach/exc.defs | 0 .../crashpad/compat/ios/mach/mach_exc.defs | 0 .../crashpad/compat/ios/mach/mach_types.defs | 0 .../ios/mach/machine/machine_types.defs | 0 .../crashpad/compat/ios/mach/std_types.defs | 0 .../external/crashpad/compat/linux/signal.h | 6 + .../external/crashpad/compat/linux/sys/mman.h | 0 .../compat/linux/sys/mman_memfd_create.cc | 0 .../crashpad/compat/linux/sys/ptrace.h | 0 .../external/crashpad/compat/linux/sys/user.h | 0 .../crashpad/compat/mac/Availability.h | 0 .../compat/mac/AvailabilityVersions.h | 0 .../crashpad/compat/mac/kern/exc_resource.h | 0 .../crashpad/compat/mac/mach-o/loader.h | 0 .../compat/mac/mach/i386/thread_state.h | 0 .../external/crashpad/compat/mac/mach/mach.h | 0 .../crashpad/compat/mac/sys/resource.h | 0 .../external/crashpad/compat/mingw/dbghelp.h | 31 + .../external/crashpad/compat/mingw/werapi.h | 28 + .../external/crashpad/compat/mingw/winnt.h | 12 + .../crashpad/compat/non_mac/mach-o/loader.h | 0 .../crashpad/compat/non_mac/mach/mach.h | 0 .../crashpad/compat/non_mac/mach/machine.h | 0 .../crashpad/compat/non_mac/mach/vm_prot.h | 0 .../crashpad/compat/non_win/dbghelp.h | 0 .../crashpad/compat/non_win/minwinbase.h | 0 .../crashpad/compat/non_win/timezoneapi.h | 0 .../crashpad/compat/non_win/verrsrc.h | 0 .../crashpad/compat/non_win/windows.h | 0 .../external/crashpad/compat/non_win/winnt.h | 0 .../external/crashpad/compat/win/getopt.h | 0 .../external/crashpad/compat/win/strings.cc | 0 .../external/crashpad/compat/win/strings.h | 0 .../external/crashpad/compat/win/sys/time.h | 0 .../external/crashpad/compat/win/sys/types.h | 0 .../external/crashpad/compat/win/time.cc | 0 .../external/crashpad/compat/win/time.h | 0 .../external/crashpad/compat/win/winbase.h | 0 .../external/crashpad/compat/win/winnt.h | 0 .../external/crashpad/compat/win/winternl.h | 0 .../crashpad/crashpad-config.cmake.in | 0 .../external/crashpad/doc/.gitignore | 0 .../external/crashpad/doc/appengine/README | 0 .../doc/appengine/src/crashpad-home/app.yaml | 0 .../doc/appengine/src/crashpad-home/main.go | 2 +- .../external/crashpad/doc/developing.md | 0 .../external/crashpad/doc/favicon.ico | Bin .../crashpad/doc/ios_overview_design.md | 0 .../src/external/crashpad/doc/layering.png | Bin 0 -> 23460 bytes .../{ => src}/external/crashpad/doc/man.md | 2 +- .../src/external/crashpad/doc/overview.png | Bin 0 -> 26517 bytes .../external/crashpad/doc/overview_design.md | 0 .../{ => src}/external/crashpad/doc/status.md | 0 .../external/crashpad/doc/support/compat.sh | 0 .../crashpad/doc/support/crashpad.doxy | 0 .../crashpad/doc/support/crashpad.doxy.h | 0 .../crashpad/doc/support/crashpad_doxygen.css | 0 .../external/crashpad/doc/support/generate.sh | 0 .../crashpad/doc/support/generate_doxygen.py | 0 .../crashpad/doc/support/generate_git.sh | 0 .../{ => src}/external/crashpad/example.cpp | 0 .../external/crashpad/handler/BUILD.gn | 18 +- .../external/crashpad/handler/CMakeLists.txt | 2 + .../handler/crash_report_upload_thread.cc | 10 +- .../handler/crash_report_upload_thread.h | 4 +- .../crashpad/handler/crashpad_handler.md | 4 +- .../crashpad/handler/crashpad_handler_main.cc | 0 .../crashpad/handler/crashpad_handler_test.cc | 0 .../crashpad_handler_test_extended_handler.cc | 0 .../external/crashpad/handler/handler_main.cc | 13 +- .../external/crashpad/handler/handler_main.h | 0 .../handler/linux/capture_snapshot.cc | 0 .../crashpad/handler/linux/capture_snapshot.h | 0 .../linux/crash_report_exception_handler.cc | 0 .../linux/crash_report_exception_handler.h | 0 .../cros_crash_report_exception_handler.cc | 27 + .../cros_crash_report_exception_handler.h | 0 .../handler/linux/exception_handler_server.cc | 1 + .../handler/linux/exception_handler_server.h | 0 .../linux/exception_handler_server_test.cc | 5 +- .../handler/linux/handler_trampoline.cc | 0 .../mac/crash_report_exception_handler.cc | 8 +- .../mac/crash_report_exception_handler.h | 0 .../handler/mac/exception_handler_server.cc | 9 +- .../handler/mac/exception_handler_server.h | 8 +- .../handler/mac/file_limit_annotation.cc | 0 .../handler/mac/file_limit_annotation.h | 0 .../external/crashpad/handler/main.cc | 0 .../handler/minidump_to_upload_parameters.cc | 0 .../handler/minidump_to_upload_parameters.h | 0 .../minidump_to_upload_parameters_test.cc | 0 .../handler/prune_crash_reports_thread.cc | 0 .../handler/prune_crash_reports_thread.h | 0 .../handler/user_stream_data_source.cc | 0 .../handler/user_stream_data_source.h | 0 .../crashpad/handler/win/.gitattributes | 0 .../handler/win/crash_other_program.cc | 0 .../win/crash_report_exception_handler.cc | 4 +- .../win/crash_report_exception_handler.h | 0 .../crashpad/handler/win/crashy_signal.cc | 0 .../handler/win/crashy_test_program.cc | 1 + .../handler/win/crashy_test_z7_loader.cc | 0 .../fake_handler_that_crashes_at_startup.cc | 0 .../handler/win/fastfail_test_program.cc | 5 + .../crashpad/handler/win/hanging_program.cc | 1 + .../handler/win/heap_corrupting_program.cc | 96 + .../crashpad/handler/win/loader_lock_dll.cc | 0 .../win/self_destroying_test_program.cc | 0 .../crashpad/handler/win/wer/BUILD.gn | 0 .../crashpad/handler/win/wer/crashpad_wer.cc | 3 +- .../crashpad/handler/win/wer/crashpad_wer.def | 0 .../crashpad/handler/win/wer/crashpad_wer.h | 0 .../crashpad/handler/win/wer/crashpad_wer.ver | 0 .../handler/win/wer/crashpad_wer_main.cc | 0 .../win/wer/crashpad_wer_module_unittest.cc | 0 .../external/crashpad/handler/win/z7_test.cpp | 0 .../external/crashpad/handler/win/z7_test.dll | Bin .../crashpad/infra/config/PRESUBMIT.py | 0 .../infra/config/generated/commit-queue.cfg | 0 .../infra/config/generated/cr-buildbucket.cfg | 0 .../infra/config/generated/luci-logdog.cfg | 0 .../infra/config/generated/luci-milo.cfg | 0 .../infra/config/generated/luci-scheduler.cfg | 0 .../infra/config/generated/project.cfg | 0 .../infra/config/generated/realms.cfg | 0 .../external/crashpad/infra/config/main.star | 0 .../external/crashpad/libunwind/.clang-format | 0 .../crashpad/libunwind/CMakeLists.txt | 0 .../external/crashpad/libunwind/LICENSE.TXT | 0 .../cmake/Modules/HandleCompilerRT.cmake | 0 .../cmake/Modules/HandleLibunwindFlags.cmake | 0 .../crashpad/libunwind/cmake/config-ix.cmake | 0 .../libunwind/docs/BuildingLibunwind.rst | 0 .../crashpad/libunwind/docs/CMakeLists.txt | 0 .../crashpad/libunwind/docs/README.txt | 0 .../external/crashpad/libunwind/docs/conf.py | 0 .../crashpad/libunwind/docs/index.rst | 0 .../libunwind/include/__libunwind_config.h | 0 .../crashpad/libunwind/include/libunwind.h | 0 .../include/mach-o/compact_unwind_encoding.h | 0 .../crashpad/libunwind/include/unwind.h | 0 .../libunwind/include/unwind_arm_ehabi.h | 0 .../libunwind/include/unwind_itanium.h | 0 .../crashpad/libunwind/src/AddressSpace.hpp | 0 .../crashpad/libunwind/src/CMakeLists.txt | 0 .../libunwind/src/CompactUnwinder.hpp | 0 .../libunwind/src/DwarfInstructions.hpp | 0 .../crashpad/libunwind/src/DwarfParser.hpp | 0 .../crashpad/libunwind/src/EHHeaderParser.hpp | 0 .../libunwind/src/FrameHeaderCache.hpp | 0 .../crashpad/libunwind/src/RWMutex.hpp | 0 .../crashpad/libunwind/src/Registers.hpp | 0 .../crashpad/libunwind/src/Unwind-EHABI.cpp | 0 .../crashpad/libunwind/src/Unwind-EHABI.h | 0 .../crashpad/libunwind/src/Unwind-seh.cpp | 0 .../crashpad/libunwind/src/Unwind-sjlj.c | 0 .../crashpad/libunwind/src/UnwindCursor.hpp | 0 .../libunwind/src/UnwindLevel1-gcc-ext.c | 0 .../crashpad/libunwind/src/UnwindLevel1.c | 0 .../libunwind/src/UnwindRegistersRestore.S | 0 .../libunwind/src/UnwindRegistersSave.S | 0 .../libunwind/src/Unwind_AppleExtras.cpp | 0 .../crashpad/libunwind/src/assembly.h | 0 .../crashpad/libunwind/src/cet_unwind.h | 0 .../external/crashpad/libunwind/src/config.h | 0 .../external/crashpad/libunwind/src/dwarf2.h | 0 .../crashpad/libunwind/src/libunwind.cpp | 0 .../crashpad/libunwind/src/libunwind_ext.h | 0 .../crashpad/libunwind/test/CMakeLists.txt | 0 .../libunwind/test/alignment.compile.pass.cpp | 0 .../libunwind/test/floatregister.pass.cpp | 0 .../libunwind/test/forceunwind.pass.cpp | 0 .../test/frameheadercache_test.pass.cpp | 0 .../libunwind/test/libunwind/__init__.py | 0 .../libunwind/test/libunwind/test/__init__.py | 0 .../libunwind/test/libunwind/test/config.py | 0 .../libunwind/test/libunwind_01.pass.cpp | 0 .../libunwind/test/libunwind_02.pass.cpp | 0 .../crashpad/libunwind/test/lit.cfg.py | 0 .../crashpad/libunwind/test/lit.site.cfg.in | 0 .../test/remember_state_leak.pass.sh.s | 0 .../libunwind/test/signal_frame.pass.cpp | 0 .../libunwind/test/signal_unwind.pass.cpp | 0 .../libunwind/test/unw_getcontext.pass.cpp | 0 .../test/unwind_leaffunction.pass.cpp | 0 .../external/crashpad/minidump/BUILD.gn | 0 .../external/crashpad/minidump/CMakeLists.txt | 0 .../minidump/minidump_annotation_writer.cc | 1 + .../minidump/minidump_annotation_writer.h | 0 .../minidump_annotation_writer_test.cc | 0 .../minidump/minidump_byte_array_writer.cc | 1 + .../minidump/minidump_byte_array_writer.h | 0 .../minidump_byte_array_writer_test.cc | 0 .../crashpad/minidump/minidump_context.h | 50 + .../minidump/minidump_context_writer.cc | 75 + .../minidump/minidump_context_writer.h | 44 + .../minidump/minidump_context_writer_test.cc | 60 + .../minidump/minidump_crashpad_info_writer.cc | 10 + .../minidump/minidump_crashpad_info_writer.h | 3 + .../minidump_crashpad_info_writer_test.cc | 71 + .../minidump/minidump_exception_writer.cc | 0 .../minidump/minidump_exception_writer.h | 0 .../minidump_exception_writer_test.cc | 0 .../crashpad/minidump/minidump_extensions.cc | 0 .../crashpad/minidump/minidump_extensions.h | 30 +- .../crashpad/minidump/minidump_file_writer.cc | 1 + .../crashpad/minidump/minidump_file_writer.h | 0 .../minidump/minidump_file_writer_test.cc | 0 .../minidump/minidump_handle_writer.cc | 1 + .../minidump/minidump_handle_writer.h | 0 .../minidump/minidump_handle_writer_test.cc | 0 .../minidump/minidump_memory_info_writer.cc | 0 .../minidump/minidump_memory_info_writer.h | 0 .../minidump_memory_info_writer_test.cc | 0 .../minidump/minidump_memory_writer.cc | 1 + .../minidump/minidump_memory_writer.h | 0 .../minidump/minidump_memory_writer_test.cc | 0 .../minidump/minidump_misc_info_writer.cc | 2 + .../minidump/minidump_misc_info_writer.h | 2 +- .../minidump_misc_info_writer_test.cc | 7 +- .../minidump_module_crashpad_info_writer.cc | 1 + .../minidump_module_crashpad_info_writer.h | 0 ...nidump_module_crashpad_info_writer_test.cc | 0 .../minidump/minidump_module_writer.cc | 1 + .../minidump/minidump_module_writer.h | 0 .../minidump/minidump_module_writer_test.cc | 0 .../minidump/minidump_rva_list_writer.cc | 1 + .../minidump/minidump_rva_list_writer.h | 0 .../minidump/minidump_rva_list_writer_test.cc | 0 ...inidump_simple_string_dictionary_writer.cc | 1 + ...minidump_simple_string_dictionary_writer.h | 0 ...mp_simple_string_dictionary_writer_test.cc | 0 .../minidump/minidump_stacktrace_writer.cc | 1 + .../minidump/minidump_stacktrace_writer.h | 0 .../minidump/minidump_stream_writer.cc | 0 .../minidump/minidump_stream_writer.h | 0 .../minidump/minidump_string_writer.cc | 1 + .../minidump/minidump_string_writer.h | 0 .../minidump/minidump_string_writer_test.cc | 0 .../minidump/minidump_system_info_writer.cc | 3 + .../minidump/minidump_system_info_writer.h | 0 .../minidump_system_info_writer_test.cc | 0 .../minidump/minidump_thread_id_map.cc | 0 .../minidump/minidump_thread_id_map.h | 0 .../minidump/minidump_thread_id_map_test.cc | 0 .../minidump_thread_name_list_writer.cc | 1 + .../minidump_thread_name_list_writer.h | 0 .../minidump_thread_name_list_writer_test.cc | 0 .../minidump/minidump_thread_writer.cc | 1 + .../minidump/minidump_thread_writer.h | 0 .../minidump/minidump_thread_writer_test.cc | 0 .../minidump_unloaded_module_writer.cc | 1 + .../minidump_unloaded_module_writer.h | 0 .../minidump_unloaded_module_writer_test.cc | 0 ...idump_user_extension_stream_data_source.cc | 0 ...nidump_user_extension_stream_data_source.h | 0 .../minidump/minidump_user_stream_writer.cc | 0 .../minidump/minidump_user_stream_writer.h | 0 .../minidump_user_stream_writer_test.cc | 0 .../crashpad/minidump/minidump_writable.cc | 1 + .../crashpad/minidump/minidump_writable.h | 0 .../minidump/minidump_writable_test.cc | 0 .../crashpad/minidump/minidump_writer_util.cc | 0 .../crashpad/minidump/minidump_writer_util.h | 0 .../minidump_byte_array_writer_test_util.cc | 0 .../minidump_byte_array_writer_test_util.h | 0 .../test/minidump_context_test_util.cc | 44 + .../test/minidump_context_test_util.h | 5 + .../test/minidump_file_writer_test_util.cc | 0 .../test/minidump_file_writer_test_util.h | 0 .../test/minidump_memory_writer_test_util.cc | 0 .../test/minidump_memory_writer_test_util.h | 0 .../test/minidump_rva_list_test_util.cc | 0 .../test/minidump_rva_list_test_util.h | 0 .../test/minidump_string_writer_test_util.cc | 0 .../test/minidump_string_writer_test_util.h | 0 .../minidump_user_extension_stream_util.cc | 0 .../minidump_user_extension_stream_util.h | 0 .../test/minidump_writable_test_util.cc | 0 .../test/minidump_writable_test_util.h | 0 .../{ => src}/external/crashpad/navbar.md | 0 .../{ => src}/external/crashpad/package.h | 0 .../external/crashpad/snapshot/BUILD.gn | 22 +- .../external/crashpad/snapshot/CMakeLists.txt | 11 + .../crashpad/snapshot/annotation_snapshot.cc | 0 .../crashpad/snapshot/annotation_snapshot.h | 0 .../crashpad/snapshot/capture_memory.cc | 5 + .../crashpad/snapshot/capture_memory.h | 0 .../crashpad/snapshot/cpu_architecture.h | 5 +- .../external/crashpad/snapshot/cpu_context.cc | 6 + .../external/crashpad/snapshot/cpu_context.h | 10 + .../crashpad/snapshot/cpu_context_test.cc | 0 .../snapshot/crashpad_info_client_options.cc | 0 .../snapshot/crashpad_info_client_options.h | 0 .../crashpad_info_client_options_test.cc | 19 +- ...rashpad_info_client_options_test_module.cc | 0 .../crashpad_info_size_test_module.cc | 0 .../snapshot/crashpad_info_size_test_note.S | 0 .../crashpad_types/crashpad_info_reader.cc | 0 .../crashpad_types/crashpad_info_reader.h | 0 .../crashpad_info_reader_test.cc | 0 .../crashpad_types/image_annotation_reader.cc | 6 + .../crashpad_types/image_annotation_reader.h | 0 .../image_annotation_reader_test.cc | 0 .../snapshot/elf/elf_dynamic_array_reader.cc | 0 .../snapshot/elf/elf_dynamic_array_reader.h | 0 .../crashpad/snapshot/elf/elf_image_reader.cc | 8 +- .../crashpad/snapshot/elf/elf_image_reader.h | 0 .../snapshot/elf/elf_image_reader_fuzzer.cc | 0 .../.gitattributes | 0 ...shpad_snapshot_test_both_dt_hash_styles.so | Bin .../elf/elf_image_reader_fuzzer_corpus/ret42 | Bin .../snapshot/elf/elf_image_reader_test.cc | 0 .../snapshot/elf/elf_image_reader_test_note.S | 0 .../snapshot/elf/elf_symbol_table_reader.cc | 0 .../snapshot/elf/elf_symbol_table_reader.h | 0 .../snapshot/elf/module_snapshot_elf.cc | 0 .../snapshot/elf/module_snapshot_elf.h | 0 .../snapshot/elf/test_exported_symbols.sym | 0 .../crashpad/snapshot/exception_snapshot.h | 0 .../snapshot/fuchsia/cpu_context_fuchsia.cc | 62 +- .../snapshot/fuchsia/cpu_context_fuchsia.h | 20 +- .../fuchsia/exception_snapshot_fuchsia.cc | 17 +- .../fuchsia/exception_snapshot_fuchsia.h | 2 + .../snapshot/fuchsia/memory_map_fuchsia.cc | 0 .../snapshot/fuchsia/memory_map_fuchsia.h | 0 .../memory_map_region_snapshot_fuchsia.cc | 0 .../memory_map_region_snapshot_fuchsia.h | 0 .../fuchsia/process_reader_fuchsia.cc | 19 +- .../snapshot/fuchsia/process_reader_fuchsia.h | 4 + .../fuchsia/process_reader_fuchsia_test.cc | 0 .../fuchsia/process_snapshot_fuchsia.cc | 0 .../fuchsia/process_snapshot_fuchsia.h | 0 .../fuchsia/process_snapshot_fuchsia_test.cc | 2 +- .../fuchsia/system_snapshot_fuchsia.cc | 10 +- .../fuchsia/system_snapshot_fuchsia.h | 2 + .../fuchsia/thread_snapshot_fuchsia.cc | 11 +- .../fuchsia/thread_snapshot_fuchsia.h | 2 + .../crashpad/snapshot/handle_snapshot.cc | 0 .../crashpad/snapshot/handle_snapshot.h | 0 .../crashpad/snapshot/hash_types_test.cc | 0 ...xception_snapshot_ios_intermediate_dump.cc | 12 +- ...exception_snapshot_ios_intermediate_dump.h | 0 .../ios/intermediate_dump_reader_util.cc | 0 .../ios/intermediate_dump_reader_util.h | 0 .../memory_snapshot_ios_intermediate_dump.cc | 2 + .../memory_snapshot_ios_intermediate_dump.h | 0 ...ory_snapshot_ios_intermediate_dump_test.cc | 0 .../module_snapshot_ios_intermediate_dump.cc | 7 +- .../module_snapshot_ios_intermediate_dump.h | 0 .../process_snapshot_ios_intermediate_dump.cc | 0 .../process_snapshot_ios_intermediate_dump.h | 0 ...ess_snapshot_ios_intermediate_dump_test.cc | 8 +- .../system_snapshot_ios_intermediate_dump.cc | 10 +- .../system_snapshot_ios_intermediate_dump.h | 2 + ...h-1fa088dda0adb41459d063078a0f384a0bb8eefa | Bin .../ios/testdata/crash-5726011582644224 | Bin .../ios/testdata/crash-6605504629637120 | Bin .../ios/testdata/crash-c44acfcbccd8c7a8 | Bin 0 -> 972 bytes .../thread_snapshot_ios_intermediate_dump.cc | 2 +- .../thread_snapshot_ios_intermediate_dump.h | 0 .../linux/capture_memory_delegate_linux.cc | 0 .../linux/capture_memory_delegate_linux.h | 0 .../snapshot/linux/cpu_context_linux.cc | 15 + .../snapshot/linux/cpu_context_linux.h | 14 + .../snapshot/linux/debug_rendezvous.cc | 0 .../snapshot/linux/debug_rendezvous.h | 0 .../snapshot/linux/debug_rendezvous_test.cc | 0 .../linux/exception_snapshot_linux.cc | 44 + .../snapshot/linux/exception_snapshot_linux.h | 2 + .../linux/exception_snapshot_linux_test.cc | 28 + .../snapshot/linux/process_reader_linux.cc | 2 + .../snapshot/linux/process_reader_linux.h | 0 .../linux/process_reader_linux_test.cc | 0 .../snapshot/linux/process_snapshot_linux.cc | 0 .../snapshot/linux/process_snapshot_linux.h | 0 .../crashpad/snapshot/linux/signal_context.h | 34 + .../snapshot/linux/system_snapshot_linux.cc | 26 +- .../snapshot/linux/system_snapshot_linux.h | 1 + .../linux/system_snapshot_linux_test.cc | 0 .../crashpad/snapshot/linux/test_modules.cc | 7 + .../crashpad/snapshot/linux/test_modules.h | 0 .../snapshot/linux/thread_snapshot_linux.cc | 6 + .../snapshot/linux/thread_snapshot_linux.h | 2 + .../crashpad/snapshot/mac/cpu_context_mac.cc | 0 .../crashpad/snapshot/mac/cpu_context_mac.h | 0 .../snapshot/mac/cpu_context_mac_test.cc | 0 .../snapshot/mac/exception_snapshot_mac.cc | 0 .../snapshot/mac/exception_snapshot_mac.h | 0 .../mac/mach_o_image_annotations_reader.cc | 7 + .../mac/mach_o_image_annotations_reader.h | 0 .../mach_o_image_annotations_reader_test.cc | 0 ...s_reader_test_module_crashy_initializer.cc | 0 ...h_o_image_annotations_reader_test_no_op.cc | 0 .../snapshot/mac/mach_o_image_reader.cc | 1 + .../snapshot/mac/mach_o_image_reader.h | 0 .../snapshot/mac/mach_o_image_reader_test.cc | 0 .../mac/mach_o_image_segment_reader.cc | 36 +- .../mac/mach_o_image_segment_reader.h | 9 +- .../mac/mach_o_image_segment_reader_test.cc | 0 .../mac/mach_o_image_symbol_table_reader.cc | 0 .../mac/mach_o_image_symbol_table_reader.h | 0 .../snapshot/mac/module_snapshot_mac.cc | 0 .../snapshot/mac/module_snapshot_mac.h | 0 .../snapshot/mac/process_reader_mac.cc | 42 +- .../snapshot/mac/process_reader_mac.h | 0 .../snapshot/mac/process_reader_mac_test.cc | 190 +- .../snapshot/mac/process_snapshot_mac.cc | 0 .../snapshot/mac/process_snapshot_mac.h | 0 .../crashpad/snapshot/mac/process_types.cc | 0 .../crashpad/snapshot/mac/process_types.h | 0 .../snapshot/mac/process_types/all.proctype | 0 .../mac/process_types/annotation.proctype | 0 .../mac/process_types/crashpad_info.proctype | 0 .../crashreporterclient.proctype | 0 .../snapshot/mac/process_types/custom.cc | 0 .../mac/process_types/dyld_images.proctype | 0 .../snapshot/mac/process_types/flavors.h | 0 .../snapshot/mac/process_types/internal.h | 0 .../mac/process_types/loader.proctype | 0 .../snapshot/mac/process_types/nlist.proctype | 0 .../snapshot/mac/process_types/traits.h | 0 .../snapshot/mac/process_types_test.cc | 0 .../snapshot/mac/system_snapshot_mac.cc | 18 +- .../snapshot/mac/system_snapshot_mac.h | 2 +- .../snapshot/mac/system_snapshot_mac_test.cc | 0 .../snapshot/mac/thread_snapshot_mac.cc | 0 .../snapshot/mac/thread_snapshot_mac.h | 0 .../snapshot/memory_map_region_snapshot.h | 0 .../crashpad/snapshot/memory_snapshot.cc | 0 .../crashpad/snapshot/memory_snapshot.h | 0 .../snapshot/memory_snapshot_generic.h | 0 .../crashpad/snapshot/memory_snapshot_test.cc | 0 .../minidump/exception_snapshot_minidump.cc | 0 .../minidump/exception_snapshot_minidump.h | 0 .../minidump/memory_snapshot_minidump.cc | 0 .../minidump/memory_snapshot_minidump.h | 0 .../minidump/minidump_annotation_reader.cc | 0 .../minidump/minidump_annotation_reader.h | 0 .../minidump/minidump_context_converter.cc | 27 + .../minidump/minidump_context_converter.h | 0 ...inidump_simple_string_dictionary_reader.cc | 0 ...minidump_simple_string_dictionary_reader.h | 0 .../snapshot/minidump/minidump_stream.h | 0 .../minidump/minidump_string_list_reader.cc | 0 .../minidump/minidump_string_list_reader.h | 0 .../minidump/minidump_string_reader.cc | 0 .../minidump/minidump_string_reader.h | 0 .../minidump/module_snapshot_minidump.cc | 1 + .../minidump/module_snapshot_minidump.h | 0 .../minidump/process_snapshot_minidump.cc | 34 +- .../minidump/process_snapshot_minidump.h | 0 .../process_snapshot_minidump_test.cc | 46 +- .../minidump/system_snapshot_minidump.cc | 8 + .../minidump/system_snapshot_minidump.h | 1 + .../minidump/thread_snapshot_minidump.cc | 3 +- .../minidump/thread_snapshot_minidump.h | 0 .../crashpad/snapshot/module_snapshot.h | 0 .../crashpad/snapshot/posix/timezone.cc | 0 .../crashpad/snapshot/posix/timezone.h | 0 .../crashpad/snapshot/posix/timezone_test.cc | 0 .../crashpad/snapshot/process_snapshot.h | 0 .../sanitized/memory_snapshot_sanitized.cc | 7 +- .../sanitized/memory_snapshot_sanitized.h | 0 .../sanitized/module_snapshot_sanitized.cc | 4 +- .../sanitized/module_snapshot_sanitized.h | 0 .../sanitized/process_snapshot_sanitized.cc | 4 +- .../sanitized/process_snapshot_sanitized.h | 1 + .../process_snapshot_sanitized_test.cc | 12 + .../sanitized/sanitization_information.cc | 0 .../sanitized/sanitization_information.h | 0 .../sanitization_information_test.cc | 0 .../sanitized/thread_snapshot_sanitized.cc | 0 .../sanitized/thread_snapshot_sanitized.h | 0 .../crashpad/snapshot/snapshot_constants.h | 0 .../crashpad/snapshot/system_snapshot.h | 14 + .../snapshot/test/test_cpu_context.cc | 22 + .../crashpad/snapshot/test/test_cpu_context.h | 1 + .../snapshot/test/test_exception_snapshot.cc | 0 .../snapshot/test/test_exception_snapshot.h | 0 .../test/test_memory_map_region_snapshot.cc | 0 .../test/test_memory_map_region_snapshot.h | 0 .../snapshot/test/test_memory_snapshot.cc | 0 .../snapshot/test/test_memory_snapshot.h | 0 .../snapshot/test/test_module_snapshot.cc | 0 .../snapshot/test/test_module_snapshot.h | 0 .../snapshot/test/test_process_snapshot.cc | 0 .../snapshot/test/test_process_snapshot.h | 0 .../snapshot/test/test_system_snapshot.cc | 8 +- .../snapshot/test/test_system_snapshot.h | 4 + .../snapshot/test/test_thread_snapshot.cc | 0 .../snapshot/test/test_thread_snapshot.h | 0 .../crashpad/snapshot/thread_snapshot.h | 0 .../snapshot/unloaded_module_snapshot.cc | 0 .../snapshot/unloaded_module_snapshot.h | 0 .../win/capture_memory_delegate_win.cc | 0 .../win/capture_memory_delegate_win.h | 0 .../crashpad/snapshot/win/cpu_context_win.cc | 0 .../crashpad/snapshot/win/cpu_context_win.h | 0 .../snapshot/win/cpu_context_win_test.cc | 0 .../win/crashpad_snapshot_test_annotations.cc | 0 .../crashpad_snapshot_test_crashing_child.cc | 0 ...pad_snapshot_test_dump_without_crashing.cc | 0 ...shpad_snapshot_test_extra_memory_ranges.cc | 0 .../crashpad_snapshot_test_image_reader.cc | 0 ...shpad_snapshot_test_image_reader_module.cc | 0 .../crashpad/snapshot/win/end_to_end_test.py | 22 +- .../snapshot/win/exception_snapshot_win.cc | 8 +- .../snapshot/win/exception_snapshot_win.h | 0 .../win/exception_snapshot_win_test.cc | 45 + .../snapshot/win/extra_memory_ranges_test.cc | 0 .../win/memory_map_region_snapshot_win.cc | 0 .../win/memory_map_region_snapshot_win.h | 0 .../snapshot/win/module_snapshot_win.cc | 0 .../snapshot/win/module_snapshot_win.h | 0 .../snapshot/win/module_snapshot_win_test.cc | 0 .../win/pe_image_annotations_reader.cc | 0 .../win/pe_image_annotations_reader.h | 0 .../crashpad/snapshot/win/pe_image_reader.cc | 0 .../crashpad/snapshot/win/pe_image_reader.h | 0 .../snapshot/win/pe_image_reader_test.cc | 0 .../snapshot/win/pe_image_resource_reader.cc | 0 .../snapshot/win/pe_image_resource_reader.h | 0 .../snapshot/win/process_reader_win.cc | 32 +- .../snapshot/win/process_reader_win.h | 0 .../snapshot/win/process_reader_win_test.cc | 0 .../snapshot/win/process_snapshot_win.cc | 3 +- .../snapshot/win/process_snapshot_win.h | 0 .../snapshot/win/process_snapshot_win_test.cc | 4 +- .../snapshot/win/process_subrange_reader.cc | 0 .../snapshot/win/process_subrange_reader.h | 0 .../snapshot/win/system_snapshot_win.cc | 0 .../snapshot/win/system_snapshot_win.h | 1 + .../snapshot/win/system_snapshot_win_test.cc | 0 .../snapshot/win/thread_snapshot_win.cc | 0 .../snapshot/win/thread_snapshot_win.h | 0 .../crashpad/snapshot/x86/cpuid_reader.cc | 0 .../crashpad/snapshot/x86/cpuid_reader.h | 0 .../{ => src}/external/crashpad/test/BUILD.gn | 16 +- .../external/crashpad/test/errors.cc | 0 .../{ => src}/external/crashpad/test/errors.h | 0 .../{ => src}/external/crashpad/test/file.cc | 0 .../{ => src}/external/crashpad/test/file.h | 0 .../external/crashpad/test/filesystem.cc | 0 .../external/crashpad/test/filesystem.h | 0 .../crashpad/test/fuchsia_crashpad_tests.cml | 1 + .../external/crashpad/test/gtest_death.h | 0 .../external/crashpad/test/gtest_main.cc | 2 +- .../external/crashpad/test/hex_string.cc | 0 .../external/crashpad/test/hex_string.h | 0 .../external/crashpad/test/hex_string_test.cc | 0 .../external/crashpad/test/ios/BUILD.gn | 13 +- .../test/ios/cptest_google_test_runner.mm | 4 - .../ios/cptest_google_test_runner_delegate.h | 0 .../crashpad/test/ios/crash_type_xctest.mm | 59 +- .../crashpad/test/ios/google_test_setup.h | 0 .../crashpad/test/ios/google_test_setup.mm | 4 - .../external/crashpad/test/ios/host/BUILD.gn | 9 +- .../crashpad/test/ios/host/Info.plist | 2 +- .../ios/host/cptest_application_delegate.h | 0 .../ios/host/cptest_application_delegate.mm | 80 +- .../ios/host/cptest_crash_view_controller.h | 0 .../ios/host/cptest_crash_view_controller.mm | 4 - .../test/ios/host/cptest_shared_object.h | 6 + .../ios/host/handler_forbidden_allocators.cc | 112 +- .../ios/host/handler_forbidden_allocators.h | 0 .../external/crashpad/test/ios/host/main.mm | 4 - .../test/linux/fake_ptrace_connection.cc | 0 .../test/linux/fake_ptrace_connection.h | 0 .../external/crashpad/test/linux/get_tls.cc | 2 + .../external/crashpad/test/linux/get_tls.h | 0 .../external/crashpad/test/mac/dyld.cc | 0 .../external/crashpad/test/mac/dyld.h | 0 .../crashpad/test/mac/exception_swallower.cc | 8 +- .../crashpad/test/mac/exception_swallower.h | 0 .../external/crashpad/test/mac/mach_errors.cc | 0 .../external/crashpad/test/mac/mach_errors.h | 5 +- .../crashpad/test/mac/mach_multiprocess.cc | 8 +- .../crashpad/test/mac/mach_multiprocess.h | 0 .../test/mac/mach_multiprocess_test.cc | 0 .../external/crashpad/test/main_arguments.cc | 0 .../external/crashpad/test/main_arguments.h | 0 .../crashpad/test/main_arguments_test.cc | 0 .../external/crashpad/test/multiprocess.h | 0 .../crashpad/test/multiprocess_exec.cc | 0 .../crashpad/test/multiprocess_exec.h | 0 .../test/multiprocess_exec_fuchsia.cc | 0 .../crashpad/test/multiprocess_exec_posix.cc | 0 .../crashpad/test/multiprocess_exec_test.cc | 0 .../test/multiprocess_exec_test_child.cc | 0 .../crashpad/test/multiprocess_exec_win.cc | 0 .../crashpad/test/multiprocess_posix.cc | 0 .../crashpad/test/multiprocess_posix_test.cc | 0 .../external/crashpad/test/process_type.cc | 0 .../external/crashpad/test/process_type.h | 0 .../crashpad/test/scoped_guarded_page.h | 0 .../test/scoped_guarded_page_posix.cc | 0 .../crashpad/test/scoped_guarded_page_test.cc | 0 .../crashpad/test/scoped_guarded_page_win.cc | 0 .../crashpad/test/scoped_module_handle.cc | 0 .../crashpad/test/scoped_module_handle.h | 0 .../crashpad/test/scoped_set_thread_name.h | 0 .../test/scoped_set_thread_name_fuchsia.cc | 0 .../test/scoped_set_thread_name_posix.cc | 0 .../test/scoped_set_thread_name_win.cc | 0 .../external/crashpad/test/scoped_temp_dir.cc | 0 .../external/crashpad/test/scoped_temp_dir.h | 0 .../crashpad/test/scoped_temp_dir_posix.cc | 0 .../crashpad/test/scoped_temp_dir_test.cc | 0 .../crashpad/test/scoped_temp_dir_win.cc | 0 .../external/crashpad/test/test_paths.cc | 1 + .../external/crashpad/test/test_paths.h | 0 .../external/crashpad/test/test_paths_test.cc | 0 .../test/test_paths_test_data_root.txt | 0 .../crashpad/test/win/child_launcher.cc | 0 .../crashpad/test/win/child_launcher.h | 0 .../crashpad/test/win/win_child_process.cc | 3 +- .../crashpad/test/win/win_child_process.h | 0 .../test/win/win_child_process_test.cc | 0 .../crashpad/test/win/win_multiprocess.cc | 0 .../crashpad/test/win/win_multiprocess.h | 0 .../test/win/win_multiprocess_test.cc | 0 .../win/win_multiprocess_with_temp_dir.cc | 0 .../test/win/win_multiprocess_with_temp_dir.h | 0 .../crashpad/third_party/cpp-httplib/BUILD.gn | 0 .../third_party/cpp-httplib/README.crashpad | 1 + .../cpp-httplib/cpp-httplib/LICENSE | 0 .../cpp-httplib/cpp-httplib/README.md | 0 .../cpp-httplib/cpp-httplib/httplib.h | 0 .../crashpad/third_party/edo/BUILD.gn | 4 +- .../crashpad/third_party/edo/README.crashpad | 1 + .../crashpad/third_party/fuchsia/BUILD.gn | 2 +- .../third_party/fuchsia/README.crashpad | 0 .../crashpad/third_party/fuchsia/runner.py | 0 .../crashpad/third_party/getopt/BUILD.gn | 0 .../third_party/getopt/CMakeLists.txt | 0 .../crashpad/third_party/getopt/LICENSE | 0 .../third_party/getopt/README.crashpad | 1 + .../crashpad/third_party/getopt/getopt.cc | 0 .../crashpad/third_party/getopt/getopt.h | 0 .../crashpad/third_party/googletest/BUILD.gn | 0 .../third_party/googletest/README.crashpad | 1 + .../crashpad/third_party/gyp/README.crashpad | 1 + .../third_party/linux/README.crashpad | 0 .../crashpad/third_party/lss/BUILD.gn | 0 .../crashpad/third_party/lss/README.crashpad | 1 + .../external/crashpad/third_party/lss/lss.h | 2 +- .../crashpad/third_party/lss/lss/.gitignore | 0 .../crashpad/third_party/lss/lss/DIR_METADATA | 0 .../crashpad/third_party/lss/lss/LICENSE | 5 +- .../crashpad/third_party/lss/lss/OWNERS | 0 .../crashpad/third_party/lss/lss/README.md | 1 + .../third_party/lss/lss/codereview.settings | 0 .../lss/lss/linux_syscall_support.h | 800 +- .../third_party/lss/lss/tests/.gitignore | 0 .../third_party/lss/lss/tests/Makefile | 15 +- .../third_party/lss/lss/tests/README.md | 0 .../third_party/lss/lss/tests/fallocate.c | 4 +- .../third_party/lss/lss/tests/getitimer.c | 84 + .../third_party/lss/lss/tests/getrandom.c | 4 +- .../third_party/lss/lss/tests/lstat.c | 4 +- .../third_party/lss/lss/tests/setitimer.c | 90 + .../third_party/lss/lss/tests/sigaction.c | 4 +- .../third_party/lss/lss/tests/sigtimedwait.c | 4 +- .../crashpad/third_party/lss/lss/tests/stat.c | 4 +- .../third_party/lss/lss/tests/test_skel.h | 19 +- .../third_party/lss/lss/tests/unlink.c | 4 +- .../third_party/mini_chromium/BUILD.gn | 7 +- .../third_party/mini_chromium/CMakeLists.txt | 72 +- .../third_party/mini_chromium/README.crashpad | 1 + .../mini_chromium/.gitattributes | 0 .../mini_chromium/mini_chromium/.gitignore | 0 .../mini_chromium/mini_chromium/.style.yapf | 0 .../mini_chromium/mini_chromium/AUTHORS | 2 +- .../mini_chromium/mini_chromium/BUILD.gn | 0 .../mini_chromium/mini_chromium/LICENSE | 0 .../mini_chromium/mini_chromium/README.md | 0 .../mini_chromium/mini_chromium/base/BUILD.gn | 75 +- .../mini_chromium/base/apple/bridging.h | 140 + .../base/apple/foundation_util.h | 124 + .../base/apple/foundation_util.mm | 64 + .../mini_chromium/base/apple}/mach_logging.cc | 15 +- .../mini_chromium/base/apple/mach_logging.h | 163 + .../base/apple}/scoped_cftyperef.h | 10 +- .../base/apple}/scoped_mach_port.cc | 8 +- .../base/apple}/scoped_mach_port.h | 22 +- .../base/apple}/scoped_mach_vm.cc | 11 +- .../base/apple}/scoped_mach_vm.h | 23 +- .../base/apple}/scoped_nsautorelease_pool.h | 31 +- .../base/apple/scoped_nsautorelease_pool.mm | 36 + .../mini_chromium/base/apple/scoped_typeref.h | 144 + .../mini_chromium/base/atomicops.h | 0 .../atomicops_internals_atomicword_compat.h | 0 .../base/atomicops_internals_portable.h | 0 .../mini_chromium/base/auto_reset.h | 0 .../mini_chromium/base/bit_cast.h | 0 .../mini_chromium/mini_chromium/base/check.h | 0 .../mini_chromium/base/check_op.h | 1 + .../mini_chromium/base/compiler_specific.h | 0 .../mini_chromium/base/containers/span.h | 516 + .../mini_chromium/base/cxx17_backports.h | 0 .../mini_chromium/base/debug/alias.cc | 0 .../mini_chromium/base/debug/alias.h | 0 .../mini_chromium/base/files/file_path.cc | 28 +- .../mini_chromium/base/files/file_path.h | 8 +- .../mini_chromium/base/files/file_util.h | 0 .../base/files/file_util_posix.cc | 0 .../mini_chromium/base/files/scoped_file.cc | 2 + .../mini_chromium/base/files/scoped_file.h | 0 .../mini_chromium/base/format_macros.h | 37 +- .../base/fuchsia/fuchsia_logging.cc | 0 .../base/fuchsia/fuchsia_logging.h | 0 .../mini_chromium/base/logging.cc | 6 +- .../mini_chromium/base/logging.h | 8 +- .../mini_chromium/base/mac/close_nocancel.cc | 0 .../mini_chromium/base/mac/scoped_ioobject.h | 5 +- .../base/mac/scoped_launch_data.h | 0 .../mini_chromium/base/memory/free_deleter.h | 0 .../mini_chromium/base/memory/page_size.h | 0 .../base/memory/page_size_posix.cc | 0 .../base/memory/page_size_win.cc | 0 .../mini_chromium/base/memory/scoped_policy.h | 0 .../base/metrics/histogram_functions.h | 0 .../base/metrics/histogram_macros.h | 0 .../metrics/persistent_histogram_allocator.h | 0 .../mini_chromium/base/notreached.h | 0 .../base/numerics/checked_math.h | 0 .../base/numerics/checked_math_impl.h | 0 .../base/numerics/clamped_math.h | 0 .../base/numerics/clamped_math_impl.h | 0 .../base/numerics/safe_conversions.h | 0 .../base/numerics/safe_conversions_arm_impl.h | 0 .../base/numerics/safe_conversions_impl.h | 0 .../mini_chromium/base/numerics/safe_math.h | 0 .../base/numerics/safe_math_arm_impl.h | 0 .../base/numerics/safe_math_clang_gcc_impl.h | 0 .../base/numerics/safe_math_shared_impl.h | 0 .../mini_chromium/base/posix/eintr_wrapper.h | 0 .../mini_chromium/base/posix/safe_strerror.cc | 3 +- .../mini_chromium/base/posix/safe_strerror.h | 0 .../mini_chromium/base/process/memory.cc | 0 .../mini_chromium/base/process/memory.h | 0 .../mini_chromium/base/rand_util.cc | 2 +- .../mini_chromium/base/rand_util.h | 0 .../base/scoped_clear_last_error.h | 0 .../base/scoped_clear_last_error_win.cc | 0 .../mini_chromium/base/scoped_generic.h | 0 .../mini_chromium/base/strings/pattern.cc | 155 + .../mini_chromium/base/strings/pattern.h | 22 + .../mini_chromium/base/strings/strcat.cc | 17 + .../mini_chromium/base/strings/strcat.h | 66 + .../base/strings/strcat_internal.h | 76 + .../base/strings/string_number_conversions.cc | 0 .../base/strings/string_number_conversions.h | 0 .../mini_chromium/base/strings/string_piece.h | 1 - .../mini_chromium/base/strings/string_util.cc | 0 .../mini_chromium/base/strings/string_util.h | 27 +- .../base/strings/string_util_posix.h | 2 - .../base/strings/string_util_win.cc | 0 .../base/strings/string_util_win.h | 0 .../base/strings/stringprintf.cc | 7 +- .../mini_chromium/base/strings/stringprintf.h | 0 .../base/strings/sys_string_conversions.h | 0 .../strings/sys_string_conversions_mac.mm | 8 +- .../strings/utf_string_conversion_utils.cc | 9 +- .../strings/utf_string_conversion_utils.h | 2 + .../base/strings/utf_string_conversions.cc | 7 +- .../base/strings/utf_string_conversions.h | 7 +- .../base/synchronization/condition_variable.h | 0 .../condition_variable_posix.cc | 2 +- .../base/synchronization/lock.cc | 2 +- .../mini_chromium/base/synchronization/lock.h | 0 .../base/synchronization/lock_impl.h | 0 .../base/synchronization/lock_impl_posix.cc | 2 +- .../base/synchronization/lock_impl_win.cc | 0 .../mini_chromium/base/sys_byteorder.h | 0 .../mini_chromium/base/template_util.h | 53 + .../base/third_party/icu/LICENSE | 0 .../base/third_party/icu/README.chromium | 0 .../base/third_party/icu/icu_utf.cc | 0 .../base/third_party/icu/icu_utf.h | 62 +- .../base/threading/thread_local_storage.cc | 3 +- .../base/threading/thread_local_storage.h | 0 .../threading/thread_local_storage_posix.cc | 2 +- .../threading/thread_local_storage_win.cc | 2 +- .../base/types/cxx23_to_underlying.h | 25 + .../mini_chromium/codereview.settings | 0 .../mini_chromium/testing/BUILD.gn | 0 .../mini_chromium/testing/platform_test.h | 21 +- .../utf_string_conversion_utils.mingw.cc | 0 .../third_party/ninja/README.crashpad | 18 + .../external/crashpad/third_party/ninja/ninja | 43 + .../crashpad/third_party/xnu/APPLE_LICENSE | 0 .../crashpad/third_party/xnu/BUILD.gn | 0 .../xnu/EXTERNAL_HEADERS/mach-o/loader.h | 0 .../crashpad/third_party/xnu/README.crashpad | 1 + .../third_party/xnu/osfmk/mach/exc.defs | 0 .../third_party/xnu/osfmk/mach/mach_exc.defs | 0 .../xnu/osfmk/mach/mach_types.defs | 0 .../xnu/osfmk/mach/machine/machine_types.defs | 0 .../third_party/xnu/osfmk/mach/std_types.defs | 0 .../crashpad/third_party/zlib/BUILD.gn | 16 +- .../crashpad/third_party/zlib/CMakeLists.txt | 12 +- .../crashpad/third_party/zlib/README.crashpad | 1 + .../crashpad/third_party/zlib/zlib/BUILD.gn | 532 + .../third_party/zlib/zlib/CMakeLists.txt | 307 + .../third_party/zlib/zlib/DIR_METADATA | 3 + .../crashpad/third_party/zlib/zlib/LICENSE | 4 +- .../crashpad/third_party/zlib/zlib/OWNERS | 4 + .../third_party/zlib/zlib/README.chromium | 17 +- .../crashpad/third_party/zlib/zlib/adler32.c | 60 +- .../third_party/zlib/zlib/adler32_simd.c | 366 + .../third_party/zlib/zlib/adler32_simd.h | 16 + .../third_party/zlib/zlib/chromeconf.h} | 48 +- .../crashpad/third_party/zlib/zlib/compress.c | 35 +- .../zlib/zlib/contrib/bench/check.sh | 35 + .../zlib/zlib/contrib/bench/zlib_bench.cc | 438 + .../zlib/zlib/contrib/minizip/ChangeLogUnzip | 0 .../zlib/zlib/contrib/minizip/Makefile | 0 .../zlib/zlib/contrib/minizip/README.chromium | 20 + .../zlib/zlib/contrib/minizip/crypt.h | 0 .../zlib/zlib/contrib/minizip/ioapi.c | 2 +- .../zlib/zlib/contrib/minizip/ioapi.h | 2 +- .../zlib/zlib/contrib/minizip/iowin32.c | 8 +- .../zlib/zlib/contrib/minizip/iowin32.h | 0 .../zlib/zlib/contrib/minizip/miniunz.c | 13 +- .../zlib/zlib/contrib/minizip/minizip.c | 7 +- .../zlib/zlib/contrib/minizip/minizip.md | 9 + .../zlib/zlib/contrib/minizip/mztools.c | 2 +- .../zlib/zlib/contrib/minizip/mztools.h | 2 +- .../zlib/zlib/contrib/minizip/unzip.c | 121 +- .../zlib/zlib/contrib/minizip/unzip.h | 2 +- .../zlib/zlib/contrib/minizip/zip.c | 13 +- .../zlib/zlib/contrib/minizip/zip.h | 2 +- .../zlib/contrib/optimizations/chunkcopy.h | 489 + .../contrib/optimizations/inffast_chunk.c | 376 + .../contrib/optimizations/inffast_chunk.h | 42 + .../zlib/zlib/contrib/optimizations/inflate.c | 1562 +++ .../contrib/optimizations/insert_string.h | 80 + .../third_party/zlib/zlib/contrib/tests/DEPS | 5 + .../zlib/zlib/contrib/tests/OWNERS | 2 + .../zlib/zlib/contrib/tests/fuzzers/BUILD.gn | 40 + .../zlib/zlib/contrib/tests/fuzzers/OWNERS | 2 + .../contrib/tests/fuzzers/deflate_fuzzer.cc | 80 + .../fuzzers/deflate_set_dictionary_fuzzer.cc | 43 + .../contrib/tests/fuzzers/inflate_fuzzer.cc | 41 + .../fuzzers/inflate_with_header_fuzzer.cc | 95 + .../tests/fuzzers/streaming_inflate_fuzzer.cc | 74 + .../tests/fuzzers/uncompress_fuzzer.cc | 21 + .../zlib/zlib/contrib/tests/infcover.cc | 745 ++ .../zlib/zlib/contrib/tests/infcover.h | 12 + .../zlib/contrib/tests/run_all_unittests.cc | 14 + .../contrib/tests/standalone_test_runner.cc | 9 + .../zlib/zlib/contrib/tests/utils_unittest.cc | 1150 ++ .../third_party/zlib/zlib/cpu_features.c | 189 + .../third_party/zlib/zlib/cpu_features.h | 19 + .../crashpad/third_party/zlib/zlib/crc32.c | 1182 +++ .../crashpad/third_party/zlib/zlib/crc32.h | 9446 +++++++++++++++++ .../third_party/zlib/zlib/crc32_simd.c | 621 ++ .../third_party/zlib/zlib/crc32_simd.h | 57 + .../third_party/zlib/zlib/crc_folding.c | 12 +- .../crashpad/third_party/zlib/zlib/deflate.c | 1029 +- .../crashpad/third_party/zlib/zlib/deflate.h | 54 +- .../third_party/zlib/zlib/google/BUILD.gn | 59 + .../third_party/zlib/zlib/google/DEPS | 7 + .../third_party/zlib/zlib/google/OWNERS | 1 + .../zlib/zlib/google/compression_utils.cc | 134 + .../zlib/zlib/google/compression_utils.h | 70 + .../zlib/google/compression_utils_portable.cc | 205 + .../zlib/google/compression_utils_portable.h | 63 + .../zlib/google/compression_utils_unittest.cc | 26 +- .../third_party/zlib/zlib/google/redact.h | 31 + .../test/data/Different Encryptions.zip | Bin 0 -> 1083 bytes .../test/data/Empty Dir Same Name As File.zip | Bin 0 -> 218 bytes .../zlib/google/test/data/Mixed Paths.zip | Bin 0 -> 12814 bytes .../data/Parent Dir Same Name As File.zip | Bin 0 -> 241 bytes .../zlib/zlib/google/test/data/README.md | 15 + .../google/test/data/Repeated Dir Name.zip | Bin 0 -> 210 bytes ...epeated File Name With Different Cases.zip | Bin 0 -> 313 bytes .../google/test/data/Repeated File Name.zip | Bin 0 -> 227 bytes .../zlib/google/test/data/SJIS Bug 846195.zip | Bin 0 -> 479 bytes .../test/data/Windows Special Names.zip | Bin 0 -> 3985 bytes .../zlib/zlib/google/test/data/Wrong CRC.zip | Bin 0 -> 231 bytes .../zlib/google/test/data/create_test_zip.sh | 8 +- .../zlib/zlib/google/test/data/empty.zip | Bin 0 -> 22 bytes .../zlib/zlib/google/test/data/evil.zip | Bin .../test/data/evil_via_absolute_file_name.zip | Bin .../test/data/evil_via_invalid_utf8.zip | Bin .../zlib/zlib/google/test/data/test.zip | Bin .../zlib/zlib/google/test/data/test/foo.txt | 0 .../zlib/google/test/data/test/foo/bar.txt | 0 .../google/test/data/test/foo/bar/.hidden | 0 .../google/test/data/test/foo/bar/baz.txt | 0 .../google/test/data/test/foo/bar/quux.txt | 0 .../zlib/google/test/data/test_encrypted.zip | Bin 0 -> 5325 bytes .../google/test/data/test_mismatch_size.zip | Bin .../zlib/google/test/data/test_nocompress.zip | Bin .../test/data/test_posix_permissions.zip | Bin 0 -> 574 bytes .../zlib/zlib/google/test_data.filelist | 32 + .../zlib/zlib/google/test_data.globlist | 8 + .../third_party/zlib/zlib/google/zip.cc | 274 + .../third_party/zlib/zlib/google/zip.h | 219 + .../zlib/zlib/google/zip_internal.cc | 267 +- .../zlib/zlib/google/zip_internal.h | 26 +- .../zlib/zlib/google/zip_reader.cc | 722 ++ .../third_party/zlib/zlib/google/zip_reader.h | 404 + .../zlib/zlib/google/zip_reader_unittest.cc | 927 ++ .../zlib/zlib/google/zip_unittest.cc | 1428 +++ .../zlib/zlib/google/zip_writer.cc | 308 + .../third_party/zlib/zlib/google/zip_writer.h | 154 + .../crashpad/third_party/zlib/zlib/gzclose.c | 4 +- .../crashpad/third_party/zlib/zlib/gzguts.h | 23 +- .../crashpad/third_party/zlib/zlib/gzlib.c | 110 +- .../crashpad/third_party/zlib/zlib/gzread.c | 104 +- .../crashpad/third_party/zlib/zlib/gzwrite.c | 118 +- .../crashpad/third_party/zlib/zlib/infback.c | 59 +- .../crashpad/third_party/zlib/zlib/inffast.c | 56 +- .../crashpad/third_party/zlib/zlib/inffast.h | 26 + .../crashpad/third_party/zlib/zlib/inffixed.h | 0 .../crashpad/third_party/zlib/zlib/inflate.c | 193 +- .../crashpad/third_party/zlib/zlib/inflate.h | 5 +- .../crashpad/third_party/zlib/zlib/inftrees.c | 17 +- .../crashpad/third_party/zlib/zlib/inftrees.h | 18 +- .../zlib/zlib/patches/0000-build.patch | 160 + .../zlib/zlib/patches/0001-simd.patch} | 33 +- .../patches/0002-uninitializedcheck.patch | 27 + .../zlib/patches/0003-uninitializedjump.patch | 15 + .../zlib/zlib/patches/0004-fix-uwp.patch | 22 + .../zlib/patches/0005-infcover-gtest.patch | 405 + .../zlib/patches/0006-fix-check_match.patch | 42 + .../0007-zero-init-deflate-window.patch | 40 + .../0008-minizip-zip-unzip-tools.patch | 98 + .../zlib/zlib/patches/0009-infcover-oob.patch | 24 + .../zlib/patches/0010-cmake-enable-simd.patch | 96 + .../zlib/zlib/patches/0011-avx512.patch | 357 + .../zlib/zlib/patches/0012-lfs-open64.patch | 40 + .../0013-cpu-feature-detection-for-arm.patch | 30 + .../third_party/zlib/zlib/patches/README | 43 + .../third_party/zlib/zlib/slide_hash_simd.h | 116 + .../crashpad/third_party/zlib/zlib/trees.c | 660 +- .../crashpad/third_party/zlib/zlib/trees.h | 0 .../crashpad/third_party/zlib/zlib/uncompr.c | 16 +- .../crashpad/third_party/zlib/zlib/zconf.h | 43 +- .../third_party/zlib/zlib/zconf.h.cmakein | 553 + .../crashpad/third_party/zlib/zlib/zconf.h.in | 551 + .../crashpad/third_party/zlib/zlib/zlib.3 | 149 + .../crashpad/third_party/zlib/zlib/zlib.h | 577 +- .../crashpad/third_party/zlib/zlib/zlib.map | 100 + .../third_party/zlib/zlib/zlib.pc.cmakein | 13 + .../crashpad/third_party/zlib/zlib/zutil.c | 66 +- .../crashpad/third_party/zlib/zlib/zutil.h | 40 +- .../crashpad/third_party/zlib/zlib_crashpad.h | 0 .../external/crashpad/tools/BUILD.gn | 34 +- .../external/crashpad/tools/CMakeLists.txt | 57 +- .../external/crashpad/tools/base94_encoder.cc | 0 .../external/crashpad/tools/base94_encoder.md | 0 .../crashpad/tools/crashpad_database_util.cc | 0 .../crashpad/tools/crashpad_database_util.md | 0 .../crashpad/tools/crashpad_http_upload.cc | 0 .../crashpad/tools/crashpad_http_upload.md | 0 .../tools/dump_minidump_annotations.cc | 147 + .../external/crashpad/tools/generate_dump.cc | 4 +- .../external/crashpad/tools/generate_dump.md | 0 .../tools/mac/catch_exception_tool.cc | 6 +- .../tools/mac/catch_exception_tool.md | 0 .../crashpad/tools/mac/exception_port_tool.cc | 12 +- .../crashpad/tools/mac/exception_port_tool.md | 0 .../tools/mac/on_demand_service_tool.md | 0 .../tools/mac/on_demand_service_tool.mm | 6 +- .../tools/mac/sectaskaccess_info.plist | 0 .../crashpad/tools/run_with_crashpad.cc | 8 + .../crashpad/tools/run_with_crashpad.md | 8 +- .../external/crashpad/tools/tool_support.cc | 0 .../external/crashpad/tools/tool_support.h | 0 .../{ => src}/external/crashpad/util/BUILD.gn | 45 +- .../external/crashpad/util/CMakeLists.txt | 39 +- .../util/file/delimited_file_reader.cc | 0 .../util/file/delimited_file_reader.h | 0 .../util/file/delimited_file_reader_test.cc | 0 .../crashpad/util/file/directory_reader.h | 0 .../util/file/directory_reader_posix.cc | 1 + .../util/file/directory_reader_test.cc | 0 .../util/file/directory_reader_win.cc | 1 + .../crashpad/util/file/file_helper.cc | 0 .../external/crashpad/util/file/file_helper.h | 0 .../external/crashpad/util/file/file_io.cc | 0 .../external/crashpad/util/file/file_io.h | 4 +- .../crashpad/util/file/file_io_posix.cc | 5 +- .../crashpad/util/file/file_io_test.cc | 6 +- .../crashpad/util/file/file_io_win.cc | 1 + .../crashpad/util/file/file_reader.cc | 1 + .../external/crashpad/util/file/file_reader.h | 0 .../crashpad/util/file/file_reader_test.cc | 0 .../crashpad/util/file/file_seeker.cc | 0 .../external/crashpad/util/file/file_seeker.h | 0 .../crashpad/util/file/file_writer.cc | 1 + .../external/crashpad/util/file/file_writer.h | 0 .../external/crashpad/util/file/filesystem.h | 0 .../crashpad/util/file/filesystem_posix.cc | 0 .../crashpad/util/file/filesystem_test.cc | 20 +- .../crashpad/util/file/filesystem_win.cc | 26 +- .../util/file/output_stream_file_writer.cc | 0 .../util/file/output_stream_file_writer.h | 0 .../crashpad/util/file/scoped_remove_file.cc | 0 .../crashpad/util/file/scoped_remove_file.h | 0 .../crashpad/util/file/string_file.cc | 1 + .../external/crashpad/util/file/string_file.h | 0 .../crashpad/util/file/string_file_test.cc | 0 .../crashpad/util/fuchsia/koid_utilities.cc | 0 .../crashpad/util/fuchsia/koid_utilities.h | 0 .../util/fuchsia/scoped_task_suspend.cc | 1 + .../util/fuchsia/scoped_task_suspend.h | 0 .../external/crashpad/util/fuchsia/traits.h | 0 .../util/ios/ios_intermediate_dump_data.cc | 0 .../util/ios/ios_intermediate_dump_data.h | 0 .../util/ios/ios_intermediate_dump_format.h | 2 +- .../ios/ios_intermediate_dump_interface.cc | 0 .../ios/ios_intermediate_dump_interface.h | 0 .../util/ios/ios_intermediate_dump_list.cc | 0 .../util/ios/ios_intermediate_dump_list.h | 0 .../util/ios/ios_intermediate_dump_map.cc | 0 .../util/ios/ios_intermediate_dump_map.h | 0 .../util/ios/ios_intermediate_dump_object.cc | 0 .../util/ios/ios_intermediate_dump_object.h | 0 .../util/ios/ios_intermediate_dump_reader.cc | 0 .../util/ios/ios_intermediate_dump_reader.h | 0 .../ios/ios_intermediate_dump_reader_test.cc | 0 .../util/ios/ios_intermediate_dump_writer.cc | 9 +- .../util/ios/ios_intermediate_dump_writer.h | 0 .../ios/ios_intermediate_dump_writer_test.cc | 6 +- .../util/ios/ios_system_data_collector.h | 2 + .../util/ios/ios_system_data_collector.mm | 12 +- .../external/crashpad/util/ios/raw_logging.cc | 0 .../external/crashpad/util/ios/raw_logging.h | 0 .../util/ios/scoped_background_task.h | 0 .../util/ios/scoped_background_task.mm | 4 - .../crashpad/util/ios/scoped_vm_map.cc | 86 + .../crashpad/util/ios/scoped_vm_map.h | 125 + .../crashpad/util/ios/scoped_vm_map_test.cc | 94 + .../crashpad/util/ios/scoped_vm_read.cc | 44 +- .../crashpad/util/ios/scoped_vm_read.h | 14 +- .../crashpad/util/ios/scoped_vm_read_test.cc | 51 +- .../crashpad/util/linux/address_types.h | 0 .../crashpad/util/linux/auxiliary_vector.cc | 0 .../crashpad/util/linux/auxiliary_vector.h | 0 .../util/linux/auxiliary_vector_test.cc | 5 + .../util/linux/checked_linux_address_range.h | 0 .../util/linux/direct_ptrace_connection.cc | 0 .../util/linux/direct_ptrace_connection.h | 0 .../util/linux/exception_handler_client.cc | 1 + .../util/linux/exception_handler_client.h | 0 .../util/linux/exception_handler_protocol.cc | 0 .../util/linux/exception_handler_protocol.h | 0 .../util/linux/exception_information.h | 0 .../util/linux/initial_signal_dispositions.cc | 0 .../util/linux/initial_signal_dispositions.h | 0 .../crashpad/util/linux/memory_map.cc | 1 + .../external/crashpad/util/linux/memory_map.h | 0 .../crashpad/util/linux/memory_map_test.cc | 0 .../crashpad/util/linux/pac_helper.cc | 44 + .../external/crashpad/util/linux/pac_helper.h | 29 + .../crashpad/util/linux/proc_stat_reader.cc | 0 .../crashpad/util/linux/proc_stat_reader.h | 0 .../util/linux/proc_stat_reader_test.cc | 0 .../crashpad/util/linux/proc_task_reader.cc | 1 + .../crashpad/util/linux/proc_task_reader.h | 0 .../util/linux/proc_task_reader_test.cc | 0 .../crashpad/util/linux/ptrace_broker.cc | 0 .../crashpad/util/linux/ptrace_broker.h | 0 .../crashpad/util/linux/ptrace_broker_test.cc | 5 +- .../crashpad/util/linux/ptrace_client.cc | 6 + .../crashpad/util/linux/ptrace_client.h | 0 .../crashpad/util/linux/ptrace_connection.h | 0 .../external/crashpad/util/linux/ptracer.cc | 38 + .../external/crashpad/util/linux/ptracer.h | 0 .../crashpad/util/linux/ptracer_test.cc | 0 .../util/linux/scoped_pr_set_dumpable.cc | 0 .../util/linux/scoped_pr_set_dumpable.h | 0 .../util/linux/scoped_pr_set_ptracer.cc | 0 .../util/linux/scoped_pr_set_ptracer.h | 0 .../util/linux/scoped_ptrace_attach.cc | 0 .../util/linux/scoped_ptrace_attach.h | 0 .../util/linux/scoped_ptrace_attach_test.cc | 0 .../external/crashpad/util/linux/socket.cc | 0 .../external/crashpad/util/linux/socket.h | 0 .../crashpad/util/linux/socket_test.cc | 0 .../crashpad/util/linux/thread_info.cc | 0 .../crashpad/util/linux/thread_info.h | 27 +- .../external/crashpad/util/linux/traits.h | 0 .../util/mac/checked_mach_address_range.h | 0 .../mac/checked_mach_address_range_test.cc | 0 .../external/crashpad/util/mac/launchd.h | 0 .../external/crashpad/util/mac/launchd.mm | 37 +- .../crashpad/util/mac/launchd_test.mm | 46 +- .../external/crashpad/util/mac/mac_util.cc | 63 +- .../external/crashpad/util/mac/mac_util.h | 1 - .../crashpad/util/mac/mac_util_test.mm | 26 +- .../crashpad/util/mac/service_management.cc | 0 .../crashpad/util/mac/service_management.h | 0 .../util/mac/service_management_test.mm | 6 +- .../external/crashpad/util/mac/sysctl.cc | 0 .../external/crashpad/util/mac/sysctl.h | 0 .../external/crashpad/util/mac/sysctl_test.cc | 0 .../external/crashpad/util/mac/xattr.cc | 1 + .../external/crashpad/util/mac/xattr.h | 0 .../external/crashpad/util/mac/xattr_test.cc | 0 .../external/crashpad/util/mach/bootstrap.cc | 14 +- .../external/crashpad/util/mach/bootstrap.h | 9 +- .../crashpad/util/mach/bootstrap_test.cc | 17 +- .../crashpad/util/mach/child_port.defs | 0 .../util/mach/child_port_handshake.cc | 11 +- .../crashpad/util/mach/child_port_handshake.h | 6 +- .../util/mach/child_port_handshake_test.cc | 10 +- .../crashpad/util/mach/child_port_server.cc | 0 .../crashpad/util/mach/child_port_server.h | 0 .../util/mach/child_port_server_test.cc | 0 .../crashpad/util/mach/child_port_types.h | 0 .../mach/composite_mach_message_server.cc | 0 .../util/mach/composite_mach_message_server.h | 0 .../composite_mach_message_server_test.cc | 0 .../crashpad/util/mach/exc_client_variants.cc | 0 .../crashpad/util/mach/exc_client_variants.h | 0 .../util/mach/exc_client_variants_test.cc | 0 .../crashpad/util/mach/exc_server_variants.cc | 0 .../crashpad/util/mach/exc_server_variants.h | 0 .../util/mach/exc_server_variants_test.cc | 0 .../crashpad/util/mach/exception_behaviors.cc | 0 .../crashpad/util/mach/exception_behaviors.h | 0 .../util/mach/exception_behaviors_test.cc | 0 .../crashpad/util/mach/exception_ports.cc | 2 +- .../crashpad/util/mach/exception_ports.h | 0 .../util/mach/exception_ports_test.cc | 12 +- .../crashpad/util/mach/exception_types.cc | 2 +- .../crashpad/util/mach/exception_types.h | 0 .../util/mach/exception_types_test.cc | 0 .../crashpad/util/mach/mach_extensions.cc | 2 +- .../crashpad/util/mach/mach_extensions.h | 0 .../util/mach/mach_extensions_test.cc | 11 +- .../crashpad/util/mach/mach_message.cc | 2 +- .../crashpad/util/mach/mach_message.h | 0 .../crashpad/util/mach/mach_message_server.cc | 7 +- .../crashpad/util/mach/mach_message_server.h | 0 .../util/mach/mach_message_server_test.cc | 6 +- .../crashpad/util/mach/mach_message_test.cc | 7 +- .../external/crashpad/util/mach/mig.py | 0 .../external/crashpad/util/mach/mig_fix.py | 0 .../external/crashpad/util/mach/mig_gen.py | 0 .../crashpad/util/mach/notify_server.cc | 0 .../crashpad/util/mach/notify_server.h | 0 .../crashpad/util/mach/notify_server_test.cc | 38 +- .../crashpad/util/mach/scoped_task_suspend.cc | 2 +- .../crashpad/util/mach/scoped_task_suspend.h | 0 .../util/mach/scoped_task_suspend_test.cc | 0 .../util/mach/symbolic_constants_mach.cc | 0 .../util/mach/symbolic_constants_mach.h | 0 .../util/mach/symbolic_constants_mach_test.cc | 0 .../crashpad/util/mach/task_for_pid.cc | 6 +- .../crashpad/util/mach/task_for_pid.h | 0 .../crashpad/util/misc/address_sanitizer.h | 0 .../crashpad/util/misc/address_types.h | 0 .../crashpad/util/misc/arm64_pac_bti.S | 0 .../external/crashpad/util/misc/arraysize.h | 0 .../crashpad/util/misc/arraysize_test.cc | 0 .../crashpad/util/misc/as_underlying_type.h | 0 .../crashpad/util/misc/capture_context.h | 11 +- .../util/misc/capture_context_linux.S | 83 + .../crashpad/util/misc/capture_context_mac.S | 0 .../util/misc/capture_context_test.cc | 9 - .../util/misc/capture_context_test_util.h | 0 .../misc/capture_context_test_util_linux.cc | 7 + .../misc/capture_context_test_util_mac.cc | 0 .../misc/capture_context_test_util_win.cc | 0 .../util/misc/capture_context_win.asm | 0 .../util/misc/capture_context_win_arm64.asm | 0 .../util/misc/capture_context_win_arm64.obj | Bin .../external/crashpad/util/misc/clock.h | 0 .../external/crashpad/util/misc/clock_mac.cc | 2 +- .../crashpad/util/misc/clock_posix.cc | 0 .../external/crashpad/util/misc/clock_test.cc | 0 .../external/crashpad/util/misc/clock_win.cc | 0 .../crashpad/util/misc/elf_note_types.h | 0 .../crashpad/util/misc/from_pointer_cast.h | 0 .../util/misc/from_pointer_cast_test.cc | 0 .../crashpad/util/misc/implicit_cast.h | 0 .../crashpad/util/misc/initialization_state.h | 0 .../util/misc/initialization_state_dcheck.cc | 0 .../util/misc/initialization_state_dcheck.h | 0 .../misc/initialization_state_dcheck_test.cc | 0 .../util/misc/initialization_state_test.cc | 0 .../external/crashpad/util/misc/lexing.cc | 4 +- .../external/crashpad/util/misc/lexing.h | 0 .../crashpad/util/misc/memory_sanitizer.h | 0 .../external/crashpad/util/misc/metrics.cc | 0 .../external/crashpad/util/misc/metrics.h | 0 .../crashpad/util/misc/no_cfi_icall.h | 0 .../crashpad/util/misc/no_cfi_icall_test.cc | 0 .../external/crashpad/util/misc/paths.h | 0 .../crashpad/util/misc/paths_fuchsia.cc | 0 .../crashpad/util/misc/paths_linux.cc | 0 .../external/crashpad/util/misc/paths_mac.cc | 0 .../external/crashpad/util/misc/paths_test.cc | 0 .../external/crashpad/util/misc/paths_win.cc | 0 .../crashpad/util/misc/pdb_structures.cc | 0 .../crashpad/util/misc/pdb_structures.h | 0 .../crashpad/util/misc/random_string.cc | 0 .../crashpad/util/misc/random_string.h | 0 .../crashpad/util/misc/random_string_test.cc | 0 .../external/crashpad/util/misc/range_set.cc | 0 .../external/crashpad/util/misc/range_set.h | 0 .../crashpad/util/misc/range_set_test.cc | 0 .../crashpad/util/misc/reinterpret_bytes.cc | 0 .../crashpad/util/misc/reinterpret_bytes.h | 0 .../util/misc/reinterpret_bytes_test.cc | 0 .../util/misc/scoped_forbid_return.cc | 0 .../crashpad/util/misc/scoped_forbid_return.h | 0 .../util/misc/scoped_forbid_return_test.cc | 0 .../util/misc/symbolic_constants_common.h | 0 .../external/crashpad/util/misc/time.cc | 0 .../external/crashpad/util/misc/time.h | 0 .../external/crashpad/util/misc/time_linux.cc | 0 .../external/crashpad/util/misc/time_test.cc | 0 .../external/crashpad/util/misc/time_win.cc | 0 .../external/crashpad/util/misc/tri_state.h | 0 .../external/crashpad/util/misc/uuid.cc | 5 +- .../external/crashpad/util/misc/uuid.h | 3 +- .../external/crashpad/util/misc/uuid_test.cc | 0 .../external/crashpad/util/misc/zlib.cc | 0 .../external/crashpad/util/misc/zlib.h | 0 .../util/net/generate_test_server_key.py | 0 .../external/crashpad/util/net/http_body.cc | 0 .../external/crashpad/util/net/http_body.h | 0 .../crashpad/util/net/http_body_gzip.cc | 1 + .../crashpad/util/net/http_body_gzip.h | 0 .../crashpad/util/net/http_body_gzip_test.cc | 0 .../crashpad/util/net/http_body_test.cc | 0 .../crashpad/util/net/http_body_test_util.cc | 0 .../crashpad/util/net/http_body_test_util.h | 0 .../external/crashpad/util/net/http_headers.h | 0 .../util/net/http_multipart_builder.cc | 0 .../util/net/http_multipart_builder.h | 0 .../util/net/http_multipart_builder_test.cc | 0 .../crashpad/util/net/http_transport.cc | 4 + .../crashpad/util/net/http_transport.h | 7 + .../util/net/http_transport_libcurl.cc | 12 +- .../crashpad/util/net/http_transport_mac.mm | 174 +- .../util/net/http_transport_socket.cc | 1 + .../crashpad/util/net/http_transport_test.cc | 0 .../util/net/http_transport_test_server.cc | 0 .../crashpad/util/net/http_transport_win.cc | 49 +- .../util/net/testdata/ascii_http_body.txt | 0 .../util/net/testdata/binary_http_body.dat | 0 .../net/testdata/crashpad_util_test_cert.pem | 0 .../net/testdata/crashpad_util_test_key.pem | 0 .../external/crashpad/util/net/tls.gni | 0 .../external/crashpad/util/net/url.cc | 0 .../external/crashpad/util/net/url.h | 0 .../external/crashpad/util/net/url_test.cc | 0 .../util/numeric/checked_address_range.cc | 0 .../util/numeric/checked_address_range.h | 0 .../numeric/checked_address_range_test.cc | 0 .../crashpad/util/numeric/checked_range.h | 0 .../util/numeric/checked_range_test.cc | 0 .../util/numeric/checked_vm_address_range.h | 0 .../crashpad/util/numeric/in_range_cast.h | 0 .../util/numeric/in_range_cast_test.cc | 0 .../external/crashpad/util/numeric/int128.h | 0 .../crashpad/util/numeric/int128_test.cc | 0 .../crashpad/util/numeric/safe_assignment.h | 0 .../crashpad/util/posix/close_multiple.cc | 1 + .../crashpad/util/posix/close_multiple.h | 0 .../crashpad/util/posix/close_stdio.cc | 0 .../crashpad/util/posix/close_stdio.h | 0 .../crashpad/util/posix/drop_privileges.cc | 0 .../crashpad/util/posix/drop_privileges.h | 0 .../crashpad/util/posix/process_info.h | 0 .../crashpad/util/posix/process_info_linux.cc | 1 + .../crashpad/util/posix/process_info_mac.cc | 3 +- .../crashpad/util/posix/process_info_test.cc | 0 .../crashpad/util/posix/scoped_dir.cc | 0 .../external/crashpad/util/posix/scoped_dir.h | 0 .../crashpad/util/posix/scoped_mmap.cc | 0 .../crashpad/util/posix/scoped_mmap.h | 0 .../crashpad/util/posix/scoped_mmap_test.cc | 0 .../external/crashpad/util/posix/signals.cc | 0 .../external/crashpad/util/posix/signals.h | 0 .../crashpad/util/posix/signals_test.cc | 9 +- .../crashpad/util/posix/spawn_subprocess.cc | 0 .../crashpad/util/posix/spawn_subprocess.h | 0 .../util/posix/symbolic_constants_posix.cc | 0 .../util/posix/symbolic_constants_posix.h | 0 .../posix/symbolic_constants_posix_test.cc | 0 .../crashpad/util/process/process_id.h | 0 .../crashpad/util/process/process_memory.cc | 0 .../crashpad/util/process/process_memory.h | 0 .../util/process/process_memory_fuchsia.cc | 3 +- .../util/process/process_memory_fuchsia.h | 0 .../util/process/process_memory_linux.cc | 1 + .../util/process/process_memory_linux.h | 0 .../util/process/process_memory_mac.cc | 3 +- .../util/process/process_memory_mac.h | 4 +- .../util/process/process_memory_mac_test.cc | 12 +- .../util/process/process_memory_native.h | 0 .../util/process/process_memory_range.cc | 0 .../util/process/process_memory_range.h | 0 .../util/process/process_memory_range_test.cc | 0 .../util/process/process_memory_sanitized.cc | 0 .../util/process/process_memory_sanitized.h | 0 .../process/process_memory_sanitized_test.cc | 0 .../util/process/process_memory_test.cc | 0 .../util/process/process_memory_win.cc | 1 + .../util/process/process_memory_win.h | 0 .../crashpad/util/stdlib/aligned_allocator.cc | 0 .../crashpad/util/stdlib/aligned_allocator.h | 0 .../util/stdlib/aligned_allocator_test.cc | 0 .../crashpad/util/stdlib/map_insert.h | 0 .../crashpad/util/stdlib/map_insert_test.cc | 0 .../external/crashpad/util/stdlib/objc.h | 0 .../util/stdlib/string_number_conversion.cc | 4 +- .../util/stdlib/string_number_conversion.h | 0 .../stdlib/string_number_conversion_test.cc | 0 .../external/crashpad/util/stdlib/strlcpy.cc | 0 .../external/crashpad/util/stdlib/strlcpy.h | 0 .../crashpad/util/stdlib/strlcpy_test.cc | 0 .../external/crashpad/util/stdlib/strnlen.cc | 0 .../external/crashpad/util/stdlib/strnlen.h | 0 .../crashpad/util/stdlib/strnlen_test.cc | 0 .../crashpad/util/stdlib/thread_safe_vector.h | 0 .../util/stdlib/thread_safe_vector_test.cc | 0 .../util/stream/base94_output_stream.cc | 0 .../util/stream/base94_output_stream.h | 0 .../util/stream/base94_output_stream_test.cc | 0 .../crashpad/util/stream/file_encoder.cc | 0 .../crashpad/util/stream/file_encoder.h | 0 .../crashpad/util/stream/file_encoder_test.cc | 0 .../util/stream/file_output_stream.cc | 1 + .../crashpad/util/stream/file_output_stream.h | 0 .../crashpad/util/stream/log_output_stream.cc | 0 .../crashpad/util/stream/log_output_stream.h | 0 .../util/stream/log_output_stream_test.cc | 0 .../util/stream/output_stream_interface.h | 0 .../util/stream/test_output_stream.cc | 0 .../crashpad/util/stream/test_output_stream.h | 0 .../util/stream/zlib_output_stream.cc | 0 .../crashpad/util/stream/zlib_output_stream.h | 0 .../util/stream/zlib_output_stream_test.cc | 0 .../crashpad/util/string/split_string.cc | 0 .../crashpad/util/string/split_string.h | 0 .../crashpad/util/string/split_string_test.cc | 0 .../util/synchronization/scoped_spin_guard.h | 122 + .../synchronization/scoped_spin_guard_test.cc | 109 + .../crashpad/util/synchronization/semaphore.h | 0 .../util/synchronization/semaphore_mac.cc | 0 .../util/synchronization/semaphore_posix.cc | 0 .../util/synchronization/semaphore_test.cc | 0 .../util/synchronization/semaphore_win.cc | 0 .../external/crashpad/util/thread/stoppable.h | 0 .../external/crashpad/util/thread/thread.cc | 0 .../external/crashpad/util/thread/thread.h | 0 .../util/thread/thread_log_messages.cc | 55 + .../util/thread/thread_log_messages.h | 5 +- .../util/thread/thread_log_messages_test.cc | 0 .../crashpad/util/thread/thread_posix.cc | 0 .../crashpad/util/thread/thread_test.cc | 0 .../crashpad/util/thread/thread_win.cc | 0 .../crashpad/util/thread/worker_thread.cc | 0 .../crashpad/util/thread/worker_thread.h | 0 .../util/thread/worker_thread_test.cc | 0 .../crashpad/util/win/address_types.h | 0 .../util/win/checked_win_address_range.h | 0 .../crashpad/util/win/command_line.cc | 0 .../external/crashpad/util/win/command_line.h | 0 .../crashpad/util/win/command_line_test.cc | 0 .../crashpad/util/win/context_wrappers.h | 0 .../win/critical_section_with_debug_info.cc | 0 .../win/critical_section_with_debug_info.h | 0 .../critical_section_with_debug_info_test.cc | 0 .../crashpad/util/win/exception_codes.h | 0 .../util/win/exception_handler_server.cc | 1 + .../util/win/exception_handler_server.h | 0 .../util/win/exception_handler_server_test.cc | 0 .../crashpad/util/win/get_function.cc | 0 .../external/crashpad/util/win/get_function.h | 0 .../crashpad/util/win/get_function_test.cc | 0 .../util/win/get_module_information.cc | 0 .../util/win/get_module_information.h | 0 .../external/crashpad/util/win/handle.cc | 0 .../external/crashpad/util/win/handle.h | 0 .../external/crashpad/util/win/handle_test.cc | 0 .../crashpad/util/win/initial_client_data.cc | 4 +- .../crashpad/util/win/initial_client_data.h | 0 .../util/win/initial_client_data_test.cc | 0 .../external/crashpad/util/win/loader_lock.cc | 0 .../external/crashpad/util/win/loader_lock.h | 0 .../crashpad/util/win/loader_lock_test.cc | 0 .../crashpad/util/win/loader_lock_test_dll.cc | 0 .../crashpad/util/win/module_version.cc | 0 .../crashpad/util/win/module_version.h | 0 .../crashpad/util/win/nt_internals.cc | 0 .../external/crashpad/util/win/nt_internals.h | 0 .../crashpad/util/win/ntstatus_logging.cc | 0 .../crashpad/util/win/ntstatus_logging.h | 0 .../crashpad/util/win/process_info.cc | 1 + .../external/crashpad/util/win/process_info.h | 0 .../crashpad/util/win/process_info_test.cc | 0 .../util/win/process_info_test_child.cc | 0 .../crashpad/util/win/process_structs.h | 0 .../util/win/registration_protocol_win.cc | 1 + .../util/win/registration_protocol_win.h | 0 .../win/registration_protocol_win_structs.h | 0 .../win/registration_protocol_win_test.cc | 0 .../util/win/safe_terminate_process.asm | 0 .../util/win/safe_terminate_process.h | 0 .../util/win/safe_terminate_process_test.cc | 0 .../win/safe_terminate_process_test_child.cc | 0 .../crashpad/util/win/scoped_handle.cc | 4 + .../crashpad/util/win/scoped_handle.h | 8 + .../crashpad/util/win/scoped_local_alloc.cc | 0 .../crashpad/util/win/scoped_local_alloc.h | 0 .../util/win/scoped_process_suspend.cc | 0 .../util/win/scoped_process_suspend.h | 0 .../util/win/scoped_process_suspend_test.cc | 0 .../crashpad/util/win/scoped_registry_key.h | 0 .../crashpad/util/win/scoped_set_event.cc | 0 .../crashpad/util/win/scoped_set_event.h | 0 .../crashpad/util/win/session_end_watcher.cc | 1 + .../crashpad/util/win/session_end_watcher.h | 0 .../util/win/session_end_watcher_test.cc | 0 .../crashpad/util/win/termination_codes.h | 0 .../external/crashpad/util/win/traits.h | 0 .../external/crashpad/util/win/xp_compat.h | 0 .../.github/workflows/build.yml | 0 .../external/libunwindstack-ndk/.gitignore | 0 .../external/libunwindstack-ndk/ArmExidx.cpp | 0 .../external/libunwindstack-ndk/ArmExidx.h | 0 .../libunwindstack-ndk/AsmGetRegsX86.S | 0 .../libunwindstack-ndk/AsmGetRegsX86_64.S | 0 .../external/libunwindstack-ndk/Check.h | 0 .../external/libunwindstack-ndk/Demangle.cpp | 55 + .../external/libunwindstack-ndk/DexFiles.cpp | 0 .../external/libunwindstack-ndk/DwarfCfa.cpp | 0 .../external/libunwindstack-ndk/DwarfCfa.h | 0 .../libunwindstack-ndk/DwarfDebugFrame.h | 0 .../libunwindstack-ndk/DwarfEhFrame.h | 0 .../DwarfEhFrameWithHdr.cpp | 0 .../libunwindstack-ndk/DwarfEhFrameWithHdr.h | 0 .../libunwindstack-ndk/DwarfEncoding.h | 0 .../libunwindstack-ndk/DwarfMemory.cpp | 0 .../external/libunwindstack-ndk/DwarfOp.cpp | 0 .../external/libunwindstack-ndk/DwarfOp.h | 0 .../libunwindstack-ndk/DwarfSection.cpp | 6 + .../external/libunwindstack-ndk/Elf.cpp | 4 + .../libunwindstack-ndk/ElfInterface.cpp | 27 +- .../libunwindstack-ndk/ElfInterfaceArm.cpp | 0 .../libunwindstack-ndk/ElfInterfaceArm.h | 9 +- .../external/libunwindstack-ndk/Global.cpp | 0 .../libunwindstack-ndk/GlobalDebugImpl.h | 3 + .../external/libunwindstack-ndk/JitDebug.cpp | 0 .../external/libunwindstack-ndk/LICENSE | 0 .../libunwindstack-ndk/LogAndroid.cpp | 27 + .../external/libunwindstack-ndk/LogStdout.cpp | 10 + .../external/libunwindstack-ndk/MapInfo.cpp | 0 .../external/libunwindstack-ndk/Maps.cpp | 2 +- .../external/libunwindstack-ndk/Memory.cpp | 286 +- .../libunwindstack-ndk/MemoryBuffer.h | 0 .../external/libunwindstack-ndk/MemoryCache.h | 0 .../libunwindstack-ndk/MemoryFileAtOffset.h | 0 .../external/libunwindstack-ndk/MemoryLocal.h | 0 .../external/libunwindstack-ndk/MemoryMte.cpp | 22 + .../libunwindstack-ndk/MemoryOffline.h | 0 .../libunwindstack-ndk/MemoryOfflineBuffer.h | 0 .../external/libunwindstack-ndk/MemoryRange.h | 0 .../libunwindstack-ndk/MemoryRemote.h | 0 .../external/libunwindstack-ndk/OWNERS | 0 .../external/libunwindstack-ndk/README.md | 0 .../external/libunwindstack-ndk/Regs.cpp | 45 +- .../external/libunwindstack-ndk/RegsArm.cpp | 0 .../external/libunwindstack-ndk/RegsArm64.cpp | 12 + .../external/libunwindstack-ndk/RegsInfo.h | 0 .../external/libunwindstack-ndk/RegsX86.cpp | 0 .../libunwindstack-ndk/RegsX86_64.cpp | 0 .../external/libunwindstack-ndk/Symbols.cpp | 59 +- .../external/libunwindstack-ndk/Symbols.h | 5 +- .../libunwindstack-ndk/ThreadEntry.cpp | 13 +- .../external/libunwindstack-ndk/ThreadEntry.h | 2 + .../libunwindstack-ndk/ThreadUnwinder.cpp | 11 +- .../external/libunwindstack-ndk/Unwinder.cpp | 24 +- .../libunwindstack-ndk/android-base/README.md | 0 .../android-base/errno_restorer.h | 0 .../libunwindstack-ndk/android-base/file.cpp | 0 .../libunwindstack-ndk/android-base/file.h | 0 .../android-base/log_main.h | 0 .../libunwindstack-ndk/android-base/logging.h | 0 .../libunwindstack-ndk/android-base/macros.h | 0 .../libunwindstack-ndk/android-base/off64_t.h | 0 .../android-base/parseint.h | 0 .../android-base/stringprintf.cpp | 0 .../android-base/stringprintf.h | 0 .../android-base/strings.cpp | 0 .../libunwindstack-ndk/android-base/strings.h | 0 .../libunwindstack-ndk/android-base/threads.h | 0 .../android-base/unique_fd.h | 0 .../libunwindstack-ndk/android-base/utf8.h | 0 .../libunwindstack-ndk/cmake/CMakeLists.txt | 0 .../libunwindstack-ndk/compat/string.h | 0 .../include/GlobalDebugInterface.h | 0 .../include/unwindstack/AndroidUnwinder.h | 1 + .../include/unwindstack/Arch.h | 3 + .../include/unwindstack/Demangle.h | 25 + .../include/unwindstack/DexFiles.h | 0 .../include/unwindstack/DwarfError.h | 0 .../include/unwindstack/DwarfLocation.h | 0 .../include/unwindstack/DwarfMemory.h | 0 .../include/unwindstack/DwarfSection.h | 9 +- .../include/unwindstack/DwarfStructs.h | 0 .../include/unwindstack/Elf.h | 6 + .../include/unwindstack/ElfInterface.h | 0 .../include/unwindstack/Error.h | 0 .../include/unwindstack/Global.h | 0 .../include/unwindstack/JitDebug.h | 0 .../include/unwindstack/Log.h | 0 .../include/unwindstack/MachineArm.h | 0 .../include/unwindstack/MachineArm64.h | 0 .../include/unwindstack/MachineX86.h | 0 .../include/unwindstack/MachineX86_64.h | 0 .../include/unwindstack/MapInfo.h | 0 .../include/unwindstack/Maps.h | 0 .../include/unwindstack/Memory.h | 0 .../include/unwindstack/Regs.h | 0 .../include/unwindstack/RegsArm.h | 0 .../include/unwindstack/RegsArm64.h | 0 .../include/unwindstack/RegsGetLocal.h | 45 + .../include/unwindstack/RegsX86.h | 0 .../include/unwindstack/RegsX86_64.h | 0 .../include/unwindstack/SharedString.h | 7 +- .../include/unwindstack/UcontextArm.h | 0 .../include/unwindstack/UcontextArm64.h | 0 .../include/unwindstack/UcontextX86.h | 0 .../include/unwindstack/UcontextX86_64.h | 0 .../include/unwindstack/Unwinder.h | 0 .../include/unwindstack/UserArm.h | 0 .../include/unwindstack/UserArm64.h | 0 .../include/unwindstack/UserX86.h | 0 .../include/unwindstack/UserX86_64.h | 0 .../libunwindstack-ndk/procinfo/README.md | 0 .../libunwindstack-ndk/procinfo/process.h | 0 .../libunwindstack-ndk/procinfo/process_map.h | 0 .../external/libunwindstack-ndk/unistdfix.h | 0 .../external/third_party/lss/.gitignore | 0 .../src/external/third_party/lss/DIR_METADATA | 12 + .../src/external/third_party/lss/LICENSE | 27 + .../src/external/third_party/lss/OWNERS | 2 + .../external/third_party/lss/README.md | 3 +- .../third_party/lss/codereview.settings | 0 .../third_party/lss/linux_syscall_support.h | 1122 +- .../external/third_party/lss/tests/.gitignore | 0 .../external/third_party/lss/tests/Makefile | 26 +- .../external/third_party/lss/tests/README.md | 0 .../third_party/lss/tests/fallocate.c | 6 +- .../third_party/lss/tests/getitimer.c | 84 + .../third_party/lss/tests/getrandom.c | 59 + .../external/third_party/lss/tests/lstat.c | 97 + .../third_party/lss/tests/setitimer.c | 90 + .../third_party/lss/tests/sigaction.c | 54 + .../third_party/lss/tests/sigtimedwait.c | 4 +- .../src/external/third_party/lss/tests/stat.c | 67 + .../third_party/lss/tests/test_skel.h | 23 +- .../external/third_party/lss/tests/unlink.c | 4 +- .../fuzzing-examples/macos-event.json | 0 .../fuzzing-examples/macos-session.json | 0 shared/sentry/{ => src}/include/sentry.h | 197 +- shared/sentry/src/sentry-config.cmake.in | 33 + shared/sentry/src/src/CMakeLists.txt | 156 + .../backends/sentry_backend_breakpad.cpp | 5 +- .../backends/sentry_backend_crashpad.cpp | 170 +- .../backends/sentry_backend_inproc.c | 43 +- .../{ => src}/backends/sentry_backend_none.c | 0 shared/sentry/src/src/exports.map | 4 + .../integrations/sentry_integration_qt.cpp | 0 .../integrations/sentry_integration_qt.h | 0 .../modulefinder/sentry_modulefinder_aix.c | 0 .../modulefinder/sentry_modulefinder_apple.c | 0 .../modulefinder/sentry_modulefinder_linux.c | 207 +- .../modulefinder/sentry_modulefinder_linux.h | 0 .../sentry_modulefinder_windows.c | 0 .../sentry/src/{ => src}/path/sentry_path.c | 0 .../src/{ => src}/path/sentry_path_unix.c | 20 +- .../src/{ => src}/path/sentry_path_windows.c | 54 +- shared/sentry/src/{ => src}/sentry_alloc.c | 0 shared/sentry/src/{ => src}/sentry_alloc.h | 0 shared/sentry/src/{ => src}/sentry_backend.c | 0 shared/sentry/src/{ => src}/sentry_backend.h | 0 shared/sentry/src/{ => src}/sentry_boot.h | 0 shared/sentry/src/{ => src}/sentry_core.c | 187 +- shared/sentry/src/{ => src}/sentry_core.h | 0 shared/sentry/src/{ => src}/sentry_database.c | 16 +- shared/sentry/src/{ => src}/sentry_database.h | 0 shared/sentry/src/{ => src}/sentry_envelope.c | 22 +- shared/sentry/src/{ => src}/sentry_envelope.h | 0 shared/sentry/src/{ => src}/sentry_info.c | 6 +- shared/sentry/src/{ => src}/sentry_json.c | 6 +- shared/sentry/src/{ => src}/sentry_json.h | 0 shared/sentry/src/{ => src}/sentry_logger.c | 0 shared/sentry/src/{ => src}/sentry_logger.h | 0 shared/sentry/src/{ => src}/sentry_options.c | 161 +- shared/sentry/src/{ => src}/sentry_options.h | 2 + shared/sentry/src/{ => src}/sentry_os.c | 0 shared/sentry/src/{ => src}/sentry_os.h | 0 shared/sentry/src/{ => src}/sentry_path.h | 2 + shared/sentry/src/{ => src}/sentry_random.c | 0 shared/sentry/src/{ => src}/sentry_random.h | 0 .../sentry/src/{ => src}/sentry_ratelimiter.c | 0 .../sentry/src/{ => src}/sentry_ratelimiter.h | 0 shared/sentry/src/{ => src}/sentry_scope.c | 10 +- shared/sentry/src/{ => src}/sentry_scope.h | 4 +- shared/sentry/src/{ => src}/sentry_session.c | 26 +- shared/sentry/src/{ => src}/sentry_session.h | 7 - shared/sentry/src/{ => src}/sentry_slice.c | 2 +- shared/sentry/src/{ => src}/sentry_slice.h | 0 shared/sentry/src/{ => src}/sentry_string.c | 0 shared/sentry/src/{ => src}/sentry_string.h | 26 +- .../sentry/src/{ => src}/sentry_symbolizer.h | 0 shared/sentry/src/{ => src}/sentry_sync.c | 19 +- shared/sentry/src/{ => src}/sentry_sync.h | 7 +- shared/sentry/src/{ => src}/sentry_tracing.c | 242 +- shared/sentry/src/{ => src}/sentry_tracing.h | 6 +- .../sentry/src/{ => src}/sentry_transport.c | 5 +- .../sentry/src/{ => src}/sentry_transport.h | 2 +- .../src/{ => src}/sentry_unix_pageallocator.c | 0 .../src/{ => src}/sentry_unix_pageallocator.h | 0 .../src/{ => src}/sentry_unix_spinlock.h | 0 shared/sentry/src/{ => src}/sentry_utils.c | 72 +- shared/sentry/src/{ => src}/sentry_utils.h | 23 +- shared/sentry/src/{ => src}/sentry_uuid.c | 10 +- shared/sentry/src/{ => src}/sentry_uuid.h | 0 shared/sentry/src/{ => src}/sentry_value.c | 156 +- shared/sentry/src/{ => src}/sentry_value.h | 0 .../src/{ => src}/sentry_windows_dbghelp.c | 0 .../src/{ => src}/sentry_windows_dbghelp.h | 0 .../symbolizer/sentry_symbolizer_unix.c | 0 .../symbolizer/sentry_symbolizer_windows.c | 0 .../transports/sentry_disk_transport.c | 0 .../transports/sentry_disk_transport.h | 0 .../transports/sentry_function_transport.c | 0 .../transports/sentry_transport_curl.c | 54 +- .../transports/sentry_transport_none.c | 0 .../transports/sentry_transport_winhttp.c | 9 +- .../src/{ => src}/unwinder/sentry_unwinder.c | 0 .../unwinder/sentry_unwinder_dbghelp.c | 20 +- .../unwinder/sentry_unwinder_libbacktrace.c | 0 .../sentry_unwinder_libunwindstack.cpp | 0 shared/sentry/{ => src}/tests/__init__.py | 0 shared/sentry/{ => src}/tests/assertions.py | 83 +- shared/sentry/{ => src}/tests/cmake.py | 2 +- shared/sentry/{ => src}/tests/conditions.py | 0 shared/sentry/{ => src}/tests/conftest.py | 7 + .../sentry/{ => src}/tests/fixtures/README.md | 0 .../{ => src}/tests/fixtures/libstdc++.so | Bin .../{ => src}/tests/fixtures/sentry_example | Bin shared/sentry/{ => src}/tests/fixtures/test.c | 0 .../{ => src}/tests/fixtures/with-buildid.so | Bin .../tests/fixtures/without-buildid-phdr.so | Bin 0 -> 15552 bytes .../tests/fixtures/without-buildid.so | Bin ...id-000000,sig-06,src-000560,op-havoc,rep-2 | 0 ...,sig-11,src-000033+000005,op-splice,rep-16 | Bin ...id-000000,sig-11,src-000320,op-havoc,rep-2 | Bin ...0,sig-11,src-000494+000073,op-splice,rep-8 | Bin ...,sig-11,src-000052+000222,op-splice,rep-32 | Bin ...,sig-11,src-000215+000415,op-splice,rep-16 | 0 ...,sig-11,src-000339+000110,op-splice,rep-16 | 0 ...,sig-11,src-000447+000419,op-splice,rep-32 | Bin ...,sig-11,src-000399+000468,op-splice,rep-32 | Bin ...4,sig-11,src-000440+000369,op-splice,rep-2 | Bin shared/sentry/{ => src}/tests/leaks.txt | 1 + shared/sentry/src/tests/requirements.txt | 4 + .../{ => src}/tests/test_build_static.py | 0 .../tests/test_integration_crashpad.py | 0 .../{ => src}/tests/test_integration_http.py | 49 +- .../tests/test_integration_ratelimits.py | 0 .../tests/test_integration_stdout.py | 45 +- shared/sentry/{ => src}/tests/test_unit.py | 0 .../{ => src}/tests/unit/.gitattributes | 0 .../{ => src}/tests/unit/CMakeLists.txt | 2 + shared/sentry/{ => src}/tests/unit/fuzz.c | 0 shared/sentry/{ => src}/tests/unit/main.c | 0 .../{ => src}/tests/unit/sentry_testsupport.h | 7 + .../{ => src}/tests/unit/test_attachments.c | 4 +- .../sentry/{ => src}/tests/unit/test_basic.c | 11 +- .../{ => src}/tests/unit/test_concurrency.c | 6 +- .../{ => src}/tests/unit/test_consent.c | 4 + .../{ => src}/tests/unit/test_envelopes.c | 78 +- .../{ => src}/tests/unit/test_failures.c | 0 .../{ => src}/tests/unit/test_fuzzfailures.c | 0 .../sentry/{ => src}/tests/unit/test_info.c | 0 .../sentry/{ => src}/tests/unit/test_logger.c | 0 .../{ => src}/tests/unit/test_modulefinder.c | 102 +- .../sentry/{ => src}/tests/unit/test_mpack.c | 0 shared/sentry/src/tests/unit/test_options.c | 54 + .../sentry/{ => src}/tests/unit/test_path.c | 20 + .../{ => src}/tests/unit/test_ratelimiter.c | 0 .../{ => src}/tests/unit/test_sampling.c | 0 .../{ => src}/tests/unit/test_session.c | 13 +- .../sentry/{ => src}/tests/unit/test_slice.c | 0 .../{ => src}/tests/unit/test_symbolizer.c | 0 .../sentry/{ => src}/tests/unit/test_sync.c | 0 .../{ => src}/tests/unit/test_tracing.c | 303 +- .../sentry/{ => src}/tests/unit/test_uninit.c | 0 .../{ => src}/tests/unit/test_unwinder.c | 0 .../sentry/{ => src}/tests/unit/test_utils.c | 117 +- .../sentry/{ => src}/tests/unit/test_uuid.c | 0 .../sentry/{ => src}/tests/unit/test_value.c | 222 +- shared/sentry/{ => src}/tests/unit/tests.inc | 42 +- shared/sentry/{ => src}/tests/valgrind.txt | 0 .../toolchains/msys2-mingw64-pkglist.txt | 0 .../sentry/{ => src}/toolchains/msys2.cmake | 0 shared/sentry/{ => src}/vendor/acutest.h | 0 shared/sentry/{ => src}/vendor/jsmn.h | 0 shared/sentry/{ => src}/vendor/mpack.c | 0 shared/sentry/{ => src}/vendor/mpack.h | 0 shared/sentry/{ => src}/vendor/stb_sprintf.c | 0 shared/sentry/{ => src}/vendor/stb_sprintf.h | 0 shared/sentry/tests/requirements.txt | 3 - shared/shared.pro | 5 +- tests/tests.pro | 5 + 2620 files changed, 57639 insertions(+), 28203 deletions(-) create mode 100644 applications/system-service/dbusservice.cpp create mode 100644 applications/system-service/digitizerhandler.cpp create mode 100644 applications/system-service/fifohandler.cpp create mode 100644 applications/system-service/powerapi.cpp create mode 100644 applications/system-service/wifiapi.cpp create mode 100644 shared/epaper/epaper.pro delete mode 100644 shared/epaper/libepaper.so rename {applications/system-service => shared/mxcfb}/mxcfb.h (100%) delete mode 100644 shared/sentry/CMakeLists.txt delete mode 100644 shared/sentry/external/breakpad/LICENSE delete mode 100644 shared/sentry/external/breakpad/docs/breakpad.png delete mode 100644 shared/sentry/external/breakpad/src/build/all.gyp delete mode 100644 shared/sentry/external/breakpad/src/build/common.gypi delete mode 100644 shared/sentry/external/breakpad/src/build/filename_rules.gypi delete mode 100755 shared/sentry/external/breakpad/src/build/gyp_breakpad delete mode 100644 shared/sentry/external/breakpad/src/build/testing.gyp delete mode 100644 shared/sentry/external/breakpad/src/client/windows/breakpad_client.gyp delete mode 100644 shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation.gyp delete mode 100644 shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.gyp delete mode 100644 shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.gyp delete mode 100644 shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp delete mode 100644 shared/sentry/external/breakpad/src/client/windows/unittests/client_tests.gyp delete mode 100644 shared/sentry/external/breakpad/src/client/windows/unittests/testing.gyp delete mode 100644 shared/sentry/external/breakpad/src/common/common.gyp delete mode 100644 shared/sentry/external/breakpad/src/common/linux/tests/auto_testfile.h delete mode 100644 shared/sentry/external/breakpad/src/common/mac/arch_utilities.cc delete mode 100644 shared/sentry/external/breakpad/src/common/windows/common_windows.gyp delete mode 100644 shared/sentry/external/breakpad/src/third_party/libdisasm/libdisasm.gyp delete mode 100644 shared/sentry/external/breakpad/src/third_party/mac_headers/README delete mode 100644 shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/vm_param.h delete mode 100644 shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine.h delete mode 100644 shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h delete mode 100644 shared/sentry/external/crashpad/build/BUILD.gn delete mode 100644 shared/sentry/external/crashpad/build/BUILDCONFIG.gn delete mode 100644 shared/sentry/external/crashpad/build/crashpad_buildconfig.gni delete mode 100644 shared/sentry/external/crashpad/build/crashpad_fuzzer_test.gni delete mode 100755 shared/sentry/external/crashpad/build/install_linux_sysroot.py delete mode 100644 shared/sentry/external/crashpad/build/ios/Default.png delete mode 100644 shared/sentry/external/crashpad/build/ios/Unittest-Info.plist delete mode 100755 shared/sentry/external/crashpad/build/ios/convert_gn_xcodeproj.py delete mode 100644 shared/sentry/external/crashpad/build/ios/setup_ios_gn.config delete mode 100755 shared/sentry/external/crashpad/build/ios/setup_ios_gn.py delete mode 100644 shared/sentry/external/crashpad/build/ios/xcodescheme-testable.template delete mode 100644 shared/sentry/external/crashpad/build/ios/xcodescheme.template delete mode 100755 shared/sentry/external/crashpad/build/run_tests.py delete mode 100644 shared/sentry/external/crashpad/build/test.gni delete mode 100644 shared/sentry/external/crashpad/client/annotation_test.cc delete mode 100644 shared/sentry/external/crashpad/doc/layering.png delete mode 100644 shared/sentry/external/crashpad/doc/overview.png delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/build/chromeos_buildflags.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.mm delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.mm delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsobject.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_typeref.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/BUILD.gn delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/build_config.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag.h delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag_header.gni delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/compiler.gni delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/config/BUILD.gn delete mode 100755 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/find_mac_sdk.py delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Application-Info.plist delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BUILD.gn delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BuildInfo.plist delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Module-Info.plist delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/XCTRunnerAddition+Info.plist delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/codesign.py delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/entitlements.plist delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/find_signing_identity.py delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/ios_sdk.gni delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/plist_util.py delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/rules.gni delete mode 100755 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/sdk_info.py delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/strip_arm64e.py delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/platform.gni delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/sysroot.gni delete mode 100644 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/win_helper.py delete mode 100755 shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/write_buildflag_header.py delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/BUILD.gn delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/OWNERS delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.c delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.h delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/fill_window_sse.c delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google.patch delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/DEPS delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.h delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.cc delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.h delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.h delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/inffast.h delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/simd_stub.c delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/x86.c delete mode 100644 shared/sentry/external/crashpad/third_party/zlib/zlib/x86.h delete mode 100644 shared/sentry/external/crashpad/util/misc/capture_context_fuchsia.S delete mode 100644 shared/sentry/external/crashpad/util/misc/capture_context_test_util_fuchsia.cc delete mode 100644 shared/sentry/external/crashpad/util/thread/thread_log_messages.cc delete mode 100644 shared/sentry/sentry-config.cmake.in create mode 100644 shared/sentry/sentry.pro create mode 100644 shared/sentry/src/.vscode/extensions.json create mode 100644 shared/sentry/src/.vscode/settings.json rename shared/sentry/{ => src}/CHANGELOG.md (75%) rename shared/sentry/{ => src}/CONTRIBUTING.md (98%) rename shared/sentry/{ => src}/LICENSE (100%) rename shared/sentry/{ => src}/README.md (95%) rename shared/sentry/{ => src}/examples/example.c (98%) rename shared/sentry/{ => src}/external/CMakeLists.txt (94%) rename shared/sentry/{ => src}/external/breakpad/.clang-format (100%) rename shared/sentry/{ => src}/external/breakpad/.github/workflows/build-test-ci.yml (100%) rename shared/sentry/{ => src}/external/breakpad/.github/workflows/coverity.yml (100%) rename shared/sentry/{ => src}/external/breakpad/.gitignore (96%) rename shared/sentry/{ => src}/external/breakpad/AUTHORS (100%) rename shared/sentry/{ => src}/external/breakpad/ChangeLog (100%) rename shared/sentry/{ => src}/external/breakpad/DEPS (73%) rename shared/sentry/{ => src}/external/breakpad/DIR_METADATA (100%) rename shared/sentry/{ => src}/external/breakpad/INSTALL (100%) create mode 100644 shared/sentry/src/external/breakpad/LICENSE rename shared/sentry/{ => src}/external/breakpad/Makefile.am (94%) rename shared/sentry/{ => src}/external/breakpad/Makefile.in (87%) rename shared/sentry/{ => src}/external/breakpad/NEWS (100%) rename shared/sentry/{ => src}/external/breakpad/OWNERS (100%) rename shared/sentry/{ => src}/external/breakpad/README.ANDROID (100%) rename shared/sentry/{ => src}/external/breakpad/README.md (100%) rename shared/sentry/{ => src}/external/breakpad/aclocal.m4 (97%) rename shared/sentry/{ => src}/external/breakpad/android/common-functions.sh (100%) rename shared/sentry/{ => src}/external/breakpad/android/google_breakpad/Android.mk (100%) rename shared/sentry/{ => src}/external/breakpad/android/run-checks.sh (100%) rename shared/sentry/{ => src}/external/breakpad/android/sample_app/README (100%) rename shared/sentry/{ => src}/external/breakpad/android/sample_app/jni/Android.mk (100%) rename shared/sentry/{ => src}/external/breakpad/android/sample_app/jni/Application.mk (100%) rename shared/sentry/{ => src}/external/breakpad/android/sample_app/jni/test_breakpad.cpp (100%) rename shared/sentry/{ => src}/external/breakpad/android/test-driver (100%) rename shared/sentry/{ => src}/external/breakpad/android/test-shell.sh (100%) rename shared/sentry/{ => src}/external/breakpad/appveyor.yml (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/ar-lib (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/compile (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/config.guess (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/config.sub (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/depcomp (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/install-sh (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/ltmain.sh (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/missing (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/root-test-driver (100%) rename shared/sentry/{ => src}/external/breakpad/autotools/test-driver (100%) rename shared/sentry/{ => src}/external/breakpad/breakpad-client.pc.in (100%) rename shared/sentry/{ => src}/external/breakpad/breakpad.pc.in (100%) rename shared/sentry/{ => src}/external/breakpad/codereview.settings (100%) rename shared/sentry/{ => src}/external/breakpad/configure (90%) rename shared/sentry/{ => src}/external/breakpad/configure.ac (94%) rename shared/sentry/{ => src}/external/breakpad/default.xml (82%) rename shared/sentry/{ => src}/external/breakpad/docs/OWNERS (100%) create mode 100644 shared/sentry/src/external/breakpad/docs/breakpad.png rename shared/sentry/{ => src}/external/breakpad/docs/breakpad.svg (100%) rename shared/sentry/{ => src}/external/breakpad/docs/client_design.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/contributing_to_breakpad.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/exception_handling.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/getting_started_with_breakpad.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/linux_core_handler.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/linux_starter_guide.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/linux_system_calls.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/mac_breakpad_starter_guide.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/mozilla_brown_bag_talk.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/processor_design.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/stack_walking.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/sym_upload_v2_protocol.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/symbol_files.md (100%) rename shared/sentry/{ => src}/external/breakpad/docs/windows_client_integration.md (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ax_append_compile_flags.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ax_append_flag.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ax_check_compile_flag.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ax_check_define.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ax_cxx_compile_stdcxx.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ax_pthread.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ax_require_defined.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/libtool.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ltoptions.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ltsugar.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/ltversion.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/m4/lt~obsolete.m4 (100%) rename shared/sentry/{ => src}/external/breakpad/src/breakpad_googletest_includes.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/apple/Framework/BreakpadDefines.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/Breakpad.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/Breakpad.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/Breakpad.xcodeproj/project.pbxproj (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/BreakpadController.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/BreakpadController.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/Breakpad_Prefix.pch (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/exception_handler_no_mach.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/exception_handler_no_mach.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/crash_generation/client_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/crash_generation/crash_generation_client.cc (91%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/crash_generation/crash_generation_client.h (92%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/crash_generation/crash_generation_server.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/crash_generation/crash_generation_server.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/data/linux-gate-amd.sym (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/data/linux-gate-intel.sym (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/dump_writer_common/mapping_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/dump_writer_common/thread_info.cc (93%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/dump_writer_common/thread_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc (93%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/handler/exception_handler.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/handler/exception_handler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/handler/exception_handler_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/handler/microdump_extra_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/handler/minidump_descriptor.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/handler/minidump_descriptor.h (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/log/log.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/log/log.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/microdump_writer/microdump_writer.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/microdump_writer/microdump_writer.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/cpu_set.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc (78%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/directory_reader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/line_reader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc (85%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_dumper.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_dumper.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc (95%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/minidump_writer.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/minidump_writer.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/pe_file.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/pe_file.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/pe_structs.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc (82%) rename shared/sentry/{ => src}/external/breakpad/src/client/linux/sender/google_crash_report_sender.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/Framework/Breakpad.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/Framework/Breakpad.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/Framework/Breakpad_Prefix.pch (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/Framework/Info.plist (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/Framework/OnDemandServer.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/Framework/OnDemandServer.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/UnitTests-Info.plist (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/ConfigFile.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/ConfigFile.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/Inspector.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/Inspector.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/InspectorMain.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/client_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/crash_generation_client.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/crash_generation_client.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/crash_generation_server.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/crash_generation/crash_generation_server.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/breakpad_nlist_64.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/breakpad_nlist_64.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/dynamic_images.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/dynamic_images.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/exception_handler.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/exception_handler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/mach_vm_compat.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/minidump_generator.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/minidump_generator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/minidump_tests32-Info.plist (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/minidump_tests64-Info.plist (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/obj-cTestCases-Info.plist (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/protected_memory_allocator.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/protected_memory_allocator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/dwarftests.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/dwarftests.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/handler/ucontext_compat.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/Breakpad.xib (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/English.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/ReporterIcon.graffle (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/crash_report_sender-Info.plist (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/crash_report_sender.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/crash_report_sender.icns (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/crash_report_sender.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/da.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/da.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/de.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/de.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/es.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/es.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/fr.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/fr.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/goArrow.png (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/it.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/it.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/ja.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/ja.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/nl.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/nl.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/no.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/no.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/sl.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/sl.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/sv.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/sv.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/tr.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/tr.lproj/Localizable.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/uploader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/sender/uploader.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/Controller.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/Controller.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/Info.plist (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/TestClass.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/TestClass.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/bomb.icns (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/crashInMain (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/crashduringload (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/testapp/main.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/tests/BreakpadFramework_Test.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/tests/crash_generation_server_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/tests/exception_handler_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/tests/minidump_generator_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/tests/minidump_generator_test_helper.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/tests/spawn_child_process.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/mac/tests/testlogging.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/minidump_file_writer-inl.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/minidump_file_writer.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/minidump_file_writer.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/minidump_file_writer_unittest.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/Makefile (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/exception_handler.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/exception_handler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/exception_handler_test.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/minidump_generator.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/minidump_generator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/minidump_test.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/solaris_lwp.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/solaris/handler/solaris_lwp.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/common/auto_critical_section.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/common/ipc_protocol.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/ReadMe.txt (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/client_info.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/client_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/crash_generation_client.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/crash_generation_client.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/crash_generation_server.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/crash_generation_server.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/minidump_generator.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/crash_generation/minidump_generator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/handler/exception_handler.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/handler/exception_handler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/sender/crash_report_sender.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/sender/crash_report_sender.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc (96%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.ico (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.rc (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/resource.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/tests/crash_generation_app/small.ico (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/crash_generation_server_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/dump_analysis.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/dump_analysis.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/exception_handler_death_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/exception_handler_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/exception_handler_test.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/client/windows/unittests/minidump_test.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/asm-mips/README.md (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/asm-mips/asm.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/asm-mips/fpregdef.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/asm-mips/regdef.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/elf.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/link.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/stab.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/sys/procfs.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/include/sys/user.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/testing/include/wchar.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/testing/mkdtemp.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/android/testing/pthread_fixes.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/basictypes.h (86%) rename shared/sentry/{ => src}/external/breakpad/src/common/byte_cursor.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/byte_cursor_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/convert_UTF.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/convert_UTF.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/bytereader-inl.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/bytereader.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/bytereader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/bytereader_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/cfi_assembler.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/cfi_assembler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2diehandler.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2diehandler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2enums.h (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2reader.cc (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2reader.h (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/dwarf2reader_test_common.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/elf_reader.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/elf_reader.h (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/functioninfo.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/functioninfo.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/line_state_machine.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf/types.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_cfi_to_module.cc (89%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_cfi_to_module.h (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_cfi_to_module_unittest.cc (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_cu_to_module.cc (94%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_cu_to_module.h (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_cu_to_module_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_line_to_module.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_line_to_module.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_line_to_module_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_range_list_handler.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/dwarf_range_list_handler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/language.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/language.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/breakpad_getcontext.S (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/breakpad_getcontext.h (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/breakpad_getcontext_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/crc32.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/crc32.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/dump_symbols.cc (83%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/dump_symbols.h (93%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/dump_symbols_unittest.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/eintr_wrapper.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elf_core_dump.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elf_core_dump.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elf_core_dump_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elf_gnu_compat.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elf_symbols_to_module.cc (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elf_symbols_to_module.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elf_symbols_to_module_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elfutils-inl.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elfutils.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/elfutils.h (83%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/file_id.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/file_id.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/file_id_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/google_crashdump_uploader.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/google_crashdump_uploader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/google_crashdump_uploader_test.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/guid_creator.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/guid_creator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/http_upload.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/http_upload.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/ignore_ret.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/libcurl_wrapper.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/libcurl_wrapper.h (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/linux_libc_support.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/linux_libc_support.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/linux_libc_support_unittest.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/memory_mapped_file.cc (89%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/memory_mapped_file.h (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/memory_mapped_file_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/safe_readlink.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/safe_readlink.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/safe_readlink_unittest.cc (98%) create mode 100644 shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.cc create mode 100644 shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.h create mode 100644 shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe_unittest.cc create mode 100644 shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.cc create mode 100644 shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.h create mode 100644 shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile_unittest.cc rename shared/sentry/{ => src}/external/breakpad/src/common/linux/symbol_collector_client.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/symbol_collector_client.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/symbol_upload.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/symbol_upload.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/synth_elf.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/synth_elf.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/synth_elf_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/tests/crash_generator.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/tests/crash_generator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/linux/ucontext_constants.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/long_string_dictionary.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/long_string_dictionary.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/long_string_dictionary_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/Breakpad.xcconfig (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/BreakpadDebug.xcconfig (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/BreakpadRelease.xcconfig (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/GTMDefines.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/GTMLogger.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/GTMLogger.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPGetRequest.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPGetRequest.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPMultipartUpload.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPMultipartUpload.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPPutRequest.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPPutRequest.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPRequest.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPRequest.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPSimplePostRequest.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/HTTPSimplePostRequest.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/MachIPC.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/MachIPC.mm (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/SymbolCollectorClient.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/SymbolCollectorClient.m (100%) create mode 100644 shared/sentry/src/external/breakpad/src/common/mac/arch_utilities.cc rename shared/sentry/{ => src}/external/breakpad/src/common/mac/arch_utilities.h (71%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/bootstrap_compat.cc (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/bootstrap_compat.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/byteswap.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/dump_syms.cc (79%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/dump_syms.h (75%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/encoding_util.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/encoding_util.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/file_id.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/file_id.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/launch_reporter.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/launch_reporter.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_id.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_id.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_reader.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_reader.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_reader_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_utilities.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_utilities.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_walker.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/macho_walker.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/minidump_upload.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/scoped_task_suspend-inl.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/string_utilities.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/string_utilities.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/super_fat_arch.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/testing/GTMSenTestCase.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/mac/testing/GTMSenTestCase.m (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/macros.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/md5.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/md5.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/memory_allocator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/memory_allocator_unittest.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/memory_range.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/memory_range_unittest.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/minidump_type_helper.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/module.cc (81%) rename shared/sentry/{ => src}/external/breakpad/src/common/module.h (87%) rename shared/sentry/{ => src}/external/breakpad/src/common/module_unittest.cc (78%) rename shared/sentry/{ => src}/external/breakpad/src/common/path_helper.cc (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/path_helper.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/safe_math.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/safe_math_unittest.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/scoped_ptr.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/simple_string_dictionary.cc (96%) rename shared/sentry/{ => src}/external/breakpad/src/common/simple_string_dictionary.h (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/simple_string_dictionary_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/solaris/dump_symbols.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/solaris/dump_symbols.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/solaris/file_id.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/solaris/file_id.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/solaris/guid_creator.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/solaris/guid_creator.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/solaris/message_output.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/stabs_reader.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/stabs_reader.h (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/stabs_reader_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/stabs_to_module.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/stabs_to_module.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/stabs_to_module_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/stdio_wrapper.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/string_conversion.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/string_conversion.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/string_conversion_unittest.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/string_view.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/symbol_data.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/test_assembler.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/test_assembler.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/test_assembler_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/testdata/func-line-pairing.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/tests/auto_tempdir.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/tests/file_utils.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/tests/file_utils.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/unordered.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/using_std_string.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/dia_util.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/dia_util.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/guid_string.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/guid_string.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/http_upload.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/http_upload.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/module_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/omap.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/omap.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/omap_internal.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/omap_unittest.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/pdb_source_line_writer.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/pdb_source_line_writer.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/pe_source_line_writer.cc (97%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/pe_source_line_writer.h (94%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/pe_util.cc (99%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/pe_util.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/string_utils-inl.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/string_utils.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/sym_upload_v2_protocol.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/sym_upload_v2_protocol.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/symbol_collector_client.cc (98%) rename shared/sentry/{ => src}/external/breakpad/src/common/windows/symbol_collector_client.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/config.h.in (97%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/breakpad_types.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_amd64.h (99%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_arm.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_arm64.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_mips.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_riscv.h (87%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_sparc.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_cpu_x86.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_exception_fuchsia.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_exception_linux.h (96%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_exception_mac.h (98%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_exception_ps3.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_exception_solaris.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_exception_win32.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_format.h (99%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/common/minidump_size.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/basic_source_line_resolver.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/call_stack.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/code_module.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/code_modules.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/dump_context.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/dump_object.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/exception_record.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/exploitability.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/fast_source_line_resolver.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/memory_region.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/microdump.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/microdump_processor.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/minidump.h (91%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/minidump_processor.h (89%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/proc_maps_linux.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/process_result.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/process_state.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/source_line_resolver_base.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/source_line_resolver_interface.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/stack_frame.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/stack_frame_cpu.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/stack_frame_symbolizer.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/stackwalker.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/symbol_supplier.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/google_breakpad/processor/system_info.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/COPYING (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/curl.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/curlbuild.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/curlrules.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/curlver.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/easy.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/mprintf.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/multi.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/stdcheaders.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/typecheck-gcc.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/curl/types.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/LICENSE (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/Makefile.am (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/README.breakpad (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/TODO (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_implicit.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_implicit.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_insn.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_insn.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_invariant.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_invariant.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_modrm.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_modrm.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_operand.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_operand.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_reg.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_reg.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_settings.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/ia32_settings.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/libdis.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/qword.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/Makefile (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/README (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/libdisasm.i (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/libdisasm_oop.i (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile-swig (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile.PL (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/python/Makefile-swig (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/ruby/Makefile-swig (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/ruby/extconf.rb (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/swig/tcl/Makefile-swig (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_disasm.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_format.c (99%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_imm.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_imm.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_insn.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_misc.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_operand_list.c (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/libdisasm/x86_operand_list.h (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/linux/include/gflags/gflags_completions.h (100%) create mode 100644 shared/sentry/src/external/breakpad/src/third_party/mac_headers/README rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/architecture/byte_order.h (86%) create mode 100644 shared/sentry/src/external/breakpad/src/third_party/mac_headers/arm/_types.h rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/i386/_types.h (81%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach-o/arch.h (67%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach-o/fat.h (74%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach-o/loader.h (87%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach-o/nlist.h (96%) create mode 100644 shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/boolean.h create mode 100644 shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/vm_types.h rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/boolean.h (90%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/i386/boolean.h (90%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/i386/vm_types.h (73%) create mode 100644 shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine.h rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/machine/boolean.h (92%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/machine/thread_state.h (81%) create mode 100644 shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/machine/vm_types.h (92%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/thread_status.h (80%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/mac_headers/mach/vm_prot.h (57%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/musl/COPYRIGHT (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/musl/README (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/musl/README.breakpad (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/musl/VERSION (100%) rename shared/sentry/{ => src}/external/breakpad/src/third_party/musl/include/elf.h (100%) rename shared/sentry/{ => src}/external/crashpad/.clang-format (100%) rename shared/sentry/{ => src}/external/crashpad/.gitattributes (100%) create mode 100644 shared/sentry/src/external/crashpad/.github/CODEOWNERS rename shared/sentry/{ => src}/external/crashpad/.github/workflows/build.yml (60%) rename shared/sentry/{ => src}/external/crashpad/.gitignore (100%) rename shared/sentry/{ => src}/external/crashpad/.gitmodules (100%) rename shared/sentry/{ => src}/external/crashpad/.gn (100%) rename shared/sentry/{ => src}/external/crashpad/.style.yapf (100%) rename shared/sentry/{ => src}/external/crashpad/.vpython3 (100%) rename shared/sentry/{ => src}/external/crashpad/AUTHORS (93%) rename shared/sentry/{ => src}/external/crashpad/BUILD.gn (96%) rename shared/sentry/{ => src}/external/crashpad/CMakeLists.txt (90%) rename shared/sentry/{ => src}/external/crashpad/CONTRIBUTORS (100%) rename shared/sentry/{ => src}/external/crashpad/DEPS (68%) rename shared/sentry/{ => src}/external/crashpad/LICENSE (100%) rename shared/sentry/{ => src}/external/crashpad/README.getsentry.md (100%) rename shared/sentry/{ => src}/external/crashpad/README.md (100%) rename shared/sentry/{ => src}/external/crashpad/client/BUILD.gn (87%) rename shared/sentry/{ => src}/external/crashpad/client/CMakeLists.txt (98%) rename shared/sentry/{ => src}/external/crashpad/client/annotation.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/annotation.h (71%) rename shared/sentry/{ => src}/external/crashpad/client/annotation_list.cc (75%) rename shared/sentry/{ => src}/external/crashpad/client/annotation_list.h (83%) rename shared/sentry/{ => src}/external/crashpad/client/annotation_list_test.cc (67%) create mode 100644 shared/sentry/src/external/crashpad/client/annotation_test.cc rename shared/sentry/{ => src}/external/crashpad/client/client_argv_handling.cc (94%) rename shared/sentry/{ => src}/external/crashpad/client/client_argv_handling.h (98%) rename shared/sentry/{ => src}/external/crashpad/client/crash_report_database.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/crash_report_database.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/crash_report_database_generic.cc (98%) rename shared/sentry/{ => src}/external/crashpad/client/crash_report_database_mac.mm (98%) rename shared/sentry/{ => src}/external/crashpad/client/crash_report_database_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/crash_report_database_win.cc (98%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client.h (95%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_fuchsia.cc (99%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_ios.cc (99%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_ios_test.mm (100%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_linux.cc (94%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_linux_test.cc (85%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_mac.cc (90%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_win.cc (96%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_client_win_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_info.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_info.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/crashpad_info_note.S (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/exception_processor.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/exception_processor.mm (92%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/exception_processor_test.mm (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/in_process_handler.cc (99%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/in_process_handler.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/in_process_handler_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc (95%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h (100%) create mode 100644 shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer.h create mode 100644 shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer_test.cc rename shared/sentry/{ => src}/external/crashpad/client/prune_crash_reports.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/prune_crash_reports.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/prune_crash_reports_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/pthread_create_linux.cc (98%) create mode 100644 shared/sentry/src/external/crashpad/client/ring_buffer_annotation.h create mode 100644 shared/sentry/src/external/crashpad/client/ring_buffer_annotation_load_test_main.cc create mode 100644 shared/sentry/src/external/crashpad/client/ring_buffer_annotation_test.cc rename shared/sentry/{ => src}/external/crashpad/client/settings.cc (79%) rename shared/sentry/{ => src}/external/crashpad/client/settings.h (88%) rename shared/sentry/{ => src}/external/crashpad/client/settings_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/simple_address_range_bag.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/simple_address_range_bag_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/simple_string_dictionary.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/simple_string_dictionary_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/simulate_crash.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/simulate_crash_ios.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/simulate_crash_linux.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/simulate_crash_mac.cc (98%) rename shared/sentry/{ => src}/external/crashpad/client/simulate_crash_mac.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/simulate_crash_mac_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/client/simulate_crash_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/client/upload_behavior_ios.h (100%) create mode 100644 shared/sentry/src/external/crashpad/cmake/toolchains/win_arm64.cmake rename shared/sentry/{ => src}/external/crashpad/codereview.settings (100%) rename shared/sentry/{ => src}/external/crashpad/compat/BUILD.gn (96%) rename shared/sentry/{ => src}/external/crashpad/compat/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/dlfcn_internal.cc (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/dlfcn_internal.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/elf.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/linux/elf.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/linux/prctl.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/linux/ptrace.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/sched.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/sys/epoll.cc (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/sys/epoll.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/sys/mman.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/sys/mman_mmap.cc (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/sys/syscall.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/android/sys/user.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/ios/mach/exc.defs (100%) rename shared/sentry/{ => src}/external/crashpad/compat/ios/mach/mach_exc.defs (100%) rename shared/sentry/{ => src}/external/crashpad/compat/ios/mach/mach_types.defs (100%) rename shared/sentry/{ => src}/external/crashpad/compat/ios/mach/machine/machine_types.defs (100%) rename shared/sentry/{ => src}/external/crashpad/compat/ios/mach/std_types.defs (100%) rename shared/sentry/{ => src}/external/crashpad/compat/linux/signal.h (89%) rename shared/sentry/{ => src}/external/crashpad/compat/linux/sys/mman.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/linux/sys/mman_memfd_create.cc (100%) rename shared/sentry/{ => src}/external/crashpad/compat/linux/sys/ptrace.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/linux/sys/user.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mac/Availability.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mac/AvailabilityVersions.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mac/kern/exc_resource.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mac/mach-o/loader.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mac/mach/i386/thread_state.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mac/mach/mach.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mac/sys/resource.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/mingw/dbghelp.h (92%) create mode 100644 shared/sentry/src/external/crashpad/compat/mingw/werapi.h rename shared/sentry/{ => src}/external/crashpad/compat/mingw/winnt.h (91%) rename shared/sentry/{ => src}/external/crashpad/compat/non_mac/mach-o/loader.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_mac/mach/mach.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_mac/mach/machine.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_mac/mach/vm_prot.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_win/dbghelp.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_win/minwinbase.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_win/timezoneapi.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_win/verrsrc.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_win/windows.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/non_win/winnt.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/getopt.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/strings.cc (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/strings.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/sys/time.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/sys/types.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/time.cc (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/time.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/winbase.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/winnt.h (100%) rename shared/sentry/{ => src}/external/crashpad/compat/win/winternl.h (100%) rename shared/sentry/{ => src}/external/crashpad/crashpad-config.cmake.in (100%) rename shared/sentry/{ => src}/external/crashpad/doc/.gitignore (100%) rename shared/sentry/{ => src}/external/crashpad/doc/appengine/README (100%) rename shared/sentry/{ => src}/external/crashpad/doc/appengine/src/crashpad-home/app.yaml (100%) rename shared/sentry/{ => src}/external/crashpad/doc/appengine/src/crashpad-home/main.go (98%) rename shared/sentry/{ => src}/external/crashpad/doc/developing.md (100%) rename shared/sentry/{ => src}/external/crashpad/doc/favicon.ico (100%) rename shared/sentry/{ => src}/external/crashpad/doc/ios_overview_design.md (100%) create mode 100644 shared/sentry/src/external/crashpad/doc/layering.png rename shared/sentry/{ => src}/external/crashpad/doc/man.md (94%) create mode 100644 shared/sentry/src/external/crashpad/doc/overview.png rename shared/sentry/{ => src}/external/crashpad/doc/overview_design.md (100%) rename shared/sentry/{ => src}/external/crashpad/doc/status.md (100%) rename shared/sentry/{ => src}/external/crashpad/doc/support/compat.sh (100%) rename shared/sentry/{ => src}/external/crashpad/doc/support/crashpad.doxy (100%) rename shared/sentry/{ => src}/external/crashpad/doc/support/crashpad.doxy.h (100%) rename shared/sentry/{ => src}/external/crashpad/doc/support/crashpad_doxygen.css (100%) rename shared/sentry/{ => src}/external/crashpad/doc/support/generate.sh (100%) rename shared/sentry/{ => src}/external/crashpad/doc/support/generate_doxygen.py (100%) rename shared/sentry/{ => src}/external/crashpad/doc/support/generate_git.sh (100%) rename shared/sentry/{ => src}/external/crashpad/example.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/handler/BUILD.gn (95%) rename shared/sentry/{ => src}/external/crashpad/handler/CMakeLists.txt (96%) rename shared/sentry/{ => src}/external/crashpad/handler/crash_report_upload_thread.cc (98%) rename shared/sentry/{ => src}/external/crashpad/handler/crash_report_upload_thread.h (98%) rename shared/sentry/{ => src}/external/crashpad/handler/crashpad_handler.md (99%) rename shared/sentry/{ => src}/external/crashpad/handler/crashpad_handler_main.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/crashpad_handler_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/crashpad_handler_test_extended_handler.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/handler_main.cc (99%) rename shared/sentry/{ => src}/external/crashpad/handler/handler_main.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/capture_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/capture_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/crash_report_exception_handler.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/crash_report_exception_handler.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/cros_crash_report_exception_handler.cc (89%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/cros_crash_report_exception_handler.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/exception_handler_server.cc (99%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/exception_handler_server.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/exception_handler_server_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/handler/linux/handler_trampoline.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/mac/crash_report_exception_handler.cc (98%) rename shared/sentry/{ => src}/external/crashpad/handler/mac/crash_report_exception_handler.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/mac/exception_handler_server.cc (97%) rename shared/sentry/{ => src}/external/crashpad/handler/mac/exception_handler_server.h (93%) rename shared/sentry/{ => src}/external/crashpad/handler/mac/file_limit_annotation.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/mac/file_limit_annotation.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/main.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/minidump_to_upload_parameters.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/minidump_to_upload_parameters.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/minidump_to_upload_parameters_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/prune_crash_reports_thread.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/prune_crash_reports_thread.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/user_stream_data_source.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/user_stream_data_source.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/.gitattributes (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/crash_other_program.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/crash_report_exception_handler.cc (97%) rename shared/sentry/{ => src}/external/crashpad/handler/win/crash_report_exception_handler.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/crashy_signal.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/crashy_test_program.cc (99%) rename shared/sentry/{ => src}/external/crashpad/handler/win/crashy_test_z7_loader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/fake_handler_that_crashes_at_startup.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/fastfail_test_program.cc (95%) rename shared/sentry/{ => src}/external/crashpad/handler/win/hanging_program.cc (99%) create mode 100644 shared/sentry/src/external/crashpad/handler/win/heap_corrupting_program.cc rename shared/sentry/{ => src}/external/crashpad/handler/win/loader_lock_dll.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/self_destroying_test_program.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/wer/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/wer/crashpad_wer.cc (98%) rename shared/sentry/{ => src}/external/crashpad/handler/win/wer/crashpad_wer.def (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/wer/crashpad_wer.h (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/wer/crashpad_wer.ver (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/wer/crashpad_wer_main.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/wer/crashpad_wer_module_unittest.cc (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/z7_test.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/handler/win/z7_test.dll (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/PRESUBMIT.py (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/generated/commit-queue.cfg (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/generated/cr-buildbucket.cfg (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/generated/luci-logdog.cfg (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/generated/luci-milo.cfg (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/generated/luci-scheduler.cfg (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/generated/project.cfg (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/generated/realms.cfg (100%) rename shared/sentry/{ => src}/external/crashpad/infra/config/main.star (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/.clang-format (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/LICENSE.TXT (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/cmake/Modules/HandleCompilerRT.cmake (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/cmake/Modules/HandleLibunwindFlags.cmake (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/cmake/config-ix.cmake (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/docs/BuildingLibunwind.rst (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/docs/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/docs/README.txt (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/docs/conf.py (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/docs/index.rst (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/include/__libunwind_config.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/include/libunwind.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/include/mach-o/compact_unwind_encoding.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/include/unwind.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/include/unwind_arm_ehabi.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/include/unwind_itanium.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/AddressSpace.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/CompactUnwinder.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/DwarfInstructions.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/DwarfParser.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/EHHeaderParser.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/FrameHeaderCache.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/RWMutex.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/Registers.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/Unwind-EHABI.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/Unwind-EHABI.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/Unwind-seh.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/Unwind-sjlj.c (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/UnwindCursor.hpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/UnwindLevel1-gcc-ext.c (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/UnwindLevel1.c (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/UnwindRegistersRestore.S (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/UnwindRegistersSave.S (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/Unwind_AppleExtras.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/assembly.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/cet_unwind.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/config.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/dwarf2.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/libunwind.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/src/libunwind_ext.h (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/alignment.compile.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/floatregister.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/forceunwind.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/frameheadercache_test.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/libunwind/__init__.py (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/libunwind/test/__init__.py (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/libunwind/test/config.py (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/libunwind_01.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/libunwind_02.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/lit.cfg.py (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/lit.site.cfg.in (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/remember_state_leak.pass.sh.s (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/signal_frame.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/signal_unwind.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/unw_getcontext.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/libunwind/test/unwind_leaffunction.pass.cpp (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_annotation_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_annotation_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_annotation_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_byte_array_writer.cc (98%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_byte_array_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_byte_array_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_context.h (93%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_context_writer.cc (85%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_context_writer.h (89%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_context_writer_test.cc (81%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_crashpad_info_writer.cc (93%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_crashpad_info_writer.h (97%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_crashpad_info_writer_test.cc (82%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_exception_writer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_exception_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_exception_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_extensions.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_extensions.h (93%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_file_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_file_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_file_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_handle_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_handle_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_handle_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_memory_info_writer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_memory_info_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_memory_info_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_memory_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_memory_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_memory_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_misc_info_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_misc_info_writer.h (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_misc_info_writer_test.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_module_crashpad_info_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_module_crashpad_info_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_module_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_module_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_module_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_rva_list_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_rva_list_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_rva_list_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_simple_string_dictionary_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_simple_string_dictionary_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_simple_string_dictionary_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_stacktrace_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_stacktrace_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_stream_writer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_stream_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_string_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_string_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_string_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_system_info_writer.cc (98%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_system_info_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_system_info_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_id_map.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_id_map.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_id_map_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_name_list_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_name_list_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_name_list_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_thread_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_unloaded_module_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_unloaded_module_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_unloaded_module_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_user_extension_stream_data_source.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_user_extension_stream_data_source.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_user_stream_writer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_user_stream_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_user_stream_writer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_writable.cc (99%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_writable.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_writable_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_writer_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/minidump_writer_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_context_test_util.cc (93%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_context_test_util.h (93%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_file_writer_test_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_file_writer_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_memory_writer_test_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_memory_writer_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_rva_list_test_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_rva_list_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_string_writer_test_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_string_writer_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_user_extension_stream_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_user_extension_stream_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_writable_test_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/minidump/test/minidump_writable_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/navbar.md (100%) rename shared/sentry/{ => src}/external/crashpad/package.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/BUILD.gn (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/CMakeLists.txt (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/annotation_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/annotation_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/capture_memory.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/capture_memory.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/cpu_architecture.h (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/cpu_context.cc (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/cpu_context.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/cpu_context_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_info_client_options.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_info_client_options.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_info_client_options_test.cc (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_info_client_options_test_module.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_info_size_test_module.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_info_size_test_note.S (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_types/image_annotation_reader.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_types/image_annotation_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_dynamic_array_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_dynamic_array_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader_fuzzer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/.gitattributes (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/crashpad_snapshot_test_both_dt_hash_styles.so (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/ret42 (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_image_reader_test_note.S (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_symbol_table_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/elf_symbol_table_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/module_snapshot_elf.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/module_snapshot_elf.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/elf/test_exported_symbols.sym (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/exception_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.cc (62%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.h (74%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.cc (87%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.h (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.cc (95%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.h (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.cc (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.cc (89%) rename shared/sentry/{ => src}/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.h (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/handle_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/handle_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/hash_types_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/intermediate_dump_reader_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/intermediate_dump_reader_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/testdata/crash-1fa088dda0adb41459d063078a0f384a0bb8eefa (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/testdata/crash-5726011582644224 (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/testdata/crash-6605504629637120 (100%) create mode 100644 shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-c44acfcbccd8c7a8 rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/capture_memory_delegate_linux.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/capture_memory_delegate_linux.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/cpu_context_linux.cc (93%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/cpu_context_linux.h (92%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/debug_rendezvous.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/debug_rendezvous.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/debug_rendezvous_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/exception_snapshot_linux.cc (91%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/exception_snapshot_linux.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/exception_snapshot_linux_test.cc (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/process_reader_linux.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/process_reader_linux.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/process_reader_linux_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/process_snapshot_linux.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/process_snapshot_linux.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/signal_context.h (90%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/system_snapshot_linux.cc (93%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/system_snapshot_linux.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/system_snapshot_linux_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/test_modules.cc (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/test_modules.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/thread_snapshot_linux.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/linux/thread_snapshot_linux.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/cpu_context_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/cpu_context_mac.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/cpu_context_mac_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/exception_snapshot_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/exception_snapshot_mac.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_no_op.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_reader.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_segment_reader.cc (93%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_segment_reader.h (95%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/module_snapshot_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/module_snapshot_mac.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_reader_mac.cc (95%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_reader_mac.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_reader_mac_test.cc (89%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_snapshot_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_snapshot_mac.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/all.proctype (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/annotation.proctype (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/crashpad_info.proctype (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/crashreporterclient.proctype (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/custom.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/dyld_images.proctype (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/flavors.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/internal.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/loader.proctype (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/nlist.proctype (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types/traits.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/process_types_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/system_snapshot_mac.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/system_snapshot_mac.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/system_snapshot_mac_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/thread_snapshot_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/mac/thread_snapshot_mac.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/memory_map_region_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/memory_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/memory_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/memory_snapshot_generic.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/memory_snapshot_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/exception_snapshot_minidump.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/exception_snapshot_minidump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/memory_snapshot_minidump.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/memory_snapshot_minidump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_annotation_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_annotation_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_context_converter.cc (90%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_context_converter.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_stream.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_string_list_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_string_list_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_string_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/minidump_string_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/module_snapshot_minidump.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/module_snapshot_minidump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/process_snapshot_minidump.cc (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/process_snapshot_minidump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/system_snapshot_minidump.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/system_snapshot_minidump.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/thread_snapshot_minidump.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/minidump/thread_snapshot_minidump.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/module_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/posix/timezone.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/posix/timezone.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/posix/timezone_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/process_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.cc (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.cc (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/sanitization_information.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/sanitization_information.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/sanitization_information_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/snapshot_constants.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/system_snapshot.h (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_cpu_context.cc (94%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_cpu_context.h (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_exception_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_exception_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_memory_map_region_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_memory_map_region_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_memory_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_memory_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_module_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_module_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_process_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_process_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_system_snapshot.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_system_snapshot.h (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_thread_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/test/test_thread_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/thread_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/unloaded_module_snapshot.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/unloaded_module_snapshot.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/capture_memory_delegate_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/capture_memory_delegate_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/cpu_context_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/cpu_context_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/cpu_context_win_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/crashpad_snapshot_test_annotations.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/crashpad_snapshot_test_crashing_child.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/crashpad_snapshot_test_dump_without_crashing.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader_module.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/end_to_end_test.py (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/exception_snapshot_win.cc (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/exception_snapshot_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/exception_snapshot_win_test.cc (86%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/extra_memory_ranges_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/memory_map_region_snapshot_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/memory_map_region_snapshot_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/module_snapshot_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/module_snapshot_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/module_snapshot_win_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/pe_image_annotations_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/pe_image_annotations_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/pe_image_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/pe_image_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/pe_image_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/pe_image_resource_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/pe_image_resource_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_reader_win.cc (96%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_reader_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_reader_win_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_snapshot_win.cc (99%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_snapshot_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_snapshot_win_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_subrange_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/process_subrange_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/system_snapshot_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/system_snapshot_win.h (98%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/system_snapshot_win_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/thread_snapshot_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/win/thread_snapshot_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/x86/cpuid_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/snapshot/x86/cpuid_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/BUILD.gn (98%) rename shared/sentry/{ => src}/external/crashpad/test/errors.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/errors.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/file.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/file.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/filesystem.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/filesystem.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/fuchsia_crashpad_tests.cml (98%) rename shared/sentry/{ => src}/external/crashpad/test/gtest_death.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/gtest_main.cc (99%) rename shared/sentry/{ => src}/external/crashpad/test/hex_string.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/hex_string.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/hex_string_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/ios/BUILD.gn (90%) rename shared/sentry/{ => src}/external/crashpad/test/ios/cptest_google_test_runner.mm (92%) rename shared/sentry/{ => src}/external/crashpad/test/ios/cptest_google_test_runner_delegate.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/ios/crash_type_xctest.mm (86%) rename shared/sentry/{ => src}/external/crashpad/test/ios/google_test_setup.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/ios/google_test_setup.mm (97%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/BUILD.gn (92%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/Info.plist (97%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/cptest_application_delegate.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/cptest_application_delegate.mm (86%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/cptest_crash_view_controller.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/cptest_crash_view_controller.mm (95%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/cptest_shared_object.h (95%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/handler_forbidden_allocators.cc (74%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/handler_forbidden_allocators.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/ios/host/main.mm (90%) rename shared/sentry/{ => src}/external/crashpad/test/linux/fake_ptrace_connection.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/linux/fake_ptrace_connection.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/linux/get_tls.cc (96%) rename shared/sentry/{ => src}/external/crashpad/test/linux/get_tls.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/mac/dyld.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/mac/dyld.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/mac/exception_swallower.cc (97%) rename shared/sentry/{ => src}/external/crashpad/test/mac/exception_swallower.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/mac/mach_errors.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/mac/mach_errors.h (91%) rename shared/sentry/{ => src}/external/crashpad/test/mac/mach_multiprocess.cc (97%) rename shared/sentry/{ => src}/external/crashpad/test/mac/mach_multiprocess.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/mac/mach_multiprocess_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/main_arguments.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/main_arguments.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/main_arguments_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_exec.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_exec.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_exec_fuchsia.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_exec_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_exec_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_exec_test_child.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_exec_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/multiprocess_posix_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/process_type.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/process_type.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_guarded_page.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_guarded_page_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_guarded_page_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_guarded_page_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_module_handle.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_module_handle.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_set_thread_name.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_set_thread_name_fuchsia.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_set_thread_name_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_set_thread_name_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_temp_dir.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_temp_dir.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_temp_dir_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_temp_dir_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/scoped_temp_dir_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/test_paths.cc (99%) rename shared/sentry/{ => src}/external/crashpad/test/test_paths.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/test_paths_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/test_paths_test_data_root.txt (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/child_launcher.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/child_launcher.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_child_process.cc (99%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_child_process.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_child_process_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_multiprocess.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_multiprocess.h (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_multiprocess_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_multiprocess_with_temp_dir.cc (100%) rename shared/sentry/{ => src}/external/crashpad/test/win/win_multiprocess_with_temp_dir.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/cpp-httplib/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/cpp-httplib/README.crashpad (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/cpp-httplib/cpp-httplib/LICENSE (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/cpp-httplib/cpp-httplib/README.md (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/cpp-httplib/cpp-httplib/httplib.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/edo/BUILD.gn (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/edo/README.crashpad (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/fuchsia/BUILD.gn (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/fuchsia/README.crashpad (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/fuchsia/runner.py (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/getopt/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/getopt/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/getopt/LICENSE (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/getopt/README.crashpad (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/getopt/getopt.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/getopt/getopt.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/googletest/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/googletest/README.crashpad (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/gyp/README.crashpad (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/linux/README.crashpad (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/README.crashpad (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss.h (91%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/.gitignore (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/DIR_METADATA (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/LICENSE (92%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/OWNERS (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/README.md (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/codereview.settings (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/linux_syscall_support.h (87%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/.gitignore (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/Makefile (91%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/README.md (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/fallocate.c (95%) create mode 100644 shared/sentry/src/external/crashpad/third_party/lss/lss/tests/getitimer.c rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/getrandom.c (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/lstat.c (96%) create mode 100644 shared/sentry/src/external/crashpad/third_party/lss/lss/tests/setitimer.c rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/sigaction.c (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/sigtimedwait.c (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/stat.c (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/test_skel.h (77%) rename shared/sentry/{ => src}/external/crashpad/third_party/lss/lss/tests/unlink.c (94%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/BUILD.gn (91%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/CMakeLists.txt (79%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/README.crashpad (96%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/.gitattributes (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/.gitignore (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/.style.yapf (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/AUTHORS (65%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/LICENSE (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/README.md (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/BUILD.gn (79%) create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/bridging.h create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.h create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.mm rename shared/sentry/{external/crashpad/third_party/mini_chromium/mini_chromium/base/mac => src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple}/mach_logging.cc (89%) create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/mach_logging.h rename shared/sentry/{external/crashpad/third_party/mini_chromium/mini_chromium/base/mac => src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple}/scoped_cftyperef.h (72%) rename shared/sentry/{external/crashpad/third_party/mini_chromium/mini_chromium/base/mac => src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple}/scoped_mach_port.cc (87%) rename shared/sentry/{external/crashpad/third_party/mini_chromium/mini_chromium/base/mac => src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple}/scoped_mach_port.h (65%) rename shared/sentry/{external/crashpad/third_party/mini_chromium/mini_chromium/base/mac => src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple}/scoped_mach_vm.cc (77%) rename shared/sentry/{external/crashpad/third_party/mini_chromium/mini_chromium/base/mac => src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple}/scoped_mach_vm.h (86%) rename shared/sentry/{external/crashpad/third_party/mini_chromium/mini_chromium/base/mac => src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple}/scoped_nsautorelease_pool.h (59%) create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_nsautorelease_pool.mm create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_typeref.h rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/auto_reset.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/bit_cast.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/check.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/check_op.h (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/compiler_specific.h (100%) create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/containers/span.h rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/cxx17_backports.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.cc (92%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.h (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.cc (96%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/format_macros.h (73%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.cc (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.h (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/close_nocancel.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h (84%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/free_deleter.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/scoped_policy.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_functions.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_macros.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/persistent_histogram_allocator.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/notreached.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_arm_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_arm_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_clang_gcc_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_shared_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/eintr_wrapper.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.cc (92%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.cc (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_generic.h (100%) create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.h create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.h create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat_internal.h rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.h (76%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.cc (93%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions_mac.mm (93%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.cc (92%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.cc (93%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h (84%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable_posix.cc (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.cc (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_posix.cc (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h (100%) create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/LICENSE (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/README.chromium (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.cc (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.h (89%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.cc (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_posix.cc (96%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_win.cc (99%) create mode 100644 shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/types/cxx23_to_underlying.h rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/codereview.settings (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/testing/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/mini_chromium/testing/platform_test.h (63%) rename shared/sentry/{ => src}/external/crashpad/third_party/mini_chromium/utf_string_conversion_utils.mingw.cc (100%) create mode 100644 shared/sentry/src/external/crashpad/third_party/ninja/README.crashpad create mode 100755 shared/sentry/src/external/crashpad/third_party/ninja/ninja rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/APPLE_LICENSE (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/BUILD.gn (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/EXTERNAL_HEADERS/mach-o/loader.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/README.crashpad (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/osfmk/mach/exc.defs (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/osfmk/mach/mach_exc.defs (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/osfmk/mach/mach_types.defs (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/osfmk/mach/machine/machine_types.defs (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/xnu/osfmk/mach/std_types.defs (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/BUILD.gn (94%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/CMakeLists.txt (84%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/README.crashpad (97%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/BUILD.gn create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/CMakeLists.txt create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/DIR_METADATA rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/LICENSE (90%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/OWNERS rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/README.chromium (67%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/adler32.c (77%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.c create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.h rename shared/sentry/{external/crashpad/third_party/zlib/zlib/names.h => src/external/crashpad/third_party/zlib/zlib/chromeconf.h} (79%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/compress.c (70%) create mode 100755 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/check.sh create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/zlib_bench.cc rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/ChangeLogUnzip (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/Makefile (100%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/README.chromium rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/crypt.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.c (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.h (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.c (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/miniunz.c (98%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.c (98%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.md rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.c (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.h (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.c (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.h (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.c (99%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.h (99%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/chunkcopy.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.c create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inflate.c create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/insert_string.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/DEPS create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/OWNERS create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/BUILD.gn create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/OWNERS create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_with_header_fuzzer.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/run_all_unittests.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/standalone_test_runner.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/utils_unittest.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.c create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.c create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.c create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.h rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/crc_folding.c (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/deflate.c (81%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/deflate.h (90%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/BUILD.gn create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/DEPS rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/OWNERS (77%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.h rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/compression_utils_unittest.cc (80%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/redact.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Different Encryptions.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Empty Dir Same Name As File.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Mixed Paths.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Parent Dir Same Name As File.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/README.md create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Repeated Dir Name.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Repeated File Name With Different Cases.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Repeated File Name.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/SJIS Bug 846195.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Windows Special Names.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Wrong CRC.zip rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/create_test_zip.sh (51%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/empty.zip rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/evil.zip (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_absolute_file_name.zip (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_invalid_utf8.zip (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test.zip (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo.txt (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar.txt (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/.hidden (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/baz.txt (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/quux.txt (100%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test_encrypted.zip rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test_mismatch_size.zip (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/test/data/test_nocompress.zip (100%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test_posix_permissions.zip create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.filelist create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.globlist create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.h rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/zip_internal.cc (56%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/google/zip_internal.h (69%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.h create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.cc create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.h rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/gzclose.c (93%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/gzguts.h (91%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/gzlib.c (89%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/gzread.c (91%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/gzwrite.c (90%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/infback.c (95%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/inffast.c (89%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffast.h rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/inffixed.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/inflate.c (93%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/inflate.h (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/inftrees.c (97%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/inftrees.h (78%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0000-build.patch rename shared/sentry/{external/crashpad/third_party/zlib/zlib/simd.patch => src/external/crashpad/third_party/zlib/zlib/patches/0001-simd.patch} (97%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0002-uninitializedcheck.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0003-uninitializedjump.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0004-fix-uwp.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0005-infcover-gtest.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0006-fix-check_match.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0007-zero-init-deflate-window.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0008-minizip-zip-unzip-tools.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0009-infcover-oob.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0010-cmake-enable-simd.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0011-avx512.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0012-lfs-open64.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0013-cpu-feature-detection-for-arm.patch create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/README create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/slide_hash_simd.h rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/trees.c (79%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/trees.h (100%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/uncompr.c (90%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/zconf.h (93%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.cmakein create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.in create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.3 rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/zlib.h (81%) create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.map create mode 100644 shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.pc.cmakein rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/zutil.c (84%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib/zutil.h (87%) rename shared/sentry/{ => src}/external/crashpad/third_party/zlib/zlib_crashpad.h (100%) rename shared/sentry/{ => src}/external/crashpad/tools/BUILD.gn (90%) rename shared/sentry/{ => src}/external/crashpad/tools/CMakeLists.txt (60%) rename shared/sentry/{ => src}/external/crashpad/tools/base94_encoder.cc (100%) rename shared/sentry/{ => src}/external/crashpad/tools/base94_encoder.md (100%) rename shared/sentry/{ => src}/external/crashpad/tools/crashpad_database_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/tools/crashpad_database_util.md (100%) rename shared/sentry/{ => src}/external/crashpad/tools/crashpad_http_upload.cc (100%) rename shared/sentry/{ => src}/external/crashpad/tools/crashpad_http_upload.md (100%) create mode 100644 shared/sentry/src/external/crashpad/tools/dump_minidump_annotations.cc rename shared/sentry/{ => src}/external/crashpad/tools/generate_dump.cc (98%) rename shared/sentry/{ => src}/external/crashpad/tools/generate_dump.md (100%) rename shared/sentry/{ => src}/external/crashpad/tools/mac/catch_exception_tool.cc (98%) rename shared/sentry/{ => src}/external/crashpad/tools/mac/catch_exception_tool.md (100%) rename shared/sentry/{ => src}/external/crashpad/tools/mac/exception_port_tool.cc (98%) rename shared/sentry/{ => src}/external/crashpad/tools/mac/exception_port_tool.md (100%) rename shared/sentry/{ => src}/external/crashpad/tools/mac/on_demand_service_tool.md (100%) rename shared/sentry/{ => src}/external/crashpad/tools/mac/on_demand_service_tool.mm (97%) rename shared/sentry/{ => src}/external/crashpad/tools/mac/sectaskaccess_info.plist (100%) rename shared/sentry/{ => src}/external/crashpad/tools/run_with_crashpad.cc (96%) rename shared/sentry/{ => src}/external/crashpad/tools/run_with_crashpad.md (94%) rename shared/sentry/{ => src}/external/crashpad/tools/tool_support.cc (100%) rename shared/sentry/{ => src}/external/crashpad/tools/tool_support.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/BUILD.gn (96%) rename shared/sentry/{ => src}/external/crashpad/util/CMakeLists.txt (90%) rename shared/sentry/{ => src}/external/crashpad/util/file/delimited_file_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/delimited_file_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/delimited_file_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/directory_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/directory_reader_posix.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/file/directory_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/directory_reader_win.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_helper.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_helper.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_io.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_io.h (99%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_io_posix.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_io_test.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_io_win.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_reader.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_seeker.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_seeker.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_writer.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/file/file_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/filesystem.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/filesystem_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/filesystem_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/file/filesystem_win.cc (84%) rename shared/sentry/{ => src}/external/crashpad/util/file/output_stream_file_writer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/output_stream_file_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/scoped_remove_file.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/scoped_remove_file.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/string_file.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/file/string_file.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/file/string_file_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/fuchsia/koid_utilities.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/fuchsia/koid_utilities.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/fuchsia/scoped_task_suspend.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/fuchsia/scoped_task_suspend.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/fuchsia/traits.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_data.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_data.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_format.h (99%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_interface.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_interface.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_list.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_list.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_map.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_map.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_object.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_object.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_writer.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_writer.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_intermediate_dump_writer_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_system_data_collector.h (97%) rename shared/sentry/{ => src}/external/crashpad/util/ios/ios_system_data_collector.mm (95%) rename shared/sentry/{ => src}/external/crashpad/util/ios/raw_logging.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/raw_logging.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/scoped_background_task.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/ios/scoped_background_task.mm (95%) create mode 100644 shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.cc create mode 100644 shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.h create mode 100644 shared/sentry/src/external/crashpad/util/ios/scoped_vm_map_test.cc rename shared/sentry/{ => src}/external/crashpad/util/ios/scoped_vm_read.cc (69%) rename shared/sentry/{ => src}/external/crashpad/util/ios/scoped_vm_read.h (89%) rename shared/sentry/{ => src}/external/crashpad/util/ios/scoped_vm_read_test.cc (54%) rename shared/sentry/{ => src}/external/crashpad/util/linux/address_types.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/auxiliary_vector.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/auxiliary_vector.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/auxiliary_vector_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/linux/checked_linux_address_range.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/direct_ptrace_connection.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/direct_ptrace_connection.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/exception_handler_client.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/linux/exception_handler_client.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/exception_handler_protocol.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/exception_handler_protocol.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/exception_information.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/initial_signal_dispositions.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/initial_signal_dispositions.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/memory_map.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/linux/memory_map.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/memory_map_test.cc (100%) create mode 100644 shared/sentry/src/external/crashpad/util/linux/pac_helper.cc create mode 100644 shared/sentry/src/external/crashpad/util/linux/pac_helper.h rename shared/sentry/{ => src}/external/crashpad/util/linux/proc_stat_reader.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/proc_stat_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/proc_stat_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/proc_task_reader.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/linux/proc_task_reader.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/proc_task_reader_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptrace_broker.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptrace_broker.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptrace_broker_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptrace_client.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptrace_client.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptrace_connection.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptracer.cc (94%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptracer.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/ptracer_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/scoped_pr_set_dumpable.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/scoped_pr_set_dumpable.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/scoped_pr_set_ptracer.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/scoped_pr_set_ptracer.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/scoped_ptrace_attach.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/scoped_ptrace_attach.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/scoped_ptrace_attach_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/socket.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/socket.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/socket_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/thread_info.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/linux/thread_info.h (90%) rename shared/sentry/{ => src}/external/crashpad/util/linux/traits.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/checked_mach_address_range.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/checked_mach_address_range_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/launchd.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/launchd.mm (79%) rename shared/sentry/{ => src}/external/crashpad/util/mac/launchd_test.mm (87%) rename shared/sentry/{ => src}/external/crashpad/util/mac/mac_util.cc (87%) rename shared/sentry/{ => src}/external/crashpad/util/mac/mac_util.h (98%) rename shared/sentry/{ => src}/external/crashpad/util/mac/mac_util_test.mm (82%) rename shared/sentry/{ => src}/external/crashpad/util/mac/service_management.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/service_management.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/service_management_test.mm (97%) rename shared/sentry/{ => src}/external/crashpad/util/mac/sysctl.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/sysctl.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/sysctl_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/xattr.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/mac/xattr.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mac/xattr_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/bootstrap.cc (91%) rename shared/sentry/{ => src}/external/crashpad/util/mach/bootstrap.h (90%) rename shared/sentry/{ => src}/external/crashpad/util/mach/bootstrap_test.cc (78%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port.defs (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port_handshake.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port_handshake.h (98%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port_handshake_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port_server.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port_server.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port_server_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/child_port_types.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/composite_mach_message_server.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/composite_mach_message_server.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/composite_mach_message_server_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exc_client_variants.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exc_client_variants.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exc_client_variants_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exc_server_variants.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exc_server_variants.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exc_server_variants_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_behaviors.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_behaviors.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_behaviors_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_ports.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_ports.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_ports_test.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_types.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_types.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/exception_types_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_extensions.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_extensions.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_extensions_test.cc (92%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_message.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_message.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_message_server.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_message_server.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_message_server_test.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mach_message_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mig.py (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mig_fix.py (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/mig_gen.py (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/notify_server.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/notify_server.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/notify_server_test.cc (95%) rename shared/sentry/{ => src}/external/crashpad/util/mach/scoped_task_suspend.cc (96%) rename shared/sentry/{ => src}/external/crashpad/util/mach/scoped_task_suspend.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/scoped_task_suspend_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/symbolic_constants_mach.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/symbolic_constants_mach.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/symbolic_constants_mach_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/mach/task_for_pid.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/mach/task_for_pid.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/address_sanitizer.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/address_types.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/arm64_pac_bti.S (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/arraysize.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/arraysize_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/as_underlying_type.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context.h (91%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_linux.S (82%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_mac.S (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_test.cc (89%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_test_util_linux.cc (89%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_test_util_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_test_util_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_win.asm (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_win_arm64.asm (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/capture_context_win_arm64.obj (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/clock.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/clock_mac.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/misc/clock_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/clock_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/clock_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/elf_note_types.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/from_pointer_cast.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/from_pointer_cast_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/implicit_cast.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/initialization_state.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/initialization_state_dcheck.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/initialization_state_dcheck.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/initialization_state_dcheck_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/initialization_state_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/lexing.cc (96%) rename shared/sentry/{ => src}/external/crashpad/util/misc/lexing.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/memory_sanitizer.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/metrics.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/metrics.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/no_cfi_icall.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/no_cfi_icall_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/paths.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/paths_fuchsia.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/paths_linux.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/paths_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/paths_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/paths_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/pdb_structures.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/pdb_structures.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/random_string.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/random_string.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/random_string_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/range_set.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/range_set.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/range_set_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/reinterpret_bytes.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/reinterpret_bytes.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/reinterpret_bytes_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/scoped_forbid_return.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/scoped_forbid_return.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/scoped_forbid_return_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/symbolic_constants_common.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/time.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/time.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/time_linux.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/time_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/time_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/tri_state.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/uuid.cc (96%) rename shared/sentry/{ => src}/external/crashpad/util/misc/uuid.h (97%) rename shared/sentry/{ => src}/external/crashpad/util/misc/uuid_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/zlib.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/misc/zlib.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/generate_test_server_key.py (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body_gzip.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body_gzip.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body_gzip_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body_test_util.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_body_test_util.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_headers.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_multipart_builder.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_multipart_builder.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_multipart_builder_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport.cc (93%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport.h (93%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport_libcurl.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport_mac.mm (64%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport_socket.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport_test_server.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/http_transport_win.cc (88%) rename shared/sentry/{ => src}/external/crashpad/util/net/testdata/ascii_http_body.txt (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/testdata/binary_http_body.dat (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/testdata/crashpad_util_test_cert.pem (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/testdata/crashpad_util_test_key.pem (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/tls.gni (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/url.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/url.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/net/url_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/checked_address_range.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/checked_address_range.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/checked_address_range_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/checked_range.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/checked_range_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/checked_vm_address_range.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/in_range_cast.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/in_range_cast_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/int128.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/int128_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/numeric/safe_assignment.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/close_multiple.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/posix/close_multiple.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/close_stdio.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/close_stdio.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/drop_privileges.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/drop_privileges.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/process_info.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/process_info_linux.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/posix/process_info_mac.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/posix/process_info_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/scoped_dir.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/scoped_dir.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/scoped_mmap.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/scoped_mmap.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/scoped_mmap_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/signals.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/signals.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/signals_test.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/posix/spawn_subprocess.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/spawn_subprocess.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/symbolic_constants_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/symbolic_constants_posix.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/posix/symbolic_constants_posix_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_id.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_fuchsia.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_fuchsia.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_linux.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_linux.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_mac.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_mac.h (98%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_mac_test.cc (97%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_native.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_range.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_range.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_range_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_sanitized.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_sanitized.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_sanitized_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_win.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/process/process_memory_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/aligned_allocator.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/aligned_allocator.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/aligned_allocator_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/map_insert.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/map_insert_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/objc.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/string_number_conversion.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/string_number_conversion.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/string_number_conversion_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/strlcpy.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/strlcpy.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/strlcpy_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/strnlen.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/strnlen.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/strnlen_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/thread_safe_vector.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stdlib/thread_safe_vector_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/base94_output_stream.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/base94_output_stream.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/base94_output_stream_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/file_encoder.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/file_encoder.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/file_encoder_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/file_output_stream.cc (98%) rename shared/sentry/{ => src}/external/crashpad/util/stream/file_output_stream.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/log_output_stream.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/log_output_stream.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/log_output_stream_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/output_stream_interface.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/test_output_stream.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/test_output_stream.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/zlib_output_stream.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/zlib_output_stream.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/stream/zlib_output_stream_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/string/split_string.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/string/split_string.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/string/split_string_test.cc (100%) create mode 100644 shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard.h create mode 100644 shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard_test.cc rename shared/sentry/{ => src}/external/crashpad/util/synchronization/semaphore.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/synchronization/semaphore_mac.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/synchronization/semaphore_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/synchronization/semaphore_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/synchronization/semaphore_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/stoppable.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/thread.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/thread.h (100%) create mode 100644 shared/sentry/src/external/crashpad/util/thread/thread_log_messages.cc rename shared/sentry/{ => src}/external/crashpad/util/thread/thread_log_messages.h (91%) rename shared/sentry/{ => src}/external/crashpad/util/thread/thread_log_messages_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/thread_posix.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/thread_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/thread_win.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/worker_thread.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/worker_thread.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/thread/worker_thread_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/address_types.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/checked_win_address_range.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/command_line.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/command_line.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/command_line_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/context_wrappers.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/critical_section_with_debug_info.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/critical_section_with_debug_info.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/critical_section_with_debug_info_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/exception_codes.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/exception_handler_server.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/win/exception_handler_server.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/exception_handler_server_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/get_function.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/get_function.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/get_function_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/get_module_information.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/get_module_information.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/handle.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/handle.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/handle_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/initial_client_data.cc (96%) rename shared/sentry/{ => src}/external/crashpad/util/win/initial_client_data.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/initial_client_data_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/loader_lock.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/loader_lock.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/loader_lock_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/loader_lock_test_dll.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/module_version.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/module_version.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/nt_internals.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/nt_internals.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/ntstatus_logging.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/ntstatus_logging.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/process_info.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/win/process_info.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/process_info_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/process_info_test_child.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/process_structs.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/registration_protocol_win.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/win/registration_protocol_win.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/registration_protocol_win_structs.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/registration_protocol_win_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/safe_terminate_process.asm (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/safe_terminate_process.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/safe_terminate_process_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/safe_terminate_process_test_child.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_handle.cc (89%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_handle.h (84%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_local_alloc.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_local_alloc.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_process_suspend.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_process_suspend.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_process_suspend_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_registry_key.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_set_event.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/scoped_set_event.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/session_end_watcher.cc (99%) rename shared/sentry/{ => src}/external/crashpad/util/win/session_end_watcher.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/session_end_watcher_test.cc (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/termination_codes.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/traits.h (100%) rename shared/sentry/{ => src}/external/crashpad/util/win/xp_compat.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/.github/workflows/build.yml (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/.gitignore (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ArmExidx.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ArmExidx.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/AsmGetRegsX86.S (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/AsmGetRegsX86_64.S (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Check.h (100%) create mode 100644 shared/sentry/src/external/libunwindstack-ndk/Demangle.cpp rename shared/sentry/{ => src}/external/libunwindstack-ndk/DexFiles.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfCfa.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfCfa.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfDebugFrame.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfEhFrame.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfEhFrameWithHdr.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfEhFrameWithHdr.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfEncoding.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfMemory.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfOp.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfOp.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/DwarfSection.cpp (99%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Elf.cpp (99%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ElfInterface.cpp (96%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ElfInterfaceArm.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ElfInterfaceArm.h (92%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Global.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/GlobalDebugImpl.h (99%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/JitDebug.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/LICENSE (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/LogAndroid.cpp (74%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/LogStdout.cpp (85%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MapInfo.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Maps.cpp (99%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Memory.cpp (71%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryBuffer.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryCache.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryFileAtOffset.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryLocal.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryMte.cpp (67%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryOffline.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryOfflineBuffer.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryRange.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/MemoryRemote.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/OWNERS (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/README.md (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Regs.cpp (84%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/RegsArm.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/RegsArm64.cpp (96%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/RegsInfo.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/RegsX86.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/RegsX86_64.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Symbols.cpp (78%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Symbols.h (94%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ThreadEntry.cpp (88%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ThreadEntry.h (96%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/ThreadUnwinder.cpp (92%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/Unwinder.cpp (96%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/README.md (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/errno_restorer.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/file.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/file.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/log_main.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/logging.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/macros.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/off64_t.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/parseint.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/stringprintf.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/stringprintf.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/strings.cpp (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/strings.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/threads.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/unique_fd.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/android-base/utf8.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/cmake/CMakeLists.txt (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/compat/string.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/GlobalDebugInterface.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/AndroidUnwinder.h (99%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Arch.h (93%) create mode 100644 shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Demangle.h rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/DexFiles.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/DwarfError.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/DwarfLocation.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/DwarfMemory.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/DwarfSection.h (95%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/DwarfStructs.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Elf.h (97%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/ElfInterface.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Error.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Global.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/JitDebug.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Log.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/MachineArm.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/MachineArm64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/MachineX86.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/MachineX86_64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/MapInfo.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Maps.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Memory.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Regs.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/RegsArm.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/RegsArm64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/RegsGetLocal.h (72%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/RegsX86.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/RegsX86_64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/SharedString.h (89%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UcontextArm.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UcontextArm64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UcontextX86.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UcontextX86_64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/Unwinder.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UserArm.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UserArm64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UserX86.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/include/unwindstack/UserX86_64.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/procinfo/README.md (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/procinfo/process.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/procinfo/process_map.h (100%) rename shared/sentry/{ => src}/external/libunwindstack-ndk/unistdfix.h (100%) rename shared/sentry/{ => src}/external/third_party/lss/.gitignore (100%) create mode 100644 shared/sentry/src/external/third_party/lss/DIR_METADATA create mode 100644 shared/sentry/src/external/third_party/lss/LICENSE create mode 100644 shared/sentry/src/external/third_party/lss/OWNERS rename shared/sentry/{ => src}/external/third_party/lss/README.md (99%) rename shared/sentry/{ => src}/external/third_party/lss/codereview.settings (100%) rename shared/sentry/{ => src}/external/third_party/lss/linux_syscall_support.h (81%) rename shared/sentry/{ => src}/external/third_party/lss/tests/.gitignore (100%) rename shared/sentry/{ => src}/external/third_party/lss/tests/Makefile (87%) rename shared/sentry/{ => src}/external/third_party/lss/tests/README.md (100%) rename shared/sentry/{ => src}/external/third_party/lss/tests/fallocate.c (95%) create mode 100644 shared/sentry/src/external/third_party/lss/tests/getitimer.c create mode 100644 shared/sentry/src/external/third_party/lss/tests/getrandom.c create mode 100644 shared/sentry/src/external/third_party/lss/tests/lstat.c create mode 100644 shared/sentry/src/external/third_party/lss/tests/setitimer.c create mode 100644 shared/sentry/src/external/third_party/lss/tests/sigaction.c rename shared/sentry/{ => src}/external/third_party/lss/tests/sigtimedwait.c (95%) create mode 100644 shared/sentry/src/external/third_party/lss/tests/stat.c rename shared/sentry/{ => src}/external/third_party/lss/tests/test_skel.h (75%) rename shared/sentry/{ => src}/external/third_party/lss/tests/unlink.c (94%) rename shared/sentry/{ => src}/fuzzing-examples/macos-event.json (100%) rename shared/sentry/{ => src}/fuzzing-examples/macos-session.json (100%) rename shared/sentry/{ => src}/include/sentry.h (88%) create mode 100644 shared/sentry/src/sentry-config.cmake.in create mode 100644 shared/sentry/src/src/CMakeLists.txt rename shared/sentry/src/{ => src}/backends/sentry_backend_breakpad.cpp (98%) rename shared/sentry/src/{ => src}/backends/sentry_backend_crashpad.cpp (77%) rename shared/sentry/src/{ => src}/backends/sentry_backend_inproc.c (91%) rename shared/sentry/src/{ => src}/backends/sentry_backend_none.c (100%) create mode 100644 shared/sentry/src/src/exports.map rename shared/sentry/src/{ => src}/integrations/sentry_integration_qt.cpp (100%) rename shared/sentry/src/{ => src}/integrations/sentry_integration_qt.h (100%) rename shared/sentry/src/{ => src}/modulefinder/sentry_modulefinder_aix.c (100%) rename shared/sentry/src/{ => src}/modulefinder/sentry_modulefinder_apple.c (100%) rename shared/sentry/src/{ => src}/modulefinder/sentry_modulefinder_linux.c (74%) rename shared/sentry/src/{ => src}/modulefinder/sentry_modulefinder_linux.h (100%) rename shared/sentry/src/{ => src}/modulefinder/sentry_modulefinder_windows.c (100%) rename shared/sentry/src/{ => src}/path/sentry_path.c (100%) rename shared/sentry/src/{ => src}/path/sentry_path_unix.c (97%) rename shared/sentry/src/{ => src}/path/sentry_path_windows.c (93%) rename shared/sentry/src/{ => src}/sentry_alloc.c (100%) rename shared/sentry/src/{ => src}/sentry_alloc.h (100%) rename shared/sentry/src/{ => src}/sentry_backend.c (100%) rename shared/sentry/src/{ => src}/sentry_backend.h (100%) rename shared/sentry/src/{ => src}/sentry_boot.h (100%) rename shared/sentry/src/{ => src}/sentry_core.c (85%) rename shared/sentry/src/{ => src}/sentry_core.h (100%) rename shared/sentry/src/{ => src}/sentry_database.c (96%) rename shared/sentry/src/{ => src}/sentry_database.h (100%) rename shared/sentry/src/{ => src}/sentry_envelope.c (96%) rename shared/sentry/src/{ => src}/sentry_envelope.h (100%) rename shared/sentry/src/{ => src}/sentry_info.c (69%) rename shared/sentry/src/{ => src}/sentry_json.c (98%) rename shared/sentry/src/{ => src}/sentry_json.h (100%) rename shared/sentry/src/{ => src}/sentry_logger.c (100%) rename shared/sentry/src/{ => src}/sentry_logger.h (100%) rename shared/sentry/src/{ => src}/sentry_options.c (71%) rename shared/sentry/src/{ => src}/sentry_options.h (97%) rename shared/sentry/src/{ => src}/sentry_os.c (100%) rename shared/sentry/src/{ => src}/sentry_os.h (100%) rename shared/sentry/src/{ => src}/sentry_path.h (97%) rename shared/sentry/src/{ => src}/sentry_random.c (100%) rename shared/sentry/src/{ => src}/sentry_random.h (100%) rename shared/sentry/src/{ => src}/sentry_ratelimiter.c (100%) rename shared/sentry/src/{ => src}/sentry_ratelimiter.h (100%) rename shared/sentry/src/{ => src}/sentry_scope.c (97%) rename shared/sentry/src/{ => src}/sentry_scope.h (96%) rename shared/sentry/src/{ => src}/sentry_session.c (95%) rename shared/sentry/src/{ => src}/sentry_session.h (90%) rename shared/sentry/src/{ => src}/sentry_slice.c (96%) rename shared/sentry/src/{ => src}/sentry_slice.h (100%) rename shared/sentry/src/{ => src}/sentry_string.c (100%) rename shared/sentry/src/{ => src}/sentry_string.h (85%) rename shared/sentry/src/{ => src}/sentry_symbolizer.h (100%) rename shared/sentry/src/{ => src}/sentry_sync.c (96%) rename shared/sentry/src/{ => src}/sentry_sync.h (97%) rename shared/sentry/src/{ => src}/sentry_tracing.c (68%) rename shared/sentry/src/{ => src}/sentry_tracing.h (86%) rename shared/sentry/src/{ => src}/sentry_transport.c (97%) rename shared/sentry/src/{ => src}/sentry_transport.h (97%) rename shared/sentry/src/{ => src}/sentry_unix_pageallocator.c (100%) rename shared/sentry/src/{ => src}/sentry_unix_pageallocator.h (100%) rename shared/sentry/src/{ => src}/sentry_unix_spinlock.h (100%) rename shared/sentry/src/{ => src}/sentry_utils.c (86%) rename shared/sentry/src/{ => src}/sentry_utils.h (89%) rename shared/sentry/src/{ => src}/sentry_uuid.c (94%) rename shared/sentry/src/{ => src}/sentry_uuid.h (100%) rename shared/sentry/src/{ => src}/sentry_value.c (89%) rename shared/sentry/src/{ => src}/sentry_value.h (100%) rename shared/sentry/src/{ => src}/sentry_windows_dbghelp.c (100%) rename shared/sentry/src/{ => src}/sentry_windows_dbghelp.h (100%) rename shared/sentry/src/{ => src}/symbolizer/sentry_symbolizer_unix.c (100%) rename shared/sentry/src/{ => src}/symbolizer/sentry_symbolizer_windows.c (100%) rename shared/sentry/src/{ => src}/transports/sentry_disk_transport.c (100%) rename shared/sentry/src/{ => src}/transports/sentry_disk_transport.h (100%) rename shared/sentry/src/{ => src}/transports/sentry_function_transport.c (100%) rename shared/sentry/src/{ => src}/transports/sentry_transport_curl.c (82%) rename shared/sentry/src/{ => src}/transports/sentry_transport_none.c (100%) rename shared/sentry/src/{ => src}/transports/sentry_transport_winhttp.c (97%) rename shared/sentry/src/{ => src}/unwinder/sentry_unwinder.c (100%) rename shared/sentry/src/{ => src}/unwinder/sentry_unwinder_dbghelp.c (78%) rename shared/sentry/src/{ => src}/unwinder/sentry_unwinder_libbacktrace.c (100%) rename shared/sentry/src/{ => src}/unwinder/sentry_unwinder_libunwindstack.cpp (100%) rename shared/sentry/{ => src}/tests/__init__.py (100%) rename shared/sentry/{ => src}/tests/assertions.py (76%) rename shared/sentry/{ => src}/tests/cmake.py (99%) rename shared/sentry/{ => src}/tests/conditions.py (100%) rename shared/sentry/{ => src}/tests/conftest.py (87%) rename shared/sentry/{ => src}/tests/fixtures/README.md (100%) rename shared/sentry/{ => src}/tests/fixtures/libstdc++.so (100%) rename shared/sentry/{ => src}/tests/fixtures/sentry_example (100%) rename shared/sentry/{ => src}/tests/fixtures/test.c (100%) rename shared/sentry/{ => src}/tests/fixtures/with-buildid.so (100%) create mode 100755 shared/sentry/src/tests/fixtures/without-buildid-phdr.so rename shared/sentry/{ => src}/tests/fixtures/without-buildid.so (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000000,sig-06,src-000560,op-havoc,rep-2 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000000,sig-11,src-000033+000005,op-splice,rep-16 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000000,sig-11,src-000320,op-havoc,rep-2 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000000,sig-11,src-000494+000073,op-splice,rep-8 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000001,sig-11,src-000052+000222,op-splice,rep-32 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000001,sig-11,src-000215+000415,op-splice,rep-16 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000002,sig-11,src-000339+000110,op-splice,rep-16 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000002,sig-11,src-000447+000419,op-splice,rep-32 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000003,sig-11,src-000399+000468,op-splice,rep-32 (100%) rename shared/sentry/{ => src}/tests/fuzzing-failures/id-000004,sig-11,src-000440+000369,op-splice,rep-2 (100%) rename shared/sentry/{ => src}/tests/leaks.txt (91%) create mode 100644 shared/sentry/src/tests/requirements.txt rename shared/sentry/{ => src}/tests/test_build_static.py (100%) rename shared/sentry/{ => src}/tests/test_integration_crashpad.py (100%) rename shared/sentry/{ => src}/tests/test_integration_http.py (93%) rename shared/sentry/{ => src}/tests/test_integration_ratelimits.py (100%) rename shared/sentry/{ => src}/tests/test_integration_stdout.py (86%) rename shared/sentry/{ => src}/tests/test_unit.py (100%) rename shared/sentry/{ => src}/tests/unit/.gitattributes (100%) rename shared/sentry/{ => src}/tests/unit/CMakeLists.txt (97%) rename shared/sentry/{ => src}/tests/unit/fuzz.c (100%) rename shared/sentry/{ => src}/tests/unit/main.c (100%) rename shared/sentry/{ => src}/tests/unit/sentry_testsupport.h (84%) rename shared/sentry/{ => src}/tests/unit/test_attachments.c (94%) rename shared/sentry/{ => src}/tests/unit/test_basic.c (93%) rename shared/sentry/{ => src}/tests/unit/test_concurrency.c (95%) rename shared/sentry/{ => src}/tests/unit/test_consent.c (89%) rename shared/sentry/{ => src}/tests/unit/test_envelopes.c (71%) rename shared/sentry/{ => src}/tests/unit/test_failures.c (100%) rename shared/sentry/{ => src}/tests/unit/test_fuzzfailures.c (100%) rename shared/sentry/{ => src}/tests/unit/test_info.c (100%) rename shared/sentry/{ => src}/tests/unit/test_logger.c (100%) rename shared/sentry/{ => src}/tests/unit/test_modulefinder.c (62%) rename shared/sentry/{ => src}/tests/unit/test_mpack.c (100%) create mode 100644 shared/sentry/src/tests/unit/test_options.c rename shared/sentry/{ => src}/tests/unit/test_path.c (90%) rename shared/sentry/{ => src}/tests/unit/test_ratelimiter.c (100%) rename shared/sentry/{ => src}/tests/unit/test_sampling.c (100%) rename shared/sentry/{ => src}/tests/unit/test_session.c (92%) rename shared/sentry/{ => src}/tests/unit/test_slice.c (100%) rename shared/sentry/{ => src}/tests/unit/test_symbolizer.c (100%) rename shared/sentry/{ => src}/tests/unit/test_sync.c (100%) rename shared/sentry/{ => src}/tests/unit/test_tracing.c (73%) rename shared/sentry/{ => src}/tests/unit/test_uninit.c (100%) rename shared/sentry/{ => src}/tests/unit/test_unwinder.c (100%) rename shared/sentry/{ => src}/tests/unit/test_utils.c (61%) rename shared/sentry/{ => src}/tests/unit/test_uuid.c (100%) rename shared/sentry/{ => src}/tests/unit/test_value.c (69%) rename shared/sentry/{ => src}/tests/unit/tests.inc (64%) rename shared/sentry/{ => src}/tests/valgrind.txt (100%) rename shared/sentry/{ => src}/toolchains/msys2-mingw64-pkglist.txt (100%) rename shared/sentry/{ => src}/toolchains/msys2.cmake (100%) rename shared/sentry/{ => src}/vendor/acutest.h (100%) rename shared/sentry/{ => src}/vendor/jsmn.h (100%) rename shared/sentry/{ => src}/vendor/mpack.c (100%) rename shared/sentry/{ => src}/vendor/mpack.h (100%) rename shared/sentry/{ => src}/vendor/stb_sprintf.c (100%) rename shared/sentry/{ => src}/vendor/stb_sprintf.h (100%) delete mode 100644 shared/sentry/tests/requirements.txt create mode 100644 tests/tests.pro diff --git a/Makefile b/Makefile index eaafe5c3a..a265ee600 100644 --- a/Makefile +++ b/Makefile @@ -11,37 +11,76 @@ MAKEFLAGS := --jobs=$(shell nproc) DIST=$(CURDIR)/release BUILD=$(CURDIR)/.build - ifneq ($(filter sentry,$(FEATURES)),) -OBJ += sentry -RELOBJ += $(DIST)/opt/lib/libsentry.so -DEFINES += 'DEFINES+="SENTRY"' +DEFINES += DEFINES+="SENTRY" endif OBJ += $(BUILD)/oxide/Makefile -clean: - rm -rf $(DIST) $(BUILD) +clean-base: + rm -rf $(DIST) $(BUILD)/oxide -release: clean build $(RELOBJ) - mkdir -p $(DIST) +clean: clean-base + rm -rf $(BUILD) + +release: clean-base build $(DIST) + # Force sentry makefile to regenerate so that install targets get when being build in toltecmk + cd $(BUILD)/oxide/shared/sentry && make qmake # Force liboxide makefile to regenerate so that install targets get when being build in toltecmk cd $(BUILD)/oxide/shared/liboxide && make qmake INSTALL_ROOT=$(DIST) $(MAKE) --output-sync=target -C $(BUILD)/oxide install -build: $(BUILD) $(OBJ) +build: $(OBJ) $(MAKE) --output-sync=target -C $(BUILD)/oxide all package: REV="~r$(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)" -package: +package: version.txt $(DIST) $(BUILD)/package/oxide.tar.gz + toltecmk \ + --verbose \ + -w $(BUILD)/package/build \ + -d $(BUILD)/package/dist \ + $(BUILD)/package + cp -a $(BUILD)/package/dist/rmall/*.ipk $(DIST) + +version.txt: if [ -d .git ];then \ echo $(REV) > version.txt; \ else \ echo "~manual" > version.txt; \ fi; + +$(DIST): + mkdir -p $(DIST) + +$(BUILD): + mkdir -p $(BUILD) + +$(BUILD)/.nobackup: $(BUILD) + touch $(BUILD)/.nobackup + +$(BUILD)/oxide: $(BUILD)/.nobackup + mkdir -p $(BUILD)/oxide + +$(BUILD)/oxide/Makefile: $(BUILD)/oxide + cd $(BUILD)/oxide && qmake -r $(DEFINES) $(CURDIR) + +$(BUILD)/package: mkdir -p $(BUILD)/package rm -rf $(BUILD)/package/build + +$(BUILD)/package/package: $(BUILD)/package sed "s/~VERSION~/`cat version.txt`/" ./package > $(BUILD)/package/package + +PKG_OBJ = oxide.pro Makefile +PKG_OBJ += $(wildcard applications/**) +PKG_OBJ += $(wildcard assets/**) +PKG_OBJ += $(wildcard interfaces/**) +PKG_OBJ += $(wildcard qmake/**) +PKG_OBJ += $(wildcard shared/**) +PKG_OBJ += $(wildcard tests/**) + +$(BUILD)/package/oxide.tar.gz: $(BUILD)/package/package $(PKG_OBJ) + rm -f $(BUILD)/package/oxide.tar.gz tar \ --exclude='$(CURDIR)/.git' \ --exclude='$(BUILD)' \ @@ -53,43 +92,6 @@ package: interfaces \ qmake \ shared \ + tests \ oxide.pro \ Makefile - toltecmk \ - --verbose \ - -w $(BUILD)/package/build \ - -d $(BUILD)/package/dist \ - $(BUILD)/package - mkdir -p $(DIST) - cp -a $(BUILD)/package/dist/rmall/*.ipk $(DIST) - -sentry: $(BUILD)/sentry/libsentry.so - -$(BUILD): - mkdir -p $(BUILD) - -$(BUILD)/.nobackup: $(BUILD) - touch $(BUILD)/.nobackup - -$(BUILD)/oxide: $(BUILD)/.nobackup - mkdir -p $(BUILD)/oxide - -$(BUILD)/oxide/Makefile: $(BUILD)/oxide - cd $(BUILD)/oxide && qmake -r $(DEFINES) $(CURDIR)/oxide.pro - -$(BUILD)/sentry/libsentry.so: $(BUILD)/.nobackup - cd shared/sentry && cmake -B $(BUILD)/sentry/src \ - -DBUILD_SHARED_LIBS=ON \ - -DSENTRY_INTEGRATION_QT=ON \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DSENTRY_PIC=OFF \ - -DSENTRY_BACKEND=breakpad \ - -DSENTRY_BREAKPAD_SYSTEM=OFF \ - -DSENTRY_EXPORT_SYMBOLS=ON \ - -DSENTRY_PTHREAD=ON - cd shared/sentry && cmake --build $(BUILD)/sentry/src --parallel - cd shared/sentry && cmake --install $(BUILD)/sentry/src --prefix $(BUILD)/sentry --config RelWithDebInfo - -$(DIST)/opt/lib/libsentry.so: sentry - mkdir -p $(DIST)/opt/lib - cp -a $(BUILD)/sentry/lib/libsentry.so $(DIST)/opt/lib/ diff --git a/applications/desktop-file-edit/desktop-file-edit.pro b/applications/desktop-file-edit/desktop-file-edit.pro index e7b171de0..54233adb1 100644 --- a/applications/desktop-file-edit/desktop-file-edit.pro +++ b/applications/desktop-file-edit/desktop-file-edit.pro @@ -20,4 +20,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/desktop-file-install/desktop-file-install.pro b/applications/desktop-file-install/desktop-file-install.pro index d41b248a1..68e94c6d0 100644 --- a/applications/desktop-file-install/desktop-file-install.pro +++ b/applications/desktop-file-install/desktop-file-install.pro @@ -20,4 +20,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/desktop-file-validate/desktop-file-validate.pro b/applications/desktop-file-validate/desktop-file-validate.pro index bae7481a5..982f7644d 100644 --- a/applications/desktop-file-validate/desktop-file-validate.pro +++ b/applications/desktop-file-validate/desktop-file-validate.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/gio/gio.pro b/applications/gio/gio.pro index e86bcaf03..84b25a9a8 100644 --- a/applications/gio/gio.pro +++ b/applications/gio/gio.pro @@ -29,4 +29,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/inject_evdev/inject_evdev.pro b/applications/inject_evdev/inject_evdev.pro index e09dd959e..e542401f0 100644 --- a/applications/inject_evdev/inject_evdev.pro +++ b/applications/inject_evdev/inject_evdev.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/launcher/launcher.pro b/applications/launcher/launcher.pro index 58940d7b9..dbfba87d8 100644 --- a/applications/launcher/launcher.pro +++ b/applications/launcher/launcher.pro @@ -50,4 +50,3 @@ PRECOMPILED_HEADER = \ oxide_stable.h include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/lockscreen/lockscreen.pro b/applications/lockscreen/lockscreen.pro index 8c79b51b5..a9c1d580d 100644 --- a/applications/lockscreen/lockscreen.pro +++ b/applications/lockscreen/lockscreen.pro @@ -28,4 +28,3 @@ RESOURCES += \ qml.qrc include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/notify-send/notify-send.pro b/applications/notify-send/notify-send.pro index 49c8d89c5..728af10b0 100644 --- a/applications/notify-send/notify-send.pro +++ b/applications/notify-send/notify-send.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/process-manager/process-manager.pro b/applications/process-manager/process-manager.pro index 7933c4388..d66d9dbd3 100755 --- a/applications/process-manager/process-manager.pro +++ b/applications/process-manager/process-manager.pro @@ -41,4 +41,3 @@ PRECOMPILED_HEADER = \ LIBS += -lsystemd include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/screenshot-tool/screenshot-tool.pro b/applications/screenshot-tool/screenshot-tool.pro index 5a68359d5..c05d80412 100644 --- a/applications/screenshot-tool/screenshot-tool.pro +++ b/applications/screenshot-tool/screenshot-tool.pro @@ -20,4 +20,3 @@ applications.path = /opt/usr/share/applications/ INSTALLS += applications include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/screenshot-viewer/controller.h b/applications/screenshot-viewer/controller.h index 01eeafec6..32d98259a 100644 --- a/applications/screenshot-viewer/controller.h +++ b/applications/screenshot-viewer/controller.h @@ -5,8 +5,7 @@ #include #include #include - -#include "epframebuffer.h" +#include #include "screenshotlist.h" diff --git a/applications/screenshot-viewer/screenshot-viewer.pro b/applications/screenshot-viewer/screenshot-viewer.pro index 3d162fce0..d7a6b7c72 100644 --- a/applications/screenshot-viewer/screenshot-viewer.pro +++ b/applications/screenshot-viewer/screenshot-viewer.pro @@ -41,4 +41,3 @@ PRECOMPILED_HEADER = \ anxiety_stable.h include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/settings-manager/settings-manager.pro b/applications/settings-manager/settings-manager.pro index e7046ca41..77234e57a 100644 --- a/applications/settings-manager/settings-manager.pro +++ b/applications/settings-manager/settings-manager.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/system-service/apibase.cpp b/applications/system-service/apibase.cpp index c295f2183..8e71ce3f4 100644 --- a/applications/system-service/apibase.cpp +++ b/applications/system-service/apibase.cpp @@ -21,4 +21,12 @@ int APIBase::hasPermission(QString permission, const char* sender){ return true; } +int APIBase::getSenderPid() { + if (!calledFromDBus()) { + return getpid(); + } + return connection().interface()->servicePid(message().service()); +} +int APIBase::getSenderPgid() { return getpgid(getSenderPid()); } + #include "moc_apibase.cpp" diff --git a/applications/system-service/apibase.h b/applications/system-service/apibase.h index b29b8a385..bd2013b7f 100644 --- a/applications/system-service/apibase.h +++ b/applications/system-service/apibase.h @@ -19,14 +19,9 @@ class APIBase : public QObject, protected QDBusContext { virtual void setEnabled(bool enabled) = 0; int hasPermission(QString permission, const char* sender = __builtin_FUNCTION()); -protected: - int getSenderPid(){ - if(!calledFromDBus()){ - return getpid(); - } - return connection().interface()->servicePid(message().service()); - } - int getSenderPgid(){ return getpgid(getSenderPid()); } + protected: + int getSenderPid(); + int getSenderPgid(); }; #endif // APIBASE_H diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index 2632c5f37..2426ad883 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -8,9 +8,12 @@ #include "application.h" #include "appsapi.h" #include "systemapi.h" -#include "buttonhandler.h" #include "digitizerhandler.h" #include "notificationapi.h" +#include "mxcfb.h" +#include "screenapi.h" +#include "buttonhandler.h" + using namespace Oxide::Applications; @@ -211,6 +214,14 @@ void Application::waitForResume(){ siginfo_t info; waitid(P_PID, m_process->processId(), &info, WCONTINUED); } + +void Application::sigUsr1(){ + timer.invalidate(); +} + +void Application::sigUsr2(){ + timer.invalidate(); +} void Application::resume(){ if(!hasPermission("apps")){ return; @@ -372,6 +383,10 @@ void Application::signal(int signal){ kill(-m_process->processId(), signal); } } + +QVariant Application::value(QString name, QVariant defaultValue){ return m_config.value(name, defaultValue); } + +void Application::setValue(QString name, QVariant value){ m_config[name] = value; } void Application::unregister(){ if(!hasPermission("apps")){ return; @@ -405,6 +420,105 @@ int Application::stateNoSecurityCheck(){ return Inactive; } } + +QString Application::icon(){ + auto _icon = value("icon", "").toString(); + if(_icon.isEmpty() || !_icon.contains("-") || QFile::exists(_icon)){ + return _icon; + } + auto path = Oxide::Applications::iconPath(_icon); + if(path.isEmpty()){ + return _icon; + } + return path; +} + +void Application::setIcon(QString icon){ + if(!hasPermission("permissions")){ + return; + } + setValue("icon", icon); + emit iconChanged(this->icon()); +} + +QString Application::splash(){ + auto _splash = value("splash", "").toString(); + if(_splash.isEmpty() || !_splash.contains("-") || QFile::exists(_splash)){ + return _splash; + } + auto path = Oxide::Applications::iconPath(_splash); + if(path.isEmpty()){ + return _splash; + } + return path; +} + +void Application::setSplash(QString splash){ + if(!hasPermission("permissions")){ + return; + } + setValue("splash", splash); + emit splashChanged(splash); +} + +QVariantMap Application::environment() { return value("environment", QVariantMap()).toMap(); } + +void Application::setEnvironment(QVariantMap environment){ + if(!hasPermission("permissions")){ + return; + } + for(auto key : environment.keys()){ + auto value = environment.value(key, QVariant()); + if(!value.isValid()){ + qDebug() << key << " has invalid value: " << value; + return; + } + } + setValue("environment", environment); + updateEnvironment(); + emit environmentChanged(environment); +} + +QString Application::workingDirectory() { return value("workingDirectory", "/").toString(); } + +void Application::setWorkingDirectory(const QString& workingDirectory){ + if(!hasPermission("permissions")){ + return; + } + QDir dir(workingDirectory); + if(!dir.exists()){ + return; + } + setValue("workingDirectory", workingDirectory); + emit workingDirectoryChanged(workingDirectory); +} + +bool Application::chroot(){ return flags().contains("chroot"); } + +QString Application::user(){ return value("user", getuid()).toString(); } + +QString Application::group(){ return value("group", getgid()).toString(); } + +QStringList Application::directories() { return value("directories", QStringList()).toStringList(); } + +void Application::setDirectories(QStringList directories){ + if(!hasPermission("permissions")){ + return; + } + setValue("directories", directories); + emit directoriesChanged(directories); +} + +QByteArray Application::screenCapture(){ + if(!hasPermission("permissions")){ + return QByteArray(); + } + return screenCaptureNoSecurityCheck(); +} + +QByteArray Application::screenCaptureNoSecurityCheck(){ return qUncompress(*m_screenCapture); } + +const QVariantMap& Application::getConfig(){ return m_config; } void Application::setConfig(const QVariantMap& config){ auto oldBin = bin(); m_config = config; @@ -418,6 +532,30 @@ void Application::setConfig(const QVariantMap& config){ setValue("bin", oldBin); } } + +void Application::saveScreen(){ + if(m_screenCapture != nullptr){ + return; + } + Oxide::Sentry::sentry_transaction("application", "saveScreen", [this](Oxide::Sentry::Transaction* t){ + qDebug() << "Saving screen..."; + QByteArray bytes; + Oxide::Sentry::sentry_span(t, "save", "Save the framebuffer", [&bytes]{ + QBuffer buffer(&bytes); + buffer.open(QIODevice::WriteOnly); + dispatchToMainThread([&buffer]{ + if(!EPFrameBuffer::framebuffer()->save(&buffer, "JPG", 100)){ + O_WARNING("Failed to save buffer"); + } + }); + }); + qDebug() << "Compressing data..."; + Oxide::Sentry::sentry_span(t, "compress", "Compress the framebuffer", [this, bytes]{ + m_screenCapture = new QByteArray(qCompress(bytes)); + }); + qDebug() << "Screen saved " << m_screenCapture->size() << "bytes"; + }); +} void Application::started(){ emit launched(); emit appsAPI->applicationLaunched(qPath()); @@ -432,6 +570,64 @@ void Application::finished(int exitCode){ unregister(); } } + +void Application::readyReadStandardError(){ + QString error = m_process->readAllStandardError(); + if(p_stderr != nullptr){ + *p_stderr << error.toStdString().c_str(); + p_stderr->flush(); + }else{ + const char* prefix = ("[" + name() + " " + QString::number(m_process->processId()) + "]").toUtf8(); + for(QString line : error.split(QRegularExpression("[\r\n]"), Qt::SkipEmptyParts)){ + if(!line.isEmpty()){ + sd_journal_print(LOG_ERR, "%s %s", prefix, (const char*)line.toUtf8()); + } + } + } +} + +void Application::readyReadStandardOutput(){ + QString output = m_process->readAllStandardOutput(); + if(p_stdout != nullptr){ + *p_stdout << output.toStdString().c_str(); + p_stdout->flush(); + }else{ + const char* prefix = ("[" + name() + " " + QString::number(m_process->processId()) + "]").toUtf8(); + for(QString line : output.split(QRegularExpression("[\r\n]"), Qt::SkipEmptyParts)){ + if(!line.isEmpty()){ + sd_journal_print(LOG_INFO, "%s %s", prefix, (const char*)line.toUtf8()); + } + } + } +} + +void Application::stateChanged(QProcess::ProcessState state){ + switch(state){ + case QProcess::Starting: + qDebug() << "Application" << name() << "is starting."; + break; + case QProcess::Running: + qDebug() << "Application" << name() << "is running."; + break; + case QProcess::NotRunning: + qDebug() << "Application" << name() << "is not running."; + if(sharedSettings.applicationUsage()){ + if(span != nullptr){ + Oxide::Sentry::stop_span(span); + delete span; + span = nullptr; + } + if(transaction != nullptr){ + Oxide::Sentry::stop_transaction(transaction); + delete transaction; + transaction = nullptr; + } + } + break; + default: + qDebug() << "Application" << name() << "unknown state" << state; + } +} void Application::errorOccurred(QProcess::ProcessError error){ switch(error){ case QProcess::FailedToStart: @@ -441,25 +637,307 @@ void Application::errorOccurred(QProcess::ProcessError error){ if(transient()){ unregister(); } - break; + break; case QProcess::Crashed: qDebug() << "Application" << name() << "crashed."; - break; + break; case QProcess::Timedout: qDebug() << "Application" << name() << "timed out."; - break; + break; case QProcess::WriteError: qDebug() << "Application" << name() << "unable to write to stdin."; - break; + break; case QProcess::ReadError: qDebug() << "Application" << name() << "unable to read from stdout or stderr."; - break; + break; case QProcess::UnknownError: default: qDebug() << "Application" << name() << "unknown error."; } } bool Application::hasPermission(QString permission, const char* sender){ return appsAPI->hasPermission(permission, sender); } + +void Application::delayUpTo(int milliseconds){ + timer.invalidate(); + timer.start(); + while(timer.isValid() && !timer.hasExpired(milliseconds)){ + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + } +} + +void Application::updateEnvironment(){ + auto env = QProcessEnvironment::systemEnvironment(); + auto envPath = env.value("PATH", DEFAULT_PATH).split(":"); + auto defaults = QString(DEFAULT_PATH).split(":"); + for(auto item : defaults){ + if(!envPath.contains(item)){ + envPath.append(item); + } + } + env.insert("PATH", envPath.join(":")); + auto preload = env.value("LD_PRELOAD", "").split(":"); + QString sysfs_preload("/opt/lib/libsysfs_preload.so"); + if(!preload.contains(sysfs_preload)){ + preload.append(sysfs_preload); + } + if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ + QString rm2fb_client("/opt/lib/librm2fb_client.so"); + if(!preload.contains(rm2fb_client)){ + preload.append(rm2fb_client); + } + } + env.insert("LD_PRELOAD", preload.join(":")); + for(auto key : environment().keys()){ + env.insert(key, environment().value(key, "").toString()); + } + m_process->setEnvironment(env.toStringList()); +} + +void Application::mkdirs(const QString& path, mode_t mode){ + QDir dir(path); + if(!dir.exists()){ + QString subpath = ""; + for(auto part : path.split("/")){ + subpath += "/" + part; + QDir dir(subpath); + if(!dir.exists()){ + mkdir(subpath.toStdString().c_str(), mode); + } + } + } +} + +void Application::bind(const QString& source, const QString& target, bool readOnly){ + umount(target); + if(QFileInfo(source).isDir()){ + mkdirs(target, 744); + }else{ + mkdirs(QFileInfo(target).dir().path(), 744); + } + auto ctarget = target.toStdString(); + auto csource = source.toStdString(); + qDebug() << "mount" << source << target; + if(mount(csource.c_str(), ctarget.c_str(), NULL, MS_BIND, NULL)){ + O_WARNING("Failed to create bindmount: " << ::strerror(errno)); + return; + } + if(!readOnly){ + return; + } + if(mount(csource.c_str(), ctarget.c_str(), NULL, MS_REMOUNT | MS_BIND | MS_RDONLY, NULL)){ + O_WARNING("Failed to remount bindmount read only: " << ::strerror(errno)); + } + qDebug() << "mount ro" << source << target; +} + +void Application::sysfs(const QString& path){ + mkdirs(path, 744); + umount(path); + qDebug() << "sysfs" << path; + if(mount("none", path.toStdString().c_str(), "sysfs", 0, "")){ + O_WARNING("Failed to mount sysfs: " << ::strerror(errno)); + } +} + +void Application::ramdisk(const QString& path){ + mkdirs(path, 744); + umount(path); + qDebug() << "ramdisk" << path; + if(mount("tmpfs", path.toStdString().c_str(), "tmpfs", 0, "size=249m,mode=755")){ + O_WARNING("Failed to create ramdisk: " << ::strerror(errno)); + } +} + +void Application::umount(const QString& path){ + if(!isMounted(path)){ + return; + } + auto cpath = path.toStdString(); + auto ret = ::umount2(cpath.c_str(), MNT_DETACH); + if((ret && ret != EINVAL && ret != ENOENT) || isMounted(path)){ + qDebug() << "umount failed" << path; + return; + } + QDir dir(path); + if(dir.exists()){ + rmdir(cpath.c_str()); + } + qDebug() << "umount" << path; +} + +FifoHandler* Application::mkfifo(const QString& name, const QString& target){ + if(isMounted(target)){ + O_WARNING(target << "Already mounted"); + return fifos.contains(name) ? fifos[name] : nullptr; + } + auto source = resourcePath() + "/" + name; + if(!QFile::exists(source)){ + if(::mkfifo(source.toStdString().c_str(), 0644)){ + O_WARNING("Failed to create " << name << " fifo: " << ::strerror(errno)); + } + } + if(!QFile::exists(source)){ + O_WARNING("No fifo for " << name); + return fifos.contains(name) ? fifos[name] : nullptr; + } + bind(source, target); + if(!fifos.contains(name)){ + qDebug() << "Creating fifo thread for" << source; + auto handler = new FifoHandler(name, source.toStdString().c_str(), this); + qDebug() << "Connecting fifo thread events for" << source; + connect(handler, &FifoHandler::finished, [this, name]{ + if(fifos.contains(name)){ + fifos.take(name); + } + }); + fifos[name] = handler; + qDebug() << "Starting fifo thread for" << source; + handler->start(); + qDebug() << "Fifo thread for " << source << "started"; + } + return fifos[name]; +} + +void Application::symlink(const QString& source, const QString& target){ + if(QFile::exists(source)){ + return; + } + qDebug() << "symlink" << source << target; + if(::symlink(target.toStdString().c_str(), source.toStdString().c_str())){ + O_WARNING("Failed to create symlink: " << ::strerror(errno)); + return; + } +} + +const QString Application::resourcePath() { return "/tmp/tarnish-chroot/" + name(); } + +const QString Application::chrootPath() { return resourcePath() + "/chroot"; } + +void Application::mountAll(){ + Oxide::Sentry::sentry_transaction("application", "mount", [this](Oxide::Sentry::Transaction* t){ +#ifdef SENTRY + if(t != nullptr){ + sentry_transaction_set_tag(t->inner, "application", name().toStdString().c_str()); + } +#endif + auto path = chrootPath(); + qDebug() << "Setting up chroot" << path; + Oxide::Sentry::sentry_span(t, "bind", "Bind directories", [this, path]{ + // System tmpfs folders + bind("/dev", path + "/dev"); + bind("/proc", path + "/proc"); + sysfs(path + "/sys"); + // Folders required to run things + bind("/bin", path + "/bin", true); + bind("/sbin", path + "/sbin", true); + bind("/lib", path + "/lib", true); + bind("/usr/lib", path + "/usr/lib", true); + bind("/usr/bin", path + "/usr/bin", true); + bind("/usr/sbin", path + "/usr/sbin", true); + bind("/opt/bin", path + "/opt/bin", true); + bind("/opt/lib", path + "/opt/lib", true); + bind("/opt/usr/bin", path + "/opt/usr/bin", true); + bind("/opt/usr/lib", path + "/opt/usr/lib", true); + }); + Oxide::Sentry::sentry_span(t, "ramdisk", "Create ramdisks", [this, path]{ + // tmpfs folders + mkdirs(path + "/tmp", 744); + if(!QFile::exists(path + "/run")){ + ramdisk(path + "/run"); + } + if(!QFile::exists(path + "/var/volatile")){ + ramdisk(path + "/var/volatile"); + } + }); + Oxide::Sentry::sentry_span(t, "configured", "Bind configured directories", [this, path]{ + // Configured folders + for(auto directory : directories()){ + bind(directory, path + directory); + } + }); + Oxide::Sentry::sentry_span(t, "fifo", "Create fifos", [this, path]{ + // Fake sys devices + auto fifo = mkfifo("powerState", path + "/sys/power/state"); + connect(fifo, &FifoHandler::dataRecieved, this, &Application::powerStateDataRecieved); + }); + Oxide::Sentry::sentry_span(t, "symlink", "Create symlinks", [this, path]{ + // Missing symlinks + symlink(path + "/var/run", "../run"); + symlink(path + "/var/lock", "../run/lock"); + symlink(path + "/var/tmp", "volatile/tmp"); + }); + }); +} + +void Application::umountAll(){ + Oxide::Sentry::sentry_transaction("application", "umount", [this](Oxide::Sentry::Transaction* t){ +#ifdef SENTRY + if(t != nullptr){ + sentry_transaction_set_tag(t->inner, "application", name().toStdString().c_str()); + } +#endif + auto path = chrootPath(); + Oxide::Sentry::sentry_span(t, "fifos", "Remove fifos", [this]{ + for(auto name : fifos.keys()){ + auto fifo = fifos.take(name); + fifo->quit(); + fifo->deleteLater(); + } + }); + QDir dir(path); + if(!dir.exists()){ + return; + } + qDebug() << "Tearing down chroot" << path; + Oxide::Sentry::sentry_span(t, "dirs", "Remove directories", [dir]{ + for(auto file : dir.entryList(QDir::Files)){ + QFile::remove(file); + } + }); + Oxide::Sentry::sentry_span(t, "umount", "Unmount all mounts", [this]{ + for(auto mount : getActiveApplicationMounts()){ + umount(mount); + } + }); + if(!getActiveApplicationMounts().isEmpty()){ + qDebug() << "Some items are still mounted in chroot" << path; + return; + } + Oxide::Sentry::sentry_span(t, "rm", "Remove final folder", [&dir]{ + dir.removeRecursively(); + }); + }); +} + +bool Application::isMounted(const QString& path){ return getActiveMounts().contains(path); } + +QStringList Application::getActiveApplicationMounts(){ + auto path = chrootPath() + "/"; + QStringList activeMounts = getActiveMounts().filter(QRegularExpression("^" + QRegularExpression::escape(path) + ".*")); + activeMounts.sort(Qt::CaseSensitive); + std::reverse(std::begin(activeMounts), std::end(activeMounts)); + return activeMounts; +} + +QStringList Application::getActiveMounts(){ + QFile mounts("/proc/mounts"); + if(!mounts.open(QIODevice::ReadOnly)){ + qDebug() << "Unable to open /proc/mounts"; + return QStringList(); + } + QString line; + QStringList activeMounts; + while(!(line = mounts.readLine()).isEmpty()){ + auto mount = line.section(' ', 1, 1); + if(mount.startsWith("/")){ + activeMounts.append(mount); + } + } + mounts.close(); + activeMounts.sort(Qt::CaseSensitive); + std::reverse(std::begin(activeMounts), std::end(activeMounts)); + return activeMounts; +} void Application::showSplashScreen(){ auto frameBuffer = EPFrameBuffer::framebuffer(); qDebug() << "Waiting for other painting to finish..."; @@ -469,7 +947,7 @@ void Application::showSplashScreen(){ sentry_transaction_set_tag(t->inner, "application", name().toStdString().c_str()); } #else - Q_UNUSED(t); + Q_UNUSED(t); #endif Oxide::Sentry::sentry_span(t, "wait", "Wait for screen to be ready", [frameBuffer](){ dispatchToMainThread([frameBuffer]{ @@ -503,9 +981,9 @@ void Application::showSplashScreen(){ QPoint( (size.width() / 2) - (splashWidth / 2), (size.height() / 2) - (splashWidth / 2) - ), + ), splashSize - ); + ); painter.drawImage(splashRect, splash, splash.rect()); EPFrameBuffer::sendUpdate(frameBuffer->rect(), EPFrameBuffer::HighQualityGrayscale, EPFrameBuffer::FullUpdate, true); } @@ -591,4 +1069,229 @@ void Application::recallScreen() { qDebug() << "Screen recalled."; }); } + +void Application::waitForFinished(){ + if(m_process->processId()){ + m_process->waitForFinished(); + } +} +Application::Application(QString path, QObject *parent) +: QObject(parent), + m_path(path), + m_backgrounded(false), + fifos() +{ + m_process = new SandBoxProcess(this); + connect(m_process, &SandBoxProcess::started, this, &Application::started); + connect( + m_process, + QOverload::of(&SandBoxProcess::finished), + [this](int exitCode, QProcess::ExitStatus status) { + Q_UNUSED(status); + finished(exitCode); + } + ); + connect( + m_process, + &SandBoxProcess::readyReadStandardError, + this, + &Application::readyReadStandardError + ); + connect( + m_process, + &SandBoxProcess::readyReadStandardOutput, + this, + &Application::readyReadStandardOutput + ); + connect( + m_process, + &SandBoxProcess::stateChanged, + this, + &Application::stateChanged + ); + connect( + m_process, + &SandBoxProcess::errorOccurred, + this, + &Application::errorOccurred + ); +} +Application::~Application() { + stopNoSecurityCheck(); + unregisterPath(); + if (m_screenCapture != nullptr) { + delete m_screenCapture; + } + umountAll(); + if (p_stdout != nullptr) { + p_stdout->flush(); + delete p_stdout; + } + if (p_stdout_fd > 0) { + close(p_stdout_fd); + p_stdout_fd = -1; + } + if (p_stderr != nullptr) { + p_stderr->flush(); + delete p_stderr; + } + if (p_stderr_fd > 0) { + close(p_stderr_fd); + p_stderr_fd = -1; + } +} +void Application::registerPath() { + auto bus = QDBusConnection::systemBus(); + bus.unregisterObject(path(), QDBusConnection::UnregisterTree); + if (bus.registerObject(path(), this, QDBusConnection::ExportAllContents)) { + qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; + } else { + qDebug() << "Failed to register" << path(); + } +} +void Application::unregisterPath() { + auto bus = QDBusConnection::systemBus(); + if (bus.objectRegisteredAt(path()) != nullptr) { + qDebug() << "Unregistered" << path(); + bus.unregisterObject(path()); + } +} +QDBusObjectPath Application::qPath() { return QDBusObjectPath(path()); } +QString Application::path() { return m_path; } +QString Application::name() { return value("name").toString(); } +int Application::processId() { return m_process->processId(); } +QStringList Application::permissions() { + return value("permissions", QStringList()).toStringList(); +} +void Application::setPermissions(QStringList permissions) { + if (!hasPermission("permissions")) { + return; + } + setValue("permissions", permissions); + emit permissionsChanged(permissions); +} +QString Application::displayName() { + return value("displayName", name()).toString(); +} +void Application::setDisplayName(QString displayName) { + if (!hasPermission("permissions")) { + return; + } + setValue("displayName", displayName); + emit displayNameChanged(displayName); +} +QString Application::description() { + return value("description", displayName()).toString(); +} + +QString Application::bin() { return value("bin").toString(); } +QString Application::onPause() { return value("onPause", "").toString(); } +void Application::setOnPause(QString onPause) { + if (!hasPermission("permissions")) { + return; + } + setValue("onPause", onPause); + emit onPauseChanged(onPause); +} +QString Application::onResume() { return value("onResume", "").toString(); } +void Application::setOnResume(QString onResume) { + if (!hasPermission("permissions")) { + return; + } + setValue("onResume", onResume); + emit onResumeChanged(onResume); +} +QString Application::onStop() { return value("onStop", "").toString(); } +void Application::setOnStop(QString onStop) { + if (!hasPermission("permissions")) { + return; + } + setValue("onStop", onStop); + emit onStopChanged(onStop); +} + +QStringList Application::flags() { return value("flags", QStringList()).toStringList(); } + +bool Application::autoStart() { return flags().contains("autoStart"); } + +void Application::setAutoStart(bool autoStart) { + if(!hasPermission("permissions")){ + return; + } + if(!autoStart){ + flags().removeAll("autoStart"); + autoStartChanged(autoStart); + }else if(!this->autoStart()){ + flags().append("autoStart"); + autoStartChanged(autoStart); + } +} + +bool Application::systemApp() { return flags().contains("system"); } + +bool Application::transient() { return flags().contains("transient"); } + +bool Application::hidden() { return flags().contains("hidden"); } + +int Application::type() { return (int)value("type", 0).toInt(); } + +int Application::state(){ + if(!hasPermission("apps")){ + return Inactive; + } + return stateNoSecurityCheck(); +} + +bool SandBoxProcess::setUser(const QString& name){ + try{ + m_uid = Oxide::getUID(name); + return true; + } + catch(const std::runtime_error&){ + return false; + } +} + +bool SandBoxProcess::setGroup(const QString& name){ + try{ + m_gid = Oxide::getGID(name); + return true; + } + catch(const std::runtime_error&){ + return false; + } +} + +bool SandBoxProcess::setChroot(const QString& path){ + if(path.isEmpty() || path == "/"){ + m_chroot = ""; + return true; + } + QDir dir(path); + if(dir.exists()){ + m_chroot = path; + return true; + } + return false; +} + +void SandBoxProcess::setMask(mode_t mask){ + m_mask = mask; +} + +void SandBoxProcess::setupChildProcess() { + // Drop all privileges in the child process + setgroups(0, 0); + if(!m_chroot.isEmpty()){ + // enter a chroot jail. + chroot(m_chroot.toStdString().c_str()); + } + // Change to correct user + setresgid(m_gid, m_gid, m_gid); + setresuid(m_uid, m_uid, m_uid); + umask(m_mask); + setsid(); + prctl(PR_SET_PDEATHSIG, SIGTERM); +} + #include "moc_application.cpp" diff --git a/applications/system-service/application.h b/applications/system-service/application.h index 6bed93a00..a752abc66 100644 --- a/applications/system-service/application.h +++ b/applications/system-service/application.h @@ -31,10 +31,7 @@ #include #include -#include "mxcfb.h" -#include "screenapi.h" #include "fifohandler.h" -#include "buttonhandler.h" // Must be included so that generate_xml.sh will work #include "../../shared/liboxide/meta.h" @@ -48,55 +45,13 @@ class SandBoxProcess : public QProcess{ SandBoxProcess(QObject* parent = nullptr) : QProcess(parent), m_gid(0), m_uid(0), m_chroot(""), m_mask(0) {} - bool setUser(const QString& name){ - try{ - m_uid = Oxide::getUID(name); - return true; - } - catch(const std::runtime_error&){ - return false; - } - } - bool setGroup(const QString& name){ - try{ - m_gid = Oxide::getGID(name); - return true; - } - catch(const std::runtime_error&){ - return false; - } - } - bool setChroot(const QString& path){ - if(path.isEmpty() || path == "/"){ - m_chroot = ""; - return true; - } - QDir dir(path); - if(dir.exists()){ - m_chroot = path; - return true; - } - return false; - } - void setMask(mode_t mask){ - m_mask = mask; - } + bool setUser(const QString& name); + bool setGroup(const QString& name); + bool setChroot(const QString& path); + void setMask(mode_t mask); protected: - void setupChildProcess() override { - // Drop all privileges in the child process - setgroups(0, 0); - if(!m_chroot.isEmpty()){ - // enter a chroot jail. - chroot(m_chroot.toStdString().c_str()); - } - // Change to correct user - setresgid(m_gid, m_gid, m_gid); - setresuid(m_uid, m_uid, m_uid); - umask(m_mask); - setsid(); - prctl(PR_SET_PDEATHSIG, SIGTERM); - } + void setupChildProcess() override; private: gid_t m_gid; @@ -136,61 +91,13 @@ class Application : public QObject{ public: Application(QDBusObjectPath path, QObject* parent) : Application(path.path(), parent) {} - Application(QString path, QObject* parent) : QObject(parent), m_path(path), m_backgrounded(false), fifos() { - m_process = new SandBoxProcess(this); - connect(m_process, &SandBoxProcess::started, this, &Application::started); - connect(m_process, QOverload::of(&SandBoxProcess::finished), [=](int exitCode, QProcess::ExitStatus status){ - Q_UNUSED(status); - finished(exitCode); - }); - connect(m_process, &SandBoxProcess::readyReadStandardError, this, &Application::readyReadStandardError); - connect(m_process, &SandBoxProcess::readyReadStandardOutput, this, &Application::readyReadStandardOutput); - connect(m_process, &SandBoxProcess::stateChanged, this, &Application::stateChanged); - connect(m_process, &SandBoxProcess::errorOccurred, this, &Application::errorOccurred); - } - ~Application() { - stopNoSecurityCheck(); - unregisterPath(); - if(m_screenCapture != nullptr){ - delete m_screenCapture; - } - umountAll(); - if(p_stdout != nullptr){ - p_stdout->flush(); - delete p_stdout; - } - if(p_stdout_fd > 0){ - close(p_stdout_fd); - p_stdout_fd = -1; - } - if(p_stderr != nullptr){ - p_stderr->flush(); - delete p_stderr; - } - if(p_stderr_fd > 0){ - close(p_stderr_fd); - p_stderr_fd = -1; - } - } + Application(QString path, QObject *parent); + ~Application(); - QString path() { return m_path; } - QDBusObjectPath qPath(){ return QDBusObjectPath(path()); } - void registerPath(){ - auto bus = QDBusConnection::systemBus(); - bus.unregisterObject(path(), QDBusConnection::UnregisterTree); - if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; - }else{ - qDebug() << "Failed to register" << path(); - } - } - void unregisterPath(){ - auto bus = QDBusConnection::systemBus(); - if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); - bus.unregisterObject(path()); - } - } + QString path(); + QDBusObjectPath qPath(); + void registerPath(); + void unregisterPath(); enum ApplicationState { Inactive, InForeground, InBackground, Paused }; Q_ENUM(ApplicationState) @@ -205,192 +112,53 @@ class Application : public QObject{ void stopNoSecurityCheck(); void pauseNoSecurityCheck(bool startIfNone = true); void unregisterNoSecurityCheck(); - QString name() { return value("name").toString(); } - int processId() { return m_process->processId(); } - QStringList permissions() { return value("permissions", QStringList()).toStringList(); } - void setPermissions(QStringList permissions){ - if(!hasPermission("permissions")){ - return; - } - setValue("permissions", permissions); - emit permissionsChanged(permissions); - } - QString displayName() { return value("displayName", name()).toString(); } - void setDisplayName(QString displayName){ - if(!hasPermission("permissions")){ - return; - } - setValue("displayName", displayName); - emit displayNameChanged(displayName); - } - QString description() { return value("description", displayName()).toString(); } - QString bin() { return value("bin").toString(); } - QString onPause() { return value("onPause", "").toString(); } - void setOnPause(QString onPause){ - if(!hasPermission("permissions")){ - return; - } - setValue("onPause", onPause); - emit onPauseChanged(onPause); - } - QString onResume() { return value("onResume", "").toString(); } - void setOnResume(QString onResume){ - if(!hasPermission("permissions")){ - return; - } - setValue("onResume", onResume); - emit onResumeChanged(onResume); - } - QString onStop() { return value("onStop", "").toString(); } - void setOnStop(QString onStop){ - if(!hasPermission("permissions")){ - return; - } - setValue("onStop", onStop); - emit onStopChanged(onStop); - } - QStringList flags() { return value("flags", QStringList()).toStringList(); } - bool autoStart() { return flags().contains("autoStart"); } - void setAutoStart(bool autoStart) { - if(!hasPermission("permissions")){ - return; - } - if(!autoStart){ - flags().removeAll("autoStart"); - autoStartChanged(autoStart); - }else if(!this->autoStart()){ - flags().append("autoStart"); - autoStartChanged(autoStart); - } - } - bool systemApp() { return flags().contains("system"); } - bool transient() { return flags().contains("transient"); } - bool hidden() { return flags().contains("hidden"); } - int type() { return (int)value("type", 0).toInt(); } - int state(){ - if(!hasPermission("apps")){ - return Inactive; - } - return stateNoSecurityCheck(); - } + QString name(); + int processId(); + QStringList permissions(); + void setPermissions(QStringList permissions); + QString displayName(); + void setDisplayName(QString displayName); + QString description(); + QString bin(); + QString onPause(); + void setOnPause(QString onPause); + QString onResume(); + void setOnResume(QString onResume); + QString onStop(); + void setOnStop(QString onStop); + QStringList flags(); + bool autoStart(); + void setAutoStart(bool autoStart); + bool systemApp(); + bool transient(); + bool hidden(); + int type(); + int state(); int stateNoSecurityCheck(); - QString icon(){ - auto _icon = value("icon", "").toString(); - if(_icon.isEmpty() || !_icon.contains("-") || QFile::exists(_icon)){ - return _icon; - } - auto path = Oxide::Applications::iconPath(_icon); - if(path.isEmpty()){ - return _icon; - } - return path; - } - void setIcon(QString icon){ - if(!hasPermission("permissions")){ - return; - } - setValue("icon", icon); - emit iconChanged(this->icon()); - } - QString splash(){ - auto _splash = value("splash", "").toString(); - if(_splash.isEmpty() || !_splash.contains("-") || QFile::exists(_splash)){ - return _splash; - } - auto path = Oxide::Applications::iconPath(_splash); - if(path.isEmpty()){ - return _splash; - } - return path; - } - void setSplash(QString splash){ - if(!hasPermission("permissions")){ - return; - } - setValue("splash", splash); - emit splashChanged(splash); - } - QVariantMap environment() { return value("environment", QVariantMap()).toMap(); } - Q_INVOKABLE void setEnvironment(QVariantMap environment){ - if(!hasPermission("permissions")){ - return; - } - for(auto key : environment.keys()){ - auto value = environment.value(key, QVariant()); - if(!value.isValid()){ - qDebug() << key << " has invalid value: " << value; - return; - } - } - setValue("environment", environment); - updateEnvironment(); - emit environmentChanged(environment); - } - QString workingDirectory() { return value("workingDirectory", "/").toString(); } - void setWorkingDirectory(const QString& workingDirectory){ - if(!hasPermission("permissions")){ - return; - } - QDir dir(workingDirectory); - if(!dir.exists()){ - return; - } - setValue("workingDirectory", workingDirectory); - emit workingDirectoryChanged(workingDirectory); - } - bool chroot(){ return flags().contains("chroot"); } - QString user(){ return value("user", getuid()).toString(); } - QString group(){ return value("group", getgid()).toString(); } - QStringList directories() { return value("directories", QStringList()).toStringList(); } - void setDirectories(QStringList directories){ - if(!hasPermission("permissions")){ - return; - } - setValue("directories", directories); - emit directoriesChanged(directories); - } - QByteArray screenCapture(){ - if(!hasPermission("permissions")){ - return QByteArray(); - } - return screenCaptureNoSecurityCheck(); - } - QByteArray screenCaptureNoSecurityCheck(){ return qUncompress(*m_screenCapture); } - - const QVariantMap& getConfig(){ return m_config; } + QString icon(); + void setIcon(QString icon); + QString splash(); + void setSplash(QString splash); + QVariantMap environment(); + Q_INVOKABLE void setEnvironment(QVariantMap environment); + QString workingDirectory(); + void setWorkingDirectory(const QString& workingDirectory); + bool chroot(); + QString user(); + QString group(); + QStringList directories(); + void setDirectories(QStringList directories); + QByteArray screenCapture(); + QByteArray screenCaptureNoSecurityCheck(); + + const QVariantMap& getConfig(); void setConfig(const QVariantMap& config); - void saveScreen(){ - if(m_screenCapture != nullptr){ - return; - } - Oxide::Sentry::sentry_transaction("application", "saveScreen", [this](Oxide::Sentry::Transaction* t){ - qDebug() << "Saving screen..."; - QByteArray bytes; - Oxide::Sentry::sentry_span(t, "save", "Save the framebuffer", [&bytes]{ - QBuffer buffer(&bytes); - buffer.open(QIODevice::WriteOnly); - dispatchToMainThread([&buffer]{ - if(!EPFrameBuffer::framebuffer()->save(&buffer, "JPG", 100)){ - O_WARNING("Failed to save buffer"); - } - }); - }); - qDebug() << "Compressing data..."; - Oxide::Sentry::sentry_span(t, "compress", "Compress the framebuffer", [this, bytes]{ - m_screenCapture = new QByteArray(qCompress(bytes)); - }); - qDebug() << "Screen saved " << m_screenCapture->size() << "bytes"; - }); - } + void saveScreen(); void recallScreen(); - void waitForFinished(){ - if(m_process->processId()){ - m_process->waitForFinished(); - } - } + void waitForFinished(); void signal(int signal); - QVariant value(QString name, QVariant defaultValue = QVariant()){ return m_config.value(name, defaultValue); } - void setValue(QString name, QVariant value){ m_config[name] = value; } + QVariant value(QString name, QVariant defaultValue = QVariant()); + void setValue(QString name, QVariant value); void interruptApplication(); void uninterruptApplication(); void waitForPause(); @@ -415,72 +183,16 @@ class Application : public QObject{ void directoriesChanged(QStringList); public slots: - void sigUsr1(){ - timer.invalidate(); - } - void sigUsr2(){ - timer.invalidate(); - } + void sigUsr1(); + void sigUsr2(); private slots: void showSplashScreen(); void started(); void finished(int exitCode); - void readyReadStandardError(){ - QString error = m_process->readAllStandardError(); - if(p_stderr != nullptr){ - *p_stderr << error.toStdString().c_str(); - p_stderr->flush(); - }else{ - const char* prefix = ("[" + name() + " " + QString::number(m_process->processId()) + "]").toUtf8(); - for(QString line : error.split(QRegularExpression("[\r\n]"), Qt::SkipEmptyParts)){ - if(!line.isEmpty()){ - sd_journal_print(LOG_ERR, "%s %s", prefix, (const char*)line.toUtf8()); - } - } - } - } - void readyReadStandardOutput(){ - QString output = m_process->readAllStandardOutput(); - if(p_stdout != nullptr){ - *p_stdout << output.toStdString().c_str(); - p_stdout->flush(); - }else{ - const char* prefix = ("[" + name() + " " + QString::number(m_process->processId()) + "]").toUtf8(); - for(QString line : output.split(QRegularExpression("[\r\n]"), Qt::SkipEmptyParts)){ - if(!line.isEmpty()){ - sd_journal_print(LOG_INFO, "%s %s", prefix, (const char*)line.toUtf8()); - } - } - } - } - void stateChanged(QProcess::ProcessState state){ - switch(state){ - case QProcess::Starting: - qDebug() << "Application" << name() << "is starting."; - break; - case QProcess::Running: - qDebug() << "Application" << name() << "is running."; - break; - case QProcess::NotRunning: - qDebug() << "Application" << name() << "is not running."; - if(sharedSettings.applicationUsage()){ - if(span != nullptr){ - Oxide::Sentry::stop_span(span); - delete span; - span = nullptr; - } - if(transaction != nullptr){ - Oxide::Sentry::stop_transaction(transaction); - delete transaction; - transaction = nullptr; - } - } - break; - default: - qDebug() << "Application" << name() << "unknown state" << state; - } - } + void readyReadStandardError(); + void readyReadStandardOutput(); + void stateChanged(QProcess::ProcessState state); void errorOccurred(QProcess::ProcessError error); void powerStateDataRecieved(FifoHandler* handler, const QString& data); @@ -500,272 +212,22 @@ private slots: QTextStream* p_stderr = nullptr; bool hasPermission(QString permission, const char* sender = __builtin_FUNCTION()); - void delayUpTo(int milliseconds){ - timer.invalidate(); - timer.start(); - while(timer.isValid() && !timer.hasExpired(milliseconds)){ - QCoreApplication::processEvents(QEventLoop::AllEvents, 100); - } - } - void updateEnvironment(){ - auto env = QProcessEnvironment::systemEnvironment(); - auto envPath = env.value("PATH", DEFAULT_PATH).split(":"); - auto defaults = QString(DEFAULT_PATH).split(":"); - for(auto item : defaults){ - if(!envPath.contains(item)){ - envPath.append(item); - } - } - env.insert("PATH", envPath.join(":")); - auto preload = env.value("LD_PRELOAD", "").split(":"); - QString sysfs_preload("/opt/lib/libsysfs_preload.so"); - if(!preload.contains(sysfs_preload)){ - preload.append(sysfs_preload); - } - if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ - QString rm2fb_client("/opt/lib/librm2fb_client.so"); - if(!preload.contains(rm2fb_client)){ - preload.append(rm2fb_client); - } - } - env.insert("LD_PRELOAD", preload.join(":")); - for(auto key : environment().keys()){ - env.insert(key, environment().value(key, "").toString()); - } - m_process->setEnvironment(env.toStringList()); - } - void mkdirs(const QString& path, mode_t mode = 0700){ - QDir dir(path); - if(!dir.exists()){ - QString subpath = ""; - for(auto part : path.split("/")){ - subpath += "/" + part; - QDir dir(subpath); - if(!dir.exists()){ - mkdir(subpath.toStdString().c_str(), mode); - } - } - } - } - void bind(const QString& source, const QString& target, bool readOnly = false){ - umount(target); - if(QFileInfo(source).isDir()){ - mkdirs(target, 744); - }else{ - mkdirs(QFileInfo(target).dir().path(), 744); - } - auto ctarget = target.toStdString(); - auto csource = source.toStdString(); - qDebug() << "mount" << source << target; - if(mount(csource.c_str(), ctarget.c_str(), NULL, MS_BIND, NULL)){ - O_WARNING("Failed to create bindmount: " << ::strerror(errno)); - return; - } - if(!readOnly){ - return; - } - if(mount(csource.c_str(), ctarget.c_str(), NULL, MS_REMOUNT | MS_BIND | MS_RDONLY, NULL)){ - O_WARNING("Failed to remount bindmount read only: " << ::strerror(errno)); - } - qDebug() << "mount ro" << source << target; - } - void sysfs(const QString& path){ - mkdirs(path, 744); - umount(path); - qDebug() << "sysfs" << path; - if(mount("none", path.toStdString().c_str(), "sysfs", 0, "")){ - O_WARNING("Failed to mount sysfs: " << ::strerror(errno)); - } - } - void ramdisk(const QString& path){ - mkdirs(path, 744); - umount(path); - qDebug() << "ramdisk" << path; - if(mount("tmpfs", path.toStdString().c_str(), "tmpfs", 0, "size=249m,mode=755")){ - O_WARNING("Failed to create ramdisk: " << ::strerror(errno)); - } - } - void umount(const QString& path){ - if(!isMounted(path)){ - return; - } - auto cpath = path.toStdString(); - auto ret = ::umount2(cpath.c_str(), MNT_DETACH); - if((ret && ret != EINVAL && ret != ENOENT) || isMounted(path)){ - qDebug() << "umount failed" << path; - return; - } - QDir dir(path); - if(dir.exists()){ - rmdir(cpath.c_str()); - } - qDebug() << "umount" << path; - } - FifoHandler* mkfifo(const QString& name, const QString& target){ - if(isMounted(target)){ - O_WARNING(target << "Already mounted"); - return fifos.contains(name) ? fifos[name] : nullptr; - } - auto source = resourcePath() + "/" + name; - if(!QFile::exists(source)){ - if(::mkfifo(source.toStdString().c_str(), 0644)){ - O_WARNING("Failed to create " << name << " fifo: " << ::strerror(errno)); - } - } - if(!QFile::exists(source)){ - O_WARNING("No fifo for " << name); - return fifos.contains(name) ? fifos[name] : nullptr; - } - bind(source, target); - if(!fifos.contains(name)){ - qDebug() << "Creating fifo thread for" << source; - auto handler = new FifoHandler(name, source.toStdString().c_str(), this); - qDebug() << "Connecting fifo thread events for" << source; - connect(handler, &FifoHandler::finished, [this, name]{ - if(fifos.contains(name)){ - fifos.take(name); - } - }); - fifos[name] = handler; - qDebug() << "Starting fifo thread for" << source; - handler->start(); - qDebug() << "Fifo thread for " << source << "started"; - } - return fifos[name]; - } - void symlink(const QString& source, const QString& target){ - if(QFile::exists(source)){ - return; - } - qDebug() << "symlink" << source << target; - if(::symlink(target.toStdString().c_str(), source.toStdString().c_str())){ - O_WARNING("Failed to create symlink: " << ::strerror(errno)); - return; - } - } - const QString resourcePath() { return "/tmp/tarnish-chroot/" + name(); } - const QString chrootPath() { return resourcePath() + "/chroot"; } - void mountAll(){ - Oxide::Sentry::sentry_transaction("application", "mount", [this](Oxide::Sentry::Transaction* t){ -#ifdef SENTRY - if(t != nullptr){ - sentry_transaction_set_tag(t->inner, "application", name().toStdString().c_str()); - } -#endif - auto path = chrootPath(); - qDebug() << "Setting up chroot" << path; - Oxide::Sentry::sentry_span(t, "bind", "Bind directories", [this, path]{ - // System tmpfs folders - bind("/dev", path + "/dev"); - bind("/proc", path + "/proc"); - sysfs(path + "/sys"); - // Folders required to run things - bind("/bin", path + "/bin", true); - bind("/sbin", path + "/sbin", true); - bind("/lib", path + "/lib", true); - bind("/usr/lib", path + "/usr/lib", true); - bind("/usr/bin", path + "/usr/bin", true); - bind("/usr/sbin", path + "/usr/sbin", true); - bind("/opt/bin", path + "/opt/bin", true); - bind("/opt/lib", path + "/opt/lib", true); - bind("/opt/usr/bin", path + "/opt/usr/bin", true); - bind("/opt/usr/lib", path + "/opt/usr/lib", true); - }); - Oxide::Sentry::sentry_span(t, "ramdisk", "Create ramdisks", [this, path]{ - // tmpfs folders - mkdirs(path + "/tmp", 744); - if(!QFile::exists(path + "/run")){ - ramdisk(path + "/run"); - } - if(!QFile::exists(path + "/var/volatile")){ - ramdisk(path + "/var/volatile"); - } - }); - Oxide::Sentry::sentry_span(t, "configured", "Bind configured directories", [this, path]{ - // Configured folders - for(auto directory : directories()){ - bind(directory, path + directory); - } - }); - Oxide::Sentry::sentry_span(t, "fifo", "Create fifos", [this, path]{ - // Fake sys devices - auto fifo = mkfifo("powerState", path + "/sys/power/state"); - connect(fifo, &FifoHandler::dataRecieved, this, &Application::powerStateDataRecieved); - }); - Oxide::Sentry::sentry_span(t, "symlink", "Create symlinks", [this, path]{ - // Missing symlinks - symlink(path + "/var/run", "../run"); - symlink(path + "/var/lock", "../run/lock"); - symlink(path + "/var/tmp", "volatile/tmp"); - }); - }); - } - void umountAll(){ - Oxide::Sentry::sentry_transaction("application", "umount", [this](Oxide::Sentry::Transaction* t){ -#ifdef SENTRY - if(t != nullptr){ - sentry_transaction_set_tag(t->inner, "application", name().toStdString().c_str()); - } -#endif - auto path = chrootPath(); - Oxide::Sentry::sentry_span(t, "fifos", "Remove fifos", [this]{ - for(auto name : fifos.keys()){ - auto fifo = fifos.take(name); - fifo->quit(); - fifo->deleteLater(); - } - }); - QDir dir(path); - if(!dir.exists()){ - return; - } - qDebug() << "Tearing down chroot" << path; - Oxide::Sentry::sentry_span(t, "dirs", "Remove directories", [dir]{ - for(auto file : dir.entryList(QDir::Files)){ - QFile::remove(file); - } - }); - Oxide::Sentry::sentry_span(t, "umount", "Unmount all mounts", [this]{ - for(auto mount : getActiveApplicationMounts()){ - umount(mount); - } - }); - if(!getActiveApplicationMounts().isEmpty()){ - qDebug() << "Some items are still mounted in chroot" << path; - return; - } - Oxide::Sentry::sentry_span(t, "rm", "Remove final folder", [&dir]{ - dir.removeRecursively(); - }); - }); - } - bool isMounted(const QString& path){ return getActiveMounts().contains(path); } - QStringList getActiveApplicationMounts(){ - auto path = chrootPath() + "/"; - QStringList activeMounts = getActiveMounts().filter(QRegularExpression("^" + QRegularExpression::escape(path) + ".*")); - activeMounts.sort(Qt::CaseSensitive); - std::reverse(std::begin(activeMounts), std::end(activeMounts)); - return activeMounts; - } - QStringList getActiveMounts(){ - QFile mounts("/proc/mounts"); - if(!mounts.open(QIODevice::ReadOnly)){ - qDebug() << "Unable to open /proc/mounts"; - return QStringList(); - } - QString line; - QStringList activeMounts; - while(!(line = mounts.readLine()).isEmpty()){ - auto mount = line.section(' ', 1, 1); - if(mount.startsWith("/")){ - activeMounts.append(mount); - } - } - mounts.close(); - activeMounts.sort(Qt::CaseSensitive); - std::reverse(std::begin(activeMounts), std::end(activeMounts)); - return activeMounts; - } + void delayUpTo(int milliseconds); + void updateEnvironment(); + void mkdirs(const QString& path, mode_t mode = 0700); + void bind(const QString& source, const QString& target, bool readOnly = false); + void sysfs(const QString& path); + void ramdisk(const QString& path); + void umount(const QString& path); + FifoHandler* mkfifo(const QString& name, const QString& target); + void symlink(const QString& source, const QString& target); + const QString resourcePath(); + const QString chrootPath(); + void mountAll(); + void umountAll(); + bool isMounted(const QString& path); + QStringList getActiveApplicationMounts(); + QStringList getActiveMounts(); void startSpan(std::string operation, std::string description); }; diff --git a/applications/system-service/appsapi.cpp b/applications/system-service/appsapi.cpp index d146188bf..e369147cb 100644 --- a/applications/system-service/appsapi.cpp +++ b/applications/system-service/appsapi.cpp @@ -6,15 +6,23 @@ using namespace Oxide; +AppsAPI* AppsAPI::singleton(AppsAPI* self){ + static AppsAPI* instance; + if(self != nullptr){ + instance = self; + } + return instance; +} + AppsAPI::AppsAPI(QObject* parent) -: APIBase(parent), - m_stopping(false), - m_starting(true), - m_enabled(false), - applications(), - previousApplications(), - settings(this), - m_startupApplication("/"), + : APIBase(parent), + m_stopping(false), + m_starting(true), + m_enabled(false), + applications(), + previousApplications(), + settings(this), + m_startupApplication("/"), m_lockscreenApplication("/"), m_processManagerApplication("/"), m_taskSwitcherApplication("/"), @@ -139,6 +147,232 @@ void AppsAPI::startup(){ }); } +void AppsAPI::setEnabled(bool enabled){ + qDebug() << "Apps API" << enabled; + for(auto app : applications){ + if(enabled){ + app->registerPath(); + }else{ + app->unregisterPath(); + } + } +} + +QDBusObjectPath AppsAPI::registerApplication(QVariantMap properties){ + if(!hasPermission("apps")){ + return QDBusObjectPath("/"); + } + return registerApplicationNoSecurityCheck(properties); +} + +QDBusObjectPath AppsAPI::registerApplicationNoSecurityCheck(QVariantMap properties){ + QString name = properties.value("name", "").toString(); + QString bin = properties.value("bin", "").toString(); + int type = properties.value("type", ApplicationType::Foreground).toInt(); + if(type < ApplicationType::Foreground || type > ApplicationType::Backgroundable){ + qDebug() << "Invalid configuration: Invalid type" << type; + return QDBusObjectPath("/"); + } + if(name.isEmpty()){ + qDebug() << "Invalid configuration: Name is empty"; + return QDBusObjectPath("/"); + } + if(bin.isEmpty() || !QFile::exists(bin)){ + qDebug() << "Invalid configuration: " << name << " has invalid bin" << bin; + return QDBusObjectPath("/"); + } + if(!QFileInfo(bin).isExecutable()){ + qDebug() << "Invalid configuration: " << name << " has bin that is not executable" << bin; + return QDBusObjectPath("/"); + } + if(applications.contains(name)){ + return applications[name]->qPath(); + } + QDBusObjectPath path; + Oxide::Sentry::sentry_transaction("apps", "registerApplication", [this, &path, name, properties](Oxide::Sentry::Transaction* t){ + Q_UNUSED(t); + path = QDBusObjectPath(getPath(name)); + auto app = new Application(path, reinterpret_cast(this)); + auto displayName = properties.value("displayName", name).toString(); + app->setConfig(properties); + applications.insert(name, app); + app->registerPath(); + emit applicationRegistered(path); + }); + return path; +} + +bool AppsAPI::unregisterApplication(QDBusObjectPath path){ + if(!hasPermission("apps")){ + return false; + } + auto app = getApplication(path); + if(app == nullptr){ + return true; + } + if(app->systemApp()){ + return false; + } + unregisterApplication(app); + return true; +} + +void AppsAPI::reload(){ + if(!hasPermission("apps")){ + return; + } + Oxide::Sentry::sentry_transaction("apps", "reload", [this](Oxide::Sentry::Transaction* t){ + Q_UNUSED(t); + writeApplications(); + readApplications(); + }); +} + +QDBusObjectPath AppsAPI::startupApplication(){ + if(!hasPermission("apps")){ + return QDBusObjectPath("/"); + } + return m_startupApplication; +} + +void AppsAPI::setStartupApplication(QDBusObjectPath path){ + if(!hasPermission("apps")){ + return; + } + if(getApplication(path) != nullptr){ + m_startupApplication = path; + settings.setValue("startupApplication", path.path()); + } +} + +QDBusObjectPath AppsAPI::lockscreenApplication(){ + if(!hasPermission("apps")){ + return QDBusObjectPath("/"); + } + return m_lockscreenApplication; +} + +void AppsAPI::setLockscreenApplication(QDBusObjectPath path){ + if(!hasPermission("apps")){ + return; + } + if(getApplication(path) != nullptr){ + m_lockscreenApplication = path; + settings.setValue("lockscreenApplication", path.path()); + } +} + +QDBusObjectPath AppsAPI::processManagerApplication(){ + if(!hasPermission("apps")){ + return QDBusObjectPath("/"); + } + return m_processManagerApplication; +} + +void AppsAPI::setProcessManagerApplication(QDBusObjectPath path){ + if(!hasPermission("apps")){ + return; + } + if(getApplication(path) != nullptr){ + m_processManagerApplication = path; + settings.setValue("processManagerApplication", path.path()); + } +} + +QDBusObjectPath AppsAPI::taskSwitcherApplication(){ + if(!hasPermission("apps")){ + return QDBusObjectPath("/"); + } + return m_taskSwitcherApplication; +} + +void AppsAPI::setTaskSwitcherApplication(QDBusObjectPath path){ + if(!hasPermission("apps")){ + return; + } + if(getApplication(path) != nullptr){ + m_taskSwitcherApplication = path; + settings.setValue("taskSwitcherApplication", path.path()); + } +} + +QVariantMap AppsAPI::getApplications(){ + QVariantMap result; + if(!hasPermission("apps")){ + return result; + } + for(auto app : applications){ + result.insert(app->name(), QVariant::fromValue(app->qPath())); + } + return result; +} + +QDBusObjectPath AppsAPI::currentApplication(){ + if(!hasPermission("apps")){ + return QDBusObjectPath("/"); + } + return currentApplicationNoSecurityCheck(); +} + +QDBusObjectPath AppsAPI::currentApplicationNoSecurityCheck(){ + for(auto app : applications){ + if(app->stateNoSecurityCheck() == Application::InForeground){ + return app->qPath(); + } + } + return QDBusObjectPath("/"); +} + +QVariantMap AppsAPI::runningApplications(){ + if(!hasPermission("apps")){ + return QVariantMap(); + } + return runningApplicationsNoSecurityCheck(); +} + +QVariantMap AppsAPI::runningApplicationsNoSecurityCheck(){ + QVariantMap result; + for(auto app : applications){ + auto state = app->stateNoSecurityCheck(); + if(state == Application::InForeground || state == Application::InBackground){ + result.insert(app->name(), QVariant::fromValue(app->qPath())); + } + } + return result; +} + +QVariantMap AppsAPI::pausedApplications(){ + QVariantMap result; + if(!hasPermission("apps")){ + return result; + } + for(auto app : applications){ + auto state = app->stateNoSecurityCheck(); + if(state == Application::Paused){ + result.insert(app->name(), QVariant::fromValue(app->qPath())); + } + } + return result; +} + +void AppsAPI::unregisterApplication(Application* app){ + Oxide::Sentry::sentry_transaction("apps", "unregisterApplication", [this, app](Oxide::Sentry::Transaction* t){ + Q_UNUSED(t); + auto name = app->name(); + if(applications.contains(name)){ + applications.remove(name); + emit applicationUnregistered(app->qPath()); + app->deleteLater(); + } + }); +} + +void AppsAPI::pauseAll(){ + for(auto app : applications){ + app->pauseNoSecurityCheck(false); + } +} + void AppsAPI::resumeIfNone(){ if(m_stopping || m_starting){ return; @@ -168,6 +402,434 @@ void AppsAPI::resumeIfNone(){ ensureForegroundApp(); } +Application* AppsAPI::getApplication(QDBusObjectPath path){ + for(auto app : applications){ + if(app->path() == path.path()){ + return app; + } + } + return nullptr; +} + +QStringList AppsAPI::getPreviousApplications(){ return previousApplications; } + +QDBusObjectPath AppsAPI::getApplicationPath(const QString& name){ + if(!hasPermission("apps")){ + return QDBusObjectPath("/"); + } + auto app = getApplication(name); + if(app == nullptr){ + return QDBusObjectPath("/"); + } + return app->qPath(); +} + +Application* AppsAPI::getApplication(const QString& name){ + if(applications.contains(name)){ + return applications[name]; + } + return nullptr; +} + +void AppsAPI::connectSignals(Application* app, int signal){ + switch(signal){ + case 1: + connect(signalHandler, &SignalHandler::sigUsr1, app, &Application::sigUsr1); + break; + case 2: + connect(signalHandler, &SignalHandler::sigUsr2, app, &Application::sigUsr2); + break; + } +} + +void AppsAPI::disconnectSignals(Application* app, int signal){ + switch(signal){ + case 1: + disconnect(signalHandler, &SignalHandler::sigUsr1, app, &Application::sigUsr1); + break; + case 2: + disconnect(signalHandler, &SignalHandler::sigUsr2, app, &Application::sigUsr2); + break; + } +} + +bool AppsAPI::previousApplication(){ + if(!hasPermission("apps")){ + return false; + } + return previousApplicationNoSecurityCheck(); +} + +bool AppsAPI::previousApplicationNoSecurityCheck(){ + if(locked()){ + return false; + } + if(previousApplications.isEmpty()){ + qDebug() << "No previous applications"; + return false; + } + bool found = false; + while(!previousApplications.isEmpty()){ + auto name = previousApplications.takeLast(); + auto application = getApplication(name); + if(application == nullptr){ + continue; + } + auto currentApplication = getApplication(this->currentApplicationNoSecurityCheck()); + if(currentApplication != nullptr){ + if(currentApplication == application){ + continue; + } + currentApplication->pauseNoSecurityCheck(false); + } + application->launchNoSecurityCheck(); + qDebug() << "Resuming previous application" << application->name(); + found = true; + break; + } + qDebug() << "Previous Applications" << previousApplications; + return found; +} + +void AppsAPI::forceRecordPreviousApplication(){ + auto currentApplication = getApplication(this->currentApplicationNoSecurityCheck()); + if(currentApplication == nullptr){ + O_WARNING("Unable to find current application"); + return; + } + auto name = currentApplication->name(); + previousApplications.removeAll(name); + previousApplications.append(name); + qDebug() << "Previous Applications" << previousApplications; +} + +void AppsAPI::recordPreviousApplication(){ + auto currentApplication = getApplication(this->currentApplicationNoSecurityCheck()); + if(currentApplication == nullptr){ + O_WARNING("Unable to find current application"); + return; + } + if(currentApplication->qPath() == lockscreenApplication()){ + return; + } + if(currentApplication->qPath() == taskSwitcherApplication()){ + return; + } + auto name = currentApplication->name(); + removeFromPreviousApplications(name); + previousApplications.append(name); + qDebug() << "Previous Applications" << previousApplications; +} + +void AppsAPI::removeFromPreviousApplications(QString name){ previousApplications.removeAll(name); } + +void AppsAPI::leftHeld(){ openDefaultApplication(); } + +void AppsAPI::openDefaultApplication(){ + if(locked() || !hasPermission("apps")){ + return; + } + auto path = this->currentApplicationNoSecurityCheck(); + if(path.path() != "/"){ + auto currentApplication = getApplication(path); + if( + currentApplication != nullptr + && currentApplication->stateNoSecurityCheck() != Application::Inactive + && (path == m_startupApplication || path == m_lockscreenApplication) + ){ + qDebug() << "Already in default application"; + return; + } + } + auto app = getApplication(m_startupApplication); + if(app == nullptr){ + qDebug() << "Unable to find default application"; + return; + } + qDebug() << "Opening default application"; + app->launchNoSecurityCheck(); +} + +void AppsAPI::homeHeld(){ openTaskManager(); } + +void AppsAPI::openTaskManager(){ + if(locked() || !hasPermission("apps")){ + return; + } + auto path = this->currentApplicationNoSecurityCheck(); + if(path.path() != "/"){ + auto currentApplication = getApplication(path); + if( + currentApplication != nullptr + && currentApplication->stateNoSecurityCheck() != Application::Inactive + && path == m_lockscreenApplication + ){ + qDebug() << "Can't open task manager, on the lockscreen"; + return; + } + } + auto app = getApplication(m_processManagerApplication); + if(app == nullptr){ + qDebug() << "Unable to find task manager"; + return; + } + qDebug() << "Opening task manager"; + app->launchNoSecurityCheck(); +} + +void AppsAPI::openLockScreen(){ + if(locked() || !hasPermission("apps")){ + return; + } + auto path = this->currentApplicationNoSecurityCheck(); + if(path.path() != "/"){ + auto currentApplication = getApplication(path); + if( + currentApplication != nullptr + && currentApplication->stateNoSecurityCheck() != Application::Inactive + && path == m_lockscreenApplication + ){ + qDebug() << "Already on the lockscreen"; + return; + } + } + auto app = getApplication(m_lockscreenApplication); + if(app == nullptr){ + qDebug() << "Unable to find lockscreen"; + return; + } + qDebug() << "Opening lock screen"; + app->launchNoSecurityCheck(); +} + +void AppsAPI::openTaskSwitcher(){ + if(locked() || !hasPermission("apps")){ + return; + } + auto path = this->currentApplicationNoSecurityCheck(); + if(path.path() != "/"){ + auto currentApplication = getApplication(path); + if( + currentApplication != nullptr + && currentApplication->stateNoSecurityCheck() != Application::Inactive + ){ + if(path == m_lockscreenApplication){ + qDebug() << "Can't open task switcher, on the lockscreen"; + return; + } + if(path == m_taskSwitcherApplication){ + qDebug() << "Already on the task switcher"; + return; + } + } + } + auto app = getApplication(m_taskSwitcherApplication); + if(app != nullptr){ + app->launchNoSecurityCheck(); + return; + } + app = getApplication(m_startupApplication); + if(app == nullptr){ + qDebug() << "Unable to find default application"; + return; + } + qDebug() << "Opening task switcher"; + app->launchNoSecurityCheck(); +} + +void AppsAPI::openTerminal(){ + if(locked() || !hasPermission("apps")){ + return; + } + auto path = this->currentApplicationNoSecurityCheck(); + if(path.path() != "/"){ + auto currentApplication = getApplication(path); + if( + currentApplication != nullptr + && currentApplication->stateNoSecurityCheck() != Application::Inactive + ){ + if(path == m_lockscreenApplication){ + qDebug() << "Can't open task switcher, on the lockscreen"; + return; + } + } + } + auto app = getApplication("yaft"); + if(app != nullptr){ + app->launchNoSecurityCheck(); + return; + } + app = getApplication("fingerterm"); + if(app == nullptr){ + qDebug() << "Unable to find terminal application"; + return; + } + qDebug() << "Opening terminal"; + app->launchNoSecurityCheck(); +} + +QString AppsAPI::getPath(QString name){ + static const QUuid NS = QUuid::fromString(QLatin1String("{d736a9e1-10a9-4258-9634-4b0fa91189d5}")); + return QString(OXIDE_SERVICE_PATH) + "/apps/" + QUuid::createUuidV5(NS, name).toString(QUuid::Id128); +} + +void AppsAPI::writeApplications(){ + auto apps = applications.values(); + int size = apps.size(); + settings.beginWriteArray("applications", size); + for(int i = 0; i < size; ++i){ + settings.setArrayIndex(i); + auto app = apps[i]; + auto config = app->getConfig(); + // Add/Update config items + for(auto key : config.keys()){ + settings.setValue(key, config[key]); + } + // Remove old config + for(auto key : settings.childKeys()){ + if(!config.contains(key)){ + settings.remove(key); + } + } + } + settings.endArray(); +} + +void AppsAPI::readApplications(){ + settings.sync(); + if(!applications.empty()){ + // Unregister any applications that have been removed from the settings file + int size = settings.beginReadArray("applications"); + QStringList names; + for(int i = 0; i < size; ++i){ + settings.setArrayIndex(i); + names << settings.value("name").toString(); + } + settings.endArray(); + for(auto name : applications.keys()){ + auto app = applications[name]; + if(!names.contains(name) && !app->systemApp() && !app->transient()){ + app->unregisterNoSecurityCheck(); + } + } + } + // Register/Update applications from the settings file + int size = settings.beginReadArray("applications"); + for(int i = 0; i < size; ++i){ + settings.setArrayIndex(i); + auto name = settings.value("name").toString(); + auto displayName = settings.value("displayName", name).toString(); + auto type = settings.value("type", Foreground).toInt(); + auto bin = settings.value("bin").toString(); + if(type < Foreground || type > Backgroundable || name.isEmpty() || bin.isEmpty()){ +#ifdef DEBUG + qDebug() << "Invalid configuration " << name; +#endif + continue; + } + QVariantMap properties { + {"name", name}, + {"displayName", displayName}, + {"description", settings.value("description", displayName).toString()}, + {"bin", bin}, + {"type", type}, + {"flags", settings.value("flags", QStringList()).toStringList()}, + {"icon", settings.value("icon", "").toString()}, + {"onPause", settings.value("onPause", "").toString()}, + {"onResume", settings.value("onResume", "").toString()}, + {"onStop", settings.value("onStop", "").toString()}, + {"environment", settings.value("environment", QVariantMap()).toMap()}, + {"workingDirectory", settings.value("workingDirectory", "").toString()}, + {"directories", settings.value("directories", QStringList()).toStringList()}, + {"permissions", settings.value("permissions", QStringList()).toStringList()}, + {"splash", settings.value("splash", "").toString()}, + }; + if(settings.contains("user")){ + properties.insert("user", settings.value("user", "").toString()); + } + if(settings.contains("group")){ + properties.insert("group", settings.value("group", "").toString()); + } + if(applications.contains(name)){ +#ifdef DEBUG + qDebug() << "Updating " << name; + qDebug() << properties; +#endif + applications[name]->setConfig(properties); + }else{ + qDebug() << name; +#ifdef DEBUG + qDebug() << properties; +#endif + registerApplicationNoSecurityCheck(properties); + } + } + settings.endArray(); + // Load system applications from disk + QDir dir(OXIDE_APPLICATION_REGISTRATIONS_DIRECTORY); + dir.setNameFilters(QStringList() << "*.oxide"); + QMap apps; + for(auto entry : dir.entryInfoList()){ + auto app = getRegistration(entry.filePath()); + if(app.isEmpty()){ + qDebug() << "Invalid file " << entry.filePath(); + continue; + } + auto name = entry.completeBaseName(); + app["name"] = name; + apps.insert(name, app); + } + // Unregister any system applications that no longer exist on disk. + for(auto application : applications.values()){ + auto name = application->name(); + if(!apps.contains(name) && application->systemApp()){ + qDebug() << name << "Is no longer found on disk"; + application->unregisterNoSecurityCheck(); + } + } + // Register/Update any system application. + for(auto app : apps){ + auto name = app["name"].toString(); + auto bin = app["bin"].toString(); + if(bin.isEmpty() || !QFile::exists(bin)){ + qDebug() << name << "Can't find application binary:" << bin; +#ifdef DEBUG + qDebug() << app; +#endif + continue; + } + if(!app.contains("flags") || !app["flags"].isArray()){ + app["flags"] = QJsonArray(); + } + auto flags = app["flags"].toArray(); + flags.prepend("system"); + app["flags"] = flags; + auto properties = registrationToMap(app); + if(applications.contains(name)){ +#ifdef DEBUG + qDebug() << "Updating " << name; + qDebug() << properties; +#endif + applications[name]->setConfig(properties); + }else{ + qDebug() << "New system app" << name; +#ifdef DEBUG + qDebug() << properties; +#endif + registerApplicationNoSecurityCheck(properties); + } + } +} + +void AppsAPI::migrate(QSettings* settings, int fromVersion){ + if(fromVersion != 0){ + throw "Unknown settings version"; + } + // In the future migrate changes to settings between versions + settings->setValue("version", OXIDE_SETTINGS_VERSION); + settings->sync(); +} + bool AppsAPI::locked(){ return notificationAPI->locked(); } void AppsAPI::ensureForegroundApp() { diff --git a/applications/system-service/appsapi.h b/applications/system-service/appsapi.h index 3d1574804..f5dbe60ea 100644 --- a/applications/system-service/appsapi.h +++ b/applications/system-service/appsapi.h @@ -39,489 +39,70 @@ class AppsAPI : public APIBase { Q_PROPERTY(QVariantMap pausedApplications READ pausedApplications) public: - static AppsAPI* singleton(AppsAPI* self = nullptr){ - static AppsAPI* instance; - if(self != nullptr){ - instance = self; - } - return instance; - } + static AppsAPI* singleton(AppsAPI* self = nullptr); AppsAPI(QObject* parent); ~AppsAPI(); void startup(); int state() { return 0; } // Ignore this, it's a kludge to get the xml to generate - void setEnabled(bool enabled){ - qDebug() << "Apps API" << enabled; - for(auto app : applications){ - if(enabled){ - app->registerPath(); - }else{ - app->unregisterPath(); - } - } - } + void setEnabled(bool enabled); - Q_INVOKABLE QDBusObjectPath registerApplication(QVariantMap properties){ - if(!hasPermission("apps")){ - return QDBusObjectPath("/"); - } - return registerApplicationNoSecurityCheck(properties); - } - QDBusObjectPath registerApplicationNoSecurityCheck(QVariantMap properties){ - QString name = properties.value("name", "").toString(); - QString bin = properties.value("bin", "").toString(); - int type = properties.value("type", ApplicationType::Foreground).toInt(); - if(type < ApplicationType::Foreground || type > ApplicationType::Backgroundable){ - qDebug() << "Invalid configuration: Invalid type" << type; - return QDBusObjectPath("/"); - } - if(name.isEmpty()){ - qDebug() << "Invalid configuration: Name is empty"; - return QDBusObjectPath("/"); - } - if(bin.isEmpty() || !QFile::exists(bin)){ - qDebug() << "Invalid configuration: " << name << " has invalid bin" << bin; - return QDBusObjectPath("/"); - } - if(!QFileInfo(bin).isExecutable()){ - qDebug() << "Invalid configuration: " << name << " has bin that is not executable" << bin; - return QDBusObjectPath("/"); - } - if(applications.contains(name)){ - return applications[name]->qPath(); - } - QDBusObjectPath path; - Oxide::Sentry::sentry_transaction("apps", "registerApplication", [this, &path, name, properties](Oxide::Sentry::Transaction* t){ - Q_UNUSED(t); - path = QDBusObjectPath(getPath(name)); - auto app = new Application(path, reinterpret_cast(this)); - auto displayName = properties.value("displayName", name).toString(); - app->setConfig(properties); - applications.insert(name, app); - app->registerPath(); - emit applicationRegistered(path); - }); - return path; - } - Q_INVOKABLE bool unregisterApplication(QDBusObjectPath path){ - if(!hasPermission("apps")){ - return false; - } - auto app = getApplication(path); - if(app == nullptr){ - return true; - } - if(app->systemApp()){ - return false; - } - unregisterApplication(app); - return true; - } + Q_INVOKABLE QDBusObjectPath registerApplication(QVariantMap properties); + QDBusObjectPath registerApplicationNoSecurityCheck(QVariantMap properties); + Q_INVOKABLE bool unregisterApplication(QDBusObjectPath path); - Q_INVOKABLE void reload(){ - if(!hasPermission("apps")){ - return; - } - Oxide::Sentry::sentry_transaction("apps", "reload", [this](Oxide::Sentry::Transaction* t){ - Q_UNUSED(t); - writeApplications(); - readApplications(); - }); - } + Q_INVOKABLE void reload(); - QDBusObjectPath startupApplication(){ - if(!hasPermission("apps")){ - return QDBusObjectPath("/"); - } - return m_startupApplication; - } - void setStartupApplication(QDBusObjectPath path){ - if(!hasPermission("apps")){ - return; - } - if(getApplication(path) != nullptr){ - m_startupApplication = path; - settings.setValue("startupApplication", path.path()); - } - } - QDBusObjectPath lockscreenApplication(){ - if(!hasPermission("apps")){ - return QDBusObjectPath("/"); - } - return m_lockscreenApplication; - } - void setLockscreenApplication(QDBusObjectPath path){ - if(!hasPermission("apps")){ - return; - } - if(getApplication(path) != nullptr){ - m_lockscreenApplication = path; - settings.setValue("lockscreenApplication", path.path()); - } - } - QDBusObjectPath processManagerApplication(){ - if(!hasPermission("apps")){ - return QDBusObjectPath("/"); - } - return m_processManagerApplication; - } - void setProcessManagerApplication(QDBusObjectPath path){ - if(!hasPermission("apps")){ - return; - } - if(getApplication(path) != nullptr){ - m_processManagerApplication = path; - settings.setValue("processManagerApplication", path.path()); - } - } - QDBusObjectPath taskSwitcherApplication(){ - if(!hasPermission("apps")){ - return QDBusObjectPath("/"); - } - return m_taskSwitcherApplication; - } - void setTaskSwitcherApplication(QDBusObjectPath path){ - if(!hasPermission("apps")){ - return; - } - if(getApplication(path) != nullptr){ - m_taskSwitcherApplication = path; - settings.setValue("taskSwitcherApplication", path.path()); - } - } + QDBusObjectPath startupApplication(); + void setStartupApplication(QDBusObjectPath path); + QDBusObjectPath lockscreenApplication(); + void setLockscreenApplication(QDBusObjectPath path); + QDBusObjectPath processManagerApplication(); + void setProcessManagerApplication(QDBusObjectPath path); + QDBusObjectPath taskSwitcherApplication(); + void setTaskSwitcherApplication(QDBusObjectPath path); - QVariantMap getApplications(){ - QVariantMap result; - if(!hasPermission("apps")){ - return result; - } - for(auto app : applications){ - result.insert(app->name(), QVariant::fromValue(app->qPath())); - } - return result; - } + QVariantMap getApplications(); - QDBusObjectPath currentApplication(){ - if(!hasPermission("apps")){ - return QDBusObjectPath("/"); - } - return currentApplicationNoSecurityCheck(); - } - QDBusObjectPath currentApplicationNoSecurityCheck(){ - for(auto app : applications){ - if(app->stateNoSecurityCheck() == Application::InForeground){ - return app->qPath(); - } - } - return QDBusObjectPath("/"); - } + QDBusObjectPath currentApplication(); + QDBusObjectPath currentApplicationNoSecurityCheck(); - QVariantMap runningApplications(){ - if(!hasPermission("apps")){ - return QVariantMap(); - } - return runningApplicationsNoSecurityCheck(); - } - QVariantMap runningApplicationsNoSecurityCheck(){ - QVariantMap result; - for(auto app : applications){ - auto state = app->stateNoSecurityCheck(); - if(state == Application::InForeground || state == Application::InBackground){ - result.insert(app->name(), QVariant::fromValue(app->qPath())); - } - } - return result; - } - QVariantMap pausedApplications(){ - QVariantMap result; - if(!hasPermission("apps")){ - return result; - } - for(auto app : applications){ - auto state = app->stateNoSecurityCheck(); - if(state == Application::Paused){ - result.insert(app->name(), QVariant::fromValue(app->qPath())); - } - } - return result; - } + QVariantMap runningApplications(); + QVariantMap runningApplicationsNoSecurityCheck(); + QVariantMap pausedApplications(); - void unregisterApplication(Application* app){ - Oxide::Sentry::sentry_transaction("apps", "unregisterApplication", [this, app](Oxide::Sentry::Transaction* t){ - Q_UNUSED(t); - auto name = app->name(); - if(applications.contains(name)){ - applications.remove(name); - emit applicationUnregistered(app->qPath()); - app->deleteLater(); - } - }); - } - void pauseAll(){ - for(auto app : applications){ - app->pauseNoSecurityCheck(false); - } - } + void unregisterApplication(Application* app); + void pauseAll(); void resumeIfNone(); - Application* getApplication(QDBusObjectPath path){ - for(auto app : applications){ - if(app->path() == path.path()){ - return app; - } - } - return nullptr; - } - QStringList getPreviousApplications(){ return previousApplications; } - Q_INVOKABLE QDBusObjectPath getApplicationPath(const QString& name){ - if(!hasPermission("apps")){ - return QDBusObjectPath("/"); - } - auto app = getApplication(name); - if(app == nullptr){ - return QDBusObjectPath("/"); - } - return app->qPath(); - } - Application* getApplication(const QString& name){ - if(applications.contains(name)){ - return applications[name]; - } - return nullptr; - } - void connectSignals(Application* app, int signal){ - switch(signal){ - case 1: - connect(signalHandler, &SignalHandler::sigUsr1, app, &Application::sigUsr1); - break; - case 2: - connect(signalHandler, &SignalHandler::sigUsr2, app, &Application::sigUsr2); - break; - } - } - void disconnectSignals(Application* app, int signal){ - switch(signal){ - case 1: - disconnect(signalHandler, &SignalHandler::sigUsr1, app, &Application::sigUsr1); - break; - case 2: - disconnect(signalHandler, &SignalHandler::sigUsr2, app, &Application::sigUsr2); - break; - } - } - Q_INVOKABLE bool previousApplication(){ - if(!hasPermission("apps")){ - return false; - } - return previousApplicationNoSecurityCheck(); - } - bool previousApplicationNoSecurityCheck(){ - if(locked()){ - return false; - } - if(previousApplications.isEmpty()){ - qDebug() << "No previous applications"; - return false; - } - bool found = false; - while(!previousApplications.isEmpty()){ - auto name = previousApplications.takeLast(); - auto application = getApplication(name); - if(application == nullptr){ - continue; - } - auto currentApplication = getApplication(this->currentApplicationNoSecurityCheck()); - if(currentApplication != nullptr){ - if(currentApplication == application){ - continue; - } - currentApplication->pauseNoSecurityCheck(false); - } - application->launchNoSecurityCheck(); - qDebug() << "Resuming previous application" << application->name(); - found = true; - break; - } - qDebug() << "Previous Applications" << previousApplications; - return found; - } - void forceRecordPreviousApplication(){ - auto currentApplication = getApplication(this->currentApplicationNoSecurityCheck()); - if(currentApplication == nullptr){ - O_WARNING("Unable to find current application"); - return; - } - auto name = currentApplication->name(); - previousApplications.removeAll(name); - previousApplications.append(name); - qDebug() << "Previous Applications" << previousApplications; - } - void recordPreviousApplication(){ - auto currentApplication = getApplication(this->currentApplicationNoSecurityCheck()); - if(currentApplication == nullptr){ - O_WARNING("Unable to find current application"); - return; - } - if(currentApplication->qPath() == lockscreenApplication()){ - return; - } - if(currentApplication->qPath() == taskSwitcherApplication()){ - return; - } - auto name = currentApplication->name(); - removeFromPreviousApplications(name); - previousApplications.append(name); - qDebug() << "Previous Applications" << previousApplications; - } - void removeFromPreviousApplications(QString name){ previousApplications.removeAll(name); } + Application* getApplication(QDBusObjectPath path); + QStringList getPreviousApplications(); + Q_INVOKABLE QDBusObjectPath getApplicationPath(const QString& name); + Application* getApplication(const QString& name); + void connectSignals(Application* app, int signal); + void disconnectSignals(Application* app, int signal); + Q_INVOKABLE bool previousApplication(); + bool previousApplicationNoSecurityCheck(); + void forceRecordPreviousApplication(); + void recordPreviousApplication(); + void removeFromPreviousApplications(QString name); signals: void applicationRegistered(QDBusObjectPath); void applicationLaunched(QDBusObjectPath); void applicationUnregistered(QDBusObjectPath); void applicationPaused(QDBusObjectPath); - void applicationResumed(QDBusObjectPath); void applicationSignaled(QDBusObjectPath); + void applicationResumed(QDBusObjectPath); + void applicationSignaled(QDBusObjectPath); void applicationExited(QDBusObjectPath, int); public slots: - QT_DEPRECATED void leftHeld(){ openDefaultApplication(); } - void openDefaultApplication(){ - if(locked() || !hasPermission("apps")){ - return; - } - auto path = this->currentApplicationNoSecurityCheck(); - if(path.path() != "/"){ - auto currentApplication = getApplication(path); - if( - currentApplication != nullptr - && currentApplication->stateNoSecurityCheck() != Application::Inactive - && (path == m_startupApplication || path == m_lockscreenApplication) - ){ - qDebug() << "Already in default application"; - return; - } - } - auto app = getApplication(m_startupApplication); - if(app == nullptr){ - qDebug() << "Unable to find default application"; - return; - } - qDebug() << "Opening default application"; - app->launchNoSecurityCheck(); - } - QT_DEPRECATED void homeHeld(){ openTaskManager(); } - void openTaskManager(){ - if(locked() || !hasPermission("apps")){ - return; - } - auto path = this->currentApplicationNoSecurityCheck(); - if(path.path() != "/"){ - auto currentApplication = getApplication(path); - if( - currentApplication != nullptr - && currentApplication->stateNoSecurityCheck() != Application::Inactive - && path == m_lockscreenApplication - ){ - qDebug() << "Can't open task manager, on the lockscreen"; - return; - } - } - auto app = getApplication(m_processManagerApplication); - if(app == nullptr){ - qDebug() << "Unable to find task manager"; - return; - } - qDebug() << "Opening task manager"; - app->launchNoSecurityCheck(); - } - void openLockScreen(){ - if(locked() || !hasPermission("apps")){ - return; - } - auto path = this->currentApplicationNoSecurityCheck(); - if(path.path() != "/"){ - auto currentApplication = getApplication(path); - if( - currentApplication != nullptr - && currentApplication->stateNoSecurityCheck() != Application::Inactive - && path == m_lockscreenApplication - ){ - qDebug() << "Already on the lockscreen"; - return; - } - } - auto app = getApplication(m_lockscreenApplication); - if(app == nullptr){ - qDebug() << "Unable to find lockscreen"; - return; - } - qDebug() << "Opening lock screen"; - app->launchNoSecurityCheck(); - } - void openTaskSwitcher(){ - if(locked() || !hasPermission("apps")){ - return; - } - auto path = this->currentApplicationNoSecurityCheck(); - if(path.path() != "/"){ - auto currentApplication = getApplication(path); - if( - currentApplication != nullptr - && currentApplication->stateNoSecurityCheck() != Application::Inactive - ){ - if(path == m_lockscreenApplication){ - qDebug() << "Can't open task switcher, on the lockscreen"; - return; - } - if(path == m_taskSwitcherApplication){ - qDebug() << "Already on the task switcher"; - return; - } - } - } - auto app = getApplication(m_taskSwitcherApplication); - if(app != nullptr){ - app->launchNoSecurityCheck(); - return; - } - app = getApplication(m_startupApplication); - if(app == nullptr){ - qDebug() << "Unable to find default application"; - return; - } - qDebug() << "Opening task switcher"; - app->launchNoSecurityCheck(); - } - void openTerminal(){ - if(locked() || !hasPermission("apps")){ - return; - } - auto path = this->currentApplicationNoSecurityCheck(); - if(path.path() != "/"){ - auto currentApplication = getApplication(path); - if( - currentApplication != nullptr - && currentApplication->stateNoSecurityCheck() != Application::Inactive - ){ - if(path == m_lockscreenApplication){ - qDebug() << "Can't open task switcher, on the lockscreen"; - return; - } - } - } - auto app = getApplication("yaft"); - if(app != nullptr){ - app->launchNoSecurityCheck(); - return; - } - app = getApplication("fingerterm"); - if(app == nullptr){ - qDebug() << "Unable to find terminal application"; - return; - } - qDebug() << "Opening terminal"; - app->launchNoSecurityCheck(); - } + QT_DEPRECATED void leftHeld(); + void openDefaultApplication(); + QT_DEPRECATED void homeHeld(); + void openTaskManager(); + void openLockScreen(); + void openTaskSwitcher(); + void openTerminal(); private: bool m_stopping; @@ -536,167 +117,13 @@ public slots: QDBusObjectPath m_taskSwitcherApplication; bool m_sleeping; Application* resumeApp = nullptr; - QString getPath(QString name){ - static const QUuid NS = QUuid::fromString(QLatin1String("{d736a9e1-10a9-4258-9634-4b0fa91189d5}")); - return QString(OXIDE_SERVICE_PATH) + "/apps/" + QUuid::createUuidV5(NS, name).toString(QUuid::Id128); - } + QString getPath(QString name); QString _noApplicationsMessage = "No applications have been found. This is the result of invalid configuration. Open an issue on\nhttps://github.com/Eeems-Org/oxide\nto get support resolving this."; QString _noForegroundAppMessage = "No foreground application currently running. Open an issue on\nhttps://github.com/Eeems-Org/oxide\nto get support resolving this."; - void writeApplications(){ - auto apps = applications.values(); - int size = apps.size(); - settings.beginWriteArray("applications", size); - for(int i = 0; i < size; ++i){ - settings.setArrayIndex(i); - auto app = apps[i]; - auto config = app->getConfig(); - // Add/Update config items - for(auto key : config.keys()){ - settings.setValue(key, config[key]); - } - // Remove old config - for(auto key : settings.childKeys()){ - if(!config.contains(key)){ - settings.remove(key); - } - } - } - settings.endArray(); - } - void readApplications(){ - settings.sync(); - if(!applications.empty()){ - // Unregister any applications that have been removed from the settings file - int size = settings.beginReadArray("applications"); - QStringList names; - for(int i = 0; i < size; ++i){ - settings.setArrayIndex(i); - names << settings.value("name").toString(); - } - settings.endArray(); - for(auto name : applications.keys()){ - auto app = applications[name]; - if(!names.contains(name) && !app->systemApp() && !app->transient()){ - app->unregisterNoSecurityCheck(); - } - } - } - // Register/Update applications from the settings file - int size = settings.beginReadArray("applications"); - for(int i = 0; i < size; ++i){ - settings.setArrayIndex(i); - auto name = settings.value("name").toString(); - auto displayName = settings.value("displayName", name).toString(); - auto type = settings.value("type", Foreground).toInt(); - auto bin = settings.value("bin").toString(); - if(type < Foreground || type > Backgroundable || name.isEmpty() || bin.isEmpty()){ -#ifdef DEBUG - qDebug() << "Invalid configuration " << name; -#endif - continue; - } - QVariantMap properties { - {"name", name}, - {"displayName", displayName}, - {"description", settings.value("description", displayName).toString()}, - {"bin", bin}, - {"type", type}, - {"flags", settings.value("flags", QStringList()).toStringList()}, - {"icon", settings.value("icon", "").toString()}, - {"onPause", settings.value("onPause", "").toString()}, - {"onResume", settings.value("onResume", "").toString()}, - {"onStop", settings.value("onStop", "").toString()}, - {"environment", settings.value("environment", QVariantMap()).toMap()}, - {"workingDirectory", settings.value("workingDirectory", "").toString()}, - {"directories", settings.value("directories", QStringList()).toStringList()}, - {"permissions", settings.value("permissions", QStringList()).toStringList()}, - {"splash", settings.value("splash", "").toString()}, - }; - if(settings.contains("user")){ - properties.insert("user", settings.value("user", "").toString()); - } - if(settings.contains("group")){ - properties.insert("group", settings.value("group", "").toString()); - } - if(applications.contains(name)){ -#ifdef DEBUG - qDebug() << "Updating " << name; - qDebug() << properties; -#endif - applications[name]->setConfig(properties); - }else{ - qDebug() << name; -#ifdef DEBUG - qDebug() << properties; -#endif - registerApplicationNoSecurityCheck(properties); - } - } - settings.endArray(); - // Load system applications from disk - QDir dir(OXIDE_APPLICATION_REGISTRATIONS_DIRECTORY); - dir.setNameFilters(QStringList() << "*.oxide"); - QMap apps; - for(auto entry : dir.entryInfoList()){ - auto app = getRegistration(entry.filePath()); - if(app.isEmpty()){ - qDebug() << "Invalid file " << entry.filePath(); - continue; - } - auto name = entry.completeBaseName(); - app["name"] = name; - apps.insert(name, app); - } - // Unregister any system applications that no longer exist on disk. - for(auto application : applications.values()){ - auto name = application->name(); - if(!apps.contains(name) && application->systemApp()){ - qDebug() << name << "Is no longer found on disk"; - application->unregisterNoSecurityCheck(); - } - } - // Register/Update any system application. - for(auto app : apps){ - auto name = app["name"].toString(); - auto bin = app["bin"].toString(); - if(bin.isEmpty() || !QFile::exists(bin)){ - qDebug() << name << "Can't find application binary:" << bin; -#ifdef DEBUG - qDebug() << app; -#endif - continue; - } - if(!app.contains("flags") || !app["flags"].isArray()){ - app["flags"] = QJsonArray(); - } - auto flags = app["flags"].toArray(); - flags.prepend("system"); - app["flags"] = flags; - auto properties = registrationToMap(app); - if(applications.contains(name)){ -#ifdef DEBUG - qDebug() << "Updating " << name; - qDebug() << properties; -#endif - applications[name]->setConfig(properties); - }else{ - qDebug() << "New system app" << name; -#ifdef DEBUG - qDebug() << properties; -#endif - registerApplicationNoSecurityCheck(properties); - } - } - } - static void migrate(QSettings* settings, int fromVersion){ - if(fromVersion != 0){ - throw "Unknown settings version"; - } - // In the future migrate changes to settings between versions - settings->setValue("version", OXIDE_SETTINGS_VERSION); - settings->sync(); - } + void writeApplications(); + void readApplications(); + static void migrate(QSettings* settings, int fromVersion); bool locked(); void ensureForegroundApp(); }; diff --git a/applications/system-service/bss.cpp b/applications/system-service/bss.cpp index e58d531fe..c0221a25e 100644 --- a/applications/system-service/bss.cpp +++ b/applications/system-service/bss.cpp @@ -12,6 +12,111 @@ BSS::BSS(QString path, QString bssid, QString ssid, QObject* parent) } } +BSS::~BSS(){ unregisterPath(); } + +QString BSS::path(){ return m_path; } + +void BSS::registerPath(){ + auto bus = QDBusConnection::systemBus(); + bus.unregisterObject(path(), QDBusConnection::UnregisterTree); + if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ + qDebug() << "Registered" << path() << OXIDE_BSS_INTERFACE; + }else{ + qDebug() << "Failed to register" << path(); + } +} + +void BSS::unregisterPath(){ + auto bus = QDBusConnection::systemBus(); + if(bus.objectRegisteredAt(path()) != nullptr){ + qDebug() << "Unregistered" << path(); + bus.unregisterObject(path()); + } +} + +QString BSS::bssid(){ + if(!hasPermission("wifi")){ + return ""; + } + return m_bssid; } + +QString BSS::ssid(){ + if(!hasPermission("wifi")){ + return ""; + } + return m_ssid; +} + +QList BSS::paths(){ + QList result; + if(!hasPermission("wifi")){ + return result; + } + for(auto bss : bsss){ + result.append(bss->path()); + } + return result; +} + +void BSS::addBSS(const QString& path){ + if(paths().contains(path)){ + return; + } + auto bss = new IBSS(WPA_SUPPLICANT_SERVICE, path, QDBusConnection::systemBus()); + bsss.append(bss); + QObject::connect(bss, &IBSS::PropertiesChanged, this, &BSS::PropertiesChanged, Qt::QueuedConnection); +} + +void BSS::removeBSS(const QString& path){ + QMutableListIterator i(bsss); + while(i.hasNext()){ + auto bss = i.next(); + if(!bss->isValid() || bss->path() == path){ + i.remove(); + bss->deleteLater(); + } + } +} + +bool BSS::privacy(){ + if(!hasPermission("wifi")){ + return false; + } + for(auto bss : bsss){ + if(bss->privacy()){ + return true; + } + } + return false; +} + +ushort BSS::frequency(){ + if(!hasPermission("wifi")){ + return 0; + } + if(!bsss.size()){ + return 0; + } + return bsss.first()->frequency(); +} + +short BSS::signal(){ + if(!hasPermission("wifi")){ + return 0; + } + if(!bsss.size()){ + return 0; + } + int signal = 0; + for(auto bss : bsss){ + auto s = bss->signal(); + if(s > signal){ + signal = s; + } + } + return signal; +} + QDBusObjectPath BSS::connect(){ if(!hasPermission("wifi")){ return QDBusObjectPath("/"); @@ -22,6 +127,10 @@ QDBusObjectPath BSS::connect(){ } return wifiAPI->addNetwork(ssid(), QVariantMap()); } + +void BSS::PropertiesChanged(const QVariantMap& properties){ + emit propertiesChanged(properties); +} QDBusObjectPath BSS::network(){ if(!hasPermission("wifi")){ return QDBusObjectPath("/"); @@ -35,6 +144,20 @@ QDBusObjectPath BSS::network(){ return networks.first(); } +QStringList BSS::key_mgmt(){ + QStringList result; + if(!hasPermission("wifi")){ + return result; + } + if(!bsss.size()){ + return result; + } + auto bss = bsss.first(); + result.append(bss->wPA()["KeyMgmt"].value()); + result.append(bss->rSN()["KeyMgmt"].value()); + return result; +} + bool BSS::hasPermission(QString permission, const char* sender){ return wifiAPI->hasPermission(permission,sender); } #include "moc_bss.cpp" diff --git a/applications/system-service/bss.h b/applications/system-service/bss.h index 9888c082e..0bd4d04fb 100644 --- a/applications/system-service/bss.h +++ b/applications/system-service/bss.h @@ -7,7 +7,6 @@ #include #include "supplicant.h" -#include "network.h" // Must be included so that generate_xml.sh will work #include "../../shared/liboxide/meta.h" @@ -28,115 +27,22 @@ class BSS : public QObject{ BSS(QString path, QString bssid, QString ssid, QObject* parent); BSS(QString path, IBSS* bss, QObject* parent) : BSS(path, bss->bSSID(), bss->sSID(), parent) {} - ~BSS(){ unregisterPath(); } - QString path(){ return m_path; } - void registerPath(){ - auto bus = QDBusConnection::systemBus(); - bus.unregisterObject(path(), QDBusConnection::UnregisterTree); - if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_BSS_INTERFACE; - }else{ - qDebug() << "Failed to register" << path(); - } - } - void unregisterPath(){ - auto bus = QDBusConnection::systemBus(); - if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); - bus.unregisterObject(path()); - } - } + ~BSS(); + QString path(); + void registerPath(); + void unregisterPath(); - QString bssid(){ - if(!hasPermission("wifi")){ - return ""; - } - return m_bssid; } - QString ssid(){ - if(!hasPermission("wifi")){ - return ""; - } - return m_ssid; - } + QString bssid(); + QString ssid(); - QList paths(){ - QList result; - if(!hasPermission("wifi")){ - return result; - } - for(auto bss : bsss){ - result.append(bss->path()); - } - return result; - } - void addBSS(const QString& path){ - if(paths().contains(path)){ - return; - } - auto bss = new IBSS(WPA_SUPPLICANT_SERVICE, path, QDBusConnection::systemBus()); - bsss.append(bss); - QObject::connect(bss, &IBSS::PropertiesChanged, this, &BSS::PropertiesChanged, Qt::QueuedConnection); - } - void removeBSS(const QString& path){ - QMutableListIterator i(bsss); - while(i.hasNext()){ - auto bss = i.next(); - if(!bss->isValid() || bss->path() == path){ - i.remove(); - bss->deleteLater(); - } - } - } - bool privacy(){ - if(!hasPermission("wifi")){ - return false; - } - for(auto bss : bsss){ - if(bss->privacy()){ - return true; - } - } - return false; - } - ushort frequency(){ - if(!hasPermission("wifi")){ - return 0; - } - if(!bsss.size()){ - return 0; - } - return bsss.first()->frequency(); - } - short signal(){ - if(!hasPermission("wifi")){ - return 0; - } - if(!bsss.size()){ - return 0; - } - int signal = 0; - for(auto bss : bsss){ - auto s = bss->signal(); - if(s > signal){ - signal = s; - } - } - return signal; - } + QList paths(); + void addBSS(const QString& path); + void removeBSS(const QString& path); + bool privacy(); + ushort frequency(); + short signal(); QDBusObjectPath network(); - QStringList key_mgmt(){ - QStringList result; - if(!hasPermission("wifi")){ - return result; - } - if(!bsss.size()){ - return result; - } - auto bss = bsss.first(); - result.append(bss->wPA()["KeyMgmt"].value()); - result.append(bss->rSN()["KeyMgmt"].value()); - return result; - } + QStringList key_mgmt(); Q_INVOKABLE QDBusObjectPath connect(); signals: @@ -144,9 +50,7 @@ class BSS : public QObject{ void propertiesChanged(QVariantMap); private slots: - void PropertiesChanged(const QVariantMap& properties){ - emit propertiesChanged(properties); - } + void PropertiesChanged(const QVariantMap& properties); private: QString m_path; diff --git a/applications/system-service/buttonhandler.cpp b/applications/system-service/buttonhandler.cpp index b2e58ac0a..ff5f7eb7d 100644 --- a/applications/system-service/buttonhandler.cpp +++ b/applications/system-service/buttonhandler.cpp @@ -1,6 +1,5 @@ #include "buttonhandler.h" -#include "dbusservice.h" using namespace Oxide; @@ -51,6 +50,28 @@ ButtonHandler* ButtonHandler::init(){ return instance; } +ButtonHandler::ButtonHandler() : QThread(), filebuf(buttons.fd, ios::in), stream(&filebuf), pressed(), timer(this), m_enabled(true) { + flood = build_flood(); + timer.setInterval(100); + timer.setSingleShot(false); + connect(&timer, &QTimer::timeout, this, &ButtonHandler::timeout); + timer.start(); +} + +void ButtonHandler::setEnabled(bool enabled){ + m_enabled = enabled; +} + +void ButtonHandler::clear_buffer(){ + if(buttons.fd == -1){ + return; + } +#ifdef DEBUG + qDebug() << "Clearing event buffer on" << buttons.device.c_str(); +#endif + ::write(buttons.fd, flood, 512 * 8 * 4 * sizeof(input_event)); +} + void ButtonHandler::run(){ char name[256]; memset(name, 0, sizeof(name)); @@ -91,25 +112,112 @@ void ButtonHandler::run(){ } } } + +input_event* ButtonHandler::build_flood(){ + auto n = 512 * 8; + auto num_inst = 4; + input_event* ev = (input_event *)malloc(sizeof(struct input_event) * n * num_inst); + memset(ev, 0, sizeof(input_event) * n * num_inst); + auto i = 0; + while (i < n) { + ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 1); + ev[i++] = createEvent(EV_SYN, 0, 0); + ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 2); + ev[i++] = createEvent(EV_SYN, 0, 0); + } + return ev; +} + +input_event ButtonHandler::createEvent(ushort type, ushort code, int value){ + struct input_event event; + event.type = type; + event.code = code; + event.value = value; + return event; +} void ButtonHandler::pressKey(Qt::Key key){ int code; switch(key){ case Qt::Key_Left: code = 105; - break; + break; case Qt::Key_Home: code = 102; - break; + break; case Qt::Key_Right: code = 106; - break; + break; case Qt::Key_PowerOff: code = 116; - break; + break; default: return; } press_button(buttons, code, &stream); } +void ButtonHandler::keyDown(Qt::Key key){ + if(!m_enabled){ + return; + } + qDebug() << "Down" << key; + if(validKeys.contains(key) && !pressed.contains(key)){ + QElapsedTimer timer; + timer.start(); + pressed.insert(key, timer); + } +} + +void ButtonHandler::keyUp(Qt::Key key){ + if(!m_enabled){ + return; + } + qDebug() << "Up" << key; + if(!pressed.contains(key)){ + // This should never happen + return; + } + auto value = pressed.value(key); + pressed.remove(key); + if(value.hasExpired(700)){ + // Held event already fired + return; + } + if(key == Qt::Key_PowerOff){ + emit powerPress(); + return; + } + pressKey(key); +} + +void ButtonHandler::timeout(){ + if(!m_enabled){ + return; + } + for(auto key : pressed.keys()){ + // If the key has been held for a while + if(!pressed.value(key).hasExpired(700)){ + continue; + } + qDebug() << "Key held" << key; + switch(key){ + case Qt::Key_Left: + emit leftHeld(); + break; + case Qt::Key_Home: + emit homeHeld(); + break; + case Qt::Key_Right: + emit rightHeld(); + break; + case Qt::Key_PowerOff: + emit powerHeld(); + break; + default: + continue; + } + pressed.remove(key); + } +} + #include "moc_buttonhandler.cpp" diff --git a/applications/system-service/buttonhandler.h b/applications/system-service/buttonhandler.h index a4208ded7..0365c96fc 100644 --- a/applications/system-service/buttonhandler.h +++ b/applications/system-service/buttonhandler.h @@ -48,91 +48,17 @@ class ButtonHandler : public QThread { public: static ButtonHandler* init(); - ButtonHandler() : QThread(), filebuf(buttons.fd, ios::in), stream(&filebuf), pressed(), timer(this), m_enabled(true) { - flood = build_flood(); - timer.setInterval(100); - timer.setSingleShot(false); - connect(&timer, &QTimer::timeout, this, &ButtonHandler::timeout); - timer.start(); - } - void setEnabled(bool enabled){ - m_enabled = enabled; - } - void clear_buffer(){ - if(buttons.fd == -1){ - return; - } -#ifdef DEBUG - qDebug() << "Clearing event buffer on" << buttons.device.c_str(); -#endif - ::write(buttons.fd, flood, 512 * 8 * 4 * sizeof(input_event)); - } + ButtonHandler(); + void setEnabled(bool enabled); + void clear_buffer(); public slots: void pressKey(Qt::Key); private slots: - void keyDown(Qt::Key key){ - if(!m_enabled){ - return; - } - qDebug() << "Down" << key; - if(validKeys.contains(key) && !pressed.contains(key)){ - QElapsedTimer timer; - timer.start(); - pressed.insert(key, timer); - } - } - void keyUp(Qt::Key key){ - if(!m_enabled){ - return; - } - qDebug() << "Up" << key; - if(!pressed.contains(key)){ - // This should never happen - return; - } - auto value = pressed.value(key); - pressed.remove(key); - if(value.hasExpired(700)){ - // Held event already fired - return; - } - if(key == Qt::Key_PowerOff){ - emit powerPress(); - return; - } - pressKey(key); - } - void timeout(){ - if(!m_enabled){ - return; - } - for(auto key : pressed.keys()){ - // If the key has been held for a while - if(!pressed.value(key).hasExpired(700)){ - continue; - } - qDebug() << "Key held" << key; - switch(key){ - case Qt::Key_Left: - emit leftHeld(); - break; - case Qt::Key_Home: - emit homeHeld(); - break; - case Qt::Key_Right: - emit rightHeld(); - break; - case Qt::Key_PowerOff: - emit powerHeld(); - break; - default: - continue; - } - pressed.remove(key); - } - } + void keyDown(Qt::Key key); + void keyUp(Qt::Key key); + void timeout(); signals: void leftHeld(); @@ -152,27 +78,8 @@ private slots: const QSet validKeys { Qt::Key_Left, Qt::Key_Home, Qt::Key_Right, Qt::Key_PowerOff }; bool m_enabled; input_event* flood; - input_event* build_flood(){ - auto n = 512 * 8; - auto num_inst = 4; - input_event* ev = (input_event *)malloc(sizeof(struct input_event) * n * num_inst); - memset(ev, 0, sizeof(input_event) * n * num_inst); - auto i = 0; - while (i < n) { - ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 1); - ev[i++] = createEvent(EV_SYN, 0, 0); - ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 2); - ev[i++] = createEvent(EV_SYN, 0, 0); - } - return ev; - } - static inline input_event createEvent(ushort type, ushort code, int value){ - struct input_event event; - event.type = type; - event.code = code; - event.value = value; - return event; - } + input_event* build_flood(); + inline static input_event createEvent(ushort type, ushort code, int value); }; #endif // BUTTONHANDLER_H diff --git a/applications/system-service/dbusservice.cpp b/applications/system-service/dbusservice.cpp new file mode 100644 index 000000000..26ecf59e5 --- /dev/null +++ b/applications/system-service/dbusservice.cpp @@ -0,0 +1,269 @@ +#include "dbusservice.h" +#include "powerapi.h" +#include "wifiapi.h" +#include "appsapi.h" +#include "systemapi.h" +#include "screenapi.h" +#include "notificationapi.h" +#include "buttonhandler.h" +#include "digitizerhandler.h" + +DBusService* DBusService::singleton(){ + static DBusService* instance; + if(instance == nullptr){ + qRegisterMetaType>(); + qDebug() << "Creating DBusService instance"; + instance = new DBusService(qApp); + connect(qApp, &QGuiApplication::aboutToQuit, [=]{ + if(instance == nullptr){ + return; + } + emit instance->aboutToQuit(); + qDebug() << "Killing dbus service "; + delete instance; + qApp->processEvents(); + instance = nullptr; + }); + auto bus = QDBusConnection::systemBus(); + if(!bus.isConnected()){ +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Failed to connect to system bus.", "error"); +#endif + qFatal("Failed to connect to system bus."); + } + QDBusConnectionInterface* interface = bus.interface(); + qDebug() << "Registering service..."; + auto reply = interface->registerService(OXIDE_SERVICE); + bus.registerService(OXIDE_SERVICE); + if(!reply.isValid()){ + QDBusError ex = reply.error(); +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Unable to register service", "error"); +#endif + qFatal("Unable to register service: %s", ex.message().toStdString().c_str()); + } + qDebug() << "Registering object..."; + if(!bus.registerObject(OXIDE_SERVICE_PATH, instance, QDBusConnection::ExportAllContents)){ +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Unable to register interface", "error"); +#endif + qFatal("Unable to register interface: %s", bus.lastError().message().toStdString().c_str()); + } + connect(bus.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)), + instance, SLOT(serviceOwnerChanged(QString,QString,QString))); + qDebug() << "Registered"; + } + return instance; +} + +DBusService::DBusService(QObject* parent) : APIBase(parent), apis(){ +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Initializing APIs", "info"); +#endif + Oxide::Sentry::sentry_transaction("dbus", "init", [this](Oxide::Sentry::Transaction* t){ + Oxide::Sentry::sentry_span(t, "apis", "Initialize APIs", [this](Oxide::Sentry::Span* s){ + Oxide::Sentry::sentry_span(s, "wifi", "Initialize wifi API", [this]{ + apis.insert("wifi", APIEntry{ + .path = QString(OXIDE_SERVICE_PATH) + "/wifi", + .dependants = new QStringList(), + .instance = new WifiAPI(this), + }); + }); + Oxide::Sentry::sentry_span(s, "system", "Initialize system API", [this]{ + apis.insert("system", APIEntry{ + .path = QString(OXIDE_SERVICE_PATH) + "/system", + .dependants = new QStringList(), + .instance = new SystemAPI(this), + }); + }); + Oxide::Sentry::sentry_span(s, "power", "Initialize power API", [this]{ + apis.insert("power", APIEntry{ + .path = QString(OXIDE_SERVICE_PATH) + "/power", + .dependants = new QStringList(), + .instance = new PowerAPI(this), + }); + }); + Oxide::Sentry::sentry_span(s, "screen", "Initialize screen API", [this]{ + apis.insert("screen", APIEntry{ + .path = QString(OXIDE_SERVICE_PATH) + "/screen", + .dependants = new QStringList(), + .instance = new ScreenAPI(this), + }); + }); + Oxide::Sentry::sentry_span(s, "apps", "Initialize apps API", [this]{ + apis.insert("apps", APIEntry{ + .path = QString(OXIDE_SERVICE_PATH) + "/apps", + .dependants = new QStringList(), + .instance = new AppsAPI(this), + }); + }); + Oxide::Sentry::sentry_span(s, "notification", "Initialize notification API", [this]{ + apis.insert("notification", APIEntry{ + .path = QString(OXIDE_SERVICE_PATH) + "/notification", + .dependants = new QStringList(), + .instance = new NotificationAPI(this), + }); + }); + }); +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Connecting button handler events", "info"); +#endif + Oxide::Sentry::sentry_span(t, "connect", "Connect events", []{ + if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM1){ + connect(buttonHandler, &ButtonHandler::leftHeld, systemAPI, &SystemAPI::leftAction); + connect(buttonHandler, &ButtonHandler::homeHeld, systemAPI, &SystemAPI::homeAction); + connect(buttonHandler, &ButtonHandler::rightHeld, systemAPI, &SystemAPI::rightAction); + } + connect(buttonHandler, &ButtonHandler::powerHeld, systemAPI, &SystemAPI::powerAction); + connect(buttonHandler, &ButtonHandler::powerPress, systemAPI, &SystemAPI::suspend); + connect(buttonHandler, &ButtonHandler::activity, systemAPI, &SystemAPI::activity); +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Connecting power events", "info"); +#endif + connect(powerAPI, &PowerAPI::chargerStateChanged, systemAPI, &SystemAPI::activity); +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Connecting system events", "info"); +#endif + connect(systemAPI, &SystemAPI::leftAction, appsAPI, []{ + if(notificationAPI->locked()){ + return; + } + auto currentApplication = appsAPI->getApplication(appsAPI->currentApplicationNoSecurityCheck()); + if(currentApplication != nullptr && currentApplication->path() == appsAPI->lockscreenApplication().path()){ + qDebug() << "Left Action cancelled. On lockscreen"; + return; + } + if(!appsAPI->previousApplicationNoSecurityCheck()){ + appsAPI->openDefaultApplication(); + } + }); + connect(systemAPI, &SystemAPI::homeAction, appsAPI, &AppsAPI::openTaskManager); + connect(systemAPI, &SystemAPI::bottomAction, appsAPI, &AppsAPI::openTaskSwitcher); + connect(systemAPI, &SystemAPI::topAction, systemAPI, &SystemAPI::toggleSwipes); + }); +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Cleaning up", "info"); +#endif + Oxide::Sentry::sentry_span(t, "cleanup", "Cleanup", [this]{ + auto bus = QDBusConnection::systemBus(); + for(auto api : apis){ + bus.unregisterObject(api.path); + } + }); +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "APIs initialized", "info"); +#endif + }); +} + +DBusService::~DBusService(){ +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "Disconnecting APIs", "info"); +#endif + qDebug() << "Removing all APIs"; + auto bus = QDBusConnection::systemBus(); + for(auto api : apis){ + api.instance->setEnabled(false); + bus.unregisterObject(api.path); + emit apiUnavailable(QDBusObjectPath(api.path)); + delete api.instance; + delete api.dependants; + } + apis.clear(); +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "APIs disconnected", "info"); +#endif +} + +void DBusService::setEnabled(bool enabled){ Q_UNUSED(enabled); } + +QObject* DBusService::getAPI(QString name){ + if(!apis.contains(name)){ + return nullptr; + } + return apis[name].instance; +} + +int DBusService::tarnishPid(){ return qApp->applicationPid(); } + +QDBusObjectPath DBusService::requestAPI(QString name, QDBusMessage message) { +#ifdef SENTRY + sentry_breadcrumb("dbusservice", ("requestAPI() " + name).toStdString().c_str(), "query"); +#endif + if(!hasPermission(name)){ + return QDBusObjectPath("/"); + } + if(!apis.contains(name)){ + return QDBusObjectPath("/"); + } + auto api = apis[name]; + auto bus = QDBusConnection::systemBus(); + if(bus.objectRegisteredAt(api.path) == nullptr){ + bus.registerObject(api.path, api.instance, QDBusConnection::ExportAllContents); + } + if(!api.dependants->size()){ + qDebug() << "Registering " << api.path; + api.instance->setEnabled(true); + emit apiAvailable(QDBusObjectPath(api.path)); + } + api.dependants->append(message.service()); + return QDBusObjectPath(api.path); +} + +void DBusService::releaseAPI(QString name, QDBusMessage message) { +#ifdef SENTRY + sentry_breadcrumb("dbusservice", ("releaseAPI() " + name).toStdString().c_str(), "query"); +#endif + if(!apis.contains(name)){ + return; + } + auto api = apis[name]; + auto client = message.service(); + api.dependants->removeAll(client); + if(!api.dependants->size()){ + qDebug() << "Unregistering " << api.path; + api.instance->setEnabled(false); + QDBusConnection::systemBus().unregisterObject(api.path, QDBusConnection::UnregisterNode); + emit apiUnavailable(QDBusObjectPath(api.path)); + } +} + +QVariantMap DBusService::APIs(){ +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "APIs()", "query"); +#endif + QVariantMap result; + for(auto key : apis.keys()){ + auto api = apis[key]; + if(api.dependants->size()){ + result[key] = QVariant::fromValue(api.path); + } + } + return result; +} + +void DBusService::startup(){ +#ifdef SENTRY + sentry_breadcrumb("dbusservice", "startup", "navigation"); +#endif + appsAPI->startup(); +} + +void DBusService::serviceOwnerChanged(const QString& name, const QString& oldOwner, const QString& newOwner){ + Q_UNUSED(oldOwner); + if(newOwner.isEmpty()){ + auto bus = QDBusConnection::systemBus(); + for(auto key : apis.keys()){ + auto api = apis[key]; + api.dependants->removeAll(name); + if(!api.dependants->size() && bus.objectRegisteredAt(api.path) != nullptr){ + qDebug() << "Automatically unregistering " << api.path; + api.instance->setEnabled(false); + bus.unregisterObject(api.path, QDBusConnection::UnregisterNode); + apiUnavailable(QDBusObjectPath(api.path)); + } + } + systemAPI->uninhibitAll(name); + } +} +#include "moc_dbusservice.cpp" diff --git a/applications/system-service/dbusservice.h b/applications/system-service/dbusservice.h index 5aac4509e..4f2ff626b 100644 --- a/applications/system-service/dbusservice.h +++ b/applications/system-service/dbusservice.h @@ -12,15 +12,6 @@ #include #include -#include "powerapi.h" -#include "wifiapi.h" -#include "appsapi.h" -#include "systemapi.h" -#include "screenapi.h" -#include "notificationapi.h" -#include "buttonhandler.h" -#include "digitizerhandler.h" - // Must be included so that generate_xml.sh will work #include "../../shared/liboxide/meta.h" @@ -41,242 +32,21 @@ class DBusService : public APIBase { Q_PROPERTY(int tarnishPid READ tarnishPid) public: - static DBusService* singleton(){ - static DBusService* instance; - if(instance == nullptr){ - qRegisterMetaType>(); - qDebug() << "Creating DBusService instance"; - instance = new DBusService(qApp); - connect(qApp, &QGuiApplication::aboutToQuit, [=]{ - if(instance == nullptr){ - return; - } - emit instance->aboutToQuit(); - qDebug() << "Killing dbus service "; - delete instance; - qApp->processEvents(); - instance = nullptr; - }); - auto bus = QDBusConnection::systemBus(); - if(!bus.isConnected()){ -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Failed to connect to system bus.", "error"); -#endif - qFatal("Failed to connect to system bus."); - } - QDBusConnectionInterface* interface = bus.interface(); - qDebug() << "Registering service..."; - auto reply = interface->registerService(OXIDE_SERVICE); - bus.registerService(OXIDE_SERVICE); - if(!reply.isValid()){ - QDBusError ex = reply.error(); -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Unable to register service", "error"); -#endif - qFatal("Unable to register service: %s", ex.message().toStdString().c_str()); - } - qDebug() << "Registering object..."; - if(!bus.registerObject(OXIDE_SERVICE_PATH, instance, QDBusConnection::ExportAllContents)){ -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Unable to register interface", "error"); -#endif - qFatal("Unable to register interface: %s", bus.lastError().message().toStdString().c_str()); - } - connect(bus.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)), - instance, SLOT(serviceOwnerChanged(QString,QString,QString))); - qDebug() << "Registered"; - } - return instance; - } - DBusService(QObject* parent) : APIBase(parent), apis(){ -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Initializing APIs", "info"); -#endif - Oxide::Sentry::sentry_transaction("dbus", "init", [this](Oxide::Sentry::Transaction* t){ - Oxide::Sentry::sentry_span(t, "apis", "Initialize APIs", [this](Oxide::Sentry::Span* s){ - Oxide::Sentry::sentry_span(s, "wifi", "Initialize wifi API", [this]{ - apis.insert("wifi", APIEntry{ - .path = QString(OXIDE_SERVICE_PATH) + "/wifi", - .dependants = new QStringList(), - .instance = new WifiAPI(this), - }); - }); - Oxide::Sentry::sentry_span(s, "system", "Initialize system API", [this]{ - apis.insert("system", APIEntry{ - .path = QString(OXIDE_SERVICE_PATH) + "/system", - .dependants = new QStringList(), - .instance = new SystemAPI(this), - }); - }); - Oxide::Sentry::sentry_span(s, "power", "Initialize power API", [this]{ - apis.insert("power", APIEntry{ - .path = QString(OXIDE_SERVICE_PATH) + "/power", - .dependants = new QStringList(), - .instance = new PowerAPI(this), - }); - }); - Oxide::Sentry::sentry_span(s, "screen", "Initialize screen API", [this]{ - apis.insert("screen", APIEntry{ - .path = QString(OXIDE_SERVICE_PATH) + "/screen", - .dependants = new QStringList(), - .instance = new ScreenAPI(this), - }); - }); - Oxide::Sentry::sentry_span(s, "apps", "Initialize apps API", [this]{ - apis.insert("apps", APIEntry{ - .path = QString(OXIDE_SERVICE_PATH) + "/apps", - .dependants = new QStringList(), - .instance = new AppsAPI(this), - }); - }); - Oxide::Sentry::sentry_span(s, "notification", "Initialize notification API", [this]{ - apis.insert("notification", APIEntry{ - .path = QString(OXIDE_SERVICE_PATH) + "/notification", - .dependants = new QStringList(), - .instance = new NotificationAPI(this), - }); - }); - }); -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Connecting button handler events", "info"); -#endif - Oxide::Sentry::sentry_span(t, "connect", "Connect events", []{ - if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM1){ - connect(buttonHandler, &ButtonHandler::leftHeld, systemAPI, &SystemAPI::leftAction); - connect(buttonHandler, &ButtonHandler::homeHeld, systemAPI, &SystemAPI::homeAction); - connect(buttonHandler, &ButtonHandler::rightHeld, systemAPI, &SystemAPI::rightAction); - } - connect(buttonHandler, &ButtonHandler::powerHeld, systemAPI, &SystemAPI::powerAction); - connect(buttonHandler, &ButtonHandler::powerPress, systemAPI, &SystemAPI::suspend); - connect(buttonHandler, &ButtonHandler::activity, systemAPI, &SystemAPI::activity); -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Connecting power events", "info"); -#endif - connect(powerAPI, &PowerAPI::chargerStateChanged, systemAPI, &SystemAPI::activity); -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Connecting system events", "info"); -#endif - connect(systemAPI, &SystemAPI::leftAction, appsAPI, []{ - if(notificationAPI->locked()){ - return; - } - auto currentApplication = appsAPI->getApplication(appsAPI->currentApplicationNoSecurityCheck()); - if(currentApplication != nullptr && currentApplication->path() == appsAPI->lockscreenApplication().path()){ - qDebug() << "Left Action cancelled. On lockscreen"; - return; - } - if(!appsAPI->previousApplicationNoSecurityCheck()){ - appsAPI->openDefaultApplication(); - } - }); - connect(systemAPI, &SystemAPI::homeAction, appsAPI, &AppsAPI::openTaskManager); - connect(systemAPI, &SystemAPI::bottomAction, appsAPI, &AppsAPI::openTaskSwitcher); - connect(systemAPI, &SystemAPI::topAction, systemAPI, &SystemAPI::toggleSwipes); - }); -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Cleaning up", "info"); -#endif - Oxide::Sentry::sentry_span(t, "cleanup", "Cleanup", [this]{ - auto bus = QDBusConnection::systemBus(); - for(auto api : apis){ - bus.unregisterObject(api.path); - } - }); -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "APIs initialized", "info"); -#endif - }); - } - ~DBusService(){ -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "Disconnecting APIs", "info"); -#endif - qDebug() << "Removing all APIs"; - auto bus = QDBusConnection::systemBus(); - for(auto api : apis){ - api.instance->setEnabled(false); - bus.unregisterObject(api.path); - emit apiUnavailable(QDBusObjectPath(api.path)); - delete api.instance; - delete api.dependants; - } - apis.clear(); -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "APIs disconnected", "info"); -#endif - } - void setEnabled(bool enabled){ Q_UNUSED(enabled); }; + static DBusService* singleton(); + DBusService(QObject* parent); + ~DBusService(); + void setEnabled(bool enabled);; - QObject* getAPI(QString name){ - if(!apis.contains(name)){ - return nullptr; - } - return apis[name].instance; - } + QObject* getAPI(QString name); - int tarnishPid(){ return qApp->applicationPid(); } + int tarnishPid(); public slots: - QDBusObjectPath requestAPI(QString name, QDBusMessage message) { -#ifdef SENTRY - sentry_breadcrumb("dbusservice", ("requestAPI() " + name).toStdString().c_str(), "query"); -#endif - if(!hasPermission(name)){ - return QDBusObjectPath("/"); - } - if(!apis.contains(name)){ - return QDBusObjectPath("/"); - } - auto api = apis[name]; - auto bus = QDBusConnection::systemBus(); - if(bus.objectRegisteredAt(api.path) == nullptr){ - bus.registerObject(api.path, api.instance, QDBusConnection::ExportAllContents); - } - if(!api.dependants->size()){ - qDebug() << "Registering " << api.path; - api.instance->setEnabled(true); - emit apiAvailable(QDBusObjectPath(api.path)); - } - api.dependants->append(message.service()); - return QDBusObjectPath(api.path); - }; - Q_NOREPLY void releaseAPI(QString name, QDBusMessage message) { -#ifdef SENTRY - sentry_breadcrumb("dbusservice", ("releaseAPI() " + name).toStdString().c_str(), "query"); -#endif - if(!apis.contains(name)){ - return; - } - auto api = apis[name]; - auto client = message.service(); - api.dependants->removeAll(client); - if(!api.dependants->size()){ - qDebug() << "Unregistering " << api.path; - api.instance->setEnabled(false); - QDBusConnection::systemBus().unregisterObject(api.path, QDBusConnection::UnregisterNode); - emit apiUnavailable(QDBusObjectPath(api.path)); - } - }; - QVariantMap APIs(){ -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "APIs()", "query"); -#endif - QVariantMap result; - for(auto key : apis.keys()){ - auto api = apis[key]; - if(api.dependants->size()){ - result[key] = QVariant::fromValue(api.path); - } - } - return result; - }; + QDBusObjectPath requestAPI(QString name, QDBusMessage message);; + Q_NOREPLY void releaseAPI(QString name, QDBusMessage message);; + QVariantMap APIs();; - void startup(){ -#ifdef SENTRY - sentry_breadcrumb("dbusservice", "startup", "navigation"); -#endif - appsAPI->startup(); - } + void startup(); signals: @@ -285,23 +55,7 @@ public slots: void aboutToQuit(); private slots: - void serviceOwnerChanged(const QString& name, const QString& oldOwner, const QString& newOwner){ - Q_UNUSED(oldOwner); - if(newOwner.isEmpty()){ - auto bus = QDBusConnection::systemBus(); - for(auto key : apis.keys()){ - auto api = apis[key]; - api.dependants->removeAll(name); - if(!api.dependants->size() && bus.objectRegisteredAt(api.path) != nullptr){ - qDebug() << "Automatically unregistering " << api.path; - api.instance->setEnabled(false); - bus.unregisterObject(api.path, QDBusConnection::UnregisterNode); - apiUnavailable(QDBusObjectPath(api.path)); - } - } - systemAPI->uninhibitAll(name); - } - } + void serviceOwnerChanged(const QString& name, const QString& oldOwner, const QString& newOwner); private: QMap apis; diff --git a/applications/system-service/digitizerhandler.cpp b/applications/system-service/digitizerhandler.cpp new file mode 100644 index 000000000..7e77364db --- /dev/null +++ b/applications/system-service/digitizerhandler.cpp @@ -0,0 +1,181 @@ +#include "digitizerhandler.h" + +DigitizerHandler* DigitizerHandler::singleton_touchScreen(){ + static DigitizerHandler* instance; + if(instance != nullptr){ + return instance; + } + // Get event devices + event_device touchScreen_device(deviceSettings.getTouchDevicePath(), O_RDWR); + if(touchScreen_device.fd == -1){ + qDebug() << "Failed to open event device: " << touchScreen_device.device.c_str(); + throw QException(); + } + instance = new DigitizerHandler(touchScreen_device); + instance->start(); + return instance; +} + +DigitizerHandler* DigitizerHandler::singleton_wacom(){ + static DigitizerHandler* instance; + if(instance != nullptr){ + return instance; + } + // Get event devices + event_device wacom_device(deviceSettings.getWacomDevicePath(), O_RDWR); + if(wacom_device.fd == -1){ + qDebug() << "Failed to open event device: " << wacom_device.device.c_str(); + throw QException(); + } + instance = new DigitizerHandler(wacom_device); + instance->start(); + return instance; +} + +DigitizerHandler::DigitizerHandler(event_device& device) + : QThread(), + filebuf(device.fd, ios::in), + stream(&filebuf), + m_enabled(true), + device(device) { + flood = build_flood(); +} + +DigitizerHandler::~DigitizerHandler(){ + if(device.fd == -1){ + return; + } + if(device.locked){ + ungrab(); + } + close(device.fd); +} + +void DigitizerHandler::setEnabled(bool enabled){ + m_enabled = enabled; +} + +void DigitizerHandler::grab(){ + if(!grabbed()){ + device.lock(); + } +} + +void DigitizerHandler::ungrab(){ + if(grabbed()){ + device.unlock(); + } +} + +bool DigitizerHandler::grabbed() { return device.locked; } + +void DigitizerHandler::write(ushort type, ushort code, int value){ + auto event = createEvent(type, code, value); + ::write(device.fd, &event, sizeof(input_event)); +#ifdef DEBUG + qDebug() << "Emitted event " << event.time.tv_sec << event.time.tv_usec << type << code << value; +#endif +} + +void DigitizerHandler::write(input_event* events, size_t size){ + ::write(device.fd, events, size); +} + +void DigitizerHandler::syn(){ + write(EV_SYN, SYN_REPORT, 0); +} + +void DigitizerHandler::clear_buffer(){ + if(device.fd == -1){ + return; + } +#ifdef DEBUG + qDebug() << "Clearing event buffer on" << device.device.c_str(); +#endif + write(flood, 512 * 8 * 4 * sizeof(input_event)); +} + +input_event DigitizerHandler::createEvent(ushort type, ushort code, int value){ + struct input_event event; + event.type = type; + event.code = code; + event.value = value; + return event; +} + +input_event* DigitizerHandler::build_flood(){ + auto n = 512 * 8; + auto num_inst = 4; + input_event* ev = (input_event*)malloc(sizeof(struct input_event) * n * num_inst); + memset(ev, 0, sizeof(input_event) * n * num_inst); + auto i = 0; + while (i < n) { + ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 1); + ev[i++] = createEvent(EV_SYN, 0, 0); + ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 2); + ev[i++] = createEvent(EV_SYN, 0, 0); + } + return ev; +} + +void DigitizerHandler::run(){ + char name[256]; + memset(name, 0, sizeof(name)); + ioctl(device.fd, EVIOCGNAME(sizeof(name)), name); + qDebug() << "Reading From : " << device.device.c_str() << " (" << name << ")"; + qDebug() << "Listening for events..."; + while(handle_events()){ + qApp->processEvents(QEventLoop::AllEvents, 100); + QThread::yieldCurrentThread(); + } +} + +bool DigitizerHandler::handle_events(){ + vector event_buffer; + bool success = true; + while(true){ + input_event event; + if(!read(&event)){ + success = false; + goto exitLoop; + } + event_buffer.push_back(event); + switch(event.type){ + case EV_SYN: + switch(event.code){ + case SYN_DROPPED: + event_buffer.clear(); + skip_event(); + case SYN_REPORT: + case SYN_MT_REPORT: + goto exitLoop; + break; + } + break; + } + } +exitLoop: + if(event_buffer.size()){ + for(input_event event : event_buffer){ + emit inputEvent(event); + } + emit activity(); + } + return success; +} + +void DigitizerHandler::skip_event(){ + input_event event; + while(read(&event)){ + if(event.type != EV_SYN){ + continue; + } + if(event.code == SYN_REPORT || event.code == SYN_MT_REPORT){ + break; + } + } +} + +bool DigitizerHandler::read(input_event* ie){ + return (bool)stream.read((char*)ie, static_cast(sizeof(struct input_event))); +} diff --git a/applications/system-service/digitizerhandler.h b/applications/system-service/digitizerhandler.h index e0e8e7c2b..ddadaf42b 100644 --- a/applications/system-service/digitizerhandler.h +++ b/applications/system-service/digitizerhandler.h @@ -24,97 +24,20 @@ class DigitizerHandler : public QThread { Q_OBJECT public: - static DigitizerHandler* singleton_touchScreen(){ - static DigitizerHandler* instance; - if(instance != nullptr){ - return instance; - } - // Get event devices - event_device touchScreen_device(deviceSettings.getTouchDevicePath(), O_RDWR); - if(touchScreen_device.fd == -1){ - qDebug() << "Failed to open event device: " << touchScreen_device.device.c_str(); - throw QException(); - } - instance = new DigitizerHandler(touchScreen_device); - instance->start(); - return instance; - } - static DigitizerHandler* singleton_wacom(){ - static DigitizerHandler* instance; - if(instance != nullptr){ - return instance; - } - // Get event devices - event_device wacom_device(deviceSettings.getWacomDevicePath(), O_RDWR); - if(wacom_device.fd == -1){ - qDebug() << "Failed to open event device: " << wacom_device.device.c_str(); - throw QException(); - } - instance = new DigitizerHandler(wacom_device); - instance->start(); - return instance; - } - - DigitizerHandler(event_device& device) - : QThread(), - filebuf(device.fd, ios::in), - stream(&filebuf), - m_enabled(true), - device(device) { - flood = build_flood(); - } - ~DigitizerHandler(){ - if(device.fd == -1){ - return; - } - if(device.locked){ - ungrab(); - } - close(device.fd); - } - void setEnabled(bool enabled){ - m_enabled = enabled; - } - void grab(){ - if(!grabbed()){ - device.lock(); - } - } - void ungrab(){ - if(grabbed()){ - device.unlock(); - } - } - bool grabbed() { return device.locked; } - void write(ushort type, ushort code, int value){ - auto event = createEvent(type, code, value); - ::write(device.fd, &event, sizeof(input_event)); -#ifdef DEBUG - qDebug() << "Emitted event " << event.time.tv_sec << event.time.tv_usec << type << code << value; -#endif - } - void write(input_event* events, size_t size){ - ::write(device.fd, events, size); - } - void syn(){ - write(EV_SYN, SYN_REPORT, 0); - } - void clear_buffer(){ - if(device.fd == -1){ - return; - } -#ifdef DEBUG - qDebug() << "Clearing event buffer on" << device.device.c_str(); -#endif - write(flood, 512 * 8 * 4 * sizeof(input_event)); - } - static inline input_event createEvent(ushort type, ushort code, int value){ - struct input_event event; - event.type = type; - event.code = code; - event.value = value; - return event; - } + static DigitizerHandler* singleton_touchScreen(); + static DigitizerHandler* singleton_wacom(); + + DigitizerHandler(event_device& device); + ~DigitizerHandler(); + void setEnabled(bool enabled); + void grab(); + void ungrab(); + bool grabbed(); + void write(ushort type, ushort code, int value); + void write(input_event* events, size_t size); + void syn(); + void clear_buffer(); + static input_event createEvent(ushort type, ushort code, int value); signals: void activity(); @@ -122,82 +45,15 @@ class DigitizerHandler : public QThread { protected: input_event* flood; - input_event* build_flood(){ - auto n = 512 * 8; - auto num_inst = 4; - input_event* ev = (input_event*)malloc(sizeof(struct input_event) * n * num_inst); - memset(ev, 0, sizeof(input_event) * n * num_inst); - auto i = 0; - while (i < n) { - ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 1); - ev[i++] = createEvent(EV_SYN, 0, 0); - ev[i++] = createEvent(EV_ABS, ABS_DISTANCE, 2); - ev[i++] = createEvent(EV_SYN, 0, 0); - } - return ev; - } - void run(){ - char name[256]; - memset(name, 0, sizeof(name)); - ioctl(device.fd, EVIOCGNAME(sizeof(name)), name); - qDebug() << "Reading From : " << device.device.c_str() << " (" << name << ")"; - qDebug() << "Listening for events..."; - while(handle_events()){ - qApp->processEvents(QEventLoop::AllEvents, 100); - QThread::yieldCurrentThread(); - } - } - bool handle_events(){ - vector event_buffer; - bool success = true; - while(true){ - input_event event; - if(!read(&event)){ - success = false; - goto exitLoop; - } - event_buffer.push_back(event); - switch(event.type){ - case EV_SYN: - switch(event.code){ - case SYN_DROPPED: - event_buffer.clear(); - skip_event(); - case SYN_REPORT: - case SYN_MT_REPORT: - goto exitLoop; - break; - } - break; - } - } - exitLoop: - if(event_buffer.size()){ - for(input_event event : event_buffer){ - emit inputEvent(event); - } - emit activity(); - } - return success; - } - void skip_event(){ - input_event event; - while(read(&event)){ - if(event.type != EV_SYN){ - continue; - } - if(event.code == SYN_REPORT || event.code == SYN_MT_REPORT){ - break; - } - } - } + input_event* build_flood(); + void run(); + bool handle_events(); + void skip_event(); __gnu_cxx::stdio_filebuf filebuf; istream stream; bool m_enabled; event_device device; - bool read(input_event* ie){ - return (bool)stream.read((char*)ie, static_cast(sizeof(struct input_event))); - } + bool read(input_event* ie); }; #endif // DIGITIZERHANDLER_H diff --git a/applications/system-service/fifohandler.cpp b/applications/system-service/fifohandler.cpp new file mode 100644 index 000000000..f55d691b4 --- /dev/null +++ b/applications/system-service/fifohandler.cpp @@ -0,0 +1,98 @@ +#include "fifohandler.h" + +FifoHandler::FifoHandler(QString name, QString path, QObject* host) + : QObject(), + host(host), + _thread(this), + timer(this), + _name(name), + path(path), + in(), + out() { + connect(host, &QObject::destroyed, this, &QObject::deleteLater); + connect(&_thread, &QThread::started, [this]{ + emit started(); + in.open(this->path.toStdString().c_str(), std::ifstream::in); + if(!in.good()){ + O_WARNING("Unable to open fifi (in)" << ::strerror(errno)); + } + timer.start(10); + }); + connect(&_thread, &QThread::finished, this, [this]{ + timer.stop(); + emit finished(); + }); + connect(&timer, &QTimer::timeout, this, &FifoHandler::run); + QThread::create([this]{ + out.open(this->path.toStdString().c_str(), std::ifstream::out); + if(!out.good()){ + O_WARNING("Unable to open fifi (out)" << ::strerror(errno)); + } + })->start(); + moveToThread(&_thread); +} + +FifoHandler::~FifoHandler(){ + if(in.is_open()){ + in.close(); + } + if(out.is_open()){ + out.close(); + } + quit(); +} + +void FifoHandler::start() { _thread.start(); } + +void FifoHandler::quit(){ _thread.quit();} + +void FifoHandler::write(const void* data, size_t size){ + if(out.is_open()){ + out.write((char*)data, size); + } +} + +const QString& FifoHandler::name() { return _name; } + +void FifoHandler::run() { + if(!in.is_open()){ + quit(); + return; + } + std::string data; + while(getline_async(in, data)){ + QString line(data.c_str()); + line = line.trimmed(); + emit dataRecieved(this, line); + qApp->processEvents(QEventLoop::AllEvents, 100); + QThread::yieldCurrentThread(); + } + if(in.eof()){ + in.clear(); + } + QThread::yieldCurrentThread(); +} + +bool FifoHandler::getline_async(std::istream& is, std::string& str, char delim) { + static std::string lineSoFar; + char inChar; + int charsRead = 0; + bool lineRead = false; + str = ""; + + do { + charsRead = is.readsome(&inChar, 1); + if (charsRead == 1) { + // if the delimiter is read then return the string so far + if (inChar == delim) { + str = lineSoFar; + lineSoFar = ""; + lineRead = true; + } else { // otherwise add it to the string so far + lineSoFar.append(1, inChar); + } + } + } while (charsRead != 0 && !lineRead); + + return lineRead; +} diff --git a/applications/system-service/fifohandler.h b/applications/system-service/fifohandler.h index 205ba540b..dd2653019 100644 --- a/applications/system-service/fifohandler.h +++ b/applications/system-service/fifohandler.h @@ -12,54 +12,12 @@ class FifoHandler : public QObject { Q_OBJECT public: - FifoHandler(QString name, QString path, QObject* host) - : QObject(), - host(host), - _thread(this), - timer(this), - _name(name), - path(path), - in(), - out() { - connect(host, &QObject::destroyed, this, &QObject::deleteLater); - connect(&_thread, &QThread::started, [this]{ - emit started(); - in.open(this->path.toStdString().c_str(), std::ifstream::in); - if(!in.good()){ - O_WARNING("Unable to open fifi (in)" << ::strerror(errno)); - } - timer.start(10); - }); - connect(&_thread, &QThread::finished, this, [this]{ - timer.stop(); - emit finished(); - }); - connect(&timer, &QTimer::timeout, this, &FifoHandler::run); - QThread::create([this]{ - out.open(this->path.toStdString().c_str(), std::ifstream::out); - if(!out.good()){ - O_WARNING("Unable to open fifi (out)" << ::strerror(errno)); - } - })->start(); - moveToThread(&_thread); - } - ~FifoHandler(){ - if(in.is_open()){ - in.close(); - } - if(out.is_open()){ - out.close(); - } - quit(); - } - void start() { _thread.start(); } - void quit(){ _thread.quit();} - void write(const void* data, size_t size){ - if(out.is_open()){ - out.write((char*)data, size); - } - } - const QString& name() { return _name; } + FifoHandler(QString name, QString path, QObject* host); + ~FifoHandler(); + void start(); + void quit(); + void write(const void* data, size_t size); + const QString& name(); signals: void started(); @@ -67,24 +25,7 @@ class FifoHandler : public QObject { void dataRecieved(FifoHandler* handler, const QString& data); protected: - void run() { - if(!in.is_open()){ - quit(); - return; - } - std::string data; - while(getline_async(in, data)){ - QString line(data.c_str()); - line = line.trimmed(); - emit dataRecieved(this, line); - qApp->processEvents(QEventLoop::AllEvents, 100); - QThread::yieldCurrentThread(); - } - if(in.eof()){ - in.clear(); - } - QThread::yieldCurrentThread(); - } + void run(); private: QObject* host; @@ -94,29 +35,7 @@ class FifoHandler : public QObject { QString path; std::ifstream in; std::ofstream out; - bool getline_async(std::istream& is, std::string& str, char delim = '\n') { - static std::string lineSoFar; - char inChar; - int charsRead = 0; - bool lineRead = false; - str = ""; - - do { - charsRead = is.readsome(&inChar, 1); - if (charsRead == 1) { - // if the delimiter is read then return the string so far - if (inChar == delim) { - str = lineSoFar; - lineSoFar = ""; - lineRead = true; - } else { // otherwise add it to the string so far - lineSoFar.append(1, inChar); - } - } - } while (charsRead != 0 && !lineRead); - - return lineRead; - } + bool getline_async(std::istream& is, std::string& str, char delim = '\n'); }; #endif // FIFOHANDLER_H diff --git a/applications/system-service/main.cpp b/applications/system-service/main.cpp index 95b658bc1..5c51b5ff5 100755 --- a/applications/system-service/main.cpp +++ b/applications/system-service/main.cpp @@ -56,6 +56,8 @@ int main(int argc, char* argv[]){ } return QProcess::execute("/usr/bin/xochitl", QStringList()); } + qputenv("XDG_CURRENT_DESKTOP", "OXIDE"); + QThread::currentThread()->setObjectName("main"); deviceSettings.setupQtEnvironment(false); QGuiApplication app(argc, argv); sentry_init("tarnish", argv); diff --git a/applications/system-service/network.cpp b/applications/system-service/network.cpp index fdd5d6b08..b8c9266ac 100644 --- a/applications/system-service/network.cpp +++ b/applications/system-service/network.cpp @@ -40,6 +40,50 @@ Network::Network(QString path, QString ssid, QVariantMap properties, QObject* pa m_protocol = "psk"; } } + +Network::Network(QString path, QVariantMap properties, QObject* parent) + : Network(path, properties["ssid"].toString().mid(1, properties["ssid"].toString().length() - 2), properties, parent){} + +Network::~Network(){ unregisterPath(); } + +QString Network::path() { return m_path; } + +void Network::registerPath(){ + auto bus = QDBusConnection::systemBus(); + bus.unregisterObject(path(), QDBusConnection::UnregisterTree); + if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ + qDebug() << "Registered" << path() << OXIDE_NETWORK_INTERFACE; + }else{ + qDebug() << "Failed to register" << path(); + } +} + +void Network::unregisterPath(){ + auto bus = QDBusConnection::systemBus(); + if(bus.objectRegisteredAt(path()) != nullptr){ + qDebug() << "Unregistered" << path(); + bus.unregisterObject(path()); + } +} + +bool Network::enabled(){ return m_enabled; } + +void Network::setEnabled(bool enabled){ + m_enabled = enabled; + for(auto network : networks){ + if(network->enabled() != enabled){ + network->setEnabled(enabled); + } + } + emit stateChanged(enabled); +} + +QString Network::ssid(){ + if(!hasPermission("wifi")){ + return ""; + } + return m_ssid; +} void Network::registerNetwork(){ for(auto interface : wifiAPI->getInterfaces()){ bool found = false; @@ -61,6 +105,53 @@ void Network::registerNetwork(){ } } +void Network::connect(){ + if(!hasPermission("wifi")){ + return; + } + QList> replies; + for(auto network : networks){ + auto interface = (Interface*)network->parent(); + replies.append(interface->SelectNetwork(QDBusObjectPath(network->path()))); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void Network::remove(){ + if(!hasPermission("wifi")){ + return; + } + QList> replies; + QMap todo; + for(auto network : networks){ + todo.insert(network->path(), (Interface*)network->parent()); + } + for(auto path : todo.keys()){ + auto interface = todo[path]; + replies.append(interface->RemoveNetwork(QDBusObjectPath(path))); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void Network::PropertiesChanged(const QVariantMap& properties){ + if(properties.contains("Enabled")){ + bool enabled = false; + for(auto network : networks){ + if(network->enabled()){ + enabled = true; + break; + } + } + if(enabled != m_enabled){ + setEnabled(enabled); + } + } +} + QList Network::bSSs(){ if(!hasPermission("wifi")){ return QList(); @@ -70,6 +161,145 @@ QList Network::bSSs(){ return wifiAPI->getBSS(args); } +QString Network::getNull(){ return ""; } + +QString Network::password() { + if(!hasPermission("wifi")){ + return ""; + } + if(passwordField() == ""){ + return ""; + } + auto password = m_properties[passwordField()].toString(); + if(password != ""){ + return password; + } + for(auto network : networks){ + password = network->properties()[passwordField()].toString(); + if(password != ""){ + return password; + } + } + return ""; +} + +void Network::setPassword(QString password) { + if(!hasPermission("wifi")){ + return; + } + if(passwordField() != ""){ + m_properties[passwordField()] = password; + emit propertiesChanged(m_properties); + } +} + +QString Network::protocol() { + if(!hasPermission("wifi")){ + return ""; + } + return m_protocol; +} + +void Network::setProtocol(QString protocol) { + if(!hasPermission("wifi")){ + return; + } + auto oldPassword = password(); + m_properties.remove(passwordField()); + m_protocol = protocol; + if(passwordField() != ""){ + m_properties[passwordField()] = oldPassword; + } + if(protocol == "open"){ + m_properties["key_mgmt"] = "NONE"; + }else{ + m_properties.remove("key_mgmt"); + } + setProperties(m_properties); +} + +QVariantMap Network::properties() { + if(!hasPermission("wifi")){ + return QVariantMap(); + } + return m_properties; +} + +void Network::setProperties(QVariantMap properties){ + if(!hasPermission("wifi")){ + return; + } + m_properties = properties; + auto props = realProps(); + for(auto network : networks){ + network->setProperties(props); + } + emit propertiesChanged(properties); +} + +QList Network::paths(){ + QList result; + if(!hasPermission("wifi")){ + return result; + } + for(auto network : networks){ + result.append(network->path()); + } + + return result; +} + +void Network::addNetwork(const QString& path, Interface* interface){ + if(paths().contains(path)){ + return; + } + auto network = new INetwork(WPA_SUPPLICANT_SERVICE, path, QDBusConnection::systemBus(), interface); + networks.append(network); + if(network->enabled() != m_enabled){ + network->setEnabled(m_enabled); + } + QObject::connect(network, &INetwork::PropertiesChanged, this, &Network::PropertiesChanged, Qt::QueuedConnection); +} + +void Network::removeNetwork(const QString& path){ + QMutableListIterator i(networks); + while(i.hasNext()){ + auto network = i.next(); + if(!network->isValid() || network->path() == path){ + i.remove(); + network->deleteLater(); + } + } +} + +void Network::removeInterface(Interface* interface){ + QMutableListIterator i(networks); + while(i.hasNext()){ + auto network = i.next(); + if(!network->isValid() || (Interface*)network->parent() == interface){ + i.remove(); + network->deleteLater(); + } + } +} + bool Network::hasPermission(QString permission, const char* sender){ return wifiAPI->hasPermission(permission, sender); } +QVariantMap Network::realProps(){ + QVariantMap props(m_properties); + props["ssid"] = m_ssid; + return props; +} + +QString Network::passwordField(){ + if(protocol() == "psk"){ + return "psk"; + }else if(protocol() == "eap"){ + return "password"; + }else if(protocol() == "sae"){ + return "sae_password"; + } + return ""; +} + #include "moc_network.cpp" diff --git a/applications/system-service/network.h b/applications/system-service/network.h index 55c442b5c..5130e0dbb 100644 --- a/applications/system-service/network.h +++ b/applications/system-service/network.h @@ -25,193 +25,37 @@ class Network : public QObject { public: Network(QString path, QString ssid, QVariantMap properties, QObject* parent); - Network(QString path, QVariantMap properties, QObject* parent) - : Network(path, properties["ssid"].toString().mid(1, properties["ssid"].toString().length() - 2), properties, parent){} + Network(QString path, QVariantMap properties, QObject* parent); - ~Network(){ unregisterPath(); } - QString path() { return m_path; } - void registerPath(){ - auto bus = QDBusConnection::systemBus(); - bus.unregisterObject(path(), QDBusConnection::UnregisterTree); - if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_NETWORK_INTERFACE; - }else{ - qDebug() << "Failed to register" << path(); - } - } - void unregisterPath(){ - auto bus = QDBusConnection::systemBus(); - if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); - bus.unregisterObject(path()); - } - } + ~Network(); + QString path(); + void registerPath(); + void unregisterPath(); - bool enabled(){ return m_enabled; } - void setEnabled(bool enabled){ - m_enabled = enabled; - for(auto network : networks){ - if(network->enabled() != enabled){ - network->setEnabled(enabled); - } - } - emit stateChanged(enabled); - } + bool enabled(); + void setEnabled(bool enabled); - QString ssid(){ - if(!hasPermission("wifi")){ - return ""; - } - return m_ssid; - } + QString ssid(); QList bSSs(); - QString getNull(){ return ""; } + QString getNull(); - QString password() { - if(!hasPermission("wifi")){ - return ""; - } - if(passwordField() == ""){ - return ""; - } - auto password = m_properties[passwordField()].toString(); - if(password != ""){ - return password; - } - for(auto network : networks){ - password = network->properties()[passwordField()].toString(); - if(password != ""){ - return password; - } - } - return ""; - } - void setPassword(QString password) { - if(!hasPermission("wifi")){ - return; - } - if(passwordField() != ""){ - m_properties[passwordField()] = password; - emit propertiesChanged(m_properties); - } - } + QString password(); + void setPassword(QString password); - QString protocol() { - if(!hasPermission("wifi")){ - return ""; - } - return m_protocol; - } - void setProtocol(QString protocol) { - if(!hasPermission("wifi")){ - return; - } - auto oldPassword = password(); - m_properties.remove(passwordField()); - m_protocol = protocol; - if(passwordField() != ""){ - m_properties[passwordField()] = oldPassword; - } - if(protocol == "open"){ - m_properties["key_mgmt"] = "NONE"; - }else{ - m_properties.remove("key_mgmt"); - } - setProperties(m_properties); - } + QString protocol(); + void setProtocol(QString protocol); - QVariantMap properties() { - if(!hasPermission("wifi")){ - return QVariantMap(); - } - return m_properties; - } - void setProperties(QVariantMap properties){ - if(!hasPermission("wifi")){ - return; - } - m_properties = properties; - auto props = realProps(); - for(auto network : networks){ - network->setProperties(props); - } - emit propertiesChanged(properties); - } - QList paths(){ - QList result; - if(!hasPermission("wifi")){ - return result; - } - for(auto network : networks){ - result.append(network->path()); - } - - return result; - } - void addNetwork(const QString& path, Interface* interface){ - if(paths().contains(path)){ - return; - } - auto network = new INetwork(WPA_SUPPLICANT_SERVICE, path, QDBusConnection::systemBus(), interface); - networks.append(network); - if(network->enabled() != m_enabled){ - network->setEnabled(m_enabled); - } - QObject::connect(network, &INetwork::PropertiesChanged, this, &Network::PropertiesChanged, Qt::QueuedConnection); - } - void removeNetwork(const QString& path){ - QMutableListIterator i(networks); - while(i.hasNext()){ - auto network = i.next(); - if(!network->isValid() || network->path() == path){ - i.remove(); - network->deleteLater(); - } - } - } - void removeInterface(Interface* interface){ - QMutableListIterator i(networks); - while(i.hasNext()){ - auto network = i.next(); - if(!network->isValid() || (Interface*)network->parent() == interface){ - i.remove(); - network->deleteLater(); - } - } - } + QVariantMap properties(); + void setProperties(QVariantMap properties); + QList paths(); + void addNetwork(const QString& path, Interface* interface); + void removeNetwork(const QString& path); + void removeInterface(Interface* interface); void registerNetwork(); - Q_INVOKABLE void connect(){ - if(!hasPermission("wifi")){ - return; - } - QList> replies; - for(auto network : networks){ - auto interface = (Interface*)network->parent(); - replies.append(interface->SelectNetwork(QDBusObjectPath(network->path()))); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE void remove(){ - if(!hasPermission("wifi")){ - return; - } - QList> replies; - QMap todo; - for(auto network : networks){ - todo.insert(network->path(), (Interface*)network->parent()); - } - for(auto path : todo.keys()){ - auto interface = todo[path]; - replies.append(interface->RemoveNetwork(QDBusObjectPath(path))); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } + Q_INVOKABLE void connect(); + Q_INVOKABLE void remove(); signals: void stateChanged(bool); @@ -222,20 +66,7 @@ class Network : public QObject { private slots: - void PropertiesChanged(const QVariantMap& properties){ - if(properties.contains("Enabled")){ - bool enabled = false; - for(auto network : networks){ - if(network->enabled()){ - enabled = true; - break; - } - } - if(enabled != m_enabled){ - setEnabled(enabled); - } - } - } + void PropertiesChanged(const QVariantMap& properties); private: QString m_path; @@ -247,21 +78,8 @@ private slots: bool hasPermission(QString permission, const char* sender = __builtin_FUNCTION()); - QVariantMap realProps(){ - QVariantMap props(m_properties); - props["ssid"] = m_ssid; - return props; - } - QString passwordField(){ - if(protocol() == "psk"){ - return "psk"; - }else if(protocol() == "eap"){ - return "password"; - }else if(protocol() == "sae"){ - return "sae_password"; - } - return ""; - } + QVariantMap realProps(); + QString passwordField(); }; #endif // NETWORK_H diff --git a/applications/system-service/notification.cpp b/applications/system-service/notification.cpp index 1ba94d706..bf3de86bb 100644 --- a/applications/system-service/notification.cpp +++ b/applications/system-service/notification.cpp @@ -3,7 +3,7 @@ #include "notification.h" #include "notificationapi.h" #include "appsapi.h" -#include "systemapi.h" +#include "screenapi.h" Notification::Notification(const QString& path, const QString& identifier, const QString& owner, const QString& application, const QString& text, const QString& icon, QObject* parent) : QObject(parent), @@ -23,6 +23,82 @@ Notification::Notification(const QString& path, const QString& identifier, const } } +Notification::~Notification(){ + unregisterPath(); +} + +QString Notification::path() { return m_path; } + +QDBusObjectPath Notification::qPath(){ return QDBusObjectPath(path()); } + +void Notification::registerPath(){ + auto bus = QDBusConnection::systemBus(); + bus.unregisterObject(path(), QDBusConnection::UnregisterTree); + if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ + qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; + }else{ + qDebug() << "Failed to register" << path(); + } +} + +void Notification::unregisterPath(){ + auto bus = QDBusConnection::systemBus(); + if(bus.objectRegisteredAt(path()) != nullptr){ + qDebug() << "Unregistered" << path(); + bus.unregisterObject(path()); + } +} + +QString Notification::identifier(){ + if(!hasPermission("notification")){ + return ""; + } + return m_identifier; +} + +int Notification::created(){ return m_created; } + +QString Notification::application(){ + if(!hasPermission("notification")){ + return ""; + } + return m_application; +} + +void Notification::setApplication(QString application){ + if(!hasPermission("notification")){ + return; + } + m_application = application; + QVariantMap result; + result.insert("application", m_application); + emit changed(result); +} + +QString Notification::text(){ + if(!hasPermission("notification")){ + return ""; + } + return m_text; +} + +void Notification::setText(QString text){ + if(!hasPermission("notification")){ + return; + } + m_text = text; + QVariantMap result; + result.insert("text", m_text); + emit changed(result); +} + +QString Notification::icon(){ + if(!hasPermission("notification")){ + return ""; + } + return m_icon; +} + void Notification::display(){ if(!hasPermission("notification")){ return; @@ -33,7 +109,7 @@ void Notification::display(){ return; } notificationAPI->lock(); - Oxide::dispatchToMainThread([=]{ + Oxide::dispatchToMainThread([this]{ qDebug() << "Displaying notification" << identifier(); auto path = appsAPI->currentApplicationNoSecurityCheck(); Application* resumeApp = nullptr; @@ -53,6 +129,13 @@ void Notification::remove(){ emit removed(); } +void Notification::click(){ + if(!hasPermission("notification")){ + return; + } + emit clicked(); +} + void Notification::setIcon(QString icon){ @@ -71,6 +154,23 @@ void Notification::setIcon(QString icon){ emit changed(result); } +QString Notification::owner(){ + if(!hasPermission("notification")){ + return ""; + } + return m_owner; +} + +void Notification::setOwner(QString owner){ + if(!hasPermission("notifications")){ + return; + } + m_owner = owner; + QVariantMap result; + result.insert("owner", m_owner); + emit changed(result); +} + bool Notification::hasPermission(QString permission, const char* sender){ return notificationAPI->hasPermission(permission, sender); } void Notification::paintNotification(Application *resumeApp) { diff --git a/applications/system-service/notification.h b/applications/system-service/notification.h index c5d4147be..70627d02d 100644 --- a/applications/system-service/notification.h +++ b/applications/system-service/notification.h @@ -24,97 +24,27 @@ class Notification : public QObject{ public: Notification(const QString& path, const QString& identifier, const QString& owner, const QString& application, const QString& text, const QString& icon, QObject* parent); - ~Notification(){ - unregisterPath(); - } - QString path() { return m_path; } - QDBusObjectPath qPath(){ return QDBusObjectPath(path()); } - void registerPath(){ - auto bus = QDBusConnection::systemBus(); - bus.unregisterObject(path(), QDBusConnection::UnregisterTree); - if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; - }else{ - qDebug() << "Failed to register" << path(); - } - } - void unregisterPath(){ - auto bus = QDBusConnection::systemBus(); - if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); - bus.unregisterObject(path()); - } - } + ~Notification(); + QString path(); + QDBusObjectPath qPath(); + void registerPath(); + void unregisterPath(); - QString identifier(){ - if(!hasPermission("notification")){ - return ""; - } - return m_identifier; - } - int created(){ return m_created; } - QString application(){ - if(!hasPermission("notification")){ - return ""; - } - return m_application; - } - void setApplication(QString application){ - if(!hasPermission("notification")){ - return; - } - m_application = application; - QVariantMap result; - result.insert("application", m_application); - emit changed(result); - } - QString text(){ - if(!hasPermission("notification")){ - return ""; - } - return m_text; - } - void setText(QString text){ - if(!hasPermission("notification")){ - return; - } - m_text = text; - QVariantMap result; - result.insert("text", m_text); - emit changed(result); - } - QString icon(){ - if(!hasPermission("notification")){ - return ""; - } - return m_icon; - } + QString identifier(); + int created(); + QString application(); + void setApplication(QString application); + QString text(); + void setText(QString text); + QString icon(); void setIcon(QString icon); - QString owner(){ - if(!hasPermission("notification")){ - return ""; - } - return m_owner; - } - void setOwner(QString owner){ - if(!hasPermission("notifications")){ - return; - } - m_owner = owner; - QVariantMap result; - result.insert("owner", m_owner); - emit changed(result); - } + QString owner(); + void setOwner(QString owner); Q_INVOKABLE void display(); Q_INVOKABLE void remove(); - Q_INVOKABLE void click(){ - if(!hasPermission("notification")){ - return; - } - emit clicked(); - } + Q_INVOKABLE void click(); void paintNotification(Application *resumeApp); signals: diff --git a/applications/system-service/notificationapi.cpp b/applications/system-service/notificationapi.cpp index 9fb1bfaed..6f2751cdf 100644 --- a/applications/system-service/notificationapi.cpp +++ b/applications/system-service/notificationapi.cpp @@ -3,6 +3,98 @@ #include "notificationapi.h" #include "systemapi.h" +NotificationAPI* NotificationAPI::singleton(NotificationAPI* self){ + static NotificationAPI* instance; + if(self != nullptr){ + instance = self; + } + return instance; +} + +NotificationAPI::NotificationAPI(QObject* parent) : APIBase(parent), notificationDisplayQueue(), m_enabled(false), m_notifications(), m_lock() { + Oxide::Sentry::sentry_transaction("apps", "init", [this](Oxide::Sentry::Transaction* t){ + Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ + singleton(this); + }); + }); +} + +NotificationAPI::~NotificationAPI(){} + +bool NotificationAPI::enabled(){ return m_enabled; } + +void NotificationAPI::setEnabled(bool enabled){ + m_enabled = enabled; + qDebug() << "Notification API" << enabled; + for(auto notification : m_notifications.values()){ + if(enabled){ + notification->registerPath(); + }else{ + notification->unregisterPath(); + } + } +} + +QDBusObjectPath NotificationAPI::get(QString identifier){ + if(!hasPermission("notification")){ + return QDBusObjectPath("/"); + } + auto notification = getByIdentifier(identifier); + if(notification == nullptr){ + return QDBusObjectPath("/"); + } + return notification->qPath(); +} + +QList NotificationAPI::getAllNotifications(){ + QList result; + if(!hasPermission("notification")){ + return result; + } + for(auto notification : m_notifications.values()){ + result.append(notification->qPath()); + } + return result; +} + +QList NotificationAPI::getUnownedNotifications(){ + QList result; + if(!hasPermission("notification")){ + return result; + } + QStringList names = QDBusConnection::systemBus().interface()->registeredServiceNames(); + for(auto notification : m_notifications.values()){ + if(!names.contains(notification->owner())){ + result.append(notification->qPath()); + } + } + return result; +} + +Notification* NotificationAPI::add(const QString& identifier, const QString& owner, const QString& application, const QString& text, const QString& icon){ + if(m_notifications.contains(identifier)){ + return nullptr; + } + auto notification = new Notification(getPath(identifier), identifier, owner, application, text, icon, this); + m_notifications.insert(identifier, notification); + auto path = notification->qPath(); + connect(notification, &Notification::changed, this, [this, path]{ + emit notificationChanged(path); + }); + if(m_enabled){ + notification->registerPath(); + } + emit notificationAdded(path); + return notification; +} + +Notification* NotificationAPI::getByIdentifier(const QString& identifier){ + if(!m_notifications.contains(identifier)){ + return nullptr; + } + return m_notifications.value(identifier); +} + QRect NotificationAPI::paintNotification(const QString &text, const QString &iconPath){ QImage notification = notificationImage(text, iconPath); return dispatchToMainThread([¬ification]{ @@ -135,3 +227,70 @@ void NotificationAPI::drawNotificationText(const QString& text, QColor color, QC painter.end(); }); } + +QDBusObjectPath NotificationAPI::add(const QString& identifier, const QString& application, const QString& text, const QString& icon, QDBusMessage message){ + if(!hasPermission("notification")){ + return QDBusObjectPath("/"); + } + auto notification = add(identifier, message.service(), application, text, icon); + if(notification == nullptr){ + return QDBusObjectPath("/"); + } + return notification->qPath(); +} + +bool NotificationAPI::take(QString identifier, QDBusMessage message){ + if(!hasPermission("notification")){ + return false; + } + if(!m_notifications.contains(identifier)){ + return false; + } + m_notifications.value(identifier)->setOwner(message.service()); + return true; +} + +QList NotificationAPI::notifications(QDBusMessage message){ + QList result; + if(!hasPermission("notification")){ + return result; + } + for(auto notification : m_notifications.values()){ + if(notification->owner() == message.service()){ + result.append(notification->qPath()); + } + } + return result; +} + +void NotificationAPI::remove(Notification* notification){ + if(!hasPermission("notification")){ + return; + } + if(!m_notifications.contains(notification->identifier())){ + return; + } + m_notifications.remove(notification->identifier()); + emit notificationRemoved(notification->qPath()); +} + +bool NotificationAPI::locked(){ + if(!m_lock.tryLock(1)){ + return true; + } + m_lock.unlock(); + return false; +} + +void NotificationAPI::lock() { m_lock.tryLock(1); } + +void NotificationAPI::unlock() { m_lock.unlock(); } + +QString NotificationAPI::getPath(QString id){ + static const QUuid NS = QUuid::fromString(QLatin1String("{66acfa80-020f-11eb-adc1-0242ac120002}")); + id= QUuid::createUuidV5(NS, id).toString(QUuid::Id128); + if(id.isEmpty()){ + id = QUuid::createUuid().toString(QUuid::Id128); + } + return QString(OXIDE_SERVICE_PATH "/notifications/") + id; +} diff --git a/applications/system-service/notificationapi.h b/applications/system-service/notificationapi.h index 2ec91da53..888ee5e9e 100644 --- a/applications/system-service/notificationapi.h +++ b/applications/system-service/notificationapi.h @@ -20,150 +20,34 @@ class NotificationAPI : public APIBase { Q_PROPERTY(QList unownedNotifications READ getUnownedNotifications) public: - static NotificationAPI* singleton(NotificationAPI* self = nullptr){ - static NotificationAPI* instance; - if(self != nullptr){ - instance = self; - } - return instance; - } - NotificationAPI(QObject* parent) : APIBase(parent), notificationDisplayQueue(), m_enabled(false), m_notifications(), m_lock() { - Oxide::Sentry::sentry_transaction("apps", "init", [this](Oxide::Sentry::Transaction* t){ - Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ - singleton(this); - }); - }); - } - ~NotificationAPI(){} - bool enabled(){ return m_enabled; } - void setEnabled(bool enabled){ - m_enabled = enabled; - qDebug() << "Notification API" << enabled; - for(auto notification : m_notifications.values()){ - if(enabled){ - notification->registerPath(); - }else{ - notification->unregisterPath(); - } - } - } - - Q_INVOKABLE QDBusObjectPath get(QString identifier){ - if(!hasPermission("notification")){ - return QDBusObjectPath("/"); - } - auto notification = getByIdentifier(identifier); - if(notification == nullptr){ - return QDBusObjectPath("/"); - } - return notification->qPath(); - } - - QList getAllNotifications(){ - QList result; - if(!hasPermission("notification")){ - return result; - } - for(auto notification : m_notifications.values()){ - result.append(notification->qPath()); - } - return result; - } - QList getUnownedNotifications(){ - QList result; - if(!hasPermission("notification")){ - return result; - } - QStringList names = QDBusConnection::systemBus().interface()->registeredServiceNames(); - for(auto notification : m_notifications.values()){ - if(!names.contains(notification->owner())){ - result.append(notification->qPath()); - } - } - return result; - } + static NotificationAPI* singleton(NotificationAPI* self = nullptr); + NotificationAPI(QObject* parent); + ~NotificationAPI(); + bool enabled(); + void setEnabled(bool enabled); + + Q_INVOKABLE QDBusObjectPath get(QString identifier); + + QList getAllNotifications(); + QList getUnownedNotifications(); QList notificationDisplayQueue; - Notification* add(const QString& identifier, const QString& owner, const QString& application, const QString& text, const QString& icon){ - if(m_notifications.contains(identifier)){ - return nullptr; - } - auto notification = new Notification(getPath(identifier), identifier, owner, application, text, icon, this); - m_notifications.insert(identifier, notification); - auto path = notification->qPath(); - connect(notification, &Notification::changed, this, [=]{ - emit notificationChanged(path); - }); - if(m_enabled){ - notification->registerPath(); - } - emit notificationAdded(path); - return notification; - } - Notification* getByIdentifier(const QString& identifier){ - if(!m_notifications.contains(identifier)){ - return nullptr; - } - return m_notifications.value(identifier); - } + Notification* add(const QString& identifier, const QString& owner, const QString& application, const QString& text, const QString& icon); + Notification* getByIdentifier(const QString& identifier); QRect paintNotification(const QString& text, const QString& iconPath); void errorNotification(const QString& text); QImage notificationImage(const QString& text, const QString& iconPath); void drawNotificationText(const QString& text, QColor color = Qt::black, QColor background = Qt::transparent); public slots: - QDBusObjectPath add(const QString& identifier, const QString& application, const QString& text, const QString& icon, QDBusMessage message){ - if(!hasPermission("notification")){ - return QDBusObjectPath("/"); - } - auto notification = add(identifier, message.service(), application, text, icon); - if(notification == nullptr){ - return QDBusObjectPath("/"); - } - return notification->qPath(); - } - bool take(QString identifier, QDBusMessage message){ - if(!hasPermission("notification")){ - return false; - } - if(!m_notifications.contains(identifier)){ - return false; - } - m_notifications.value(identifier)->setOwner(message.service()); - return true; - } - QList notifications(QDBusMessage message){ - QList result; - if(!hasPermission("notification")){ - return result; - } - for(auto notification : m_notifications.values()){ - if(notification->owner() == message.service()){ - result.append(notification->qPath()); - } - } - return result; - } - - void remove(Notification* notification){ - if(!hasPermission("notification")){ - return; - } - if(!m_notifications.contains(notification->identifier())){ - return; - } - m_notifications.remove(notification->identifier()); - emit notificationRemoved(notification->qPath()); - } - bool locked(){ - if(!m_lock.tryLock(1)){ - return true; - } - m_lock.unlock(); - return false; - } - void lock() { m_lock.tryLock(1); } - void unlock() { m_lock.unlock(); } + QDBusObjectPath add(const QString& identifier, const QString& application, const QString& text, const QString& icon, QDBusMessage message); + bool take(QString identifier, QDBusMessage message); + QList notifications(QDBusMessage message); + + void remove(Notification* notification); + bool locked(); + void lock(); + void unlock(); signals: void notificationAdded(QDBusObjectPath); @@ -176,14 +60,7 @@ public slots: QMap m_notifications; QMutex m_lock; - QString getPath(QString id){ - static const QUuid NS = QUuid::fromString(QLatin1String("{66acfa80-020f-11eb-adc1-0242ac120002}")); - id= QUuid::createUuidV5(NS, id).toString(QUuid::Id128); - if(id.isEmpty()){ - id = QUuid::createUuid().toString(QUuid::Id128); - } - return QString(OXIDE_SERVICE_PATH "/notifications/") + id; - } + QString getPath(QString id); }; diff --git a/applications/system-service/powerapi.cpp b/applications/system-service/powerapi.cpp new file mode 100644 index 000000000..0a88f2faf --- /dev/null +++ b/applications/system-service/powerapi.cpp @@ -0,0 +1,195 @@ +#include "powerapi.h" + +PowerAPI* PowerAPI::singleton(PowerAPI* self){ + static PowerAPI* instance; + if(self != nullptr){ + instance = self; + } + return instance; +} + +PowerAPI::PowerAPI(QObject* parent) + : APIBase(parent), m_chargerState(ChargerUnknown){ + Oxide::Sentry::sentry_transaction("power", "init", [this](Oxide::Sentry::Transaction* t){ + Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ + singleton(this); + }); + Oxide::Sentry::sentry_span(t, "sysfs", "Determine power devices from sysfs", [this](){ + Oxide::Power::batteries(); + Oxide::Power::chargers(); + }); + Oxide::Sentry::sentry_span(t, "update", "Update current state", [this]{ + update(); + }); + Oxide::Sentry::sentry_span(t, "timer", "Setup timer", [this]{ + timer = new QTimer(this); + timer->setSingleShot(false); + timer->setInterval(3 * 1000); // 3 seconds + timer->moveToThread(qApp->thread()); + connect(timer, &QTimer::timeout, this, QOverload<>::of(&PowerAPI::update)); + timer->start(); + }); + }); +} + +PowerAPI::~PowerAPI(){ + qDebug() << "Killing timer"; + timer->stop(); + delete timer; +} + +void PowerAPI::setEnabled(bool enabled) { + if(enabled){ + timer->start(); + }else{ + timer->stop(); + } +} + +int PowerAPI::state(){ + if(!hasPermission("power")){ + return 0; + } + return m_state; +} + +void PowerAPI::setState(int state){ + if(!hasPermission("power")){ + return; + } + if(state < State::Normal || state > State::PowerSaving){ + throw QException{}; + } + m_state = state; + emit stateChanged(state); +} + +int PowerAPI::batteryState() { + if(!hasPermission("power")){ + return BatteryUnknown; + } + return m_batteryState; +} + +void PowerAPI::setBatteryState(int batteryState){ + if(!hasPermission("power")){ + return; + } + m_batteryState = batteryState; + emit batteryStateChanged(batteryState); +} + +int PowerAPI::batteryLevel() { + if(!hasPermission("power")){ + return 0; + } + return m_batteryLevel; +} + +void PowerAPI::setBatteryLevel(int batteryLevel){ + m_batteryLevel = batteryLevel; + emit batteryLevelChanged(batteryLevel); +} + +int PowerAPI::batteryTemperature() { + if(!hasPermission("power")){ + return 0; + } + return m_batteryTemperature; +} + +void PowerAPI::setBatteryTemperature(int batteryTemperature){ + m_batteryTemperature = batteryTemperature; + emit batteryTemperatureChanged(batteryTemperature); +} + +int PowerAPI::chargerState() { + if(!hasPermission("power")){ + return ChargerUnknown; + } + return m_chargerState; +} + +void PowerAPI::setChargerState(int chargerState){ + m_chargerState = chargerState; + emit chargerStateChanged(chargerState); +} + +void PowerAPI::updateBattery(){ + if(!Oxide::Power::batteries()->length()){ + if(m_batteryState != BatteryUnknown){ + setBatteryState(BatteryUnknown); + } + if(!m_batteryWarning){ + O_WARNING("Can't find battery information"); + m_batteryWarning = true; + emit batteryWarning(); + } + return; + } + if(!Oxide::Power::batteryPresent()){ + if(m_batteryState != BatteryNotPresent){ + O_WARNING("Battery is somehow not in the device?"); + setBatteryState(BatteryNotPresent); + } + if(!m_batteryWarning){ + O_WARNING("Battery is somehow not in the device?"); + m_batteryWarning = true; + emit batteryWarning(); + } + return; + } + int battery_level = Oxide::Power::batteryLevel(); + if(m_batteryLevel != battery_level){ + setBatteryLevel(battery_level); + } + bool charging = Oxide::Power::batteryCharging(); + if(charging && m_batteryState != BatteryCharging){ + setBatteryState(BatteryCharging); + }else if(!charging && m_batteryState != BatteryDischarging){ + setBatteryState(BatteryDischarging); + } + bool alert = Oxide::Power::batteryHasAlert(); + if(m_batteryAlert != alert){ + m_batteryAlert = alert; + if(alert){ + emit batteryAlert(); + } + } + bool warning = Oxide::Power::batteryHasWarning(); + if(m_batteryWarning != warning){ + if(warning){ + emit batteryWarning(); + } + m_batteryWarning = warning; + } + int temperature = Oxide::Power::batteryTemperature(); + if(m_batteryTemperature != temperature){ + setBatteryTemperature(temperature); + } +} + +void PowerAPI::updateCharger(){ + if(!Oxide::Power::chargers()->length()){ + if(m_chargerState != ChargerUnknown){ + setChargerState(ChargerUnknown); + } + if(!m_chargerWarning){ + O_WARNING("Can't find charger information"); + m_chargerWarning = true; + emit chargerWarning(); + } + return; + } + bool connected = Oxide::Power::chargerConnected(); + if(connected && m_chargerState != ChargerConnected){ + setChargerState(ChargerConnected); + }else if(!connected && m_chargerState != ChargerNotConnected){ + setChargerState(ChargerNotConnected); + } +} + +void PowerAPI::update(){ + updateBattery(); + updateCharger(); +} diff --git a/applications/system-service/powerapi.h b/applications/system-service/powerapi.h index c3eabdf67..268f64387 100644 --- a/applications/system-service/powerapi.h +++ b/applications/system-service/powerapi.h @@ -11,7 +11,6 @@ #include #include "apibase.h" -#include "systemapi.h" #define powerAPI PowerAPI::singleton() @@ -26,49 +25,11 @@ class PowerAPI : public APIBase { Q_PROPERTY(int chargerState READ chargerState NOTIFY chargerStateChanged) public: - static PowerAPI* singleton(PowerAPI* self = nullptr){ - static PowerAPI* instance; - if(self != nullptr){ - instance = self; - } - return instance; - } - PowerAPI(QObject* parent) - : APIBase(parent), m_chargerState(ChargerUnknown){ - Oxide::Sentry::sentry_transaction("power", "init", [this](Oxide::Sentry::Transaction* t){ - Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ - singleton(this); - }); - Oxide::Sentry::sentry_span(t, "sysfs", "Determine power devices from sysfs", [this](){ - Oxide::Power::batteries(); - Oxide::Power::chargers(); - }); - Oxide::Sentry::sentry_span(t, "update", "Update current state", [this]{ - update(); - }); - Oxide::Sentry::sentry_span(t, "timer", "Setup timer", [this]{ - timer = new QTimer(this); - timer->setSingleShot(false); - timer->setInterval(3 * 1000); // 3 seconds - timer->moveToThread(qApp->thread()); - connect(timer, &QTimer::timeout, this, QOverload<>::of(&PowerAPI::update)); - timer->start(); - }); - }); - } - ~PowerAPI(){ - qDebug() << "Killing timer"; - timer->stop(); - delete timer; - } - - void setEnabled(bool enabled) override { - if(enabled){ - timer->start(); - }else{ - timer->stop(); - } - } + static PowerAPI* singleton(PowerAPI* self = nullptr); + PowerAPI(QObject* parent); + ~PowerAPI(); + + void setEnabled(bool enabled) override; enum State { Normal, PowerSaving }; Q_ENUM(State) @@ -77,69 +38,20 @@ class PowerAPI : public APIBase { enum ChargerState { ChargerUnknown, ChargerConnected, ChargerNotConnected }; Q_ENUM(ChargerState) - int state(){ - if(!hasPermission("power")){ - return 0; - } - return m_state; - } - void setState(int state){ - if(!hasPermission("power")){ - return; - } - if(state < State::Normal || state > State::PowerSaving){ - throw QException{}; - } - m_state = state; - emit stateChanged(state); - } - - int batteryState() { - if(!hasPermission("power")){ - return BatteryUnknown; - } - return m_batteryState; - } - void setBatteryState(int batteryState){ - if(!hasPermission("power")){ - return; - } - m_batteryState = batteryState; - emit batteryStateChanged(batteryState); - } - - int batteryLevel() { - if(!hasPermission("power")){ - return 0; - } - return m_batteryLevel; - } - void setBatteryLevel(int batteryLevel){ - m_batteryLevel = batteryLevel; - emit batteryLevelChanged(batteryLevel); - } - - int batteryTemperature() { - if(!hasPermission("power")){ - return 0; - } - return m_batteryTemperature; - } - void setBatteryTemperature(int batteryTemperature){ - m_batteryTemperature = batteryTemperature; - emit batteryTemperatureChanged(batteryTemperature); - } - - int chargerState() { - if(!hasPermission("power")){ - return ChargerUnknown; - } - return m_chargerState; - } - void setChargerState(int chargerState){ - m_chargerState = chargerState; - emit chargerStateChanged(chargerState); - } + int state(); + void setState(int state); + + int batteryState(); + void setBatteryState(int batteryState); + + int batteryLevel(); + void setBatteryLevel(int batteryLevel); + + int batteryTemperature(); + void setBatteryTemperature(int batteryTemperature); + + int chargerState(); + void setChargerState(int chargerState); signals: void stateChanged(int); @@ -162,84 +74,11 @@ class PowerAPI : public APIBase { bool m_batteryAlert = false; bool m_chargerWarning = false; - void updateBattery(){ - if(!Oxide::Power::batteries()->length()){ - if(m_batteryState != BatteryUnknown){ - setBatteryState(BatteryUnknown); - } - if(!m_batteryWarning){ - O_WARNING("Can't find battery information"); - m_batteryWarning = true; - emit batteryWarning(); - } - return; - } - if(!Oxide::Power::batteryPresent()){ - if(m_batteryState != BatteryNotPresent){ - O_WARNING("Battery is somehow not in the device?"); - setBatteryState(BatteryNotPresent); - } - if(!m_batteryWarning){ - O_WARNING("Battery is somehow not in the device?"); - m_batteryWarning = true; - emit batteryWarning(); - } - return; - } - int battery_level = Oxide::Power::batteryLevel(); - if(m_batteryLevel != battery_level){ - setBatteryLevel(battery_level); - } - bool charging = Oxide::Power::batteryCharging(); - if(charging && m_batteryState != BatteryCharging){ - setBatteryState(BatteryCharging); - }else if(!charging && m_batteryState != BatteryDischarging){ - setBatteryState(BatteryDischarging); - } - bool alert = Oxide::Power::batteryHasAlert(); - if(m_batteryAlert != alert){ - m_batteryAlert = alert; - if(alert){ - emit batteryAlert(); - } - } - bool warning = Oxide::Power::batteryHasWarning(); - if(m_batteryWarning != warning){ - if(warning){ - emit batteryWarning(); - } - m_batteryWarning = warning; - } - int temperature = Oxide::Power::batteryTemperature(); - if(m_batteryTemperature != temperature){ - setBatteryTemperature(temperature); - } - } - void updateCharger(){ - if(!Oxide::Power::chargers()->length()){ - if(m_chargerState != ChargerUnknown){ - setChargerState(ChargerUnknown); - } - if(!m_chargerWarning){ - O_WARNING("Can't find charger information"); - m_chargerWarning = true; - emit chargerWarning(); - } - return; - } - bool connected = Oxide::Power::chargerConnected(); - if(connected && m_chargerState != ChargerConnected){ - setChargerState(ChargerConnected); - }else if(!connected && m_chargerState != ChargerNotConnected){ - setChargerState(ChargerNotConnected); - } - } + void updateBattery(); + void updateCharger(); private slots: - void update(){ - updateBattery(); - updateCharger(); - } + void update(); }; #endif // BATTERYAPI_H diff --git a/applications/system-service/screenapi.cpp b/applications/system-service/screenapi.cpp index d1efe0e5c..c6b18d34b 100644 --- a/applications/system-service/screenapi.cpp +++ b/applications/system-service/screenapi.cpp @@ -42,6 +42,149 @@ QDBusObjectPath ScreenAPI::screenshot(){ }); } +QImage ScreenAPI::copy(){ + return Oxide::dispatchToMainThread([]{ + auto frameBuffer = EPFrameBuffer::framebuffer(); + qDebug() << "Waiting for other painting to finish..."; + while(frameBuffer->paintingActive()){ + EPFrameBuffer::waitForLastUpdate(); + } + return frameBuffer->copy(); + }); +} + +QDBusObjectPath ScreenAPI::addScreenshot(QByteArray blob){ + if(!hasPermission("screen")){ + return QDBusObjectPath("/"); + } + qDebug() << "Adding external screenshot"; + mutex.lock(); + auto filePath = getNextPath(); + QFile file(filePath); + if(!file.open(QIODevice::WriteOnly)){ + qDebug("Failed to add screenshot"); + mutex.unlock(); + return QDBusObjectPath(""); + } + file.write(blob); + file.close(); + mutex.unlock(); + return addScreenshot(filePath)->qPath(); +} + +Screenshot* ScreenAPI::addScreenshot(QString filePath){ + Screenshot* instance; + Oxide::Sentry::sentry_transaction("screen", "addScreenshot", [this, filePath, &instance](Oxide::Sentry::Transaction* t){ + Oxide::Sentry::sentry_span(t, "screenshot", "Create screenshot", [this, filePath, &instance]{ + auto path = QString(OXIDE_SERVICE_PATH "/screenshots/") + QFileInfo(filePath).completeBaseName().remove('-').remove('.'); + instance = new Screenshot(path, filePath, this); + m_screenshots.append(instance); + }); + Oxide::Sentry::sentry_span(t, "events", "Connect and emit events", [this, &instance]{ + connect(instance, &Screenshot::removed, [this, instance]{ + if(m_enabled){ + emit screenshotRemoved(instance->qPath()); + } + m_screenshots.removeAll(instance); + delete instance; + }); + connect(instance, &Screenshot::modified, [this, instance]{ + if(m_enabled){ + emit screenshotModified(instance->qPath()); + } + }); + if(m_enabled){ + instance->registerPath(); + emit screenshotAdded(instance->qPath()); + } + }); + }); + return instance; +} + +void ScreenAPI::mkdirs(const QString& path, mode_t mode){ + QDir dir(path); + if(!dir.exists()){ + QString subpath = ""; + for(auto part : path.split("/")){ + subpath += "/" + part; + QDir dir(subpath); + if(!dir.exists()){ + mkdir(subpath.toStdString().c_str(), mode); + } + } + } +} + +QString ScreenAPI::getTimestamp(){ return QDateTime::currentDateTime().toString("yyyy-MM-ddThhmmss.zzz"); } + +QString ScreenAPI::getNextPath() { + QString filePath; + do { + filePath = "/home/root/screenshots/" + getTimestamp() + ".png"; + } while(QFile::exists(filePath)); + return filePath; +} + +ScreenAPI* ScreenAPI::singleton(ScreenAPI* self){ + static ScreenAPI* instance; + if(self != nullptr){ + instance = self; + } + return instance; +} + +ScreenAPI::ScreenAPI(QObject* parent) : APIBase(parent), m_screenshots(), m_enabled(false) { + Oxide::Sentry::sentry_transaction("screen", "init", [this](Oxide::Sentry::Transaction* t){ + qDBusRegisterMetaType>(); + Oxide::Sentry::sentry_span(t, "mkdirs", "Create screenshots directory", [this]{ + mkdirs("/home/root/screenshots/"); + }); + Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ + singleton(this); + }); + Oxide::Sentry::sentry_span(t, "screenshots", "Load existing screenshots", [this]{ + QDir dir("/home/root/screenshots/"); + dir.setNameFilters(QStringList() << "*.png"); + for(auto entry : dir.entryInfoList()){ + addScreenshot(entry.filePath()); + } + }); + }); +} + +ScreenAPI::~ScreenAPI(){} + +void ScreenAPI::setEnabled(bool enabled){ + m_enabled = enabled; + qDebug() << "Screen API" << enabled; + for(auto screenshot : m_screenshots){ + if(enabled){ + screenshot->registerPath(); + }else{ + screenshot->unregisterPath(); + } + } +} + +bool ScreenAPI::enabled() { + if(!hasPermission("screen")){ + return false; + } + return m_enabled; +} + +QList ScreenAPI::screenshots(){ + QList list; + if(!hasPermission("screen")){ + return list; + } + for(auto screenshot : m_screenshots){ + list.append(screenshot->qPath()); + } + return list; +} + bool ScreenAPI::drawFullscreenImage(QString path, float rotate) { if (!hasPermission("screen")) { return false; @@ -70,14 +213,14 @@ bool ScreenAPI::drawFullscreenImage(QString path, float rotate) { painter.setRenderHints( QPainter::Antialiasing | QPainter::SmoothPixmapTransform, 1 - ); + ); QPixmap pxmap; QPoint center(rect.width() / 2, rect.height() / 2); painter.translate(center); painter.scale( 1* (rect.width() / qreal(img.height())), 1 * (rect.width() / qreal(img.height())) - ); + ); painter.translate(0 - img.width() / 2, 0 - img.height() / 2); painter.drawPixmap(img.rect(), QPixmap::fromImage(img)); painter.end(); diff --git a/applications/system-service/screenapi.h b/applications/system-service/screenapi.h index cc23dfb82..fd14d96b1 100644 --- a/applications/system-service/screenapi.h +++ b/applications/system-service/screenapi.h @@ -34,93 +34,20 @@ class ScreenAPI : public APIBase { Q_PROPERTY(QList screenshots READ screenshots) public: - static ScreenAPI* singleton(ScreenAPI* self = nullptr){ - static ScreenAPI* instance; - if(self != nullptr){ - instance = self; - } - return instance; - } - ScreenAPI(QObject* parent) : APIBase(parent), m_screenshots(), m_enabled(false) { - Oxide::Sentry::sentry_transaction("screen", "init", [this](Oxide::Sentry::Transaction* t){ - qDBusRegisterMetaType>(); - Oxide::Sentry::sentry_span(t, "mkdirs", "Create screenshots directory", [this]{ - mkdirs("/home/root/screenshots/"); - }); - Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ - singleton(this); - }); - Oxide::Sentry::sentry_span(t, "screenshots", "Load existing screenshots", [this]{ - QDir dir("/home/root/screenshots/"); - dir.setNameFilters(QStringList() << "*.png"); - for(auto entry : dir.entryInfoList()){ - addScreenshot(entry.filePath()); - } - }); - }); - } - ~ScreenAPI(){} - void setEnabled(bool enabled){ - m_enabled = enabled; - qDebug() << "Screen API" << enabled; - for(auto screenshot : m_screenshots){ - if(enabled){ - screenshot->registerPath(); - }else{ - screenshot->unregisterPath(); - } - } - } - bool enabled() { - if(!hasPermission("screen")){ - return false; - } - return m_enabled; - } - QList screenshots(){ - QList list; - if(!hasPermission("screen")){ - return list; - } - for(auto screenshot : m_screenshots){ - list.append(screenshot->qPath()); - } - return list; - } + static ScreenAPI* singleton(ScreenAPI* self = nullptr); + ScreenAPI(QObject* parent); + ~ScreenAPI(); + void setEnabled(bool enabled); + bool enabled(); + QList screenshots(); Q_INVOKABLE bool drawFullscreenImage(QString path, float rotate = 0); Q_INVOKABLE QDBusObjectPath screenshot(); - QImage copy(){ - return Oxide::dispatchToMainThread([]{ - auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; - while(frameBuffer->paintingActive()){ - EPFrameBuffer::waitForLastUpdate(); - } - return frameBuffer->copy(); - }); - } + QImage copy(); public slots: - QDBusObjectPath addScreenshot(QByteArray blob){ - if(!hasPermission("screen")){ - return QDBusObjectPath("/"); - } - qDebug() << "Adding external screenshot"; - mutex.lock(); - auto filePath = getNextPath(); - QFile file(filePath); - if(!file.open(QIODevice::WriteOnly)){ - qDebug("Failed to add screenshot"); - mutex.unlock(); - return QDBusObjectPath(""); - } - file.write(blob); - file.close(); - mutex.unlock(); - return addScreenshot(filePath)->qPath(); - } + QDBusObjectPath addScreenshot(QByteArray blob); signals: void screenshotAdded(QDBusObjectPath); @@ -132,56 +59,10 @@ public slots: bool m_enabled; QMutex mutex; - Screenshot* addScreenshot(QString filePath){ - Screenshot* instance; - Oxide::Sentry::sentry_transaction("screen", "addScreenshot", [this, filePath, &instance](Oxide::Sentry::Transaction* t){ - Oxide::Sentry::sentry_span(t, "screenshot", "Create screenshot", [this, filePath, &instance]{ - auto path = QString(OXIDE_SERVICE_PATH "/screenshots/") + QFileInfo(filePath).completeBaseName().remove('-').remove('.'); - instance = new Screenshot(path, filePath, this); - m_screenshots.append(instance); - }); - Oxide::Sentry::sentry_span(t, "events", "Connect and emit events", [this, &instance]{ - connect(instance, &Screenshot::removed, [=]{ - if(m_enabled){ - emit screenshotRemoved(instance->qPath()); - } - m_screenshots.removeAll(instance); - delete instance; - }); - connect(instance, &Screenshot::modified, [=]{ - if(m_enabled){ - emit screenshotModified(instance->qPath()); - } - }); - if(m_enabled){ - instance->registerPath(); - emit screenshotAdded(instance->qPath()); - } - }); - }); - return instance; - } - void mkdirs(const QString& path, mode_t mode = 0700){ - QDir dir(path); - if(!dir.exists()){ - QString subpath = ""; - for(auto part : path.split("/")){ - subpath += "/" + part; - QDir dir(subpath); - if(!dir.exists()){ - mkdir(subpath.toStdString().c_str(), mode); - } - } - } - } - QString getTimestamp(){ return QDateTime::currentDateTime().toString("yyyy-MM-ddThhmmss.zzz"); } - QString getNextPath() { - QString filePath; - do { - filePath = "/home/root/screenshots/" + getTimestamp() + ".png"; - } while(QFile::exists(filePath)); - return filePath; - } + Screenshot* addScreenshot(QString filePath); + void mkdirs(const QString& path, mode_t mode = 0700); + QString getTimestamp(); + QString getNextPath(); }; #endif // SCREENSHOTAPI_H diff --git a/applications/system-service/screenshot.cpp b/applications/system-service/screenshot.cpp index 3495e34ae..580bbbab4 100644 --- a/applications/system-service/screenshot.cpp +++ b/applications/system-service/screenshot.cpp @@ -1,6 +1,110 @@ #include "screenshot.h" #include"screenapi.h" +Screenshot::Screenshot(QString path, QString filePath, QObject* parent) : QObject(parent), m_path(path), mutex() { + m_file = new QFile(filePath); + if(!m_file->open(QIODevice::ReadWrite)){ + qDebug() << "Unable to open screenshot file" << m_file->fileName(); + } +} + +Screenshot::~Screenshot(){ + unregisterPath(); + if(m_file->isOpen()){ + m_file->close(); + } + delete m_file; +} + +QString Screenshot::path() { return m_path; } + +QDBusObjectPath Screenshot::qPath(){ return QDBusObjectPath(path()); } + +void Screenshot::registerPath(){ + auto bus = QDBusConnection::systemBus(); + bus.unregisterObject(path(), QDBusConnection::UnregisterTree); + if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ + qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; + }else{ + qDebug() << "Failed to register" << path(); + } +} + +void Screenshot::unregisterPath(){ + auto bus = QDBusConnection::systemBus(); + if(bus.objectRegisteredAt(path()) != nullptr){ + qDebug() << "Unregistered" << path(); + bus.unregisterObject(path()); + } +} + +QByteArray Screenshot::blob(){ + if(!hasPermission("screen")){ + return QByteArray(); + } + if(!m_file->exists() && !m_file->isOpen()){ + emit removed(); + return QByteArray(); + } + mutex.lock(); + if(!m_file->isOpen() && !m_file->open(QIODevice::ReadWrite)){ + qDebug() << "Unable to open screenshot file" << m_file->fileName(); + mutex.unlock(); + return QByteArray(); + } + m_file->seek(0); + auto data = m_file->readAll(); + mutex.unlock(); + return data; +} + +void Screenshot::setBlob(QByteArray blob){ + if(!hasPermission("screen")){ + return; + } + mutex.lock(); + if(!m_file->isOpen() && !m_file->open(QIODevice::ReadWrite)){ + qDebug() << "Unable to open screenshot file" << m_file->fileName(); + mutex.unlock(); + return; + } + m_file->seek(0); + m_file->resize(blob.size()); + m_file->write(blob); + m_file->flush(); + mutex.unlock(); + emit modified(); +} + +QString Screenshot::getPath(){ + if(!hasPermission("screen")){ + return ""; + } + if(!m_file->exists()){ + emit removed(); + return ""; + } + return m_file->fileName(); +} + +void Screenshot::remove(){ + if(!hasPermission("screen")){ + return; + } + mutex.lock(); + if(m_file->exists() && !m_file->remove()){ + qDebug() << "Failed to remove screenshot" << path(); + mutex.unlock(); + return; + } + if(m_file->isOpen()){ + m_file->close(); + } + mutex.unlock(); + qDebug() << "Removed screenshot" << path(); + emit removed(); +} + bool Screenshot::hasPermission(QString permission, const char* sender){ return screenAPI->hasPermission(permission, sender); } #include "moc_screenshot.cpp" diff --git a/applications/system-service/screenshot.h b/applications/system-service/screenshot.h index a855911ab..4fe7426e2 100644 --- a/applications/system-service/screenshot.h +++ b/applications/system-service/screenshot.h @@ -19,106 +19,22 @@ class Screenshot : public QObject{ Q_PROPERTY(QString path READ getPath) public: - Screenshot(QString path, QString filePath, QObject* parent) : QObject(parent), m_path(path), mutex() { - m_file = new QFile(filePath); - if(!m_file->open(QIODevice::ReadWrite)){ - qDebug() << "Unable to open screenshot file" << m_file->fileName(); - } - } - ~Screenshot(){ - unregisterPath(); - if(m_file->isOpen()){ - m_file->close(); - } - delete m_file; - } - QString path() { return m_path; } - QDBusObjectPath qPath(){ return QDBusObjectPath(path()); } - void registerPath(){ - auto bus = QDBusConnection::systemBus(); - bus.unregisterObject(path(), QDBusConnection::UnregisterTree); - if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; - }else{ - qDebug() << "Failed to register" << path(); - } - } - void unregisterPath(){ - auto bus = QDBusConnection::systemBus(); - if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); - bus.unregisterObject(path()); - } - } - QByteArray blob(){ - if(!hasPermission("screen")){ - return QByteArray(); - } - if(!m_file->exists() && !m_file->isOpen()){ - emit removed(); - return QByteArray(); - } - mutex.lock(); - if(!m_file->isOpen() && !m_file->open(QIODevice::ReadWrite)){ - qDebug() << "Unable to open screenshot file" << m_file->fileName(); - mutex.unlock(); - return QByteArray(); - } - m_file->seek(0); - auto data = m_file->readAll(); - mutex.unlock(); - return data; - } - void setBlob(QByteArray blob){ - if(!hasPermission("screen")){ - return; - } - mutex.lock(); - if(!m_file->isOpen() && !m_file->open(QIODevice::ReadWrite)){ - qDebug() << "Unable to open screenshot file" << m_file->fileName(); - mutex.unlock(); - return; - } - m_file->seek(0); - m_file->resize(blob.size()); - m_file->write(blob); - m_file->flush(); - mutex.unlock(); - emit modified(); - } - QString getPath(){ - if(!hasPermission("screen")){ - return ""; - } - if(!m_file->exists()){ - emit removed(); - return ""; - } - return m_file->fileName(); - } + Screenshot(QString path, QString filePath, QObject* parent); + ~Screenshot(); + QString path(); + QDBusObjectPath qPath(); + void registerPath(); + void unregisterPath(); + QByteArray blob(); + void setBlob(QByteArray blob); + QString getPath(); signals: void modified(); void removed(); public slots: - void remove(){ - if(!hasPermission("screen")){ - return; - } - mutex.lock(); - if(m_file->exists() && !m_file->remove()){ - qDebug() << "Failed to remove screenshot" << path(); - mutex.unlock(); - return; - } - if(m_file->isOpen()){ - m_file->close(); - } - mutex.unlock(); - qDebug() << "Removed screenshot" << path(); - emit removed(); - } + void remove(); private: QString m_path; diff --git a/applications/system-service/system-service.pro b/applications/system-service/system-service.pro index faaf51555..0b2547e50 100644 --- a/applications/system-service/system-service.pro +++ b/applications/system-service/system-service.pro @@ -17,13 +17,18 @@ SOURCES += \ appsapi.cpp \ bss.cpp \ buttonhandler.cpp \ + dbusservice.cpp \ + digitizerhandler.cpp \ eventlistener.cpp \ + fifohandler.cpp \ network.cpp \ notification.cpp \ notificationapi.cpp \ + powerapi.cpp \ screenapi.cpp \ screenshot.cpp \ systemapi.cpp \ + wifiapi.cpp \ wlan.cpp \ wpa_supplicant.cpp \ main.cpp @@ -68,7 +73,6 @@ HEADERS += \ digitizerhandler.h \ eventlistener.h \ fifohandler.h \ - mxcfb.h \ network.h \ notification.h \ notificationapi.h \ @@ -94,8 +98,9 @@ DISTFILES += \ generate_xml.sh \ org.freedesktop.login1.xml +INCLUDEPATH += ../../shared/mxcfb + include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) QMAKE_POST_LINK += sh $$_PRO_FILE_PWD_/generate_xml.sh diff --git a/applications/system-service/systemapi.cpp b/applications/system-service/systemapi.cpp index 5428f0367..28413cf7a 100644 --- a/applications/system-service/systemapi.cpp +++ b/applications/system-service/systemapi.cpp @@ -126,6 +126,180 @@ void SystemAPI::PrepareForSleep(bool suspending){ }); } } +SystemAPI* SystemAPI::singleton(SystemAPI* self){ + static SystemAPI* instance; + if(self != nullptr){ + instance = self; + } + return instance; +} + +SystemAPI::SystemAPI(QObject* parent) + : APIBase(parent), + suspendTimer(this), + lockTimer(this), + settings(this), + sleepInhibitors(), + powerOffInhibitors(), + mutex(), + touches(), + swipeStates(), + swipeLengths() { + Oxide::Sentry::sentry_transaction("system", "init", [this](Oxide::Sentry::Transaction* t){ + Oxide::Sentry::sentry_span(t, "settings", "Sync settings", [this](Oxide::Sentry::Span* s){ + Oxide::Sentry::sentry_span(s, "swipes", "Default swipe values", [this]{ + for(short i = Right; i <= Down; i++){ + swipeStates[(SwipeDirection)i] = true; + } + }); + Oxide::Sentry::sentry_span(s, "sync", "Sync settings", [this]{ + settings.sync(); + }); + Oxide::Sentry::sentry_span(s, "singleton", "Instantiate singleton", [this]{ + singleton(this); + }); + resumeApp = nullptr; + }); + Oxide::Sentry::sentry_span(t, "systemd", "Connect to SystemD DBus", [this](Oxide::Sentry::Span* s){ + Oxide::Sentry::sentry_span(s, "manager", "Create manager object", [this]{ + systemd = new Manager("org.freedesktop.login1", "/org/freedesktop/login1", QDBusConnection::systemBus(), this); + }); + Oxide::Sentry::sentry_span(s, "connect", "Connect to signals", [this]{ + // Handle Systemd signals + connect(systemd, &Manager::PrepareForSleep, this, &SystemAPI::PrepareForSleep); + connect(&suspendTimer, &QTimer::timeout, this, &SystemAPI::suspendTimeout); + connect(&lockTimer, &QTimer::timeout, this, &SystemAPI::lockTimeout); + }); + }); + Oxide::Sentry::sentry_span(t, "autoSleep", "Setup automatic sleep", [this](Oxide::Sentry::Span* s){ + QSettings settings; + if(QFile::exists(settings.fileName())){ + qDebug() << "Importing old settings"; + settings.sync(); + if(settings.contains("autoSleep")){ + qDebug() << "Importing old autoSleep"; + sharedSettings.set_autoSleep(settings.value("autoSleep").toInt()); + } + int size = settings.beginReadArray("swipes"); + if(size){ + sharedSettings.beginWriteArray("swipes"); + for(short i = Right; i <= Down && i < size; i++){ + settings.setArrayIndex(i); + sharedSettings.setArrayIndex(i); + qDebug() << QString("Importing old swipe[%1]").arg(i); + sharedSettings.setValue("enabled", settings.value("enabled", true)); + sharedSettings.setValue("length", settings.value("length", 30)); + } + sharedSettings.endArray(); + } + settings.endArray(); + settings.remove("swipes"); + settings.sync(); + sharedSettings.sync(); + } + if(autoSleep() < 0) { + sharedSettings.set_autoSleep(0); + }else if(autoSleep() > 10){ + sharedSettings.set_autoSleep(10); + } + qDebug() << "Auto Sleep" << autoSleep(); + Oxide::Sentry::sentry_span(s, "timer", "Setup timers", [this]{ + if(autoSleep()){ + suspendTimer.start(autoSleep() * 60 * 1000); + }else{ + suspendTimer.stop(); + } + if(autoLock()){ + lockTimer.start(autoLock() * 60 * 1000); + }else{ + lockTimer.stop(); + } + }); + connect(&sharedSettings, &Oxide::SharedSettings::autoSleepChanged, [this](int _autoSleep){ + emit autoSleepChanged(_autoSleep); + }); + connect(&sharedSettings, &Oxide::SharedSettings::changed, [this](){ + sharedSettings.beginReadArray("swipes"); + for(short i = Right; i <= Down; i++){ + sharedSettings.setArrayIndex(i); + swipeStates[(SwipeDirection)i] = sharedSettings.value("enabled", true).toBool(); + int length = sharedSettings.value("length", 30).toInt(); + swipeLengths[(SwipeDirection)i] = length; + emit swipeLengthChanged(i, length); + } + sharedSettings.endArray(); + }); + }); + Oxide::Sentry::sentry_span(t, "swipes", "Load swipe settings", [this](){ + sharedSettings.beginReadArray("swipes"); + for(short i = Right; i <= Down; i++){ + sharedSettings.setArrayIndex(i); + swipeStates[(SwipeDirection)i] = sharedSettings.value("enabled", true).toBool(); + swipeLengths[(SwipeDirection)i] = sharedSettings.value("length", 30).toInt(); + } + sharedSettings.endArray(); + }); + // Ask Systemd to tell us nicely when we are about to suspend or resume + Oxide::Sentry::sentry_span(t, "inhibit", "Inhibit sleep and power off", [this](Oxide::Sentry::Span* s){ + Oxide::Sentry::sentry_span(s, "inhibitSleep", "Inhibit sleep", [this]{ + inhibitSleep(); + }); + Oxide::Sentry::sentry_span(s, "inhibitPowerOff", "Inhibit power off", [this]{ + inhibitPowerOff(); + }); + }); + qRegisterMetaType(); + Oxide::Sentry::sentry_span(t, "input", "Connect input events", [this]{ + connect(touchHandler, &DigitizerHandler::inputEvent, this, &SystemAPI::touchEvent); + connect(wacomHandler, &DigitizerHandler::inputEvent, this, &SystemAPI::penEvent); + eventListener->append([this](QObject* object, QEvent* event){ + Q_UNUSED(object); + switch(event->type()){ + case QEvent::KeyRelease: + case QEvent::KeyPress: + case QEvent::TabletPress: + case QEvent::TabletMove: + case QEvent::TabletRelease: + case QEvent::TabletTrackingChange: + case QEvent::TabletEnterProximity: + case QEvent::TabletLeaveProximity: + case QEvent::TouchBegin: + case QEvent::TouchCancel: + case QEvent::TouchEnd: + case QEvent::TouchUpdate: + activity(); + break; + default: + break; + } + return false; + }); + deviceSettings.onKeyboardAttachedChanged([this]{ + emit landscapeChanged(landscape()); + }); + }); + qDebug() << "System API ready to use"; + }); +} + +SystemAPI::~SystemAPI(){ + qDebug() << "Removing all inhibitors"; + rguard(false); + QMutableListIterator i(inhibitors); + while(i.hasNext()){ + auto inhibitor = i.next(); + inhibitor.release(); + i.remove(); + } + delete systemd; +} + +void SystemAPI::setEnabled(bool enabled){ + qDebug() << "System API" << enabled; +} + +int SystemAPI::autoSleep(){return sharedSettings.autoSleep(); } + void SystemAPI::setAutoSleep(int _autoSleep){ if(_autoSleep < 0 || _autoSleep > 360){ return; @@ -140,6 +314,8 @@ void SystemAPI::setAutoSleep(int _autoSleep){ sharedSettings.sync(); emit autoSleepChanged(_autoSleep); } + +int SystemAPI::autoLock(){return sharedSettings.autoLock(); } void SystemAPI::setAutoLock(int _autoLock){ if(_autoLock < 0 || _autoLock > 360){ return; @@ -150,12 +326,20 @@ void SystemAPI::setAutoLock(int _autoLock){ sharedSettings.sync(); emit autoLockChanged(_autoLock); } + +bool SystemAPI::lockOnSuspend(){return sharedSettings.lockOnSuspend(); } void SystemAPI::setLockOnSuspend(bool _lockOnSuspend){ sharedSettings.set_lockOnSuspend(_lockOnSuspend); qDebug() << "Lock on Suspend" << _lockOnSuspend; sharedSettings.sync(); emit lockOnSuspendChanged(_lockOnSuspend); } + +bool SystemAPI::sleepInhibited(){ return sleepInhibitors.length(); } + +bool SystemAPI::powerOffInhibited(){ return powerOffInhibitors.length(); } + +bool SystemAPI::landscape(){ return deviceSettings.keyboardAttached(); } void SystemAPI::uninhibitAll(QString name){ if(powerOffInhibited()){ powerOffInhibitors.removeAll(name); @@ -174,6 +358,16 @@ void SystemAPI::uninhibitAll(QString name){ suspendTimer.start(autoSleep() * 60 * 1000); } } + +void SystemAPI::stopSuspendTimer(){ + qDebug() << "Suspend timer disabled"; + suspendTimer.stop(); +} + +void SystemAPI::stopLockTimer(){ + qDebug() << "Lock timer disabled"; + lockTimer.stop(); +} void SystemAPI::startSuspendTimer(){ if(autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected && !suspendTimer.isActive()){ qDebug() << "Suspend timer re-enabled due to start Suspend timer"; @@ -186,6 +380,178 @@ void SystemAPI::startLockTimer(){ lockTimer.start(autoSleep() * 60 * 1000); } } + +void SystemAPI::lock(){ mutex.lock(); } + +void SystemAPI::unlock() { mutex.unlock(); } + +void SystemAPI::setSwipeEnabled(int direction, bool enabled){ + if(!hasPermission("system")){ + return; + } + if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ + qDebug() << "Invalid swipe direction: " << direction; + return; + } + setSwipeEnabled((SwipeDirection)direction, enabled); +} + +void SystemAPI::setSwipeEnabled(SwipeDirection direction, bool enabled){ + if(direction == None){ + return; + } + switch(direction){ + case Left: + qDebug() << "Swipe Left: " << enabled; + break; + case Right: + qDebug() << "Swipe Right: " << enabled; + break; + case Up: + qDebug() << "Swipe Up: " << enabled; + break; + case Down: + qDebug() << "Swipe Down: " << enabled; + break; + default: + return; + } + swipeStates[direction] = enabled; + sharedSettings.beginWriteArray("swipes"); + for(short i = Right; i <= Down; i++){ + sharedSettings.setArrayIndex(i); + sharedSettings.setValue("enabled", swipeStates[(SwipeDirection)i]); + sharedSettings.setValue("length", swipeLengths[(SwipeDirection)i]); + } + sharedSettings.endArray(); + sharedSettings.sync(); +} + +bool SystemAPI::getSwipeEnabled(int direction){ + if(!hasPermission("system")){ + return false; + } + if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ + qDebug() << "Invalid swipe direction: " << direction; + return false; + } + return getSwipeEnabled(direction); +} + +bool SystemAPI::getSwipeEnabled(SwipeDirection direction){ return swipeStates[direction]; } + +void SystemAPI::toggleSwipeEnabled(int direction){ + if(!hasPermission("system")){ + return; + } + if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ + qDebug() << "Invalid swipe direction: " << direction; + return; + } + toggleSwipeEnabled((SwipeDirection)direction); +} + +void SystemAPI::toggleSwipeEnabled(SwipeDirection direction){ setSwipeEnabled(direction, !getSwipeEnabled(direction)); } + +void SystemAPI::setSwipeLength(int direction, int length){ + int maxLength; + if(!hasPermission("system")){ + return; + } + if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ + qDebug() << "Invalid swipe direction: " << direction; + return; + } + if(direction == SwipeDirection::Up || direction == SwipeDirection::Down){ + maxLength = deviceSettings.getTouchHeight(); + }else{ + maxLength = deviceSettings.getTouchWidth(); + } + if(length < 0 || length > maxLength){ + qDebug() << "Invalid swipe length: " << direction; + return; + } + setSwipeLength((SwipeDirection)direction, length); +} + +void SystemAPI::setSwipeLength(SwipeDirection direction, int length){ + if(direction == None){ + return; + } + switch(direction){ + case Left: + qDebug() << "Swipe Left Length: " << length; + break; + case Right: + qDebug() << "Swipe Right Length: " << length; + break; + case Up: + qDebug() << "Swipe Up Length: " << length; + break; + case Down: + qDebug() << "Swipe Down Length: " << length; + break; + default: + return; + } + swipeLengths[direction] = length; + sharedSettings.beginWriteArray("swipes"); + for(short i = Right; i <= Down; i++){ + sharedSettings.setArrayIndex(i); + sharedSettings.setValue("enabled", swipeStates[(SwipeDirection)i]); + sharedSettings.setValue("length", swipeLengths[(SwipeDirection)i]); + } + sharedSettings.endArray(); + sharedSettings.sync(); + emit swipeLengthChanged(direction, length); +} + +int SystemAPI::getSwipeLength(int direction){ + if(!hasPermission("system")){ + return -1; + } + if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ + qDebug() << "Invalid swipe direction: " << direction; + return -1; + } + return getSwipeLength((SwipeDirection)direction); +} + +int SystemAPI::getSwipeLength(SwipeDirection direction){ return swipeLengths[direction]; } + +void SystemAPI::suspend(){ + if(sleepInhibited()){ + qDebug() << "Unable to suspend. Action is currently inhibited."; + return; + } + qDebug() << "Requesting Suspend..."; + systemd->Suspend(false).waitForFinished(); + qDebug() << "Suspend requested."; +} + +void SystemAPI::powerOff() { + if(powerOffInhibited()){ + qDebug() << "Unable to power off. Action is currently inhibited."; + return; + } + qDebug() << "Requesting Power off..."; + releasePowerOffInhibitors(true); + rguard(false); + systemd->PowerOff(false).waitForFinished(); + qDebug() << "Power off requested"; +} + +void SystemAPI::reboot() { + if(powerOffInhibited()){ + qDebug() << "Unable to reboot. Action is currently inhibited."; + return; + } + qDebug() << "Requesting Reboot..."; + releasePowerOffInhibitors(true); + rguard(false); + systemd->Reboot(false).waitForFinished(); + qDebug() << "Reboot requested"; +} void SystemAPI::activity(){ auto active = suspendTimer.isActive(); suspendTimer.stop(); @@ -208,6 +574,15 @@ void SystemAPI::activity(){ } } +void SystemAPI::inhibitSleep(QDBusMessage message){ + if(!sleepInhibited()){ + emit sleepInhibitedChanged(true); + } + suspendTimer.stop(); + sleepInhibitors.append(message.service()); + inhibitors.append(Inhibitor(systemd, "sleep:handle-suspend-key:idle", message.service(), "Application requested block", true)); +} + void SystemAPI::uninhibitSleep(QDBusMessage message){ if(!sleepInhibited()){ return; @@ -224,6 +599,24 @@ void SystemAPI::uninhibitSleep(QDBusMessage message){ emit sleepInhibitedChanged(false); } } + +void SystemAPI::inhibitPowerOff(QDBusMessage message){ + if(!powerOffInhibited()){ + emit powerOffInhibitedChanged(true); + } + powerOffInhibitors.append(message.service()); + inhibitors.append(Inhibitor(systemd, "shutdown:handle-power-key", message.service(), "Application requested block", true)); +} + +void SystemAPI::uninhibitPowerOff(QDBusMessage message){ + if(!powerOffInhibited()){ + return; + } + powerOffInhibitors.removeAll(message.service()); + if(!powerOffInhibited()){ + emit powerOffInhibitedChanged(false); + } +} void SystemAPI::suspendTimeout(){ if(autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected){ qDebug() << "Automatic suspend due to inactivity..."; @@ -239,6 +632,419 @@ void SystemAPI::lockTimeout(){ } } } + +void SystemAPI::touchEvent(const input_event& event){ + switch(event.type){ + case EV_SYN: + switch(event.code){ + case SYN_REPORT: + // Always mark the current slot as modified + auto touch = getEvent(currentSlot); + touch->modified = true; + QList released; + QList pressed; + QList moved; + for(auto touch : touches.values()){ + if(touch->id == -1){ + touch->active = false; + released.append(touch); + }else if(!touch->active){ + released.append(touch); + }else if(!touch->existing){ + pressed.append(touch); + }else if(touch->modified){ + moved.append(touch); + } + } + if(!penActive){ + if(pressed.length()){ + touchDown(pressed); + } + if(moved.length()){ + touchMove(moved); + } + if(released.length()){ + touchUp(released); + } + }else if(swipeDirection != None){ + if(Oxide::debugEnabled()){ + qDebug() << "Swiping cancelled due to pen activity"; + } + swipeDirection = None; + } + // Cleanup released touches + for(auto touch : released){ + if(!touch->active){ + touches.remove(touch->slot); + delete touch; + } + } + // Setup touches for next event set + for(auto touch : touches.values()){ + touch->modified = false; + touch->existing = touch->existing || (touch->x != NULL_TOUCH_COORD && touch->y != NULL_TOUCH_COORD); + } + break; + } + break; + case EV_ABS: + if(currentSlot == -1 && event.code != ABS_MT_SLOT){ + return; + } + switch(event.code){ + case ABS_MT_SLOT:{ + currentSlot = event.value; + auto touch = getEvent(currentSlot); + touch->modified = true; + }break; + case ABS_MT_TRACKING_ID:{ + auto touch = getEvent(currentSlot); + touch->active = event.value != -1; + if(touch->active){ + touch->id = event.value; + } + }break; + case ABS_MT_POSITION_X:{ + auto touch = getEvent(currentSlot); + touch->x = event.value; + }break; + case ABS_MT_POSITION_Y:{ + auto touch = getEvent(currentSlot); + touch->y = event.value; + }break; + case ABS_MT_PRESSURE:{ + auto touch = getEvent(currentSlot); + touch->pressure = event.value; + }break; + case ABS_MT_TOUCH_MAJOR:{ + auto touch = getEvent(currentSlot); + touch->major = event.value; + }break; + case ABS_MT_TOUCH_MINOR:{ + auto touch = getEvent(currentSlot); + touch->minor = event.value; + }break; + case ABS_MT_ORIENTATION:{ + auto touch = getEvent(currentSlot); + touch->orientation = event.value; + }break; + } + break; + } +} + +void SystemAPI::penEvent(const input_event& event){ + if(event.type != EV_KEY || event.code != BTN_TOOL_PEN){ + return; + } + penActive = event.value; + if(Oxide::debugEnabled()){ + qDebug() << "Pen state: " << (penActive ? "Active" : "Inactive"); + } +} + +void SystemAPI::inhibitSleep(){ + inhibitors.append(Inhibitor(systemd, "sleep", qApp->applicationName(), "Handle sleep screen")); +} + +void SystemAPI::inhibitPowerOff(){ + inhibitors.append(Inhibitor(systemd, "shutdown", qApp->applicationName(), "Block power off from any other method", true)); + rguard(true); +} + +void SystemAPI::releaseSleepInhibitors(bool block){ + QMutableListIterator i(inhibitors); + while(i.hasNext()){ + auto inhibitor = i.next(); + if(inhibitor.what.contains("sleep") && inhibitor.block == block){ + inhibitor.release(); + } + if(inhibitor.released()){ + i.remove(); + } + } +} + +void SystemAPI::releasePowerOffInhibitors(bool block){ + QMutableListIterator i(inhibitors); + while(i.hasNext()){ + auto inhibitor = i.next(); + if(inhibitor.what.contains("shutdown") && inhibitor.block == block){ + inhibitor.release(); + } + if(inhibitor.released()){ + i.remove(); + } + } +} + +void SystemAPI::rguard(bool install){ + QProcess::execute("/opt/bin/rguard", QStringList() << (install ? "-1" : "-0")); +} + +Touch* SystemAPI::getEvent(int slot){ + if(slot == -1){ + return nullptr; + } + if(!touches.contains(slot)){ + touches.insert(slot, new Touch{ + .slot = slot + }); + } + return touches.value(slot); +} + +int SystemAPI::getCurrentFingers(){ + return std::count_if(touches.begin(), touches.end(), [](Touch* touch){ + return touch->active; + }); +} + +void SystemAPI::touchDown(QList touches){ + if(penActive){ + return; + } + if(Oxide::debugEnabled()){ + qDebug() << "DOWN" << touches; + } + if(getCurrentFingers() != 1){ + return; + } + auto touch = touches.first(); + if(swipeDirection != None || touch->x == NULL_TOUCH_COORD || touch->y == NULL_TOUCH_COORD){ + return; + } + int offset = 20; + if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ + offset = 40; + } + if(touch->y <= offset){ + swipeDirection = Up; + }else if(touch->y > (deviceSettings.getTouchHeight() - offset)){ + swipeDirection = Down; + }else if(touch->x <= offset){ + if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ + swipeDirection = Right; + }else{ + swipeDirection = Left; + } + }else if(touch->x > (deviceSettings.getTouchWidth() - offset)){ + if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ + swipeDirection = Left; + }else{ + swipeDirection = Right; + } + }else{ + return; + } + if(Oxide::debugEnabled()){ + qDebug() << "Swipe started" << swipeDirection; + } + startLocation = location = QPoint(touch->x, touch->y); +} + +void SystemAPI::touchUp(QList touches){ + if(Oxide::debugEnabled()){ + qDebug() << "UP" << touches; + } + if(swipeDirection == None){ + if(Oxide::debugEnabled()){ + qDebug() << "Not swiping"; + } + if(touchHandler->grabbed()){ + for(auto touch : touches){ + writeTouchUp(touch); + } + touchHandler->ungrab(); + } + return; + } + if(getCurrentFingers()){ + if(Oxide::debugEnabled()){ + qDebug() << "Still swiping"; + } + if(touchHandler->grabbed()){ + for(auto touch : touches){ + writeTouchUp(touch); + } + } + return; + } + if(touches.length() > 1){ + if(Oxide::debugEnabled()){ + qDebug() << "Too many fingers"; + } + if(touchHandler->grabbed()){ + for(auto touch : touches){ + writeTouchUp(touch); + } + touchHandler->ungrab(); + } + swipeDirection = None; + return; + } + auto touch = touches.first(); + if(touch->x == NULL_TOUCH_COORD || touch->y == NULL_TOUCH_COORD){ + if(Oxide::debugEnabled()){ + qDebug() << "Invalid touch event"; + } + swipeDirection = None; + return; + } + if(swipeDirection == Up){ + if(!swipeStates[Up] || touch->y < location.y() || touch->y - startLocation.y() < swipeLengths[Up]){ + // Must end swiping up and having gone far enough + cancelSwipe(touch); + return; + } + emit bottomAction(); + }else if(swipeDirection == Down){ + if(!swipeStates[Down] || touch->y > location.y() || startLocation.y() - touch->y < swipeLengths[Down]){ + // Must end swiping down and having gone far enough + cancelSwipe(touch); + return; + } + emit topAction(); + }else if(swipeDirection == Right || swipeDirection == Left){ + auto isRM2 = deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2; + auto invalidLeft = !swipeStates[Left] || touch->x < location.x() || touch->x - startLocation.x() < swipeLengths[Left]; + auto invalidRight = !swipeStates[Right] || touch->x > location.x() || startLocation.x() - touch->x < swipeLengths[Right]; + if(swipeDirection == Right && (isRM2 ? invalidLeft : invalidRight)){ + // Must end swiping right and having gone far enough + cancelSwipe(touch); + return; + }else if(swipeDirection == Left && (isRM2 ? invalidRight : invalidLeft)){ + // Must end swiping left and having gone far enough + cancelSwipe(touch); + return; + } + if(swipeDirection == Left){ + emit rightAction(); + }else{ + emit leftAction(); + } + } + swipeDirection = None; + touchHandler->ungrab(); + touch->x = -1; + touch->y = -1; + writeTouchUp(touch); + if(Oxide::debugEnabled()){ + qDebug() << "Swipe direction" << swipeDirection; + } +} + +void SystemAPI::touchMove(QList touches){ + if(Oxide::debugEnabled()){ + qDebug() << "MOVE" << touches; + } + if(swipeDirection == None){ + if(touchHandler->grabbed()){ + for(auto touch : touches){ + writeTouchMove(touch); + } + touchHandler->ungrab(); + } + return; + } + if(touches.length() > 1){ + if(Oxide::debugEnabled()){ + qDebug() << "Too many fingers"; + } + if(touchHandler->grabbed()){ + for(auto touch : touches){ + writeTouchMove(touch); + } + touchHandler->ungrab(); + } + swipeDirection = None; + return; + } + auto touch = touches.first(); + if(touch->y > location.y()){ + location = QPoint(touch->x, touch->y); + } +} + +void SystemAPI::cancelSwipe(Touch* touch){ + if(Oxide::debugEnabled()){ + qDebug() << "Swipe Cancelled"; + } + swipeDirection = None; + touchHandler->ungrab(); + writeTouchUp(touch); +} + +void SystemAPI::writeTouchUp(Touch* touch){ + bool grabbed = touchHandler->grabbed(); + if(grabbed){ + touchHandler->ungrab(); + } + writeTouchMove(touch); + if(Oxide::debugEnabled()){ + qDebug() << "Write touch up" << touch; + } + int size = sizeof(input_event) * 3; + input_event* events = (input_event*)malloc(size); + events[0] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_SLOT, touch->slot); + events[1] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TRACKING_ID, -1); + events[2] = DigitizerHandler::createEvent(EV_SYN, 0, 0); + touchHandler->write(events, size); + free(events); + if(grabbed){ + touchHandler->grab(); + } +} + +void SystemAPI::writeTouchMove(Touch* touch){ + bool grabbed = touchHandler->grabbed(); + if(grabbed){ + touchHandler->ungrab(); + } + if(Oxide::debugEnabled()){ + qDebug() << "Write touch move" << touch; + } + int count = 8; + if(touch->x == NULL_TOUCH_COORD){ + count--; + } + if(touch->y == NULL_TOUCH_COORD){ + count--; + } + int size = sizeof(input_event) * count; + input_event* events = (input_event*)malloc(size); + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_SLOT, touch->slot); + if(touch->x != NULL_TOUCH_COORD){ + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_X, touch->x); + } + if(touch->y != NULL_TOUCH_COORD){ + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_Y, touch->y); + } + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_PRESSURE, touch->pressure); + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TOUCH_MAJOR, touch->major); + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TOUCH_MINOR, touch->minor); + events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_ORIENTATION, touch->orientation); + events[2] = DigitizerHandler::createEvent(EV_SYN, 0, 0); + touchHandler->write(events, size); + free(events); + if(grabbed){ + touchHandler->grab(); + } +} + +void SystemAPI::fn(){ + auto n = 512 * 8; + auto num_inst = 4; + input_event* ev = (input_event *)malloc(sizeof(struct input_event) * n * num_inst); + memset(ev, 0, sizeof(input_event) * n * num_inst); + auto i = 0; + while (i < n) { + ev[i++] = DigitizerHandler::createEvent(EV_ABS, ABS_DISTANCE, 1); + ev[i++] = DigitizerHandler::createEvent(EV_SYN, 0, 0); + ev[i++] = DigitizerHandler::createEvent(EV_ABS, ABS_DISTANCE, 2); + ev[i++] = DigitizerHandler::createEvent(EV_SYN, 0, 0); + } +} void SystemAPI::toggleSwipes(){ bool state = !swipeStates[Up]; setSwipeEnabled(Left, state); @@ -262,4 +1068,20 @@ void SystemAPI::toggleSwipes(){ notification->display(); } + +Inhibitor::Inhibitor(Manager* systemd, QString what, QString who, QString why, bool block) + : who(who), what(what), why(why), block(block) { + QDBusUnixFileDescriptor reply = systemd->Inhibit(what, who, why, block ? "block" : "delay"); + fd = reply.takeFileDescriptor(); +} + +void Inhibitor::release(){ + if(released()){ + return; + } + close(fd); + fd = -1; +} + +bool Inhibitor::released() { return fd == -1; } #include "moc_systemapi.cpp" diff --git a/applications/system-service/systemapi.h b/applications/system-service/systemapi.h index e1dfd7203..431f30c89 100644 --- a/applications/system-service/systemapi.h +++ b/applications/system-service/systemapi.h @@ -26,19 +26,9 @@ struct Inhibitor { QString what; QString why; bool block; - Inhibitor(Manager* systemd, QString what, QString who, QString why, bool block = false) - : who(who), what(what), why(why), block(block) { - QDBusUnixFileDescriptor reply = systemd->Inhibit(what, who, why, block ? "block" : "delay"); - fd = reply.takeFileDescriptor(); - } - void release(){ - if(released()){ - return; - } - close(fd); - fd = -1; - } - bool released() { return fd == -1; } + Inhibitor(Manager* systemd, QString what, QString who, QString why, bool block = false); + void release(); + bool released(); }; #define NULL_TOUCH_COORD -1 @@ -55,7 +45,7 @@ struct Touch { int major = 0; int minor = 0; int orientation = 0; - string debugString() const{ + inline string debugString() const{ return ""; } }; @@ -77,378 +67,45 @@ class SystemAPI : public APIBase { public: enum SwipeDirection { None, Right, Left, Up, Down }; Q_ENUM(SwipeDirection) - static SystemAPI* singleton(SystemAPI* self = nullptr){ - static SystemAPI* instance; - if(self != nullptr){ - instance = self; - } - return instance; - } - SystemAPI(QObject* parent) - : APIBase(parent), - suspendTimer(this), - lockTimer(this), - settings(this), - sleepInhibitors(), - powerOffInhibitors(), - mutex(), - touches(), - swipeStates(), - swipeLengths() { - Oxide::Sentry::sentry_transaction("system", "init", [this](Oxide::Sentry::Transaction* t){ - Oxide::Sentry::sentry_span(t, "settings", "Sync settings", [this](Oxide::Sentry::Span* s){ - Oxide::Sentry::sentry_span(s, "swipes", "Default swipe values", [this]{ - for(short i = Right; i <= Down; i++){ - swipeStates[(SwipeDirection)i] = true; - } - }); - Oxide::Sentry::sentry_span(s, "sync", "Sync settings", [this]{ - settings.sync(); - }); - Oxide::Sentry::sentry_span(s, "singleton", "Instantiate singleton", [this]{ - singleton(this); - }); - resumeApp = nullptr; - }); - Oxide::Sentry::sentry_span(t, "systemd", "Connect to SystemD DBus", [this](Oxide::Sentry::Span* s){ - Oxide::Sentry::sentry_span(s, "manager", "Create manager object", [this]{ - systemd = new Manager("org.freedesktop.login1", "/org/freedesktop/login1", QDBusConnection::systemBus(), this); - }); - Oxide::Sentry::sentry_span(s, "connect", "Connect to signals", [this]{ - // Handle Systemd signals - connect(systemd, &Manager::PrepareForSleep, this, &SystemAPI::PrepareForSleep); - connect(&suspendTimer, &QTimer::timeout, this, &SystemAPI::suspendTimeout); - connect(&lockTimer, &QTimer::timeout, this, &SystemAPI::lockTimeout); - }); - }); - Oxide::Sentry::sentry_span(t, "autoSleep", "Setup automatic sleep", [this](Oxide::Sentry::Span* s){ - QSettings settings; - if(QFile::exists(settings.fileName())){ - qDebug() << "Importing old settings"; - settings.sync(); - if(settings.contains("autoSleep")){ - qDebug() << "Importing old autoSleep"; - sharedSettings.set_autoSleep(settings.value("autoSleep").toInt()); - } - int size = settings.beginReadArray("swipes"); - if(size){ - sharedSettings.beginWriteArray("swipes"); - for(short i = Right; i <= Down && i < size; i++){ - settings.setArrayIndex(i); - sharedSettings.setArrayIndex(i); - qDebug() << QString("Importing old swipe[%1]").arg(i); - sharedSettings.setValue("enabled", settings.value("enabled", true)); - sharedSettings.setValue("length", settings.value("length", 30)); - } - sharedSettings.endArray(); - } - settings.endArray(); - settings.remove("swipes"); - settings.sync(); - sharedSettings.sync(); - } - if(autoSleep() < 0) { - sharedSettings.set_autoSleep(0); - }else if(autoSleep() > 10){ - sharedSettings.set_autoSleep(10); - } - qDebug() << "Auto Sleep" << autoSleep(); - Oxide::Sentry::sentry_span(s, "timer", "Setup timers", [this]{ - if(autoSleep()){ - suspendTimer.start(autoSleep() * 60 * 1000); - }else{ - suspendTimer.stop(); - } - if(autoLock()){ - lockTimer.start(autoLock() * 60 * 1000); - }else{ - lockTimer.stop(); - } - }); - connect(&sharedSettings, &Oxide::SharedSettings::autoSleepChanged, [=](int _autoSleep){ - emit autoSleepChanged(_autoSleep); - }); - connect(&sharedSettings, &Oxide::SharedSettings::changed, [=](){ - sharedSettings.beginReadArray("swipes"); - for(short i = Right; i <= Down; i++){ - sharedSettings.setArrayIndex(i); - swipeStates[(SwipeDirection)i] = sharedSettings.value("enabled", true).toBool(); - int length = sharedSettings.value("length", 30).toInt(); - swipeLengths[(SwipeDirection)i] = length; - emit swipeLengthChanged(i, length); - } - sharedSettings.endArray(); - }); - }); - Oxide::Sentry::sentry_span(t, "swipes", "Load swipe settings", [=](){ - sharedSettings.beginReadArray("swipes"); - for(short i = Right; i <= Down; i++){ - sharedSettings.setArrayIndex(i); - swipeStates[(SwipeDirection)i] = sharedSettings.value("enabled", true).toBool(); - swipeLengths[(SwipeDirection)i] = sharedSettings.value("length", 30).toInt(); - } - sharedSettings.endArray(); - }); - // Ask Systemd to tell us nicely when we are about to suspend or resume - Oxide::Sentry::sentry_span(t, "inhibit", "Inhibit sleep and power off", [this](Oxide::Sentry::Span* s){ - Oxide::Sentry::sentry_span(s, "inhibitSleep", "Inhibit sleep", [this]{ - inhibitSleep(); - }); - Oxide::Sentry::sentry_span(s, "inhibitPowerOff", "Inhibit power off", [this]{ - inhibitPowerOff(); - }); - }); - qRegisterMetaType(); - Oxide::Sentry::sentry_span(t, "input", "Connect input events", [this]{ - connect(touchHandler, &DigitizerHandler::inputEvent, this, &SystemAPI::touchEvent); - connect(wacomHandler, &DigitizerHandler::inputEvent, this, &SystemAPI::penEvent); - eventListener->append([this](QObject* object, QEvent* event){ - Q_UNUSED(object); - switch(event->type()){ - case QEvent::KeyRelease: - case QEvent::KeyPress: - case QEvent::TabletPress: - case QEvent::TabletMove: - case QEvent::TabletRelease: - case QEvent::TabletTrackingChange: - case QEvent::TabletEnterProximity: - case QEvent::TabletLeaveProximity: - case QEvent::TouchBegin: - case QEvent::TouchCancel: - case QEvent::TouchEnd: - case QEvent::TouchUpdate: - activity(); - break; - default: - break; - } - return false; - }); - deviceSettings.onKeyboardAttachedChanged([this]{ - emit landscapeChanged(landscape()); - }); - }); - qDebug() << "System API ready to use"; - }); - } - ~SystemAPI(){ - qDebug() << "Removing all inhibitors"; - rguard(false); - QMutableListIterator i(inhibitors); - while(i.hasNext()){ - auto inhibitor = i.next(); - inhibitor.release(); - i.remove(); - } - delete systemd; - } - void setEnabled(bool enabled){ - qDebug() << "System API" << enabled; - } - int autoSleep(){return sharedSettings.autoSleep(); } + static SystemAPI* singleton(SystemAPI* self = nullptr); + SystemAPI(QObject* parent); + ~SystemAPI(); + void setEnabled(bool enabled); + int autoSleep(); void setAutoSleep(int _autoSleep); - int autoLock(){return sharedSettings.autoLock(); } + int autoLock(); void setAutoLock(int _autoLock); - bool lockOnSuspend(){return sharedSettings.lockOnSuspend(); } + bool lockOnSuspend(); void setLockOnSuspend(bool _lockOnSuspend); - bool sleepInhibited(){ return sleepInhibitors.length(); } - bool powerOffInhibited(){ return powerOffInhibitors.length(); } - bool landscape(){ return deviceSettings.keyboardAttached(); } + bool sleepInhibited(); + bool powerOffInhibited(); + bool landscape(); void uninhibitAll(QString name); - void stopSuspendTimer(){ - qDebug() << "Suspend timer disabled"; - suspendTimer.stop(); - } - void stopLockTimer(){ - qDebug() << "Lock timer disabled"; - lockTimer.stop(); - } + void stopSuspendTimer(); + void stopLockTimer(); void startSuspendTimer(); void startLockTimer(); - void lock(){ mutex.lock(); } - void unlock() { mutex.unlock(); } - Q_INVOKABLE void setSwipeEnabled(int direction, bool enabled){ - if(!hasPermission("system")){ - return; - } - if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; - return; - } - setSwipeEnabled((SwipeDirection)direction, enabled); - } - void setSwipeEnabled(SwipeDirection direction, bool enabled){ - if(direction == None){ - return; - } - switch(direction){ - case Left: - qDebug() << "Swipe Left: " << enabled; - break; - case Right: - qDebug() << "Swipe Right: " << enabled; - break; - case Up: - qDebug() << "Swipe Up: " << enabled; - break; - case Down: - qDebug() << "Swipe Down: " << enabled; - break; - default: - return; - } - swipeStates[direction] = enabled; - sharedSettings.beginWriteArray("swipes"); - for(short i = Right; i <= Down; i++){ - sharedSettings.setArrayIndex(i); - sharedSettings.setValue("enabled", swipeStates[(SwipeDirection)i]); - sharedSettings.setValue("length", swipeLengths[(SwipeDirection)i]); - } - sharedSettings.endArray(); - sharedSettings.sync(); - } - Q_INVOKABLE bool getSwipeEnabled(int direction){ - if(!hasPermission("system")){ - return false; - } - if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; - return false; - } - return getSwipeEnabled(direction); - } - bool getSwipeEnabled(SwipeDirection direction){ return swipeStates[direction]; } - Q_INVOKABLE void toggleSwipeEnabled(int direction){ - if(!hasPermission("system")){ - return; - } - if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; - return; - } - toggleSwipeEnabled((SwipeDirection)direction); - } - void toggleSwipeEnabled(SwipeDirection direction){ setSwipeEnabled(direction, !getSwipeEnabled(direction)); } - Q_INVOKABLE void setSwipeLength(int direction, int length){ - int maxLength; - if(!hasPermission("system")){ - return; - } - if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; - return; - } - if(direction == SwipeDirection::Up || direction == SwipeDirection::Down){ - maxLength = deviceSettings.getTouchHeight(); - }else{ - maxLength = deviceSettings.getTouchWidth(); - } - if(length < 0 || length > maxLength){ - qDebug() << "Invalid swipe length: " << direction; - return; - } - setSwipeLength((SwipeDirection)direction, length); - } - void setSwipeLength(SwipeDirection direction, int length){ - if(direction == None){ - return; - } - switch(direction){ - case Left: - qDebug() << "Swipe Left Length: " << length; - break; - case Right: - qDebug() << "Swipe Right Length: " << length; - break; - case Up: - qDebug() << "Swipe Up Length: " << length; - break; - case Down: - qDebug() << "Swipe Down Length: " << length; - break; - default: - return; - } - swipeLengths[direction] = length; - sharedSettings.beginWriteArray("swipes"); - for(short i = Right; i <= Down; i++){ - sharedSettings.setArrayIndex(i); - sharedSettings.setValue("enabled", swipeStates[(SwipeDirection)i]); - sharedSettings.setValue("length", swipeLengths[(SwipeDirection)i]); - } - sharedSettings.endArray(); - sharedSettings.sync(); - emit swipeLengthChanged(direction, length); - } - Q_INVOKABLE int getSwipeLength(int direction){ - if(!hasPermission("system")){ - return -1; - } - if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; - return -1; - } - return getSwipeLength((SwipeDirection)direction); - } - int getSwipeLength(SwipeDirection direction){ return swipeLengths[direction]; } + void lock(); + void unlock(); + Q_INVOKABLE void setSwipeEnabled(int direction, bool enabled); + void setSwipeEnabled(SwipeDirection direction, bool enabled); + Q_INVOKABLE bool getSwipeEnabled(int direction); + bool getSwipeEnabled(SwipeDirection direction); + Q_INVOKABLE void toggleSwipeEnabled(int direction); + void toggleSwipeEnabled(SwipeDirection direction); + Q_INVOKABLE void setSwipeLength(int direction, int length); + void setSwipeLength(SwipeDirection direction, int length); + Q_INVOKABLE int getSwipeLength(int direction); + int getSwipeLength(SwipeDirection direction); public slots: - void suspend(){ - if(sleepInhibited()){ - qDebug() << "Unable to suspend. Action is currently inhibited."; - return; - } - qDebug() << "Requesting Suspend..."; - systemd->Suspend(false).waitForFinished(); - qDebug() << "Suspend requested."; - } - void powerOff() { - if(powerOffInhibited()){ - qDebug() << "Unable to power off. Action is currently inhibited."; - return; - } - qDebug() << "Requesting Power off..."; - releasePowerOffInhibitors(true); - rguard(false); - systemd->PowerOff(false).waitForFinished(); - qDebug() << "Power off requested"; - } - void reboot() { - if(powerOffInhibited()){ - qDebug() << "Unable to reboot. Action is currently inhibited."; - return; - } - qDebug() << "Requesting Reboot..."; - releasePowerOffInhibitors(true); - rguard(false); - systemd->Reboot(false).waitForFinished(); - qDebug() << "Reboot requested"; - } + void suspend(); + void powerOff(); + void reboot(); void activity(); - void inhibitSleep(QDBusMessage message){ - if(!sleepInhibited()){ - emit sleepInhibitedChanged(true); - } - suspendTimer.stop(); - sleepInhibitors.append(message.service()); - inhibitors.append(Inhibitor(systemd, "sleep:handle-suspend-key:idle", message.service(), "Application requested block", true)); - } + void inhibitSleep(QDBusMessage message); void uninhibitSleep(QDBusMessage message); - void inhibitPowerOff(QDBusMessage message){ - if(!powerOffInhibited()){ - emit powerOffInhibitedChanged(true); - } - powerOffInhibitors.append(message.service()); - inhibitors.append(Inhibitor(systemd, "shutdown:handle-power-key", message.service(), "Application requested block", true)); - } - void uninhibitPowerOff(QDBusMessage message){ - if(!powerOffInhibited()){ - return; - } - powerOffInhibitors.removeAll(message.service()); - if(!powerOffInhibited()){ - emit powerOffInhibitedChanged(false); - } - } + void inhibitPowerOff(QDBusMessage message); + void uninhibitPowerOff(QDBusMessage message); void toggleSwipes(); signals: void leftAction(); @@ -471,114 +128,8 @@ private slots: void PrepareForSleep(bool suspending); void suspendTimeout(); void lockTimeout(); - void touchEvent(const input_event& event){ - switch(event.type){ - case EV_SYN: - switch(event.code){ - case SYN_REPORT: - // Always mark the current slot as modified - auto touch = getEvent(currentSlot); - touch->modified = true; - QList released; - QList pressed; - QList moved; - for(auto touch : touches.values()){ - if(touch->id == -1){ - touch->active = false; - released.append(touch); - }else if(!touch->active){ - released.append(touch); - }else if(!touch->existing){ - pressed.append(touch); - }else if(touch->modified){ - moved.append(touch); - } - } - if(!penActive){ - if(pressed.length()){ - touchDown(pressed); - } - if(moved.length()){ - touchMove(moved); - } - if(released.length()){ - touchUp(released); - } - }else if(swipeDirection != None){ - if(Oxide::debugEnabled()){ - qDebug() << "Swiping cancelled due to pen activity"; - } - swipeDirection = None; - } - // Cleanup released touches - for(auto touch : released){ - if(!touch->active){ - touches.remove(touch->slot); - delete touch; - } - } - // Setup touches for next event set - for(auto touch : touches.values()){ - touch->modified = false; - touch->existing = touch->existing || (touch->x != NULL_TOUCH_COORD && touch->y != NULL_TOUCH_COORD); - } - break; - } - break; - case EV_ABS: - if(currentSlot == -1 && event.code != ABS_MT_SLOT){ - return; - } - switch(event.code){ - case ABS_MT_SLOT:{ - currentSlot = event.value; - auto touch = getEvent(currentSlot); - touch->modified = true; - }break; - case ABS_MT_TRACKING_ID:{ - auto touch = getEvent(currentSlot); - touch->active = event.value != -1; - if(touch->active){ - touch->id = event.value; - } - }break; - case ABS_MT_POSITION_X:{ - auto touch = getEvent(currentSlot); - touch->x = event.value; - }break; - case ABS_MT_POSITION_Y:{ - auto touch = getEvent(currentSlot); - touch->y = event.value; - }break; - case ABS_MT_PRESSURE:{ - auto touch = getEvent(currentSlot); - touch->pressure = event.value; - }break; - case ABS_MT_TOUCH_MAJOR:{ - auto touch = getEvent(currentSlot); - touch->major = event.value; - }break; - case ABS_MT_TOUCH_MINOR:{ - auto touch = getEvent(currentSlot); - touch->minor = event.value; - }break; - case ABS_MT_ORIENTATION:{ - auto touch = getEvent(currentSlot); - touch->orientation = event.value; - }break; - } - break; - } - } - void penEvent(const input_event& event){ - if(event.type != EV_KEY || event.code != BTN_TOOL_PEN){ - return; - } - penActive = event.value; - if(Oxide::debugEnabled()){ - qDebug() << "Pen state: " << (penActive ? "Active" : "Inactive"); - } - } + void touchEvent(const input_event& event); + void penEvent(const input_event& event); private: Manager* systemd; @@ -601,295 +152,20 @@ private slots: QMap swipeStates; QMap swipeLengths; - void inhibitSleep(){ - inhibitors.append(Inhibitor(systemd, "sleep", qApp->applicationName(), "Handle sleep screen")); - } - void inhibitPowerOff(){ - inhibitors.append(Inhibitor(systemd, "shutdown", qApp->applicationName(), "Block power off from any other method", true)); - rguard(true); - } - void releaseSleepInhibitors(bool block = false){ - QMutableListIterator i(inhibitors); - while(i.hasNext()){ - auto inhibitor = i.next(); - if(inhibitor.what.contains("sleep") && inhibitor.block == block){ - inhibitor.release(); - } - if(inhibitor.released()){ - i.remove(); - } - } - } - void releasePowerOffInhibitors(bool block = false){ - QMutableListIterator i(inhibitors); - while(i.hasNext()){ - auto inhibitor = i.next(); - if(inhibitor.what.contains("shutdown") && inhibitor.block == block){ - inhibitor.release(); - } - if(inhibitor.released()){ - i.remove(); - } - } - } - void rguard(bool install){ - QProcess::execute("/opt/bin/rguard", QStringList() << (install ? "-1" : "-0")); - } - Touch* getEvent(int slot){ - if(slot == -1){ - return nullptr; - } - if(!touches.contains(slot)){ - touches.insert(slot, new Touch{ - .slot = slot - }); - } - return touches.value(slot); - } - int getCurrentFingers(){ - return std::count_if(touches.begin(), touches.end(), [](Touch* touch){ - return touch->active; - }); - } + void inhibitSleep(); + void inhibitPowerOff(); + void releaseSleepInhibitors(bool block = false); + void releasePowerOffInhibitors(bool block = false); + void rguard(bool install); + Touch* getEvent(int slot); + int getCurrentFingers(); - void touchDown(QList touches){ - if(penActive){ - return; - } - if(Oxide::debugEnabled()){ - qDebug() << "DOWN" << touches; - } - if(getCurrentFingers() != 1){ - return; - } - auto touch = touches.first(); - if(swipeDirection != None || touch->x == NULL_TOUCH_COORD || touch->y == NULL_TOUCH_COORD){ - return; - } - int offset = 20; - if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ - offset = 40; - } - if(touch->y <= offset){ - swipeDirection = Up; - }else if(touch->y > (deviceSettings.getTouchHeight() - offset)){ - swipeDirection = Down; - }else if(touch->x <= offset){ - if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ - swipeDirection = Right; - }else{ - swipeDirection = Left; - } - }else if(touch->x > (deviceSettings.getTouchWidth() - offset)){ - if(deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2){ - swipeDirection = Left; - }else{ - swipeDirection = Right; - } - }else{ - return; - } - if(Oxide::debugEnabled()){ - qDebug() << "Swipe started" << swipeDirection; - } - startLocation = location = QPoint(touch->x, touch->y); - } - void touchUp(QList touches){ - if(Oxide::debugEnabled()){ - qDebug() << "UP" << touches; - } - if(swipeDirection == None){ - if(Oxide::debugEnabled()){ - qDebug() << "Not swiping"; - } - if(touchHandler->grabbed()){ - for(auto touch : touches){ - writeTouchUp(touch); - } - touchHandler->ungrab(); - } - return; - } - if(getCurrentFingers()){ - if(Oxide::debugEnabled()){ - qDebug() << "Still swiping"; - } - if(touchHandler->grabbed()){ - for(auto touch : touches){ - writeTouchUp(touch); - } - } - return; - } - if(touches.length() > 1){ - if(Oxide::debugEnabled()){ - qDebug() << "Too many fingers"; - } - if(touchHandler->grabbed()){ - for(auto touch : touches){ - writeTouchUp(touch); - } - touchHandler->ungrab(); - } - swipeDirection = None; - return; - } - auto touch = touches.first(); - if(touch->x == NULL_TOUCH_COORD || touch->y == NULL_TOUCH_COORD){ - if(Oxide::debugEnabled()){ - qDebug() << "Invalid touch event"; - } - swipeDirection = None; - return; - } - if(swipeDirection == Up){ - if(!swipeStates[Up] || touch->y < location.y() || touch->y - startLocation.y() < swipeLengths[Up]){ - // Must end swiping up and having gone far enough - cancelSwipe(touch); - return; - } - emit bottomAction(); - }else if(swipeDirection == Down){ - if(!swipeStates[Down] || touch->y > location.y() || startLocation.y() - touch->y < swipeLengths[Down]){ - // Must end swiping down and having gone far enough - cancelSwipe(touch); - return; - } - emit topAction(); - }else if(swipeDirection == Right || swipeDirection == Left){ - auto isRM2 = deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2; - auto invalidLeft = !swipeStates[Left] || touch->x < location.x() || touch->x - startLocation.x() < swipeLengths[Left]; - auto invalidRight = !swipeStates[Right] || touch->x > location.x() || startLocation.x() - touch->x < swipeLengths[Right]; - if(swipeDirection == Right && (isRM2 ? invalidLeft : invalidRight)){ - // Must end swiping right and having gone far enough - cancelSwipe(touch); - return; - }else if(swipeDirection == Left && (isRM2 ? invalidRight : invalidLeft)){ - // Must end swiping left and having gone far enough - cancelSwipe(touch); - return; - } - if(swipeDirection == Left){ - emit rightAction(); - }else{ - emit leftAction(); - } - } - swipeDirection = None; - touchHandler->ungrab(); - touch->x = -1; - touch->y = -1; - writeTouchUp(touch); - if(Oxide::debugEnabled()){ - qDebug() << "Swipe direction" << swipeDirection; - } - } - void touchMove(QList touches){ - if(Oxide::debugEnabled()){ - qDebug() << "MOVE" << touches; - } - if(swipeDirection == None){ - if(touchHandler->grabbed()){ - for(auto touch : touches){ - writeTouchMove(touch); - } - touchHandler->ungrab(); - } - return; - } - if(touches.length() > 1){ - if(Oxide::debugEnabled()){ - qDebug() << "Too many fingers"; - } - if(touchHandler->grabbed()){ - for(auto touch : touches){ - writeTouchMove(touch); - } - touchHandler->ungrab(); - } - swipeDirection = None; - return; - } - auto touch = touches.first(); - if(touch->y > location.y()){ - location = QPoint(touch->x, touch->y); - } - } - void cancelSwipe(Touch* touch){ - if(Oxide::debugEnabled()){ - qDebug() << "Swipe Cancelled"; - } - swipeDirection = None; - touchHandler->ungrab(); - writeTouchUp(touch); - } - void writeTouchUp(Touch* touch){ - bool grabbed = touchHandler->grabbed(); - if(grabbed){ - touchHandler->ungrab(); - } - writeTouchMove(touch); - if(Oxide::debugEnabled()){ - qDebug() << "Write touch up" << touch; - } - int size = sizeof(input_event) * 3; - input_event* events = (input_event*)malloc(size); - events[0] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_SLOT, touch->slot); - events[1] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TRACKING_ID, -1); - events[2] = DigitizerHandler::createEvent(EV_SYN, 0, 0); - touchHandler->write(events, size); - free(events); - if(grabbed){ - touchHandler->grab(); - } - } - void writeTouchMove(Touch* touch){ - bool grabbed = touchHandler->grabbed(); - if(grabbed){ - touchHandler->ungrab(); - } - if(Oxide::debugEnabled()){ - qDebug() << "Write touch move" << touch; - } - int count = 8; - if(touch->x == NULL_TOUCH_COORD){ - count--; - } - if(touch->y == NULL_TOUCH_COORD){ - count--; - } - int size = sizeof(input_event) * count; - input_event* events = (input_event*)malloc(size); - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_SLOT, touch->slot); - if(touch->x != NULL_TOUCH_COORD){ - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_X, touch->x); - } - if(touch->y != NULL_TOUCH_COORD){ - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_POSITION_Y, touch->y); - } - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_PRESSURE, touch->pressure); - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TOUCH_MAJOR, touch->major); - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_TOUCH_MINOR, touch->minor); - events[2] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_ORIENTATION, touch->orientation); - events[2] = DigitizerHandler::createEvent(EV_SYN, 0, 0); - touchHandler->write(events, size); - free(events); - if(grabbed){ - touchHandler->grab(); - } - } - void fn(){ - auto n = 512 * 8; - auto num_inst = 4; - input_event* ev = (input_event *)malloc(sizeof(struct input_event) * n * num_inst); - memset(ev, 0, sizeof(input_event) * n * num_inst); - auto i = 0; - while (i < n) { - ev[i++] = DigitizerHandler::createEvent(EV_ABS, ABS_DISTANCE, 1); - ev[i++] = DigitizerHandler::createEvent(EV_SYN, 0, 0); - ev[i++] = DigitizerHandler::createEvent(EV_ABS, ABS_DISTANCE, 2); - ev[i++] = DigitizerHandler::createEvent(EV_SYN, 0, 0); - } - } + void touchDown(QList touches); + void touchUp(QList touches); + void touchMove(QList touches); + void cancelSwipe(Touch* touch); + void writeTouchUp(Touch* touch); + void writeTouchMove(Touch* touch); + void fn(); }; #endif // SYSTEMAPI_H diff --git a/applications/system-service/wifiapi.cpp b/applications/system-service/wifiapi.cpp new file mode 100644 index 000000000..061695058 --- /dev/null +++ b/applications/system-service/wifiapi.cpp @@ -0,0 +1,829 @@ +#include "wifiapi.h" + +WifiAPI* WifiAPI::singleton(WifiAPI* self){ + static WifiAPI* instance; + if(self != nullptr){ + instance = self; + } + return instance; +} + +WifiAPI::WifiAPI(QObject* parent) + : APIBase(parent), + m_enabled(false), + wlans(), + networks(), + m_state(Unknown), + m_currentNetwork("/"), + m_link(0), + m_scanning(false) +{ + Oxide::Sentry::sentry_transaction("wifi", "init", [this](Oxide::Sentry::Transaction* t){ + Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ + singleton(this); + }); + Oxide::Sentry::sentry_span(t, "sysfs", "Finding wireless devices", [this](Oxide::Sentry::Span* s){ + QDir dir("/sys/class/net"); + qDebug() << "Looking for wireless devices..."; + for(auto path : dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Readable)){ + qDebug() << (" Checking " + path + "...").toStdString().c_str(); + Wlan* item = new Wlan(dir.path() + "/" + path, this); + if(!item->hasDirectory("wireless")){ + qDebug() << " Not a wireless device"; + continue; + } + qDebug() << " Wireless device found!"; + Oxide::Sentry::sentry_span(s, path.toStdString(), "Connect to wireless device", [this, item]{ + wlans.append(item); + connect(item, &Wlan::BSSAdded, this, &WifiAPI::BSSAdded, Qt::QueuedConnection); + connect(item, &Wlan::BSSRemoved, this, &WifiAPI::BSSRemoved, Qt::QueuedConnection); + connect(item, &Wlan::BlobAdded, this, &WifiAPI::BlobAdded, Qt::QueuedConnection); + connect(item, &Wlan::BlobRemoved, this, &WifiAPI::BlobRemoved, Qt::QueuedConnection); + connect(item, &Wlan::NetworkAdded, this, &WifiAPI::NetworkAdded, Qt::QueuedConnection); + connect(item, &Wlan::NetworkRemoved, this, &WifiAPI::NetworkRemoved, Qt::QueuedConnection); + connect(item, &Wlan::NetworkSelected, this, &WifiAPI::NetworkSelected, Qt::QueuedConnection); + connect(item, &Wlan::PropertiesChanged, this, &WifiAPI::InterfacePropertiesChanged, Qt::QueuedConnection); + connect(item, &Wlan::ScanDone, this, &WifiAPI::ScanDone, Qt::QueuedConnection); + }); + } + }); + Oxide::Sentry::sentry_span(t, "wpa_supplicant", "Connect to the wpa_supplicant", [this](Oxide::Sentry::Span* s){ + Oxide::Sentry::Span* span = Oxide::Sentry::start_span(s, "connect", "Connect to DBus interface"); + QDBusConnection bus = QDBusConnection::systemBus(); + if(!bus.isConnected()){ + O_WARNING("Failed to connect to system bus."); + throw QException(); + } + validateSupplicant(); + supplicant = new Wpa_Supplicant(WPA_SUPPLICANT_SERVICE, WPA_SUPPLICANT_SERVICE_PATH, bus); + connect(supplicant, &Wpa_Supplicant::InterfaceAdded, this, &WifiAPI::InterfaceAdded); + connect(supplicant, &Wpa_Supplicant::InterfaceRemoved, this, &WifiAPI::InterfaceRemoved); + connect(supplicant, &Wpa_Supplicant::PropertiesChanged, this, &WifiAPI::PropertiesChanged); + Oxide::Sentry::stop_span(span); + delete span; + Oxide::Sentry::sentry_span(s, "wlans", "Setting up wlan instances", [this, bus](Oxide::Sentry::Span* s){ + for(auto wlan : wlans){ + Oxide::Sentry::sentry_span(s, wlan->iface().toStdString(), "Load current networks and BSSs", [this, bus, wlan]{ + auto iface = wlan->iface(); + auto reply = (QDBusReply)supplicant->GetInterface(iface); + if(!reply.isValid() || reply.value().path() == "/"){ + QVariantMap args; + args.insert("Ifname", iface); + reply = supplicant->CreateInterface(args); + } + if(reply.isValid()){ + wlan->setInterface(reply.value().path()); + auto interface = wlan->interface(); + for(auto path : interface->networks()){ + bool found = false; + for(auto network : networks){ + if(network->path() == path.path()){ + found = true; + network->addNetwork(path.path(), interface); + break; + } + } + if(!found){ + INetwork inetwork(WPA_SUPPLICANT_SERVICE, path.path(), bus, interface); + auto properties = inetwork.properties(); + auto network = new Network(getPath("network", properties["ssid"].toString()), properties, this); + network->setEnabled(true); + network->addNetwork(path.path(), interface); + networks.append(network); + } + } + for(auto path : wlan->interface()->bSSs()){ + auto ibss = new IBSS(WPA_SUPPLICANT_SERVICE, path.path(), bus, wlan->interface()); + bool found = false; + auto bssid = ibss->bSSID(); + for(auto bss : bsss){ + if(bss->bssid() == bssid){ + found = true; + bss->addBSS(path.path()); + break; + } + } + if(!found){ + auto bss = new BSS(getPath("bss", bssid), ibss, this); + bsss.append(bss); + }else{ + ibss->deleteLater(); + } + } + } + }); + } + }); + }); + Oxide::Sentry::sentry_span(t, "load", "Load state", [this](Oxide::Sentry::Span* s){ + Oxide::Sentry::sentry_span(s, "timer", "Setup timer", [this]{ + timer = new QTimer(this); + timer->setSingleShot(false); + timer->setInterval(3 * 1000); // 3 seconds + timer->moveToThread(qApp->thread()); + connect(timer, &QTimer::timeout, this, QOverload<>::of(&WifiAPI::update)); + }); + Oxide::Sentry::sentry_span(s, "networks", "Load networks from disk", [this]{ + loadNetworks(); + }); + Oxide::Sentry::sentry_span(s, "state", "Syncronize state with settings", [this]{ + m_state = getCurrentState(); + if(xochitlSettings.wifion()){ + enable(); + }else{ + disable(); + } + }); + Oxide::Sentry::sentry_span(s, "update", "Update current state", [this]{ + update(); + }); + Oxide::Sentry::sentry_span(s, "setEnabled", "Enable/disable API objects", [this]{ + setEnabled(m_enabled); + }); + Oxide::Sentry::sentry_span(s, "timer", "Start timer", [this]{ + timer->start(); + }); + }); + }); +} + +WifiAPI::~WifiAPI(){ + qDebug() << "Unregistering all networks"; + while(!networks.isEmpty()){ + networks.takeFirst()->deleteLater(); + } + qDebug() << "Unregistering all BSSs"; + while(!bsss.isEmpty()){ + bsss.takeFirst()->deleteLater(); + } + qDebug() << "Killing timer"; + timer->stop(); + timer->deleteLater(); +} + +void WifiAPI::setEnabled(bool enabled){ + qDebug() << "Wifi API" << enabled; + m_enabled = enabled; + if(enabled){ + for(auto network : networks){ + network->registerPath(); + } + for(auto bss : bsss){ + bss->registerPath(); + } + }else{ + for(auto network : networks){ + network->unregisterPath(); + } + for(auto bss : bsss){ + bss->unregisterPath(); + } + } +} + +bool WifiAPI::getEnabled(){ return m_enabled; } + +QList WifiAPI::getWlans(){ return wlans; } + +QList WifiAPI::getInterfaces(){ return interfaces(); } + +int WifiAPI::state(){ + if(!hasPermission("wifi")){ + return Unknown; + } + return m_state; +} + +void WifiAPI::setState(int state){ + if(!hasPermission("wifi")){ + return; + } + if(state < Unknown || state > Online){ + throw QException{}; + } + m_state = state; + emit stateChanged(state); +} + +bool WifiAPI::enable(){ + if(!hasPermission("wifi")){ + return false; + } + qDebug() << "Turning wifi on"; + if(m_state == Off){ + setState(Disconnected); + } + if(system("/usr/sbin/rfkill unblock wifi")){ + qDebug() << "Failed to enable wifi devices"; + return false; + } + for(auto wlan : wlans){ + if(!wlan->isUp() && !wlan->up()){ + qDebug() << "Failed to enable " + wlan->iface(); + continue; + } + } + xochitlSettings.set_wifion(true); + validateSupplicant(); + auto state = getCurrentState(); + m_state = state; + if(state != Online){ + qDebug() << "State:" << state; + reconnect(); + } + return true; +} + +void WifiAPI::disable(){ + if(!hasPermission("wifi")){ + return; + } + qDebug() << "Turning wifi off"; + setState(Off); + for(auto wlan : wlans){ + if(wlan->isUp() && !wlan->down()){ + qDebug() << "Failed to disable " + wlan->iface(); + } + } + if(system("/usr/sbin/rfkill block wifi")){ + qDebug() << "Failed to disable wifi devices"; + } + flushBSSCache(0); + xochitlSettings.set_wifion(false); +} + +QDBusObjectPath WifiAPI::addNetwork(QString ssid, QVariantMap properties){ + if(!hasPermission("wifi")){ + return QDBusObjectPath("/"); + } + Q_UNUSED(properties) + for(auto network : networks){ + if(network->ssid() == ssid){ + return QDBusObjectPath(network->path()); + } + } + auto network = new Network(getPath("network", ssid), ssid, properties, this); + network->registerNetwork(); + network->setEnabled(true); + if(m_enabled){ + network->registerPath(); + } + networks.append(network); + auto path = QDBusObjectPath(network->path()); + emit networkAdded(path); + return path; +} + +QList WifiAPI::getNetwork(QVariantMap properties){ + QList result; + if(!hasPermission("wifi")){ + return result; + } + for(auto network : networks){ + bool found = true; + auto props = network->properties(); + for(auto key : properties.keys()){ + auto value = properties[key]; + if( + (key == "ssid" && value.toString() != network->ssid()) + || (key == "protococl" && value.toString() != network->protocol()) + || (key != "ssid" && key != "protocol" && value != props[key]) + ){ + found = false; + break; + } + } + if(found){ + result.append(QDBusObjectPath(network->path())); + } + } + return result; +} + +QList WifiAPI::getBSS(QVariantMap properties){ + QList result; + if(!hasPermission("wifi")){ + return result; + } + for(auto bss : bsss){ + bool found = true; + for(auto key : properties.keys()){ + auto value = properties[key]; + if(properties[key] != bss->property(key.toStdString().c_str())){ + found = false; + break; + } + } + if(found){ + result.append(QDBusObjectPath(bss->path())); + } + } + return result; +} + +void WifiAPI::scan(bool active){ + if(!hasPermission("wifi")){ + return; + } + if(!m_scanning){ + m_scanning = true; + emit scanningChanged(true); + } + QMap args; + args["Type"] = active ? "active" : "passive"; + QList> replies; + for(auto interface : interfaces()){ + replies.append(interface->Scan(args)); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void WifiAPI::reconnect(){ + if(!hasPermission("wifi")){ + return; + } + qDebug() << "Reconnecting to wifi"; + QList> replies; + for(auto interface : interfaces()){ + replies.append(interface->Reconnect()); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void WifiAPI::reassosiate(){ + if(!hasPermission("wifi")){ + return; + } + QList> replies; + for(auto interface : interfaces()){ + replies.append(interface->Reassociate()); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void WifiAPI::disconnect(){ + if(!hasPermission("wifi")){ + return; + } + QList> replies; + for(auto interface : interfaces()){ + replies.append(interface->Disconnect()); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void WifiAPI::flushBSSCache(uint age){ + if(!hasPermission("wifi")){ + return; + } + QList> replies; + for(auto interface : interfaces()){ + replies.append(interface->FlushBSS(age)); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void WifiAPI::addBlob(QString name, QByteArray blob){ + if(!hasPermission("wifi")){ + return; + } + QList> replies; + for(auto interface : interfaces()){ + replies.append(interface->AddBlob(name, blob)); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +void WifiAPI::removeBlob(QString name){ + if(!hasPermission("wifi")){ + return; + } + QList> replies; + for(auto interface : interfaces()){ + replies.append(interface->RemoveBlob(name)); + } + for(auto reply : replies){ + reply.waitForFinished(); + } +} + +QByteArray WifiAPI::getBlob(QString name, QByteArray blob){ + if(!hasPermission("wifi")){ + return QByteArray(); + } + for(auto interface : interfaces()){ + auto reply = (QDBusReply)interface->AddBlob(name, blob); + if(reply.isValid()){ + return reply; + } + } + return QByteArray(); +} + +QStringList WifiAPI::blobs(){ + QSet result; + if(!hasPermission("wifi")){ + return result.values(); + } + for(auto wlan : wlans){ + result.unite(wlan->blobs()); + } + return result.values(); +} + +QList WifiAPI::bSSs(){ + QList result; + if(!hasPermission("wifi")){ + return result; + } + for(auto bss : bsss){ + result.append(QDBusObjectPath(bss->path())); + } + return result; +} + +int WifiAPI::link(){ + if(!hasPermission("wifi")){ + return 0; + } + int result = 0; + for(auto wlan : wlans){ + int link = wlan->link(); + if(result < link){ + result = link; + } + } + return result; +} + +int WifiAPI::rssi(){ + if(!hasPermission("wifi")){ + return -100; + } + int result = -100; + for(auto wlan : wlans){ + if(!wlan->isUp()){ + continue; + } + int rssi = wlan->rssi(); + if(result < rssi){ + result = rssi; + } + } + return result; +} + +QDBusObjectPath WifiAPI::network(){ + if(!hasPermission("wifi")){ + return QDBusObjectPath("/"); + } + for(auto interface : getInterfaces()){ + auto state = interface->state(); + if(state == "associated" || state == "completed"){ + auto ipath = interface->currentNetwork().path(); + for(auto network : networks){ + if(network->paths().contains(ipath)){ + return QDBusObjectPath(network->path()); + } + } + } + } + return QDBusObjectPath("/"); +} + +QList WifiAPI::getNetworkPaths(){ + QList result; + for(auto network : networks){ + result.append(QDBusObjectPath(network->path())); + } + return result; +} + +bool WifiAPI::scanning(){ + if(!hasPermission("wifi")){ + return false; + } + for(auto interface : interfaces()){ + if(interface->scanning()){ + if(!m_scanning){ + m_scanning = true; + emit scanningChanged(true); + } + return true; + } + } + return false; +} + +void WifiAPI::BSSAdded(Wlan* wlan, const QDBusObjectPath& path, const QVariantMap& properties){ + Q_UNUSED(wlan); + auto sPath = path.path(); + auto bssid = properties["BSSID"].toString(); + if(bssid.isEmpty()){ + return; + } + auto ssid = properties["SSID"].toString(); + for(auto bss : bsss){ + for(auto nPath : bss->paths()){ + if(nPath == sPath){ + return; + } + } + if(bss->ssid() == ssid && bss->bssid() == bssid){ + bss->addBSS(sPath); + return; + } + } + qDebug() << "BSS added " << bssid.toUtf8().toHex() << ssid; + auto bss = new BSS(getPath("bss", bssid), bssid, ssid, this); + if(m_enabled){ + bss->registerPath(); + } + bsss.append(bss); + emit bssFound(QDBusObjectPath(bss->path())); +} + +void WifiAPI::BSSRemoved(Wlan* wlan, const QDBusObjectPath& path){ + Q_UNUSED(wlan); + auto sPath = path.path(); + QMutableListIterator i(bsss); + while(i.hasNext()){ + auto bss = i.next(); + bss->removeBSS(sPath); + if(!bss->paths().length()){ + i.remove(); + emit bss->removed(); + emit bssRemoved(QDBusObjectPath(bss->path())); + bss->deleteLater(); + } + } +} + +void WifiAPI::BlobAdded(Wlan* wlan, const QString& name){ + Q_UNUSED(wlan); + Q_UNUSED(name); +} + +void WifiAPI::BlobRemoved(Wlan* wlan, const QString& name){ + Q_UNUSED(wlan); + Q_UNUSED(name); +} + +void WifiAPI::NetworkAdded(Wlan* wlan, const QDBusObjectPath& path, const QVariantMap& properties){ + auto sPath = path.path(); + auto ssid = properties["ssid"].toString(); + if(ssid.isEmpty()){ + return; + } + ssid = ssid.mid(1, ssid.length() - 2); + for(auto network : networks){ + for(auto nPath : network->paths()){ + if(nPath == sPath){ + return; + } + } + if(network->ssid() == ssid){ + network->addNetwork(sPath, wlan->interface()); + return; + } + } + qDebug() << "Network added " << ssid; + auto network = new Network(getPath("network", ssid), properties, this); + network->addNetwork(path.path(), wlan->interface()); + if(m_enabled){ + network->registerPath(); + } + networks.append(network); + emit networkAdded(path); +} + +void WifiAPI::NetworkRemoved(Wlan* wlan, const QDBusObjectPath& path){ + Q_UNUSED(wlan); + auto sPath = path.path(); + QMutableListIterator i(networks); + while(i.hasNext()){ + auto network = i.next(); + network->removeNetwork(sPath); + if(!network->paths().length()){ + i.remove(); + emit network->removed(); + emit networkRemoved(QDBusObjectPath(network->path())); + qDebug() << "Network removed " << network->ssid(); + network->deleteLater(); + } + } +} + +void WifiAPI::NetworkSelected(Wlan* wlan, const QDBusObjectPath& path){ + Q_UNUSED(wlan); + for(auto network : networks){ + if(network->paths().contains(path.path())){ + qDebug() << "Network selected" << path.path(); + break; + } + } +} + +void WifiAPI::InterfacePropertiesChanged(Wlan* wlan, const QVariantMap& properties){ + Q_UNUSED(wlan); + Q_UNUSED(properties); +} + +void WifiAPI::ScanDone(Wlan* wlan, bool success){ + Q_UNUSED(wlan) + Q_UNUSED(success) + m_scanning = false; + emit scanningChanged(false); +} + +void WifiAPI::BSSPropertiesChanged(const QVariantMap& properties){ + Q_UNUSED(properties); +} + +void WifiAPI::stopUpdating(){ timer->stop(); } + +void WifiAPI::resumeUpdating(){ timer->start(); } + +void WifiAPI::InterfaceAdded(const QDBusObjectPath& path, const QVariantMap& properties){ + for(auto wlan : wlans){ + if(properties["Ifname"].toString() == wlan->iface()){ + wlan->setInterface(path.path()); + break; + } + } +} + +void WifiAPI::InterfaceRemoved(const QDBusObjectPath& path){ + for(auto wlan : wlans){ + if(wlan->interface() != nullptr && wlan->interface()->path() == path.path()){ + auto interface = wlan->interface(); + for(auto network : networks){ + network->removeInterface(interface); + if(network->paths().empty()){ + emit network->removed(); + emit networkRemoved(QDBusObjectPath(network->path())); + qDebug() << "Network removed " << network->ssid(); + } + } + wlan->removeInterface(); + } + } +} + +void WifiAPI::PropertiesChanged(const QVariantMap& properties){ + Q_UNUSED(properties); +} + +QList WifiAPI::interfaces(){ + QList result; + for(auto wlan : wlans){ + if(wlan->interface() != nullptr){ + result.append(wlan->interface()); + } + } + return result; +} + +void WifiAPI::validateSupplicant(){ + QDBusConnection bus = QDBusConnection::systemBus(); + QStringList serviceNames = bus.interface()->registeredServiceNames(); + if (!serviceNames.contains(WPA_SUPPLICANT_SERVICE)){ + if(system("/bin/systemctl --quiet is-active wpa_supplicant")){ + qDebug() << "Starting wpa_supplicant..."; + if(system("/bin/systemctl --quiet start wpa_supplicant")){ + qCritical() << "Failed to start wpa_supplicant"; + throw QException(); + } + } + qDebug() << "Waiting for wpa_supplicant dbus service..."; + while(!serviceNames.contains(WPA_SUPPLICANT_SERVICE)){ + struct timespec args{ + .tv_sec = 1, + .tv_nsec = 0, + }, res; + nanosleep(&args, &res); + serviceNames = bus.interface()->registeredServiceNames(); + } + } +} + +void WifiAPI::loadNetworks(){ + qDebug() << "Loading networks from settings..."; + QList> registeredNetworks = xochitlSettings.wifinetworks().values(); + qDebug() << "Registering networks..."; + for(auto registration : registeredNetworks){ + bool found = false; + auto ssid = registration["ssid"].toString(); + auto protocol = registration["protocol"].toString(); + for(auto network : networks){ + if(network->ssid() == ssid && network->protocol() == protocol){ + qDebug() << " Found network" << network->ssid(); + found = true; + if(network->password() != registration["password"].toString()){ + network->setPassword(registration["password"].toString()); + } + if(!network->enabled()){ + network->setEnabled(true); + } + break; + } + } + if(!found){ + QVariantMap args; + auto network = new Network(getPath("network", ssid), ssid, QVariantMap(), this); + network->setProtocol(protocol); + if(registration.contains("password")){ + network->setPassword(registration["password"].toString()); + } + network->registerNetwork(); + network->setEnabled(true); + if(m_enabled){ + network->registerPath(); + } + networks.append(network); + emit networkAdded(QDBusObjectPath(network->path())); + qDebug() << " Registered network" << ssid; + } + } + qDebug() << "Loaded networks."; +} + +void WifiAPI::update(){ + auto state = getCurrentState(); + bool enabled = xochitlSettings.wifion(); + if(enabled && state == Off){ + enable(); + state = getCurrentState(); + }else if(!enabled && state != Off){ + disable(); + state = getCurrentState(); + } + auto path = network().path(); + if((state == Online || state == Offline) && m_currentNetwork.path() != path){ + qDebug() << "Connected to" << path; + m_currentNetwork.setPath(path); + emit networkConnected(m_currentNetwork); + }else if((state == Disconnected || state == Off) && m_currentNetwork.path() != "/"){ + qDebug() << "Disconnected from" << m_currentNetwork.path(); + m_currentNetwork.setPath("/"); + emit disconnected(); + } + if(m_state != state){ + setState(state); + } + auto clink = link(); + if(m_link != clink){ + m_link = clink; + emit linkChanged(clink); + } + auto crssi = rssi(); + if(m_rssi != crssi){ + m_rssi = crssi; + emit rssiChanged(crssi); + } +} + +WifiAPI::State WifiAPI::getCurrentState(){ + State state = Off; + for(auto wlan : wlans){ + if(!wlan->isUp()){ + continue; + } + if(state == Off){ + state = Disconnected; + } + if(wlan->operstate() == "up"){ + state = Offline; + } + if(wlan->isConnected()){ + state = Online; + break; + } + } + return state; +} + +QString WifiAPI::getPath(QString type, QString id){ + static const QUuid NS = QUuid::fromString(QLatin1String("{78c28d66-f558-11ea-adc1-0242ac120002}")); + if(type == "network"){ + id= QUuid::createUuidV5(NS, id).toString(QUuid::Id128); + }else if(type == "bss"){ + id = id.toUtf8().toHex(); + } + if(id.isEmpty()){ + id = QUuid::createUuid().toString(QUuid::Id128); + } + return QString(OXIDE_SERVICE_PATH "/") + type + "/" + id; +} diff --git a/applications/system-service/wifiapi.h b/applications/system-service/wifiapi.h index 2fa23f9d7..4a10e7e54 100644 --- a/applications/system-service/wifiapi.h +++ b/applications/system-service/wifiapi.h @@ -30,628 +30,54 @@ class WifiAPI : public APIBase { Q_PROPERTY(bool scanning READ scanning NOTIFY scanningChanged) public: - static WifiAPI* singleton(WifiAPI* self = nullptr){ - static WifiAPI* instance; - if(self != nullptr){ - instance = self; - } - return instance; - } - WifiAPI(QObject* parent) - : APIBase(parent), - m_enabled(false), - wlans(), - networks(), - m_state(Unknown), - m_currentNetwork("/"), - m_link(0), - m_scanning(false) - { - Oxide::Sentry::sentry_transaction("wifi", "init", [this](Oxide::Sentry::Transaction* t){ - Oxide::Sentry::sentry_span(t, "singleton", "Setup singleton", [this]{ - singleton(this); - }); - Oxide::Sentry::sentry_span(t, "sysfs", "Finding wireless devices", [this](Oxide::Sentry::Span* s){ - QDir dir("/sys/class/net"); - qDebug() << "Looking for wireless devices..."; - for(auto path : dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Readable)){ - qDebug() << (" Checking " + path + "...").toStdString().c_str(); - Wlan* item = new Wlan(dir.path() + "/" + path, this); - if(!item->hasDirectory("wireless")){ - qDebug() << " Not a wireless device"; - continue; - } - qDebug() << " Wireless device found!"; - Oxide::Sentry::sentry_span(s, path.toStdString(), "Connect to wireless device", [this, item]{ - wlans.append(item); - connect(item, &Wlan::BSSAdded, this, &WifiAPI::BSSAdded, Qt::QueuedConnection); - connect(item, &Wlan::BSSRemoved, this, &WifiAPI::BSSRemoved, Qt::QueuedConnection); - connect(item, &Wlan::BlobAdded, this, &WifiAPI::BlobAdded, Qt::QueuedConnection); - connect(item, &Wlan::BlobRemoved, this, &WifiAPI::BlobRemoved, Qt::QueuedConnection); - connect(item, &Wlan::NetworkAdded, this, &WifiAPI::NetworkAdded, Qt::QueuedConnection); - connect(item, &Wlan::NetworkRemoved, this, &WifiAPI::NetworkRemoved, Qt::QueuedConnection); - connect(item, &Wlan::NetworkSelected, this, &WifiAPI::NetworkSelected, Qt::QueuedConnection); - connect(item, &Wlan::PropertiesChanged, this, &WifiAPI::InterfacePropertiesChanged, Qt::QueuedConnection); - connect(item, &Wlan::ScanDone, this, &WifiAPI::ScanDone, Qt::QueuedConnection); - }); - } - }); - Oxide::Sentry::sentry_span(t, "wpa_supplicant", "Connect to the wpa_supplicant", [this](Oxide::Sentry::Span* s){ - Oxide::Sentry::Span* span = Oxide::Sentry::start_span(s, "connect", "Connect to DBus interface"); - QDBusConnection bus = QDBusConnection::systemBus(); - if(!bus.isConnected()){ - O_WARNING("Failed to connect to system bus."); - throw QException(); - } - validateSupplicant(); - supplicant = new Wpa_Supplicant(WPA_SUPPLICANT_SERVICE, WPA_SUPPLICANT_SERVICE_PATH, bus); - connect(supplicant, &Wpa_Supplicant::InterfaceAdded, this, &WifiAPI::InterfaceAdded); - connect(supplicant, &Wpa_Supplicant::InterfaceRemoved, this, &WifiAPI::InterfaceRemoved); - connect(supplicant, &Wpa_Supplicant::PropertiesChanged, this, &WifiAPI::PropertiesChanged); - Oxide::Sentry::stop_span(span); - delete span; - Oxide::Sentry::sentry_span(s, "wlans", "Setting up wlan instances", [this, bus](Oxide::Sentry::Span* s){ - for(auto wlan : wlans){ - Oxide::Sentry::sentry_span(s, wlan->iface().toStdString(), "Load current networks and BSSs", [this, bus, wlan]{ - auto iface = wlan->iface(); - auto reply = (QDBusReply)supplicant->GetInterface(iface); - if(!reply.isValid() || reply.value().path() == "/"){ - QVariantMap args; - args.insert("Ifname", iface); - reply = supplicant->CreateInterface(args); - } - if(reply.isValid()){ - wlan->setInterface(reply.value().path()); - auto interface = wlan->interface(); - for(auto path : interface->networks()){ - bool found = false; - for(auto network : networks){ - if(network->path() == path.path()){ - found = true; - network->addNetwork(path.path(), interface); - break; - } - } - if(!found){ - INetwork inetwork(WPA_SUPPLICANT_SERVICE, path.path(), bus, interface); - auto properties = inetwork.properties(); - auto network = new Network(getPath("network", properties["ssid"].toString()), properties, this); - network->setEnabled(true); - network->addNetwork(path.path(), interface); - networks.append(network); - } - } - for(auto path : wlan->interface()->bSSs()){ - auto ibss = new IBSS(WPA_SUPPLICANT_SERVICE, path.path(), bus, wlan->interface()); - bool found = false; - auto bssid = ibss->bSSID(); - for(auto bss : bsss){ - if(bss->bssid() == bssid){ - found = true; - bss->addBSS(path.path()); - break; - } - } - if(!found){ - auto bss = new BSS(getPath("bss", bssid), ibss, this); - bsss.append(bss); - }else{ - ibss->deleteLater(); - } - } - } - }); - } - }); - }); - Oxide::Sentry::sentry_span(t, "load", "Load state", [this](Oxide::Sentry::Span* s){ - Oxide::Sentry::sentry_span(s, "timer", "Setup timer", [this]{ - timer = new QTimer(this); - timer->setSingleShot(false); - timer->setInterval(3 * 1000); // 3 seconds - timer->moveToThread(qApp->thread()); - connect(timer, &QTimer::timeout, this, QOverload<>::of(&WifiAPI::update)); - }); - Oxide::Sentry::sentry_span(s, "networks", "Load networks from disk", [this]{ - loadNetworks(); - }); - Oxide::Sentry::sentry_span(s, "state", "Syncronize state with settings", [this]{ - m_state = getCurrentState(); - if(xochitlSettings.wifion()){ - enable(); - }else{ - disable(); - } - }); - Oxide::Sentry::sentry_span(s, "update", "Update current state", [this]{ - update(); - }); - Oxide::Sentry::sentry_span(s, "setEnabled", "Enable/disable API objects", [this]{ - setEnabled(m_enabled); - }); - Oxide::Sentry::sentry_span(s, "timer", "Start timer", [this]{ - timer->start(); - }); - }); - }); - } - ~WifiAPI(){ - qDebug() << "Unregistering all networks"; - while(!networks.isEmpty()){ - networks.takeFirst()->deleteLater(); - } - qDebug() << "Unregistering all BSSs"; - while(!bsss.isEmpty()){ - bsss.takeFirst()->deleteLater(); - } - qDebug() << "Killing timer"; - timer->stop(); - timer->deleteLater(); - } - void setEnabled(bool enabled){ - qDebug() << "Wifi API" << enabled; - m_enabled = enabled; - if(enabled){ - for(auto network : networks){ - network->registerPath(); - } - for(auto bss : bsss){ - bss->registerPath(); - } - }else{ - for(auto network : networks){ - network->unregisterPath(); - } - for(auto bss : bsss){ - bss->unregisterPath(); - } - } - } - bool getEnabled(){ return m_enabled; } - QList getWlans(){ return wlans; } - QList getInterfaces(){ return interfaces(); } + static WifiAPI* singleton(WifiAPI* self = nullptr); + WifiAPI(QObject* parent); + ~WifiAPI(); + void setEnabled(bool enabled); + bool getEnabled(); + QList getWlans(); + QList getInterfaces(); enum State { Unknown, Off, Disconnected, Offline, Online}; Q_ENUM(State) - int state(){ - if(!hasPermission("wifi")){ - return Unknown; - } - return m_state; - } - void setState(int state){ - if(!hasPermission("wifi")){ - return; - } - if(state < Unknown || state > Online){ - throw QException{}; - } - m_state = state; - emit stateChanged(state); - } - - Q_INVOKABLE bool enable(){ - if(!hasPermission("wifi")){ - return false; - } - qDebug() << "Turning wifi on"; - if(m_state == Off){ - setState(Disconnected); - } - if(system("/usr/sbin/rfkill unblock wifi")){ - qDebug() << "Failed to enable wifi devices"; - return false; - } - for(auto wlan : wlans){ - if(!wlan->isUp() && !wlan->up()){ - qDebug() << "Failed to enable " + wlan->iface(); - continue; - } - } - xochitlSettings.set_wifion(true); - validateSupplicant(); - auto state = getCurrentState(); - m_state = state; - if(state != Online){ - qDebug() << "State:" << state; - reconnect(); - } - return true; - } - Q_INVOKABLE void disable(){ - if(!hasPermission("wifi")){ - return; - } - qDebug() << "Turning wifi off"; - setState(Off); - for(auto wlan : wlans){ - if(wlan->isUp() && !wlan->down()){ - qDebug() << "Failed to disable " + wlan->iface(); - } - } - if(system("/usr/sbin/rfkill block wifi")){ - qDebug() << "Failed to disable wifi devices"; - } - flushBSSCache(0); - xochitlSettings.set_wifion(false); - } - Q_INVOKABLE QDBusObjectPath addNetwork(QString ssid, QVariantMap properties){ - if(!hasPermission("wifi")){ - return QDBusObjectPath("/"); - } - Q_UNUSED(properties) - for(auto network : networks){ - if(network->ssid() == ssid){ - return QDBusObjectPath(network->path()); - } - } - auto network = new Network(getPath("network", ssid), ssid, properties, this); - network->registerNetwork(); - network->setEnabled(true); - if(m_enabled){ - network->registerPath(); - } - networks.append(network); - auto path = QDBusObjectPath(network->path()); - emit networkAdded(path); - return path; - } - Q_INVOKABLE QList getNetwork(QVariantMap properties){ - QList result; - if(!hasPermission("wifi")){ - return result; - } - for(auto network : networks){ - bool found = true; - auto props = network->properties(); - for(auto key : properties.keys()){ - auto value = properties[key]; - if( - (key == "ssid" && value.toString() != network->ssid()) - || (key == "protococl" && value.toString() != network->protocol()) - || (key != "ssid" && key != "protocol" && value != props[key]) - ){ - found = false; - break; - } - } - if(found){ - result.append(QDBusObjectPath(network->path())); - } - } - return result; - } - Q_INVOKABLE QList getBSS(QVariantMap properties){ - QList result; - if(!hasPermission("wifi")){ - return result; - } - for(auto bss : bsss){ - bool found = true; - for(auto key : properties.keys()){ - auto value = properties[key]; - if(properties[key] != bss->property(key.toStdString().c_str())){ - found = false; - break; - } - } - if(found){ - result.append(QDBusObjectPath(bss->path())); - } - } - return result; - } - Q_INVOKABLE void scan(bool active = false){ - if(!hasPermission("wifi")){ - return; - } - if(!m_scanning){ - m_scanning = true; - emit scanningChanged(true); - } - QMap args; - args["Type"] = active ? "active" : "passive"; - QList> replies; - for(auto interface : interfaces()){ - replies.append(interface->Scan(args)); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE void reconnect(){ - if(!hasPermission("wifi")){ - return; - } - qDebug() << "Reconnecting to wifi"; - QList> replies; - for(auto interface : interfaces()){ - replies.append(interface->Reconnect()); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE void reassosiate(){ - if(!hasPermission("wifi")){ - return; - } - QList> replies; - for(auto interface : interfaces()){ - replies.append(interface->Reassociate()); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE void disconnect(){ - if(!hasPermission("wifi")){ - return; - } - QList> replies; - for(auto interface : interfaces()){ - replies.append(interface->Disconnect()); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE void flushBSSCache(uint age){ - if(!hasPermission("wifi")){ - return; - } - QList> replies; - for(auto interface : interfaces()){ - replies.append(interface->FlushBSS(age)); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE void addBlob(QString name, QByteArray blob){ - if(!hasPermission("wifi")){ - return; - } - QList> replies; - for(auto interface : interfaces()){ - replies.append(interface->AddBlob(name, blob)); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE void removeBlob(QString name){ - if(!hasPermission("wifi")){ - return; - } - QList> replies; - for(auto interface : interfaces()){ - replies.append(interface->RemoveBlob(name)); - } - for(auto reply : replies){ - reply.waitForFinished(); - } - } - Q_INVOKABLE QByteArray getBlob(QString name, QByteArray blob){ - if(!hasPermission("wifi")){ - return QByteArray(); - } - for(auto interface : interfaces()){ - auto reply = (QDBusReply)interface->AddBlob(name, blob); - if(reply.isValid()){ - return reply; - } - } - return QByteArray(); - } - QStringList blobs(){ - QSet result; - if(!hasPermission("wifi")){ - return result.values(); - } - for(auto wlan : wlans){ - result.unite(wlan->blobs()); - } - return result.values(); - } - QList bSSs(){ - QList result; - if(!hasPermission("wifi")){ - return result; - } - for(auto bss : bsss){ - result.append(QDBusObjectPath(bss->path())); - } - return result; - } - int link(){ - if(!hasPermission("wifi")){ - return 0; - } - int result = 0; - for(auto wlan : wlans){ - int link = wlan->link(); - if(result < link){ - result = link; - } - } - return result; - } - int rssi(){ - if(!hasPermission("wifi")){ - return -100; - } - int result = -100; - for(auto wlan : wlans){ - if(!wlan->isUp()){ - continue; - } - int rssi = wlan->rssi(); - if(result < rssi){ - result = rssi; - } - } - return result; - } - QDBusObjectPath network(){ - if(!hasPermission("wifi")){ - return QDBusObjectPath("/"); - } - for(auto interface : getInterfaces()){ - auto state = interface->state(); - if(state == "associated" || state == "completed"){ - auto ipath = interface->currentNetwork().path(); - for(auto network : networks){ - if(network->paths().contains(ipath)){ - return QDBusObjectPath(network->path()); - } - } - } - } - return QDBusObjectPath("/"); - } - QList getNetworkPaths(){ - QList result; - for(auto network : networks){ - result.append(QDBusObjectPath(network->path())); - } - return result; - } - bool scanning(){ - if(!hasPermission("wifi")){ - return false; - } - for(auto interface : interfaces()){ - if(interface->scanning()){ - if(!m_scanning){ - m_scanning = true; - emit scanningChanged(true); - } - return true; - } - } - return false; - } + int state(); + void setState(int state); + + Q_INVOKABLE bool enable(); + Q_INVOKABLE void disable(); + Q_INVOKABLE QDBusObjectPath addNetwork(QString ssid, QVariantMap properties); + Q_INVOKABLE QList getNetwork(QVariantMap properties); + Q_INVOKABLE QList getBSS(QVariantMap properties); + Q_INVOKABLE void scan(bool active = false); + Q_INVOKABLE void reconnect(); + Q_INVOKABLE void reassosiate(); + Q_INVOKABLE void disconnect(); + Q_INVOKABLE void flushBSSCache(uint age); + Q_INVOKABLE void addBlob(QString name, QByteArray blob); + Q_INVOKABLE void removeBlob(QString name); + Q_INVOKABLE QByteArray getBlob(QString name, QByteArray blob); + QStringList blobs(); + QList bSSs(); + int link(); + int rssi(); + QDBusObjectPath network(); + QList getNetworkPaths(); + bool scanning(); // Interface signals - void BSSAdded(Wlan* wlan, const QDBusObjectPath& path, const QVariantMap& properties){ - Q_UNUSED(wlan); - auto sPath = path.path(); - auto bssid = properties["BSSID"].toString(); - if(bssid.isEmpty()){ - return; - } - auto ssid = properties["SSID"].toString(); - for(auto bss : bsss){ - for(auto nPath : bss->paths()){ - if(nPath == sPath){ - return; - } - } - if(bss->ssid() == ssid && bss->bssid() == bssid){ - bss->addBSS(sPath); - return; - } - } - qDebug() << "BSS added " << bssid.toUtf8().toHex() << ssid; - auto bss = new BSS(getPath("bss", bssid), bssid, ssid, this); - if(m_enabled){ - bss->registerPath(); - } - bsss.append(bss); - emit bssFound(QDBusObjectPath(bss->path())); - } - void BSSRemoved(Wlan* wlan, const QDBusObjectPath& path){ - Q_UNUSED(wlan); - auto sPath = path.path(); - QMutableListIterator i(bsss); - while(i.hasNext()){ - auto bss = i.next(); - bss->removeBSS(sPath); - if(!bss->paths().length()){ - i.remove(); - emit bss->removed(); - emit bssRemoved(QDBusObjectPath(bss->path())); - bss->deleteLater(); - } - } - } - void BlobAdded(Wlan* wlan, const QString& name){ - Q_UNUSED(wlan); - Q_UNUSED(name); - } - void BlobRemoved(Wlan* wlan, const QString& name){ - Q_UNUSED(wlan); - Q_UNUSED(name); - } - void NetworkAdded(Wlan* wlan, const QDBusObjectPath& path, const QVariantMap& properties){ - auto sPath = path.path(); - auto ssid = properties["ssid"].toString(); - if(ssid.isEmpty()){ - return; - } - ssid = ssid.mid(1, ssid.length() - 2); - for(auto network : networks){ - for(auto nPath : network->paths()){ - if(nPath == sPath){ - return; - } - } - if(network->ssid() == ssid){ - network->addNetwork(sPath, wlan->interface()); - return; - } - } - qDebug() << "Network added " << ssid; - auto network = new Network(getPath("network", ssid), properties, this); - network->addNetwork(path.path(), wlan->interface()); - if(m_enabled){ - network->registerPath(); - } - networks.append(network); - emit networkAdded(path); - } - void NetworkRemoved(Wlan* wlan, const QDBusObjectPath& path){ - Q_UNUSED(wlan); - auto sPath = path.path(); - QMutableListIterator i(networks); - while(i.hasNext()){ - auto network = i.next(); - network->removeNetwork(sPath); - if(!network->paths().length()){ - i.remove(); - emit network->removed(); - emit networkRemoved(QDBusObjectPath(network->path())); - qDebug() << "Network removed " << network->ssid(); - network->deleteLater(); - } - } - } - void NetworkSelected(Wlan* wlan, const QDBusObjectPath& path){ - Q_UNUSED(wlan); - for(auto network : networks){ - if(network->paths().contains(path.path())){ - qDebug() << "Network selected" << path.path(); - break; - } - } - } - void InterfacePropertiesChanged(Wlan* wlan, const QVariantMap& properties){ - Q_UNUSED(wlan); - Q_UNUSED(properties); - } - void ScanDone(Wlan* wlan, bool success){ - Q_UNUSED(wlan) - Q_UNUSED(success) - m_scanning = false; - emit scanningChanged(false); - } + void BSSAdded(Wlan* wlan, const QDBusObjectPath& path, const QVariantMap& properties); + void BSSRemoved(Wlan* wlan, const QDBusObjectPath& path); + void BlobAdded(Wlan* wlan, const QString& name); + void BlobRemoved(Wlan* wlan, const QString& name); + void NetworkAdded(Wlan* wlan, const QDBusObjectPath& path, const QVariantMap& properties); + void NetworkRemoved(Wlan* wlan, const QDBusObjectPath& path); + void NetworkSelected(Wlan* wlan, const QDBusObjectPath& path); + void InterfacePropertiesChanged(Wlan* wlan, const QVariantMap& properties); + void ScanDone(Wlan* wlan, bool success); // BSS signals - void BSSPropertiesChanged(const QVariantMap& properties){ - Q_UNUSED(properties); - } - void stopUpdating(){ timer->stop(); } - void resumeUpdating(){ timer->start(); } + void BSSPropertiesChanged(const QVariantMap& properties); + void stopUpdating(); + void resumeUpdating(); signals: void stateChanged(int); @@ -667,33 +93,9 @@ class WifiAPI : public APIBase { private slots: // wpa_supplicant signals - void InterfaceAdded(const QDBusObjectPath &path, const QVariantMap &properties){ - for(auto wlan : wlans){ - if(properties["Ifname"].toString() == wlan->iface()){ - wlan->setInterface(path.path()); - break; - } - } - } - void InterfaceRemoved(const QDBusObjectPath &path){ - for(auto wlan : wlans){ - if(wlan->interface() != nullptr && wlan->interface()->path() == path.path()){ - auto interface = wlan->interface(); - for(auto network : networks){ - network->removeInterface(interface); - if(network->paths().empty()){ - emit network->removed(); - emit networkRemoved(QDBusObjectPath(network->path())); - qDebug() << "Network removed " << network->ssid(); - } - } - wlan->removeInterface(); - } - } - } - void PropertiesChanged(const QVariantMap &properties){ - Q_UNUSED(properties); - } + void InterfaceAdded(const QDBusObjectPath &path, const QVariantMap &properties); + void InterfaceRemoved(const QDBusObjectPath &path); + void PropertiesChanged(const QVariantMap &properties); private: bool m_enabled; @@ -708,145 +110,15 @@ private slots: bool m_scanning; Wpa_Supplicant* supplicant; - QList interfaces(){ - QList result; - for(auto wlan : wlans){ - if(wlan->interface() != nullptr){ - result.append(wlan->interface()); - } - } - return result; - } + QList interfaces(); - void validateSupplicant(){ - QDBusConnection bus = QDBusConnection::systemBus(); - QStringList serviceNames = bus.interface()->registeredServiceNames(); - if (!serviceNames.contains(WPA_SUPPLICANT_SERVICE)){ - if(system("/bin/systemctl --quiet is-active wpa_supplicant")){ - qDebug() << "Starting wpa_supplicant..."; - if(system("/bin/systemctl --quiet start wpa_supplicant")){ - qCritical() << "Failed to start wpa_supplicant"; - throw QException(); - } - } - qDebug() << "Waiting for wpa_supplicant dbus service..."; - while(!serviceNames.contains(WPA_SUPPLICANT_SERVICE)){ - struct timespec args{ - .tv_sec = 1, - .tv_nsec = 0, - }, res; - nanosleep(&args, &res); - serviceNames = bus.interface()->registeredServiceNames(); - } - } - } + void validateSupplicant(); - void loadNetworks(){ - qDebug() << "Loading networks from settings..."; - QList> registeredNetworks = xochitlSettings.wifinetworks().values(); - qDebug() << "Registering networks..."; - for(auto registration : registeredNetworks){ - bool found = false; - auto ssid = registration["ssid"].toString(); - auto protocol = registration["protocol"].toString(); - for(auto network : networks){ - if(network->ssid() == ssid && network->protocol() == protocol){ - qDebug() << " Found network" << network->ssid(); - found = true; - if(network->password() != registration["password"].toString()){ - network->setPassword(registration["password"].toString()); - } - if(!network->enabled()){ - network->setEnabled(true); - } - break; - } - } - if(!found){ - QVariantMap args; - auto network = new Network(getPath("network", ssid), ssid, QVariantMap(), this); - network->setProtocol(protocol); - if(registration.contains("password")){ - network->setPassword(registration["password"].toString()); - } - network->registerNetwork(); - network->setEnabled(true); - if(m_enabled){ - network->registerPath(); - } - networks.append(network); - emit networkAdded(QDBusObjectPath(network->path())); - qDebug() << " Registered network" << ssid; - } - } - qDebug() << "Loaded networks."; - } + void loadNetworks(); - void update(){ - auto state = getCurrentState(); - bool enabled = xochitlSettings.wifion(); - if(enabled && state == Off){ - enable(); - state = getCurrentState(); - }else if(!enabled && state != Off){ - disable(); - state = getCurrentState(); - } - auto path = network().path(); - if((state == Online || state == Offline) && m_currentNetwork.path() != path){ - qDebug() << "Connected to" << path; - m_currentNetwork.setPath(path); - emit networkConnected(m_currentNetwork); - }else if((state == Disconnected || state == Off) && m_currentNetwork.path() != "/"){ - qDebug() << "Disconnected from" << m_currentNetwork.path(); - m_currentNetwork.setPath("/"); - emit disconnected(); - } - if(m_state != state){ - setState(state); - } - auto clink = link(); - if(m_link != clink){ - m_link = clink; - emit linkChanged(clink); - } - auto crssi = rssi(); - if(m_rssi != crssi){ - m_rssi = crssi; - emit rssiChanged(crssi); - } - } - State getCurrentState(){ - State state = Off; - for(auto wlan : wlans){ - if(!wlan->isUp()){ - continue; - } - if(state == Off){ - state = Disconnected; - } - if(wlan->operstate() == "up"){ - state = Offline; - } - if(wlan->isConnected()){ - state = Online; - break; - } - } - return state; - } - QString getPath(QString type, QString id){ - static const QUuid NS = QUuid::fromString(QLatin1String("{78c28d66-f558-11ea-adc1-0242ac120002}")); - if(type == "network"){ - id= QUuid::createUuidV5(NS, id).toString(QUuid::Id128); - }else if(type == "bss"){ - id = id.toUtf8().toHex(); - } - if(id.isEmpty()){ - id = QUuid::createUuid().toString(QUuid::Id128); - } - return QString(OXIDE_SERVICE_PATH "/") + type + "/" + id; - } + void update(); + State getCurrentState(); + QString getPath(QString type, QString id); }; #endif // WIFIAPI_H diff --git a/applications/system-service/wlan.cpp b/applications/system-service/wlan.cpp index 0703cec26..db255077f 100644 --- a/applications/system-service/wlan.cpp +++ b/applications/system-service/wlan.cpp @@ -2,6 +2,11 @@ #include "bss.h" #include "wifiapi.h" +Wlan::Wlan(QString path, QObject* parent) : QObject(parent), SysObject(path), m_blobs(), m_iface(){ + m_iface = QFileInfo(path).fileName(); + m_interface = nullptr; +} + void Wlan::setInterface(QString path){ if(m_interface != nullptr && m_interface->path() == path){ return; @@ -22,6 +27,102 @@ void Wlan::setInterface(QString path){ connect(m_interface, &Interface::ScanDone, this, &Wlan::onScanDone, Qt::QueuedConnection); } +void Wlan::removeInterface(){ + if(m_interface != nullptr){ + m_interface->deleteLater(); + m_interface = nullptr; + } +} + +QString Wlan::iface() { return m_iface; } + +bool Wlan::up() { return !system(("/sbin/ifconfig " + iface() + " up").toStdString().c_str()); } + +bool Wlan::down() { return !system(("/sbin/ifconfig " + iface() + " down").toStdString().c_str()); } + +bool Wlan::isUp(){ return !system(("/sbin/ip addr show " + iface() + " | /bin/grep UP > /dev/null").toStdString().c_str()); } + +Interface* Wlan::interface() { return m_interface; } + +QSet Wlan::blobs(){ return m_blobs; } + +QString Wlan::operstate(){ + if(hasProperty("operstate")){ + return QString(strProperty("operstate").c_str()); + } + return ""; +} + +bool Wlan::pingIP(std::string ip, const char* port) { + auto process = new QProcess(); + process->setProgram("/bin/bash"); + std::string cmd("{ echo -n > /dev/tcp/" + ip.substr(0, ip.length() - 1) + "/" + port + "; } > /dev/null 2>&1"); + process->setArguments(QStringList() << "-c" << cmd.c_str()); + process->start(); + if(!process->waitForFinished(100)){ + process->kill(); + return false; + } + return !process->exitCode(); +} + +bool Wlan::isConnected(){ + auto ip = exec("/sbin/ip r | /bin/grep " + iface() + " | /bin/grep default | /usr/bin/awk '{print $3}'"); + return ip != "" && (pingIP(ip, "53") || pingIP(ip, "80")); +} + +int Wlan::link(){ + QDBusPendingReply res = m_interface->SignalPoll(); + res.waitForFinished(); + if(!res.isError()){ + auto props = qdbus_cast(res.value()); + auto result = props["linkspeed"].toInt(); + if(result < 0){ + return 0; + } + return result; + } + O_WARNING("SignalPoll error: " << res.error()); + auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $3}'"); + if(QString(out.c_str()).isEmpty()){ + return 0; + } + try { + return std::stoi(out); + } + catch (const std::invalid_argument& e) { + qDebug() << "link failed: " << out.c_str(); + return 0; + } + return -100; +} + +signed int Wlan::rssi(){ + QDBusPendingReply res = m_interface->SignalPoll(); + res.waitForFinished(); + if(!res.isError()){ + auto props = qdbus_cast(res.value()); + auto result = props["rssi"].toInt(); + if(result >= 0){ + return -100; + } + return result; + } + O_WARNING("SignalPoll error: " << res.error()); + auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $4}'"); + if(QString(out.c_str()).isEmpty()){ + return 0; + } + try { + return std::stoi(out); + } + catch (const std::invalid_argument& e) { + qDebug() << "signal failed: " << out.c_str(); + return 0; + } + return -100; +} + void Wlan::onBSSAdded(const QDBusObjectPath& path, const QVariantMap& properties){ emit BSSAdded(this, path, properties); } diff --git a/applications/system-service/wlan.h b/applications/system-service/wlan.h index bfe38874f..45c358d1f 100644 --- a/applications/system-service/wlan.h +++ b/applications/system-service/wlan.h @@ -16,95 +16,20 @@ class Wlan : public QObject, public SysObject { Q_OBJECT public: - Wlan(QString path, QObject* parent) : QObject(parent), SysObject(path), m_blobs(), m_iface(){ - m_iface = QFileInfo(path).fileName(); - m_interface = nullptr; - } + Wlan(QString path, QObject* parent); void setInterface(QString path); - void removeInterface(){ - if(m_interface != nullptr){ - m_interface->deleteLater(); - m_interface = nullptr; - } - } - QString iface() { return m_iface; } - bool up() { return !system(("/sbin/ifconfig " + iface() + " up").toStdString().c_str()); } - bool down() { return !system(("/sbin/ifconfig " + iface() + " down").toStdString().c_str()); } - bool isUp(){ return !system(("/sbin/ip addr show " + iface() + " | /bin/grep UP > /dev/null").toStdString().c_str()); } - Interface* interface() { return m_interface; } - QSet blobs(){ return m_blobs; } - QString operstate(){ - if(hasProperty("operstate")){ - return QString(strProperty("operstate").c_str()); - } - return ""; - } - bool pingIP(std::string ip, const char* port) { - auto process = new QProcess(); - process->setProgram("/bin/bash"); - std::string cmd("{ echo -n > /dev/tcp/" + ip.substr(0, ip.length() - 1) + "/" + port + "; } > /dev/null 2>&1"); - process->setArguments(QStringList() << "-c" << cmd.c_str()); - process->start(); - if(!process->waitForFinished(100)){ - process->kill(); - return false; - } - return !process->exitCode(); - } - bool isConnected(){ - auto ip = exec("/sbin/ip r | /bin/grep " + iface() + " | /bin/grep default | /usr/bin/awk '{print $3}'"); - return ip != "" && (pingIP(ip, "53") || pingIP(ip, "80")); - } - int link(){ - QDBusPendingReply res = m_interface->SignalPoll(); - res.waitForFinished(); - if(!res.isError()){ - auto props = qdbus_cast(res.value()); - auto result = props["linkspeed"].toInt(); - if(result < 0){ - return 0; - } - return result; - } - O_WARNING("SignalPoll error: " << res.error()); - auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $3}'"); - if(QString(out.c_str()).isEmpty()){ - return 0; - } - try { - return std::stoi(out); - } - catch (const std::invalid_argument& e) { - qDebug() << "link failed: " << out.c_str(); - return 0; - } - return -100; - } - signed int rssi(){ - QDBusPendingReply res = m_interface->SignalPoll(); - res.waitForFinished(); - if(!res.isError()){ - auto props = qdbus_cast(res.value()); - auto result = props["rssi"].toInt(); - if(result >= 0){ - return -100; - } - return result; - } - O_WARNING("SignalPoll error: " << res.error()); - auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $4}'"); - if(QString(out.c_str()).isEmpty()){ - return 0; - } - try { - return std::stoi(out); - } - catch (const std::invalid_argument& e) { - qDebug() << "signal failed: " << out.c_str(); - return 0; - } - return -100; - } + void removeInterface(); + QString iface(); + bool up(); + bool down(); + bool isUp(); + Interface* interface(); + QSet blobs(); + QString operstate(); + bool pingIP(std::string ip, const char* port); + bool isConnected(); + int link(); + signed int rssi(); signals: void BSSAdded(Wlan*, QDBusObjectPath, QVariantMap); void BSSRemoved(Wlan*, QDBusObjectPath); diff --git a/applications/task-switcher/task-switcher.pro b/applications/task-switcher/task-switcher.pro index 8abc482a7..c24978da2 100644 --- a/applications/task-switcher/task-switcher.pro +++ b/applications/task-switcher/task-switcher.pro @@ -36,4 +36,3 @@ PRECOMPILED_HEADER = \ corrupt_stable.h include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/update-desktop-database/update-desktop-database.pro b/applications/update-desktop-database/update-desktop-database.pro index 9ea92d5b4..163e292b8 100644 --- a/applications/update-desktop-database/update-desktop-database.pro +++ b/applications/update-desktop-database/update-desktop-database.pro @@ -22,4 +22,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/xdg-desktop-icon/xdg-desktop-icon.pro b/applications/xdg-desktop-icon/xdg-desktop-icon.pro index c3ef13f85..09effaa6c 100644 --- a/applications/xdg-desktop-icon/xdg-desktop-icon.pro +++ b/applications/xdg-desktop-icon/xdg-desktop-icon.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/xdg-desktop-menu/xdg-desktop-menu.pro b/applications/xdg-desktop-menu/xdg-desktop-menu.pro index 34aecfd97..ad99b239e 100644 --- a/applications/xdg-desktop-menu/xdg-desktop-menu.pro +++ b/applications/xdg-desktop-menu/xdg-desktop-menu.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/xdg-icon-resource/xdg-icon-resource.pro b/applications/xdg-icon-resource/xdg-icon-resource.pro index b8eb63f8e..b4b5f99a0 100644 --- a/applications/xdg-icon-resource/xdg-icon-resource.pro +++ b/applications/xdg-icon-resource/xdg-icon-resource.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/xdg-open/xdg-open.pro b/applications/xdg-open/xdg-open.pro index fdcccb524..46d0b019e 100644 --- a/applications/xdg-open/xdg-open.pro +++ b/applications/xdg-open/xdg-open.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/applications/xdg-settings/xdg-settings.pro b/applications/xdg-settings/xdg-settings.pro index 9d0f2c1bc..7edf2ee7e 100644 --- a/applications/xdg-settings/xdg-settings.pro +++ b/applications/xdg-settings/xdg-settings.pro @@ -18,4 +18,3 @@ target.path = /opt/bin INSTALLS += target include(../../qmake/liboxide.pri) -include(../../qmake/sentry.pri) diff --git a/oxide.pro b/oxide.pro index d471787cb..9be8369af 100644 --- a/oxide.pro +++ b/oxide.pro @@ -2,8 +2,10 @@ TEMPLATE = subdirs SUBDIRS = \ shared \ - applications + applications \ + tests applications.depends = shared +tests.depends = shared INSTALLS += $$SUBDIRS diff --git a/package b/package index 08eb20054..6359a0b3a 100644 --- a/package +++ b/package @@ -5,7 +5,7 @@ pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide liboxide-dev libsentry) _oxidever=$(grep 'VERSION =' qmake/common.pri | awk '{print $3}') pkgver="$_oxidever~VERSION~" -_sentryver=0.5.0 +_sentryver=0.7.0 timestamp="$(date -u +%Y-%m-%dT%H:%MZ)" maintainer="Eeems " url=https://oxide.eeems.codes @@ -14,43 +14,6 @@ flags=(patch_rm2fb) image=qt:latest source=(oxide.tar.gz) sha256sums=(SKIP) -######################################## -# These functions come from install-lib: -# https://raw.githubusercontent.com/toltec-dev/toltec/master/scripts/install-lib -######################################## -is-active() { - systemctl --quiet is-active "$1" 2> /dev/null -} -is-enabled() { - systemctl --quiet is-enabled "$1" 2> /dev/null -} -get-conflicts() { - # Find enabled units that have a conflicting name - for name in $(systemctl cat "$1" | awk -F'=' '/^Alias=/{print $2}'); do - local realname - if realname="$(basename "$(readlink "/etc/systemd/system/$name")")"; then - echo "$realname" - fi - done - - # Find units that are declared as conflicting - # (systemd automatically adds a conflict with "shutdown.target" to all - # service units see systemd.service(5), section "Automatic Dependencies") - systemctl show "$1" | awk -F'=' '/^Conflicts=/{print $2}' \ - | sed 's|\bshutdown.target\b||' -} -how-to-enable() { - for conflict in $(get-conflicts "$1"); do - if is-enabled "$conflict"; then - echo "$ systemctl disable --now ${conflict/.service/}" - fi - done - - echo "$ systemctl enable --now ${1/.service/}" -} -######################################## -# End of install-lib methods -######################################## build() { find . -name "*.pro" -type f -print0 \ @@ -177,7 +140,8 @@ liboxide() { section="devel" package() { - install -D -m 755 -t "$pkgdir"/opt/lib "$srcdir"/release/opt/lib/libliboxide.so* + install -D -m 755 -t "$pkgdir"/opt/lib "$srcdir"/release/opt/lib/liboxide.so* + install -D -m 755 -t "$pkgdir"/opt/lib "$srcdir"/release/opt/lib/libqsgepaper.so* } } @@ -187,7 +151,7 @@ liboxide-dev() { installdepends=("liboxide=$pkgver") package() { - install -D -m 755 -t "$pkgdir"/opt/lib/pkgconfig "$srcdir"/release/opt/lib/pkgconfig/liboxide.pc + install -D -m 755 -t "$pkgdir"/opt/lib/pkgconfig "$srcdir"/release/opt/lib/pkgconfig/oxide.pc install -D -m 755 -t "$pkgdir"/opt/include "$srcdir"/release/opt/include/epframebuffer.h install -D -m 755 -t "$pkgdir"/opt/include "$srcdir"/release/opt/include/liboxide.h cp -ar "$srcdir"/release/opt/include/liboxide/ "$pkgdir"/opt/include/ diff --git a/qmake/common.pri b/qmake/common.pri index 5be0c3c2d..31b0a9b95 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -1,3 +1,32 @@ -QMAKE_RPATHDIR += /lib /usr/lib /opt/lib /opt/usr/lib VERSION = 2.8 + +DEFINES += QT_DEPRECATED_WARNINGS +!contains(DEFINES, QT_DISABLE_DEPRECATED_BEFORE){ + DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x051510 +} +CONFIG(debug, debug|release){ + LIBS += -lunwind + contains(DEFINES, SANITIZER){ + QMAKE_LFLAGS += -fno-omit-frame-pointer + QMAKE_LFLAGS += -fsanitize-recover=address + + QMAKE_LFLAGS += -fsanitize=address + QMAKE_LFLAGS += -fsanitize=leak + # QMAKE_LFLAGS += -fsanitize=thread # Incompatible with address and leak + QMAKE_LFLAGS += -fsanitize=undefined + QMAKE_LFLAGS += -fsanitize=pointer-compare + QMAKE_LFLAGS += -fsanitize=pointer-subtract + } +} + +QMAKE_RPATHDIR += /lib /usr/lib /opt/lib /opt/usr/lib DEFINES += APP_VERSION=\\\"$$VERSION\\\" + +CONFIG += ltcg +CONFIG += c++17 +CONFIG += c++20 +CONFIG += c++latest + +QMAKE_LFLAGS += -flto +QMAKE_CFLAGS += -fPIC +QMAKE_CXXFLAGS += -fPIC diff --git a/qmake/epaper.pri b/qmake/epaper.pri index bde708a3d..e115822eb 100644 --- a/qmake/epaper.pri +++ b/qmake/epaper.pri @@ -1,2 +1,2 @@ -#LIBS += -L$$PWD/../shared/epaper -lqsgepaper -#INCLUDEPATH += $$PWD/../shared/epaper +LIBS += -L$$OUT_PWD/../../shared/epaper -lqsgepaper +INCLUDEPATH += $$OUT_PWD/../../shared/epaper diff --git a/qmake/liboxide.pri b/qmake/liboxide.pri index 84637c608..d0e4797ad 100644 --- a/qmake/liboxide.pri +++ b/qmake/liboxide.pri @@ -1,3 +1,12 @@ -LIBS += -L$$OUT_PWD/../../shared/liboxide -lliboxide +contains(DEFINES, LIBOXIDE_PRIVATE){ + LIBS_PRIVATE += -L$$OUT_PWD/../../shared/liboxide -loxide +}else{ + LIBS += -L$$OUT_PWD/../../shared/liboxide -loxide +} INCLUDEPATH += $$OUT_PWD/../../shared/liboxide/include +QT += network +QT += dbus + QML_IMPORT_PATH += qrc:/codes.eeems.oxide +include(sentry.pri) +include(epaper.pri) diff --git a/qmake/sentry.pri b/qmake/sentry.pri index e107a4de0..20dd8cf17 100644 --- a/qmake/sentry.pri +++ b/qmake/sentry.pri @@ -1,15 +1,7 @@ contains(DEFINES, SENTRY){ - LIBSENTRY_ROOT = $$PWD/../.build/sentry + LIBSENTRY_ROOT = $$OUT_PWD/../../shared/sentry LIBSENTRY_LIB = $$LIBSENTRY_ROOT/lib - LIBSENTRY_SO = $$LIBSENTRY_LIB/libsentry.so - !exists($$LIBSENTRY_SO){ - error(Missing $$LIBSENTRY_SO) - } LIBSENTRY_INC = $$LIBSENTRY_ROOT/include - LIBSENTRY_H = $$LIBSENTRY_INC/sentry.h - !exists($$LIBSENTRY_H){ - error(Missing $$LIBSENTRY_H) - } LIBS_PRIVATE += -L$$LIBSENTRY_LIB -lsentry -ldl -lcurl -lbreakpad_client INCLUDEPATH += $$LIBSENTRY_INC DEPENDPATH += $$LIBSENTRY_LIB diff --git a/shared/epaper/epaper.pro b/shared/epaper/epaper.pro new file mode 100644 index 000000000..b6f9ab7b1 --- /dev/null +++ b/shared/epaper/epaper.pro @@ -0,0 +1,26 @@ +TEMPLATE = lib +QT += core + +include(../../qmake/common.pri) + +VERSION = 1.0 + +TARGET = qsgepaper +target.path = /opt/lib +INSTALLS += target + +libqsgepaper.target = libqsgepaper.a.in +libqsgepaper.commands = cp $$PWD/libqsgepaper.a $$OUT_PWD/$$libqsgepaper.target + +QMAKE_EXTRA_TARGETS += libqsgepaper +PRE_TARGETDEPS += $$libqsgepaper.target +QMAKE_CLEAN += $$libqsgepaper.target + +LIBS += -Wl,--whole-archive $$libqsgepaper.target -Wl,--no-whole-archive + +epframebuffer_h.target = epframebuffer.h +epframebuffer_h.commands = cp $$PWD/epframebuffer.h $$OUT_PWD + +QMAKE_EXTRA_TARGETS += epframebuffer_h +PRE_TARGETDEPS += $$epframebuffer_h.target +QMAKE_CLEAN += $$epframebuffer_h.target diff --git a/shared/epaper/libepaper.so b/shared/epaper/libepaper.so deleted file mode 100644 index cde99953d08e73d0fd63ea8a511b09b672a71e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199988 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

~VQ{TM%imAJ9nf;ZZ-7ikv^|>7* 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

=q#zSUPaS>zHHtGg!Uk{d&-i1mR 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 diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index 3bf9ae3db..ae0ac1e1a 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -18,7 +18,14 @@ #include "slothandler.h" #include "sysobject.h" #include "debug.h" +#if defined(LIBOXIDE_LIBRARY) #include "oxide_sentry.h" +#else +#include "sentry.h" +#ifdef __arm__ +Q_IMPORT_PLUGIN(QsgEpaperPlugin) +#endif +#endif #include #include diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index 8668e9e06..0eb1f587c 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -36,7 +36,6 @@ SOURCES += \ signalhandler.cpp HEADERS += \ - ../epaper/epframebuffer.h \ applications.h \ dbus.h \ debug.h \ @@ -77,8 +76,8 @@ liboxide_liboxide_h.target = include/liboxide/liboxide.h liboxide_liboxide_h.commands = \ mkdir -p include/liboxide && \ echo $$HEADERS | xargs -rn1 | xargs -rI {} cp $$PWD/{} include/liboxide/ && \ - echo $$DBUS_INTERFACES | xargs -rn1 | xargs -rI {} basename \"{}\" .xml | xargs -rI {} cp $$OUT_PWD/\"{}\"_interface.h include/liboxide/ && \ - mv $$OUT_PWD/include/liboxide/epframebuffer.h $$OUT_PWD/include/ + mv include/liboxide/oxide_sentry.h include/liboxide/sentry.h && \ + echo $$DBUS_INTERFACES | xargs -rn1 | xargs -rI {} basename \"{}\" .xml | xargs -rI {} cp $$OUT_PWD/\"{}\"_interface.h include/liboxide/ liboxide_h.target = include/liboxide.h liboxide_h.depends += liboxide_liboxide_h @@ -91,23 +90,28 @@ clean_headers.commands = rm -rf include liboxide_h_install.files = \ include/liboxide.h \ - include/liboxide \ - include/epframebuffer.h + include/liboxide liboxide_h_install.depends = liboxide_h liboxide_h_install.path = /opt/include/ INSTALLS += liboxide_h_install +epframebuffer_h_install.files = ../epaper/epframebuffer.h +epframebuffer_h_install.path = /opt/include +INSTALLS += epframebuffer_h_install + QMAKE_EXTRA_TARGETS += liboxide_liboxide_h liboxide_h clean_headers liboxide_h_install PRE_TARGETDEPS += $$clean_headers.target POST_TARGETDEPS += $$liboxide_liboxide_h.target $$liboxide_h.target QMAKE_CLEAN += $$liboxide_h.target include/liboxide/*.h include(../../qmake/common.pri) +TARGET = oxide target.path = /opt/lib INSTALLS += target -LIBS += -L$$PWD/../epaper -lqsgepaper -INCLUDEPATH += $$PWD/../epaper +INCLUDEPATH += ../../shared/mxcfb + +include(../../qmake/epaper.pri) include(../../qmake/sentry.pri) QMAKE_PKGCONFIG_NAME = liboxide diff --git a/shared/liboxide/liboxide_global.h b/shared/liboxide/liboxide_global.h index 719e84775..6901768c3 100644 --- a/shared/liboxide/liboxide_global.h +++ b/shared/liboxide/liboxide_global.h @@ -18,4 +18,9 @@ # define DEBUG # define LIBOXIDE_EXPORT #endif +#if defined(__clang__) || defined (__GNUC__) +# define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) +#else +# define ATTRIBUTE_NO_SANITIZE_ADDRESS +#endif /*! @} */ diff --git a/shared/liboxide/slothandler.cpp b/shared/liboxide/slothandler.cpp index cc47280fc..ccae2b614 100644 --- a/shared/liboxide/slothandler.cpp +++ b/shared/liboxide/slothandler.cpp @@ -43,15 +43,23 @@ namespace Oxide{ onMessage(onMessage), callback(callback) { - watcher = new QDBusServiceWatcher(serviceName, QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForUnregistration, this); - QObject::connect(watcher, &QDBusServiceWatcher::serviceUnregistered, this, [=](const QString& name){ - Q_UNUSED(name); - if(!m_disconnected){ - O_DEBUG(QDBusError(QDBusError::ServiceUnknown, "The name " + serviceName + " is no longer registered")); - m_disconnected = true; - callback(); - } - }); + watcher = new QDBusServiceWatcher(serviceName, QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForUnregistration, this); + QObject::connect( + watcher, + &QDBusServiceWatcher::serviceUnregistered, + this, + [this, callback, serviceName](const QString& name){ + Q_UNUSED(name); + if(!m_disconnected){ + O_DEBUG(QDBusError( + QDBusError::ServiceUnknown, + "The name " + serviceName + " is no longer registered" + )); + m_disconnected = true; + callback(); + } + } + ); } SlotHandler::~SlotHandler() {} int SlotHandler::qt_metacall(QMetaObject::Call call, int id, void **arguments){ diff --git a/applications/system-service/mxcfb.h b/shared/mxcfb/mxcfb.h similarity index 100% rename from applications/system-service/mxcfb.h rename to shared/mxcfb/mxcfb.h diff --git a/shared/sentry/CMakeLists.txt b/shared/sentry/CMakeLists.txt deleted file mode 100644 index 21adb7b1c..000000000 --- a/shared/sentry/CMakeLists.txt +++ /dev/null @@ -1,603 +0,0 @@ -if(WIN32) - cmake_minimum_required (VERSION 3.16.4) - - # enables support for CMAKE_MSVC_RUNTIME_LIBRARY - cmake_policy(SET CMP0091 NEW) -else() - # The Android tools ship with this ancient version, which we need to support. - cmake_minimum_required (VERSION 3.10) -endif() - -#read sentry-native version -file(READ "include/sentry.h" _SENTRY_HEADER_CONTENT) -string(REGEX MATCH "#define SENTRY_SDK_VERSION \"([0-9\.]+)\"" _SENTRY_VERSION_MATCH "${_SENTRY_HEADER_CONTENT}") -set(SENTRY_VERSION "${CMAKE_MATCH_1}") -unset(_SENTRY_HEADER_CONTENT) -unset(_SENTRY_VERSION_MATCH) - -project(Sentry-Native - LANGUAGES C CXX ASM - VERSION ${SENTRY_VERSION} -) - -set(SENTRY_MAIN_PROJECT OFF) -if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - set(SENTRY_MAIN_PROJECT ON) -endif() - -if(NOT CMAKE_C_STANDARD) - set(CMAKE_C_STANDARD 11) -endif() - -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - -include(GNUInstallDirs) -set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/sentry") - -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(LINUX TRUE) -elseif(CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") - set(AIX TRUE) -endif() - -#setup sentry library type -if(SENTRY_MAIN_PROJECT AND NOT DEFINED BUILD_SHARED_LIBS) - set(BUILD_SHARED_LIBS ON) -endif() -option(SENTRY_BUILD_SHARED_LIBS "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)" ${BUILD_SHARED_LIBS}) -if(SENTRY_BUILD_SHARED_LIBS) - set(SENTRY_LIBRARY_TYPE SHARED) -else() - set(SENTRY_LIBRARY_TYPE STATIC) -endif() - -option(SENTRY_PIC "Build sentry (and dependent) libraries as position independent libraries" ON) - -option(SENTRY_BUILD_TESTS "Build sentry-native tests" "${SENTRY_MAIN_PROJECT}") -option(SENTRY_BUILD_EXAMPLES "Build sentry-native example(s)" "${SENTRY_MAIN_PROJECT}") - -option(SENTRY_LINK_PTHREAD "Link platform threads library" ON) -if(SENTRY_LINK_PTHREAD) - find_package(Threads REQUIRED) -endif() - -if(MSVC) - option(SENTRY_BUILD_RUNTIMESTATIC "Build sentry-native with static runtime" OFF) -endif() - -if(LINUX) - option(SENTRY_BUILD_FORCE32 "Force a 32bit compile on a 64bit host" OFF) - if(SENTRY_BUILD_FORCE32) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -m32 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE") - set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) - endif() -endif() - -# CMAKE_POSITION_INDEPENDENT_CODE must be set BEFORE adding any libraries (including subprojects) -if(SENTRY_PIC) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) -else() - set(CMAKE_POSITION_INDEPENDENT_CODE OFF) -endif() - -if(WIN32) - set(SENTRY_DEFAULT_TRANSPORT "winhttp") -elseif((APPLE AND NOT IOS) OR LINUX OR AIX) - set(SENTRY_DEFAULT_TRANSPORT "curl") -else() - set(SENTRY_DEFAULT_TRANSPORT "none") -endif() - -set(SENTRY_TRANSPORT ${SENTRY_DEFAULT_TRANSPORT} CACHE STRING - "The HTTP transport that sentry uses to submit events to the sentry server, can be either 'none', 'curl' or 'winhttp' on windows.") - -if(SENTRY_TRANSPORT STREQUAL "winhttp") - set(SENTRY_TRANSPORT_WINHTTP TRUE) -elseif(SENTRY_TRANSPORT STREQUAL "curl") - set(SENTRY_TRANSPORT_CURL TRUE) -elseif(SENTRY_TRANSPORT STREQUAL "none") - set(SENTRY_TRANSPORT_NONE TRUE) -else() - message(FATAL_ERROR "SENTRY_TRANSPORT must be one of 'none', 'curl' or 'winhttp'") -endif() - -if(SENTRY_TRANSPORT_WINHTTP AND NOT WIN32) - message(FATAL_ERROR "The winhttp transport is only supported on Windows.") -endif() - -if(SENTRY_BUILD_TESTS OR SENTRY_BUILD_EXAMPLES) - enable_testing() -endif() - -if("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}") - set(SENTRY_MAIN_PROJECT ON) -endif() - -option(SENTRY_ENABLE_INSTALL "Enable sentry installation" "${SENTRY_MAIN_PROJECT}") - -if(MSVC AND CMAKE_GENERATOR_TOOLSET MATCHES "_xp$") - message(WARNING "Crashpad is not supported for MSVC with XP toolset. Default backend was switched to 'breakpad'") - set(SENTRY_DEFAULT_BACKEND "breakpad") -elseif((APPLE AND NOT IOS) OR WIN32) - set(SENTRY_DEFAULT_BACKEND "crashpad") -elseif(LINUX) - set(SENTRY_DEFAULT_BACKEND "breakpad") -else() - set(SENTRY_DEFAULT_BACKEND "inproc") -endif() - -if(NOT DEFINED SENTRY_BACKEND) - set(SENTRY_BACKEND ${SENTRY_DEFAULT_BACKEND} CACHE STRING - "The sentry backend responsible for reporting crashes, can be either 'none', 'inproc', 'breakpad' or 'crashpad'.") -endif() - -if(SENTRY_BACKEND STREQUAL "crashpad") - set(SENTRY_BACKEND_CRASHPAD TRUE) -elseif(SENTRY_BACKEND STREQUAL "inproc") - set(SENTRY_BACKEND_INPROC TRUE) -elseif(SENTRY_BACKEND STREQUAL "breakpad") - set(SENTRY_BACKEND_BREAKPAD TRUE) -elseif(SENTRY_BACKEND STREQUAL "none") - set(SENTRY_BACKEND_NONE TRUE) -else() - message(FATAL_ERROR "SENTRY_BACKEND must be one of 'crashpad', 'inproc', 'breakpad' or 'none'") -endif() - -if(SENTRY_BACKEND_CRASHPAD AND ANDROID) - message(FATAL_ERROR "The Crashpad backend is not currently supported on Android") -endif() - -set(SENTRY_SDK_NAME "" CACHE STRING "The SDK name to report when sending events.") - -message(STATUS "SENTRY_TRANSPORT=${SENTRY_TRANSPORT}") -message(STATUS "SENTRY_BACKEND=${SENTRY_BACKEND}") -message(STATUS "SENTRY_LIBRARY_TYPE=${SENTRY_LIBRARY_TYPE}") -message(STATUS "SENTRY_SDK_NAME=${SENTRY_SDK_NAME}") - -if(ANDROID) - set(SENTRY_WITH_LIBUNWINDSTACK TRUE) -elseif(NOT WIN32) - set(SENTRY_WITH_LIBBACKTRACE TRUE) -endif() - -option(WITH_ASAN_OPTION "Build sentry-native with address sanitizer" OFF) -if(WITH_ASAN_OPTION) - add_compile_options(-g -fsanitize=address -fno-omit-frame-pointer) - link_libraries(-fsanitize=address) -endif() - -option(WITH_TSAN_OPTION "Build sentry-native with thread sanitizer" OFF) -if(WITH_TSAN_OPTION) - add_compile_options(-g -fsanitize=thread -fno-omit-frame-pointer) - link_libraries(-fsanitize=thread) -endif() - -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "RelWithDebInfo") -endif() - -# use -O3 when doing `RelWithDebInfo` builds -if(NOT MSVC) - foreach(lang ASM C CXX) - string(REPLACE "-O2" "-O3" CMAKE_${lang}_FLAGS_RELWITHDEBINFO "${CMAKE_${lang}_FLAGS_RELWITHDEBINFO}") - endforeach() -endif() - -# https://gitlab.kitware.com/cmake/cmake/issues/20256 -if(APPLE) - find_program(DSYMUTIL_PROGRAM dsymutil) - if(DSYMUTIL_PROGRAM) - foreach(lang C CXX) - foreach(var LINK_EXECUTABLE CREATE_SHARED_LIBRARY) - set(CMAKE_${lang}_${var} "${CMAKE_${lang}_${var}}" "${DSYMUTIL_PROGRAM} ") - endforeach() - endforeach() - endif() -endif() - -function(sentry_install) - if(SENTRY_ENABLE_INSTALL) - install(${ARGN}) - endif() -endfunction() - -# helper function to add sources to existing TARGET prepended with ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR} -function(sentry_target_sources_cwd TARGET) - cmake_parse_arguments(STSC "" "SUBDIR" "" ${ARGN}) - foreach(src ${STSC_UNPARSED_ARGUMENTS}) - if(IS_ABSOLUTE "${src}") - target_sources(${TARGET} PRIVATE ${src}) - else() - target_sources(${TARGET} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/${STSC_SUBDIR}/${src}") - endif() - endforeach() -endfunction() - -# ===== sentry library ===== - -add_library(sentry ${SENTRY_LIBRARY_TYPE} "${PROJECT_SOURCE_DIR}/vendor/mpack.c") -target_sources(sentry PRIVATE "${PROJECT_SOURCE_DIR}/include/sentry.h") -add_library(sentry::sentry ALIAS sentry) -add_subdirectory(src) - -if (NOT SENTRY_SDK_NAME STREQUAL "") - target_compile_definitions(sentry PRIVATE SENTRY_SDK_NAME="${SENTRY_SDK_NAME}") -endif() - -# we do not need this on android, only linux -if(LINUX) - target_sources(sentry PRIVATE - "${PROJECT_SOURCE_DIR}/vendor/stb_sprintf.c" - "${PROJECT_SOURCE_DIR}/vendor/stb_sprintf.h" - ) -endif() - -set_target_properties(sentry PROPERTIES PUBLIC_HEADER "include/sentry.h") - -if(DEFINED SENTRY_FOLDER) - set_target_properties(sentry PROPERTIES FOLDER ${SENTRY_FOLDER}) -endif() - -# check size type -include(CheckTypeSize) -check_type_size("long" CMAKE_SIZEOF_LONG) - -# https://gitlab.kitware.com/cmake/cmake/issues/18393 -if(SENTRY_BUILD_SHARED_LIBS) - if(APPLE) - sentry_install(FILES "$.dSYM" DESTINATION "${CMAKE_INSTALL_LIBDIR}") - elseif(MSVC) - sentry_install(FILES "$<$,$>:$>" - DESTINATION "${CMAKE_INSTALL_BINDIR}") - endif() -endif() - -if(SENTRY_BUILD_SHARED_LIBS) - target_compile_definitions(sentry PRIVATE SENTRY_BUILD_SHARED) -else() - target_compile_definitions(sentry PUBLIC SENTRY_BUILD_STATIC) -endif() -target_compile_definitions(sentry PRIVATE SIZEOF_LONG=${CMAKE_SIZEOF_LONG}) - -# AIX needs libm for isnan used in test suite -if(CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") - target_link_libraries(sentry PRIVATE m) -endif() -# On IBM i PASE, flock is in libutil. Here because "sentry" exists now. -if(CMAKE_SYSTEM_NAME STREQUAL "OS400") - target_link_libraries(sentry PRIVATE util) -endif() - -if(SENTRY_TRANSPORT_CURL) - if(NOT CURL_FOUND) # Some other lib might bring libcurl already - find_package(CURL REQUIRED) - endif() - - if(TARGET CURL::libcurl) # Only available in cmake 3.12+ - target_link_libraries(sentry PRIVATE CURL::libcurl) - else() - # Needed for cmake < 3.12 support (cmake 3.12 introduced the target CURL::libcurl) - target_include_directories(sentry PRIVATE ${CURL_INCLUDE_DIR}) - # The exported sentry target must not contain any path of the build machine, therefore use generator expressions - string(REPLACE ";" "$" GENEX_CURL_LIBRARIES "${CURL_LIBRARIES}") - string(REPLACE ";" "$" GENEX_CURL_COMPILE_DEFINITIONS "${CURL_COMPILE_DEFINITIONS}") - target_link_libraries(sentry PRIVATE $) - target_compile_definitions(sentry PRIVATE $) - endif() -endif() - -set_property(TARGET sentry PROPERTY C_VISIBILITY_PRESET hidden) -if(MSVC) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(CMAKE_ASM_MASM_FLAGS "${CMAKE_ASM_MASM_FLAGS} /safeseh") - endif() - - # using `/Wall` is not feasible, as it spews tons of warnings from windows headers - # supress C5105, introduced in VS 16.8, which breaks on the Windows SDKs own `winbase.h` header - target_compile_options(sentry PRIVATE $) - # ignore all warnings for mpack - set_source_files_properties( - "${PROJECT_SOURCE_DIR}/vendor/mpack.c" - PROPERTIES - COMPILE_FLAGS - "/W0" - ) - - # set static runtime if enabled - if(SENTRY_BUILD_RUNTIMESTATIC) - set_property(TARGET sentry PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - endif() -else() - target_compile_options(sentry PRIVATE $) - # The crashpad and breakpad headers generate the following warnings that we - # ignore specifically - target_compile_options(sentry PRIVATE $) - # ignore all warnings for mpack - set_source_files_properties( - "${PROJECT_SOURCE_DIR}/vendor/mpack.c" - PROPERTIES - COMPILE_FLAGS - "-w" - ) -endif() - - -target_include_directories(sentry - PUBLIC - "$" - "$" - PRIVATE - "$" -) - -# The modulefinder and symbolizer need these two settings, and they are exported -# as `PUBLIC`, so libraries that depend on sentry get these too: -# `-E`: To have all symbols in the dynamic symbol table. -# `--build-id`: To have a build-id in the ELF object. -# FIXME: cmake 3.13 introduced target_link_options -option(SENTRY_EXPORT_SYMBOLS "Export symbols for modulefinder and symbolizer" ON) -if(SENTRY_EXPORT_SYMBOLS) - target_link_libraries(sentry PUBLIC - "$<$,$>:-Wl,-E,--build-id=sha1>") -endif() - -#respect CMAKE_SYSTEM_VERSION -if(WIN32) - if(MSVC AND CMAKE_GENERATOR_TOOLSET MATCHES "_xp$") - #force WINNT to 5.1 for Windows XP toolchain - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0501") - elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^10") - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0A00") - elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.3") - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0603") - elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.2") - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0602") - elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.1") - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0601") - elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.0") - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0600") - elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^5.2") - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0502") - elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^5.1") - target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0501") - endif() - - # crashpad does not support Windows XP toolset - if(MSVC AND CMAKE_GENERATOR_TOOLSET MATCHES "_xp$" AND SENTRY_BACKEND_CRASHPAD) - message(FATAL_ERROR "MSVC XP toolset does not support Crashpad") - endif() -endif() - -# handle platform libraries -if(ANDROID) - set(_SENTRY_PLATFORM_LIBS "dl" "log") -elseif(LINUX) - set(_SENTRY_PLATFORM_LIBS "dl" "rt") -elseif(WIN32) - set(_SENTRY_PLATFORM_LIBS "dbghelp" "shlwapi" "version") -endif() - -if(SENTRY_TRANSPORT_WINHTTP) - list(APPEND _SENTRY_PLATFORM_LIBS "winhttp") -endif() - -# handle platform threads library -if(SENTRY_LINK_PTHREAD) - list(APPEND _SENTRY_PLATFORM_LIBS "Threads::Threads") -endif() - -# apply platform libraries to sentry library -if(SENTRY_LIBRARY_TYPE STREQUAL "STATIC") - target_link_libraries(sentry PUBLIC ${_SENTRY_PLATFORM_LIBS}) -else() - target_link_libraries(sentry PRIVATE ${_SENTRY_PLATFORM_LIBS}) -endif() - -# suppress some errors and warnings for MinGW target -if(MINGW) - target_compile_options(sentry PRIVATE - -Wno-unused-variable - -Wno-unused-parameter - -Wno-format - -Wno-incompatible-pointer-types - -Wno-incompatible-function-pointer-types - ) -endif() - -if(SENTRY_WITH_LIBUNWINDSTACK) - target_include_directories(sentry PRIVATE - "$") - add_subdirectory("${PROJECT_SOURCE_DIR}/external/libunwindstack-ndk/cmake") - target_link_libraries(sentry PRIVATE unwindstack) - if(NOT SENTRY_BUILD_SHARED_LIBS) - sentry_install(TARGETS unwindstack EXPORT sentry - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ) - endif() -endif() - -if(SENTRY_BACKEND_CRASHPAD) - option(SENTRY_CRASHPAD_SYSTEM "Use system crashpad" OFF) - if(SENTRY_CRASHPAD_SYSTEM) - find_package(crashpad REQUIRED) - target_link_libraries(sentry PUBLIC crashpad::client) - else() - # FIXME: required for cmake 3.12 and lower: - # - NEW behavior lets normal variable override option - cmake_policy(SET CMP0077 NEW) - if(SENTRY_BUILD_SHARED_LIBS) - set(CRASHPAD_ENABLE_INSTALL OFF CACHE BOOL "Enable crashpad installation" FORCE) - else() - set(CRASHPAD_ENABLE_INSTALL ON CACHE BOOL "Enable crashpad installation" FORCE) - endif() - add_subdirectory(external/crashpad crashpad_build) - if(CRASHPAD_WER_ENABLED) - add_compile_definitions(CRASHPAD_WER_ENABLED) - endif() - - # set static runtime if enabled - if(SENTRY_BUILD_RUNTIMESTATIC AND MSVC) - set_property(TARGET crashpad_client PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_compat PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_getopt PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_handler PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_handler_lib PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_minidump PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_snapshot PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_tools PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET crashpad_util PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - if(CRASHPAD_WER_ENABLED) - set_property(TARGET crashpad_wer PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - endif() - set_property(TARGET crashpad_zlib PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET mini_chromium PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - endif() - - if(DEFINED SENTRY_FOLDER) - set_target_properties(crashpad_client PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_compat PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_getopt PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_handler PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_handler_lib PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_minidump PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_snapshot PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_tools PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_util PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(crashpad_zlib PROPERTIES FOLDER ${SENTRY_FOLDER}) - set_target_properties(mini_chromium PROPERTIES FOLDER ${SENTRY_FOLDER}) - if(CRASHPAD_WER_ENABLED) - set_target_properties(crashpad_wer PROPERTIES FOLDER ${SENTRY_FOLDER}) - endif() - endif() - - target_link_libraries(sentry PRIVATE - $ - $ - ) - install(EXPORT crashpad_export NAMESPACE sentry_crashpad:: FILE sentry_crashpad-targets.cmake - DESTINATION "${CMAKE_INSTALL_CMAKEDIR}" - ) - if(WIN32 AND MSVC) - sentry_install(FILES $ - DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) - if (CRASHPAD_WER_ENABLED) - sentry_install(FILES $ - DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) - endif() - endif() - endif() - add_dependencies(sentry crashpad::handler) - if(CRASHPAD_WER_ENABLED) - add_dependencies(sentry crashpad::wer) - endif() -elseif(SENTRY_BACKEND_BREAKPAD) - option(SENTRY_BREAKPAD_SYSTEM "Use system breakpad" OFF) - if(SENTRY_BREAKPAD_SYSTEM) - # system breakpad is using pkg-config, see `external/breakpad/breakpad-client.pc.in` - find_package(PkgConfig REQUIRED) - pkg_check_modules(BREAKPAD REQUIRED IMPORTED_TARGET breakpad-client) - target_link_libraries(sentry PUBLIC PkgConfig::BREAKPAD) - else() - add_subdirectory(external) - target_include_directories(sentry PRIVATE - "$" - ) - target_link_libraries(sentry PRIVATE - breakpad_client - ) - - if(DEFINED SENTRY_FOLDER) - set_target_properties(breakpad_client PROPERTIES FOLDER ${SENTRY_FOLDER}) - endif() - - if(NOT SENTRY_BUILD_SHARED_LIBS) - sentry_install(TARGETS breakpad_client EXPORT sentry - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ) - endif() - endif() -elseif(SENTRY_BACKEND_INPROC) - target_compile_definitions(sentry PRIVATE SENTRY_WITH_INPROC_BACKEND) -endif() - -option(SENTRY_INTEGRATION_QT "Build Qt integration") -if(SENTRY_INTEGRATION_QT) - if(QT_DEFAULT_MAJOR_VERSION) - # Let user choose major version - set(Qt_VERSION_MAJOR ${QT_DEFAULT_MAJOR_VERSION}) - else() - # Find best match, prioritizing Qt 6 if available - find_package(Qt NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) - endif() - find_package(Qt${Qt_VERSION_MAJOR} COMPONENTS Core REQUIRED) - message(STATUS "Found Qt: ${Qt${Qt_VERSION_MAJOR}_DIR} " - "(found version \"${Qt${Qt_VERSION_MAJOR}_VERSION}\")") - target_link_libraries(sentry PRIVATE Qt${Qt_VERSION_MAJOR}::Core) -endif() - -include(CMakePackageConfigHelpers) -configure_package_config_file(sentry-config.cmake.in sentry-config.cmake - INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") - -# generate package version file -# We would have liked to use `SameMinorVersion`, but that is only supported on -# CMake >= 3.11. -write_basic_package_version_file(sentry-config-version.cmake - VERSION ${SENTRY_VERSION} - COMPATIBILITY SameMajorVersion) - -sentry_install(TARGETS sentry EXPORT sentry - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" -) -sentry_install(EXPORT sentry NAMESPACE sentry:: FILE sentry-targets.cmake - DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") -sentry_install( - FILES - "${PROJECT_BINARY_DIR}/sentry-config.cmake" - "${PROJECT_BINARY_DIR}/sentry-config-version.cmake" - DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") -if(WIN32 AND MSVC AND SENTRY_BUILD_SHARED_LIBS) - sentry_install(FILES $ - DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) -endif() - -# ===== tests ===== - -if(SENTRY_BUILD_TESTS) - add_subdirectory(tests/unit) -endif() - -# ===== example, also used as integration test ===== - -if(SENTRY_BUILD_EXAMPLES) - add_executable(sentry_example examples/example.c) - target_link_libraries(sentry_example PRIVATE sentry) - - if(MSVC) - target_compile_options(sentry_example PRIVATE $) - if(CRASHPAD_WER_ENABLED) - # to test handling SEH by-passing exceptions we need to enable the control flow guard - target_compile_options(sentry_example PRIVATE $) - endif() - endif() - - # set static runtime if enabled - if(SENTRY_BUILD_RUNTIMESTATIC AND MSVC) - set_property(TARGET sentry_example PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - endif() - - if(DEFINED SENTRY_FOLDER) - set_target_properties(sentry_example PROPERTIES FOLDER ${SENTRY_FOLDER}) - endif() - - add_test(NAME sentry_example COMMAND sentry_example) -endif() diff --git a/shared/sentry/external/breakpad/LICENSE b/shared/sentry/external/breakpad/LICENSE deleted file mode 100644 index 832b4efb5..000000000 --- a/shared/sentry/external/breakpad/LICENSE +++ /dev/null @@ -1,131 +0,0 @@ -Copyright 2006 Google LLC - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google LLC nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------- - -Copyright 2001-2004 Unicode, Inc. - -Disclaimer - -This source code is provided as is by Unicode, Inc. No claims are -made as to fitness for any particular purpose. No warranties of any -kind are expressed or implied. The recipient agrees to determine -applicability of information provided. If this file has been -purchased on magnetic or optical media from Unicode, Inc., the -sole remedy for any claim will be exchange of defective media -within 90 days of receipt. - -Limitations on Rights to Redistribute This Code - -Unicode, Inc. hereby grants the right to freely use the information -supplied in this file in the creation of products supporting the -Unicode Standard, and to make copies of this file in any form -for internal or external distribution as long as this notice -remains attached. - --------------------------------------------------------------------- - -libunwind - a platform-independent unwind library - Copyright (C) 2008 Google, Inc - Contributed by Paul Pluzhnikov - Copyright (C) 2010 Konstantin Belousov - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - --------------------------------------------------------------------- - -Copyright (c) 1999 Apple Computer, Inc. All rights reserved. - -@APPLE_LICENSE_HEADER_START@ - -This file contains Original Code and/or Modifications of Original Code -as defined in and that are subject to the Apple Public Source License -Version 2.0 (the 'License'). You may not use this file except in -compliance with the License. Please obtain a copy of the License at -http://www.opensource.apple.com/apsl/ and read it before using this -file. - -The Original Code and all software distributed under the License are -distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, -INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. -Please see the License for the specific language governing rights and -limitations under the License. - -@APPLE_LICENSE_HEADER_END@ - --------------------------------------------------------------------- - -Copyright (c) 1989, 1993 -The Regents of the University of California. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: - This product includes software developed by the University of - California, Berkeley and its contributors. -4. Neither the name of the University nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/shared/sentry/external/breakpad/docs/breakpad.png b/shared/sentry/external/breakpad/docs/breakpad.png deleted file mode 100644 index 8d1a498d0f0417b6d2722454d4886019f3f48012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69566 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%0AqyKxe@5kmCcMKq!Ckt-h$*|rP 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 diff --git a/shared/sentry/external/breakpad/src/build/all.gyp b/shared/sentry/external/breakpad/src/build/all.gyp deleted file mode 100644 index 63b3333e9..000000000 --- a/shared/sentry/external/breakpad/src/build/all.gyp +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2014 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'targets': [ - { - 'target_name': 'All', - 'type': 'none', - 'dependencies': [ - '../common/common.gyp:*', - '../processor/processor.gyp:*', - '../tools/tools.gyp:*', - ], - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/build/common.gypi b/shared/sentry/external/breakpad/src/build/common.gypi deleted file mode 100644 index b65908c8c..000000000 --- a/shared/sentry/external/breakpad/src/build/common.gypi +++ /dev/null @@ -1,1045 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# IMPORTANT: -# Please don't directly include this file if you are building via gyp_chromium, -# since gyp_chromium is automatically forcing its inclusion. -{ - 'variables': { - # Variables expected to be overriden on the GYP command line (-D) or by - # ~/.gyp/include.gypi. - - # Putting a variables dict inside another variables dict looks kind of - # weird. This is necessary to get these variables defined for the conditions - # within this variables dict that operate on these variables. - 'variables': { - 'variables': { - # Compute the architecture that we're building on. - 'conditions': [ - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - # This handles the Linux platforms we generally deal with. Anything - # else gets passed through, which probably won't work very well; such - # hosts should pass an explicit target_arch to gyp. - 'host_arch%': - '. - # Additional documentation on these macros is available at - # http://developer.apple.com/mac/library/technotes/tn2002/tn2064.html#SECTION3 - # Chrome normally builds with the Mac OS X 10.5 SDK and sets the - # deployment target to 10.5. Other projects, such as O3D, may override - # these defaults. - 'mac_sdk%': '10.5', - 'mac_deployment_target%': '10.5', - - # Set to 1 to enable code coverage. In addition to build changes - # (e.g. extra CFLAGS), also creates a new target in the src/chrome - # project file called "coverage". - # Currently ignored on Windows. - 'coverage%': 0, - - # Although base/allocator lets you select a heap library via an - # environment variable, the libcmt shim it uses sometimes gets in - # the way. To disable it entirely, and switch to normal msvcrt, do e.g. - # 'win_use_allocator_shim': 0, - # 'win_release_RuntimeLibrary': 2 - # to ~/.gyp/include.gypi, gclient runhooks --force, and do a release build. - 'win_use_allocator_shim%': 1, # 0 = shim allocator via libcmt; 1 = msvcrt - - # Whether usage of OpenMAX is enabled. - 'enable_openmax%': 0, - - # TODO(bradnelson): eliminate this when possible. - # To allow local gyp files to prevent release.vsprops from being included. - # Yes(1) means include release.vsprops. - # Once all vsprops settings are migrated into gyp, this can go away. - 'msvs_use_common_release%': 1, - - # TODO(bradnelson): eliminate this when possible. - # To allow local gyp files to override additional linker options for msvs. - # Yes(1) means set use the common linker options. - 'msvs_use_common_linker_extras%': 1, - - # TODO(sgk): eliminate this if possible. - # It would be nicer to support this via a setting in 'target_defaults' - # in chrome/app/locales/locales.gypi overriding the setting in the - # 'Debug' configuration in the 'target_defaults' dict below, - # but that doesn't work as we'd like. - 'msvs_debug_link_incremental%': '2', - - # This is the location of the sandbox binary. Chrome looks for this before - # running the zygote process. If found, and SUID, it will be used to - # sandbox the zygote process and, thus, all renderer processes. - 'linux_sandbox_path%': '', - - # Set this to true to enable SELinux support. - 'selinux%': 0, - - # Strip the binary after dumping symbols. - 'linux_strip_binary%': 0, - - # Enable TCMalloc. - 'linux_use_tcmalloc%': 1, - - # Disable TCMalloc's debugallocation. - 'linux_use_debugallocation%': 0, - - # Disable TCMalloc's heapchecker. - 'linux_use_heapchecker%': 0, - - # Set to 1 to turn on seccomp sandbox by default. - # (Note: this is ignored for official builds.) - 'linux_use_seccomp_sandbox%': 0, - - # Set to select the Title Case versions of strings in GRD files. - 'use_titlecase_in_grd%': 0, - - # Used to disable Native Client at compile time, for platforms where it - # isn't supported - 'disable_nacl%': 0, - - # Set Thumb compilation flags. - 'arm_thumb%': 0, - - # Set ARM fpu compilation flags (only meaningful if arm_version==7 and - # arm_neon==0). - 'arm_fpu%': 'vfpv3', - - # Enable new NPDevice API. - 'enable_new_npdevice_api%': 0, - - 'conditions': [ - # Whether to use multiple cores to compile with visual studio. This is - # optional because it sometimes causes corruption on VS 2005. - # It is on by default on VS 2008 and off on VS 2005. - ['OS=="win"', { - 'conditions': [ - ['MSVS_VERSION=="2005"', { - 'msvs_multi_core_compile%': 0, - },{ - 'msvs_multi_core_compile%': 1, - }], - # Don't do incremental linking for large modules on 32-bit. - ['MSVS_OS_BITS==32', { - 'msvs_large_module_debug_link_mode%': '1', # No - },{ - 'msvs_large_module_debug_link_mode%': '2', # Yes - }], - ], - 'nacl_win64_defines': [ - # This flag is used to minimize dependencies when building - # Native Client loader for 64-bit Windows. - 'NACL_WIN64', - ], - }], - ], - - # NOTE: When these end up in the Mac bundle, we need to replace '-' for '_' - # so Cocoa is happy (http://crbug.com/20441). - 'locales': [ - 'am', 'ar', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en-GB', - 'en-US', 'es-419', 'es', 'et', 'fi', 'fil', 'fr', 'gu', 'he', - 'hi', 'hr', 'hu', 'id', 'it', 'ja', 'kn', 'ko', 'lt', 'lv', - 'ml', 'mr', 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', - 'sk', 'sl', 'sr', 'sv', 'sw', 'ta', 'te', 'th', 'tr', 'uk', - 'vi', 'zh-CN', 'zh-TW', - ], - }, - 'target_defaults': { - 'includes': [ - 'filename_rules.gypi', - ], - 'variables': { - # See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Optimize-Options.html - 'mac_release_optimization%': '3', # Use -O3 unless overridden - 'mac_debug_optimization%': '0', # Use -O0 unless overridden - # See http://msdn.microsoft.com/en-us/library/aa652360(VS.71).aspx - 'win_release_Optimization%': '2', # 2 = /Os - 'win_debug_Optimization%': '0', # 0 = /Od - # See http://msdn.microsoft.com/en-us/library/aa652367(VS.71).aspx - 'win_release_RuntimeLibrary%': '0', # 0 = /MT (nondebug static) - 'win_debug_RuntimeLibrary%': '1', # 1 = /MTd (debug static) - - 'release_extra_cflags%': '', - 'debug_extra_cflags%': '', - 'release_valgrind_build%': 0, - }, - 'conditions': [ - ['selinux==1', { - 'defines': ['CHROMIUM_SELINUX=1'], - }], - ['win_use_allocator_shim==0', { - 'conditions': [ - ['OS=="win"', { - 'defines': ['NO_TCMALLOC'], - }], - ], - }], - ['coverage!=0', { - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'GCC_INSTRUMENT_PROGRAM_FLOW_ARCS': 'YES', # -fprofile-arcs - 'GCC_GENERATE_TEST_COVERAGE_FILES': 'YES', # -ftest-coverage - }, - # Add -lgcov for types executable, shared_library, and - # loadable_module; not for static_library. - # This is a delayed conditional. - 'target_conditions': [ - ['_type!="static_library"', { - 'xcode_settings': { 'OTHER_LDFLAGS': [ '-lgcov' ] }, - }], - ], - }], - # Linux gyp (into scons) doesn't like target_conditions? - # TODO(???): track down why 'target_conditions' doesn't work - # on Linux gyp into scons like it does on Mac gyp into xcodeproj. - ['OS=="linux"', { - 'cflags': [ '-ftest-coverage', - '-fprofile-arcs' ], - 'link_settings': { 'libraries': [ '-lgcov' ] }, - }], - # Finally, for Windows, we simply turn on profiling. - ['OS=="win"', { - 'msvs_settings': { - 'VCLinkerTool': { - 'Profile': 'true', - }, - 'VCCLCompilerTool': { - # /Z7, not /Zi, so coverage is happyb - 'DebugInformationFormat': '1', - 'AdditionalOptions': ['/Yd'], - } - } - }], # OS==win - ], # conditions for coverage - }], # coverage!=0 - ], # conditions for 'target_defaults' - 'target_conditions': [ - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'cflags!': [ - '-Wall', - '-Wextra', - '-Werror', - ], - }], - [ 'OS=="win"', { - 'defines': [ - '_CRT_SECURE_NO_DEPRECATE', - '_CRT_NONSTDC_NO_WARNINGS', - '_CRT_NONSTDC_NO_DEPRECATE', - # This is required for ATL to use XP-safe versions of its functions. - '_USING_V110_SDK71_', - ], - 'msvs_disabled_warnings': [4800], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'WarnAsError': 'true', - 'Detect64BitPortabilityProblems': 'false', - }, - }, - }], - [ 'OS=="mac"', { - 'xcode_settings': { - 'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO', - 'WARNING_CFLAGS!': ['-Wall'], - }, - }], - ], # target_conditions for 'target_defaults' - 'default_configuration': 'Debug', - 'configurations': { - # VCLinkerTool LinkIncremental values below: - # 0 == default - # 1 == /INCREMENTAL:NO - # 2 == /INCREMENTAL - # Debug links incremental, Release does not. - # - # Abstract base configurations to cover common - # attributes. - # - 'Common_Base': { - 'abstract': 1, - 'msvs_configuration_attributes': { - 'OutputDirectory': '$(SolutionDir)$(ConfigurationName)', - 'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)', - 'CharacterSet': '1', - }, - }, - 'x86_Base': { - 'abstract': 1, - 'msvs_settings': { - 'VCLinkerTool': { - 'MinimumRequiredVersion': '5.01', # XP. - 'TargetMachine': '1', - }, - }, - 'msvs_configuration_platform': 'Win32', - }, - 'x64_Base': { - 'abstract': 1, - 'msvs_configuration_platform': 'x64', - 'msvs_settings': { - 'VCLinkerTool': { - 'TargetMachine': '17', # x86 - 64 - 'AdditionalLibraryDirectories!': - ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'], - 'AdditionalLibraryDirectories': - ['<(DEPTH)/third_party/platformsdk_win7/files/Lib/x64'], - }, - 'VCLibrarianTool': { - 'AdditionalLibraryDirectories!': - ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'], - 'AdditionalLibraryDirectories': - ['<(DEPTH)/third_party/platformsdk_win7/files/Lib/x64'], - }, - }, - 'defines': [ - # Not sure if tcmalloc works on 64-bit Windows. - 'NO_TCMALLOC', - ], - }, - 'Debug_Base': { - 'abstract': 1, - 'xcode_settings': { - 'COPY_PHASE_STRIP': 'NO', - 'GCC_OPTIMIZATION_LEVEL': '<(mac_debug_optimization)', - 'OTHER_CFLAGS': [ '<@(debug_extra_cflags)', ], - }, - 'msvs_settings': { - 'VCCLCompilerTool': { - 'Optimization': '<(win_debug_Optimization)', - 'PreprocessorDefinitions': ['_DEBUG'], - 'BasicRuntimeChecks': '3', - 'RuntimeLibrary': '<(win_debug_RuntimeLibrary)', - }, - 'VCLinkerTool': { - 'LinkIncremental': '<(msvs_debug_link_incremental)', - }, - 'VCResourceCompilerTool': { - 'PreprocessorDefinitions': ['_DEBUG'], - }, - }, - 'conditions': [ - ['OS=="linux"', { - 'cflags': [ - '<@(debug_extra_cflags)', - ], - }], - ], - }, - 'Release_Base': { - 'abstract': 1, - 'defines': [ - 'NDEBUG', - ], - 'xcode_settings': { - 'DEAD_CODE_STRIPPING': 'YES', # -Wl,-dead_strip - 'GCC_OPTIMIZATION_LEVEL': '<(mac_release_optimization)', - 'OTHER_CFLAGS': [ '<@(release_extra_cflags)', ], - }, - 'msvs_settings': { - 'VCCLCompilerTool': { - 'Optimization': '<(win_release_Optimization)', - 'RuntimeLibrary': '<(win_release_RuntimeLibrary)', - }, - 'VCLinkerTool': { - 'LinkIncremental': '1', - }, - }, - 'conditions': [ - ['release_valgrind_build==0', { - 'defines': ['NVALGRIND'], - }], - ['win_use_allocator_shim==0', { - 'defines': ['NO_TCMALLOC'], - }], - ['win_release_RuntimeLibrary==2', { - # Visual C++ 2008 barfs when building anything with /MD (msvcrt): - # VC\include\typeinfo(139) : warning C4275: non dll-interface - # class 'stdext::exception' used as base for dll-interface - # class 'std::bad_cast' - 'msvs_disabled_warnings': [4275], - }], - ['OS=="linux"', { - 'cflags': [ - '<@(release_extra_cflags)', - ], - }], - ], - }, - 'Purify_Base': { - 'abstract': 1, - 'defines': [ - 'PURIFY', - 'NO_TCMALLOC', - ], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'Optimization': '0', - 'RuntimeLibrary': '0', - 'BufferSecurityCheck': 'false', - }, - 'VCLinkerTool': { - 'EnableCOMDATFolding': '1', - 'LinkIncremental': '1', - }, - }, - }, - # - # Concrete configurations - # - 'Debug': { - 'inherit_from': ['Common_Base', 'x86_Base', 'Debug_Base'], - }, - 'Release': { - 'inherit_from': ['Common_Base', 'x86_Base', 'Release_Base'], - 'conditions': [ - ['msvs_use_common_release', { - 'defines': ['OFFICIAL_BUILD'], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'Optimization': '3', - 'StringPooling': 'true', - 'OmitFramePointers': 'true', - 'InlineFunctionExpansion': '2', - 'EnableIntrinsicFunctions': 'true', - 'FavorSizeOrSpeed': '2', - 'OmitFramePointers': 'true', - 'EnableFiberSafeOptimizations': 'true', - 'WholeProgramOptimization': 'true', - }, - 'VCLibrarianTool': { - 'AdditionalOptions': ['/ltcg', '/expectedoutputsize:120000000'], - }, - 'VCLinkerTool': { - 'LinkIncremental': '1', - 'OptimizeReferences': '2', - 'EnableCOMDATFolding': '2', - 'OptimizeForWindows98': '1', - 'LinkTimeCodeGeneration': '1', - }, - }, - }], - ] - }, - 'conditions': [ - [ 'OS=="win"', { - # TODO(bradnelson): add a gyp mechanism to make this more graceful. - 'Purify': { - 'inherit_from': ['Common_Base', 'x86_Base', 'Release_Base', 'Purify'], - }, - 'Debug_x64': { - 'inherit_from': ['Common_Base', 'x64_Base', 'Debug_Base'], - }, - 'Release_x64': { - 'inherit_from': ['Common_Base', 'x64_Base', 'Release_Base'], - }, - 'Purify_x64': { - 'inherit_from': ['Common_Base', 'x64_Base', 'Release_Base', 'Purify_Base'], - }, - }], - ], - }, - }, - 'conditions': [ - ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', { - 'target_defaults': { - # Enable -Werror by default, but put it in a variable so it can - # be disabled in ~/.gyp/include.gypi on the valgrind builders. - 'variables': { - # Use -fno-strict-aliasing by default since gcc 4.4 has periodic - # issues that slip through the cracks. We could do this just for - # gcc 4.4 but it makes more sense to be consistent on all - # compilers in use. TODO(Craig): turn this off again when - # there is some 4.4 test infrastructure in place and existing - # aliasing issues have been fixed. - 'no_strict_aliasing%': 1, - 'conditions': [['OS=="linux"', {'werror%': '-Werror',}], - ['OS=="freebsd"', {'werror%': '',}], - ['OS=="openbsd"', {'werror%': '',}], - ], - }, - 'cflags': [ - '<(werror)', # See note above about the werror variable. - '-pthread', - '-fno-exceptions', - '-Wall', - # TODO(evan): turn this back on once all the builds work. - # '-Wextra', - # Don't warn about unused function params. We use those everywhere. - '-Wno-unused-parameter', - # Don't warn about the "struct foo f = {0};" initialization pattern. - '-Wno-missing-field-initializers', - '-D_FILE_OFFSET_BITS=64', - # Don't export any symbols (for example, to plugins we dlopen()). - # Note: this is *required* to make some plugins work. - '-fvisibility=hidden', - ], - 'cflags_cc': [ - '-frtti', - '-fno-threadsafe-statics', - # Make inline functions have hidden visiblity by default. - # Surprisingly, not covered by -fvisibility=hidden. - '-fvisibility-inlines-hidden', - ], - 'ldflags': [ - '-pthread', '-Wl,-z,noexecstack', - ], - 'scons_variable_settings': { - 'LIBPATH': ['$LIB_DIR'], - # Linking of large files uses lots of RAM, so serialize links - # using the handy flock command from util-linux. - 'FLOCK_LINK': ['flock', '$TOP_BUILDDIR/linker.lock', '$LINK'], - 'FLOCK_SHLINK': ['flock', '$TOP_BUILDDIR/linker.lock', '$SHLINK'], - 'FLOCK_LDMODULE': ['flock', '$TOP_BUILDDIR/linker.lock', '$LDMODULE'], - - # We have several cases where archives depend on each other in - # a cyclic fashion. Since the GNU linker does only a single - # pass over the archives we surround the libraries with - # --start-group and --end-group (aka -( and -) ). That causes - # ld to loop over the group until no more undefined symbols - # are found. In an ideal world we would only make groups from - # those libraries which we knew to be in cycles. However, - # that's tough with SCons, so we bodge it by making all the - # archives a group by redefining the linking command here. - # - # TODO: investigate whether we still have cycles that - # require --{start,end}-group. There has been a lot of - # refactoring since this was first coded, which might have - # eliminated the circular dependencies. - # - # Note: $_LIBDIRFLAGS comes before ${LINK,SHLINK,LDMODULE}FLAGS - # so that we prefer our own built libraries (e.g. -lpng) to - # system versions of libraries that pkg-config might turn up. - # TODO(sgk): investigate handling this not by re-ordering the - # flags this way, but by adding a hook to use the SCons - # ParseFlags() option on the output from pkg-config. - 'LINKCOM': [['$FLOCK_LINK', '-o', '$TARGET', - '$_LIBDIRFLAGS', '$LINKFLAGS', '$SOURCES', - '-Wl,--start-group', '$_LIBFLAGS', '-Wl,--end-group']], - 'SHLINKCOM': [['$FLOCK_SHLINK', '-o', '$TARGET', - '$_LIBDIRFLAGS', '$SHLINKFLAGS', '$SOURCES', - '-Wl,--start-group', '$_LIBFLAGS', '-Wl,--end-group']], - 'LDMODULECOM': [['$FLOCK_LDMODULE', '-o', '$TARGET', - '$_LIBDIRFLAGS', '$LDMODULEFLAGS', '$SOURCES', - '-Wl,--start-group', '$_LIBFLAGS', '-Wl,--end-group']], - 'IMPLICIT_COMMAND_DEPENDENCIES': 0, - }, - 'scons_import_variables': [ - 'AS', - 'CC', - 'CXX', - 'LINK', - ], - 'scons_propagate_variables': [ - 'AS', - 'CC', - 'CCACHE_DIR', - 'CXX', - 'DISTCC_DIR', - 'DISTCC_HOSTS', - 'HOME', - 'INCLUDE_SERVER_ARGS', - 'INCLUDE_SERVER_PORT', - 'LINK', - 'CHROME_BUILD_TYPE', - 'CHROMIUM_BUILD', - 'OFFICIAL_BUILD', - ], - 'configurations': { - 'Debug_Base': { - 'variables': { - 'debug_optimize%': '0', - }, - 'defines': [ - '_DEBUG', - ], - 'cflags': [ - '-O>(debug_optimize)', - '-g', - # One can use '-gstabs' to enable building the debugging - # information in STABS format for breakpad's dumpsyms. - ], - 'ldflags': [ - '-rdynamic', # Allows backtrace to resolve symbols. - ], - }, - 'Release_Base': { - 'variables': { - 'release_optimize%': '2', - }, - 'cflags': [ - '-O>(release_optimize)', - # Don't emit the GCC version ident directives, they just end up - # in the .comment section taking up binary size. - '-fno-ident', - # Put data and code in their own sections, so that unused symbols - # can be removed at link time with --gc-sections. - '-fdata-sections', - '-ffunction-sections', - ], - 'ldflags': [ - '-Wl,--gc-sections', - ], - }, - }, - 'variants': { - 'coverage': { - 'cflags': ['-fprofile-arcs', '-ftest-coverage'], - 'ldflags': ['-fprofile-arcs'], - }, - 'profile': { - 'cflags': ['-pg', '-g'], - 'ldflags': ['-pg'], - }, - 'symbols': { - 'cflags': ['-g'], - }, - }, - 'conditions': [ - [ 'target_arch=="ia32"', { - 'asflags': [ - # Needed so that libs with .s files (e.g. libicudata.a) - # are compatible with the general 32-bit-ness. - '-32', - ], - # All floating-point computations on x87 happens in 80-bit - # precision. Because the C and C++ language standards allow - # the compiler to keep the floating-point values in higher - # precision than what's specified in the source and doing so - # is more efficient than constantly rounding up to 64-bit or - # 32-bit precision as specified in the source, the compiler, - # especially in the optimized mode, tries very hard to keep - # values in x87 floating-point stack (in 80-bit precision) - # as long as possible. This has important side effects, that - # the real value used in computation may change depending on - # how the compiler did the optimization - that is, the value - # kept in 80-bit is different than the value rounded down to - # 64-bit or 32-bit. There are possible compiler options to make - # this behavior consistent (e.g. -ffloat-store would keep all - # floating-values in the memory, thus force them to be rounded - # to its original precision) but they have significant runtime - # performance penalty. - # - # -mfpmath=sse -msse2 makes the compiler use SSE instructions - # which keep floating-point values in SSE registers in its - # native precision (32-bit for single precision, and 64-bit for - # double precision values). This means the floating-point value - # used during computation does not change depending on how the - # compiler optimized the code, since the value is always kept - # in its specified precision. - 'conditions': [ - ['disable_sse2==0', { - 'cflags': [ - '-march=pentium4', - '-msse2', - '-mfpmath=sse', - ], - }], - ], - # -mmmx allows mmintrin.h to be used for mmx intrinsics. - # video playback is mmx and sse2 optimized. - 'cflags': [ - '-m32', - '-mmmx', - ], - 'ldflags': [ - '-m32', - ], - }], - ['target_arch=="arm"', { - 'target_conditions': [ - ['_toolset=="target"', { - 'cflags_cc': [ - # The codesourcery arm-2009q3 toolchain warns at that the ABI - # has changed whenever it encounters a varargs function. This - # silences those warnings, as they are not helpful and - # clutter legitimate warnings. - '-Wno-abi', - ], - 'conditions': [ - ['arm_thumb == 1', { - 'cflags': [ - '-mthumb', - # TODO(piman): -Wa,-mimplicit-it=thumb is needed for - # inline assembly that uses condition codes but it's - # suboptimal. Better would be to #ifdef __thumb__ at the - # right place and have a separate thumb path. - '-Wa,-mimplicit-it=thumb', - ] - }], - ['arm_version==7', { - 'cflags': [ - '-march=armv7-a', - '-mtune=cortex-a8', - '-mfloat-abi=softfp', - ], - 'conditions': [ - ['arm_neon==1', { - 'cflags': [ '-mfpu=neon', ], - }, { - 'cflags': [ '-mfpu=<(arm_fpu)', ], - }] - ], - }], - ], - }], - ], - }], - ['linux_fpic==1', { - 'cflags': [ - '-fPIC', - ], - }], - ['sysroot!=""', { - 'target_conditions': [ - ['_toolset=="target"', { - 'cflags': [ - '--sysroot=<(sysroot)', - ], - 'ldflags': [ - '--sysroot=<(sysroot)', - ], - }]] - }], - ['no_strict_aliasing==1', { - 'cflags': [ - '-fno-strict-aliasing', - ], - }], - ['linux_use_heapchecker==1', { - 'variables': {'linux_use_tcmalloc%': 1}, - }], - ['linux_use_tcmalloc==0', { - 'defines': ['NO_TCMALLOC'], - }], - ['linux_use_heapchecker==0', { - 'defines': ['NO_HEAPCHECKER'], - }], - ], - }, - }], - # FreeBSD-specific options; note that most FreeBSD options are set above, - # with Linux. - ['OS=="freebsd"', { - 'target_defaults': { - 'ldflags': [ - '-Wl,--no-keep-memory', - ], - }, - }], - ['OS=="solaris"', { - 'cflags!': ['-fvisibility=hidden'], - 'cflags_cc!': ['-fvisibility-inlines-hidden'], - }], - ['OS=="mac"', { - 'target_defaults': { - 'variables': { - # This should be 'mac_real_dsym%', but there seems to be a bug - # with % in variables that are intended to be set to different - # values in different targets, like this one. - 'mac_real_dsym': 0, # Fake .dSYMs are fine in most cases. - }, - 'mac_bundle': 0, - 'xcode_settings': { - 'ALWAYS_SEARCH_USER_PATHS': 'NO', - 'GCC_C_LANGUAGE_STANDARD': 'c99', # -std=c99 - 'GCC_CW_ASM_SYNTAX': 'NO', # No -fasm-blocks - 'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic - # (Equivalent to -fPIC) - 'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions - 'GCC_ENABLE_CPP_RTTI': 'YES', # -frtti - 'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings - # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden - 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES', - 'GCC_OBJC_CALL_CXX_CDTORS': 'YES', # -fobjc-call-cxx-cdtors - 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden - 'GCC_THREADSAFE_STATICS': 'NO', # -fno-threadsafe-statics - 'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES', # -Werror - 'GCC_VERSION': '4.2', - 'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES', # -Wnewline-eof - # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min - 'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)', - 'PREBINDING': 'NO', # No -Wl,-prebind - 'USE_HEADERMAP': 'NO', - 'WARNING_CFLAGS': ['-Wall', '-Wendif-labels'], - 'conditions': [ - ['chromium_mac_pch', {'GCC_PRECOMPILE_PREFIX_HEADER': 'YES'}, - {'GCC_PRECOMPILE_PREFIX_HEADER': 'NO'} - ], - ], - }, - 'target_conditions': [ - ['_type!="static_library"', { - 'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']}, - }], - ['_mac_bundle', { - 'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-ObjC']}, - }], - ], # target_conditions - }, # target_defaults - }], # OS=="mac" - ['OS=="win"', { - 'target_defaults': { - 'defines': [ - '_WIN32_WINNT=0x0600', - 'WINVER=0x0600', - 'WIN32', - '_WINDOWS', - '_HAS_EXCEPTIONS=0', - 'NOMINMAX', - '_CRT_RAND_S', - 'CERT_CHAIN_PARA_HAS_EXTRA_FIELDS', - 'WIN32_LEAN_AND_MEAN', - '_SECURE_ATL', - '_HAS_TR1=0', - ], - 'msvs_system_include_dirs': [ - '<(DEPTH)/third_party/platformsdk_win7/files/Include', - '$(VSInstallDir)/VC/atlmfc/include', - ], - 'msvs_cygwin_dirs': ['<(DEPTH)/third_party/cygwin'], - 'msvs_disabled_warnings': [ - 4091, 4100, 4127, 4366, 4396, 4503, 4512, 4819, 4995, 4702 - ], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'MinimalRebuild': 'false', - 'ExceptionHandling': '0', - 'BufferSecurityCheck': 'true', - 'EnableFunctionLevelLinking': 'true', - 'RuntimeTypeInfo': 'false', - 'WarningLevel': '4', - 'WarnAsError': 'true', - 'DebugInformationFormat': '3', - 'conditions': [ - [ 'msvs_multi_core_compile', { - 'AdditionalOptions': ['/MP'], - }], - ], - }, - 'VCLibrarianTool': { - 'AdditionalOptions': ['/ignore:4221'], - 'AdditionalLibraryDirectories': - ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'], - }, - 'VCLinkerTool': { - 'AdditionalDependencies': [ - 'wininet.lib', - 'version.lib', - 'msimg32.lib', - 'ws2_32.lib', - 'usp10.lib', - 'psapi.lib', - 'dbghelp.lib', - ], - 'AdditionalLibraryDirectories': - ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'], - 'GenerateDebugInformation': 'true', - 'MapFileName': '$(OutDir)\\$(TargetName).map', - 'ImportLibrary': '$(OutDir)\\lib\\$(TargetName).lib', - 'FixedBaseAddress': '1', - # SubSystem values: - # 0 == not set - # 1 == /SUBSYSTEM:CONSOLE - # 2 == /SUBSYSTEM:WINDOWS - # Most of the executables we'll ever create are tests - # and utilities with console output. - 'SubSystem': '1', - }, - 'VCMIDLTool': { - 'GenerateStublessProxies': 'true', - 'TypeLibraryName': '$(InputName).tlb', - 'OutputDirectory': '$(IntDir)', - 'HeaderFileName': '$(InputName).h', - 'DLLDataFileName': 'dlldata.c', - 'InterfaceIdentifierFileName': '$(InputName)_i.c', - 'ProxyFileName': '$(InputName)_p.c', - }, - 'VCResourceCompilerTool': { - 'Culture' : '1033', - 'AdditionalIncludeDirectories': ['<(DEPTH)'], - }, - }, - }, - }], - ['disable_nacl==1 or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', { - 'target_defaults': { - 'defines': [ - 'DISABLE_NACL', - ], - }, - }], - ['OS=="win" and msvs_use_common_linker_extras', { - 'target_defaults': { - 'msvs_settings': { - 'VCLinkerTool': { - 'DelayLoadDLLs': [ - 'dbghelp.dll', - 'dwmapi.dll', - 'uxtheme.dll', - ], - }, - }, - 'configurations': { - 'x86_Base': { - 'msvs_settings': { - 'VCLinkerTool': { - 'AdditionalOptions': [ - '/safeseh', - '/dynamicbase', - '/ignore:4199', - '/ignore:4221', - '/nxcompat', - ], - }, - }, - }, - 'x64_Base': { - 'msvs_settings': { - 'VCLinkerTool': { - 'AdditionalOptions': [ - # safeseh is not compatible with x64 - '/dynamicbase', - '/ignore:4199', - '/ignore:4221', - '/nxcompat', - ], - }, - }, - }, - }, - }, - }], - ['enable_new_npdevice_api==1', { - 'target_defaults': { - 'defines': [ - 'ENABLE_NEW_NPDEVICE_API', - ], - }, - }], - ], - 'scons_settings': { - 'sconsbuild_dir': '<(DEPTH)/sconsbuild', - 'tools': ['ar', 'as', 'gcc', 'g++', 'gnulink', 'chromium_builders'], - }, - 'xcode_settings': { - # DON'T ADD ANYTHING NEW TO THIS BLOCK UNLESS YOU REALLY REALLY NEED IT! - # This block adds *project-wide* configuration settings to each project - # file. It's almost always wrong to put things here. Specify your - # custom xcode_settings in target_defaults to add them to targets instead. - - # In an Xcode Project Info window, the "Base SDK for All Configurations" - # setting sets the SDK on a project-wide basis. In order to get the - # configured SDK to show properly in the Xcode UI, SDKROOT must be set - # here at the project level. - 'SDKROOT': 'macosx<(mac_sdk)', # -isysroot - - # The Xcode generator will look for an xcode_settings section at the root - # of each dict and use it to apply settings on a file-wide basis. Most - # settings should not be here, they should be in target-specific - # xcode_settings sections, or better yet, should use non-Xcode-specific - # settings in target dicts. SYMROOT is a special case, because many other - # Xcode variables depend on it, including variables such as - # PROJECT_DERIVED_FILE_DIR. When a source group corresponding to something - # like PROJECT_DERIVED_FILE_DIR is added to a project, in order for the - # files to appear (when present) in the UI as actual files and not red - # red "missing file" proxies, the correct path to PROJECT_DERIVED_FILE_DIR, - # and therefore SYMROOT, needs to be set at the project level. - 'SYMROOT': '<(DEPTH)/xcodebuild', - }, -} diff --git a/shared/sentry/external/breakpad/src/build/filename_rules.gypi b/shared/sentry/external/breakpad/src/build/filename_rules.gypi deleted file mode 100644 index b34f19bda..000000000 --- a/shared/sentry/external/breakpad/src/build/filename_rules.gypi +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2014 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'target_conditions': [ - ['OS!="win"', { - 'sources/': [ - ['exclude', '(^|/)windows/'], - ], - }], - ['OS!="linux"', { - 'sources/': [ - ['exclude', '(^|/)linux/'], - ], - }], - ['OS!="mac"', { - 'sources/': [ - ['exclude', '(^|/)mac/'], - ], - }], - ['OS!="android"', { - 'sources/': [ - ['exclude', '(^|/)android/'], - ], - }], - ['OS!="solaris"', { - 'sources/': [ - ['exclude', '(^|/)solaris/'], - ], - }], - ], -} diff --git a/shared/sentry/external/breakpad/src/build/gyp_breakpad b/shared/sentry/external/breakpad/src/build/gyp_breakpad deleted file mode 100755 index 219d47328..000000000 --- a/shared/sentry/external/breakpad/src/build/gyp_breakpad +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2014 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -import os -import platform -import sys - -script_dir = os.path.dirname(os.path.realpath(__file__)) -breakpad_root = os.path.abspath(os.path.join(script_dir, os.pardir)) - -sys.path.insert(0, os.path.join(breakpad_root, 'tools', 'gyp', 'pylib')) -import gyp - -def run_gyp(args): - rc = gyp.main(args) - if rc != 0: - print 'Error running GYP' - sys.exit(rc) - - -def main(): - args = sys.argv[1:] - args.append(os.path.join(script_dir, 'all.gyp')) - - args.append('-I') - args.append(os.path.join(breakpad_root, 'build', 'common.gypi')) - - args.extend(['-D', 'gyp_output_dir=out']) - - # Set the GYP DEPTH variable to the root of the project. - args.append('--depth=' + os.path.relpath(breakpad_root)) - - print 'Updating projects from gyp files...' - sys.stdout.flush() - - run_gyp(args) - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/shared/sentry/external/breakpad/src/build/testing.gyp b/shared/sentry/external/breakpad/src/build/testing.gyp deleted file mode 100644 index d03246657..000000000 --- a/shared/sentry/external/breakpad/src/build/testing.gyp +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright 2014 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'targets': [ - { - 'target_name': 'gtest', - 'type': 'static_library', - 'sources': [ - '../testing/googletest/src/gtest-all.cc', - ], - 'include_dirs': [ - '../testing/googletest', - '../testing/googletest/include', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '../testing/googletest/include', - ], - }, - }, - { - 'target_name': 'gtest_main', - 'type': 'static_library', - 'dependencies': [ - 'gtest', - ], - 'sources': [ - '../testing/googletest/src/gtest_main.cc', - ], - }, - { - 'target_name': 'gmock', - 'type': 'static_library', - 'dependencies': [ - 'gtest', - ], - 'sources': [ - '../testing/googlemock/src/gmock-all.cc', - ], - 'include_dirs': [ - '../testing/googlemock', - '../testing/googlemock/include', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '../testing/googlemock/include', - ], - }, - 'export_dependent_settings': [ - 'gtest', - ], - }, - { - 'target_name': 'gmock_main', - 'type': 'static_library', - 'dependencies': [ - 'gmock', - ], - 'sources': [ - '../testing/googlemock/src/gmock_main.cc', - ], - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/client/windows/breakpad_client.gyp b/shared/sentry/external/breakpad/src/client/windows/breakpad_client.gyp deleted file mode 100644 index 05e2da3a0..000000000 --- a/shared/sentry/external/breakpad/src/client/windows/breakpad_client.gyp +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'build_all', - 'type': 'none', - 'dependencies': [ - './crash_generation/crash_generation.gyp:*', - './handler/exception_handler.gyp:*', - './sender/crash_report_sender.gyp:*', - './unittests/client_tests.gyp:*', - './unittests/testing.gyp:*', - './tests/crash_generation_app/crash_generation_app.gyp:*', - ] - }, - { - 'target_name': 'common', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '<(DEPTH)', - ] - }, - 'sources': [ - '<(DEPTH)/common/windows/guid_string.cc', - '<(DEPTH)/common/windows/guid_string.h', - '<(DEPTH)/common/windows/http_upload.cc', - '<(DEPTH)/common/windows/http_upload.h', - '<(DEPTH)/common/windows/string_utils.cc', - ] - } - ] -} diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation.gyp b/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation.gyp deleted file mode 100644 index 9b4c6eaaf..000000000 --- a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation.gyp +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'crash_generation_server', - 'type': 'static_library', - 'sources': [ - 'client_info.cc', - 'crash_generation_server.cc', - 'minidump_generator.cc', - 'client_info.h', - 'crash_generation_client.h', - 'crash_generation_server.h', - 'minidump_generator.h', - ], - 'dependencies': [ - '../breakpad_client.gyp:common' - ], - }, - { - 'target_name': 'crash_generation_client', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)', - ], - 'sources': [ - 'crash_generation_client.h', - 'crash_generation_client.cc', - 'crash_generation_server.h', - ], - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.gyp b/shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.gyp deleted file mode 100644 index b53a6cd45..000000000 --- a/shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.gyp +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'exception_handler', - 'type': 'static_library', - 'sources': [ - "exception_handler.cc", - "exception_handler.h", - ], - 'dependencies': [ - '../breakpad_client.gyp:common', - '../crash_generation/crash_generation.gyp:crash_generation_server', - ] - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.gyp b/shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.gyp deleted file mode 100644 index 82f81a4cc..000000000 --- a/shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.gyp +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'crash_report_sender', - 'type': 'static_library', - 'sources': [ - 'crash_report_sender.cc', - 'crash_report_sender.h', - ], - 'dependencies': [ - '../breakpad_client.gyp:common' - ], - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp b/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp deleted file mode 100644 index 3c27273f1..000000000 --- a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'crash_generation_app', - 'type': 'executable', - 'sources': [ - 'abstract_class.cc', - 'abstract_class.h', - 'crash_generation_app.cc', - 'crash_generation_app.h', - 'crash_generation_app.ico', - 'crash_generation_app.rc', - 'resource.h', - 'small.ico', - ], - 'libraries': [ - 'user32.lib', - ], - 'dependencies': [ - '../../breakpad_client.gyp:common', - '../../crash_generation/crash_generation.gyp:crash_generation_server', - '../../crash_generation/crash_generation.gyp:crash_generation_client', - '../../handler/exception_handler.gyp:exception_handler', - ], - 'msvs_settings': { - 'VCLinkerTool': { - 'SubSystem': '2', # Windows Subsystem as opposed to a console app - }, - }, - } - ] -} diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/client_tests.gyp b/shared/sentry/external/breakpad/src/client/windows/unittests/client_tests.gyp deleted file mode 100644 index 1e594515a..000000000 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/client_tests.gyp +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'client_tests', - 'type': 'executable', - 'sources': [ - 'exception_handler_test.h', - 'exception_handler_test.cc', - 'exception_handler_death_test.cc', - 'exception_handler_nesting_test.cc', - 'minidump_test.cc', - 'dump_analysis.cc', - 'dump_analysis.h', - 'crash_generation_server_test.cc' - ], - 'dependencies': [ - 'testing.gyp:gtest', - 'testing.gyp:gmock', - '../breakpad_client.gyp:common', - '../crash_generation/crash_generation.gyp:crash_generation_server', - '../crash_generation/crash_generation.gyp:crash_generation_client', - '../handler/exception_handler.gyp:exception_handler', - 'processor_bits', - ] - }, - { - 'target_name': 'processor_bits', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '<(DEPTH)', - ] - }, - 'sources': [ - '<(DEPTH)/common/string_conversion.cc', - '<(DEPTH)/processor/basic_code_modules.cc', - '<(DEPTH)/processor/convert_old_arm64_context.cc', - '<(DEPTH)/processor/dump_context.cc', - '<(DEPTH)/processor/dump_object.cc', - '<(DEPTH)/processor/logging.cc', - '<(DEPTH)/processor/minidump.cc', - '<(DEPTH)/processor/pathname_stripper.cc', - '<(DEPTH)/processor/proc_maps_linux.cc', - ] - } - ], -} diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/testing.gyp b/shared/sentry/external/breakpad/src/client/windows/unittests/testing.gyp deleted file mode 100644 index 2d8d31a97..000000000 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/testing.gyp +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright 2010 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../../build/common.gypi', - ], - 'target_defaults': { - }, - 'targets': [ - { - 'target_name': 'gtest', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)/testing/include', - '<(DEPTH)/testing/googletest/include', - '<(DEPTH)/testing/googletest', - '<(DEPTH)/testing', - ], - 'sources': [ - '<(DEPTH)/testing/googletest/src/gtest-all.cc', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '<(DEPTH)/testing/include', - '<(DEPTH)/testing/gtest/include', - ], - # Visual C++ implements variadic templates strangely, and - # VC++2012 broke Google Test by lowering this value. See - # http://stackoverflow.com/questions/12558327/google-test-in-visual-studio-2012 - 'defines': ['_VARIADIC_MAX=10', '_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING'], - }, - 'defines': ['_VARIADIC_MAX=10', '_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING'], - }, - { - 'target_name': 'gmock', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)/testing/include', - '<(DEPTH)/testing/googletest/include', - '<(DEPTH)/testing/googletest', - '<(DEPTH)/testing/googlemock/include', - '<(DEPTH)/testing/googlemock', - '<(DEPTH)/testing', - ], - 'sources': [ - '<(DEPTH)/testing/googlemock/src/gmock-all.cc', - '<(DEPTH)/testing/googletest/src/gtest_main.cc', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '<(DEPTH)/testing/include', - '<(DEPTH)/testing/googletest/include', - '<(DEPTH)/testing/googletest', - '<(DEPTH)/testing/googlemock/include', - '<(DEPTH)/testing/googlemock', - '<(DEPTH)/testing', - ], - 'defines': ['_VARIADIC_MAX=10', '_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING'], - }, - 'defines': ['_VARIADIC_MAX=10', '_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING'], - }, - - ], -} diff --git a/shared/sentry/external/breakpad/src/common/common.gyp b/shared/sentry/external/breakpad/src/common/common.gyp deleted file mode 100644 index f5833b03f..000000000 --- a/shared/sentry/external/breakpad/src/common/common.gyp +++ /dev/null @@ -1,262 +0,0 @@ -# Copyright 2014 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'target_defaults': { - 'target_conditions': [ - ['OS=="mac"', { - 'defines': ['HAVE_MACH_O_NLIST_H'], - }], - ['OS=="linux"', { - # Assume glibc. - 'defines': ['HAVE_A_OUT_H', 'HAVE_GETCONTEXT'], - 'sources!': [ - 'linux/breakpad_getcontext.S', - 'linux/breakpad_getcontext.h', - 'linux/breakpad_getcontext_unittest.cc', - ], - }], - ['OS!="android"', {'sources/': [['exclude', '(^|/)android/']]}], - ['OS!="linux"', {'sources/': [['exclude', '(^|/)linux/']]}], - ['OS!="mac"', {'sources/': [['exclude', '(^|/)mac/']]}], - ['OS!="solaris"', {'sources/': [['exclude', '(^|/)solaris/']]}], - ['OS!="win"', {'sources/': [['exclude', '(^|/)windows/']]}], - ], - }, - 'targets': [ - { - 'target_name': 'common', - 'type': 'static_library', - 'sources': [ - 'android/include/elf.h', - 'android/include/link.h', - 'android/include/stab.h', - 'android/include/sys/procfs.h', - 'android/include/sys/user.h', - 'android/testing/include/wchar.h', - 'android/testing/mkdtemp.h', - 'android/testing/pthread_fixes.h', - 'android/ucontext_constants.h', - 'basictypes.h', - 'byte_cursor.h', - 'convert_UTF.cc', - 'convert_UTF.h', - 'dwarf/bytereader-inl.h', - 'dwarf/bytereader.cc', - 'dwarf/bytereader.h', - 'dwarf/cfi_assembler.cc', - 'dwarf/cfi_assembler.h', - 'dwarf/dwarf2diehandler.cc', - 'dwarf/dwarf2diehandler.h', - 'dwarf/dwarf2enums.h', - 'dwarf/dwarf2reader.cc', - 'dwarf/dwarf2reader.h', - 'dwarf/dwarf2reader_test_common.h', - 'dwarf/elf_reader.cc', - 'dwarf/elf_reader.h', - 'dwarf/functioninfo.cc', - 'dwarf/functioninfo.h', - 'dwarf/line_state_machine.h', - 'dwarf/types.h', - 'dwarf_cfi_to_module.cc', - 'dwarf_cfi_to_module.h', - 'dwarf_cu_to_module.cc', - 'dwarf_cu_to_module.h', - 'dwarf_line_to_module.cc', - 'dwarf_line_to_module.h', - 'language.cc', - 'language.h', - 'linux/breakpad_getcontext.S', - 'linux/breakpad_getcontext.h', - 'linux/crc32.cc', - 'linux/crc32.h', - 'linux/dump_symbols.cc', - 'linux/dump_symbols.h', - 'linux/eintr_wrapper.h', - 'linux/elf_core_dump.cc', - 'linux/elf_core_dump.h', - 'linux/elf_gnu_compat.h', - 'linux/elf_symbols_to_module.cc', - 'linux/elf_symbols_to_module.h', - 'linux/elfutils-inl.h', - 'linux/elfutils.cc', - 'linux/elfutils.h', - 'linux/file_id.cc', - 'linux/file_id.h', - 'linux/google_crashdump_uploader.cc', - 'linux/google_crashdump_uploader.h', - 'linux/guid_creator.cc', - 'linux/guid_creator.h', - 'linux/http_upload.cc', - 'linux/http_upload.h', - 'linux/ignore_ret.h', - 'linux/libcurl_wrapper.cc', - 'linux/libcurl_wrapper.h', - 'linux/linux_libc_support.cc', - 'linux/linux_libc_support.h', - 'linux/memory_mapped_file.cc', - 'linux/memory_mapped_file.h', - 'linux/safe_readlink.cc', - 'linux/safe_readlink.h', - 'linux/symbol_collector_client.cc', - 'linux/symbol_collector_client.h', - 'linux/synth_elf.cc', - 'linux/synth_elf.h', - 'long_string_dictionary.cc', - 'long_string_dictionary.h', - 'mac/arch_utilities.cc', - 'mac/arch_utilities.h', - 'mac/bootstrap_compat.cc', - 'mac/bootstrap_compat.h', - 'mac/byteswap.h', - 'mac/dump_syms.h', - 'mac/dump_syms.cc', - 'mac/file_id.cc', - 'mac/file_id.h', - 'mac/GTMDefines.h', - 'mac/GTMLogger.h', - 'mac/GTMLogger.m', - 'mac/HTTPMultipartUpload.h', - 'mac/HTTPMultipartUpload.m', - 'mac/MachIPC.h', - 'mac/MachIPC.mm', - 'mac/macho_id.cc', - 'mac/macho_id.h', - 'mac/macho_reader.cc', - 'mac/macho_reader.h', - 'mac/macho_utilities.cc', - 'mac/macho_utilities.h', - 'mac/macho_walker.cc', - 'mac/macho_walker.h', - 'mac/scoped_task_suspend-inl.h', - 'mac/string_utilities.cc', - 'mac/string_utilities.h', - 'mac/super_fat_arch.h', - 'md5.cc', - 'md5.h', - 'memory_allocator.h', - 'memory_range.h', - 'module.cc', - 'module.h', - 'safe_math.h', - 'scoped_ptr.h', - 'simple_string_dictionary.cc', - 'simple_string_dictionary.h', - 'solaris/dump_symbols.cc', - 'solaris/dump_symbols.h', - 'solaris/file_id.cc', - 'solaris/file_id.h', - 'solaris/guid_creator.cc', - 'solaris/guid_creator.h', - 'solaris/message_output.h', - 'stabs_reader.cc', - 'stabs_reader.h', - 'stabs_to_module.cc', - 'stabs_to_module.h', - 'string_conversion.cc', - 'string_conversion.h', - 'symbol_data.h', - 'test_assembler.cc', - 'test_assembler.h', - 'unordered.h', - 'using_std_string.h', - 'windows/common_windows.gyp', - 'windows/dia_util.cc', - 'windows/dia_util.h', - 'windows/guid_string.cc', - 'windows/guid_string.h', - 'windows/http_upload.cc', - 'windows/http_upload.h', - 'windows/omap.cc', - 'windows/omap.h', - 'windows/omap_internal.h', - 'windows/pdb_source_line_writer.cc', - 'windows/pdb_source_line_writer.h', - 'windows/string_utils-inl.h', - 'windows/string_utils.cc', - ], - 'include_dirs': [ - '..', - ], - }, - { - 'target_name': 'common_unittests', - 'type': 'executable', - 'sources': [ - 'byte_cursor_unittest.cc', - 'dwarf/bytereader_unittest.cc', - 'dwarf/dwarf2diehandler_unittest.cc', - 'dwarf/dwarf2reader_cfi_unittest.cc', - 'dwarf/dwarf2reader_die_unittest.cc', - 'dwarf_cfi_to_module_unittest.cc', - 'dwarf_cu_to_module_unittest.cc', - 'dwarf_line_to_module_unittest.cc', - 'linux/breakpad_getcontext_unittest.cc', - 'linux/dump_symbols_unittest.cc', - 'linux/elf_core_dump_unittest.cc', - 'linux/elf_symbols_to_module_unittest.cc', - 'linux/file_id_unittest.cc', - 'linux/google_crashdump_uploader_test.cc', - 'linux/linux_libc_support_unittest.cc', - 'linux/memory_mapped_file_unittest.cc', - 'linux/safe_readlink_unittest.cc', - 'linux/synth_elf_unittest.cc', - 'linux/tests/auto_testfile.h', - 'linux/tests/crash_generator.cc', - 'linux/tests/crash_generator.h', - 'long_string_dictionary_unittest.cc', - 'mac/macho_reader_unittest.cc', - 'memory_allocator_unittest.cc', - 'memory_range_unittest.cc', - 'module_unittest.cc', - 'safe_math_unittest.cc', - 'simple_string_dictionary_unittest.cc', - 'stabs_reader_unittest.cc', - 'stabs_to_module_unittest.cc', - 'string_conversion_unittest.cc', - 'test_assembler_unittest.cc', - 'tests/auto_tempdir.h', - 'tests/file_utils.cc', - 'tests/file_utils.h', - 'windows/omap_unittest.cc', - ], - 'include_dirs': [ - '..', - ], - 'dependencies': [ - 'common', - '../build/testing.gyp:gmock_main', - '../build/testing.gyp:gmock', - '../build/testing.gyp:gtest', - ], - 'libraries': [ - '-ldl', - ], - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/common/linux/tests/auto_testfile.h b/shared/sentry/external/breakpad/src/common/linux/tests/auto_testfile.h deleted file mode 100644 index e2d2ff23b..000000000 --- a/shared/sentry/external/breakpad/src/common/linux/tests/auto_testfile.h +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2013 Google LLC -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google LLC nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Utility class for creating a temporary file for unit tests -// that is deleted in the destructor. - -#ifndef GOOGLE_BREAKPAD_COMMON_LINUX_TESTS_AUTO_TESTFILE -#define GOOGLE_BREAKPAD_COMMON_LINUX_TESTS_AUTO_TESTFILE - -#include -#include - -#include - -#include "breakpad_googletest_includes.h" -#include "common/linux/eintr_wrapper.h" -#include "common/tests/auto_tempdir.h" - -namespace google_breakpad { - -class AutoTestFile { - public: - // Create a new empty test file. - // test_prefix: (input) test-specific prefix, can't be NULL. - explicit AutoTestFile(const char* test_prefix) { - Init(test_prefix); - } - - // Create a new test file, and fill it with initial data from a C string. - // The terminating zero is not written. - // test_prefix: (input) test-specific prefix, can't be NULL. - // text: (input) initial content. - AutoTestFile(const char* test_prefix, const char* text) { - Init(test_prefix); - if (fd_ >= 0) - WriteText(text, static_cast(strlen(text))); - } - - AutoTestFile(const char* test_prefix, const char* text, size_t text_len) { - Init(test_prefix); - if (fd_ >= 0) - WriteText(text, text_len); - } - - // Destroy test file on scope exit. - ~AutoTestFile() { - if (fd_ >= 0) { - close(fd_); - fd_ = -1; - } - } - - // Returns true iff the test file could be created properly. - // Useful in tests inside EXPECT_TRUE(file.IsOk()); - bool IsOk() { - return fd_ >= 0; - } - - // Returns the Posix file descriptor for the test file, or -1 - // If IsOk() returns false. Note: on Windows, this always returns -1. - int GetFd() { - return fd_; - } - - private: - void Init(const char* test_prefix) { - fd_ = -1; - char path_templ[PATH_MAX]; - int ret = snprintf(path_templ, sizeof(path_templ), - TEMPDIR "/%s-unittest.XXXXXX", - test_prefix); - if (ret >= static_cast(sizeof(path_templ))) - return; - - fd_ = mkstemp(path_templ); - if (fd_ < 0) - return; - - unlink(path_templ); - } - - void WriteText(const char* text, size_t text_len) { - ssize_t r = HANDLE_EINTR(write(fd_, text, text_len)); - if (r != static_cast(text_len)) { - close(fd_); - fd_ = -1; - return; - } - - lseek(fd_, 0, SEEK_SET); - } - - int fd_; -}; - -} // namespace google_breakpad - -#endif // GOOGLE_BREAKPAD_COMMON_LINUX_TESTS_AUTO_TESTFILE diff --git a/shared/sentry/external/breakpad/src/common/mac/arch_utilities.cc b/shared/sentry/external/breakpad/src/common/mac/arch_utilities.cc deleted file mode 100644 index 392efe786..000000000 --- a/shared/sentry/external/breakpad/src/common/mac/arch_utilities.cc +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2012 Google LLC -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google LLC nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "common/mac/arch_utilities.h" - -#include -#include -#include -#include - -#ifndef CPU_SUBTYPE_ARM_V7S -#define CPU_SUBTYPE_ARM_V7S (static_cast(11)) -#endif // CPU_SUBTYPE_ARM_V7S - -#ifndef CPU_TYPE_ARM64 -#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) -#endif // CPU_TYPE_ARM64 - -#ifndef CPU_SUBTYPE_ARM64_ALL -#define CPU_SUBTYPE_ARM64_ALL (static_cast(0)) -#endif // CPU_SUBTYPE_ARM64_ALL - -#ifndef CPU_SUBTYPE_ARM64_E -#define CPU_SUBTYPE_ARM64_E (static_cast(2)) -#endif // CPU_SUBTYPE_ARM64_E - -namespace { - -const NXArchInfo* ArchInfo_arm64(cpu_subtype_t cpu_subtype) { - const char* name = NULL; - switch (cpu_subtype) { - case CPU_SUBTYPE_ARM64_ALL: - name = "arm64"; - break; - case CPU_SUBTYPE_ARM64_E: - name = "arm64e"; - break; - default: - return NULL; - } - - NXArchInfo* arm64 = new NXArchInfo; - *arm64 = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM, - CPU_SUBTYPE_ARM_V7); - arm64->name = name; - arm64->cputype = CPU_TYPE_ARM64; - arm64->cpusubtype = cpu_subtype; - arm64->description = "arm 64"; - return arm64; -} - -const NXArchInfo* ArchInfo_armv7s() { - NXArchInfo* armv7s = new NXArchInfo; - *armv7s = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM, - CPU_SUBTYPE_ARM_V7); - armv7s->name = "armv7s"; - armv7s->cpusubtype = CPU_SUBTYPE_ARM_V7S; - armv7s->description = "arm v7s"; - return armv7s; -} - -} // namespace - -namespace google_breakpad { - -const NXArchInfo* BreakpadGetArchInfoFromName(const char* arch_name) { - // TODO: Remove this when the OS knows about arm64. - if (!strcmp("arm64", arch_name)) - return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64, - CPU_SUBTYPE_ARM64_ALL); - - if (!strcmp("arm64e", arch_name)) - return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64, - CPU_SUBTYPE_ARM64_E); - - // TODO: Remove this when the OS knows about armv7s. - if (!strcmp("armv7s", arch_name)) - return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM, CPU_SUBTYPE_ARM_V7S); - - return NXGetArchInfoFromName(arch_name); -} - -const NXArchInfo* BreakpadGetArchInfoFromCpuType(cpu_type_t cpu_type, - cpu_subtype_t cpu_subtype) { - // TODO: Remove this when the OS knows about arm64. - if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_ALL) { - static const NXArchInfo* arm64 = ArchInfo_arm64(cpu_subtype); - return arm64; - } - - if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_E) { - static const NXArchInfo* arm64e = ArchInfo_arm64(cpu_subtype); - return arm64e; - } - - // TODO: Remove this when the OS knows about armv7s. - if (cpu_type == CPU_TYPE_ARM && cpu_subtype == CPU_SUBTYPE_ARM_V7S) { - static const NXArchInfo* armv7s = ArchInfo_armv7s(); - return armv7s; - } - - return NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); -} - -} // namespace google_breakpad - -// TODO(crbug.com/1242776): The "#ifndef __APPLE__" should be here, but the -// system version of NXGetLocalArchInfo returns incorrect information on -// x86_64 machines (treating them as just x86), so use the Breakpad version -// all the time for now. -namespace { - -enum Architecture { - kArch_i386 = 0, - kArch_x86_64, - kArch_x86_64h, - kArch_arm, - kArch_arm64, - kArch_arm64e, - kArch_ppc, - // This must be last. - kNumArchitectures -}; - -// enum Architecture above and kKnownArchitectures below -// must be kept in sync. -const NXArchInfo kKnownArchitectures[] = { - { - "i386", - CPU_TYPE_I386, - CPU_SUBTYPE_I386_ALL, - NX_LittleEndian, - "Intel 80x86" - }, - { - "x86_64", - CPU_TYPE_X86_64, - CPU_SUBTYPE_X86_64_ALL, - NX_LittleEndian, - "Intel x86-64" - }, - { - "x86_64h", - CPU_TYPE_X86_64, - CPU_SUBTYPE_X86_64_H, - NX_LittleEndian, - "Intel x86-64h Haswell" - }, - { - "arm", - CPU_TYPE_ARM, - CPU_SUBTYPE_ARM_ALL, - NX_LittleEndian, - "ARM" - }, - { - "arm64", - CPU_TYPE_ARM64, - CPU_SUBTYPE_ARM64_ALL, - NX_LittleEndian, - "ARM64" - }, - { - "arm64e", - CPU_TYPE_ARM64, - CPU_SUBTYPE_ARM64_E, - NX_LittleEndian, - "ARM64e" - }, - { - "ppc", - CPU_TYPE_POWERPC, - CPU_SUBTYPE_POWERPC_ALL, - NX_BigEndian, - "PowerPC" - } -}; - -} // namespace - -const NXArchInfo *NXGetLocalArchInfo(void) { - Architecture arch; -#if defined(__i386__) - arch = kArch_i386; -#elif defined(__x86_64__) - arch = kArch_x86_64; -#elif defined(__arm64) - arch = kArch_arm64; -#elif defined(__arm__) - arch = kArch_arm; -#elif defined(__powerpc__) - arch = kArch_ppc; -#else - #error "Unsupported CPU architecture" -#endif - return &kKnownArchitectures[arch]; -} - -#ifndef __APPLE__ - -const NXArchInfo *NXGetArchInfoFromName(const char *name) { - for (int arch = 0; arch < kNumArchitectures; ++arch) { - if (!strcmp(name, kKnownArchitectures[arch].name)) { - return &kKnownArchitectures[arch]; - } - } - return NULL; -} - -const NXArchInfo *NXGetArchInfoFromCpuType(cpu_type_t cputype, - cpu_subtype_t cpusubtype) { - const NXArchInfo *candidate = NULL; - for (int arch = 0; arch < kNumArchitectures; ++arch) { - if (kKnownArchitectures[arch].cputype == cputype) { - if (kKnownArchitectures[arch].cpusubtype == cpusubtype) { - return &kKnownArchitectures[arch]; - } - if (!candidate) { - candidate = &kKnownArchitectures[arch]; - } - } - } - return candidate; -} - -struct fat_arch *NXFindBestFatArch(cpu_type_t cputype, - cpu_subtype_t cpusubtype, - struct fat_arch *fat_archs, - uint32_t nfat_archs) { - struct fat_arch *candidate = NULL; - for (uint32_t f = 0; f < nfat_archs; ++f) { - if (fat_archs[f].cputype == cputype) { - if (fat_archs[f].cpusubtype == cpusubtype) { - return &fat_archs[f]; - } - if (!candidate) { - candidate = &fat_archs[f]; - } - } - } - return candidate; -} -#endif // !__APPLE__ diff --git a/shared/sentry/external/breakpad/src/common/windows/common_windows.gyp b/shared/sentry/external/breakpad/src/common/windows/common_windows.gyp deleted file mode 100644 index e2f07a5f7..000000000 --- a/shared/sentry/external/breakpad/src/common/windows/common_windows.gyp +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright 2013 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'dia_sdk', - 'type': 'none', - 'all_dependent_settings': { - 'include_dirs': [ - '<(DEPTH)', - '$(VSInstallDir)/DIA SDK/include', - ], - 'msvs_settings': { - 'VCLinkerTool': { - 'AdditionalDependencies': [ - 'diaguids.lib', - 'imagehlp.lib', - ], - }, - }, - 'configurations': { - 'x86_Base': { - 'msvs_settings': { - 'VCLinkerTool': { - 'AdditionalLibraryDirectories': - ['$(VSInstallDir)/DIA SDK/lib'], - }, - }, - }, - 'x64_Base': { - 'msvs_settings': { - 'VCLinkerTool': { - 'AdditionalLibraryDirectories': - ['$(VSInstallDir)/DIA SDK/lib/amd64'], - }, - }, - }, - }, - }, - }, - { - 'target_name': 'common_windows_lib', - 'type': 'static_library', - 'sources': [ - 'dia_util.cc', - 'dia_util.h', - 'guid_string.cc', - 'guid_string.h', - 'http_upload.cc', - 'http_upload.h', - 'module_info.h', - 'omap.cc', - 'omap.h', - 'omap_internal.h', - 'pdb_source_line_writer.cc', - 'pdb_source_line_writer.h', - 'pe_source_line_writer.cc', - 'pe_source_line_writer.h', - 'pe_util.h', - 'pe_util.cc', - 'string_utils.cc', - 'string_utils-inl.h', - 'symbol_collector_client.cc', - 'symbol_collector_client.h', - ], - 'dependencies': [ - 'dia_sdk', - ], - }, - { - 'target_name': 'common_windows_unittests', - 'type': 'executable', - 'sources': [ - 'omap_unittest.cc', - ], - 'dependencies': [ - '<(DEPTH)/client/windows/unittests/testing.gyp:gmock', - '<(DEPTH)/client/windows/unittests/testing.gyp:gtest', - 'common_windows_lib', - ], - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/libdisasm.gyp b/shared/sentry/external/breakpad/src/third_party/libdisasm/libdisasm.gyp deleted file mode 100644 index 4847dd428..000000000 --- a/shared/sentry/external/breakpad/src/third_party/libdisasm/libdisasm.gyp +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2014 Google LLC -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google LLC nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -{ - 'includes': [ - '../../build/common.gypi', - ], - 'targets': [ - { - 'target_name': 'libdisasm', - 'type': 'static_library', - 'sources': [ - 'ia32_implicit.c', - 'ia32_implicit.h', - 'ia32_insn.c', - 'ia32_insn.h', - 'ia32_invariant.c', - 'ia32_invariant.h', - 'ia32_modrm.c', - 'ia32_modrm.h', - 'ia32_opcode_tables.c', - 'ia32_opcode_tables.h', - 'ia32_operand.c', - 'ia32_operand.h', - 'ia32_reg.c', - 'ia32_reg.h', - 'ia32_settings.c', - 'ia32_settings.h', - 'libdis.h', - 'qword.h', - 'x86_disasm.c', - 'x86_format.c', - 'x86_imm.c', - 'x86_imm.h', - 'x86_insn.c', - 'x86_misc.c', - 'x86_operand_list.c', - 'x86_operand_list.h', - ], - }, - ], -} diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/README b/shared/sentry/external/breakpad/src/third_party/mac_headers/README deleted file mode 100644 index c681bb3d6..000000000 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/README +++ /dev/null @@ -1,2 +0,0 @@ -These headers were copied from the Mac OS X 10.7 SDK to enable building -the Mac dump_syms code that processes Mach-O files on Linux. diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/vm_param.h b/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/vm_param.h deleted file mode 100644 index edcb83496..000000000 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/vm_param.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -/* - * Copyright (c) 1994 The University of Utah and - * the Computer Systems Laboratory at the University of Utah (CSL). - * All rights reserved. - * - * Permission to use, copy, modify and distribute this software is hereby - * granted provided that (1) source code retains these copyright, permission, - * and disclaimer notices, and (2) redistributions including binaries - * reproduce the notices in supporting documentation, and (3) all advertising - * materials mentioning features or use of this software display the following - * acknowledgement: ``This product includes software developed by the - * Computer Systems Laboratory at the University of Utah.'' - * - * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS - * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF - * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * CSL requests users of this software to return to csl-dist@cs.utah.edu any - * improvements that they make and grant CSL redistribution rights. - * - */ - -/* - * File: vm_param.h - * Author: Avadis Tevanian, Jr. - * Date: 1985 - * - * I386 machine dependent virtual memory parameters. - * Most of the declarations are preceeded by I386_ (or i386_) - * which is OK because only I386 specific code will be using - * them. - */ - -#ifndef _MACH_I386_VM_PARAM_H_ -#define _MACH_I386_VM_PARAM_H_ - -#define BYTE_SIZE 8 /* byte size in bits */ - -#define I386_PGBYTES 4096 /* bytes per 80386 page */ -#define I386_PGSHIFT 12 /* bitshift for pages */ - -#define PAGE_SIZE I386_PGBYTES -#define PAGE_SHIFT I386_PGSHIFT -#define PAGE_MASK (PAGE_SIZE - 1) - -#define I386_LPGBYTES 2*1024*1024 /* bytes per large page */ -#define I386_LPGSHIFT 21 /* bitshift for large pages */ -#define I386_LPGMASK (I386_LPGBYTES-1) - -/* - * Convert bytes to pages and convert pages to bytes. - * No rounding is used. - */ - -#define i386_btop(x) ((ppnum_t)((x) >> I386_PGSHIFT)) -#define machine_btop(x) i386_btop(x) -#define i386_ptob(x) (((pmap_paddr_t)(x)) << I386_PGSHIFT) - -/* - * Round off or truncate to the nearest page. These will work - * for either addresses or counts. (i.e. 1 byte rounds to 1 page - * bytes. - */ - -#define i386_round_page(x) ((((pmap_paddr_t)(x)) + I386_PGBYTES - 1) & \ - ~(I386_PGBYTES-1)) -#define i386_trunc_page(x) (((pmap_paddr_t)(x)) & ~(I386_PGBYTES-1)) - - - -#define VM_MIN_ADDRESS64 ((user_addr_t) 0x0000000000000000ULL) -/* - * default top of user stack... it grows down from here - */ -#define VM_USRSTACK64 ((user_addr_t) 0x00007FFF5FC00000ULL) -#define VM_DYLD64 ((user_addr_t) 0x00007FFF5FC00000ULL) -#define VM_LIB64_SHR_DATA ((user_addr_t) 0x00007FFF60000000ULL) -#define VM_LIB64_SHR_TEXT ((user_addr_t) 0x00007FFF80000000ULL) -/* - * the end of the usable user address space , for now about 47 bits. - * the 64 bit commpage is past the end of this - */ -#define VM_MAX_PAGE_ADDRESS ((user_addr_t) 0x00007FFFFFE00000ULL) -/* - * canonical end of user address space for limits checking - */ -#define VM_MAX_USER_PAGE_ADDRESS ((user_addr_t)0x00007FFFFFFFF000ULL) - - -/* system-wide values */ -#define MACH_VM_MIN_ADDRESS ((mach_vm_offset_t) 0) -#define MACH_VM_MAX_ADDRESS ((mach_vm_offset_t) VM_MAX_PAGE_ADDRESS) - -/* process-relative values (all 32-bit legacy only for now) */ -#define VM_MIN_ADDRESS ((vm_offset_t) 0) -#define VM_USRSTACK32 ((vm_offset_t) 0xC0000000) -#define VM_MAX_ADDRESS ((vm_offset_t) 0xFFE00000) - - - -#endif /* _MACH_I386_VM_PARAM_H_ */ diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine.h b/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine.h deleted file mode 100644 index 5bb21e48b..000000000 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine.h +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (c) 2000-2007 Apple Computer, Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* File: machine.h - * Author: Avadis Tevanian, Jr. - * Date: 1986 - * - * Machine independent machine abstraction. - */ - -#ifndef _MACH_MACHINE_H_ -#define _MACH_MACHINE_H_ - -#include -#include -#include - -typedef integer_t cpu_type_t; -typedef integer_t cpu_subtype_t; -typedef integer_t cpu_threadtype_t; - -#define CPU_STATE_MAX 4 - -#define CPU_STATE_USER 0 -#define CPU_STATE_SYSTEM 1 -#define CPU_STATE_IDLE 2 -#define CPU_STATE_NICE 3 - - - -/* - * Capability bits used in the definition of cpu_type. - */ -#define CPU_ARCH_MASK 0xff000000 /* mask for architecture bits */ -#define CPU_ARCH_ABI64 0x01000000 /* 64 bit ABI */ - -/* - * Machine types known by all. - */ - -#define CPU_TYPE_ANY ((cpu_type_t) -1) - -#define CPU_TYPE_VAX ((cpu_type_t) 1) -/* skip ((cpu_type_t) 2) */ -/* skip ((cpu_type_t) 3) */ -/* skip ((cpu_type_t) 4) */ -/* skip ((cpu_type_t) 5) */ -#define CPU_TYPE_MC680x0 ((cpu_type_t) 6) -#define CPU_TYPE_X86 ((cpu_type_t) 7) -#define CPU_TYPE_I386 CPU_TYPE_X86 /* compatibility */ -#define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64) - -/* skip CPU_TYPE_MIPS ((cpu_type_t) 8) */ -/* skip ((cpu_type_t) 9) */ -#define CPU_TYPE_MC98000 ((cpu_type_t) 10) -#define CPU_TYPE_HPPA ((cpu_type_t) 11) -#define CPU_TYPE_ARM ((cpu_type_t) 12) -#define CPU_TYPE_MC88000 ((cpu_type_t) 13) -#define CPU_TYPE_SPARC ((cpu_type_t) 14) -#define CPU_TYPE_I860 ((cpu_type_t) 15) -/* skip CPU_TYPE_ALPHA ((cpu_type_t) 16) */ -/* skip ((cpu_type_t) 17) */ -#define CPU_TYPE_POWERPC ((cpu_type_t) 18) -#define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64) - -/* - * Machine subtypes (these are defined here, instead of in a machine - * dependent directory, so that any program can get all definitions - * regardless of where is it compiled). - */ - -/* - * Capability bits used in the definition of cpu_subtype. - */ -#define CPU_SUBTYPE_MASK 0xff000000 /* mask for feature flags */ -#define CPU_SUBTYPE_LIB64 0x80000000 /* 64 bit libraries */ - - -/* - * Object files that are hand-crafted to run on any - * implementation of an architecture are tagged with - * CPU_SUBTYPE_MULTIPLE. This functions essentially the same as - * the "ALL" subtype of an architecture except that it allows us - * to easily find object files that may need to be modified - * whenever a new implementation of an architecture comes out. - * - * It is the responsibility of the implementor to make sure the - * software handles unsupported implementations elegantly. - */ -#define CPU_SUBTYPE_MULTIPLE ((cpu_subtype_t) -1) -#define CPU_SUBTYPE_LITTLE_ENDIAN ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_BIG_ENDIAN ((cpu_subtype_t) 1) - -/* - * Machine threadtypes. - * This is none - not defined - for most machine types/subtypes. - */ -#define CPU_THREADTYPE_NONE ((cpu_threadtype_t) 0) - -/* - * VAX subtypes (these do *not* necessary conform to the actual cpu - * ID assigned by DEC available via the SID register). - */ - -#define CPU_SUBTYPE_VAX_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_VAX780 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_VAX785 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_VAX750 ((cpu_subtype_t) 3) -#define CPU_SUBTYPE_VAX730 ((cpu_subtype_t) 4) -#define CPU_SUBTYPE_UVAXI ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_UVAXII ((cpu_subtype_t) 6) -#define CPU_SUBTYPE_VAX8200 ((cpu_subtype_t) 7) -#define CPU_SUBTYPE_VAX8500 ((cpu_subtype_t) 8) -#define CPU_SUBTYPE_VAX8600 ((cpu_subtype_t) 9) -#define CPU_SUBTYPE_VAX8650 ((cpu_subtype_t) 10) -#define CPU_SUBTYPE_VAX8800 ((cpu_subtype_t) 11) -#define CPU_SUBTYPE_UVAXIII ((cpu_subtype_t) 12) - -/* - * 680x0 subtypes - * - * The subtype definitions here are unusual for historical reasons. - * NeXT used to consider 68030 code as generic 68000 code. For - * backwards compatability: - * - * CPU_SUBTYPE_MC68030 symbol has been preserved for source code - * compatability. - * - * CPU_SUBTYPE_MC680x0_ALL has been defined to be the same - * subtype as CPU_SUBTYPE_MC68030 for binary comatability. - * - * CPU_SUBTYPE_MC68030_ONLY has been added to allow new object - * files to be tagged as containing 68030-specific instructions. - */ - -#define CPU_SUBTYPE_MC680x0_ALL ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_MC68030 ((cpu_subtype_t) 1) /* compat */ -#define CPU_SUBTYPE_MC68040 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_MC68030_ONLY ((cpu_subtype_t) 3) - -/* - * I386 subtypes - */ - -#define CPU_SUBTYPE_INTEL(f, m) ((cpu_subtype_t) (f) + ((m) << 4)) - -#define CPU_SUBTYPE_I386_ALL CPU_SUBTYPE_INTEL(3, 0) -#define CPU_SUBTYPE_386 CPU_SUBTYPE_INTEL(3, 0) -#define CPU_SUBTYPE_486 CPU_SUBTYPE_INTEL(4, 0) -#define CPU_SUBTYPE_486SX CPU_SUBTYPE_INTEL(4, 8) // 8 << 4 = 128 -#define CPU_SUBTYPE_586 CPU_SUBTYPE_INTEL(5, 0) -#define CPU_SUBTYPE_PENT CPU_SUBTYPE_INTEL(5, 0) -#define CPU_SUBTYPE_PENTPRO CPU_SUBTYPE_INTEL(6, 1) -#define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3) -#define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5) -#define CPU_SUBTYPE_CELERON CPU_SUBTYPE_INTEL(7, 6) -#define CPU_SUBTYPE_CELERON_MOBILE CPU_SUBTYPE_INTEL(7, 7) -#define CPU_SUBTYPE_PENTIUM_3 CPU_SUBTYPE_INTEL(8, 0) -#define CPU_SUBTYPE_PENTIUM_3_M CPU_SUBTYPE_INTEL(8, 1) -#define CPU_SUBTYPE_PENTIUM_3_XEON CPU_SUBTYPE_INTEL(8, 2) -#define CPU_SUBTYPE_PENTIUM_M CPU_SUBTYPE_INTEL(9, 0) -#define CPU_SUBTYPE_PENTIUM_4 CPU_SUBTYPE_INTEL(10, 0) -#define CPU_SUBTYPE_PENTIUM_4_M CPU_SUBTYPE_INTEL(10, 1) -#define CPU_SUBTYPE_ITANIUM CPU_SUBTYPE_INTEL(11, 0) -#define CPU_SUBTYPE_ITANIUM_2 CPU_SUBTYPE_INTEL(11, 1) -#define CPU_SUBTYPE_XEON CPU_SUBTYPE_INTEL(12, 0) -#define CPU_SUBTYPE_XEON_MP CPU_SUBTYPE_INTEL(12, 1) - -#define CPU_SUBTYPE_INTEL_FAMILY(x) ((x) & 15) -#define CPU_SUBTYPE_INTEL_FAMILY_MAX 15 - -#define CPU_SUBTYPE_INTEL_MODEL(x) ((x) >> 4) -#define CPU_SUBTYPE_INTEL_MODEL_ALL 0 - -/* - * X86 subtypes. - */ - -#define CPU_SUBTYPE_X86_ALL ((cpu_subtype_t)3) -#define CPU_SUBTYPE_X86_64_ALL ((cpu_subtype_t)3) -#define CPU_SUBTYPE_X86_ARCH1 ((cpu_subtype_t)4) -#define CPU_SUBTYPE_X86_64_H ((cpu_subtype_t)8) /* Haswell feature subset */ - - -#define CPU_THREADTYPE_INTEL_HTT ((cpu_threadtype_t) 1) - -/* - * Mips subtypes. - */ - -#define CPU_SUBTYPE_MIPS_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_MIPS_R2300 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_MIPS_R2600 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_MIPS_R2800 ((cpu_subtype_t) 3) -#define CPU_SUBTYPE_MIPS_R2000a ((cpu_subtype_t) 4) /* pmax */ -#define CPU_SUBTYPE_MIPS_R2000 ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_MIPS_R3000a ((cpu_subtype_t) 6) /* 3max */ -#define CPU_SUBTYPE_MIPS_R3000 ((cpu_subtype_t) 7) - -/* - * MC98000 (PowerPC) subtypes - */ -#define CPU_SUBTYPE_MC98000_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_MC98601 ((cpu_subtype_t) 1) - -/* - * HPPA subtypes for Hewlett-Packard HP-PA family of - * risc processors. Port by NeXT to 700 series. - */ - -#define CPU_SUBTYPE_HPPA_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_HPPA_7100 ((cpu_subtype_t) 0) /* compat */ -#define CPU_SUBTYPE_HPPA_7100LC ((cpu_subtype_t) 1) - -/* - * MC88000 subtypes. - */ -#define CPU_SUBTYPE_MC88000_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_MC88100 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_MC88110 ((cpu_subtype_t) 2) - -/* - * SPARC subtypes - */ -#define CPU_SUBTYPE_SPARC_ALL ((cpu_subtype_t) 0) - -/* - * I860 subtypes - */ -#define CPU_SUBTYPE_I860_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_I860_860 ((cpu_subtype_t) 1) - -/* - * PowerPC subtypes - */ -#define CPU_SUBTYPE_POWERPC_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_POWERPC_601 ((cpu_subtype_t) 1) -#define CPU_SUBTYPE_POWERPC_602 ((cpu_subtype_t) 2) -#define CPU_SUBTYPE_POWERPC_603 ((cpu_subtype_t) 3) -#define CPU_SUBTYPE_POWERPC_603e ((cpu_subtype_t) 4) -#define CPU_SUBTYPE_POWERPC_603ev ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_POWERPC_604 ((cpu_subtype_t) 6) -#define CPU_SUBTYPE_POWERPC_604e ((cpu_subtype_t) 7) -#define CPU_SUBTYPE_POWERPC_620 ((cpu_subtype_t) 8) -#define CPU_SUBTYPE_POWERPC_750 ((cpu_subtype_t) 9) -#define CPU_SUBTYPE_POWERPC_7400 ((cpu_subtype_t) 10) -#define CPU_SUBTYPE_POWERPC_7450 ((cpu_subtype_t) 11) -#define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) - -/* - * ARM subtypes - */ -#define CPU_SUBTYPE_ARM_ALL ((cpu_subtype_t) 0) -#define CPU_SUBTYPE_ARM_V4T ((cpu_subtype_t) 5) -#define CPU_SUBTYPE_ARM_V6 ((cpu_subtype_t) 6) -#define CPU_SUBTYPE_ARM_V5TEJ ((cpu_subtype_t) 7) -#define CPU_SUBTYPE_ARM_XSCALE ((cpu_subtype_t) 8) -#define CPU_SUBTYPE_ARM_V7 ((cpu_subtype_t) 9) - -/* - * CPU families (sysctl hw.cpufamily) - * - * These are meant to identify the CPU's marketing name - an - * application can map these to (possibly) localized strings. - * NB: the encodings of the CPU families are intentionally arbitrary. - * There is no ordering, and you should never try to deduce whether - * or not some feature is available based on the family. - * Use feature flags (eg, hw.optional.altivec) to test for optional - * functionality. - */ -#define CPUFAMILY_UNKNOWN 0 -#define CPUFAMILY_POWERPC_G3 0xcee41549 -#define CPUFAMILY_POWERPC_G4 0x77c184ae -#define CPUFAMILY_POWERPC_G5 0xed76d8aa -#define CPUFAMILY_INTEL_6_13 0xaa33392b -#define CPUFAMILY_INTEL_YONAH 0x73d67300 -#define CPUFAMILY_INTEL_MEROM 0x426f69ef -#define CPUFAMILY_INTEL_PENRYN 0x78ea4fbc -#define CPUFAMILY_INTEL_NEHALEM 0x6b5a4cd2 -#define CPUFAMILY_INTEL_WESTMERE 0x573b5eec -#define CPUFAMILY_INTEL_SANDYBRIDGE 0x5490b78c -#define CPUFAMILY_ARM_9 0xe73283ae -#define CPUFAMILY_ARM_11 0x8ff620d8 -#define CPUFAMILY_ARM_XSCALE 0x53b005f5 -#define CPUFAMILY_ARM_13 0x0cc90e64 -#define CPUFAMILY_ARM_14 0x96077ef1 - -/* The following synonyms are deprecated: */ -#define CPUFAMILY_INTEL_6_14 CPUFAMILY_INTEL_YONAH -#define CPUFAMILY_INTEL_6_15 CPUFAMILY_INTEL_MEROM -#define CPUFAMILY_INTEL_6_23 CPUFAMILY_INTEL_PENRYN -#define CPUFAMILY_INTEL_6_26 CPUFAMILY_INTEL_NEHALEM - -#define CPUFAMILY_INTEL_CORE CPUFAMILY_INTEL_YONAH -#define CPUFAMILY_INTEL_CORE2 CPUFAMILY_INTEL_MEROM - - -#endif /* _MACH_MACHINE_H_ */ diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h b/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h deleted file mode 100644 index d1ab56ad5..000000000 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank */ diff --git a/shared/sentry/external/crashpad/build/BUILD.gn b/shared/sentry/external/crashpad/build/BUILD.gn deleted file mode 100644 index ce0525acf..000000000 --- a/shared/sentry/external/crashpad/build/BUILD.gn +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright 2017 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# When building in Chromium, these configs is used to set #defines that indicate -# whether code is being built standalone, or in Chromium, or potentially in some -# other configutation. - -import("crashpad_buildconfig.gni") - -config("crashpad_is_in_chromium") { - if (crashpad_is_in_chromium) { - defines = [ "CRASHPAD_IS_IN_CHROMIUM" ] - } -} - -config("crashpad_is_in_fuchsia") { - if (crashpad_is_in_fuchsia) { - defines = [ "CRASHPAD_IS_IN_FUCHSIA" ] - } -} - -group("default_exe_manifest_win") { - if (crashpad_is_in_chromium) { - deps = [ "//build/win:default_exe_manifest" ] - } -} - -config("crashpad_fuzzer_flags") { - cflags = [ - "-fsanitize=address", - "-fsanitize-address-use-after-scope", - "-fsanitize=fuzzer", - ] - - ldflags = [ "-fsanitize=address" ] -} - -if (crashpad_is_ios) { - group("ios_enable_arc") { - if (crashpad_is_in_chromium) { - public_configs = [ "//build/config/compiler:enable_arc" ] - } else if (crashpad_is_standalone) { - public_configs = - [ "//third_party/mini_chromium/mini_chromium/build/config:ios_enable_arc" ] - } - } - - group("ios_xctest") { - if (crashpad_is_in_chromium) { - public_configs = [ "//build/config/ios:xctest_config" ] - } else if (crashpad_is_standalone) { - public_configs = [ - "//third_party/mini_chromium/mini_chromium/build/ios:xctest_config", - ] - } - } -} diff --git a/shared/sentry/external/crashpad/build/BUILDCONFIG.gn b/shared/sentry/external/crashpad/build/BUILDCONFIG.gn deleted file mode 100644 index f2ea1cb9d..000000000 --- a/shared/sentry/external/crashpad/build/BUILDCONFIG.gn +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright 2017 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Intentionally very minimal, so that Crashpad can build in-tree in a variety of -# other projects, unrelated to the variables that are set in those projects' -# BUILDCONFIG.gn. Do not add more variables here. Instead, make them available -# in build/crashpad_buildconfig.gni if they must be globally available. - -if (target_os == "") { - target_os = host_os -} - -if (current_os == "") { - current_os = target_os -} - -if (target_cpu == "") { - target_cpu = host_cpu -} - -if (current_cpu == "") { - current_cpu = target_cpu -} - -import("//build/crashpad_buildconfig.gni") - -if (crashpad_is_standalone) { - _mini_chromium_dir = "//third_party/mini_chromium/mini_chromium" -} else if (crashpad_is_external) { - _mini_chromium_dir = "//../../mini_chromium/mini_chromium" -} - -if (current_os == "win") { - set_default_toolchain( - "$_mini_chromium_dir/build/config:msvc_toolchain_$current_cpu") -} else { - set_default_toolchain("$_mini_chromium_dir/build/config:gcc_like_toolchain") -} - -declare_args() { - # When true, enables the debug configuration, with additional run-time checks - # and logging. When false, enables the release configuration, with additional - # optimizations. - is_debug = false - - # When true, build all code with -fsanitize=fuzzer, and enable various - # *_fuzzer targets. - crashpad_use_libfuzzer = false -} - -_default_configs = [ - "$_mini_chromium_dir/build/config:default", - "$_mini_chromium_dir/build/config:Wexit_time_destructors", - "$_mini_chromium_dir/build/config:Wimplicit_fallthrough", -] - -if (crashpad_use_libfuzzer) { - _default_configs += [ "//build/config:crashpad_fuzzer_flags" ] -} - -_default_executable_configs = _default_configs + [ - "$_mini_chromium_dir/build/config:executable", - "$_mini_chromium_dir/build/config:win_console", - ] - -set_defaults("source_set") { - configs = _default_configs -} - -set_defaults("static_library") { - configs = _default_configs -} - -set_defaults("executable") { - configs = _default_executable_configs -} - -set_defaults("loadable_module") { - configs = _default_configs -} - -set_defaults("shared_library") { - configs = _default_configs -} - -set_defaults("test") { - configs = _default_executable_configs -} diff --git a/shared/sentry/external/crashpad/build/crashpad_buildconfig.gni b/shared/sentry/external/crashpad/build/crashpad_buildconfig.gni deleted file mode 100644 index 6269637ee..000000000 --- a/shared/sentry/external/crashpad/build/crashpad_buildconfig.gni +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2017 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -declare_args() { - # Determines various flavors of build configuration, and which concrete - # targets to use for dependencies. Valid values are "standalone", "chromium", - # "fuchsia", "dart" or "external". - crashpad_dependencies = "standalone" - - if (defined(is_fuchsia_tree) && is_fuchsia_tree) { - crashpad_dependencies = "fuchsia" - } -} - -assert( - crashpad_dependencies == "chromium" || crashpad_dependencies == "fuchsia" || - crashpad_dependencies == "standalone" || - crashpad_dependencies == "external" || crashpad_dependencies == "dart") - -crashpad_is_in_chromium = crashpad_dependencies == "chromium" -crashpad_is_in_fuchsia = crashpad_dependencies == "fuchsia" -crashpad_is_in_dart = crashpad_dependencies == "dart" -crashpad_is_external = crashpad_dependencies == "external" -crashpad_is_standalone = crashpad_dependencies == "standalone" - -# This is the parent directory that contains the mini_chromium source dir. -# This variable is not used when crashpad_is_in_chromium. -if (crashpad_is_in_fuchsia) { - mini_chromium_source_parent = "//third_party/crashpad/third_party/mini_chromium" -} else { - mini_chromium_source_parent = "../third_party/mini_chromium" -} - -# This is the source directory of mini_chromium (what is checked out). -_mini_chromium_source_root = "$mini_chromium_source_parent/mini_chromium" - -# This references the mini_chromium location for importing GN files. -if (crashpad_is_external || crashpad_is_in_dart) { - mini_chromium_import_root = "../../../$_mini_chromium_source_root" -} else if (crashpad_is_in_fuchsia) { - mini_chromium_import_root = "//third_party/mini_chromium" -} else { - mini_chromium_import_root = _mini_chromium_source_root -} - -if (crashpad_is_in_chromium) { - crashpad_is_mac = is_mac - crashpad_is_ios = is_ios - crashpad_is_win = is_win - crashpad_is_linux = is_linux || is_chromeos - crashpad_is_android = is_android - crashpad_is_fuchsia = is_fuchsia - - crashpad_is_posix = is_posix - - crashpad_is_clang = is_clang -} else { - import("$mini_chromium_import_root/build/compiler.gni") - import("$mini_chromium_import_root/build/platform.gni") - - crashpad_is_mac = mini_chromium_is_mac - crashpad_is_ios = mini_chromium_is_ios - crashpad_is_win = mini_chromium_is_win - crashpad_is_linux = mini_chromium_is_linux - crashpad_is_android = mini_chromium_is_android - crashpad_is_fuchsia = mini_chromium_is_fuchsia - - crashpad_is_posix = mini_chromium_is_posix - - crashpad_is_clang = mini_chromium_is_clang -} - -template("crashpad_executable") { - executable(target_name) { - forward_variables_from(invoker, - "*", - [ - "configs", - "remove_configs", - ]) - if (defined(invoker.remove_configs)) { - configs -= invoker.remove_configs - } - - if (defined(invoker.configs)) { - configs += invoker.configs - } - - if (crashpad_is_in_fuchsia) { - conversion_config = [ "//build/config:Wno-conversion" ] - if (configs + conversion_config - conversion_config == configs) { - # TODO(https://fxbug.dev/58162): Decide if these are worth enabling. - configs += conversion_config - } - } - } -} - -template("crashpad_loadable_module") { - loadable_module(target_name) { - forward_variables_from(invoker, - "*", - [ - "configs", - "remove_configs", - ]) - if (defined(invoker.remove_configs)) { - configs -= invoker.remove_configs - } - - if (defined(invoker.configs)) { - configs += invoker.configs - } - - if (crashpad_is_in_fuchsia) { - conversion_config = [ "//build/config:Wno-conversion" ] - if (configs + conversion_config - conversion_config == configs) { - # TODO(https://fxbug.dev/58162): Decide if these are worth enabling. - configs += conversion_config - } - } - } -} - -template("crashpad_static_library") { - static_library(target_name) { - forward_variables_from(invoker, - "*", - [ - "configs", - "remove_configs", - ]) - if (defined(invoker.remove_configs)) { - configs -= invoker.remove_configs - } - - if (defined(invoker.configs)) { - configs += invoker.configs - } - - if (crashpad_is_in_fuchsia) { - conversion_config = [ "//build/config:Wno-conversion" ] - if (configs + conversion_config - conversion_config == configs) { - # TODO(https://fxbug.dev/58162): Decide if these are worth enabling. - configs += conversion_config - } - } - } -} diff --git a/shared/sentry/external/crashpad/build/crashpad_fuzzer_test.gni b/shared/sentry/external/crashpad/build/crashpad_fuzzer_test.gni deleted file mode 100644 index 3c5be1851..000000000 --- a/shared/sentry/external/crashpad/build/crashpad_fuzzer_test.gni +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2018 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("crashpad_buildconfig.gni") -import("test.gni") -if (crashpad_is_in_chromium) { - import("//testing/libfuzzer/fuzzer_test.gni") -} - -template("crashpad_fuzzer_test") { - if (crashpad_is_standalone && crashpad_use_libfuzzer) { - test(target_name) { - forward_variables_from(invoker, - [ - "cflags", - "cflags_cc", - "check_includes", - "defines", - "include_dirs", - "sources", - ]) - configs += [ "..:crashpad_config" ] - if (defined(invoker.deps)) { - deps = invoker.deps - } - deps += [ "../third_party/libfuzzer" ] - - if (!defined(invoker.cflags)) { - cflags = [] - } - cflags += [ "-fsanitize=fuzzer" ] - } - if (defined(invoker.seed_corpus)) { - not_needed(invoker, [ "seed_corpus" ]) - } - } else if (crashpad_is_in_chromium && use_fuzzing_engine) { - # Append "crashpad_" to the beginning of the fuzzer's name to make it easier - # in Chromium to recognize where fuzzer came from. - forward_variables_from(invoker, "*") - fuzzer_test("crashpad_" + target_name) { - } - } else { - not_needed(invoker, "*") - group(target_name) { - } - } -} diff --git a/shared/sentry/external/crashpad/build/install_linux_sysroot.py b/shared/sentry/external/crashpad/build/install_linux_sysroot.py deleted file mode 100755 index 287d5c9d7..000000000 --- a/shared/sentry/external/crashpad/build/install_linux_sysroot.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2018 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Various code adapted from: -# https://cs.chromium.org/chromium/src/build/linux/sysroot_scripts/install-sysroot.py - -import os -import shutil -import subprocess -import sys -import urllib.request - -SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) - -# Sysroot revision from: -# https://cs.chromium.org/chromium/src/build/linux/sysroot_scripts/sysroots.json -SERVER = 'https://commondatastorage.googleapis.com' -PATH = 'chrome-linux-sysroot/toolchain' -REVISION = '43a87bbebccad99325fdcf34166295b121ee15c7' -FILENAME = 'debian_sid_amd64_sysroot.tar.xz' - - -def main(): - url = '%s/%s/%s/%s' % (SERVER, PATH, REVISION, FILENAME) - - sysroot = os.path.join(SCRIPT_DIR, os.pardir, 'third_party', 'linux', - 'sysroot') - - stamp = os.path.join(sysroot, '.stamp') - if os.path.exists(stamp): - with open(stamp) as s: - if s.read() == url: - return - - print('Installing Debian root image from %s' % url) - - if os.path.isdir(sysroot): - shutil.rmtree(sysroot) - os.mkdir(sysroot) - tarball = os.path.join(sysroot, FILENAME) - print('Downloading %s' % url) - - for _ in range(3): - response = urllib.request.urlopen(url) - with open(tarball, 'wb') as f: - f.write(response.read()) - break - else: - raise Exception('Failed to download %s' % url) - - subprocess.check_call(['tar', 'xf', tarball, '-C', sysroot]) - - os.remove(tarball) - - with open(stamp, 'w') as s: - s.write(url) - - -if __name__ == '__main__': - main() - sys.exit(0) diff --git a/shared/sentry/external/crashpad/build/ios/Default.png b/shared/sentry/external/crashpad/build/ios/Default.png deleted file mode 100644 index ca857795bf313dfc8005de2a0cc4050356ade305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 624 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sU@2e(3NQqHxv>^Vv7|ftIx;Y9?C1WI$O_~u zBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1iF!Z_gM4t>j@+_&xoa&~0``kA7DT5w2FJ zg#n`!X+cnbi1Fm%jT=&e^JIV_u3F+6QIe8al4_M)lnSI6j0}v7bq$Pk4GlsJ%&d&f ztc=XG4GgRd3@%Iky@R45H$NpatrAm%0aU|-Bqv#*21$?&!TD(=<%vb942~)JNvR5+ cxryniL8*x;m4zo$LCJu@)78&qol`;+0EH~AumAu6 diff --git a/shared/sentry/external/crashpad/build/ios/Unittest-Info.plist b/shared/sentry/external/crashpad/build/ios/Unittest-Info.plist deleted file mode 100644 index fdca91fb1..000000000 --- a/shared/sentry/external/crashpad/build/ios/Unittest-Info.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - CFBundleIdentifier - ${IOS_BUNDLE_ID_PREFIX}.googletest.${GTEST_BUNDLE_ID_SUFFIX:rfc1034identifier} - UIApplicationDelegate - CrashpadUnitTestDelegate - - diff --git a/shared/sentry/external/crashpad/build/ios/convert_gn_xcodeproj.py b/shared/sentry/external/crashpad/build/ios/convert_gn_xcodeproj.py deleted file mode 100755 index 71b8d3d28..000000000 --- a/shared/sentry/external/crashpad/build/ios/convert_gn_xcodeproj.py +++ /dev/null @@ -1,559 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2020 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Convert GN Xcode projects to platform and configuration independent targets. - -GN generates Xcode projects that build one configuration only. However, typical -iOS development involves using the Xcode IDE to toggle the platform and -configuration. This script replaces the 'gn' configuration with 'Debug', -'Release' and 'Profile', and changes the ninja invocation to honor these -configurations. -""" - -import argparse -import collections -import copy -import filecmp -import functools -import hashlib -import io -import json -import os -import re -import shutil -import string -import subprocess -import sys -import tempfile -import xml.etree.ElementTree - - -LLDBINIT_PATH = '$(PROJECT_DIR)/.lldbinit' - -PYTHON_RE = re.compile('[ /]python[23]?$') - -XCTEST_PRODUCT_TYPES = frozenset(( - 'com.apple.product-type.bundle.unit-test', - 'com.apple.product-type.bundle.ui-testing', -)) - -SCHEME_PRODUCT_TYPES = frozenset(( - 'com.apple.product-type.app-extension', - 'com.apple.product-type.application', - 'com.apple.product-type.framework' -)) - - -class Template(string.Template): - - """A subclass of string.Template that changes delimiter.""" - - delimiter = '@' - - -@functools.lru_cache -def LoadSchemeTemplate(root, name): - """Return a string.Template object for scheme file loaded relative to root.""" - path = os.path.join(root, 'build', 'ios', name + '.template') - with open(path) as file: - return Template(file.read()) - - -def CreateIdentifier(str_id): - """Return a 24 characters string that can be used as an identifier.""" - return hashlib.sha1(str_id.encode("utf-8")).hexdigest()[:24].upper() - - -def GenerateSchemeForTarget(root, project, old_project, name, path, is_test): - """Generates the .xcsheme file for target named |name|. - - The file is generated in the new project schemes directory from a template. - If there is an existing previous project, then the old scheme file is copied - and the lldbinit setting is set. If lldbinit setting is already correct, the - file is not modified, just copied. - """ - project_name = os.path.basename(project) - relative_path = os.path.join('xcshareddata', 'xcschemes', name + '.xcscheme') - identifier = CreateIdentifier('%s %s' % (name, path)) - - scheme_path = os.path.join(project, relative_path) - if not os.path.isdir(os.path.dirname(scheme_path)): - os.makedirs(os.path.dirname(scheme_path)) - - substitutions = { - 'LLDBINIT_PATH': LLDBINIT_PATH, - 'BLUEPRINT_IDENTIFIER': identifier, - 'BUILDABLE_NAME': path, - 'BLUEPRINT_NAME': name, - 'PROJECT_NAME': project_name - } - - if is_test: - template = LoadSchemeTemplate(root, 'xcodescheme-testable') - substitutions['PATH'] = os.environ['PATH'] - - else: - template = LoadSchemeTemplate(root, 'xcodescheme') - - old_scheme_path = os.path.join(old_project, relative_path) - if os.path.exists(old_scheme_path): - - tree = xml.etree.ElementTree.parse(old_scheme_path) - tree_root = tree.getroot() - - for reference in tree_root.findall('.//BuildableReference'): - for (attr, value) in ( - ('BuildableName', path), - ('BlueprintName', name), - ('BlueprintIdentifier', identifier)): - if reference.get(attr) != value: - reference.set(attr, value) - - for child in tree_root: - if child.tag not in ('TestAction', 'LaunchAction'): - continue - - if child.get('customLLDBInitFile') != LLDBINIT_PATH: - child.set('customLLDBInitFile', LLDBINIT_PATH) - - if is_test: - - template_tree = xml.etree.ElementTree.parse( - io.StringIO(template.substitute(**substitutions))) - - template_tree_root = template_tree.getroot() - for child in tree_root: - if child.tag != 'BuildAction': - continue - - for subchild in list(child): - child.remove(subchild) - - for post_action in template_tree_root.findall('.//PostActions'): - child.append(post_action) - - tree.write(scheme_path, xml_declaration=True, encoding='UTF-8') - - else: - - with open(scheme_path, 'w') as scheme_file: - scheme_file.write(template.substitute(**substitutions)) - - -class XcodeProject(object): - - def __init__(self, objects, counter = 0): - self.objects = objects - self.counter = 0 - - def AddObject(self, parent_name, obj): - while True: - self.counter += 1 - str_id = "%s %s %d" % (parent_name, obj['isa'], self.counter) - new_id = CreateIdentifier(str_id) - - # Make sure ID is unique. It's possible there could be an id conflict - # since this is run after GN runs. - if new_id not in self.objects: - self.objects[new_id] = obj - return new_id - - def IterObjectsByIsa(self, isa): - """Iterates overs objects of the |isa| type.""" - for key, obj in self.objects.items(): - if obj['isa'] == isa: - yield (key, obj) - - def IterNativeTargetByProductType(self, product_types): - """Iterates over PBXNativeTarget objects of any |product_types| types.""" - for key, obj in self.IterObjectsByIsa('PBXNativeTarget'): - if obj['productType'] in product_types: - yield (key, obj) - - def UpdateBuildScripts(self): - """Update build scripts to respect configuration and platforms.""" - for key, obj in self.IterObjectsByIsa('PBXShellScriptBuildPhase'): - - shell_path = obj['shellPath'] - shell_code = obj['shellScript'] - if shell_path.endswith('/sh'): - shell_code = shell_code.replace( - 'ninja -C .', - 'ninja -C "../${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}"') - elif PYTHON_RE.search(shell_path): - shell_code = shell_code.replace( - '''ninja_params = [ '-C', '.' ]''', - '''ninja_params = [ '-C', '../' + os.environ['CONFIGURATION']''' - ''' + os.environ['EFFECTIVE_PLATFORM_NAME'] ]''') - - # Replace the build script in the object. - obj['shellScript'] = shell_code - - - def UpdateBuildConfigurations(self, configurations): - """Add new configurations, using the first one as default.""" - - # Create a list with all the objects of interest. This is needed - # because objects will be added to/removed from the project upon - # iterating this list and python dictionaries cannot be mutated - # during iteration. - - for key, obj in list(self.IterObjectsByIsa('XCConfigurationList')): - # Use the first build configuration as template for creating all the - # new build configurations. - build_config_template = self.objects[obj['buildConfigurations'][0]] - build_config_template['buildSettings']['CONFIGURATION_BUILD_DIR'] = \ - '$(PROJECT_DIR)/../$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)' - - # Remove the existing build configurations from the project before - # creating the new ones. - for build_config_id in obj['buildConfigurations']: - del self.objects[build_config_id] - obj['buildConfigurations'] = [] - - for configuration in configurations: - build_config = copy.copy(build_config_template) - build_config['name'] = configuration - build_config_id = self.AddObject('products', build_config) - obj['buildConfigurations'].append(build_config_id) - - def GetHostMappingForXCTests(self): - """Returns a dict from targets to the list of their xctests modules.""" - mapping = collections.defaultdict(list) - for key, obj in self.IterNativeTargetByProductType(XCTEST_PRODUCT_TYPES): - build_config_lists_id = obj['buildConfigurationList'] - build_configs = self.objects[build_config_lists_id]['buildConfigurations'] - - # Use the first build configuration to get the name of the host target. - # This is arbitrary, but since the build configuration are all identical - # after UpdateBuildConfiguration, except for their 'name', it is fine. - build_config = self.objects[build_configs[0]] - if obj['productType'] == 'com.apple.product-type.bundle.unit-test': - # The test_host value will look like this: - # `$(BUILD_PRODUCTS_DIR)/host_app_name.app/host_app_name` - # - # Extract the `host_app_name.app` part as key for the output. - test_host_path = build_config['buildSettings']['TEST_HOST'] - test_host_name = os.path.basename(os.path.dirname(test_host_path)) - else: - test_host_name = build_config['buildSettings']['TEST_TARGET_NAME'] - - test_name = obj['name'] - test_path = self.objects[obj['productReference']]['path'] - - mapping[test_host_name].append((key, test_name, test_path)) - - return dict(mapping) - - -def check_output(command): - """Wrapper around subprocess.check_output that decode output as utf-8.""" - return subprocess.check_output(command).decode('utf-8') - - -def CopyFileIfChanged(source_path, target_path): - """Copy |source_path| to |target_path| if different.""" - target_dir = os.path.dirname(target_path) - if not os.path.isdir(target_dir): - os.makedirs(target_dir) - if not os.path.exists(target_path) or \ - not filecmp.cmp(source_path, target_path): - shutil.copyfile(source_path, target_path) - - -def CopyTreeIfChanged(source, target): - """Copy |source| to |target| recursively; files are copied iff changed.""" - if os.path.isfile(source): - return CopyFileIfChanged(source, target) - if not os.path.isdir(target): - os.makedirs(target) - for name in os.listdir(source): - CopyTreeIfChanged( - os.path.join(source, name), - os.path.join(target, name)) - - -def LoadXcodeProjectAsJSON(project_dir): - """Return Xcode project at |path| as a JSON string.""" - return check_output([ - 'plutil', '-convert', 'json', '-o', '-', - os.path.join(project_dir, 'project.pbxproj')]) - - -def WriteXcodeProject(output_path, json_string): - """Save Xcode project to |output_path| as XML.""" - with tempfile.NamedTemporaryFile() as temp_file: - temp_file.write(json_string.encode("utf-8")) - temp_file.flush() - subprocess.check_call(['plutil', '-convert', 'xml1', temp_file.name]) - CopyFileIfChanged( - temp_file.name, - os.path.join(output_path, 'project.pbxproj')) - - -def UpdateXcodeProject(project_dir, old_project_dir, configurations, root_dir): - """Update inplace Xcode project to support multiple configurations. - - Args: - project_dir: path to the input Xcode project - configurations: list of string corresponding to the configurations that - need to be supported by the tweaked Xcode projects, must contains at - least one value. - root_dir: path to the root directory used to find markdown files - """ - json_data = json.loads(LoadXcodeProjectAsJSON(project_dir)) - project = XcodeProject(json_data['objects']) - - project.UpdateBuildScripts() - project.UpdateBuildConfigurations(configurations) - - mapping = project.GetHostMappingForXCTests() - - # Generate schemes for application, extensions and framework targets - for key, obj in project.IterNativeTargetByProductType(SCHEME_PRODUCT_TYPES): - product = project.objects[obj['productReference']] - product_path = product['path'] - - # Do not generate scheme for the XCTests and XXCUITests target app. - # Instead, a scheme will be generated for each test modules. - tests = mapping.get(product_path, []) + mapping.get(obj['name'], []) - if not tests: - GenerateSchemeForTarget( - root_dir, project_dir, old_project_dir, - obj['name'], product_path, False) - - else: - for (_, test_name, test_path) in tests: - GenerateSchemeForTarget( - root_dir, project_dir, old_project_dir, - test_name, test_path, True) - - root_object = project.objects[json_data['rootObject']] - main_group = project.objects[root_object['mainGroup']] - - sources = None - for child_key in main_group['children']: - child = project.objects[child_key] - if child.get('name') == 'Source' or child.get('name') == 'Sources': - sources = child - break - - if sources is None: - sources = main_group - - AddMarkdownToProject(project, root_dir, sources, sources is main_group) - SortFileReferencesByName(project, sources, root_object.get('productRefGroup')) - - objects = collections.OrderedDict(sorted(project.objects.items())) - # WriteXcodeProject(project_dir, json.dumps(json_data)) - - -def CreateGroup(project, parent_group, group_name, use_relative_paths): - group_object = { - 'children': [], - 'isa': 'PBXGroup', - 'sourceTree': '', - } - if use_relative_paths: - group_object['path'] = group_name - else: - group_object['name'] = group_name - parent_group_name = parent_group.get('name', '') - group_object_key = project.AddObject(parent_group_name, group_object) - parent_group['children'].append(group_object_key) - return group_object - - -class ObjectKey(object): - - """Wrapper around PBXFileReference and PBXGroup for sorting. - - A PBXGroup represents a "directory" containing a list of files in an - Xcode project; it can contain references to a list of directories or - files. - - A PBXFileReference represents a "file". - - The type is stored in the object "isa" property as a string. Since we - want to sort all directories before all files, the < and > operators - are defined so that if "isa" is different, they are sorted in the - reverse of alphabetic ordering, otherwise the name (or path) property - is checked and compared in alphabetic order. - """ - - def __init__(self, obj, last): - self.isa = obj['isa'] - if 'name' in obj: - self.name = obj['name'] - else: - self.name = obj['path'] - self.last = last - - def __lt__(self, other): - if self.last != other.last: - return other.last - if self.isa != other.isa: - return self.isa > other.isa - return self.name < other.name - - def __gt__(self, other): - if self.last != other.last: - return self.last - if self.isa != other.isa: - return self.isa < other.isa - return self.name > other.name - - def __eq__(self, other): - return self.isa == other.isa and self.name == other.name - - -def SortFileReferencesByName(project, group_object, products_group_ref): - SortFileReferencesByNameWithSortKey( - project, group_object, - lambda ref: ObjectKey(project.objects[ref], ref == products_group_ref)) - - -def SortFileReferencesByNameWithSortKey(project, group_object, sort_key): - group_object['children'].sort(key=sort_key) - for key in group_object['children']: - child = project.objects[key] - if child['isa'] == 'PBXGroup': - SortFileReferencesByNameWithSortKey(project, child, sort_key) - - -def AddMarkdownToProject(project, root_dir, group_object, use_relative_paths): - list_files_cmd = ['git', '-C', root_dir, 'ls-files', '*.md'] - paths = check_output(list_files_cmd).splitlines() - ios_internal_dir = os.path.join(root_dir, 'ios_internal') - if os.path.exists(ios_internal_dir): - list_files_cmd = ['git', '-C', ios_internal_dir, 'ls-files', '*.md'] - ios_paths = check_output(list_files_cmd).splitlines() - paths.extend([os.path.join("ios_internal", path) for path in ios_paths]) - for path in paths: - new_markdown_entry = { - "fileEncoding": "4", - "isa": "PBXFileReference", - "lastKnownFileType": "net.daringfireball.markdown", - "sourceTree": "" - } - if use_relative_paths: - new_markdown_entry['path'] = os.path.basename(path) - else: - new_markdown_entry['name'] = os.path.basename(path) - new_markdown_entry['path'] = path - folder = GetFolderForPath( - project, group_object, os.path.dirname(path), - use_relative_paths) - folder_name = folder.get('name', None) - if folder_name is None: - folder_name = folder.get('path', 'sources') - new_markdown_entry_id = project.AddObject(folder_name, new_markdown_entry) - folder['children'].append(new_markdown_entry_id) - - -def GetFolderForPath(project, group_object, path, use_relative_paths): - objects = project.objects - if not path: - return group_object - for folder in path.split('/'): - children = group_object['children'] - new_root = None - for child_key in children: - child = objects[child_key] - if child['isa'] == 'PBXGroup': - child_name = child.get('name', None) - if child_name is None: - child_name = child.get('path') - if child_name == folder: - new_root = child - break - if not new_root: - # If the folder isn't found we could just cram it into the leaf existing - # folder, but that leads to folders with tons of README.md inside. - new_root = CreateGroup(project, group_object, folder, use_relative_paths) - group_object = new_root - return group_object - - -def ConvertGnXcodeProject(root_dir, proj_name, input_dir, output_dir, configs): - '''Tweak the Xcode project generated by gn to support multiple configurations. - - The Xcode projects generated by "gn gen --ide" only supports a single - platform and configuration (as the platform and configuration are set - per output directory). This method takes as input such projects and - add support for multiple configurations and platforms (to allow devs - to select them in Xcode). - - Args: - root_dir: directory that is the root of the project - proj_name: name of the Xcode project "file" (usually `all.xcodeproj`) - input_dir: directory containing the XCode projects created by "gn gen --ide" - output_dir: directory where the tweaked Xcode projects will be saved - configs: list of string corresponding to the configurations that need to be - supported by the tweaked Xcode projects, must contains at least one - value. - ''' - - UpdateXcodeProject( - os.path.join(input_dir, proj_name), - os.path.join(output_dir, proj_name), - configs, root_dir) - - CopyTreeIfChanged(os.path.join(input_dir, proj_name), - os.path.join(output_dir, proj_name)) - - -def Main(args): - parser = argparse.ArgumentParser( - description='Convert GN Xcode projects for iOS.') - parser.add_argument( - 'input', - help='directory containing [product|all] Xcode projects.') - parser.add_argument( - 'output', - help='directory where to generate the iOS configuration.') - parser.add_argument( - '--add-config', dest='configurations', default=[], action='append', - help='configuration to add to the Xcode project') - parser.add_argument( - '--root', type=os.path.abspath, required=True, - help='root directory of the project') - parser.add_argument( - '--project-name', default='all.xcodeproj', dest='proj_name', - help='name of the Xcode project (default: %(default)s)') - args = parser.parse_args(args) - - if not os.path.isdir(args.input): - sys.stderr.write('Input directory does not exists.\n') - return 1 - - if args.proj_name not in os.listdir(args.input): - sys.stderr.write( - 'Input directory does not contain the Xcode project.\n') - return 1 - - if not args.configurations: - sys.stderr.write('At least one configuration required, see --add-config.\n') - return 1 - - ConvertGnXcodeProject( - args.root, - args.proj_name, - args.input, - args.output, - args.configurations) - -if __name__ == '__main__': - sys.exit(Main(sys.argv[1:])) diff --git a/shared/sentry/external/crashpad/build/ios/setup_ios_gn.config b/shared/sentry/external/crashpad/build/ios/setup_ios_gn.config deleted file mode 100644 index 4e8a1371d..000000000 --- a/shared/sentry/external/crashpad/build/ios/setup_ios_gn.config +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2020 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -[goma] -# Controls whether goma is enabled or not. If you generally use goma but -# want to disable goma for a single build, consider using the environment -# variable GOMA_DISABLED. -enabled = False -install = "$GOMA_DIR" - -[xcode] -# Controls settings for the generated Xcode project. If jobs is non-zero -# it will be passed to the ninja invocation in Xcode project. -jobs = 0 - -[build] -# Controls the build output. The only supported values are "64-bit", "32-bit" -# and "fat" (for a fat binary supporting both "32-bit" and "64-bit" cpus). -arch = "64-bit" - -[gn_args] -# Values in that section will be copied verbatim in the generated args.gn file. -target_os = "ios" - -[filters] -# List of target files to pass to --filters argument of gn gen when generating -# the Xcode project. By default, list all targets from ios/ and ios_internal/ -# and the targets corresponding to the unit tests run on the bots. diff --git a/shared/sentry/external/crashpad/build/ios/setup_ios_gn.py b/shared/sentry/external/crashpad/build/ios/setup_ios_gn.py deleted file mode 100755 index 7043f8377..000000000 --- a/shared/sentry/external/crashpad/build/ios/setup_ios_gn.py +++ /dev/null @@ -1,404 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2020 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import configparser -import convert_gn_xcodeproj -import errno -import io -import os -import platform -import re -import shutil -import subprocess -import sys -import tempfile - - -SUPPORTED_TARGETS = ('iphoneos', 'iphonesimulator', 'maccatalyst') -SUPPORTED_CONFIGS = ('Debug', 'Release', 'Profile', 'Official') - -# Pattern matching lines from ~/.lldbinit that must not be copied to the -# generated .lldbinit file. They match what the user were told to add to -# their global ~/.lldbinit file before setup-gn.py was updated to generate -# a project specific file and thus must not be copied as they would cause -# the settings to be overwritten. -LLDBINIT_SKIP_PATTERNS = ( - re.compile('^script sys.path\\[:0\\] = \\[\'.*/src/tools/lldb\'\\]$'), - re.compile('^script import lldbinit$'), - re.compile('^settings append target.source-map .* /google/src/.*$'), -) - - -def HostCpuArch(): - '''Returns the arch of the host cpu for GN.''' - HOST_CPU_ARCH = { - 'arm64': '"arm64"', - 'x86_64': '"x64"', - } - return HOST_CPU_ARCH[platform.machine()] - - -class ConfigParserWithStringInterpolation(configparser.ConfigParser): - - '''A .ini file parser that supports strings and environment variables.''' - - ENV_VAR_PATTERN = re.compile(r'\$([A-Za-z0-9_]+)') - - def values(self, section): - return filter( - lambda val: val != '', - map(lambda kv: self._UnquoteString(self._ExpandEnvVar(kv[1])), - configparser.ConfigParser.items(self, section))) - - def getstring(self, section, option, fallback=''): - try: - raw_value = self.get(section, option) - except configparser.NoOptionError: - return fallback - return self._UnquoteString(self._ExpandEnvVar(raw_value)) - - def _UnquoteString(self, string): - if not string or string[0] != '"' or string[-1] != '"': - return string - return string[1:-1] - - def _ExpandEnvVar(self, value): - match = self.ENV_VAR_PATTERN.search(value) - if not match: - return value - name, (begin, end) = match.group(1), match.span(0) - prefix, suffix = value[:begin], self._ExpandEnvVar(value[end:]) - return prefix + os.environ.get(name, '') + suffix - - -class GnGenerator(object): - - '''Holds configuration for a build and method to generate gn default files.''' - - FAT_BUILD_DEFAULT_ARCH = '64-bit' - - TARGET_CPU_VALUES = { - 'iphoneos': '"arm64"', - 'iphonesimulator': HostCpuArch(), - 'maccatalyst': HostCpuArch(), - } - - TARGET_ENVIRONMENT_VALUES = { - 'iphoneos': '"device"', - 'iphonesimulator': '"simulator"', - 'maccatalyst': '"catalyst"' - } - - def __init__(self, settings, config, target): - assert target in SUPPORTED_TARGETS - assert config in SUPPORTED_CONFIGS - self._settings = settings - self._config = config - self._target = target - - def _GetGnArgs(self): - """Build the list of arguments to pass to gn. - - Returns: - A list of tuple containing gn variable names and variable values (it - is not a dictionary as the order needs to be preserved). - """ - args = [] - - is_debug = self._config == 'Debug' - official = self._config == 'Official' - is_optim = self._config in ('Profile', 'Official') - - args.append(('target_os', '"ios"')) - args.append(('is_debug', is_debug)) - - if os.environ.get('FORCE_MAC_TOOLCHAIN', '0') == '1': - args.append(('use_system_xcode', False)) - - args.append(('target_cpu', self.TARGET_CPU_VALUES[self._target])) - args.append(( - 'target_environment', - self.TARGET_ENVIRONMENT_VALUES[self._target])) - - # Add user overrides after the other configurations so that they can - # refer to them and override them. - args.extend(self._settings.items('gn_args')) - return args - - - def Generate(self, gn_path, proj_name, root_path, build_dir): - self.WriteArgsGn(build_dir, xcode_project_name=proj_name) - subprocess.check_call(self.GetGnCommand( - gn_path, root_path, build_dir, xcode_project_name=proj_name)) - - def CreateGnRules(self, gn_path, root_path, build_dir): - gn_command = self.GetGnCommand(gn_path, root_path, build_dir) - self.WriteArgsGn(build_dir) - self.WriteBuildNinja(gn_command, build_dir) - self.WriteBuildNinjaDeps(build_dir) - - def WriteArgsGn(self, build_dir, xcode_project_name=None): - with open(os.path.join(build_dir, 'args.gn'), 'w') as stream: - stream.write('# This file was generated by setup-gn.py. Do not edit\n') - stream.write('# but instead use ~/.setup-gn or $repo/.setup-gn files\n') - stream.write('# to configure settings.\n') - stream.write('\n') - - if self._target != 'maccatalyst': - if self._settings.has_section('$imports$'): - for import_rule in self._settings.values('$imports$'): - stream.write('import("%s")\n' % import_rule) - stream.write('\n') - - gn_args = self._GetGnArgs() - - for name, value in gn_args: - if isinstance(value, bool): - stream.write('%s = %s\n' % (name, str(value).lower())) - elif isinstance(value, list): - stream.write('%s = [%s' % (name, '\n' if len(value) > 1 else '')) - if len(value) == 1: - prefix = ' ' - suffix = ' ' - else: - prefix = ' ' - suffix = ',\n' - for item in value: - if isinstance(item, bool): - stream.write('%s%s%s' % (prefix, str(item).lower(), suffix)) - else: - stream.write('%s%s%s' % (prefix, item, suffix)) - stream.write(']\n') - else: - # ConfigParser removes quote around empty string which confuse - # `gn gen` so restore them. - if not value: - value = '""' - stream.write('%s = %s\n' % (name, value)) - - def WriteBuildNinja(self, gn_command, build_dir): - with open(os.path.join(build_dir, 'build.ninja'), 'w') as stream: - stream.write('ninja_required_version = 1.7.2\n') - stream.write('\n') - stream.write('rule gn\n') - stream.write(' command = %s\n' % NinjaEscapeCommand(gn_command)) - stream.write(' description = Regenerating ninja files\n') - stream.write('\n') - stream.write('build build.ninja: gn\n') - stream.write(' generator = 1\n') - stream.write(' depfile = build.ninja.d\n') - - def WriteBuildNinjaDeps(self, build_dir): - with open(os.path.join(build_dir, 'build.ninja.d'), 'w') as stream: - stream.write('build.ninja: nonexistant_file.gn\n') - - def GetGnCommand(self, gn_path, src_path, out_path, xcode_project_name=None): - gn_command = [ gn_path, '--root=%s' % os.path.realpath(src_path), '-q' ] - if xcode_project_name is not None: - gn_command.append('--ide=xcode') - gn_command.append('--ninja-executable=autoninja') - gn_command.append('--xcode-build-system=new') - gn_command.append('--xcode-project=%s' % xcode_project_name) - gn_command.append('--xcode-additional-files-patterns=*.md') - gn_command.append('--xcode-configs=' + ';'.join(SUPPORTED_CONFIGS)) - gn_command.append('--xcode-config-build-dir=' - '//out/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}') - if self._settings.has_section('filters'): - target_filters = self._settings.values('filters') - if target_filters: - gn_command.append('--filters=%s' % ';'.join(target_filters)) - else: - gn_command.append('--check') - gn_command.append('gen') - gn_command.append('//%s' % - os.path.relpath(os.path.abspath(out_path), os.path.abspath(src_path))) - return gn_command - - -def NinjaNeedEscape(arg): - '''Returns True if |arg| needs to be escaped when written to .ninja file.''' - return ':' in arg or '*' in arg or ';' in arg - - -def NinjaEscapeCommand(command): - '''Escapes |command| in order to write it to .ninja file.''' - result = [] - for arg in command: - if NinjaNeedEscape(arg): - arg = arg.replace(':', '$:') - arg = arg.replace(';', '\\;') - arg = arg.replace('*', '\\*') - else: - result.append(arg) - return ' '.join(result) - - -def FindGn(): - '''Returns absolute path to gn binary looking at the PATH env variable.''' - for path in os.environ['PATH'].split(os.path.pathsep): - gn_path = os.path.join(path, 'gn') - if os.path.isfile(gn_path) and os.access(gn_path, os.X_OK): - return gn_path - return None - - -def GenerateXcodeProject(gn_path, root_dir, proj_name, out_dir, settings): - '''Generate Xcode project with Xcode and convert to multi-configurations.''' - prefix = os.path.abspath(os.path.join(out_dir, '_temp')) - temp_path = tempfile.mkdtemp(prefix=prefix) - try: - generator = GnGenerator(settings, 'Debug', 'iphonesimulator') - generator.Generate(gn_path, proj_name, root_dir, temp_path) - convert_gn_xcodeproj.ConvertGnXcodeProject( - root_dir, - '%s.xcodeproj' % proj_name, - os.path.join(temp_path), - os.path.join(out_dir, 'build'), - SUPPORTED_CONFIGS) - finally: - if os.path.exists(temp_path): - shutil.rmtree(temp_path) - -def CreateLLDBInitFile(root_dir, out_dir, settings): - ''' - Generate an .lldbinit file for the project that load the script that fixes - the mapping of source files (see docs/ios/build_instructions.md#debugging). - ''' - with open(os.path.join(out_dir, 'build', '.lldbinit'), 'w') as lldbinit: - lldb_script_dir = os.path.join(os.path.abspath(root_dir), 'tools', 'lldb') - lldbinit.write('script sys.path[:0] = [\'%s\']\n' % lldb_script_dir) - lldbinit.write('script import lldbinit\n') - - workspace_name = settings.getstring( - 'gn_args', - 'ios_internal_citc_workspace_name') - - if workspace_name != '': - username = os.environ['USER'] - for shortname in ('googlemac', 'third_party', 'blaze-out'): - lldbinit.write('settings append target.source-map %s %s\n' % ( - shortname, - '/google/src/cloud/%s/%s/google3/%s' % ( - username, workspace_name, shortname))) - - # Append the content of //ios/build/tools/lldbinit.defaults if it exists. - tools_dir = os.path.join(root_dir, 'ios', 'build', 'tools') - defaults_lldbinit_path = os.path.join(tools_dir, 'lldbinit.defaults') - if os.path.isfile(defaults_lldbinit_path): - with open(defaults_lldbinit_path) as defaults_lldbinit: - for line in defaults_lldbinit: - lldbinit.write(line) - - # Append the content of ~/.lldbinit if it exists. Line that look like they - # are trying to configure source mapping are skipped as they probably date - # back from when setup-gn.py was not generating an .lldbinit file. - global_lldbinit_path = os.path.join(os.environ['HOME'], '.lldbinit') - if os.path.isfile(global_lldbinit_path): - with open(global_lldbinit_path) as global_lldbinit: - for line in global_lldbinit: - if any(pattern.match(line) for pattern in LLDBINIT_SKIP_PATTERNS): - continue - lldbinit.write(line) - - -def GenerateGnBuildRules(gn_path, root_dir, out_dir, settings): - '''Generates all template configurations for gn.''' - for config in SUPPORTED_CONFIGS: - for target in SUPPORTED_TARGETS: - build_dir = os.path.join(out_dir, '%s-%s' % (config, target)) - if not os.path.isdir(build_dir): - os.makedirs(build_dir) - - generator = GnGenerator(settings, config, target) - generator.CreateGnRules(gn_path, root_dir, build_dir) - - -def Main(args): - default_root = os.path.normpath(os.path.join( - os.path.dirname(__file__), os.pardir, os.pardir)) - - parser = argparse.ArgumentParser( - description='Generate build directories for use with gn.') - parser.add_argument( - 'root', default=default_root, nargs='?', - help='root directory where to generate multiple out configurations') - parser.add_argument( - '--import', action='append', dest='import_rules', default=[], - help='path to file defining default gn variables') - parser.add_argument( - '--gn-path', default=None, - help='path to gn binary (default: look up in $PATH)') - parser.add_argument( - '--build-dir', default='out', - help='path where the build should be created (default: %(default)s)') - parser.add_argument( - '--config-path', default=os.path.expanduser('~/.setup-gn'), - help='path to the user config file (default: %(default)s)') - parser.add_argument( - '--system-config-path', default=os.path.splitext(__file__)[0] + '.config', - help='path to the default config file (default: %(default)s)') - parser.add_argument( - '--project-name', default='all', dest='proj_name', - help='name of the generated Xcode project (default: %(default)s)') - parser.add_argument( - '--no-xcode-project', action='store_true', default=False, - help='do not generate the build directory with XCode project') - args = parser.parse_args(args) - - # Load configuration (first global and then any user overrides). - settings = ConfigParserWithStringInterpolation() - settings.read([ - args.system_config_path, - args.config_path, - ]) - - # Add private sections corresponding to --import argument. - if args.import_rules: - settings.add_section('$imports$') - for i, import_rule in enumerate(args.import_rules): - if not import_rule.startswith('//'): - import_rule = '//%s' % os.path.relpath( - os.path.abspath(import_rule), os.path.abspath(args.root)) - settings.set('$imports$', '$rule%d$' % i, import_rule) - - # Validate settings. - if settings.getstring('build', 'arch') not in ('64-bit', '32-bit', 'fat'): - sys.stderr.write('ERROR: invalid value for build.arch: %s\n' % - settings.getstring('build', 'arch')) - sys.exit(1) - - # Find path to gn binary either from command-line or in PATH. - if args.gn_path: - gn_path = args.gn_path - else: - gn_path = FindGn() - if gn_path is None: - sys.stderr.write('ERROR: cannot find gn in PATH\n') - sys.exit(1) - - out_dir = os.path.join(args.root, args.build_dir) - if not os.path.isdir(out_dir): - os.makedirs(out_dir) - - if not args.no_xcode_project: - GenerateXcodeProject(gn_path, args.root, args.proj_name, out_dir, settings) - CreateLLDBInitFile(args.root, out_dir, settings) - GenerateGnBuildRules(gn_path, args.root, out_dir, settings) - - -if __name__ == '__main__': - sys.exit(Main(sys.argv[1:])) diff --git a/shared/sentry/external/crashpad/build/ios/xcodescheme-testable.template b/shared/sentry/external/crashpad/build/ios/xcodescheme-testable.template deleted file mode 100644 index 24ba39a97..000000000 --- a/shared/sentry/external/crashpad/build/ios/xcodescheme-testable.template +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shared/sentry/external/crashpad/build/ios/xcodescheme.template b/shared/sentry/external/crashpad/build/ios/xcodescheme.template deleted file mode 100644 index b7cda4b10..000000000 --- a/shared/sentry/external/crashpad/build/ios/xcodescheme.template +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shared/sentry/external/crashpad/build/run_tests.py b/shared/sentry/external/crashpad/build/run_tests.py deleted file mode 100755 index 8ad19e346..000000000 --- a/shared/sentry/external/crashpad/build/run_tests.py +++ /dev/null @@ -1,480 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2014 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import os -import pipes -import posixpath -import re -import subprocess -import sys -import tempfile -import uuid - -CRASHPAD_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), - os.pardir) -IS_WINDOWS_HOST = sys.platform.startswith('win') - - -def _FindGNFromBinaryDir(binary_dir): - """Attempts to determine the path to a GN binary used to generate the build - files in the given binary_dir. This is necessary because `gn` might not be - in the path or might be in a non-standard location, particularly on build - machines.""" - - build_ninja = os.path.join(binary_dir, 'build.ninja') - if os.path.isfile(build_ninja): - with open(build_ninja, 'r') as f: - # Look for the always-generated regeneration rule of the form: - # - # rule gn - # command = ... arguments ... - # - # to extract the gn binary's full path. - found_rule_gn = False - for line in f: - if line.strip() == 'rule gn': - found_rule_gn = True - continue - if found_rule_gn: - if len(line) == 0 or line[0] != ' ': - return None - if line.startswith(' command = '): - gn_command_line_parts = line.strip().split(' ') - if len(gn_command_line_parts) > 2: - return os.path.join(binary_dir, - gn_command_line_parts[2]) - - return None - - -def _BinaryDirTargetOS(binary_dir): - """Returns the apparent target OS of binary_dir, or None if none appear to - be explicitly specified.""" - - gn_path = _FindGNFromBinaryDir(binary_dir) - - if gn_path: - # Look for a GN “target_os”. - popen = subprocess.Popen([ - gn_path, '--root=' + CRASHPAD_DIR, 'args', binary_dir, - '--list=target_os', '--short' - ], - shell=IS_WINDOWS_HOST, - stdout=subprocess.PIPE, - stderr=open(os.devnull), - text=True) - value = popen.communicate()[0] - if popen.returncode == 0: - match = re.match('target_os = "(.*)"$', value) - if match: - return match.group(1) - - # For GYP with Ninja, look for the appearance of “linux-android” in the path - # to ar. This path is configured by gyp_crashpad_android.py. - build_ninja_path = os.path.join(binary_dir, 'build.ninja') - if os.path.exists(build_ninja_path): - with open(build_ninja_path) as build_ninja_file: - build_ninja_content = build_ninja_file.read() - match = re.search('-linux-android(eabi)?-ar$', build_ninja_content, - re.MULTILINE) - if match: - return 'android' - - return None - - -def _EnableVTProcessingOnWindowsConsole(): - """Enables virtual terminal processing for ANSI/VT100-style escape sequences - on a Windows console attached to standard output. Returns True on success. - Returns False if standard output is not a console or if virtual terminal - processing is not supported. The feature was introduced in Windows 10. - """ - - import pywintypes - import win32console - import winerror - - stdout_console = win32console.GetStdHandle(win32console.STD_OUTPUT_HANDLE) - try: - console_mode = stdout_console.GetConsoleMode() - except pywintypes.error as e: - if e.winerror == winerror.ERROR_INVALID_HANDLE: - # Standard output is not a console. - return False - raise - - try: - # From . This would be - # win32console.ENABLE_VIRTUAL_TERMINAL_PROCESSING, but it’s too new to - # be defined there. - ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 - - stdout_console.SetConsoleMode(console_mode | - ENABLE_VIRTUAL_TERMINAL_PROCESSING) - except pywintypes.error as e: - if e.winerror == winerror.ERROR_INVALID_PARAMETER: - # ANSI/VT100-style escape sequence processing isn’t supported before - # Windows 10. - return False - raise - - return True - - -def _RunOnAndroidTarget(binary_dir, test, android_device, extra_command_line): - local_test_path = os.path.join(binary_dir, test) - MAYBE_UNSUPPORTED_TESTS = ( - 'crashpad_client_test', - 'crashpad_handler_test', - 'crashpad_minidump_test', - 'crashpad_snapshot_test', - ) - if not os.path.exists(local_test_path) and test in MAYBE_UNSUPPORTED_TESTS: - print('This test is not present and may not be supported, skipping') - return - - def _adb(*args): - # Flush all of this script’s own buffered stdout output before running - # adb, which will likely produce its own output on stdout. - sys.stdout.flush() - - adb_command = ['adb', '-s', android_device] - adb_command.extend(args) - subprocess.check_call(adb_command, shell=IS_WINDOWS_HOST) - - def _adb_push(sources, destination): - args = list(sources) - args.append(destination) - _adb('push', *args) - - def _adb_shell(command_args, env={}): - # Build a command to execute via “sh -c” instead of invoking it - # directly. Here’s why: - # - # /system/bin/env isn’t normally present prior to Android 6.0 (M), where - # toybox was introduced (Android platform/manifest 9a2c01e8450b). - # Instead, set environment variables by using the shell’s internal - # “export” command. - # - # adbd prior to Android 7.0 (N), and the adb client prior to SDK - # platform-tools version 24, don’t know how to communicate a shell - # command’s exit status. This was added in Android platform/system/core - # 606835ae5c4b). With older adb servers and clients, adb will “exit 0” - # indicating success even if the command failed on the device. This - # makes subprocess.check_call() semantics difficult to implement - # directly. As a workaround, have the device send the command’s exit - # status over stdout and pick it back up in this function. - # - # Both workarounds are implemented by giving the device a simple script, - # which adbd will run as an “sh -c” argument. - adb_command = ['adb', '-s', android_device, 'shell'] - script_commands = [] - for k, v in env.items(): - script_commands.append('export %s=%s' % - (pipes.quote(k), pipes.quote(v))) - script_commands.extend([ - ' '.join(pipes.quote(x) for x in command_args), 'status=${?}', - 'echo "status=${status}"', 'exit ${status}' - ]) - adb_command.append('; '.join(script_commands)) - child = subprocess.Popen(adb_command, - shell=IS_WINDOWS_HOST, - stdin=open(os.devnull), - stdout=subprocess.PIPE, - text=True) - - FINAL_LINE_RE = re.compile('status=(\d+)$') - final_line = None - while True: - # Use readline so that the test output appears “live” when running. - data = child.stdout.readline() - if data == '': - break - if final_line is not None: - # It wasn’t really the final line. - print(final_line, end='') - final_line = None - if FINAL_LINE_RE.match(data.rstrip()): - final_line = data - else: - print(data, end='') - - if final_line is None: - # Maybe there was some stderr output after the end of stdout. Old - # versions of adb, prior to when the exit status could be - # communicated, smush the two together. - raise subprocess.CalledProcessError(-1, adb_command) - status = int(FINAL_LINE_RE.match(final_line.rstrip()).group(1)) - if status != 0: - raise subprocess.CalledProcessError(status, adb_command) - - child.wait() - if child.returncode != 0: - raise subprocess.CalledProcessError(subprocess.returncode, - adb_command) - - # /system/bin/mktemp isn’t normally present prior to Android 6.0 (M), where - # toybox was introduced (Android platform/manifest 9a2c01e8450b). Fake it - # with a host-generated name. This won’t retry if the name is in use, but - # with 122 bits of randomness, it should be OK. This uses “mkdir” instead of - # “mkdir -p”because the latter will not indicate failure if the directory - # already exists. - device_temp_dir = '/data/local/tmp/%s.%s' % (test, uuid.uuid4().hex) - _adb_shell(['mkdir', device_temp_dir]) - - try: - # Specify test dependencies that must be pushed to the device. This - # could be determined automatically in a GN build, following the example - # used for Fuchsia. Since nothing like that exists for GYP, hard-code it - # for supported tests. - test_build_artifacts = [test, 'crashpad_handler'] - test_data = ['test/test_paths_test_data_root.txt'] - - if test == 'crashpad_test_test': - test_build_artifacts.append( - 'crashpad_test_test_multiprocess_exec_test_child') - elif test == 'crashpad_util_test': - test_data.append('util/net/testdata/') - - # Establish the directory structure on the device. - device_out_dir = posixpath.join(device_temp_dir, 'out') - device_mkdirs = [device_out_dir] - for source_path in test_data: - # A trailing slash could reasonably mean to copy an entire - # directory, but will interfere with what’s needed from the path - # split. All parent directories of any source_path need to be be - # represented in device_mkdirs, but it’s important that no - # source_path itself wind up in device_mkdirs, even if source_path - # names a directory, because that would cause the “adb push” of the - # directory below to behave incorrectly. - if source_path.endswith(posixpath.sep): - source_path = source_path[:-1] - - device_source_path = posixpath.join(device_temp_dir, source_path) - device_mkdir = posixpath.split(device_source_path)[0] - if device_mkdir not in device_mkdirs: - device_mkdirs.append(device_mkdir) - adb_mkdir_command = ['mkdir', '-p'] - adb_mkdir_command.extend(device_mkdirs) - _adb_shell(adb_mkdir_command) - - # Push the test binary and any other build output to the device. - local_test_build_artifacts = [] - for artifact in test_build_artifacts: - local_test_build_artifacts.append(os.path.join( - binary_dir, artifact)) - _adb_push(local_test_build_artifacts, device_out_dir) - - # Push test data to the device. - for source_path in test_data: - _adb_push([os.path.join(CRASHPAD_DIR, source_path)], - posixpath.join(device_temp_dir, source_path)) - - # Run the test on the device. Pass the test data root in the - # environment. - # - # Because the test will not run with its standard output attached to a - # pseudo-terminal device, Google Test will not normally enable colored - # output, so mimic Google Test’s own logic for deciding whether to - # enable color by checking this script’s own standard output connection. - # The list of TERM values comes from Google Test’s - # googletest/src/gtest.cc testing::internal::ShouldUseColor(). - env = {'CRASHPAD_TEST_DATA_ROOT': device_temp_dir} - gtest_color = os.environ.get('GTEST_COLOR') - if gtest_color in ('auto', None): - if (sys.stdout.isatty() and - (os.environ.get('TERM') - in ('xterm', 'xterm-color', 'xterm-256color', 'screen', - 'screen-256color', 'tmux', 'tmux-256color', 'rxvt-unicode', - 'rxvt-unicode-256color', 'linux', 'cygwin') or - (IS_WINDOWS_HOST and _EnableVTProcessingOnWindowsConsole()))): - gtest_color = 'yes' - else: - gtest_color = 'no' - env['GTEST_COLOR'] = gtest_color - _adb_shell([posixpath.join(device_out_dir, test)] + extra_command_line, - env) - finally: - _adb_shell(['rm', '-rf', device_temp_dir]) - - -def _RunOnIOSTarget(binary_dir, test, is_xcuitest=False): - """Runs the given iOS |test| app on iPhone 8 with the default OS version.""" - - def xctest(binary_dir, test): - """Returns a dict containing the xctestrun data needed to run an - XCTest-based test app.""" - test_path = os.path.join(CRASHPAD_DIR, binary_dir) - module_data = { - 'TestBundlePath': os.path.join(test_path, test + '_module.xctest'), - 'TestHostPath': os.path.join(test_path, test + '.app'), - 'TestingEnvironmentVariables': { - 'DYLD_FRAMEWORK_PATH': '__TESTROOT__/Debug-iphonesimulator:', - 'DYLD_INSERT_LIBRARIES': - ('__PLATFORMS__/iPhoneSimulator.platform/Developer/' - 'usr/lib/libXCTestBundleInject.dylib'), - 'DYLD_LIBRARY_PATH': '__TESTROOT__/Debug-iphonesimulator', - 'IDEiPhoneInternalTestBundleName': test + '.app', - 'XCInjectBundleInto': '__TESTHOST__/' + test, - } - } - return {test: module_data} - - def xcuitest(binary_dir, test): - """Returns a dict containing the xctestrun data needed to run an - XCUITest-based test app.""" - - test_path = os.path.join(CRASHPAD_DIR, binary_dir) - runner_path = os.path.join(test_path, test + '_module-Runner.app') - bundle_path = os.path.join(runner_path, 'PlugIns', - test + '_module.xctest') - target_app_path = os.path.join(test_path, test + '.app') - module_data = { - 'IsUITestBundle': True, - 'IsXCTRunnerHostedTestBundle': True, - 'TestBundlePath': bundle_path, - 'TestHostPath': runner_path, - 'UITargetAppPath': target_app_path, - 'DependentProductPaths': [ - bundle_path, runner_path, target_app_path - ], - 'TestingEnvironmentVariables': { - 'DYLD_FRAMEWORK_PATH': '__TESTROOT__/Debug-iphonesimulator:', - 'DYLD_INSERT_LIBRARIES': - ('__PLATFORMS__/iPhoneSimulator.platform/Developer/' - 'usr/lib/libXCTestBundleInject.dylib'), - 'DYLD_LIBRARY_PATH': '__TESTROOT__/Debug-iphonesimulator', - 'XCInjectBundleInto': '__TESTHOST__/' + test + '_module-Runner', - }, - } - return {test: module_data} - - with tempfile.NamedTemporaryFile() as f: - import plistlib - - xctestrun_path = f.name - print(xctestrun_path) - with open(xctestrun_path, 'wb') as fp: - if is_xcuitest: - plistlib.dump(xcuitest(binary_dir, test), fp) - else: - plistlib.dump(xctest(binary_dir, test), fp) - - subprocess.check_call([ - 'xcodebuild', 'test-without-building', '-xctestrun', xctestrun_path, - '-destination', 'platform=iOS Simulator,name=iPhone 8' - ]) - - -# This script is primarily used from the waterfall so that the list of tests -# that are run is maintained in-tree, rather than in a separate infrastructure -# location in the recipe. -def main(args): - parser = argparse.ArgumentParser(description='Run Crashpad unittests.') - parser.add_argument('binary_dir', help='Root of build dir') - parser.add_argument('test', nargs='*', help='Specific test(s) to run.') - parser.add_argument( - '--gtest_filter', - help='Google Test filter applied to Google Test binary runs.') - args = parser.parse_args() - - # Tell 64-bit Windows tests where to find 32-bit test executables, for - # cross-bitted testing. This relies on the fact that the GYP build by - # default uses {Debug,Release} for the 32-bit build and {Debug,Release}_x64 - # for the 64-bit build. This is not a universally valid assumption, and if - # it’s not met, 64-bit tests that require 32-bit build output will disable - # themselves dynamically. - if (sys.platform == 'win32' and args.binary_dir.endswith('_x64') and - 'CRASHPAD_TEST_32_BIT_OUTPUT' not in os.environ): - binary_dir_32 = args.binary_dir[:-4] - if os.path.isdir(binary_dir_32): - os.environ['CRASHPAD_TEST_32_BIT_OUTPUT'] = binary_dir_32 - - target_os = _BinaryDirTargetOS(args.binary_dir) - is_android = target_os == 'android' - is_ios = target_os == 'ios' - - tests = [ - 'crashpad_client_test', - 'crashpad_handler_test', - 'crashpad_minidump_test', - 'crashpad_snapshot_test', - 'crashpad_test_test', - 'crashpad_util_test', - ] - - if is_android: - android_device = os.environ.get('ANDROID_DEVICE') - if not android_device: - adb_devices = subprocess.check_output(['adb', 'devices'], - shell=IS_WINDOWS_HOST, - text=True) - devices = [] - for line in adb_devices.splitlines(): - line = line - if (line == 'List of devices attached' or - re.match('^\* daemon .+ \*$', line) or line == ''): - continue - (device, ignore) = line.split('\t') - devices.append(device) - if len(devices) != 1: - print("Please set ANDROID_DEVICE to your device's id", - file=sys.stderr) - return 2 - android_device = devices[0] - print('Using autodetected Android device:', android_device) - elif is_ios: - tests.append('ios_crash_xcuitests') - elif IS_WINDOWS_HOST: - tests.append('snapshot/win/end_to_end_test.py') - - if args.test: - for t in args.test: - if t not in tests: - print('Unrecognized test:', t, file=sys.stderr) - return 3 - tests = args.test - - for test in tests: - print('-' * 80) - print(test) - print('-' * 80) - if test.endswith('.py'): - subprocess.check_call([ - sys.executable, - os.path.join(CRASHPAD_DIR, test), args.binary_dir - ]) - else: - extra_command_line = [] - if args.gtest_filter: - extra_command_line.append('--gtest_filter=' + args.gtest_filter) - if is_android: - _RunOnAndroidTarget(args.binary_dir, test, android_device, - extra_command_line) - elif is_ios: - _RunOnIOSTarget(args.binary_dir, - test, - is_xcuitest=test.startswith('ios')) - else: - subprocess.check_call([os.path.join(args.binary_dir, test)] + - extra_command_line) - - return 0 - - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) diff --git a/shared/sentry/external/crashpad/build/test.gni b/shared/sentry/external/crashpad/build/test.gni deleted file mode 100644 index d99578929..000000000 --- a/shared/sentry/external/crashpad/build/test.gni +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2017 The Crashpad Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("crashpad_buildconfig.gni") - -if (crashpad_is_in_chromium) { - import("//testing/test.gni") -} else { - template("test") { - if (crashpad_is_ios) { - import("//third_party/mini_chromium/mini_chromium/build/ios/rules.gni") - - _launch_image_bundle_target = target_name + "_launch_image" - bundle_data(_launch_image_bundle_target) { - forward_variables_from(invoker, [ "testonly" ]) - sources = [ "//build/ios/Default.png" ] - outputs = [ "{{bundle_contents_dir}}/{{source_file_part}}" ] - } - - ios_xctest_test(target_name) { - testonly = true - xctest_module_target = "//test/ios:google_test_runner" - info_plist = "//build/ios/Unittest-Info.plist" - extra_substitutions = [ "GTEST_BUNDLE_ID_SUFFIX=$target_name" ] - forward_variables_from(invoker, "*") - if (!defined(deps)) { - deps = [] - } - deps += [ ":$_launch_image_bundle_target" ] - } - } else { - executable(target_name) { - testonly = true - forward_variables_from(invoker, "*") - } - } - } -} diff --git a/shared/sentry/external/crashpad/client/annotation_test.cc b/shared/sentry/external/crashpad/client/annotation_test.cc deleted file mode 100644 index 5512e3fb4..000000000 --- a/shared/sentry/external/crashpad/client/annotation_test.cc +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2017 The Crashpad Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "client/annotation.h" - -#include -#include - -#include "client/annotation_list.h" -#include "client/crashpad_info.h" -#include "gtest/gtest.h" -#include "test/gtest_death.h" - -namespace crashpad { -namespace test { -namespace { - -class Annotation : public testing::Test { - public: - void SetUp() override { - CrashpadInfo::GetCrashpadInfo()->set_annotations_list(&annotations_); - } - - void TearDown() override { - CrashpadInfo::GetCrashpadInfo()->set_annotations_list(nullptr); - } - - size_t AnnotationsCount() { - size_t result = 0; - for (auto* annotation : annotations_) { - if (annotation->is_set()) - ++result; - } - return result; - } - - protected: - crashpad::AnnotationList annotations_; -}; - -TEST_F(Annotation, Basics) { - constexpr crashpad::Annotation::Type kType = - crashpad::Annotation::UserDefinedType(1); - - const char kName[] = "annotation 1"; - char buffer[1024]; - crashpad::Annotation annotation(kType, kName, buffer); - - EXPECT_FALSE(annotation.is_set()); - EXPECT_EQ(0u, AnnotationsCount()); - - EXPECT_EQ(kType, annotation.type()); - EXPECT_EQ(0u, annotation.size()); - EXPECT_EQ(std::string(kName), annotation.name()); - EXPECT_EQ(buffer, annotation.value()); - - annotation.SetSize(10); - - EXPECT_TRUE(annotation.is_set()); - EXPECT_EQ(1u, AnnotationsCount()); - - EXPECT_EQ(10u, annotation.size()); - EXPECT_EQ(&annotation, *annotations_.begin()); - - annotation.Clear(); - - EXPECT_FALSE(annotation.is_set()); - EXPECT_EQ(0u, AnnotationsCount()); - - EXPECT_EQ(0u, annotation.size()); -} - -TEST_F(Annotation, StringType) { - crashpad::StringAnnotation<5> annotation("name"); - - EXPECT_FALSE(annotation.is_set()); - - EXPECT_EQ(crashpad::Annotation::Type::kString, annotation.type()); - EXPECT_EQ(0u, annotation.size()); - EXPECT_EQ(std::string("name"), annotation.name()); - EXPECT_EQ(0u, annotation.value().size()); - - annotation.Set("test"); - - EXPECT_TRUE(annotation.is_set()); - EXPECT_EQ(1u, AnnotationsCount()); - - EXPECT_EQ(4u, annotation.size()); - EXPECT_EQ("test", annotation.value()); - - annotation.Set(std::string("loooooooooooong")); - - EXPECT_TRUE(annotation.is_set()); - EXPECT_EQ(1u, AnnotationsCount()); - - EXPECT_EQ(5u, annotation.size()); - EXPECT_EQ("loooo", annotation.value()); -} - -TEST(StringAnnotation, ArrayOfString) { - static crashpad::StringAnnotation<4> annotations[] = { - {"test-1", crashpad::StringAnnotation<4>::Tag::kArray}, - {"test-2", crashpad::StringAnnotation<4>::Tag::kArray}, - {"test-3", crashpad::StringAnnotation<4>::Tag::kArray}, - {"test-4", crashpad::StringAnnotation<4>::Tag::kArray}, - }; - - for (auto& annotation : annotations) { - EXPECT_FALSE(annotation.is_set()); - } -} - -#if DCHECK_IS_ON() - -TEST(AnnotationDeathTest, EmbeddedNUL) { - crashpad::StringAnnotation<5> annotation("name"); - EXPECT_DEATH_CHECK(annotation.Set(std::string("te\0st", 5)), "embedded NUL"); -} - -#endif - -} // namespace -} // namespace test -} // namespace crashpad diff --git a/shared/sentry/external/crashpad/doc/layering.png b/shared/sentry/external/crashpad/doc/layering.png deleted file mode 100644 index 8de5ac441cf59fa668df5511d81c0869efc4fa45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20391 zcma*P2SAg{^DgYM3j%f&6tGYQsnW}_(3?n;E-myXy(_3Fh$uC5=^{-DMY@Re1f(0P zfP@+l0)bHP1U$cT|KGj$J4GRRci-LF*_mf%=h>I{RAi|r=qUE>+ealYclZ9jef!_; z+xM5;(f#mA&>KD+{B_Xcmh!EA`#yzHZW9CMV@ao)F&x{mz+UyTm$ z&Gzk6$(Fx+OT(idKV+j3;a)A|)7zUjq|0IYVen~Px^?Z#17{Cfu{lQk^=Pfh#KBt+ z1p~+*@X-H{Urr!H|NYIMUyh<>pv`~(V%C7LFuU|x;!S1v>{@g9MAc7qn!IIcP7&9` z3;qXhMF(Pek2U*VJ$=3Gsgr!GcP*t!{dJ#{jn}S?Z-p@(ML);#&?BxM4ftY{o5?&$t}^q)^xDWQ8MJ>Q1=cE{8H#85UxMA8KrR?o)?%}WaI+{(aX zq?n)mY0Uiw>vt>Vm=%`8&S5~p_u=p1sRP;ShWHu$k>Se6)o)*JG+5ZO#=sBub&rcw zs8J`$fV~*-)2#(P(K9gb)5yx1 z!3!4NXezMrN^Z^1hOf-}G=`o(5tp|@_^Fi|Keiu!Hz(K5m7A-rU$ymj*G8p-S*mVk zx>)y0*jL-#w>`(AZrsZCh^H6Yi7d(>ytVR3xB-tlmXr&!iCvqRgcrGPr4_^tb?0Zs z3a#|KG_zBJL)vo+5_uBYt>*h6mw!8@b+c3TNLiYB8LmwQ>zBV)t zeDEAgFe5_ey)52aKhJMj(=k}s6)tp24B;BgSz2HPZVYwl#Nwyx(v*iluLcG`!)KXp zH>))4B?S7bOGm30FYL~}y?-v#tr+i3Zz(!aQddW;qKYL+^Y09%w@+!$x@bx`TYeYN z)Vi9M6YD=;H+P7?!olo{5>r2}K|)7OPwOh>@nJ>!_zc%a{Y+eW5d(H+uJnid=cn

493sklDkRpU#yS_L;%ZmX$U?NLz98 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 YS7@(6aE-hWG}tFEt#UX2_QQbx1=Hf5>;M1& diff --git a/shared/sentry/external/crashpad/doc/overview.png b/shared/sentry/external/crashpad/doc/overview.png deleted file mode 100644 index 5e04d38a11fcf6d34575245924ddb33f3ecfb6f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25170 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 diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/build/chromeos_buildflags.h b/shared/sentry/external/crashpad/third_party/mini_chromium/build/chromeos_buildflags.h deleted file mode 100644 index 72714a24a..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/build/chromeos_buildflags.h +++ /dev/null @@ -1,13 +0,0 @@ -// This header should be generated by `build/write_buildflag_header.py`, -// but we rather hardcode it to simplify CMake scripts, as we do not -// support building on chromeos anyway. - -#ifndef MINI_CHROMIUM_BUILD_CHROMEOS_BUILDFLAGS_H_ -#define MINI_CHROMIUM_BUILD_CHROMEOS_BUILDFLAGS_H_ - -#include "build/buildflag.h" - -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS_LACROS() (0) -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS_ASH() (0) - -#endif // MINI_CHROMIUM_BUILD_CHROMEOS_BUILDFLAGS_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.h b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.h deleted file mode 100644 index 09a37f4be..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.h +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2008 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_FOUNDATION_UTIL_H_ -#define MINI_CHROMIUM_BASE_MAC_FOUNDATION_UTIL_H_ - -#include "base/logging.h" -#include "build/build_config.h" - -#if BUILDFLAG(IS_IOS) -#include -#else -#include -#endif - -#if defined(__OBJC__) -#import -#else // defined(__OBJC__) -#include -#endif // defined(__OBJC__) - -#if !defined(__OBJC__) -#define OBJC_CPP_CLASS_DECL(x) class x; -#else // defined(__OBJC__) -#define OBJC_CPP_CLASS_DECL(x) -#endif // defined(__OBJC__) - -// Convert toll-free bridged CFTypes to NSTypes and vice-versa. This does not -// autorelease |cf_val|. This is useful for the case where there is a CFType in -// a call that expects an NSType and the compiler is complaining about const -// casting problems. -// The calls are used like this: -// NSString *foo = CFToNSCast(CFSTR("Hello")); -// CFStringRef foo2 = NSToCFCast(@"Hello"); -// The macro magic below is to enforce safe casting. It could possibly have -// been done using template function specialization, but template function -// specialization doesn't always work intuitively, -// (http://www.gotw.ca/publications/mill17.htm) so the trusty combination -// of macros and function overloading is used instead. - -#define CF_TO_NS_CAST_DECL(TypeCF, TypeNS) \ -OBJC_CPP_CLASS_DECL(TypeNS) \ -\ -namespace base { \ -namespace mac { \ -TypeNS* CFToNSCast(TypeCF##Ref cf_val); \ -TypeCF##Ref NSToCFCast(TypeNS* ns_val); \ -} \ -} -#define CF_TO_NS_MUTABLE_CAST_DECL(name) \ -CF_TO_NS_CAST_DECL(CF##name, NS##name) \ -OBJC_CPP_CLASS_DECL(NSMutable##name) \ -\ -namespace base { \ -namespace mac { \ -NSMutable##name* CFToNSCast(CFMutable##name##Ref cf_val); \ -CFMutable##name##Ref NSToCFCast(NSMutable##name* ns_val); \ -} \ -} - -// List of toll-free bridged types taken from: -// http://www.cocoadev.com/index.pl?TollFreeBridged - -CF_TO_NS_MUTABLE_CAST_DECL(Array) -CF_TO_NS_MUTABLE_CAST_DECL(AttributedString) -CF_TO_NS_CAST_DECL(CFCalendar, NSCalendar) -CF_TO_NS_MUTABLE_CAST_DECL(CharacterSet) -CF_TO_NS_MUTABLE_CAST_DECL(Data) -CF_TO_NS_CAST_DECL(CFDate, NSDate) -CF_TO_NS_MUTABLE_CAST_DECL(Dictionary) -CF_TO_NS_CAST_DECL(CFError, NSError) -CF_TO_NS_CAST_DECL(CFLocale, NSLocale) -CF_TO_NS_CAST_DECL(CFNumber, NSNumber) -CF_TO_NS_CAST_DECL(CFRunLoopTimer, NSTimer) -CF_TO_NS_CAST_DECL(CFTimeZone, NSTimeZone) -CF_TO_NS_MUTABLE_CAST_DECL(Set) -CF_TO_NS_CAST_DECL(CFReadStream, NSInputStream) -CF_TO_NS_CAST_DECL(CFWriteStream, NSOutputStream) -CF_TO_NS_MUTABLE_CAST_DECL(String) -CF_TO_NS_CAST_DECL(CFURL, NSURL) - -#undef CF_TO_NS_CAST_DECL -#undef CF_TO_NS_MUTABLE_CAST_DECL -#undef OBJC_CPP_CLASS_DECL - -namespace base { -namespace mac { - -// CFCast<>() and CFCastStrict<>() cast a basic CFTypeRef to a more -// specific CoreFoundation type. The compatibility of the passed -// object is found by comparing its opaque type against the -// requested type identifier. If the supplied object is not -// compatible with the requested return type, CFCast<>() returns -// NULL and CFCastStrict<>() will DCHECK. Providing a NULL pointer -// to either variant results in NULL being returned without -// triggering any DCHECK. -// -// Example usage: -// CFNumberRef some_number = base::mac::CFCast( -// CFArrayGetValueAtIndex(array, index)); -// -// CFTypeRef hello = CFSTR("hello world"); -// CFStringRef some_string = base::mac::CFCastStrict(hello); - -template -T CFCast(const CFTypeRef& cf_val); - -template -T CFCastStrict(const CFTypeRef& cf_val); - -#define CF_CAST_DECL(TypeCF) \ -template<> TypeCF##Ref \ -CFCast(const CFTypeRef& cf_val); \ - \ -template<> TypeCF##Ref \ -CFCastStrict(const CFTypeRef& cf_val) - -CF_CAST_DECL(CFArray); -CF_CAST_DECL(CFBag); -CF_CAST_DECL(CFBoolean); -CF_CAST_DECL(CFData); -CF_CAST_DECL(CFDate); -CF_CAST_DECL(CFDictionary); -CF_CAST_DECL(CFNull); -CF_CAST_DECL(CFNumber); -CF_CAST_DECL(CFSet); -CF_CAST_DECL(CFString); -CF_CAST_DECL(CFURL); -CF_CAST_DECL(CFUUID); - -CF_CAST_DECL(CGColor); - -CF_CAST_DECL(CTFont); -CF_CAST_DECL(CTRun); - -#if !BUILDFLAG(IS_IOS) -CF_CAST_DECL(SecACL); -CF_CAST_DECL(SecTrustedApplication); -#endif - -#undef CF_CAST_DECL - -#if defined(__OBJC__) - -// ObjCCast<>() and ObjCCastStrict<>() cast a basic id to a more -// specific (NSObject-derived) type. The compatibility of the passed -// object is found by checking if it's a kind of the requested type -// identifier. If the supplied object is not compatible with the -// requested return type, ObjCCast<>() returns nil and -// ObjCCastStrict<>() will DCHECK. Providing a nil pointer to either -// variant results in nil being returned without triggering any DCHECK. -// -// The strict variant is useful when retrieving a value from a -// collection which only has values of a specific type, e.g. an -// NSArray of NSStrings. The non-strict variant is useful when -// retrieving values from data that you can't fully control. For -// example, a plist read from disk may be beyond your exclusive -// control, so you'd only want to check that the values you retrieve -// from it are of the expected types, but not crash if they're not. -// -// Example usage: -// NSString* version = base::mac::ObjCCast( -// [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]); -// -// NSString* str = base::mac::ObjCCastStrict( -// [ns_arr_of_ns_strs objectAtIndex:0]); -template -T* ObjCCast(id objc_val) { - if ([objc_val isKindOfClass:[T class]]) { - return reinterpret_cast(objc_val); - } - return nil; -} - -template -T* ObjCCastStrict(id objc_val) { - T* rv = ObjCCast(objc_val); - DCHECK(objc_val == nil || rv); - return rv; -} - -#endif // defined(__OBJC__) - -} // namespace mac -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_FOUNDATION_UTIL_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.mm b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.mm deleted file mode 100644 index 18e435ecc..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.mm +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2008 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/mac/foundation_util.h" - -#if !BUILDFLAG(IS_IOS) -extern "C" { -CFTypeID SecACLGetTypeID(); -CFTypeID SecTrustedApplicationGetTypeID(); -} // extern "C" -#endif - -namespace base { -namespace mac { - -// Definitions for the corresponding CF_TO_NS_CAST_DECL macros in -// foundation_util.h. -#define CF_TO_NS_CAST_DEFN(TypeCF, TypeNS) \ -\ -TypeNS* CFToNSCast(TypeCF##Ref cf_val) { \ - DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ - TypeNS* ns_val = \ - const_cast(reinterpret_cast(cf_val)); \ - return ns_val; \ -} \ -\ -TypeCF##Ref NSToCFCast(TypeNS* ns_val) { \ - TypeCF##Ref cf_val = reinterpret_cast(ns_val); \ - DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ - return cf_val; \ -} - -#define CF_TO_NS_MUTABLE_CAST_DEFN(name) \ -CF_TO_NS_CAST_DEFN(CF##name, NS##name) \ -\ -NSMutable##name* CFToNSCast(CFMutable##name##Ref cf_val) { \ - DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ - NSMutable##name* ns_val = reinterpret_cast(cf_val); \ - return ns_val; \ -} \ -\ -CFMutable##name##Ref NSToCFCast(NSMutable##name* ns_val) { \ - CFMutable##name##Ref cf_val = \ - reinterpret_cast(ns_val); \ - DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ - return cf_val; \ -} - -CF_TO_NS_MUTABLE_CAST_DEFN(Array) -CF_TO_NS_MUTABLE_CAST_DEFN(AttributedString) -CF_TO_NS_CAST_DEFN(CFCalendar, NSCalendar) -CF_TO_NS_MUTABLE_CAST_DEFN(CharacterSet) -CF_TO_NS_MUTABLE_CAST_DEFN(Data) -CF_TO_NS_CAST_DEFN(CFDate, NSDate) -CF_TO_NS_MUTABLE_CAST_DEFN(Dictionary) -CF_TO_NS_CAST_DEFN(CFError, NSError) -CF_TO_NS_CAST_DEFN(CFLocale, NSLocale) -CF_TO_NS_CAST_DEFN(CFNumber, NSNumber) -CF_TO_NS_CAST_DEFN(CFRunLoopTimer, NSTimer) -CF_TO_NS_CAST_DEFN(CFTimeZone, NSTimeZone) -CF_TO_NS_MUTABLE_CAST_DEFN(Set) -CF_TO_NS_CAST_DEFN(CFReadStream, NSInputStream) -CF_TO_NS_CAST_DEFN(CFWriteStream, NSOutputStream) -CF_TO_NS_MUTABLE_CAST_DEFN(String) -CF_TO_NS_CAST_DEFN(CFURL, NSURL) - -#undef CF_TO_NS_CAST_DEFN -#undef CF_TO_NS_MUTABLE_CAST_DEFN - -#define CF_CAST_DEFN(TypeCF) \ -template<> TypeCF##Ref \ -CFCast(const CFTypeRef& cf_val) { \ - if (cf_val == NULL) { \ - return NULL; \ - } \ - if (CFGetTypeID(cf_val) == TypeCF##GetTypeID()) { \ - return (TypeCF##Ref)(cf_val); \ - } \ - return NULL; \ -} \ -\ -template<> TypeCF##Ref \ -CFCastStrict(const CFTypeRef& cf_val) { \ - TypeCF##Ref rv = CFCast(cf_val); \ - DCHECK(cf_val == NULL || rv); \ - return rv; \ -} - -CF_CAST_DEFN(CFArray) -CF_CAST_DEFN(CFBag) -CF_CAST_DEFN(CFBoolean) -CF_CAST_DEFN(CFData) -CF_CAST_DEFN(CFDate) -CF_CAST_DEFN(CFDictionary) -CF_CAST_DEFN(CFNull) -CF_CAST_DEFN(CFNumber) -CF_CAST_DEFN(CFSet) -CF_CAST_DEFN(CFString) -CF_CAST_DEFN(CFURL) -CF_CAST_DEFN(CFUUID) - -CF_CAST_DEFN(CGColor) - -CF_CAST_DEFN(CTFont) -CF_CAST_DEFN(CTRun) - -#if !BUILDFLAG(IS_IOS) -CF_CAST_DEFN(SecACL) -CF_CAST_DEFN(SecTrustedApplication) -#endif - -#undef CF_CAST_DEFN - -} // namespace mac -} // namespace base diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.h b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.h deleted file mode 100644 index c39b23087..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.h +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_MACH_LOGGING_H_ -#define MINI_CHROMIUM_BASE_MAC_MACH_LOGGING_H_ - -#include - -#include "base/logging.h" -#include "build/build_config.h" - -// Use the MACH_LOG family of macros along with a mach_error_t (kern_return_t) -// containing a Mach error. The error value will be decoded so that logged -// messages explain the error. -// -// Use the BOOTSTRAP_LOG family of macros specifically for errors that occur -// while interoperating with the bootstrap subsystem. These errors will first -// be looked up as bootstrap error messages. If no match is found, they will -// be treated as generic Mach errors, as in MACH_LOG. -// -// Examples: -// -// kern_return_t kr = mach_timebase_info(&info); -// if (kr != KERN_SUCCESS) { -// MACH_LOG(ERROR, kr) << "mach_timebase_info"; -// } -// -// kr = vm_deallocate(task, address, size); -// MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate"; - -namespace logging { - -class MachLogMessage : public logging::LogMessage { - public: - MachLogMessage(const char* function, - const char* file_path, - int line, - LogSeverity severity, - mach_error_t mach_err); - - MachLogMessage(const MachLogMessage&) = delete; - MachLogMessage& operator=(const MachLogMessage&) = delete; - - ~MachLogMessage(); - - private: - mach_error_t mach_err_; -}; - -} // namespace logging - -#define MACH_LOG_STREAM(severity, mach_err) \ - COMPACT_GOOGLE_LOG_EX_ ## severity(MachLogMessage, mach_err).stream() -#define MACH_VLOG_STREAM(verbose_level, mach_err) \ - logging::MachLogMessage(__PRETTY_FUNCTION__, __FILE__, __LINE__, \ - -verbose_level, mach_err).stream() - -#define MACH_LOG(severity, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), LOG_IS_ON(severity)) -#define MACH_LOG_IF(severity, condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ - LOG_IS_ON(severity) && (condition)) - -#define MACH_VLOG(verbose_level, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - VLOG_IS_ON(verbose_level)) -#define MACH_VLOG_IF(verbose_level, condition, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - VLOG_IS_ON(verbose_level) && (condition)) - -#define MACH_CHECK(condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), !(condition)) \ - << "Check failed: " # condition << ". " - -#define MACH_DLOG(severity, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), DLOG_IS_ON(severity)) -#define MACH_DLOG_IF(severity, condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ - DLOG_IS_ON(severity) && (condition)) - -#define MACH_DVLOG(verbose_level, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - DVLOG_IS_ON(verbose_level)) -#define MACH_DVLOG_IF(verbose_level, condition, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - DVLOG_IS_ON(verbose_level) && (condition)) - -#define MACH_DCHECK(condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), \ - DCHECK_IS_ON && !(condition)) \ - << "Check failed: " # condition << ". " - -#if !BUILDFLAG(IS_IOS) - -namespace logging { - -class BootstrapLogMessage : public logging::LogMessage { - public: - BootstrapLogMessage(const char* function, - const char* file_path, - int line, - LogSeverity severity, - kern_return_t bootstrap_err); - - BootstrapLogMessage(const BootstrapLogMessage&) = delete; - BootstrapLogMessage& operator=(const BootstrapLogMessage&) = delete; - - ~BootstrapLogMessage(); - - private: - kern_return_t bootstrap_err_; -}; - -} // namespace logging - -#define BOOTSTRAP_LOG_STREAM(severity, bootstrap_err) \ - COMPACT_GOOGLE_LOG_EX_ ## severity(BootstrapLogMessage, \ - bootstrap_err).stream() -#define BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err) \ - logging::BootstrapLogMessage(__PRETTY_FUNCTION__, __FILE__, __LINE__, \ - -verbose_level, bootstrap_err).stream() - -#define BOOTSTRAP_LOG(severity, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, \ - bootstrap_err), LOG_IS_ON(severity)) -#define BOOTSTRAP_LOG_IF(severity, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ - LOG_IS_ON(severity) && (condition)) - -#define BOOTSTRAP_VLOG(verbose_level, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - VLOG_IS_ON(verbose_level)) -#define BOOTSTRAP_VLOG_IF(verbose_level, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - VLOG_IS_ON(verbose_level) && (condition)) - -#define BOOTSTRAP_CHECK(condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), !(condition)) \ - << "Check failed: " # condition << ". " - -#define BOOTSTRAP_DLOG(severity, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ - DLOG_IS_ON(severity)) -#define BOOTSTRAP_DLOG_IF(severity, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ - DLOG_IS_ON(severity) && (condition)) - -#define BOOTSTRAP_DVLOG(verbose_level, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - DVLOG_IS_ON(verbose_level)) -#define BOOTSTRAP_DVLOG_IF(verbose_level, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - DVLOG_IS_ON(verbose_level) && (condition)) - -#define BOOTSTRAP_DCHECK(condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), \ - DCHECK_IS_ON && !(condition)) \ - << "Check failed: " # condition << ". " - -#endif // !BUILDFLAG(IS_IOS) - -#endif // MINI_CHROMIUM_BASE_MAC_MACH_LOGGING_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.mm b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.mm deleted file mode 100644 index 443906569..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.mm +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2008 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/mac/scoped_nsautorelease_pool.h" - -#import - -#include "base/logging.h" - -namespace base { -namespace mac { - -ScopedNSAutoreleasePool::ScopedNSAutoreleasePool() - : autorelease_pool_([[NSAutoreleasePool alloc] init]) { - DCHECK(autorelease_pool_); -} - -ScopedNSAutoreleasePool::~ScopedNSAutoreleasePool() { - [autorelease_pool_ drain]; -} - -// Cycle the internal pool, allowing everything there to get cleaned up and -// start anew. -void ScopedNSAutoreleasePool::Recycle() { - [autorelease_pool_ drain]; - autorelease_pool_ = [[NSAutoreleasePool alloc] init]; - DCHECK(autorelease_pool_); -} - -} // namespace mac -} // namespace base diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsobject.h b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsobject.h deleted file mode 100644 index 6c2f27386..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsobject.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_NSOBJECT_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_NSOBJECT_H_ - -#import - -#include - -#include "base/compiler_specific.h" -#include "base/mac/scoped_typeref.h" - -namespace base { - -namespace internal { - -template -struct ScopedNSProtocolTraits { - static NST InvalidValue() { return nil; } - static NST Retain(NST nst) { return [nst retain]; } - static void Release(NST nst) { [nst release]; } -}; - -} // namespace internal - -template -class scoped_nsprotocol - : public ScopedTypeRef> { - public: - using ScopedTypeRef>::ScopedTypeRef; - - NST autorelease() { return [this->release() autorelease]; } -}; - -template -void swap(scoped_nsprotocol& p1, scoped_nsprotocol& p2) { - p1.swap(p2); -} - -template -bool operator==(C p1, const scoped_nsprotocol& p2) { - return p1 == p2.get(); -} - -template -bool operator!=(C p1, const scoped_nsprotocol& p2) { - return p1 != p2.get(); -} - -template -class scoped_nsobject : public scoped_nsprotocol { - public: - using scoped_nsprotocol::scoped_nsprotocol; - - static_assert(std::is_same::value == false, - "Use ScopedNSAutoreleasePool instead"); -}; - -template<> -class scoped_nsobject : public scoped_nsprotocol { - public: - using scoped_nsprotocol::scoped_nsprotocol; -}; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_NSOBJECT_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_typeref.h b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_typeref.h deleted file mode 100644 index 7b3313351..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_typeref.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_TYPEREF_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_TYPEREF_H_ - -#include "base/logging.h" -#include "base/memory/scoped_policy.h" - -namespace base { - -template -struct ScopedTypeRefTraits; - -template > -class ScopedTypeRef { - public: - typedef T element_type; - - ScopedTypeRef( - T object = Traits::InvalidValue(), - base::scoped_policy::OwnershipPolicy policy = base::scoped_policy::ASSUME) - : object_(object) { - if (object_ && policy == base::scoped_policy::RETAIN) - object_ = Traits::Retain(object_); - } - - ScopedTypeRef(const ScopedTypeRef& that) : object_(that.object_) { - if (object_) - object_ = Traits::Retain(object_); - } - - ~ScopedTypeRef() { - if (object_) - Traits::Release(object_); - } - - ScopedTypeRef& operator=(const ScopedTypeRef& that) { - reset(that.get(), base::scoped_policy::RETAIN); - return *this; - } - - [[nodiscard]] T* InitializeInto() { - DCHECK(!object_); - return &object_; - } - - void reset(T object = Traits::InvalidValue(), - base::scoped_policy::OwnershipPolicy policy = - base::scoped_policy::ASSUME) { - if (object && policy == base::scoped_policy::RETAIN) - object = Traits::Retain(object); - if (object_) - Traits::Release(object_); - object_ = object; - } - - bool operator==(T that) const { return object_ == that; } - - bool operator!=(T that) const { return object_ != that; } - - operator T() const { return object_; } - - T get() const { return object_; } - - void swap(ScopedTypeRef& that) { - T temp = that.object_; - that.object_ = object_; - object_ = temp; - } - - [[nodiscard]] T release() { - T temp = object_; - object_ = Traits::InvalidValue(); - return temp; - } - - private: - T object_; -}; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_TYPEREF_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h deleted file mode 100644 index aad2aa949..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2011 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ -#define MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ - -#include - -#include "build/build_config.h" - -namespace base { - -// template definitions from tr1 - -template -struct integral_constant { - static const T value = v; - typedef T value_type; - typedef integral_constant type; -}; - -template const T integral_constant::value; - -typedef integral_constant true_type; -typedef integral_constant false_type; - -template struct is_pointer : false_type {}; -template struct is_pointer : true_type {}; - -// Member function pointer detection. This is built-in to C++ 11's stdlib, and -// we can remove this when we switch to it. -template -struct is_member_function_pointer : false_type {}; - -template -struct is_member_function_pointer : true_type {}; -template -struct is_member_function_pointer : true_type {}; - - -template struct is_same : public false_type {}; -template struct is_same : true_type {}; - -template struct is_array : public false_type {}; -template struct is_array : public true_type {}; -template struct is_array : public true_type {}; - -template struct is_non_const_reference : false_type {}; -template struct is_non_const_reference : true_type {}; -template struct is_non_const_reference : false_type {}; - -template struct is_const : false_type {}; -template struct is_const : true_type {}; - -template struct is_void : false_type {}; -template <> struct is_void : true_type {}; - -namespace internal { - -// Types YesType and NoType are guaranteed such that sizeof(YesType) < -// sizeof(NoType). -typedef char YesType; - -struct NoType { - YesType dummy[2]; -}; - -// This class is an implementation detail for is_convertible, and you -// don't need to know how it works to use is_convertible. For those -// who care: we declare two different functions, one whose argument is -// of type To and one with a variadic argument list. We give them -// return types of different size, so we can use sizeof to trick the -// compiler into telling us which function it would have chosen if we -// had called it with an argument of type From. See Alexandrescu's -// _Modern C++ Design_ for more details on this sort of trick. - -struct ConvertHelper { - template - static YesType Test(To); - - template - static NoType Test(...); - - template - static From& Create(); -}; - -// Used to determine if a type is a struct/union/class. Inspired by Boost's -// is_class type_trait implementation. -struct IsClassHelper { - template - static YesType Test(void(C::*)(void)); - - template - static NoType Test(...); -}; - -} // namespace internal - -// Inherits from true_type if From is convertible to To, false_type otherwise. -// -// Note that if the type is convertible, this will be a true_type REGARDLESS -// of whether or not the conversion would emit a warning. -template -struct is_convertible - : integral_constant( - internal::ConvertHelper::Create())) == - sizeof(internal::YesType)> { -}; - -template -struct is_class - : integral_constant(0)) == - sizeof(internal::YesType)> { -}; - -template -struct enable_if {}; - -template -struct enable_if { typedef T type; }; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/BUILD.gn b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/BUILD.gn deleted file mode 100644 index 5deed1e9b..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/BUILD.gn +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2020 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is separate from build/config/BUILD.gn to avoid including various .gni -# that it requires, which in turn conflict with settings from BUILDCONFIG.gn -# when building in other trees. - -import("./buildflag_header.gni") -import("./platform.gni") - -config("mini_chromium_config") { - include_dirs = [ - "..", - root_gen_dir, - ] -} - -source_set("build") { - sources = [ "build_config.h" ] - public_configs = [ ":mini_chromium_config" ] - public_deps = [ ":buildflag_header_h" ] -} - -source_set("buildflag_header_h") { - sources = [ "buildflag.h" ] -} - -buildflag_header("chromeos_buildflags") { - header = "chromeos_buildflags.h" - header_dir = "build" - - flags = [ - "IS_CHROMEOS_LACROS=$mini_chromium_is_chromeos_lacros", - "IS_CHROMEOS_ASH=$mini_chromium_is_chromeos_ash", - ] -} diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/build_config.h b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/build_config.h deleted file mode 100644 index d3db6bd30..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/build_config.h +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2008 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ -#define MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ - -#include "build/buildflag.h" - -#if defined(__APPLE__) -#include -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_APPLE() 1 -#if defined(TARGET_OS_OSX) && TARGET_OS_OSX -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_MAC() 1 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_IOS() 0 -#elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_MAC() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_IOS() 1 -#endif // TARGET_OS_* -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_ANDROID() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_LINUX() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_WIN() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_FUCHSIA() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_POSIX() 1 -#elif defined(__ANDROID__) -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_APPLE() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_MAC() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_IOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_ANDROID() 1 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_LINUX() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_WIN() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_FUCHSIA() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_POSIX() 1 -#elif defined(__linux__) -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_APPLE() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_MAC() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_IOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_ANDROID() 0 -#if !defined(OS_CHROMEOS) -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_LINUX() 1 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS() 0 -#else -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_LINUX() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS() 1 -#endif -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_WIN() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_FUCHSIA() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_POSIX() 1 -#elif defined(_WIN32) -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_APPLE() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_MAC() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_IOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_ANDROID() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_LINUX() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_WIN() 1 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_FUCHSIA() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_POSIX() 0 -#elif defined(__Fuchsia__) -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_APPLE() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_MAC() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_IOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_ANDROID() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_LINUX() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_CHROMEOS() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_WIN() 0 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_FUCHSIA() 1 -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_IS_POSIX() 1 -#else -#error Please add support for your platform in build/build_config.h -#endif - -// Compiler detection. -#if defined(__GNUC__) -#define COMPILER_GCC 1 -#elif defined(_MSC_VER) -#define COMPILER_MSVC 1 -#else -#error Please add support for your compiler in build/build_config.h -#endif - -#if defined(_M_X64) || defined(__x86_64__) -#define ARCH_CPU_X86_FAMILY 1 -#define ARCH_CPU_X86_64 1 -#define ARCH_CPU_64_BITS 1 -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(_M_IX86) || defined(__i386__) -#define ARCH_CPU_X86_FAMILY 1 -#define ARCH_CPU_X86 1 -#define ARCH_CPU_32_BITS 1 -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(__ARMEL__) -#define ARCH_CPU_ARM_FAMILY 1 -#define ARCH_CPU_ARMEL 1 -#define ARCH_CPU_32_BITS 1 -#elif defined(_M_ARM64) || defined(__aarch64__) -#define ARCH_CPU_ARM_FAMILY 1 -#define ARCH_CPU_ARM64 1 -#define ARCH_CPU_64_BITS 1 -#if defined(_M_ARM64) -#define ARCH_CPU_LITTLE_ENDIAN 1 -#endif -#elif defined(__MIPSEL__) -#define ARCH_CPU_MIPS_FAMILY 1 -#if !defined(__LP64__) -#define ARCH_CPU_MIPSEL 1 -#define ARCH_CPU_32_BITS 1 -#else -#define ARCH_CPU_MIPS64EL 1 -#define ARCH_CPU_64_BITS 1 -#endif -#else -#error Please add support for your architecture in build/build_config.h -#endif - -#if !defined(ARCH_CPU_LITTLE_ENDIAN) && !defined(ARCH_CPU_BIG_ENDIAN) -#if defined(__LITTLE_ENDIAN__) || \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(__BIG_ENDIAN__) || \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) -#define ARCH_CPU_BIG_ENDIAN 1 -#else -#error Please add support for your architecture in build/build_config.h -#endif -#endif - -#if BUILDFLAG(IS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \ - (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff) -#define WCHAR_T_IS_UTF32 -#elif BUILDFLAG(IS_WIN) -#define WCHAR_T_IS_UTF16 -#else -#error Please add support for your compiler in build/build_config.h -#endif - -#endif // MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag.h b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag.h deleted file mode 100644 index 889e17b53..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BUILD_BUILDFLAG_H_ -#define BUILD_BUILDFLAG_H_ - -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_CAT_INDIRECT(a, b) a##b -#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_CAT(a, b) \ - MINI_CHROMIUM_INTERNAL_BUILDFLAG_CAT_INDIRECT(a, b) - -#define BUILDFLAG(flag) \ - (MINI_CHROMIUM_INTERNAL_BUILDFLAG_CAT( \ - MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_, flag)()) - -#endif // BUILD_BUILDFLAG_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag_header.gni b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag_header.gni deleted file mode 100644 index aa888323e..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/buildflag_header.gni +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2015 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -template("buildflag_header") { - action(target_name) { - script = "write_buildflag_header.py" - - if (defined(invoker.header_dir)) { - header_file = "${invoker.header_dir}/${invoker.header}" - } else { - # Compute the path from the root to this file. - header_file = rebase_path(".", "//") + "/${invoker.header}" - } - - outputs = [ "$root_gen_dir/$header_file" ] - - # Write flags to a file just in case they exceed the system's maximum - # command line length. - # - # Using write_file instead of response_file_contents to avoid a spurious - # rule variable cycle in generated command in Ninja. - # - # See more details from the following bugs: - # * https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=76068 - # * https://github.com/ninja-build/ninja/issues/1966 - flags = [ "--flags" ] - if (defined(invoker.flags)) { - flags += invoker.flags - } - flags_file = "${root_gen_dir}/${header_file}.flags" - write_file(flags_file, flags) - inputs = [ flags_file ] - - args = [ - "--output", - header_file, # Not rebased, Python script puts it inside gen-dir. - "--rulename", - get_label_info(":$target_name", "label_no_toolchain"), - "--gen-dir", - rebase_path(root_gen_dir, root_build_dir), - "--definitions", - rebase_path(flags_file, root_build_dir), - ] - - forward_variables_from(invoker, - [ - "deps", - "public_deps", - "testonly", - "visibility", - ]) - - public_deps = [ ":buildflag_header_h" ] - } -} diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/compiler.gni b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/compiler.gni deleted file mode 100644 index ddaffc82a..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/compiler.gni +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright 2017 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("platform.gni") - -mini_chromium_is_clang = mini_chromium_is_posix || mini_chromium_is_fuchsia diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/config/BUILD.gn b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/config/BUILD.gn deleted file mode 100644 index 3937a63b2..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/config/BUILD.gn +++ /dev/null @@ -1,751 +0,0 @@ -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -################################################################################ -# DEFAULT BUILD CONFIGURATION -################################################################################ - -import("../compiler.gni") -import("../platform.gni") -import("../sysroot.gni") - -if (mini_chromium_is_mac) { - declare_args() { - # The minimum runtime macOS version that built products are expected to run - # on. If empty, the toolchain will choose its own default, typically the - # older of the SDK version and the build host’s OS version. - mac_deployment_target = "10.9" - } -} else if (mini_chromium_is_ios) { - import("../ios/ios_sdk.gni") -} else if (mini_chromium_is_android) { - declare_args() { - android_ndk_root = "" - android_api_level = 21 - } -} else if (mini_chromium_is_linux) { - declare_args() { - # Path to the Clang toolchain. If unset, uses the system-installed Clang. - clang_path = "" - - # If set, link against libstdc++ statically. - link_libstdcpp_statically = false - } -} else if (mini_chromium_is_fuchsia) { - declare_args() { - # Path to the Fuchsia Clang toolchain. - clang_path = "//third_party/fuchsia/clang/" + host_os + "-amd64" - } -} else if (mini_chromium_is_win) { - declare_args() { - # Path to the Windows toolchain. If "", discovery of the - # system-installed toolchain will be attempted. Otherwise, - # win_sdk\bin\SetEnv.cmd inside this path will be used to configure the - # Windows toolchain. - win_toolchain_path = "" - } -} - -declare_args() { - # Extra flags passed to the C compiler. - # Space-separated string of flags. - # "cflags" are passed to all invocations of the C, C++, Objective-C, and - # Objective-C++ compilers. - extra_cflags = "" - - # Extra flags passed to the C compiler. - # Space-separated string of flags. - extra_cflags_c = "" - - # Extra flags passed to the C++ compiler. - # Space-separated string of flags. - extra_cflags_cc = "" - - # Extra flags passed to the Objective-C compiler. - # Space-separated string of flags. - extra_cflags_objc = "" - - # Extra flags passed to the Objective-C++ compiler. - # Space-separated string of flags. - extra_cflags_objcc = "" - - # Extra flags passed to the linker. - # Space-separated string of flags. - # These flags are passed on the command-line to the linker and generally - # specify various linking options. - extra_ldflags = "" - - # Extra arguments passed to static_library archiver - # Space-separated string of flags. - # A list of flags passed to the archive/lib command that creates static - # libraries. - extra_arflags = "" -} - -config("debug") { - if (!mini_chromium_is_win) { - cflags = [ "-g" ] - } -} - -config("release") { - defines = [ "NDEBUG" ] - - if (mini_chromium_is_posix || mini_chromium_is_fuchsia) { - cflags = [ "-O3" ] - if (mini_chromium_is_mac || mini_chromium_is_ios) { - ldflags = [ "-Wl,-dead_strip" ] - } else { - cflags += [ - "-fdata-sections", - "-ffunction-sections", - ] - ldflags = [ - "-Wl,-O1", - "-Wl,--gc-sections", - ] - } - } else if (mini_chromium_is_win) { - cflags = [ - "/GL", # LTCG. - "/O2", - "/Ob2", # Both explicit and auto inlining. - "/Oy-", # Disable omitting frame pointers, must be after /O2. - "/Zc:inline", # Remove unreferenced COMDAT (faster links). - "/d2Zi+", # Improve debugging of optimized code. - ] - ldflags = [ - "/OPT:ICF", - "/OPT:REF", - "/LTCG", - ] - arflags = [ "/LTCG" ] - } -} - -config("default") { - common_flags = [] - - asmflags = [] - ldflags = [] - if (mini_chromium_is_posix || mini_chromium_is_fuchsia) { - cflags = [ - "-Wall", - "-Wendif-labels", - "-Werror", - "-Wextra", - "-Wextra-semi", - "-Wheader-hygiene", - "-Wnewline-eof", - "-Wno-missing-field-initializers", - "-Wno-unused-parameter", - "-Wsign-compare", - "-Wstring-conversion", - "-Wvla", - "-fno-exceptions", - "-fno-rtti", - "-fno-strict-aliasing", # See https://crbug.com/32204 - "-fobjc-call-cxx-cdtors", - "-fstack-protector-all", # Implies -fstack-protector - "-fvisibility-inlines-hidden", - "-fvisibility=hidden", - ] - - cflags_c = [ "-std=c11" ] - cflags_cc = [ "-std=c++17" ] - cflags_objc = cflags_c - cflags_objcc = cflags_cc - - if (sysroot != "") { - if (sysroot == rebase_path(sysroot)) { - # If it’s already system-absolute, leave it alone. - sysroot_path = sysroot - } else { - sysroot_path = rebase_path(sysroot, root_build_dir) - } - if (mini_chromium_is_mac || mini_chromium_is_ios) { - common_flags += [ - "-isysroot", - sysroot_path, - ] - } else { - common_flags += [ "--sysroot=" + sysroot_path ] - } - } - - if (mini_chromium_is_mac || mini_chromium_is_ios) { - if (current_cpu == "x86") { - common_flags += [ - "-arch", - "i386", - ] - } else if (current_cpu == "x64") { - common_flags += [ - "-arch", - "x86_64", - ] - } else if (current_cpu == "arm64") { - common_flags += [ - "-arch", - "arm64", - ] - } else if (mini_chromium_is_mac && current_cpu == "mac_universal") { - common_flags += [ - "-arch", - "x86_64", - "-arch", - "arm64", - ] - } else { - assert(false, "Unsupported architecture") - } - } - - if (mini_chromium_is_fuchsia) { - common_flags += [ - # The Fuchsia SDK no longer dumps everything in the sysroot, preferring - # the layout described in - # https://fuchsia.googlesource.com/docs/+/master/development/sdk/layout.md. - # Eventually /sysroot will be replaced by /pkg/system, but this work is - # not yet complete. - "-isystem", - rebase_path(fuchsia_sdk + "/pkg/fdio/include", root_build_dir), - ] - - lib_dirs = [ fuchsia_sdk + "/arch/$target_cpu/lib" ] - } - } - - if (mini_chromium_is_mac) { - if (mac_deployment_target != "") { - common_flags += [ "-mmacosx-version-min=" + mac_deployment_target ] - } - } - - if (mini_chromium_is_ios) { - if (ios_deployment_target != "") { - if (target_environment == "simulator") { - common_flags += - [ "-mios-simulator-version-min=" + ios_deployment_target ] - } else if (target_environment == "device") { - common_flags += [ "-mios-version-min=" + ios_deployment_target ] - } - } - } - - if (mini_chromium_is_win) { - cflags = [ - "/DNOMINMAX", - "/DUNICODE", - "/DWIN32_LEAN_AND_MEAN", - "/D_CRT_SECURE_NO_WARNINGS", - "/D_HAS_EXCEPTIONS=0", - "/D_UNICODE", - "/FS", - "/W4", - "/WX", - "/Zi", - "/bigobj", # Support larger number of sections in obj file. - "/wd4100", # Unreferenced formal parameter. - "/wd4127", # Conditional expression is constant. - "/wd4324", # Structure was padded due to alignment specifier. - "/wd4351", # New behavior: elements of array will be default initialized. - "/wd4577", # 'noexcept' used with no exception handling mode specified. - "/wd4996", # 'X' was declared deprecated. - ] - - cflags_cc = [ - "/std:c++17", - "/Zc:__cplusplus", - ] - - ldflags += [ "/DEBUG" ] - - libs = [ "kernel32.lib" ] - } - - if (mini_chromium_is_linux) { - defines = [ "_FILE_OFFSET_BITS=64" ] - common_flags += [ "-pthread" ] - - if (current_cpu == "x86") { - common_flags += [ - "-m32", - ] - } else if (current_cpu == "x64") { - common_flags += [ - "-m64", - ] - } else { - assert(false, "Unsupported architecture") - } - - # This is currently required by the clang toolchain build that DEPS uses - # from the Fuchsia team. Only a static libc++ is provided, and it requires - # both -ldl and -pthread. (-pthread was already needed by mini_chromium and - # Crashpad). Eventually, the clang build should automatically add these - # when needed, but it does not do that yet, so manually add libdl here for - # now. - libs = [ "dl" ] - - if (link_libstdcpp_statically) { - # The sysroot being built against is based on Stretch, which is newer than - # the libstdc++ that's on Trusty (14.04) which is the Chromium minspec. - # This minspec determines what the available buildbots are. Chromium - # doesn't have a problem with libstdc++ despite this, because it links - # against a local copy of libc++ instead. As this build file only affects - # the standalone Crashpad build, when this flag is set link libstdc++ - # statically to avoid the problem on the bots. - cflags += [ "-stdlib=libstdc++" ] - ldflags += [ - "-rtlib=libgcc", - "-static-libstdc++", - "-stdlib=libstdc++", - ] - } - } - - if (mini_chromium_is_fuchsia) { - if (target_cpu == "arm64") { - common_flags += [ "--target=aarch64-fuchsia" ] - } else if (target_cpu == "x64") { - common_flags += [ "--target=x86_64-fuchsia" ] - } else { - assert(false, "Unsupported architecture") - } - - # fdio is listed in ldflags instead of libs because it’s important for it to - # be loaded in Fuchsia processes that expect POSIX-like file descriptor - # semantics, even if they don’t explicitly reference anything in the fdio - # library. To avoid inadvertently losing the runtime dependency, it must - # come before -Wl,--as-needed below. fdio needs zircon (and zircon needs to - # be in every process anyway). - ldflags += [ - "-lfdio", - "-lzircon", - ] - } - - if ((mini_chromium_is_posix && !mini_chromium_is_mac && - !mini_chromium_is_ios) || mini_chromium_is_fuchsia) { - cflags += [ "-fPIC" ] - ldflags += [ - # This must follow Fuchsia’s fdio library above. - "-Wl,--as-needed", - - "-Wl,-z,noexecstack", - ] - } - - cflags += common_flags - asmflags += common_flags - ldflags += common_flags - - if (is_debug) { - configs = [ ":debug" ] - } else { - configs = [ ":release" ] - } -} - -config("executable") { - if (mini_chromium_is_linux) { - ldflags = [ "-pie" ] - } -} - -config("ios_enable_arc") { - if (mini_chromium_is_ios) { - common_flags = [ "-fobjc-arc" ] - cflags_objc = common_flags - cflags_objcc = common_flags - } -} - -config("Wexit_time_destructors") { - if (mini_chromium_is_clang) { - cflags = [ "-Wexit-time-destructors" ] - } -} - -config("Wimplicit_fallthrough") { - if (mini_chromium_is_clang) { - cflags = [ "-Wimplicit-fallthrough" ] - } -} - -config("win_console") { - if (mini_chromium_is_win) { - ldflags = [ "/SUBSYSTEM:CONSOLE" ] - } -} - -config("win_windowed") { - if (mini_chromium_is_win) { - ldflags = [ "/SUBSYSTEM:WINDOWS" ] - } -} - -################################################################################ -# TOOLCHAIN DEFINITIONS -################################################################################ - -toolchain("gcc_like_toolchain") { - lib_switch = "-l" - lib_dir_switch = "-L" - - if ((mini_chromium_is_linux || mini_chromium_is_fuchsia) && - clang_path != "") { - cc = rebase_path(clang_path, root_build_dir) + "/bin/clang" - cxx = rebase_path(clang_path, root_build_dir) + "/bin/clang++" - asm = cxx - ar = rebase_path(clang_path, root_build_dir) + "/bin/llvm-ar" - ld = cxx - } else if (mini_chromium_is_android) { - assert(android_ndk_root != "", "Android builds must set android_ndk_root") - - if (host_os == "linux") { - ndk_host_arch = "linux-x86_64" - } else if (host_os == "mac") { - ndk_host_arch = "darwin-x86_64" - } else if (host_os == "win") { - ndk_host_arch = "windows-x86_64" - } - ndk_bin_dir = string_join("/", [android_ndk_root, "toolchains", "llvm", - "prebuilt", ndk_host_arch, "bin", ""]) - - if (target_cpu == "arm") { - tool_prefix = "arm-linux-androideabi" - } else if (target_cpu == "arm64") { - tool_prefix = "aarch64-linux-android" - } else if (target_cpu == "x86") { - tool_prefix = "i686-linux-android" - } else if (target_cpu == "x64") { - tool_prefix = "x86_64-linux-android" - } - - if (target_cpu == "arm") { - clang_prefix = "armv7a-linux-androideabi" + android_api_level - } else { - clang_prefix = tool_prefix + android_api_level - } - - cc = ndk_bin_dir + clang_prefix + "-clang" - cxx = ndk_bin_dir + clang_prefix + "-clang++" - asm = cxx - ld = cxx - ar = ndk_bin_dir + tool_prefix + "-ar" - } else { - cc = "clang" - cxx = "clang++" - asm = cxx - ld = cxx - - if (!mini_chromium_is_mac && !mini_chromium_is_ios) { - # macOS uses libtool instead of ar. - ar = "ar" - } - } - - if (defined(extra_cflags) && extra_cflags != "") { - extra_cflags = " " + extra_cflags - } else { - extra_cflags = "" - } - if (defined(extra_cflags_c) && extra_cflags_c != "") { - extra_cflags_c = " " + extra_cflags_c - } else { - extra_cflags_c = "" - } - if (defined(extra_cflags_cc) && extra_cflags_cc != "") { - extra_cflags_cc = " " + extra_cflags_cc - } else { - extra_cflags_cc = "" - } - if (defined(extra_ldflags) && extra_ldflags != "") { - extra_ldflags = " " + extra_ldflags - } else { - extra_ldflags = "" - } - if (defined(extra_arflags) && extra_arflags != "") { - extra_arflags = " " + extra_arflags - } else { - extra_arflags = "" - } - - tool("cc") { - depfile = "{{output}}.d" - command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_c}}${extra_cflags}${extra_cflags_c} -c {{source}} -o {{output}}" - depsformat = "gcc" - description = "CC {{output}}" - outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ] - } - - tool("cxx") { - depfile = "{{output}}.d" - command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_cc}}${extra_cflags}${extra_cflags_cc} -c {{source}} -o {{output}}" - depsformat = "gcc" - description = "CXX {{output}}" - outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ] - } - - if (mini_chromium_is_mac || mini_chromium_is_ios) { - if (defined(extra_cflags_objc) && extra_cflags_objc != "") { - extra_cflags_objc = " " + extra_cflags_objc - } else { - extra_cflags_objc = "" - } - if (defined(extra_cflags_objcc) && extra_cflags_objcc != "") { - extra_cflags_objcc = " " + extra_cflags_objcc - } else { - extra_cflags_objcc = "" - } - - tool("objc") { - depfile = "{{output}}.d" - command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objc}}${extra_cflags}${extra_cflags_objc} -c {{source}} -o {{output}}" - depsformat = "gcc" - description = "OBJC {{output}}" - outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ] - } - - tool("objcxx") { - depfile = "{{output}}.d" - command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objcc}}${extra_cflags}${extra_cflags_objcc} -c {{source}} -o {{output}}" - depsformat = "gcc" - description = "OBJCXX {{output}}" - outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ] - } - - # TODO(justincohen): Clean this up to use the more correct timestamp - # preserving -a in the fallback case once bots are all running macOS ≥ 11. - tool("copy_bundle_data") { - command = - "rm -rf {{output}} && cp -fRc {{source}} {{output}} 2>/dev/null " + - "|| (rm -rf {{output}} && cp -fR {{source}} {{output}})" - description = "COPY_BUNDLE_DATA {{source}} {{output}}" - } - - tool("compile_xcassets") { - command = "/bin/true" - } - } - - tool("asm") { - depfile = "{{output}}.d" - command = "$asm -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" - depsformat = "gcc" - description = "ASM {{output}}" - outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ] - } - - tool("alink") { - if (mini_chromium_is_mac || mini_chromium_is_ios) { - command = "libtool -static -no_warning_for_no_symbols {{arflags}}${extra_arflags} -o {{output}} {{inputs}}" - } else { - command = "rm -f {{output}}; $ar rcsD {{arflags}}${extra_arflags} {{output}} {{inputs}}" - } - description = "AR {{output}}" - default_output_dir = "{{target_out_dir}}" - default_output_extension = ".a" - output_prefix = "lib" - outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ] - } - - tool("solink_module") { - # TODO(scottmg): This will need to do -framework, etc. for macOS. - soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". - sofile = "{{output_dir}}/$soname" - - soname_flag = "" - start_whole_flag = "" - end_whole_flag = "" - if (mini_chromium_is_mac || mini_chromium_is_ios) { - soname_flag = "-Wl,-install_name,\"$soname\"" - } else { - soname_flag = "-Wl,-soname=\"$soname\"" - start_whole_flag = "-Wl,--whole-archive" - end_whole_flag = "-Wl,--no-whole-archive " - } - command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$sofile\" $soname_flag $start_whole_flag {{inputs}} {{solibs}} {{frameworks}} $end_whole_flag {{libs}}" - description = "SOLINK_MODULE $sofile" - - default_output_dir = "{{root_out_dir}}" - default_output_extension = ".so" - - outputs = [ sofile ] - } - - tool("link") { - exename = "{{target_output_name}}{{output_extension}}" - outfile = "{{output_dir}}/$exename" - - start_group_flag = "" - end_group_flag = "" - if (!mini_chromium_is_mac && !mini_chromium_is_ios) { - start_group_flag = "-Wl,--start-group" - end_group_flag = "-Wl,--end-group" - } - command = "$ld {{ldflags}}${extra_ldflags} -o \"$outfile\" $start_group_flag {{inputs}} {{solibs}} {{frameworks}} $end_group_flag {{libs}}" - description = "LINK $outfile" - - default_output_dir = "{{root_out_dir}}" - default_output_extension = "" - outputs = [ outfile ] - } - - tool("stamp") { - command = "touch {{output}}" - description = "STAMP {{output}}" - } - - tool("copy") { - command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})" - description = "COPY {{source}} {{output}}" - } -} - -if (mini_chromium_is_win) { - helper_path = rebase_path("../win_helper.py") - toolchain_data = exec_script(helper_path, - [ - "get-visual-studio-data", - rebase_path(root_build_dir), - rebase_path(win_toolchain_path), - ], - "scope") - - # Required arguments: - # - environment_file: Path to saved environment file (see win_helper.py). - # - current_cpu: The cpu to target with this toolchain. - template("msvc_toolchain") { - toolchain("msvc_toolchain_$target_name") { - # @rsp files are not used for simplicity, and because mini_chromium and - # Crashpad shouldn't require them in any configurations. - cc = "cl.exe" - cxx = "cl.exe" - ar = "lib.exe" - ld = "link.exe" - lib_switch = "" - lib_dir_switch = "/LIBPATH:" - env = invoker.environment_file - - if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") { - extra_cflags = " " + invoker.extra_cflags - } else { - extra_cflags = "" - } - if (defined(invoker.extra_cflags_c) && invoker.extra_cflags_c != "") { - extra_cflags_c = " " + invoker.extra_cflags_c - } else { - extra_cflags_c = "" - } - if (defined(invoker.extra_cflags_cc) && invoker.extra_cflags_cc != "") { - extra_cflags_cc = " " + invoker.extra_cflags_cc - } else { - extra_cflags_cc = "" - } - if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") { - extra_ldflags = " " + invoker.extra_ldflags - } else { - extra_ldflags = "" - } - if (defined(invoker.extra_arflags) && invoker.extra_arflags != "") { - extra_arflags = " " + invoker.extra_arflags - } else { - extra_arflags = "" - } - - tool("cc") { - depfile = "{{output}}.d" - pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb" - command = "ninja -t msvc -e $env -- $cc /nologo /showIncludes {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cflags}${extra_cflags_c} /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" - depsformat = "msvc" - description = "CC {{output}}" - outputs = - [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj" ] - } - - tool("cxx") { - depfile = "{{output}}.d" - pdbname = "{{target_out_dir}}/{{label_name}}_cc.pdb" - command = "ninja -t msvc -e $env -- $cxx /nologo /showIncludes {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cflags}${extra_cflags_cc} /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" - depsformat = "msvc" - description = "CXX {{output}}" - outputs = - [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj" ] - } - - tool("alink") { - command = "$python_path $helper_path link-wrapper $env $ar /nologo /out:{{output}} {{arflags}}${extra_arflags} {{inputs}}" - description = "AR {{output}}" - outputs = - [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ] - default_output_dir = "{{target_out_dir}}" - default_output_extension = ".lib" - output_prefix = "" - } - - tool("solink_module") { - outputs = - [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ] - command = "$python_path $helper_path link-wrapper $env $ld /nologo /DLL /OUT:{{output}} {{ldflags}}${extra_ldflags} {{inputs}} {{solibs}} {{libs}}" - description = "SOLINK_MODULE {{output}}" - default_output_dir = "{{root_out_dir}}" - default_output_extension = ".dll" - } - - tool("link") { - outputs = - [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ] - command = "$python_path $helper_path link-wrapper $env $ld /nologo /OUT:{{output}} {{ldflags}}${extra_ldflags} {{inputs}} {{solibs}} {{libs}}" - description = "LINK {{output}}" - default_output_dir = "{{root_out_dir}}" - default_output_extension = ".exe" - } - - tool("asm") { - if (invoker.current_cpu == "arm64") { - ml = "armasm64.exe" - command = "$python_path $helper_path asm-wrapper $env $ml {{include_dirs}} {{asmflags}} -o {{output}} {{source}}" - } else { - if (invoker.current_cpu == "x86") { - ml = "ml.exe" - } else { - ml = "ml64.exe" - } - command = "$python_path $helper_path asm-wrapper $env $ml {{defines}} {{include_dirs}} {{asmflags}} /c /Fo{{output}} {{source}}" - } - description = "ASM {{output}}" - outputs = - [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj" ] - } - - tool("stamp") { - command = "$python_path $helper_path stamp {{output}}" - description = "STAMP {{output}}" - } - - tool("copy") { - command = "cmd /c copy /y {{source}} {{output}} >nul" - description = "COPY {{source}} {{output}}" - } - } - } - - msvc_toolchain("x64") { - environment_file = toolchain_data.x64_environment_file - current_cpu = "x64" - } - - msvc_toolchain("x86") { - environment_file = toolchain_data.x86_environment_file - current_cpu = "x86" - } - - msvc_toolchain("arm64") { - environment_file = toolchain_data.arm64_environment_file - current_cpu = "arm64" - } -} diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/find_mac_sdk.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/find_mac_sdk.py deleted file mode 100755 index 582c118a8..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/find_mac_sdk.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# Copyright 2012 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -from __future__ import print_function - -import argparse -import distutils.version -import os -import re -import subprocess -import sys -import textwrap - - -def _AsVersion(string): - return distutils.version.StrictVersion(string) - - -def _RunXCRun(args, sdk=None): - xcrun_args = ['xcrun'] - if sdk is not None: - xcrun_args.extend(['--sdk', sdk]) - xcrun_args.extend(args) - return subprocess.check_output(xcrun_args).decode('utf-8').rstrip() - - -def _SDKPath(sdk=None): - return _RunXCRun(['--show-sdk-path'], sdk) - - -def _SDKVersion(sdk=None): - return _AsVersion(_RunXCRun(['--show-sdk-version'], sdk)) - - -class DidNotMeetCriteria(Exception): - pass - - -def _FindPlatformSDKWithMinimumVersion(platform, minimum_sdk_version_str): - minimum_sdk_version = _AsVersion(minimum_sdk_version_str) - - # Try the SDKs that Xcode knows about. - xcodebuild_showsdks_subprocess = subprocess.Popen( - ['xcodebuild', '-showsdks'], - stdout=subprocess.PIPE, - stderr=open(os.devnull, 'w')) - xcodebuild_showsdks_output = ( - xcodebuild_showsdks_subprocess.communicate()[0].decode('utf-8')) - if xcodebuild_showsdks_subprocess.returncode == 0: - # Collect strings instead of version objects to preserve the precise - # format used to identify each SDK. - sdk_version_strs = [] - for line in xcodebuild_showsdks_output.splitlines(): - match = re.match('[ \t].+[ \t]-sdk ' + re.escape(platform) + '(.+)$', - line) - if match: - sdk_version_str = match.group(1) - if _AsVersion(sdk_version_str) >= minimum_sdk_version: - sdk_version_strs.append(sdk_version_str) - - if len(sdk_version_strs) == 0: - raise DidNotMeetCriteria({'minimum': minimum_sdk_version_str, - 'platform': platform}) - sdk_version_str = sorted(sdk_version_strs, key=_AsVersion)[0] - sdk_path = _SDKPath(platform + sdk_version_str) - sdk_version = _AsVersion(sdk_version_str) - else: - # Xcode may not be installed. If the command-line tools are installed, use - # the system’s default SDK if it meets the requirements. - sdk_path = _SDKPath() - sdk_version = _SDKVersion() - if sdk_version < minimum_sdk_version: - raise DidNotMeetCriteria({'minimum': minimum_sdk_version_str, - 'platform': platform, - 'sdk_path': sdk_path, - 'sdk_version': str(sdk_version)}) - - return (sdk_version, sdk_path) - - -def main(args): - parser = argparse.ArgumentParser( - description='Find an appropriate platform SDK', - epilog='Two lines will be written to standard output: the version of the ' - 'selected SDK, and its path.') - parser.add_argument('--developer-dir', - help='path to Xcode or Command Line Tools') - parser.add_argument('--exact', help='an exact SDK version to find') - parser.add_argument('--minimum', help='the minimum SDK version to find') - parser.add_argument('--path', help='a known SDK path to validate') - parser.add_argument('--platform', - default='macosx', - help='the platform to target') - parsed = parser.parse_args(args) - - if parsed.developer_dir is not None: - os.environ['DEVELOPER_DIR'] = parsed.developer_dir - - if (os.environ.get('DEVELOPER_DIR') is None and - subprocess.call(['xcode-select', '--print-path'], - stdout=open(os.devnull, 'w'), - stderr=open(os.devnull, 'w')) != 0): - # This is friendlier than letting the first invocation of xcrun or - # xcodebuild show the UI prompting to install developer tools at an - # inopportune time. - hint = 'Install Xcode and run "sudo xcodebuild -license"' - if parsed.platform == 'macosx': - hint += ', or install Command Line Tools with "xcode-select --install"' - hint += ('. If necessary, run "sudo xcode-select --switch" to select an ' - 'active developer tools installation.') - hint = '\n'.join(textwrap.wrap(hint, 80)) - print(os.path.basename(sys.argv[0]) + - ': No developer tools found.\n' + - hint, - file=sys.stderr) - return 1 - - if parsed.path is not None: - # _SDKVersion() doesn’t work with a relative pathname argument or one that’s - # a symbolic link. Such paths are suitable for other purposes, like “clang - # -isysroot”, so use an absolute non-symbolic link path for _SDKVersion(), - # but preserve the user’s path in sdk_path. - sdk_version = _SDKVersion(os.path.realpath(parsed.path)) - sdk_path = parsed.path - elif parsed.exact is None and parsed.minimum is None: - # Use the platform’s default SDK. - sdk_version = _SDKVersion(parsed.platform) - sdk_path = _SDKPath(parsed.platform) - elif parsed.exact is not None: - sdk_version = _SDKVersion(parsed.platform + parsed.exact) - sdk_path = _SDKPath(parsed.platform + parsed.exact) - else: - (sdk_version, - sdk_path) = _FindPlatformSDKWithMinimumVersion(parsed.platform, - parsed.minimum) - - # These checks may be redundant depending on how the SDK was chosen. - if ((parsed.exact is not None and sdk_version != _AsVersion(parsed.exact)) or - (parsed.minimum is not None and - sdk_version < _AsVersion(parsed.minimum))): - raise DidNotMeetCriteria({'developer_dir': parsed.developer_dir, - 'exact': parsed.exact, - 'minimum': parsed.minimum, - 'path': parsed.path, - 'platform': parsed.platform, - 'sdk_path': sdk_path, - 'sdk_version': str(sdk_version)}) - - # Nobody wants trailing slashes. This is true even if “/” is the SDK: it’s - # better to return an empty string, which will be interpreted as “no sysroot.” - sdk_path = sdk_path.rstrip(os.path.sep) - - print(sdk_version) - print(sdk_path) - - return 0 - - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Application-Info.plist b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Application-Info.plist deleted file mode 100644 index d185f602d..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Application-Info.plist +++ /dev/null @@ -1,114 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${IOS_BUNDLE_ID_PREFIX}.googletest.${EXECUTABLE_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIApplicationDelegate - MiniChromiumApplicationDelegate - UILaunchImages - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {320, 480} - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {320, 568} - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {375, 667} - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {414, 736} - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {375, 812} - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {414, 896} - - - UILaunchImages~ipad - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {768, 1024} - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {1024, 1366} - - - UILaunchImageMinimumOSVersion - 9.0 - UILaunchImageName - Default - UILaunchImageSize - {832, 1114} - - - UISupportedInterfaceOrientation - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BUILD.gn b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BUILD.gn deleted file mode 100644 index c189fd1e3..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BUILD.gn +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2014 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("ios_sdk.gni") - -config("xctest_config") { - common_flags = [ - "-F", - "$ios_sdk_platform_path/Developer/Library/Frameworks", - ] - - cflags = common_flags - ldflags = common_flags - - frameworks = [ - "Foundation.framework", - "XCTest.framework", - ] -} diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BuildInfo.plist b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BuildInfo.plist deleted file mode 100644 index efd4e6701..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/BuildInfo.plist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - BuildMachineOSBuild - ${BUILD_MACHINE_OS_BUILD} - CFBundleSupportedPlatforms - - ${IOS_SUPPORTED_PLATFORM} - - DTCompiler - ${GCC_VERSION} - DTPlatformBuild - ${IOS_PLATFORM_BUILD} - DTPlatformName - ${IOS_PLATFORM_NAME} - DTPlatformVersion - ${IOS_PLATFORM_VERSION} - DTSDKBuild - ${IOS_SDK_BUILD} - DTSDKName - ${IOS_SDK_NAME} - DTXcode - ${XCODE_VERSION} - DTXcodeBuild - ${XCODE_BUILD} - MinimumOSVersion - ${IOS_DEPLOYMENT_TARGET} - UIDeviceFamily - - 1 - 2 - - - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Module-Info.plist b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Module-Info.plist deleted file mode 100644 index b1c0421e5..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/Module-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${IOS_BUNDLE_ID_PREFIX}.${MODULE_BUNDLE_ID:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - ${XCTEST_BUNDLE_PRINCIPAL_CLASS} - - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/XCTRunnerAddition+Info.plist b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/XCTRunnerAddition+Info.plist deleted file mode 100644 index 040d76c37..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/XCTRunnerAddition+Info.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${BUNDLE_IDENTIFIER} - CFBundleName - ${PRODUCT_NAME} - - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/codesign.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/codesign.py deleted file mode 100644 index 9b539c3b5..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/codesign.py +++ /dev/null @@ -1,691 +0,0 @@ -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -from __future__ import print_function - -import argparse -import codecs -import datetime -import fnmatch -import glob -import json -import os -import plistlib -import shutil -import subprocess -import sys -import tempfile - -if sys.version_info.major < 3: - basestring_compat = basestring -else: - basestring_compat = str - - -def GetProvisioningProfilesDir(): - """Returns the location of the installed mobile provisioning profiles. - - Returns: - The path to the directory containing the installed mobile provisioning - profiles as a string. - """ - return os.path.join( - os.environ['HOME'], 'Library', 'MobileDevice', 'Provisioning Profiles') - - -def ReadPlistFromString(plist_bytes): - """Parse property list from given |plist_bytes|. - - Args: - plist_bytes: contents of property list to load. Must be bytes in python 3. - - Returns: - The contents of property list as a python object. - """ - if sys.version_info.major == 2: - return plistlib.readPlistFromString(plist_bytes) - else: - return plistlib.loads(plist_bytes) - - -def LoadPlistFile(plist_path): - """Loads property list file at |plist_path|. - - Args: - plist_path: path to the property list file to load. - - Returns: - The content of the property list file as a python object. - """ - if sys.version_info.major == 2: - return plistlib.readPlistFromString( - subprocess.check_output( - ['xcrun', 'plutil', '-convert', 'xml1', '-o', '-', plist_path])) - else: - with open(plist_path, 'rb') as fp: - return plistlib.load(fp) - - -def CreateSymlink(value, location): - """Creates symlink with value at location if the target exists.""" - target = os.path.join(os.path.dirname(location), value) - if os.path.exists(location): - os.unlink(location) - os.symlink(value, location) - - -class Bundle(object): - """Wraps a bundle.""" - - def __init__(self, bundle_path, platform): - """Initializes the Bundle object with data from bundle Info.plist file.""" - self._path = bundle_path - self._kind = Bundle.Kind(platform, os.path.splitext(bundle_path)[-1]) - self._data = None - - def Load(self): - self._data = LoadPlistFile(self.info_plist_path) - - @staticmethod - def Kind(platform, extension): - if platform == 'iphonesimulator' or platform == 'iphoneos': - return 'ios' - if platform == 'macosx': - if extension == '.framework': - return 'mac_framework' - return 'mac' - raise ValueError('unknown bundle type %s for %s' % (extension, platform)) - - @property - def kind(self): - return self._kind - - @property - def path(self): - return self._path - - @property - def contents_dir(self): - if self._kind == 'mac': - return os.path.join(self.path, 'Contents') - if self._kind == 'mac_framework': - return os.path.join(self.path, 'Versions/A') - return self.path - - @property - def executable_dir(self): - if self._kind == 'mac': - return os.path.join(self.contents_dir, 'MacOS') - return self.contents_dir - - @property - def resources_dir(self): - if self._kind == 'mac' or self._kind == 'mac_framework': - return os.path.join(self.contents_dir, 'Resources') - return self.path - - @property - def info_plist_path(self): - if self._kind == 'mac_framework': - return os.path.join(self.resources_dir, 'Info.plist') - return os.path.join(self.contents_dir, 'Info.plist') - - @property - def signature_dir(self): - return os.path.join(self.contents_dir, '_CodeSignature') - - @property - def identifier(self): - return self._data['CFBundleIdentifier'] - - @property - def binary_name(self): - return self._data['CFBundleExecutable'] - - @property - def binary_path(self): - return os.path.join(self.executable_dir, self.binary_name) - - def Validate(self, expected_mappings): - """Checks that keys in the bundle have the expected value. - - Args: - expected_mappings: a dictionary of string to object, each mapping will - be looked up in the bundle data to check it has the same value (missing - values will be ignored) - - Returns: - A dictionary of the key with a different value between expected_mappings - and the content of the bundle (i.e. errors) so that caller can format the - error message. The dictionary will be empty if there are no errors. - """ - errors = {} - for key, expected_value in expected_mappings.items(): - if key in self._data: - value = self._data[key] - if value != expected_value: - errors[key] = (value, expected_value) - return errors - - -class ProvisioningProfile(object): - """Wraps a mobile provisioning profile file.""" - - def __init__(self, provisioning_profile_path): - """Initializes the ProvisioningProfile with data from profile file.""" - self._path = provisioning_profile_path - self._data = ReadPlistFromString( - subprocess.check_output([ - 'xcrun', 'security', 'cms', '-D', '-u', 'certUsageAnyCA', '-i', - provisioning_profile_path - ])) - - @property - def path(self): - return self._path - - @property - def team_identifier(self): - return self._data.get('TeamIdentifier', [''])[0] - - @property - def name(self): - return self._data.get('Name', '') - - @property - def application_identifier_pattern(self): - return self._data.get('Entitlements', {}).get('application-identifier', '') - - @property - def application_identifier_prefix(self): - return self._data.get('ApplicationIdentifierPrefix', [''])[0] - - @property - def entitlements(self): - return self._data.get('Entitlements', {}) - - @property - def expiration_date(self): - return self._data.get('ExpirationDate', datetime.datetime.now()) - - def ValidToSignBundle(self, bundle_identifier): - """Checks whether the provisioning profile can sign bundle_identifier. - - Args: - bundle_identifier: the identifier of the bundle that needs to be signed. - - Returns: - True if the mobile provisioning profile can be used to sign a bundle - with the corresponding bundle_identifier, False otherwise. - """ - return fnmatch.fnmatch( - '%s.%s' % (self.application_identifier_prefix, bundle_identifier), - self.application_identifier_pattern) - - def Install(self, installation_path): - """Copies mobile provisioning profile info to |installation_path|.""" - shutil.copy2(self.path, installation_path) - - -class Entitlements(object): - """Wraps an Entitlement plist file.""" - - def __init__(self, entitlements_path): - """Initializes Entitlements object from entitlement file.""" - self._path = entitlements_path - self._data = LoadPlistFile(self._path) - - @property - def path(self): - return self._path - - def ExpandVariables(self, substitutions): - self._data = self._ExpandVariables(self._data, substitutions) - - def _ExpandVariables(self, data, substitutions): - if isinstance(data, basestring_compat): - for key, substitution in substitutions.items(): - data = data.replace('$(%s)' % (key,), substitution) - return data - - if isinstance(data, dict): - for key, value in data.items(): - data[key] = self._ExpandVariables(value, substitutions) - return data - - if isinstance(data, list): - for i, value in enumerate(data): - data[i] = self._ExpandVariables(value, substitutions) - - return data - - def LoadDefaults(self, defaults): - for key, value in defaults.items(): - if key not in self._data: - self._data[key] = value - - def WriteTo(self, target_path): - with open(target_path, 'wb') as fp: - if sys.version_info.major == 2: - plistlib.writePlist(self._data, fp) - else: - plistlib.dump(self._data, fp) - - -def FindProvisioningProfile(bundle_identifier, required): - """Finds mobile provisioning profile to use to sign bundle. - - Args: - bundle_identifier: the identifier of the bundle to sign. - - Returns: - The ProvisioningProfile object that can be used to sign the Bundle - object or None if no matching provisioning profile was found. - """ - provisioning_profile_paths = glob.glob( - os.path.join(GetProvisioningProfilesDir(), '*.mobileprovision')) - - # Iterate over all installed mobile provisioning profiles and filter those - # that can be used to sign the bundle, ignoring expired ones. - now = datetime.datetime.now() - valid_provisioning_profiles = [] - one_hour = datetime.timedelta(0, 3600) - for provisioning_profile_path in provisioning_profile_paths: - provisioning_profile = ProvisioningProfile(provisioning_profile_path) - if provisioning_profile.expiration_date - now < one_hour: - sys.stderr.write( - 'Warning: ignoring expired provisioning profile: %s.\n' % - provisioning_profile_path) - continue - if provisioning_profile.ValidToSignBundle(bundle_identifier): - valid_provisioning_profiles.append(provisioning_profile) - - if not valid_provisioning_profiles: - if required: - sys.stderr.write( - 'Error: no mobile provisioning profile found for "%s".\n' % - bundle_identifier) - sys.exit(1) - return None - - # Select the most specific mobile provisioning profile, i.e. the one with - # the longest application identifier pattern (prefer the one with the latest - # expiration date as a secondary criteria). - selected_provisioning_profile = max( - valid_provisioning_profiles, - key=lambda p: (len(p.application_identifier_pattern), p.expiration_date)) - - one_week = datetime.timedelta(7) - if selected_provisioning_profile.expiration_date - now < 2 * one_week: - sys.stderr.write( - 'Warning: selected provisioning profile will expire soon: %s' % - selected_provisioning_profile.path) - return selected_provisioning_profile - - -def CodeSignBundle(bundle_path, identity, extra_args): - process = subprocess.Popen( - ['xcrun', 'codesign', '--force', '--sign', identity, '--timestamp=none'] + - list(extra_args) + [bundle_path], - stderr=subprocess.PIPE, - universal_newlines=True) - _, stderr = process.communicate() - if process.returncode: - sys.stderr.write(stderr) - sys.exit(process.returncode) - for line in stderr.splitlines(): - if line.endswith(': replacing existing signature'): - # Ignore warning about replacing existing signature as this should only - # happen when re-signing system frameworks (and then it is expected). - continue - sys.stderr.write(line) - sys.stderr.write('\n') - - -def InstallSystemFramework(framework_path, bundle_path, args): - """Install framework from |framework_path| to |bundle| and code-re-sign it.""" - installed_framework_path = os.path.join( - bundle_path, 'Frameworks', os.path.basename(framework_path)) - - if os.path.isfile(framework_path): - shutil.copy(framework_path, installed_framework_path) - elif os.path.isdir(framework_path): - if os.path.exists(installed_framework_path): - shutil.rmtree(installed_framework_path) - shutil.copytree(framework_path, installed_framework_path) - - CodeSignBundle(installed_framework_path, args.identity, - ['--deep', '--preserve-metadata=identifier,entitlements,flags']) - - -def GenerateEntitlements(path, provisioning_profile, bundle_identifier): - """Generates an entitlements file. - - Args: - path: path to the entitlements template file - provisioning_profile: ProvisioningProfile object to use, may be None - bundle_identifier: identifier of the bundle to sign. - """ - entitlements = Entitlements(path) - if provisioning_profile: - entitlements.LoadDefaults(provisioning_profile.entitlements) - app_identifier_prefix = \ - provisioning_profile.application_identifier_prefix + '.' - else: - app_identifier_prefix = '*.' - entitlements.ExpandVariables({ - 'CFBundleIdentifier': bundle_identifier, - 'AppIdentifierPrefix': app_identifier_prefix, - }) - return entitlements - - -def GenerateBundleInfoPlist(bundle, plist_compiler, partial_plist): - """Generates the bundle Info.plist for a list of partial .plist files. - - Args: - bundle: a Bundle instance - plist_compiler: string, path to the Info.plist compiler - partial_plist: list of path to partial .plist files to merge - """ - - # Filter empty partial .plist files (this happens if an application - # does not compile any asset catalog, in which case the partial .plist - # file from the asset catalog compilation step is just a stamp file). - filtered_partial_plist = [] - for plist in partial_plist: - plist_size = os.stat(plist).st_size - if plist_size: - filtered_partial_plist.append(plist) - - # Invoke the plist_compiler script. It needs to be a python script. - subprocess.check_call([ - 'python3', - plist_compiler, - 'merge', - '-f', - 'binary1', - '-o', - bundle.info_plist_path, - ] + filtered_partial_plist) - - -class Action(object): - """Class implementing one action supported by the script.""" - - @classmethod - def Register(cls, subparsers): - parser = subparsers.add_parser(cls.name, help=cls.help) - parser.set_defaults(func=cls._Execute) - cls._Register(parser) - - -class CodeSignBundleAction(Action): - """Class implementing the code-sign-bundle action.""" - - name = 'code-sign-bundle' - help = 'perform code signature for a bundle' - - @staticmethod - def _Register(parser): - parser.add_argument( - '--entitlements', '-e', dest='entitlements_path', - help='path to the entitlements file to use') - parser.add_argument( - 'path', help='path to the iOS bundle to codesign') - parser.add_argument( - '--identity', '-i', required=True, - help='identity to use to codesign') - parser.add_argument( - '--binary', '-b', required=True, - help='path to the iOS bundle binary') - parser.add_argument( - '--framework', '-F', action='append', default=[], dest='frameworks', - help='install and resign system framework') - parser.add_argument( - '--disable-code-signature', action='store_true', dest='no_signature', - help='disable code signature') - parser.add_argument( - '--disable-embedded-mobileprovision', action='store_false', - default=True, dest='embedded_mobileprovision', - help='disable finding and embedding mobileprovision') - parser.add_argument( - '--platform', '-t', required=True, - help='platform the signed bundle is targeting') - parser.add_argument( - '--partial-info-plist', '-p', action='append', default=[], - help='path to partial Info.plist to merge to create bundle Info.plist') - parser.add_argument( - '--plist-compiler-path', '-P', action='store', - help='path to the plist compiler script (for --partial-info-plist)') - parser.set_defaults(no_signature=False) - - @staticmethod - def _Execute(args): - if not args.identity: - args.identity = '-' - - bundle = Bundle(args.path, args.platform) - - if args.partial_info_plist: - GenerateBundleInfoPlist(bundle, args.plist_compiler_path, - args.partial_info_plist) - - # The bundle Info.plist may have been updated by GenerateBundleInfoPlist() - # above. Load the bundle information from Info.plist after the modification - # have been written to disk. - bundle.Load() - - # According to Apple documentation, the application binary must be the same - # as the bundle name without the .app suffix. See crbug.com/740476 for more - # information on what problem this can cause. - # - # To prevent this class of error, fail with an error if the binary name is - # incorrect in the Info.plist as it is not possible to update the value in - # Info.plist at this point (the file has been copied by a different target - # and ninja would consider the build dirty if it was updated). - # - # Also checks that the name of the bundle is correct too (does not cause the - # build to be considered dirty, but still terminate the script in case of an - # incorrect bundle name). - # - # Apple documentation is available at: - # https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html - bundle_name = os.path.splitext(os.path.basename(bundle.path))[0] - errors = bundle.Validate({ - 'CFBundleName': bundle_name, - 'CFBundleExecutable': bundle_name, - }) - if errors: - for key in sorted(errors): - value, expected_value = errors[key] - sys.stderr.write('%s: error: %s value incorrect: %s != %s\n' % ( - bundle.path, key, value, expected_value)) - sys.stderr.flush() - sys.exit(1) - - # Delete existing embedded mobile provisioning. - embedded_provisioning_profile = os.path.join( - bundle.path, 'embedded.mobileprovision') - if os.path.isfile(embedded_provisioning_profile): - os.unlink(embedded_provisioning_profile) - - # Delete existing code signature. - if os.path.exists(bundle.signature_dir): - shutil.rmtree(bundle.signature_dir) - - # Install system frameworks if requested. - for framework_path in args.frameworks: - InstallSystemFramework(framework_path, args.path, args) - - # Copy main binary into bundle. - if not os.path.isdir(bundle.executable_dir): - os.makedirs(bundle.executable_dir) - shutil.copy(args.binary, bundle.binary_path) - - if bundle.kind == 'mac_framework': - # Create Versions/Current -> Versions/A symlink - CreateSymlink('A', os.path.join(bundle.path, 'Versions/Current')) - - # Create $binary_name -> Versions/Current/$binary_name symlink - CreateSymlink(os.path.join('Versions/Current', bundle.binary_name), - os.path.join(bundle.path, bundle.binary_name)) - - # Create optional symlinks. - for name in ('Headers', 'Resources', 'Modules'): - target = os.path.join(bundle.path, 'Versions/A', name) - if os.path.exists(target): - CreateSymlink(os.path.join('Versions/Current', name), - os.path.join(bundle.path, name)) - else: - obsolete_path = os.path.join(bundle.path, name) - if os.path.exists(obsolete_path): - os.unlink(obsolete_path) - - if args.no_signature: - return - - codesign_extra_args = [] - - if args.embedded_mobileprovision: - # Find mobile provisioning profile and embeds it into the bundle (if a - # code signing identify has been provided, fails if no valid mobile - # provisioning is found). - provisioning_profile_required = args.identity != '-' - provisioning_profile = FindProvisioningProfile( - bundle.identifier, provisioning_profile_required) - if provisioning_profile and args.platform != 'iphonesimulator': - provisioning_profile.Install(embedded_provisioning_profile) - - if args.entitlements_path is not None: - temporary_entitlements_file = \ - tempfile.NamedTemporaryFile(suffix='.xcent') - codesign_extra_args.extend( - ['--entitlements', temporary_entitlements_file.name]) - - entitlements = GenerateEntitlements( - args.entitlements_path, provisioning_profile, bundle.identifier) - entitlements.WriteTo(temporary_entitlements_file.name) - - CodeSignBundle(bundle.path, args.identity, codesign_extra_args) - - -class CodeSignFileAction(Action): - """Class implementing code signature for a single file.""" - - name = 'code-sign-file' - help = 'code-sign a single file' - - @staticmethod - def _Register(parser): - parser.add_argument( - 'path', help='path to the file to codesign') - parser.add_argument( - '--identity', '-i', required=True, - help='identity to use to codesign') - parser.add_argument( - '--output', '-o', - help='if specified copy the file to that location before signing it') - parser.set_defaults(sign=True) - - @staticmethod - def _Execute(args): - if not args.identity: - args.identity = '-' - - install_path = args.path - if args.output: - - if os.path.isfile(args.output): - os.unlink(args.output) - elif os.path.isdir(args.output): - shutil.rmtree(args.output) - - if os.path.isfile(args.path): - shutil.copy(args.path, args.output) - elif os.path.isdir(args.path): - shutil.copytree(args.path, args.output) - - install_path = args.output - - CodeSignBundle(install_path, args.identity, - ['--deep', '--preserve-metadata=identifier,entitlements']) - - -class GenerateEntitlementsAction(Action): - """Class implementing the generate-entitlements action.""" - - name = 'generate-entitlements' - help = 'generate entitlements file' - - @staticmethod - def _Register(parser): - parser.add_argument( - '--entitlements', '-e', dest='entitlements_path', - help='path to the entitlements file to use') - parser.add_argument( - 'path', help='path to the entitlements file to generate') - parser.add_argument( - '--info-plist', '-p', required=True, - help='path to the bundle Info.plist') - - @staticmethod - def _Execute(args): - info_plist = LoadPlistFile(args.info_plist) - bundle_identifier = info_plist['CFBundleIdentifier'] - provisioning_profile = FindProvisioningProfile(bundle_identifier, False) - entitlements = GenerateEntitlements( - args.entitlements_path, provisioning_profile, bundle_identifier) - entitlements.WriteTo(args.path) - - -class FindProvisioningProfileAction(Action): - """Class implementing the find-codesign-identity action.""" - - name = 'find-provisioning-profile' - help = 'find provisioning profile for use by Xcode project generator' - - @staticmethod - def _Register(parser): - parser.add_argument('--bundle-id', - '-b', - required=True, - help='bundle identifier') - - @staticmethod - def _Execute(args): - provisioning_profile_info = {} - provisioning_profile = FindProvisioningProfile(args.bundle_id, False) - for key in ('team_identifier', 'name'): - if provisioning_profile: - provisioning_profile_info[key] = getattr(provisioning_profile, key) - else: - provisioning_profile_info[key] = '' - print(json.dumps(provisioning_profile_info)) - - -def Main(): - # Cache this codec so that plistlib can find it. See - # https://crbug.com/999461#c12 for more details. - codecs.lookup('utf-8') - - parser = argparse.ArgumentParser('codesign iOS bundles') - subparsers = parser.add_subparsers() - - actions = [ - CodeSignBundleAction, - CodeSignFileAction, - GenerateEntitlementsAction, - FindProvisioningProfileAction, - ] - - for action in actions: - action.Register(subparsers) - - args = parser.parse_args() - args.func(args) - - -if __name__ == '__main__': - sys.exit(Main()) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/entitlements.plist b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/entitlements.plist deleted file mode 100644 index 061639e5c..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/entitlements.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - application-identifier - $(AppIdentifierPrefix)$(CFBundleIdentifier) - - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/find_signing_identity.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/find_signing_identity.py deleted file mode 100644 index d6ef368b8..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/find_signing_identity.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright 2015 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -from __future__ import print_function - -import argparse -import os -import subprocess -import sys -import re - - -def Redact(value, from_nth_char=5): - """Redact value past the N-th character.""" - return value[:from_nth_char] + '*' * (len(value) - from_nth_char) - - -class Identity(object): - """Represents a valid identity.""" - - def __init__(self, identifier, name, team): - self.identifier = identifier - self.name = name - self.team = team - - def redacted(self): - return Identity(Redact(self.identifier), self.name, Redact(self.team)) - - def format(self): - return '%s: "%s (%s)"' % (self.identifier, self.name, self.team) - - -def ListIdentities(): - return subprocess.check_output([ - 'xcrun', - 'security', - 'find-identity', - '-v', - '-p', - 'codesigning', - ]).decode('utf8') - - -def FindValidIdentity(pattern): - """Find all identities matching the pattern.""" - lines = list(l.strip() for l in ListIdentities().splitlines()) - # Look for something like "2) XYZ "iPhone Developer: Name (ABC)"" - regex = re.compile('[0-9]+\) ([A-F0-9]+) "([^"(]*) \(([^)"]*)\)"') - - result = [] - for line in lines: - res = regex.match(line) - if res is None: - continue - if pattern is None or pattern in res.group(2): - result.append(Identity(*res.groups())) - return result - - -def Main(args): - parser = argparse.ArgumentParser('codesign iOS bundles') - parser.add_argument( - '--identity-description', required=True, dest='pattern', - help='Text description used to select the code signing identity.') - parsed = parser.parse_args(args) - - identities = FindValidIdentity(parsed.pattern) - if len(identities) == 1: - print(identities[0].identifier, end='') - return 0 - - all_identities = FindValidIdentity(None) - - print('Automatic code signing identity selection was enabled but could not') - print('find exactly one codesigning identity matching "%s".' % parsed.pattern) - print('') - print('Check that the keychain is accessible and that there is exactly one') - print('valid codesigning identity matching the pattern. Here is the parsed') - print('output of `xcrun security find-identity -v -p codesigning`:') - print() - for i, identity in enumerate(all_identities): - print(' %d) %s' % (i + 1, identity.redacted().format())) - print(' %d valid identities found' % (len(all_identities))) - return 1 - - -if __name__ == '__main__': - sys.exit(Main(sys.argv[1:])) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/ios_sdk.gni b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/ios_sdk.gni deleted file mode 100644 index 535f678be..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/ios_sdk.gni +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright 2015 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -declare_args() { - # The minimum runtime iOS version that built products are expected to run - # on. If empty, the toolchain will choose its own default, typically the - # most recent OS version. - ios_deployment_target = "14.0" - - # SDK path to use. When empty this will use the default SDK based on the - # value of use_ios_simulator. - ios_sdk_path = "" - - # Prefix for CFBundleIdentifier property of iOS bundles (correspond to the - # "Organization Identifier" in Xcode). Code signing will fail if no mobile - # provisioning for the selected code signing identify support that prefix. - ios_app_bundle_id_prefix = "org.chromium" - - # The iOS Code signing identity to use - ios_enable_code_signing = true - ios_code_signing_identity = "" - ios_code_signing_identity_description = "Apple Development" - - # Configure the environment for which to build. Could be either "device", - # "simulator" or "catalyst". If unspecified, then it will be assumed to be - # "simulator" if the target_cpu is "x68" or "x64", "device" otherwise. The - # default is only there for compatibility reasons and will be removed (see - # crbug.com/1138425 for more details). - target_environment = "" -} - -if (target_environment == "") { - if (current_cpu == "x86" || current_cpu == "x64") { - target_environment = "simulator" - } else { - target_environment = "device" - } -} - -use_ios_simulator = target_environment == "simulator" - -if (ios_sdk_path == "") { - # Compute default target. - if (use_ios_simulator) { - ios_sdk_name = "iphonesimulator" - ios_sdk_platform = "iPhoneSimulator" - } else { - ios_sdk_name = "iphoneos" - ios_sdk_platform = "iPhoneOS" - } - - ios_sdk_info_args = [ "--get_sdk_info" ] - ios_sdk_info_args += [ ios_sdk_name ] - _ios_sdk_result = exec_script("sdk_info.py", ios_sdk_info_args, "scope") - ios_sdk_path = _ios_sdk_result.sdk_path - ios_sdk_version = _ios_sdk_result.sdk_version - ios_sdk_platform_path = _ios_sdk_result.sdk_platform_path - ios_sdk_build = _ios_sdk_result.sdk_build - xcode_version = _ios_sdk_result.xcode_version - xcode_version_int = _ios_sdk_result.xcode_version_int - xcode_build = _ios_sdk_result.xcode_build - machine_os_build = _ios_sdk_result.machine_os_build - if (use_ios_simulator) { - # This is weird, but Xcode sets DTPlatformBuild to an empty field for - # simulator builds. - ios_platform_build = "" - } else { - ios_platform_build = ios_sdk_build - } -} - -if (ios_enable_code_signing && !use_ios_simulator) { - find_signing_identity_args = [ - "--identity-description", - ios_code_signing_identity_description, - ] - - # If an identity is not provided, look for one on the host - if (ios_code_signing_identity == "") { - _ios_identities = exec_script("find_signing_identity.py", - find_signing_identity_args, - "list lines") - if (_ios_identities == []) { - print("Automatic code signing identity selection was enabled but could") - print("not find exactly one code signing identity matching") - print("$ios_code_signing_identity_description. Check that your keychain") - print("is accessible and that there is a valid code signing identity") - print("listed by `xcrun security find-identity -v -p codesigning`") - print("TIP: Simulator builds don't require code signing...") - assert(false) - } else { - _ios_identities_len = 0 - foreach(_, _ios_identities) { - _ios_identities_len += 1 - } - - ios_code_signing_identity = _ios_identities[0] - if (_ios_identities_len != 1) { - print("Warning: Multiple codesigning identities match " + - "\"$ios_code_signing_identity_description\"") - foreach(_ios_identity, _ios_identities) { - _selected = "" - if (ios_code_signing_identity == _ios_identity) { - _selected = " (selected)" - } - print("Warning: - $_ios_identity$_selected") - } - print("Warning: Please use either ios_code_signing_identity or ") - print("Warning: ios_code_signing_identity_description variable to ") - print("Warning: control which identity is selected.") - print() - } - } - } -} diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/plist_util.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/plist_util.py deleted file mode 100644 index fb480a28e..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/plist_util.py +++ /dev/null @@ -1,265 +0,0 @@ -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import argparse -import codecs -import plistlib -import os -import re -import subprocess -import sys -import tempfile -import shlex - -if sys.version_info.major < 3: - basestring_compat = basestring -else: - basestring_compat = str - -# Xcode substitutes variables like ${PRODUCT_NAME} or $(PRODUCT_NAME) when -# compiling Info.plist. It also supports supports modifiers like :identifier -# or :rfc1034identifier. SUBSTITUTION_REGEXP_LIST is a list of regular -# expressions matching a variable substitution pattern with an optional -# modifier, while INVALID_CHARACTER_REGEXP matches all characters that are -# not valid in an "identifier" value (used when applying the modifier). -INVALID_CHARACTER_REGEXP = re.compile(r'[_/\s]') -SUBSTITUTION_REGEXP_LIST = ( - re.compile(r'\$\{(?P[^}]*?)(?P:[^}]*)?\}'), - re.compile(r'\$\((?P[^}]*?)(?P:[^}]*)?\)'), -) - - -class SubstitutionError(Exception): - def __init__(self, key): - super(SubstitutionError, self).__init__() - self.key = key - - def __str__(self): - return "SubstitutionError: {}".format(self.key) - - -def InterpolateString(value, substitutions): - """Interpolates variable references into |value| using |substitutions|. - - Inputs: - value: a string - substitutions: a mapping of variable names to values - - Returns: - A new string with all variables references ${VARIABLES} replaced by their - value in |substitutions|. Raises SubstitutionError if a variable has no - substitution. - """ - - def repl(match): - variable = match.group('id') - if variable not in substitutions: - raise SubstitutionError(variable) - # Some values need to be identifier and thus the variables references may - # contains :modifier attributes to indicate how they should be converted - # to identifiers ("identifier" replaces all invalid characters by '_' and - # "rfc1034identifier" replaces them by "-" to make valid URI too). - modifier = match.group('modifier') - if modifier == ':identifier': - return INVALID_CHARACTER_REGEXP.sub('_', substitutions[variable]) - elif modifier == ':rfc1034identifier': - return INVALID_CHARACTER_REGEXP.sub('-', substitutions[variable]) - else: - return substitutions[variable] - - for substitution_regexp in SUBSTITUTION_REGEXP_LIST: - value = substitution_regexp.sub(repl, value) - return value - - -def Interpolate(value, substitutions): - """Interpolates variable references into |value| using |substitutions|. - - Inputs: - value: a value, can be a dictionary, list, string or other - substitutions: a mapping of variable names to values - - Returns: - A new value with all variables references ${VARIABLES} replaced by their - value in |substitutions|. Raises SubstitutionError if a variable has no - substitution. - """ - if isinstance(value, dict): - return {k: Interpolate(v, substitutions) for k, v in value.items()} - if isinstance(value, list): - return [Interpolate(v, substitutions) for v in value] - if isinstance(value, basestring_compat): - return InterpolateString(value, substitutions) - return value - - -def LoadPList(path): - """Loads Plist at |path| and returns it as a dictionary.""" - if sys.version_info.major == 2: - fd, name = tempfile.mkstemp() - try: - subprocess.check_call(['plutil', '-convert', 'xml1', '-o', name, path]) - with os.fdopen(fd, 'rb') as f: - return plistlib.readPlist(f) - finally: - os.unlink(name) - else: - with open(path, 'rb') as f: - return plistlib.load(f) - - -def SavePList(path, format, data): - """Saves |data| as a Plist to |path| in the specified |format|.""" - # The below does not replace the destination file but update it in place, - # so if more than one hardlink points to destination all of them will be - # modified. This is not what is expected, so delete destination file if - # it does exist. - if os.path.exists(path): - os.unlink(path) - if sys.version_info.major == 2: - fd, name = tempfile.mkstemp() - try: - with os.fdopen(fd, 'wb') as f: - plistlib.writePlist(data, f) - subprocess.check_call(['plutil', '-convert', format, '-o', path, name]) - finally: - os.unlink(name) - else: - with open(path, 'wb') as f: - plist_format = {'binary1': plistlib.FMT_BINARY, 'xml1': plistlib.FMT_XML} - plistlib.dump(data, f, fmt=plist_format[format]) - - -def MergePList(plist1, plist2): - """Merges |plist1| with |plist2| recursively. - - Creates a new dictionary representing a Property List (.plist) files by - merging the two dictionary |plist1| and |plist2| recursively (only for - dictionary values). List value will be concatenated. - - Args: - plist1: a dictionary representing a Property List (.plist) file - plist2: a dictionary representing a Property List (.plist) file - - Returns: - A new dictionary representing a Property List (.plist) file by merging - |plist1| with |plist2|. If any value is a dictionary, they are merged - recursively, otherwise |plist2| value is used. If values are list, they - are concatenated. - """ - result = plist1.copy() - for key, value in plist2.items(): - if isinstance(value, dict): - old_value = result.get(key) - if isinstance(old_value, dict): - value = MergePList(old_value, value) - if isinstance(value, list): - value = plist1.get(key, []) + plist2.get(key, []) - result[key] = value - return result - - -class Action(object): - """Class implementing one action supported by the script.""" - - @classmethod - def Register(cls, subparsers): - parser = subparsers.add_parser(cls.name, help=cls.help) - parser.set_defaults(func=cls._Execute) - cls._Register(parser) - - -class MergeAction(Action): - """Class to merge multiple plist files.""" - - name = 'merge' - help = 'merge multiple plist files' - - @staticmethod - def _Register(parser): - parser.add_argument('-o', - '--output', - required=True, - help='path to the output plist file') - parser.add_argument('-f', - '--format', - required=True, - choices=('xml1', 'binary1'), - help='format of the plist file to generate') - parser.add_argument( - '-x', - '--xcode-version', - help='version of Xcode, ignored (can be used to force rebuild)') - parser.add_argument('path', nargs="+", help='path to plist files to merge') - - @staticmethod - def _Execute(args): - data = {} - for filename in args.path: - data = MergePList(data, LoadPList(filename)) - SavePList(args.output, args.format, data) - - -class SubstituteAction(Action): - """Class implementing the variable substitution in a plist file.""" - - name = 'substitute' - help = 'perform pattern substitution in a plist file' - - @staticmethod - def _Register(parser): - parser.add_argument('-o', - '--output', - required=True, - help='path to the output plist file') - parser.add_argument('-t', - '--template', - required=True, - help='path to the template file') - parser.add_argument('-s', - '--substitution', - action='append', - default=[], - help='substitution rule in the format key=value') - parser.add_argument('-f', - '--format', - required=True, - choices=('xml1', 'binary1'), - help='format of the plist file to generate') - parser.add_argument( - '-x', - '--xcode-version', - help='version of Xcode, ignored (can be used to force rebuild)') - - @staticmethod - def _Execute(args): - substitutions = {} - for substitution in args.substitution: - key, value = substitution.split('=', 1) - substitutions[key] = value - data = Interpolate(LoadPList(args.template), substitutions) - SavePList(args.output, args.format, data) - - -def Main(): - # Cache this codec so that plistlib can find it. See - # https://crbug.com/1005190#c2 for more details. - codecs.lookup('utf-8') - - parser = argparse.ArgumentParser(description='manipulate plist files') - subparsers = parser.add_subparsers() - - for action in [MergeAction, SubstituteAction]: - action.Register(subparsers) - - args = parser.parse_args() - args.func(args) - - -if __name__ == '__main__': - # TODO(https://crbug.com/941669): Temporary workaround until all scripts use - # python3 by default. - if sys.version_info[0] < 3: - os.execvp('python3', ['python3'] + sys.argv) - sys.exit(Main()) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/rules.gni b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/rules.gni deleted file mode 100644 index c170a6652..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/rules.gni +++ /dev/null @@ -1,678 +0,0 @@ -# Copyright 2015 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("ios_sdk.gni") - -# Constants corresponding to the bundle type identifier for XCTest and XCUITest -# targets. -_ios_xcode_xctest_bundle_id = "com.apple.product-type.bundle.unit-test" -_ios_xcode_xcuitest_bundle_id = "com.apple.product-type.bundle.ui-testing" - -template("create_signed_bundle") { - assert(defined(invoker.output_name), - "output_name must be defined for $target_name") - assert(defined(invoker.product_type), - "product_type must be defined for $target_name") - assert(defined(invoker.bundle_extension), - "bundle_extension must be defined for $target_name") - assert(defined(invoker.bundle_binary_target) != - defined(invoker.bundle_executable_path), - "Only one of bundle_binary_target or bundle_executable_path may be " + - "specified for $target_name") - if (defined(invoker.xcode_test_application_name)) { - assert( - invoker.product_type == _ios_xcode_xctest_bundle_id || - invoker.product_type == _ios_xcode_xcuitest_bundle_id, - "xcode_test_application_name can be only defined for Xcode unit or " + - "ui test target.") - } - - if (defined(invoker.bundle_executable_path)) { - _bundle_executable_path = invoker.bundle_executable_path - } else { - _bundle_binary_target = invoker.bundle_binary_target - _bundle_binary_output = get_label_info(_bundle_binary_target, "name") - if (defined(invoker.bundle_binary_output)) { - _bundle_binary_output = invoker.bundle_binary_output - } - _bundle_executable_path = - get_label_info(_bundle_binary_target, "target_out_dir") + - "/$_bundle_binary_output" - } - - _output_name = invoker.output_name - _bundle_gen_dir = root_out_dir - _bundle_extension = invoker.bundle_extension - - create_bundle(target_name) { - forward_variables_from(invoker, - [ - "data_deps", - "deps", - "product_type", - "public_configs", - "public_deps", - "testonly", - "visibility", - "xcode_test_application_name", - ]) - bundle_root_dir = "$_bundle_gen_dir/$_output_name$_bundle_extension" - bundle_contents_dir = bundle_root_dir - bundle_resources_dir = bundle_contents_dir - bundle_executable_dir = bundle_contents_dir - - code_signing_script = - "//third_party/mini_chromium/mini_chromium/build/ios/codesign.py" - code_signing_sources = [ _bundle_executable_path ] - code_signing_outputs = [ "$bundle_executable_dir/$_output_name" ] - - if (ios_enable_code_signing) { - code_signing_outputs += - [ "$bundle_contents_dir/_CodeSignature/CodeResources" ] - } - - if (defined(invoker.extra_system_frameworks)) { - foreach(_framework, invoker.extra_system_frameworks) { - code_signing_outputs += [ "$bundle_contents_dir/Frameworks/" + - get_path_info(_framework, "file") ] - } - } - - code_signing_args = [ - "code-sign-bundle", - "-t=" + ios_sdk_name, - "-i=" + ios_code_signing_identity, - "-b=" + rebase_path(_bundle_executable_path, root_build_dir), - ] - code_signing_args += [ rebase_path(bundle_root_dir, root_build_dir) ] - if (!ios_enable_code_signing) { - code_signing_args += [ "--disable-code-signature" ] - } - if (defined(invoker.extra_system_frameworks)) { - # All framework in extra_system_frameworks are expected to be - # system framework and the path to be already system absolute - # so do not use rebase_path here. - foreach(_framework, invoker.extra_system_frameworks) { - code_signing_args += [ "-F=" + _framework ] - } - } - - _entitlements_path = - "//third_party/mini_chromium/mini_chromium/build/ios/entitlements.plist" - code_signing_args += - [ "-e=" + rebase_path(_entitlements_path, root_build_dir) ] - - # Bundle ID should respect rfc1034 and replace _ with -. - _xcode_product_bundle_id = - string_replace("$ios_app_bundle_id_prefix.googletest.$_output_name", - "_", - "-") - - xcode_extra_attributes = { - IPHONEOS_DEPLOYMENT_TARGET = ios_deployment_target - PRODUCT_BUNDLE_IDENTIFIER = _xcode_product_bundle_id - CODE_SIGNING_REQUIRED = "NO" - CODE_SIGNING_ALLOWED = "NO" - CODE_SIGN_IDENTITY = "" - DONT_GENERATE_INFOPLIST_FILE = "YES" - - if (defined(invoker.xcode_extra_attributes)) { - forward_variables_from(invoker.xcode_extra_attributes, "*") - } - } - - if (!defined(public_deps)) { - public_deps = [] - } - - if (defined(invoker.bundle_binary_target)) { - public_deps += [ invoker.bundle_binary_target ] - } - - if (defined(invoker.bundle_deps)) { - if (!defined(deps)) { - deps = [] - } - deps += invoker.bundle_deps - } - } -} - -template("info_plist") { - assert(defined(invoker.plist_templates), - "A template plist file must be specified for $target_name") - assert(defined(invoker.executable_name), - "The executable_name must be specified for $target_name") - - _plist_templates = invoker.plist_templates - _executable_name = invoker.executable_name - _target_name = target_name - _output_name = "$target_gen_dir/$_target_name.plist" - - _format = "binary1" - _substitutions = [ - "BUILD_MACHINE_OS_BUILD=$machine_os_build", - "EXECUTABLE_NAME=$_executable_name", - "GCC_VERSION=com.apple.compilers.llvm.clang.1_0", - "PRODUCT_NAME=$_executable_name", - "XCODE_BUILD=$xcode_build", - "XCODE_VERSION=$xcode_version", - "IOS_DEPLOYMENT_TARGET=$ios_deployment_target", - "IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix", - "IOS_PLATFORM_BUILD=$ios_platform_build", - "IOS_PLATFORM_NAME=$ios_sdk_name", - "IOS_PLATFORM_VERSION=$ios_sdk_version", - "IOS_SDK_BUILD=$ios_sdk_build", - "IOS_SDK_NAME=$ios_sdk_name$ios_sdk_version", - "IOS_SUPPORTED_PLATFORM=$ios_sdk_platform", - ] - if (defined(invoker.extra_substitutions)) { - foreach(_substitution, invoker.extra_substitutions) { - _substitutions += [ _substitution ] - } - } - - _merge_plist_target = _target_name + "_merge_plist" - _merged_plist_output_name = "$target_gen_dir/${_target_name}_merged.plist" - action(_merge_plist_target) { - forward_variables_from(invoker, - [ - "testonly", - "deps", - ]) - script = "//third_party/mini_chromium/mini_chromium/build/ios/plist_util.py" - - sources = _plist_templates - - outputs = [ _merged_plist_output_name ] - args = [ - "merge", - "-f=xml1", - "-o=" + rebase_path(_merged_plist_output_name, root_build_dir), - ] + rebase_path(sources, root_build_dir) - } - - action(target_name) { - forward_variables_from(invoker, - [ - "testonly", - "visibility", - ]) - script = "//third_party/mini_chromium/mini_chromium/build/ios/plist_util.py" - sources = [ _merged_plist_output_name ] - outputs = [ _output_name ] - args = [ - "substitute", - "-f=" + _format, - "-o=" + rebase_path(_output_name, root_build_dir), - "-t=" + rebase_path(_merged_plist_output_name, root_build_dir), - ] - foreach(_substitution, _substitutions) { - args += [ "-s=$_substitution" ] - } - deps = [ ":$_merge_plist_target" ] - } -} - -template("ios_app_bundle") { - _output_name = target_name - _target_name = target_name - _plist_templates = [] - if (defined(invoker.info_plist)) { - _plist_templates += [ invoker.info_plist ] - } - _plist_extra_substitutions = [] - if (defined(invoker.extra_substitutions)) { - _plist_extra_substitutions += invoker.extra_substitutions - } - - _executable_sources_target = _target_name + "_executable_sources" - _generate_executable_target = _target_name + "_generate_executable" - source_set(_executable_sources_target) { - forward_variables_from(invoker, - "*", - [ - "bundle_deps", - "extra_system_frameworks", - "visibility", - "plist_templates", - "plist_extra_substitutions", - ]) - visibility = [ ":$_generate_executable_target" ] - } - - executable(_generate_executable_target) { - visibility = [ ":$_target_name" ] - forward_variables_from(invoker, - "*", - [ - "bundle_deps", - "extra_system_frameworks", - "sources", - "visibility", - "plist_templates", - "plist_extra_substitutions", - ]) - if (!defined(deps)) { - deps = [] - } - deps += [ ":$_executable_sources_target" ] - - if (!defined(frameworks)) { - frameworks = [] - } - frameworks += [ "UIKit.framework" ] - - if (!defined(ldflags)) { - ldflags = [] - } - ldflags += [ - "-Wl,-rpath,@executable_path/Frameworks", - "-Wl,-objc_abi_version,2", - ] - - output_name = _output_name - output_prefix_override = true - output_dir = "$target_out_dir" - } - - _generate_info_plist_target = target_name + "_generate_info_plist" - _bundle_info_plist_target = target_name + "_bundle_info_plist" - info_plist(_generate_info_plist_target) { - visibility = [ ":$_bundle_info_plist_target" ] - forward_variables_from(invoker, [ "testonly" ]) - executable_name = _output_name - plist_templates = [ - "//third_party/mini_chromium/mini_chromium/build/ios/BuildInfo.plist", - "//third_party/mini_chromium/mini_chromium/build/ios/Application-Info.plist", - ] - plist_templates += _plist_templates - extra_substitutions = _plist_extra_substitutions - } - - bundle_data(_bundle_info_plist_target) { - visibility = [ ":$_target_name" ] - forward_variables_from(invoker, [ "testonly" ]) - sources = get_target_outputs(":$_generate_info_plist_target") - outputs = [ "{{bundle_contents_dir}}/Info.plist" ] - public_deps = [ ":$_generate_info_plist_target" ] - } - - _bundle_executable_path = get_label_info(":$_generate_executable_target", - "target_out_dir") + "/$_output_name" - - create_signed_bundle(_target_name) { - forward_variables_from(invoker, - [ - "bundle_deps", - "data_deps", - "deps", - "extra_system_frameworks", - "public_configs", - "public_deps", - "testonly", - "visibility", - ]) - output_name = _output_name - product_type = "com.apple.product-type.application" - bundle_extension = ".app" - bundle_executable_path = _bundle_executable_path - - if (!defined(deps)) { - deps = [] - } - deps += [ - ":$_bundle_info_plist_target", - ":$_generate_executable_target", - ] - } -} - -template("ios_xctest_bundle") { - assert(defined(invoker.deps), "deps must be defined for $target_name") - assert(defined(invoker.product_type), - "product_type must be defined for $target_name") - assert(invoker.product_type == _ios_xcode_xctest_bundle_id || - invoker.product_type == _ios_xcode_xcuitest_bundle_id, - "product_type defined for $target_name is invalid.") - assert(defined(invoker.host_target), - "host_target must be defined for $target_name") - assert(defined(invoker.xcode_test_application_name), - "xcode_test_application_name must be defined for $target_name") - assert(invoker.xcode_test_application_name != target_name) - - _target_name = target_name - _output_name = target_name - - if (defined(invoker.output_name)) { - _output_name = invoker.output_name - } - - _loadable_module_source = _target_name + "_loadable_module_source" - _loadable_module_target = _target_name + "_loadable_module" - - source_set(_loadable_module_source) { - forward_variables_from(invoker, [ "deps" ]) - - testonly = true - visibility = [ ":$_loadable_module_target" ] - } - - loadable_module(_loadable_module_target) { - testonly = true - visibility = [ ":$_target_name" ] - - deps = [ ":$_loadable_module_source" ] - configs += - [ "//third_party/mini_chromium/mini_chromium/build/ios:xctest_config" ] - - output_dir = "$target_out_dir" - output_name = _output_name - output_prefix_override = true - output_extension = "" - } - - _info_plist_target = _target_name + "_info_plist" - _info_plist_bundle = _target_name + "_info_plist_bundle" - - info_plist(_info_plist_target) { - testonly = true - visibility = [ ":$_info_plist_bundle" ] - - plist_templates = [ - "//third_party/mini_chromium/mini_chromium/build/ios/Module-Info.plist", - ] - executable_name = _output_name - - if (defined(invoker.xctest_bundle_principal_class)) { - _principal_class = invoker.xctest_bundle_principal_class - } else { - # Fall back to a reasonable default value. - _principal_class = "NSObject" - } - extra_substitutions = [ - "XCTEST_BUNDLE_PRINCIPAL_CLASS=${_principal_class}", - "MODULE_BUNDLE_ID=googletest.$_output_name", - ] - } - - bundle_data(_info_plist_bundle) { - testonly = true - visibility = [ ":$_target_name" ] - - public_deps = [ ":$_info_plist_target" ] - - sources = get_target_outputs(":$_info_plist_target") - outputs = [ "{{bundle_contents_dir}}/Info.plist" ] - } - - _xctest_bundle = _target_name + "_bundle" - create_signed_bundle(_target_name) { - forward_variables_from(invoker, - [ - "enable_code_signing", - "product_type", - "xcode_test_application_name", - ]) - - testonly = true - visibility = [ ":$_xctest_bundle" ] - - bundle_extension = ".xctest" - - output_name = _output_name - bundle_executable_path = get_label_info(":$_loadable_module_target", - "target_out_dir") + "/$_output_name" - - # Test files need to be known to Xcode for proper indexing and discovery - # of tests function for XCTest, but the compilation is done via ninja and - # thus must prevent Xcode from linking object files via this hack. - xcode_extra_attributes = { - OTHER_LDFLAGS = "-help" - ONLY_ACTIVE_ARCH = "YES" - DEBUG_INFORMATION_FORMAT = "dwarf" - - # For XCUITest, Xcode requires specifying the host application name via - # the TEST_TARGET_NAME attribute. - if (invoker.product_type == _ios_xcode_xcuitest_bundle_id) { - TEST_TARGET_NAME = invoker.xcode_test_application_name - } - - # For XCTest, Xcode requires specifying the host application path via - # both BUNDLE_LOADER and TEST_HOST attributes. - if (invoker.product_type == _ios_xcode_xctest_bundle_id) { - BUNDLE_LOADER = "\$(TEST_HOST)" - TEST_HOST = - "\$(BUILT_PRODUCTS_DIR)/${invoker.xcode_test_application_name}" + - ".app/${invoker.xcode_test_application_name}" - } - } - - deps = [ ":$_info_plist_bundle" ] - public_deps = [ ":$_loadable_module_target" ] - } - - bundle_data(_xctest_bundle) { - forward_variables_from(invoker, [ "host_target" ]) - - testonly = true - visibility = [ ":$host_target" ] - - public_deps = [ ":$_target_name" ] - sources = [ "$root_out_dir/$_output_name.xctest" ] - outputs = [ "{{bundle_contents_dir}}/PlugIns/$_output_name.xctest" ] - } -} - -template("ios_xctest_test") { - # Invokers must specify their own target for the xctest module. - assert(defined(invoker.xctest_module_target), - "xctest_module_target is required.") - - _target_name = target_name - _output_name = target_name - - _xctest_target = _target_name + "_module" - _xctest_output = _output_name + "_module" - - _host_target = _target_name - _host_output = _output_name - - _xctest_module_target = invoker.xctest_module_target - - ios_xctest_bundle(_xctest_target) { - output_name = _xctest_output - product_type = _ios_xcode_xctest_bundle_id - host_target = _host_target - xcode_test_application_name = _host_output - - deps = [ _xctest_module_target ] - } - - ios_app_bundle(_host_target) { - forward_variables_from(invoker, "*", [ "testonly" ]) - testonly = true - - # Xcode needs the following frameworks installed in the application (and - # signed) for the XCTest to run, so install them using - # extra_system_frameworks. - _ios_platform_library = "$ios_sdk_platform_path/Developer/Library" - extra_system_frameworks = [ - "$_ios_platform_library/Frameworks/XCTest.framework", - "$ios_sdk_platform_path/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework", - "$ios_sdk_platform_path/Developer/usr/lib/libXCTestBundleInject.dylib", - ] - - _xctest_bundle = _xctest_target + "_bundle" - if (!defined(bundle_deps)) { - bundle_deps = [] - } - bundle_deps += [ ":$_xctest_bundle" ] - - if (!defined(ldflags)) { - ldflags = [] - } - ldflags += [ - "-Wl,-rpath,@executable_path/Frameworks", - "-Wl,-rpath,@loader_path/Frameworks", - ] - } -} - -template("ios_xcuitest_test_runner_bundle") { - assert(defined(invoker.xctest_bundle), - "xctest_bundle must be defined for $target_name") - - _target_name = target_name - _output_name = target_name - if (defined(invoker.output_name)) { - _output_name = invoker.output_name - } - - _xctrunner_path = - "$ios_sdk_platform_path/Developer/Library/Xcode/Agents/XCTRunner.app" - - # When creating the test runner for an XCUITest, the arm64e slice of the binary - # must be removed (at least until the app ships with arm64e slice which is not - # yet supported by Apple). - action("xctest_runner_without_arm64e") { - testonly = true - script = - "//third_party/mini_chromium/mini_chromium/build/ios/strip_arm64e.py" - sources = [ "$_xctrunner_path/XCTRunner" ] - outputs = [ "$target_out_dir/XCTRunner" ] - args = [ - "--output", - rebase_path(outputs[0], root_build_dir), - "--input", - rebase_path(sources[0], root_build_dir), - ] - } - - # Bundle identifier should respect rfc1034, so replace "_" with "-". - _bundle_identifier = "$ios_app_bundle_id_prefix.chrome." + - string_replace(_output_name, "_", "-") - - _info_plist_target = _target_name + "_info_plist" - _info_plist_bundle = _target_name + "_info_plist_bundle" - info_plist(_info_plist_target) { - testonly = true - visibility = [ ":$_info_plist_bundle" ] - - executable_name = _output_name - plist_templates = [ - "$_xctrunner_path/Info.plist", - - # NOTE: The XCTRunnerAddition+Info.plist must come after the Info.plist - # because it overrides the values under "CFBundleIdentifier" and - # "CFBundleName". - "//third_party/mini_chromium/mini_chromium/build/ios/XCTRunnerAddition+Info.plist", - ] - extra_substitutions = [ "BUNDLE_IDENTIFIER=$_bundle_identifier" ] - } - - bundle_data(_info_plist_bundle) { - testonly = true - visibility = [ ":$_target_name" ] - - public_deps = [ ":$_info_plist_target" ] - - sources = get_target_outputs(":$_info_plist_target") - outputs = [ "{{bundle_contents_dir}}/Info.plist" ] - } - - _pkginfo_bundle = _target_name + "_pkginfo_bundle" - bundle_data(_pkginfo_bundle) { - testonly = true - visibility = [ ":$_target_name" ] - - sources = [ "$_xctrunner_path/PkgInfo" ] - - outputs = [ "{{bundle_contents_dir}}/PkgInfo" ] - } - - _xctest_bundle = invoker.xctest_bundle - create_signed_bundle(_target_name) { - testonly = true - - bundle_binary_target = ":xctest_runner_without_arm64e" - bundle_binary_output = "XCTRunner" - bundle_extension = ".app" - product_type = "com.apple.product-type.application" - - output_name = _output_name - - # Xcode needs the following frameworks installed in the application - # (and signed) for the XCUITest to run, so install them using - # extra_system_frameworks. - extra_system_frameworks = [ - "$ios_sdk_platform_path/Developer/Library/Frameworks/XCTest.framework", - "$ios_sdk_platform_path/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework", - ] - - if (xcode_version_int >= 1300) { - extra_system_frameworks += [ - "$ios_sdk_platform_path/Developer/Library/PrivateFrameworks/XCTestCore.framework", - "$ios_sdk_platform_path/Developer/Library/PrivateFrameworks/XCUIAutomation.framework", - "$ios_sdk_platform_path/Developer/Library/PrivateFrameworks/XCUnit.framework", - "$ios_sdk_platform_path/Developer/usr/lib/libXCTestSwiftSupport.dylib", - ] - } - - bundle_deps = [] - if (defined(invoker.bundle_deps)) { - bundle_deps += invoker.bundle_deps - } - bundle_deps += [ - ":$_info_plist_bundle", - ":$_pkginfo_bundle", - ":$_xctest_bundle", - ] - } -} - -template("ios_xcuitest_test") { - assert(defined(invoker.deps), "deps must be defined for $target_name") - assert(defined(invoker.xcode_test_application_name), - "xcode_test_application_name must be defined for $target_name") - - _xcuitest_target = target_name - _xcuitest_runner_target = _xcuitest_target + "_runner" - _xcuitest_module_target = _xcuitest_target + "_module" - - group(_xcuitest_target) { - testonly = true - - deps = [ ":$_xcuitest_runner_target" ] - } - - _xcuitest_module_output = _xcuitest_target - ios_xctest_bundle(_xcuitest_module_target) { - forward_variables_from(invoker, - [ - "xcode_test_application_name", - "xctest_bundle_principal_class", - ]) - - product_type = _ios_xcode_xcuitest_bundle_id - host_target = _xcuitest_runner_target - output_name = _xcuitest_module_output - - deps = invoker.deps - } - - _xcuitest_runner_output = _xcuitest_target + "-Runner" - ios_xcuitest_test_runner_bundle(_xcuitest_runner_target) { - output_name = _xcuitest_runner_output - xctest_bundle = _xcuitest_module_target + "_bundle" - forward_variables_from(invoker, [ "bundle_deps" ]) - } -} - -template("ios_test_runner_xcuitest") { - ios_xcuitest_test(target_name) { - forward_variables_from(invoker, "*", ["data_deps"]) - } -} - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/sdk_info.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/sdk_info.py deleted file mode 100755 index 3a1e8f589..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/sdk_info.py +++ /dev/null @@ -1,176 +0,0 @@ -# Copyright 2014 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -from __future__ import print_function - -import argparse -import doctest -import itertools -import os -import plistlib -import re -import subprocess -import sys - -if sys.version_info.major < 3: - basestring_compat = basestring -else: - basestring_compat = str - -# src directory -ROOT_SRC_DIR = os.path.dirname( - os.path.dirname(os.path.dirname(os.path.dirname( - os.path.realpath(__file__))))) - -# This script prints information about the build system, the operating -# system and the iOS or Mac SDK (depending on the platform "iphonesimulator", -# "iphoneos" or "macosx" generally). - - -def LoadPList(path): - """Loads Plist at |path| and returns it as a dictionary.""" - # Cloned from //build/apple/plist_util.py. - if sys.version_info.major == 2: - return plistlib.readPlist(path) - with open(path, 'rb') as f: - return plistlib.load(f) - - -def SplitVersion(version): - """Splits the Xcode version to 3 values. - - >>> list(SplitVersion('8.2.1.1')) - ['8', '2', '1'] - >>> list(SplitVersion('9.3')) - ['9', '3', '0'] - >>> list(SplitVersion('10.0')) - ['10', '0', '0'] - """ - version = version.split('.') - return itertools.islice(itertools.chain(version, itertools.repeat('0')), 0, 3) - - -def FormatVersion(version): - """Converts Xcode version to a format required for DTXcode in Info.plist - - >>> FormatVersion('8.2.1') - '0821' - >>> FormatVersion('9.3') - '0930' - >>> FormatVersion('10.0') - '1000' - """ - major, minor, patch = SplitVersion(version) - return ('%2s%s%s' % (major, minor, patch)).replace(' ', '0') - - -def FillXcodeVersion(settings, developer_dir): - """Fills the Xcode version and build number into |settings|.""" - if developer_dir: - xcode_version_plist_path = os.path.join(developer_dir, - 'Contents/version.plist') - version_plist = LoadPList(xcode_version_plist_path) - settings['xcode_version'] = FormatVersion( - version_plist['CFBundleShortVersionString']) - settings['xcode_version_int'] = int(settings['xcode_version'], 10) - settings['xcode_build'] = version_plist['ProductBuildVersion'] - return - - lines = subprocess.check_output(['xcodebuild', - '-version']).decode('UTF-8').splitlines() - settings['xcode_version'] = FormatVersion(lines[0].split()[-1]) - settings['xcode_version_int'] = int(settings['xcode_version'], 10) - settings['xcode_build'] = lines[-1].split()[-1] - - -def FillMachineOSBuild(settings): - """Fills OS build number into |settings|.""" - machine_os_build = subprocess.check_output(['sw_vers', '-buildVersion' - ]).decode('UTF-8').strip() - settings['machine_os_build'] = machine_os_build - - -def FillSDKPathAndVersion(settings, platform, xcode_version): - """Fills the SDK path and version for |platform| into |settings|.""" - settings['sdk_path'] = subprocess.check_output( - ['xcrun', '-sdk', platform, '--show-sdk-path']).decode('UTF-8').strip() - settings['sdk_version'] = subprocess.check_output( - ['xcrun', '-sdk', platform, - '--show-sdk-version']).decode('UTF-8').strip() - settings['sdk_platform_path'] = subprocess.check_output( - ['xcrun', '-sdk', platform, - '--show-sdk-platform-path']).decode('UTF-8').strip() - settings['sdk_build'] = subprocess.check_output( - ['xcrun', '-sdk', platform, - '--show-sdk-build-version']).decode('UTF-8').strip() - settings['toolchains_path'] = os.path.join( - subprocess.check_output(['xcode-select', - '-print-path']).decode('UTF-8').strip(), - 'Toolchains/XcodeDefault.xctoolchain') - - -def CreateXcodeSymlinkAt(src, dst): - """Create symlink to Xcode directory at target location.""" - - if not os.path.isdir(dst): - os.makedirs(dst) - - dst = os.path.join(dst, os.path.basename(src)) - updated_value = '//' + os.path.relpath(dst, ROOT_SRC_DIR) - - # Update the symlink only if it is different from the current destination. - if os.path.islink(dst): - current_src = os.readlink(dst) - if current_src == src: - return updated_value - os.unlink(dst) - sys.stderr.write('existing symlink %s points %s; want %s. Removed.' % - (dst, current_src, src)) - os.symlink(src, dst) - return updated_value - - -if __name__ == '__main__': - doctest.testmod() - - parser = argparse.ArgumentParser() - parser.add_argument("--developer_dir", dest="developer_dir", required=False) - parser.add_argument("--get_sdk_info", - action="store_true", - dest="get_sdk_info", - default=False, - help="Returns SDK info in addition to xcode info.") - parser.add_argument("--get_machine_info", - action="store_true", - dest="get_machine_info", - default=False, - help="Returns machine info in addition to xcode info.") - parser.add_argument("--create_symlink_at", - action="store", - dest="create_symlink_at", - help="Create symlink of SDK at given location and " - "returns the symlinked paths as SDK info instead " - "of the original location.") - args, unknownargs = parser.parse_known_args() - if args.developer_dir: - os.environ['DEVELOPER_DIR'] = args.developer_dir - - if len(unknownargs) != 1: - sys.stderr.write('usage: %s [iphoneos|iphonesimulator|macosx]\n' % - os.path.basename(sys.argv[0])) - sys.exit(1) - - settings = {} - FillMachineOSBuild(settings) - FillXcodeVersion(settings, args.developer_dir) - if args.get_sdk_info: - FillSDKPathAndVersion(settings, unknownargs[0], settings['xcode_version']) - - for key in sorted(settings): - value = settings[key] - if args.create_symlink_at and '_path' in key: - value = CreateXcodeSymlinkAt(value, args.create_symlink_at) - if isinstance(value, basestring_compat): - value = '"%s"' % value - print('%s=%s' % (key, value)) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/strip_arm64e.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/strip_arm64e.py deleted file mode 100644 index aefc35ab3..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/ios/strip_arm64e.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2020 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Strip arm64e architecture from a binary if present.""" - -import argparse -import os -import shutil -import subprocess -import sys - - -def check_output(command): - """Returns the output from |command| or propagates error, quitting script.""" - process = subprocess.Popen( - command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - outs, errs = process.communicate() - if process.returncode: - sys.stderr.write('error: command failed with retcode %d: %s\n\n' % - (process.returncode, ' '.join(map(repr, command)))) - sys.stderr.write(errs.decode('UTF-8', errors='ignore')) - sys.exit(process.returncode) - return outs.decode('UTF-8') - - -def check_call(command): - """Invokes |command| or propagates error.""" - check_output(command) - - -def parse_args(args): - """Parses the command-line.""" - parser = argparse.ArgumentParser() - parser.add_argument('--input', required=True, help='Path to input binary') - parser.add_argument('--output', required=True, help='Path to output binary') - return parser.parse_args(args) - - -def get_archs(path): - """Extracts the architectures present in binary at |path|.""" - outputs = check_output(["xcrun", "lipo", "-info", os.path.abspath(path)]) - return outputs.split(': ')[-1].split() - - -def main(args): - parsed = parse_args(args) - - outdir = os.path.dirname(parsed.output) - if not os.path.isdir(outdir): - os.makedirs(outdir) - - if os.path.exists(parsed.output): - os.unlink(parsed.output) - - # As "lipo" fails with an error if asked to remove an architecture that is - # not included, only use it if "arm64e" is present in the binary. Otherwise - # simply copy the file. - if 'arm64e' in get_archs(parsed.input): - check_output([ - "xcrun", "lipo", "-remove", "arm64e", "-output", - os.path.abspath(parsed.output), - os.path.abspath(parsed.input) - ]) - else: - shutil.copy(parsed.input, parsed.output) - - -if __name__ == '__main__': - main(sys.argv[1:]) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/platform.gni b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/platform.gni deleted file mode 100644 index f38c1a91c..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/platform.gni +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2017 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -mini_chromium_is_mac = false -mini_chromium_is_ios = false -mini_chromium_is_win = false -mini_chromium_is_linux = false -mini_chromium_is_android = false -mini_chromium_is_fuchsia = false - -if (current_os == "mac") { - mini_chromium_is_mac = true -} else if (current_os == "ios") { - mini_chromium_is_ios = true -} else if (current_os == "win") { - mini_chromium_is_win = true -} else if (current_os == "android") { - mini_chromium_is_android = true -} else if (current_os == "linux") { - mini_chromium_is_linux = true -} else if (current_os == "fuchsia") { - mini_chromium_is_fuchsia = true -} - -mini_chromium_is_posix = mini_chromium_is_mac || mini_chromium_is_ios || - mini_chromium_is_linux || mini_chromium_is_android - -declare_args() { - mini_chromium_is_chromeos_lacros = false - mini_chromium_is_chromeos_ash = false -} - -assert(!mini_chromium_is_chromeos_lacros || !mini_chromium_is_chromeos_ash) -assert(!(mini_chromium_is_chromeos_lacros || mini_chromium_is_chromeos_ash) || - mini_chromium_is_linux) - - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/sysroot.gni b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/sysroot.gni deleted file mode 100644 index 55741d143..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/sysroot.gni +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright 2014 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("platform.gni") - -if (mini_chromium_is_posix || mini_chromium_is_fuchsia) { - declare_args() { - # A directory containing the system’s header files and libraries. If empty, - # a suitable default will be chosen. - target_sysroot = "" - } -} - -if (mini_chromium_is_mac) { - declare_args() { - # The version of the macOS SDK to use. If |target_sysroot| is empty, this - # will inform which SDK version will be chosen. If |mac_sdk| is also empty, - # a suitable default will be chosen. See also |mac_sdk_min|. - mac_sdk = "" - - # The minimum version of the macOS system SDK to use. SDK versions older - # than this will be rejected. If |target_sysroot| and |mac_sdk| are both - # empty, the oldest SDK that’s at least this version will be chosen. If - # empty, the system’s default SDK will be chosen. - mac_sdk_min = "" - } - - find_mac_sdk_args = [] - if (mac_sdk != "") { - find_mac_sdk_args += [ - "--exact", - mac_sdk, - ] - } - if (mac_sdk_min != "") { - find_mac_sdk_args += [ - "--minimum", - mac_sdk_min, - ] - } - if (target_sysroot != "") { - find_mac_sdk_args += [ - "--path", - target_sysroot, - ] - } - - find_mac_sdk_output = - exec_script("find_mac_sdk.py", find_mac_sdk_args, "list lines") - - mac_sdk = find_mac_sdk_output[0] - target_sysroot = find_mac_sdk_output[1] -} else if (mini_chromium_is_ios) { - import("ios/ios_sdk.gni") - target_sysroot = ios_sdk_path -} else if (mini_chromium_is_fuchsia) { - # Declares fuchsia_sdk. - import("//third_party/fuchsia/sdk/$host_os-amd64/build/config/config.gni") - if (target_sysroot == "") { - target_sysroot = fuchsia_sdk + "/arch/$target_cpu/sysroot" - } -} - -if ((mini_chromium_is_posix || mini_chromium_is_fuchsia) && - (current_os == target_os && current_cpu == target_cpu)) { - sysroot = target_sysroot -} else { - sysroot = "" -} diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/win_helper.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/win_helper.py deleted file mode 100644 index be977c813..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/win_helper.py +++ /dev/null @@ -1,230 +0,0 @@ -# Copyright 2017 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import winreg -import os -import re -import subprocess -import sys - - -def _RegistryGetValue(key, value): - """Use the winreg module to obtain the value of a registry key. - - Args: - key: The registry key. - value: The particular registry value to read. - Return: - contents of the registry key's value, or None on failure. - """ - try: - root, subkey = key.split('\\', 1) - assert root == 'HKLM' # Only need HKLM for now. - with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, subkey) as hkey: - return winreg.QueryValueEx(hkey, value)[0] - except WindowsError: - return None - - -def _ExtractImportantEnvironment(output_of_set): - """Extracts environment variables required for the toolchain to run from - a textual dump output by the cmd.exe 'set' command.""" - envvars_to_save = ( - 'include', - 'lib', - 'libpath', - 'path', - 'pathext', - 'systemroot', - 'temp', - 'tmp', - ) - env = {} - for line in output_of_set.splitlines(): - line = line.decode("utf-8") - for envvar in envvars_to_save: - if re.match(envvar + '=', line.lower()): - var, setting = line.split('=', 1) - env[var.upper()] = setting - break - for required in ('SYSTEMROOT', 'TEMP', 'TMP'): - if required not in env: - raise Exception('Environment variable "%s" ' - 'required to be set to valid path' % required) - return env - - -def _FormatAsEnvironmentBlock(envvar_dict): - """Format as an 'environment block' directly suitable for CreateProcess. - Briefly this is a list of key=value\0, terminated by an additional \0. See - CreateProcess() documentation for more details.""" - block = '' - nul = '\0' - for key, value in envvar_dict.items(): - block += key + '=' + value + nul - block += nul - return block - - -def _GenerateEnvironmentFiles(install_dir, out_dir, script_path): - """It's not sufficient to have the absolute path to the compiler, linker, etc. - on Windows, as those tools rely on .dlls being in the PATH. We also need to - support both x86 and x64 compilers. Different architectures require a - different compiler binary, and different supporting environment variables - (INCLUDE, LIB, LIBPATH). So, we extract the environment here, wrap all - invocations of compiler tools (cl, link, lib, rc, midl, etc.) to set up the - environment, and then do not prefix the compiler with an absolute path, - instead preferring something like "cl.exe" in the rule which will then run - whichever the environment setup has put in the path.""" - archs = ('x86', 'amd64', 'arm64') - result = [] - for arch in archs: - # Extract environment variables for subprocesses. - args = [os.path.join(install_dir, script_path)] - script_arch_name = arch - if script_path.endswith('SetEnv.cmd') and arch == 'amd64': - script_arch_name = '/x64' - if arch == 'arm64': - script_arch_name = 'x86_arm64' - args.extend((script_arch_name, '&&', 'set')) - popen = subprocess.Popen( - args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - variables, _ = popen.communicate() - if popen.returncode != 0: - raise Exception('"%s" failed with error %d' % (args, popen.returncode)) - env = _ExtractImportantEnvironment(variables) - - env_block = _FormatAsEnvironmentBlock(env) - basename = 'environment.' + arch - with open(os.path.join(out_dir, basename), 'wb') as f: - f.write(env_block.encode()) - result.append(basename) - return result - - -def _GetEnvAsDict(arch): - """Gets the saved environment from a file for a given architecture.""" - # The environment is saved as an "environment block" (see CreateProcess() - # for details, which is the format required for ninja). We convert to a dict - # here. Drop last 2 NULs, one for list terminator, one for trailing vs. - # separator. - pairs = open(arch).read()[:-2].split('\0') - kvs = [item.split('=', 1) for item in pairs] - return dict(kvs) - - -class WinTool(object): - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - return getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like recursive-mirror to RecursiveMirror.""" - return name_string.title().replace('-', '') - - def ExecLinkWrapper(self, arch, *args): - """Filter diagnostic output from link that looks like: - ' Creating library ui.dll.lib and object ui.dll.exp' - This happens when there are exports from the dll or exe. - """ - env = _GetEnvAsDict(arch) - args = list(args) # *args is a tuple by default, which is read-only. - args[0] = args[0].replace('/', '\\') - link = subprocess.Popen(args, env=env, shell=True, stdout=subprocess.PIPE) - out, _ = link.communicate() - for line in out.splitlines(): - line = line.decode("utf-8") - if (not line.startswith(' Creating library ') and - not line.startswith('Generating code') and - not line.startswith('Finished generating code')): - print(line) - return link.returncode - - def ExecAsmWrapper(self, arch, *args): - """Filter logo banner from invocations of asm.exe.""" - env = _GetEnvAsDict(arch) - popen = subprocess.Popen(args, env=env, shell=True, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - out, _ = popen.communicate() - for line in out.splitlines(): - line = line.decode("utf-8") - if (not line.startswith('Copyright (C) Microsoft Corporation') and - not line.startswith('Microsoft (R) Macro Assembler') and - not line.startswith(' Assembling: ') and - line): - print(line) - return popen.returncode - - def ExecGetVisualStudioData(self, outdir, toolchain_path): - setenv_paths = [ - # cipd packaged SDKs from 10.0.19041.0 onwards. - os.path.join('Windows Kits', '10', 'bin', 'SetEnv.cmd'), - # cipd packaged SDKs prior to 10.0.19041.0. - os.path.join('win_sdk', 'bin', 'SetEnv.cmd'), - ] - - def explicit(): - for setenv_path in setenv_paths: - if os.path.exists(os.path.join(toolchain_path, setenv_path)): - return toolchain_path, setenv_path - - def env(): - from_env = os.environ.get('VSINSTALLDIR') - for setenv_path in setenv_paths: - if from_env and os.path.exists(os.path.join(from_env, setenv_path)): - return from_env, setenv_path - - def autodetect(): - # Try vswhere, which will find VS2017.2+. Note that earlier VS2017s will - # not be found. - vswhere_path = os.path.join(os.environ.get('ProgramFiles(x86)'), - 'Microsoft Visual Studio', 'Installer', 'vswhere.exe') - if os.path.exists(vswhere_path): - installation_path = subprocess.check_output( - [vswhere_path, '-latest', '-property', 'installationPath']).strip() - if installation_path: - return (installation_path.decode("utf-8"), - os.path.join('VC', 'Auxiliary', 'Build', 'vcvarsall.bat')) - - # Otherwise, try VS2015. - version = '14.0' - keys = [r'HKLM\Software\Microsoft\VisualStudio\%s' % version, - r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\%s' % version] - for key in keys: - path = _RegistryGetValue(key, 'InstallDir') - if not path: - continue - return (os.path.normpath(os.path.join(path, os.pardir, os.pardir)), - os.path.join('VC', 'vcvarsall.bat')) - - def fail(): raise Exception('Visual Studio installation dir not found') - - # Use an explicitly specified toolchain path, if provided and found. - # Otherwise, try using a standard environment variable. Finally, try - # autodetecting using vswhere. - install_dir, script_path = (explicit() or env() or autodetect() or fail()) - - x86_file, x64_file, arm64_file = _GenerateEnvironmentFiles( - install_dir, outdir, script_path) - # gn is unhappy with trailing backslashes. - install_dir = install_dir.rstrip('\\') - result = '''install_dir = "%s" -x86_environment_file = "%s" -x64_environment_file = "%s" -arm64_environment_file = "%s"''' % (install_dir, x86_file, x64_file, arm64_file) - print(result) - return 0 - - def ExecStamp(self, path): - """Simple stamp command.""" - open(path, 'w').close() - return 0 - - -if __name__ == '__main__': - sys.exit(WinTool().Dispatch(sys.argv[1:])) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/write_buildflag_header.py b/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/write_buildflag_header.py deleted file mode 100755 index 99ecb93f3..000000000 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/build/write_buildflag_header.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2015 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This writes headers for build flags. See buildflag_header.gni for usage of -# this system as a whole. -# -# The parameters are passed in a response file so we don't have to worry -# about command line lengths. The name of the response file is passed on the -# command line. -# -# The format of the response file is: -# [--flags ] - -import optparse -import os -import shlex -import sys - - -class Options: - - def __init__(self, output, rulename, header_guard, flags): - self.output = output - self.rulename = rulename - self.header_guard = header_guard - self.flags = flags - - -def GetOptions(): - parser = optparse.OptionParser() - parser.add_option('--output', help="Output header name inside --gen-dir.") - parser.add_option('--rulename', - help="Helpful name of build rule for including in the " + - "comment at the top of the file.") - parser.add_option('--gen-dir', - help="Path to root of generated file directory tree.") - parser.add_option('--definitions', - help="Name of the response file containing the flags.") - cmdline_options, cmdline_flags = parser.parse_args() - - # Compute header guard by replacing some chars with _ and upper-casing. - header_guard = cmdline_options.output.upper() - header_guard = \ - header_guard.replace('/', '_').replace('\\', '_').replace('.', '_') - header_guard += '_' - - # The actual output file is inside the gen dir. - output = os.path.join(cmdline_options.gen_dir, cmdline_options.output) - - # Definition file in GYP is newline separated, in GN they are shell formatted. - # shlex can parse both of these. - with open(cmdline_options.definitions, 'r') as def_file: - defs = shlex.split(def_file.read()) - flags_index = defs.index('--flags') - - # Everything after --flags are flags. true/false are remapped to 1/0, - # everything else is passed through. - flags = [] - for flag in defs[flags_index + 1:]: - equals_index = flag.index('=') - key = flag[:equals_index] - value = flag[equals_index + 1:] - - # Canonicalize and validate the value. - if value == 'true': - value = '1' - elif value == 'false': - value = '0' - flags.append((key, str(value))) - - return Options(output=output, - rulename=cmdline_options.rulename, - header_guard=header_guard, - flags=flags) - - -def WriteHeader(options): - with open(options.output, 'w') as output_file: - output_file.write("// Generated by build/write_buildflag_header.py\n") - if options.rulename: - output_file.write('// From "' + options.rulename + '"\n') - - output_file.write('\n#ifndef %s\n' % options.header_guard) - output_file.write('#define %s\n\n' % options.header_guard) - output_file.write('#include "build/buildflag.h"\n\n') - - for pair in options.flags: - output_file.write( - '#define MINI_CHROMIUM_INTERNAL_BUILDFLAG_VALUE_%s() (%s)\n' % - pair) - - output_file.write('\n#endif // %s\n' % options.header_guard) - - -def main(): - options = GetOptions() - WriteHeader(options) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/BUILD.gn b/shared/sentry/external/crashpad/third_party/zlib/zlib/BUILD.gn deleted file mode 100644 index 5086563cf..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/BUILD.gn +++ /dev/null @@ -1,161 +0,0 @@ -# Copyright (c) 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -config("zlib_config") { - include_dirs = [ "." ] -} - -static_library("zlib_x86_simd") { - if (!is_ios && (current_cpu == "x86" || current_cpu == "x64")) { - sources = [ - "crc_folding.c", - "fill_window_sse.c", - ] - if (!is_win || is_clang) { - cflags = [ - "-msse4.2", - "-mpclmul", - ] - } - } else { - sources = [ - "simd_stub.c", - ] - } - - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] -} - -config("zlib_warnings") { - if (is_clang && !is_ios && (current_cpu == "x86" || current_cpu == "x64")) { - cflags = [ "-Wno-incompatible-pointer-types" ] - } -} - -static_library("zlib") { - if (!is_win) { - # Don't stomp on "libzlib" on other platforms. - output_name = "chrome_zlib" - } - - sources = [ - "adler32.c", - "compress.c", - "crc32.c", - "crc32.h", - "deflate.c", - "deflate.h", - "gzclose.c", - "gzguts.h", - "gzlib.c", - "gzread.c", - "gzwrite.c", - "infback.c", - "inffast.c", - "inffast.h", - "inffixed.h", - "inflate.c", - "inflate.h", - "inftrees.c", - "inftrees.h", - "names.h", - "trees.c", - "trees.h", - "uncompr.c", - "x86.h", - "zconf.h", - "zlib.h", - "zutil.c", - "zutil.h", - ] - - if (!is_ios && (current_cpu == "x86" || current_cpu == "x64")) { - sources += [ "x86.c" ] - } - - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ - "//build/config/compiler:no_chromium_code", - - # Must be after no_chromium_code for warning flags to be ordered correctly. - ":zlib_warnings", - ] - - public_configs = [ ":zlib_config" ] - deps = [ - ":zlib_x86_simd", - ] -} - -config("minizip_warnings") { - visibility = [ ":*" ] - if (is_clang) { - # zlib uses `if ((a == b))` for some reason. - cflags = [ "-Wno-parentheses-equality" ] - } -} - -static_library("minizip") { - sources = [ - "contrib/minizip/ioapi.c", - "contrib/minizip/ioapi.h", - "contrib/minizip/iowin32.c", - "contrib/minizip/iowin32.h", - "contrib/minizip/unzip.c", - "contrib/minizip/unzip.h", - "contrib/minizip/zip.c", - "contrib/minizip/zip.h", - ] - - if (!is_win) { - sources -= [ - "contrib/minizip/iowin32.c", - "contrib/minizip/iowin32.h", - ] - } - if (is_mac || is_ios || is_android) { - # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We - # use fopen, ftell, and fseek instead on these systems. - defines = [ "USE_FILE32API" ] - } - - deps = [ - ":zlib", - ] - - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ - "//build/config/compiler:no_chromium_code", - - # Must be after no_chromium_code for warning flags to be ordered correctly. - ":minizip_warnings", - ] - public_configs = [ ":zlib_config" ] -} - -static_library("zip") { - sources = [ - "google/zip.cc", - "google/zip.h", - "google/zip_internal.cc", - "google/zip_internal.h", - "google/zip_reader.cc", - "google/zip_reader.h", - ] - deps = [ - ":minizip", - "//base", - ] -} - -static_library("compression_utils") { - sources = [ - "google/compression_utils.cc", - "google/compression_utils.h", - ] - deps = [ - ":zlib", - ] -} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/OWNERS b/shared/sentry/external/crashpad/third_party/zlib/zlib/OWNERS deleted file mode 100644 index 6adf9fc8d..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -agl@chromium.org -gavinp@chromium.org -msarett@chromium.org diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.c b/shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.c deleted file mode 100644 index 9162429cc..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.c +++ /dev/null @@ -1,469 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id$ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - - DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "deflate.h" -#include "x86.h" -#include "zutil.h" /* for STDC and FAR definitions */ - -/* Definitions for doing the crc four data bytes at a time. */ -#if !defined(NOBYFOUR) && defined(Z_U4) -# define BYFOUR -#endif -#ifdef BYFOUR - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, z_size_t)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, z_size_t)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); - - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local z_crc_t FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - z_crc_t c; - int n, k; - z_crc_t poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0; - for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (z_crc_t)1 << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (z_crc_t)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = ZSWAP32(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = ZSWAP32(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const z_crc_t FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const z_crc_t FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", - (unsigned long)(table[n]), - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const z_crc_t FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const z_crc_t FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - z_crc_t endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ - return crc32_z(crc, buf, len); -} - -#ifdef BYFOUR - -/* - This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit - integer pointer type. This violates the strict aliasing rule, where a - compiler can assume, for optimization purposes, that two pointers to - fundamentally different types won't ever point to the same memory. This can - manifest as a problem only if one of the pointers is written to. This code - only reads from those pointers. So long as this code remains isolated in - this compilation unit, there won't be a problem. For this reason, this code - should not be copied and pasted into a compilation unit in which other code - writes to the buffer that is passed to these routines. - */ - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = (z_crc_t)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *buf4++; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = ZSWAP32((z_crc_t)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(ZSWAP32(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -local uLong crc32_combine_(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case (also disallow negative lengths) */ - if (len2 <= 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} - -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} - -ZLIB_INTERNAL void crc_reset(deflate_state *const s) -{ - if (x86_cpu_enable_simd) { - crc_fold_init(s); - return; - } - s->strm->adler = crc32(0L, Z_NULL, 0); -} - -ZLIB_INTERNAL void crc_finalize(deflate_state *const s) -{ - if (x86_cpu_enable_simd) - s->strm->adler = crc_fold_512to32(s); -} - -ZLIB_INTERNAL void copy_with_crc(z_streamp strm, Bytef *dst, long size) -{ - if (x86_cpu_enable_simd) { - crc_fold_copy(strm->state, dst, strm->next_in, size); - return; - } - zmemcpy(dst, strm->next_in, size); - strm->adler = crc32(strm->adler, dst, size); -} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.h b/shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.h deleted file mode 100644 index 9e0c77810..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const z_crc_t FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/fill_window_sse.c b/shared/sentry/external/crashpad/third_party/zlib/zlib/fill_window_sse.c deleted file mode 100644 index 949ccce1b..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/fill_window_sse.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Fill Window with SSE2-optimized hash shifting - * - * Copyright (C) 2013 Intel Corporation - * Authors: - * Arjan van de Ven - * Jim Kukunas - * - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include -#include "deflate.h" - -#define UPDATE_HASH(s,h,i) \ - {\ - if (s->level < 6) { \ - h = (3483 * (s->window[i]) +\ - 23081* (s->window[i+1]) +\ - 6954 * (s->window[i+2]) +\ - 20947* (s->window[i+3])) & s->hash_mask;\ - } else {\ - h = (25881* (s->window[i]) +\ - 24674* (s->window[i+1]) +\ - 25811* (s->window[i+2])) & s->hash_mask;\ - }\ - }\ - -extern int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); - -void fill_window_sse(deflate_state *s) -{ - const __m128i xmm_wsize = _mm_set1_epi16(s->w_size); - - register unsigned n; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - p -= 8; - do { - __m128i value, result; - - value = _mm_loadu_si128((__m128i *)p); - result = _mm_subs_epu16(value, xmm_wsize); - _mm_storeu_si128((__m128i *)p, result); - - p -= 8; - n -= 8; - } while (n > 0); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - p -= 8; - do { - __m128i value, result; - - value = _mm_loadu_si128((__m128i *)p); - result = _mm_subs_epu16(value, xmm_wsize); - _mm_storeu_si128((__m128i *)p, result); - - p -= 8; - n -= 8; - } while (n > 0); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - uInt str = s->strstart; - s->ins_h = s->window[str]; - if (str >= 1) - UPDATE_HASH(s, s->ins_h, str + 1 - (MIN_MATCH-1)); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google.patch b/shared/sentry/external/crashpad/third_party/zlib/zlib/google.patch deleted file mode 100644 index f16dacced..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google.patch +++ /dev/null @@ -1,399 +0,0 @@ -diff --git a/contrib/minizip/ioapi.h b/contrib/minizip/ioapi.h -index 8dcbdb06e35a..c1b7a54847f5 100644 ---- a/contrib/minizip/ioapi.h -+++ b/contrib/minizip/ioapi.h -@@ -43,7 +43,7 @@ - - #include - #include --#include "zlib.h" -+#include "third_party/zlib/zlib.h" - - #if defined(USE_FILE32API) - #define fopen64 fopen -diff --git a/contrib/minizip/iowin32.c b/contrib/minizip/iowin32.c -index 274f39eb1dd2..246ceb91a139 100644 ---- a/contrib/minizip/iowin32.c -+++ b/contrib/minizip/iowin32.c -@@ -26,12 +26,19 @@ - #endif - - -+#ifdef _WIN32_WINNT -+#undef _WIN32_WINNT -+#define _WIN32_WINNT 0x601 -+#endif -+ -+#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 - // see Include/shared/winapifamily.h in the Windows Kit - #if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) - #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) - #define IOWIN32_USING_WINRT_API 1 - #endif - #endif -+#endif - - voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); - uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -diff --git a/contrib/minizip/mztools.c b/contrib/minizip/mztools.c -index 96891c2e0b71..8bf9cca32633 100644 ---- a/contrib/minizip/mztools.c -+++ b/contrib/minizip/mztools.c -@@ -8,7 +8,7 @@ - #include - #include - #include --#include "zlib.h" -+#include "third_party/zlib/zlib.h" - #include "unzip.h" - - #define READ_8(adr) ((unsigned char)*(adr)) -diff --git a/contrib/minizip/mztools.h b/contrib/minizip/mztools.h -index a49a426ec2fc..f295ffeda6af 100644 ---- a/contrib/minizip/mztools.h -+++ b/contrib/minizip/mztools.h -@@ -12,7 +12,7 @@ extern "C" { - #endif - - #ifndef _ZLIB_H --#include "zlib.h" -+#include "third_party/zlib/zlib.h" - #endif - - #include "unzip.h" -diff --git a/contrib/minizip/unzip.c b/contrib/minizip/unzip.c -index bcfb9416ec35..199b4723fcfc 100644 ---- a/contrib/minizip/unzip.c -+++ b/contrib/minizip/unzip.c -@@ -72,7 +72,7 @@ - #define NOUNCRYPT - #endif - --#include "zlib.h" -+#include "third_party/zlib/zlib.h" - #include "unzip.h" - - #ifdef STDC -@@ -1705,11 +1705,6 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - -- if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && -- (!(pfile_in_zip_read_info->raw))) -- pfile_in_zip_read_info->stream.avail_out = -- (uInt)pfile_in_zip_read_info->rest_read_uncompressed; -- - if ((len>pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in) && - (pfile_in_zip_read_info->raw)) -diff --git a/contrib/minizip/unzip.h b/contrib/minizip/unzip.h -index 2104e3915074..3c0143529b91 100644 ---- a/contrib/minizip/unzip.h -+++ b/contrib/minizip/unzip.h -@@ -48,7 +48,7 @@ extern "C" { - #endif - - #ifndef _ZLIB_H --#include "zlib.h" -+#include "third_party/zlib/zlib.h" - #endif - - #ifndef _ZLIBIOAPI_H -diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c -index 44e88a9cb989..65c0c7251843 100644 ---- a/contrib/minizip/zip.c -+++ b/contrib/minizip/zip.c -@@ -26,7 +26,7 @@ - #include - #include - #include --#include "zlib.h" -+#include "third_party/zlib/zlib.h" - #include "zip.h" - - #ifdef STDC -diff --git a/contrib/minizip/zip.h b/contrib/minizip/zip.h -index 8aaebb623430..8c06c0aa7bb0 100644 ---- a/contrib/minizip/zip.h -+++ b/contrib/minizip/zip.h -@@ -47,7 +47,7 @@ extern "C" { - //#define HAVE_BZIP2 - - #ifndef _ZLIB_H --#include "zlib.h" -+#include "third_party/zlib/zlib.h" - #endif - - #ifndef _ZLIBIOAPI_H -diff --git a/gzread.c b/gzread.c -index 956b91ea7d9e..832d3ef98c59 100644 ---- a/gzread.c -+++ b/gzread.c -@@ -443,7 +443,11 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) - # undef z_gzgetc - #else - # undef gzgetc -+# ifdef Z_CR_PREFIX_SET -+# define gzgetc Cr_z_gzgetc -+# endif - #endif -+ - int ZEXPORT gzgetc(file) - gzFile file; - { -diff --git a/names.h b/names.h -new file mode 100644 -index 000000000000..f18df5684dc5 ---- /dev/null -+++ b/names.h -@@ -0,0 +1,155 @@ -+/* Copyright 2017 The Chromium Authors. All rights reserved. -+ * Use of this source code is governed by a BSD-style license that can be -+ * found in the LICENSE file. */ -+ -+#ifndef THIRD_PARTY_ZLIB_NAMES_H_ -+#define THIRD_PARTY_ZLIB_NAMES_H_ -+ -+/* Rename all zlib names with a Cr_z_ prefix. This is based on the Z_PREFIX -+ * option from zconf.h, but with a custom prefix. Where zconf.h would rename -+ * both a macro and its underscore-suffixed internal implementation (such as -+ * deflateInit2 and deflateInit2_), only the implementation is renamed here. -+ * The Byte type is also omitted. -+ * -+ * To generate this list, run -+ * sed -rn -e 's/^# *define +([^ ]+) +(z_[^ ]+)$/#define \1 Cr_\2/p' zconf.h -+ * (use -E instead of -r on macOS). -+ * -+ * gzread is also addressed by modifications in gzread.c and zlib.h. */ -+ -+#define Z_CR_PREFIX_SET -+ -+#define _dist_code Cr_z__dist_code -+#define _length_code Cr_z__length_code -+#define _tr_align Cr_z__tr_align -+#define _tr_flush_bits Cr_z__tr_flush_bits -+#define _tr_flush_block Cr_z__tr_flush_block -+#define _tr_init Cr_z__tr_init -+#define _tr_stored_block Cr_z__tr_stored_block -+#define _tr_tally Cr_z__tr_tally -+#define adler32 Cr_z_adler32 -+#define adler32_combine Cr_z_adler32_combine -+#define adler32_combine64 Cr_z_adler32_combine64 -+#define adler32_z Cr_z_adler32_z -+#define compress Cr_z_compress -+#define compress2 Cr_z_compress2 -+#define compressBound Cr_z_compressBound -+#define crc32 Cr_z_crc32 -+#define crc32_combine Cr_z_crc32_combine -+#define crc32_combine64 Cr_z_crc32_combine64 -+#define crc32_z Cr_z_crc32_z -+#define deflate Cr_z_deflate -+#define deflateBound Cr_z_deflateBound -+#define deflateCopy Cr_z_deflateCopy -+#define deflateEnd Cr_z_deflateEnd -+#define deflateGetDictionary Cr_z_deflateGetDictionary -+/* #undef deflateInit */ -+/* #undef deflateInit2 */ -+#define deflateInit2_ Cr_z_deflateInit2_ -+#define deflateInit_ Cr_z_deflateInit_ -+#define deflateParams Cr_z_deflateParams -+#define deflatePending Cr_z_deflatePending -+#define deflatePrime Cr_z_deflatePrime -+#define deflateReset Cr_z_deflateReset -+#define deflateResetKeep Cr_z_deflateResetKeep -+#define deflateSetDictionary Cr_z_deflateSetDictionary -+#define deflateSetHeader Cr_z_deflateSetHeader -+#define deflateTune Cr_z_deflateTune -+#define deflate_copyright Cr_z_deflate_copyright -+#define get_crc_table Cr_z_get_crc_table -+#define gz_error Cr_z_gz_error -+#define gz_intmax Cr_z_gz_intmax -+#define gz_strwinerror Cr_z_gz_strwinerror -+#define gzbuffer Cr_z_gzbuffer -+#define gzclearerr Cr_z_gzclearerr -+#define gzclose Cr_z_gzclose -+#define gzclose_r Cr_z_gzclose_r -+#define gzclose_w Cr_z_gzclose_w -+#define gzdirect Cr_z_gzdirect -+#define gzdopen Cr_z_gzdopen -+#define gzeof Cr_z_gzeof -+#define gzerror Cr_z_gzerror -+#define gzflush Cr_z_gzflush -+#define gzfread Cr_z_gzfread -+#define gzfwrite Cr_z_gzfwrite -+#define gzgetc Cr_z_gzgetc -+#define gzgetc_ Cr_z_gzgetc_ -+#define gzgets Cr_z_gzgets -+#define gzoffset Cr_z_gzoffset -+#define gzoffset64 Cr_z_gzoffset64 -+#define gzopen Cr_z_gzopen -+#define gzopen64 Cr_z_gzopen64 -+#define gzopen_w Cr_z_gzopen_w -+#define gzprintf Cr_z_gzprintf -+#define gzputc Cr_z_gzputc -+#define gzputs Cr_z_gzputs -+#define gzread Cr_z_gzread -+#define gzrewind Cr_z_gzrewind -+#define gzseek Cr_z_gzseek -+#define gzseek64 Cr_z_gzseek64 -+#define gzsetparams Cr_z_gzsetparams -+#define gztell Cr_z_gztell -+#define gztell64 Cr_z_gztell64 -+#define gzungetc Cr_z_gzungetc -+#define gzvprintf Cr_z_gzvprintf -+#define gzwrite Cr_z_gzwrite -+#define inflate Cr_z_inflate -+#define inflateBack Cr_z_inflateBack -+#define inflateBackEnd Cr_z_inflateBackEnd -+/* #undef inflateBackInit */ -+#define inflateBackInit_ Cr_z_inflateBackInit_ -+#define inflateCodesUsed Cr_z_inflateCodesUsed -+#define inflateCopy Cr_z_inflateCopy -+#define inflateEnd Cr_z_inflateEnd -+#define inflateGetDictionary Cr_z_inflateGetDictionary -+#define inflateGetHeader Cr_z_inflateGetHeader -+/* #undef inflateInit */ -+/* #undef inflateInit2 */ -+#define inflateInit2_ Cr_z_inflateInit2_ -+#define inflateInit_ Cr_z_inflateInit_ -+#define inflateMark Cr_z_inflateMark -+#define inflatePrime Cr_z_inflatePrime -+#define inflateReset Cr_z_inflateReset -+#define inflateReset2 Cr_z_inflateReset2 -+#define inflateResetKeep Cr_z_inflateResetKeep -+#define inflateSetDictionary Cr_z_inflateSetDictionary -+#define inflateSync Cr_z_inflateSync -+#define inflateSyncPoint Cr_z_inflateSyncPoint -+#define inflateUndermine Cr_z_inflateUndermine -+#define inflateValidate Cr_z_inflateValidate -+#define inflate_copyright Cr_z_inflate_copyright -+#define inflate_fast Cr_z_inflate_fast -+#define inflate_table Cr_z_inflate_table -+#define uncompress Cr_z_uncompress -+#define uncompress2 Cr_z_uncompress2 -+#define zError Cr_z_zError -+#define zcalloc Cr_z_zcalloc -+#define zcfree Cr_z_zcfree -+#define zlibCompileFlags Cr_z_zlibCompileFlags -+#define zlibVersion Cr_z_zlibVersion -+/* #undef Byte */ -+#define Bytef Cr_z_Bytef -+#define alloc_func Cr_z_alloc_func -+#define charf Cr_z_charf -+#define free_func Cr_z_free_func -+#define gzFile Cr_z_gzFile -+#define gz_header Cr_z_gz_header -+#define gz_headerp Cr_z_gz_headerp -+#define in_func Cr_z_in_func -+#define intf Cr_z_intf -+#define out_func Cr_z_out_func -+#define uInt Cr_z_uInt -+#define uIntf Cr_z_uIntf -+#define uLong Cr_z_uLong -+#define uLongf Cr_z_uLongf -+#define voidp Cr_z_voidp -+#define voidpc Cr_z_voidpc -+#define voidpf Cr_z_voidpf -+#define gz_header_s Cr_z_gz_header_s -+#define internal_state Cr_z_internal_state -+/* #undef z_off64_t */ -+ -+/* An exported symbol that isn't handled by Z_PREFIX in zconf.h */ -+#define z_errmsg Cr_z_z_errmsg -+ -+#endif /* THIRD_PARTY_ZLIB_NAMES_H_ */ -diff --git a/zconf.h b/zconf.h -index 5e1d68a004e9..a7a815f575a7 100644 ---- a/zconf.h -+++ b/zconf.h -@@ -8,6 +8,9 @@ - #ifndef ZCONF_H - #define ZCONF_H - -+/* This include does prefixing as below, but with an updated set of names */ -+#include "names.h" -+ - /* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. -@@ -431,7 +434,7 @@ typedef uLong FAR uLongf; - typedef unsigned long z_crc_t; - #endif - --#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ -+#if !defined(_WIN32) - # define Z_HAVE_UNISTD_H - #endif - -diff --git a/zlib.h b/zlib.h -index f09cdaf1e054..99fd467f6b1a 100644 ---- a/zlib.h -+++ b/zlib.h -@@ -1824,6 +1824,11 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ - # undef z_gzgetc - # define z_gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) -+#elif defined(Z_CR_PREFIX_SET) -+# undef gzgetc -+# define gzgetc(g) \ -+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) \ -+ : (Cr_z_gzgetc)(g)) - #else - # define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) -@@ -1853,11 +1858,29 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ - # define z_adler32_combine z_adler32_combine64 - # define z_crc32_combine z_crc32_combine64 - # else -+# ifdef gzopen -+# undef gzopen -+# endif - # define gzopen gzopen64 -+# ifdef gzseek -+# undef gzseek -+# endif - # define gzseek gzseek64 -+# ifdef gztell -+# undef gztell -+# endif - # define gztell gztell64 -+# ifdef gzoffset -+# undef gzoffset -+# endif - # define gzoffset gzoffset64 -+# ifdef adler32_combine -+# undef adler32_combine -+# endif - # define adler32_combine adler32_combine64 -+# ifdef crc32_combine -+# undef crc32_combine -+# endif - # define crc32_combine crc32_combine64 - # endif - # ifndef Z_LARGE64 -diff --git a/zutil.h b/zutil.h -index b079ea6a80f5..80375b8b6109 100644 ---- a/zutil.h -+++ b/zutil.h -@@ -28,6 +28,21 @@ - # include - # include - #endif -+#ifdef NO_ERRNO_H -+# ifdef _WIN32_WCE -+ /* The Microsoft C Run-Time Library for Windows CE doesn't have -+ * errno. We define it as a global variable to simplify porting. -+ * Its value is always 0 and should not be used. We rename it to -+ * avoid conflict with other libraries that use the same workaround. -+ */ -+# define errno z_errno -+# endif -+ extern int errno; -+#else -+# ifndef _WIN32_WCE -+# include -+# endif -+#endif - - #ifdef Z_SOLO - typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/DEPS b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/DEPS deleted file mode 100644 index 144fbd149..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/DEPS +++ /dev/null @@ -1,5 +0,0 @@ -include_rules = [ - '+base', - '+build', - '+testing', -] diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc deleted file mode 100644 index 575aa1261..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/zlib/google/compression_utils.h" - -#include -#include -#include - -#include - -#include "base/bit_cast.h" -#include "base/logging.h" -#include "base/sys_byteorder.h" -#include "third_party/zlib/zlib.h" - -namespace { - -// The difference in bytes between a zlib header and a gzip header. -const size_t kGzipZlibHeaderDifferenceBytes = 16; - -// Pass an integer greater than the following get a gzip header instead of a -// zlib header when calling deflateInit2() and inflateInit2(). -const int kWindowBitsToGetGzipHeader = 16; - -// This describes the amount of memory zlib uses to compress data. It can go -// from 1 to 9, with 8 being the default. For details, see: -// http://www.zlib.net/manual.html (search for memLevel). -const int kZlibMemoryLevel = 8; - -// This code is taken almost verbatim from third_party/zlib/compress.c. The only -// difference is deflateInit2() is called which sets the window bits to be > 16. -// That causes a gzip header to be emitted rather than a zlib header. -int GzipCompressHelper(Bytef* dest, - uLongf* dest_length, - const Bytef* source, - uLong source_length) { - z_stream stream; - - stream.next_in = bit_cast(source); - stream.avail_in = static_cast(source_length); - stream.next_out = dest; - stream.avail_out = static_cast(*dest_length); - if (static_cast(stream.avail_out) != *dest_length) - return Z_BUF_ERROR; - - stream.zalloc = static_cast(0); - stream.zfree = static_cast(0); - stream.opaque = static_cast(0); - - gz_header gzip_header; - memset(&gzip_header, 0, sizeof(gzip_header)); - int err = deflateInit2(&stream, - Z_DEFAULT_COMPRESSION, - Z_DEFLATED, - MAX_WBITS + kWindowBitsToGetGzipHeader, - kZlibMemoryLevel, - Z_DEFAULT_STRATEGY); - if (err != Z_OK) - return err; - - err = deflateSetHeader(&stream, &gzip_header); - if (err != Z_OK) - return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *dest_length = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -// This code is taken almost verbatim from third_party/zlib/uncompr.c. The only -// difference is inflateInit2() is called which sets the window bits to be > 16. -// That causes a gzip header to be parsed rather than a zlib header. -int GzipUncompressHelper(Bytef* dest, - uLongf* dest_length, - const Bytef* source, - uLong source_length) { - z_stream stream; - - stream.next_in = bit_cast(source); - stream.avail_in = static_cast(source_length); - if (static_cast(stream.avail_in) != source_length) - return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = static_cast(*dest_length); - if (static_cast(stream.avail_out) != *dest_length) - return Z_BUF_ERROR; - - stream.zalloc = static_cast(0); - stream.zfree = static_cast(0); - - int err = inflateInit2(&stream, MAX_WBITS + kWindowBitsToGetGzipHeader); - if (err != Z_OK) - return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) - return Z_DATA_ERROR; - return err; - } - *dest_length = stream.total_out; - - err = inflateEnd(&stream); - return err; -} - -// Returns the uncompressed size from GZIP-compressed |compressed_data|. -uint32_t GetUncompressedSize(const std::string& compressed_data) { - // The uncompressed size is stored in the last 4 bytes of |input| in LE. - uint32_t size; - if (compressed_data.length() < sizeof(size)) - return 0; - memcpy(&size, &compressed_data[compressed_data.length() - sizeof(size)], - sizeof(size)); - return base::ByteSwapToLE32(size); -} - -} // namespace - -namespace compression { - -bool GzipCompress(const std::string& input, std::string* output) { - const uLongf input_size = static_cast(input.size()); - std::vector compressed_data(kGzipZlibHeaderDifferenceBytes + - compressBound(input_size)); - - uLongf compressed_size = static_cast(compressed_data.size()); - if (GzipCompressHelper(&compressed_data.front(), - &compressed_size, - bit_cast(input.data()), - input_size) != Z_OK) { - return false; - } - - compressed_data.resize(compressed_size); - output->assign(compressed_data.begin(), compressed_data.end()); - DCHECK_EQ(input_size, GetUncompressedSize(*output)); - return true; -} - -bool GzipUncompress(const std::string& input, std::string* output) { - std::string uncompressed_output; - uLongf uncompressed_size = static_cast(GetUncompressedSize(input)); - uncompressed_output.resize(uncompressed_size); - if (GzipUncompressHelper(bit_cast(uncompressed_output.data()), - &uncompressed_size, - bit_cast(input.data()), - static_cast(input.length())) == Z_OK) { - output->swap(uncompressed_output); - return true; - } - return false; -} - -} // namespace compression diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.h b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.h deleted file mode 100644 index 3bd68c57e..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_H_ -#define THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_H_ - -#include - -namespace compression { - -// Compresses the data in |input| using gzip, storing the result in |output|. -// |input| and |output| are allowed to be the same string (in-place operation). -bool GzipCompress(const std::string& input, std::string* output); - -// Uncompresses the data in |input| using gzip, storing the result in |output|. -// |input| and |output| are allowed to be the same string (in-place operation). -bool GzipUncompress(const std::string& input, std::string* output); - -} // namespace compression - -#endif // THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_H_ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.cc b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.cc deleted file mode 100644 index f0183d3f3..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.cc +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/zlib/google/zip.h" - -#include -#include - -#include "base/bind.h" -#include "base/files/file.h" -#include "base/files/file_enumerator.h" -#include "base/logging.h" -#include "base/strings/string16.h" -#include "base/strings/string_util.h" -#include "build/build_config.h" -#include "third_party/zlib/google/zip_internal.h" -#include "third_party/zlib/google/zip_reader.h" - -#if defined(USE_SYSTEM_MINIZIP) -#include -#include -#else -#include "third_party/zlib/contrib/minizip/unzip.h" -#include "third_party/zlib/contrib/minizip/zip.h" -#endif - -namespace { - -bool AddFileToZip(zipFile zip_file, const base::FilePath& src_dir) { - base::File file(src_dir, base::File::FLAG_OPEN | base::File::FLAG_READ); - if (!file.IsValid()) { - DLOG(ERROR) << "Could not open file for path " << src_dir.value(); - return false; - } - - int num_bytes; - char buf[zip::internal::kZipBufSize]; - do { - num_bytes = file.ReadAtCurrentPos(buf, zip::internal::kZipBufSize); - if (num_bytes > 0) { - if (ZIP_OK != zipWriteInFileInZip(zip_file, buf, num_bytes)) { - DLOG(ERROR) << "Could not write data to zip for path " - << src_dir.value(); - return false; - } - } - } while (num_bytes > 0); - - return true; -} - -bool AddEntryToZip(zipFile zip_file, const base::FilePath& path, - const base::FilePath& root_path) { - base::FilePath relative_path; - bool result = root_path.AppendRelativePath(path, &relative_path); - DCHECK(result); - std::string str_path = relative_path.AsUTF8Unsafe(); -#if defined(OS_WIN) - base::ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/"); -#endif - - bool is_directory = base::DirectoryExists(path); - if (is_directory) - str_path += "/"; - - zip_fileinfo file_info = zip::internal::GetFileInfoForZipping(path); - if (!zip::internal::ZipOpenNewFileInZip(zip_file, str_path, &file_info)) - return false; - - bool success = true; - if (!is_directory) { - success = AddFileToZip(zip_file, path); - } - - if (ZIP_OK != zipCloseFileInZip(zip_file)) { - DLOG(ERROR) << "Could not close zip file entry " << str_path; - return false; - } - - return success; -} - -bool ExcludeNoFilesFilter(const base::FilePath& file_path) { - return true; -} - -bool ExcludeHiddenFilesFilter(const base::FilePath& file_path) { - return file_path.BaseName().value()[0] != '.'; -} - -} // namespace - -namespace zip { - -bool Unzip(const base::FilePath& src_file, const base::FilePath& dest_dir) { - return UnzipWithFilterCallback(src_file, dest_dir, - base::Bind(&ExcludeNoFilesFilter), true); -} - -bool UnzipWithFilterCallback(const base::FilePath& src_file, - const base::FilePath& dest_dir, - const FilterCallback& filter_cb, - bool log_skipped_files) { - ZipReader reader; - if (!reader.Open(src_file)) { - DLOG(WARNING) << "Failed to open " << src_file.value(); - return false; - } - while (reader.HasMore()) { - if (!reader.OpenCurrentEntryInZip()) { - DLOG(WARNING) << "Failed to open the current file in zip"; - return false; - } - if (reader.current_entry_info()->is_unsafe()) { - DLOG(WARNING) << "Found an unsafe file in zip " - << reader.current_entry_info()->file_path().value(); - return false; - } - if (filter_cb.Run(reader.current_entry_info()->file_path())) { - if (!reader.ExtractCurrentEntryIntoDirectory(dest_dir)) { - DLOG(WARNING) << "Failed to extract " - << reader.current_entry_info()->file_path().value(); - return false; - } - } else if (log_skipped_files) { - DLOG(WARNING) << "Skipped file " - << reader.current_entry_info()->file_path().value(); - } - - if (!reader.AdvanceToNextEntry()) { - DLOG(WARNING) << "Failed to advance to the next file"; - return false; - } - } - return true; -} - -bool ZipWithFilterCallback(const base::FilePath& src_dir, - const base::FilePath& dest_file, - const FilterCallback& filter_cb) { - DCHECK(base::DirectoryExists(src_dir)); - - zipFile zip_file = internal::OpenForZipping(dest_file.AsUTF8Unsafe(), - APPEND_STATUS_CREATE); - - if (!zip_file) { - DLOG(WARNING) << "couldn't create file " << dest_file.value(); - return false; - } - - bool success = true; - base::FileEnumerator file_enumerator(src_dir, true /* recursive */, - base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES); - for (base::FilePath path = file_enumerator.Next(); !path.value().empty(); - path = file_enumerator.Next()) { - if (!filter_cb.Run(path)) { - continue; - } - - if (!AddEntryToZip(zip_file, path, src_dir)) { - success = false; - break; - } - } - - if (ZIP_OK != zipClose(zip_file, NULL)) { - DLOG(ERROR) << "Error closing zip file " << dest_file.value(); - return false; - } - - return success; -} - -bool Zip(const base::FilePath& src_dir, const base::FilePath& dest_file, - bool include_hidden_files) { - if (include_hidden_files) { - return ZipWithFilterCallback( - src_dir, dest_file, base::Bind(&ExcludeNoFilesFilter)); - } else { - return ZipWithFilterCallback( - src_dir, dest_file, base::Bind(&ExcludeHiddenFilesFilter)); - } -} - -#if defined(OS_POSIX) -bool ZipFiles(const base::FilePath& src_dir, - const std::vector& src_relative_paths, - int dest_fd) { - DCHECK(base::DirectoryExists(src_dir)); - zipFile zip_file = internal::OpenFdForZipping(dest_fd, APPEND_STATUS_CREATE); - - if (!zip_file) { - DLOG(ERROR) << "couldn't create file for fd " << dest_fd; - return false; - } - - bool success = true; - for (std::vector::const_iterator iter = - src_relative_paths.begin(); - iter != src_relative_paths.end(); ++iter) { - const base::FilePath& path = src_dir.Append(*iter); - if (!AddEntryToZip(zip_file, path, src_dir)) { - // TODO(hshi): clean up the partial zip file when error occurs. - success = false; - break; - } - } - - if (ZIP_OK != zipClose(zip_file, NULL)) { - DLOG(ERROR) << "Error closing zip file for fd " << dest_fd; - success = false; - } - - return success; -} -#endif // defined(OS_POSIX) - -} // namespace zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.h b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.h deleted file mode 100644 index 68bed0b30..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_ -#define THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_ - -#include - -#include "base/callback.h" -#include "base/files/file_path.h" -#include "build/build_config.h" - -namespace zip { - -// Zip the contents of src_dir into dest_file. src_path must be a directory. -// An entry will *not* be created in the zip for the root folder -- children -// of src_dir will be at the root level of the created zip. For each file in -// src_dir, include it only if the callback |filter_cb| returns true. Otherwise -// omit it. -typedef base::Callback FilterCallback; -bool ZipWithFilterCallback(const base::FilePath& src_dir, - const base::FilePath& dest_file, - const FilterCallback& filter_cb); - -// Convenience method for callers who don't need to set up the filter callback. -// If |include_hidden_files| is true, files starting with "." are included. -// Otherwise they are omitted. -bool Zip(const base::FilePath& src_dir, const base::FilePath& dest_file, - bool include_hidden_files); - -#if defined(OS_POSIX) -// Zips files listed in |src_relative_paths| to destination specified by file -// descriptor |dest_fd|, without taking ownership of |dest_fd|. The paths listed -// in |src_relative_paths| are relative to the |src_dir| and will be used as the -// file names in the created zip file. All source paths must be under |src_dir| -// in the file system hierarchy. -bool ZipFiles(const base::FilePath& src_dir, - const std::vector& src_relative_paths, - int dest_fd); -#endif // defined(OS_POSIX) - -// Unzip the contents of zip_file into dest_dir. -// For each file in zip_file, include it only if the callback |filter_cb| -// returns true. Otherwise omit it. -// If |log_skipped_files| is true, files skipped during extraction are printed -// to debug log. -typedef base::Callback FilterCallback; -bool UnzipWithFilterCallback(const base::FilePath& zip_file, - const base::FilePath& dest_dir, - const FilterCallback& filter_cb, - bool log_skipped_files); - -// Unzip the contents of zip_file into dest_dir. -bool Unzip(const base::FilePath& zip_file, const base::FilePath& dest_dir); - -} // namespace zip - -#endif // THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc deleted file mode 100644 index ff5a39514..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/zlib/google/zip_reader.h" - -#include - -#include "base/bind.h" -#include "base/files/file.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/single_thread_task_runner.h" -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" -#include "base/threading/thread_task_runner_handle.h" -#include "build/build_config.h" -#include "third_party/zlib/google/zip_internal.h" - -#if defined(USE_SYSTEM_MINIZIP) -#include -#else -#include "third_party/zlib/contrib/minizip/unzip.h" -#if defined(OS_WIN) -#include "third_party/zlib/contrib/minizip/iowin32.h" -#endif // defined(OS_WIN) -#endif // defined(USE_SYSTEM_MINIZIP) - -namespace zip { - -namespace { - -// FilePathWriterDelegate ------------------------------------------------------ - -// A writer delegate that writes a file at a given path. -class FilePathWriterDelegate : public WriterDelegate { - public: - explicit FilePathWriterDelegate(const base::FilePath& output_file_path); - ~FilePathWriterDelegate() override; - - // WriterDelegate methods: - - // Creates the output file and any necessary intermediate directories. - bool PrepareOutput() override; - - // Writes |num_bytes| bytes of |data| to the file, returning false if not all - // bytes could be written. - bool WriteBytes(const char* data, int num_bytes) override; - - private: - base::FilePath output_file_path_; - base::File file_; - - DISALLOW_COPY_AND_ASSIGN(FilePathWriterDelegate); -}; - -FilePathWriterDelegate::FilePathWriterDelegate( - const base::FilePath& output_file_path) - : output_file_path_(output_file_path) { -} - -FilePathWriterDelegate::~FilePathWriterDelegate() { -} - -bool FilePathWriterDelegate::PrepareOutput() { - // We can't rely on parent directory entries being specified in the - // zip, so we make sure they are created. - if (!base::CreateDirectory(output_file_path_.DirName())) - return false; - - file_.Initialize(output_file_path_, - base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); - return file_.IsValid(); -} - -bool FilePathWriterDelegate::WriteBytes(const char* data, int num_bytes) { - return num_bytes == file_.WriteAtCurrentPos(data, num_bytes); -} - - -// StringWriterDelegate -------------------------------------------------------- - -// A writer delegate that writes no more than |max_read_bytes| to a given -// std::string. -class StringWriterDelegate : public WriterDelegate { - public: - StringWriterDelegate(size_t max_read_bytes, std::string* output); - ~StringWriterDelegate() override; - - // WriterDelegate methods: - - // Returns true. - bool PrepareOutput() override; - - // Appends |num_bytes| bytes from |data| to the output string. Returns false - // if |num_bytes| will cause the string to exceed |max_read_bytes|. - bool WriteBytes(const char* data, int num_bytes) override; - - private: - size_t max_read_bytes_; - std::string* output_; - - DISALLOW_COPY_AND_ASSIGN(StringWriterDelegate); -}; - -StringWriterDelegate::StringWriterDelegate(size_t max_read_bytes, - std::string* output) - : max_read_bytes_(max_read_bytes), - output_(output) { -} - -StringWriterDelegate::~StringWriterDelegate() { -} - -bool StringWriterDelegate::PrepareOutput() { - return true; -} - -bool StringWriterDelegate::WriteBytes(const char* data, int num_bytes) { - if (output_->size() + num_bytes > max_read_bytes_) - return false; - output_->append(data, num_bytes); - return true; -} - -} // namespace - -// TODO(satorux): The implementation assumes that file names in zip files -// are encoded in UTF-8. This is true for zip files created by Zip() -// function in zip.h, but not true for user-supplied random zip files. -ZipReader::EntryInfo::EntryInfo(const std::string& file_name_in_zip, - const unz_file_info& raw_file_info) - : file_path_(base::FilePath::FromUTF8Unsafe(file_name_in_zip)), - is_directory_(false) { - original_size_ = raw_file_info.uncompressed_size; - - // Directory entries in zip files end with "/". - is_directory_ = base::EndsWith(file_name_in_zip, "/", - base::CompareCase::INSENSITIVE_ASCII); - - // Check the file name here for directory traversal issues. - is_unsafe_ = file_path_.ReferencesParent(); - - // We also consider that the file name is unsafe, if it's invalid UTF-8. - base::string16 file_name_utf16; - if (!base::UTF8ToUTF16(file_name_in_zip.data(), file_name_in_zip.size(), - &file_name_utf16)) { - is_unsafe_ = true; - } - - // We also consider that the file name is unsafe, if it's absolute. - // On Windows, IsAbsolute() returns false for paths starting with "/". - if (file_path_.IsAbsolute() || - base::StartsWith(file_name_in_zip, "/", - base::CompareCase::INSENSITIVE_ASCII)) - is_unsafe_ = true; - - // Construct the last modified time. The timezone info is not present in - // zip files, so we construct the time as local time. - base::Time::Exploded exploded_time = {}; // Zero-clear. - exploded_time.year = raw_file_info.tmu_date.tm_year; - // The month in zip file is 0-based, whereas ours is 1-based. - exploded_time.month = raw_file_info.tmu_date.tm_mon + 1; - exploded_time.day_of_month = raw_file_info.tmu_date.tm_mday; - exploded_time.hour = raw_file_info.tmu_date.tm_hour; - exploded_time.minute = raw_file_info.tmu_date.tm_min; - exploded_time.second = raw_file_info.tmu_date.tm_sec; - exploded_time.millisecond = 0; - - if (!base::Time::FromLocalExploded(exploded_time, &last_modified_)) - last_modified_ = base::Time::UnixEpoch(); -} - -ZipReader::ZipReader() - : weak_ptr_factory_(this) { - Reset(); -} - -ZipReader::~ZipReader() { - Close(); -} - -bool ZipReader::Open(const base::FilePath& zip_file_path) { - DCHECK(!zip_file_); - - // Use of "Unsafe" function does not look good, but there is no way to do - // this safely on Linux. See file_util.h for details. - zip_file_ = internal::OpenForUnzipping(zip_file_path.AsUTF8Unsafe()); - if (!zip_file_) { - return false; - } - - return OpenInternal(); -} - -bool ZipReader::OpenFromPlatformFile(base::PlatformFile zip_fd) { - DCHECK(!zip_file_); - -#if defined(OS_POSIX) - zip_file_ = internal::OpenFdForUnzipping(zip_fd); -#elif defined(OS_WIN) - zip_file_ = internal::OpenHandleForUnzipping(zip_fd); -#endif - if (!zip_file_) { - return false; - } - - return OpenInternal(); -} - -bool ZipReader::OpenFromString(const std::string& data) { - zip_file_ = internal::PrepareMemoryForUnzipping(data); - if (!zip_file_) - return false; - return OpenInternal(); -} - -void ZipReader::Close() { - if (zip_file_) { - unzClose(zip_file_); - } - Reset(); -} - -bool ZipReader::HasMore() { - return !reached_end_; -} - -bool ZipReader::AdvanceToNextEntry() { - DCHECK(zip_file_); - - // Should not go further if we already reached the end. - if (reached_end_) - return false; - - unz_file_pos position = {}; - if (unzGetFilePos(zip_file_, &position) != UNZ_OK) - return false; - const int current_entry_index = position.num_of_file; - // If we are currently at the last entry, then the next position is the - // end of the zip file, so mark that we reached the end. - if (current_entry_index + 1 == num_entries_) { - reached_end_ = true; - } else { - DCHECK_LT(current_entry_index + 1, num_entries_); - if (unzGoToNextFile(zip_file_) != UNZ_OK) { - return false; - } - } - current_entry_info_.reset(); - return true; -} - -bool ZipReader::OpenCurrentEntryInZip() { - DCHECK(zip_file_); - - unz_file_info raw_file_info = {}; - char raw_file_name_in_zip[internal::kZipMaxPath] = {}; - const int result = unzGetCurrentFileInfo(zip_file_, - &raw_file_info, - raw_file_name_in_zip, - sizeof(raw_file_name_in_zip) - 1, - NULL, // extraField. - 0, // extraFieldBufferSize. - NULL, // szComment. - 0); // commentBufferSize. - if (result != UNZ_OK) - return false; - if (raw_file_name_in_zip[0] == '\0') - return false; - current_entry_info_.reset( - new EntryInfo(raw_file_name_in_zip, raw_file_info)); - return true; -} - -bool ZipReader::LocateAndOpenEntry(const base::FilePath& path_in_zip) { - DCHECK(zip_file_); - - current_entry_info_.reset(); - reached_end_ = false; - const int kDefaultCaseSensivityOfOS = 0; - const int result = unzLocateFile(zip_file_, - path_in_zip.AsUTF8Unsafe().c_str(), - kDefaultCaseSensivityOfOS); - if (result != UNZ_OK) - return false; - - // Then Open the entry. - return OpenCurrentEntryInZip(); -} - -bool ZipReader::ExtractCurrentEntry(WriterDelegate* delegate) const { - DCHECK(zip_file_); - - const int open_result = unzOpenCurrentFile(zip_file_); - if (open_result != UNZ_OK) - return false; - - if (!delegate->PrepareOutput()) - return false; - - bool success = true; // This becomes false when something bad happens. - std::unique_ptr buf(new char[internal::kZipBufSize]); - while (true) { - const int num_bytes_read = unzReadCurrentFile(zip_file_, buf.get(), - internal::kZipBufSize); - if (num_bytes_read == 0) { - // Reached the end of the file. - break; - } else if (num_bytes_read < 0) { - // If num_bytes_read < 0, then it's a specific UNZ_* error code. - success = false; - break; - } else if (num_bytes_read > 0) { - // Some data is read. - if (!delegate->WriteBytes(buf.get(), num_bytes_read)) { - success = false; - break; - } - } - } - - unzCloseCurrentFile(zip_file_); - - return success; -} - -bool ZipReader::ExtractCurrentEntryToFilePath( - const base::FilePath& output_file_path) const { - DCHECK(zip_file_); - - // If this is a directory, just create it and return. - if (current_entry_info()->is_directory()) - return base::CreateDirectory(output_file_path); - - bool success = false; - { - FilePathWriterDelegate writer(output_file_path); - success = ExtractCurrentEntry(&writer); - } - - if (success && - current_entry_info()->last_modified() != base::Time::UnixEpoch()) { - base::TouchFile(output_file_path, - base::Time::Now(), - current_entry_info()->last_modified()); - } - - return success; -} - -void ZipReader::ExtractCurrentEntryToFilePathAsync( - const base::FilePath& output_file_path, - const SuccessCallback& success_callback, - const FailureCallback& failure_callback, - const ProgressCallback& progress_callback) { - DCHECK(zip_file_); - DCHECK(current_entry_info_.get()); - - // If this is a directory, just create it and return. - if (current_entry_info()->is_directory()) { - if (base::CreateDirectory(output_file_path)) { - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, success_callback); - } else { - DVLOG(1) << "Unzip failed: unable to create directory."; - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, failure_callback); - } - return; - } - - if (unzOpenCurrentFile(zip_file_) != UNZ_OK) { - DVLOG(1) << "Unzip failed: unable to open current zip entry."; - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, failure_callback); - return; - } - - base::FilePath output_dir_path = output_file_path.DirName(); - if (!base::CreateDirectory(output_dir_path)) { - DVLOG(1) << "Unzip failed: unable to create containing directory."; - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, failure_callback); - return; - } - - const int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE; - base::File output_file(output_file_path, flags); - - if (!output_file.IsValid()) { - DVLOG(1) << "Unzip failed: unable to create platform file at " - << output_file_path.value(); - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, failure_callback); - return; - } - - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(), - Passed(std::move(output_file)), success_callback, - failure_callback, progress_callback, 0 /* initial offset */)); -} - -bool ZipReader::ExtractCurrentEntryIntoDirectory( - const base::FilePath& output_directory_path) const { - DCHECK(current_entry_info_.get()); - - base::FilePath output_file_path = output_directory_path.Append( - current_entry_info()->file_path()); - return ExtractCurrentEntryToFilePath(output_file_path); -} - -bool ZipReader::ExtractCurrentEntryToFile(base::File* file) const { - DCHECK(zip_file_); - - // If this is a directory, there's nothing to extract to the file, so return - // false. - if (current_entry_info()->is_directory()) - return false; - - FileWriterDelegate writer(file); - return ExtractCurrentEntry(&writer); -} - -bool ZipReader::ExtractCurrentEntryToString(size_t max_read_bytes, - std::string* output) const { - DCHECK(output); - DCHECK(zip_file_); - DCHECK_NE(0U, max_read_bytes); - - if (current_entry_info()->is_directory()) { - output->clear(); - return true; - } - - // The original_size() is the best hint for the real size, so it saves - // doing reallocations for the common case when the uncompressed size is - // correct. However, we need to assume that the uncompressed size could be - // incorrect therefore this function needs to read as much data as possible. - std::string contents; - contents.reserve( - static_cast(std::min(static_cast(max_read_bytes), - current_entry_info()->original_size()))); - - StringWriterDelegate writer(max_read_bytes, &contents); - if (!ExtractCurrentEntry(&writer)) - return false; - output->swap(contents); - return true; -} - -bool ZipReader::OpenInternal() { - DCHECK(zip_file_); - - unz_global_info zip_info = {}; // Zero-clear. - if (unzGetGlobalInfo(zip_file_, &zip_info) != UNZ_OK) { - return false; - } - num_entries_ = zip_info.number_entry; - if (num_entries_ < 0) - return false; - - // We are already at the end if the zip file is empty. - reached_end_ = (num_entries_ == 0); - return true; -} - -void ZipReader::Reset() { - zip_file_ = NULL; - num_entries_ = 0; - reached_end_ = false; - current_entry_info_.reset(); -} - -void ZipReader::ExtractChunk(base::File output_file, - const SuccessCallback& success_callback, - const FailureCallback& failure_callback, - const ProgressCallback& progress_callback, - const int64_t offset) { - char buffer[internal::kZipBufSize]; - - const int num_bytes_read = unzReadCurrentFile(zip_file_, - buffer, - internal::kZipBufSize); - - if (num_bytes_read == 0) { - unzCloseCurrentFile(zip_file_); - success_callback.Run(); - } else if (num_bytes_read < 0) { - DVLOG(1) << "Unzip failed: error while reading zipfile " - << "(" << num_bytes_read << ")"; - failure_callback.Run(); - } else { - if (num_bytes_read != output_file.Write(offset, buffer, num_bytes_read)) { - DVLOG(1) << "Unzip failed: unable to write all bytes to target."; - failure_callback.Run(); - return; - } - - int64_t current_progress = offset + num_bytes_read; - - progress_callback.Run(current_progress); - - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(), - Passed(std::move(output_file)), success_callback, - failure_callback, progress_callback, current_progress)); - } -} - -// FileWriterDelegate ---------------------------------------------------------- - -FileWriterDelegate::FileWriterDelegate(base::File* file) - : file_(file), - file_length_(0) { -} - -FileWriterDelegate::~FileWriterDelegate() { - if (!file_->SetLength(file_length_)) { - DPLOG(ERROR) << "Failed updating length of written file"; - } -} - -bool FileWriterDelegate::PrepareOutput() { - return file_->Seek(base::File::FROM_BEGIN, 0) >= 0; -} - -bool FileWriterDelegate::WriteBytes(const char* data, int num_bytes) { - int bytes_written = file_->WriteAtCurrentPos(data, num_bytes); - if (bytes_written > 0) - file_length_ += bytes_written; - return bytes_written == num_bytes; -} - -} // namespace zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.h b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.h deleted file mode 100644 index c1b6fb336..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader.h +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_ -#define THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_ - -#include -#include - -#include -#include - -#include "base/callback.h" -#include "base/files/file.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "base/time/time.h" - -#if defined(USE_SYSTEM_MINIZIP) -#include -#else -#include "third_party/zlib/contrib/minizip/unzip.h" -#endif - -namespace zip { - -// A delegate interface used to stream out an entry; see -// ZipReader::ExtractCurrentEntry. -class WriterDelegate { - public: - virtual ~WriterDelegate() {} - - // Invoked once before any data is streamed out to pave the way (e.g., to open - // the output file). Return false on failure to cancel extraction. - virtual bool PrepareOutput() = 0; - - // Invoked to write the next chunk of data. Return false on failure to cancel - // extraction. - virtual bool WriteBytes(const char* data, int num_bytes) = 0; -}; - -// This class is used for reading zip files. A typical use case of this -// class is to scan entries in a zip file and extract them. The code will -// look like: -// -// ZipReader reader; -// reader.Open(zip_file_path); -// while (reader.HasMore()) { -// reader.OpenCurrentEntryInZip(); -// reader.ExtractCurrentEntryToDirectory(output_directory_path); -// reader.AdvanceToNextEntry(); -// } -// -// For simplicity, error checking is omitted in the example code above. The -// production code should check return values from all of these functions. -// -// This calls can also be used for random access of contents in a zip file -// using LocateAndOpenEntry(). -// -class ZipReader { - public: - // A callback that is called when the operation is successful. - typedef base::Closure SuccessCallback; - // A callback that is called when the operation fails. - typedef base::Closure FailureCallback; - // A callback that is called periodically during the operation with the number - // of bytes that have been processed so far. - typedef base::Callback ProgressCallback; - - // This class represents information of an entry (file or directory) in - // a zip file. - class EntryInfo { - public: - EntryInfo(const std::string& filename_in_zip, - const unz_file_info& raw_file_info); - - // Returns the file path. The path is usually relative like - // "foo/bar.txt", but if it's absolute, is_unsafe() returns true. - const base::FilePath& file_path() const { return file_path_; } - - // Returns the size of the original file (i.e. after uncompressed). - // Returns 0 if the entry is a directory. - // Note: this value should not be trusted, because it is stored as metadata - // in the zip archive and can be different from the real uncompressed size. - int64_t original_size() const { return original_size_; } - - // Returns the last modified time. If the time stored in the zip file was - // not valid, the unix epoch will be returned. - // - // The time stored in the zip archive uses the MS-DOS date and time format. - // http://msdn.microsoft.com/en-us/library/ms724247(v=vs.85).aspx - // As such the following limitations apply: - // * only years from 1980 to 2107 can be represented. - // * the time stamp has a 2 second resolution. - // * there's no timezone information, so the time is interpreted as local. - base::Time last_modified() const { return last_modified_; } - - // Returns true if the entry is a directory. - bool is_directory() const { return is_directory_; } - - // Returns true if the entry is unsafe, like having ".." or invalid - // UTF-8 characters in its file name, or the file path is absolute. - bool is_unsafe() const { return is_unsafe_; } - - private: - const base::FilePath file_path_; - int64_t original_size_; - base::Time last_modified_; - bool is_directory_; - bool is_unsafe_; - DISALLOW_COPY_AND_ASSIGN(EntryInfo); - }; - - ZipReader(); - ~ZipReader(); - - // Opens the zip file specified by |zip_file_path|. Returns true on - // success. - bool Open(const base::FilePath& zip_file_path); - - // Opens the zip file referred to by the platform file |zip_fd|, without - // taking ownership of |zip_fd|. Returns true on success. - bool OpenFromPlatformFile(base::PlatformFile zip_fd); - - // Opens the zip data stored in |data|. This class uses a weak reference to - // the given sring while extracting files, i.e. the caller should keep the - // string until it finishes extracting files. - bool OpenFromString(const std::string& data); - - // Closes the currently opened zip file. This function is called in the - // destructor of the class, so you usually don't need to call this. - void Close(); - - // Returns true if there is at least one entry to read. This function is - // used to scan entries with AdvanceToNextEntry(), like: - // - // while (reader.HasMore()) { - // // Do something with the current file here. - // reader.AdvanceToNextEntry(); - // } - bool HasMore(); - - // Advances the next entry. Returns true on success. - bool AdvanceToNextEntry(); - - // Opens the current entry in the zip file. On success, returns true and - // updates the the current entry state (i.e. current_entry_info() is - // updated). This function should be called before operations over the - // current entry like ExtractCurrentEntryToFile(). - // - // Note that there is no CloseCurrentEntryInZip(). The the current entry - // state is reset automatically as needed. - bool OpenCurrentEntryInZip(); - - // Locates an entry in the zip file and opens it. Returns true on - // success. This function internally calls OpenCurrentEntryInZip() on - // success. On failure, current_entry_info() becomes NULL. - bool LocateAndOpenEntry(const base::FilePath& path_in_zip); - - // Extracts the current entry in chunks to |delegate|. - bool ExtractCurrentEntry(WriterDelegate* delegate) const; - - // Extracts the current entry to the given output file path. If the - // current file is a directory, just creates a directory - // instead. Returns true on success. OpenCurrentEntryInZip() must be - // called beforehand. - // - // This function preserves the timestamp of the original entry. If that - // timestamp is not valid, the timestamp will be set to the current time. - bool ExtractCurrentEntryToFilePath( - const base::FilePath& output_file_path) const; - - // Asynchronously extracts the current entry to the given output file path. - // If the current entry is a directory it just creates the directory - // synchronously instead. OpenCurrentEntryInZip() must be called beforehand. - // success_callback will be called on success and failure_callback will be - // called on failure. progress_callback will be called at least once. - // Callbacks will be posted to the current MessageLoop in-order. - void ExtractCurrentEntryToFilePathAsync( - const base::FilePath& output_file_path, - const SuccessCallback& success_callback, - const FailureCallback& failure_callback, - const ProgressCallback& progress_callback); - - // Extracts the current entry to the given output directory path using - // ExtractCurrentEntryToFilePath(). Sub directories are created as needed - // based on the file path of the current entry. For example, if the file - // path in zip is "foo/bar.txt", and the output directory is "output", - // "output/foo/bar.txt" will be created. - // - // Returns true on success. OpenCurrentEntryInZip() must be called - // beforehand. - // - // This function preserves the timestamp of the original entry. If that - // timestamp is not valid, the timestamp will be set to the current time. - bool ExtractCurrentEntryIntoDirectory( - const base::FilePath& output_directory_path) const; - - // Extracts the current entry by writing directly to a platform file. - // Does not close the file. Returns true on success. - bool ExtractCurrentEntryToFile(base::File* file) const; - - // Extracts the current entry into memory. If the current entry is a directory - // the |output| parameter is set to the empty string. If the current entry is - // a file, the |output| parameter is filled with its contents. Returns true on - // success. OpenCurrentEntryInZip() must be called beforehand. - // Note: the |output| parameter can be filled with a big amount of data, avoid - // passing it around by value, but by reference or pointer. - // Note: the value returned by EntryInfo::original_size() cannot be - // trusted, so the real size of the uncompressed contents can be different. - // Use max_read_bytes to limit the ammount of memory used to carry the entry. - // If the real size of the uncompressed data is bigger than max_read_bytes - // then false is returned. |max_read_bytes| must be non-zero. - bool ExtractCurrentEntryToString( - size_t max_read_bytes, - std::string* output) const; - - // Returns the current entry info. Returns NULL if the current entry is - // not yet opened. OpenCurrentEntryInZip() must be called beforehand. - EntryInfo* current_entry_info() const { - return current_entry_info_.get(); - } - - // Returns the number of entries in the zip file. - // Open() must be called beforehand. - int num_entries() const { return num_entries_; } - - private: - // Common code used both in Open and OpenFromFd. - bool OpenInternal(); - - // Resets the internal state. - void Reset(); - - // Extracts a chunk of the file to the target. Will post a task for the next - // chunk and success/failure/progress callbacks as necessary. - void ExtractChunk(base::File target_file, - const SuccessCallback& success_callback, - const FailureCallback& failure_callback, - const ProgressCallback& progress_callback, - const int64_t offset); - - unzFile zip_file_; - int num_entries_; - bool reached_end_; - std::unique_ptr current_entry_info_; - - base::WeakPtrFactory weak_ptr_factory_; - - DISALLOW_COPY_AND_ASSIGN(ZipReader); -}; - -// A writer delegate that writes to a given File. -class FileWriterDelegate : public WriterDelegate { - public: - explicit FileWriterDelegate(base::File* file); - - // Truncates the file to the number of bytes written. - ~FileWriterDelegate() override; - - // WriterDelegate methods: - - // Seeks to the beginning of the file, returning false if the seek fails. - bool PrepareOutput() override; - - // Writes |num_bytes| bytes of |data| to the file, returning false on error or - // if not all bytes could be written. - bool WriteBytes(const char* data, int num_bytes) override; - - private: - base::File* file_; - int64_t file_length_; - - DISALLOW_COPY_AND_ASSIGN(FileWriterDelegate); -}; - -} // namespace zip - -#endif // THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc deleted file mode 100644 index 4e023dc28..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc +++ /dev/null @@ -1,692 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/zlib/google/zip_reader.h" - -#include -#include -#include - -#include -#include - -#include "base/bind.h" -#include "base/files/file.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/md5.h" -#include "base/path_service.h" -#include "base/run_loop.h" -#include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" -#include "base/time/time.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" -#include "third_party/zlib/google/zip_internal.h" - -using ::testing::Return; -using ::testing::_; - -namespace { - -const static std::string kQuuxExpectedMD5 = "d1ae4ac8a17a0e09317113ab284b57a6"; - -class FileWrapper { - public: - typedef enum { - READ_ONLY, - READ_WRITE - } AccessMode; - - FileWrapper(const base::FilePath& path, AccessMode mode) { - int flags = base::File::FLAG_READ; - if (mode == READ_ONLY) - flags |= base::File::FLAG_OPEN; - else - flags |= base::File::FLAG_WRITE | base::File::FLAG_CREATE_ALWAYS; - - file_.Initialize(path, flags); - } - - ~FileWrapper() {} - - base::PlatformFile platform_file() { return file_.GetPlatformFile(); } - - base::File* file() { return &file_; } - - private: - base::File file_; -}; - -// A mock that provides methods that can be used as callbacks in asynchronous -// unzip functions. Tracks the number of calls and number of bytes reported. -// Assumes that progress callbacks will be executed in-order. -class MockUnzipListener : public base::SupportsWeakPtr { - public: - MockUnzipListener() - : success_calls_(0), - failure_calls_(0), - progress_calls_(0), - current_progress_(0) { - } - - // Success callback for async functions. - void OnUnzipSuccess() { - success_calls_++; - } - - // Failure callback for async functions. - void OnUnzipFailure() { - failure_calls_++; - } - - // Progress callback for async functions. - void OnUnzipProgress(int64_t progress) { - DCHECK(progress > current_progress_); - progress_calls_++; - current_progress_ = progress; - } - - int success_calls() { return success_calls_; } - int failure_calls() { return failure_calls_; } - int progress_calls() { return progress_calls_; } - int current_progress() { return current_progress_; } - - private: - int success_calls_; - int failure_calls_; - int progress_calls_; - - int64_t current_progress_; -}; - -class MockWriterDelegate : public zip::WriterDelegate { - public: - MOCK_METHOD0(PrepareOutput, bool()); - MOCK_METHOD2(WriteBytes, bool(const char*, int)); -}; - -} // namespace - -namespace zip { - -// Make the test a PlatformTest to setup autorelease pools properly on Mac. -class ZipReaderTest : public PlatformTest { - protected: - virtual void SetUp() { - PlatformTest::SetUp(); - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - test_dir_ = temp_dir_.GetPath(); - - ASSERT_TRUE(GetTestDataDirectory(&test_data_dir_)); - - test_zip_file_ = test_data_dir_.AppendASCII("test.zip"); - evil_zip_file_ = test_data_dir_.AppendASCII("evil.zip"); - evil_via_invalid_utf8_zip_file_ = test_data_dir_.AppendASCII( - "evil_via_invalid_utf8.zip"); - evil_via_absolute_file_name_zip_file_ = test_data_dir_.AppendASCII( - "evil_via_absolute_file_name.zip"); - - test_zip_contents_.insert(base::FilePath(FILE_PATH_LITERAL("foo/"))); - test_zip_contents_.insert(base::FilePath(FILE_PATH_LITERAL("foo/bar/"))); - test_zip_contents_.insert( - base::FilePath(FILE_PATH_LITERAL("foo/bar/baz.txt"))); - test_zip_contents_.insert( - base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt"))); - test_zip_contents_.insert( - base::FilePath(FILE_PATH_LITERAL("foo/bar.txt"))); - test_zip_contents_.insert(base::FilePath(FILE_PATH_LITERAL("foo.txt"))); - test_zip_contents_.insert( - base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden"))); - } - - virtual void TearDown() { - PlatformTest::TearDown(); - } - - bool GetTestDataDirectory(base::FilePath* path) { - bool success = PathService::Get(base::DIR_SOURCE_ROOT, path); - EXPECT_TRUE(success); - if (!success) - return false; - *path = path->AppendASCII("third_party"); - *path = path->AppendASCII("zlib"); - *path = path->AppendASCII("google"); - *path = path->AppendASCII("test"); - *path = path->AppendASCII("data"); - return true; - } - - bool CompareFileAndMD5(const base::FilePath& path, - const std::string expected_md5) { - // Read the output file and compute the MD5. - std::string output; - if (!base::ReadFileToString(path, &output)) - return false; - const std::string md5 = base::MD5String(output); - return expected_md5 == md5; - } - - // The path to temporary directory used to contain the test operations. - base::FilePath test_dir_; - // The path to the test data directory where test.zip etc. are located. - base::FilePath test_data_dir_; - // The path to test.zip in the test data directory. - base::FilePath test_zip_file_; - // The path to evil.zip in the test data directory. - base::FilePath evil_zip_file_; - // The path to evil_via_invalid_utf8.zip in the test data directory. - base::FilePath evil_via_invalid_utf8_zip_file_; - // The path to evil_via_absolute_file_name.zip in the test data directory. - base::FilePath evil_via_absolute_file_name_zip_file_; - std::set test_zip_contents_; - - base::ScopedTempDir temp_dir_; - - base::MessageLoop message_loop_; -}; - -TEST_F(ZipReaderTest, Open_ValidZipFile) { - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); -} - -TEST_F(ZipReaderTest, Open_ValidZipPlatformFile) { - ZipReader reader; - FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); - ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); -} - -TEST_F(ZipReaderTest, Open_NonExistentFile) { - ZipReader reader; - ASSERT_FALSE(reader.Open(test_data_dir_.AppendASCII("nonexistent.zip"))); -} - -TEST_F(ZipReaderTest, Open_ExistentButNonZipFile) { - ZipReader reader; - ASSERT_FALSE(reader.Open(test_data_dir_.AppendASCII("create_test_zip.sh"))); -} - -// Iterate through the contents in the test zip file, and compare that the -// contents collected from the zip reader matches the expected contents. -TEST_F(ZipReaderTest, Iteration) { - std::set actual_contents; - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - while (reader.HasMore()) { - ASSERT_TRUE(reader.OpenCurrentEntryInZip()); - actual_contents.insert(reader.current_entry_info()->file_path()); - ASSERT_TRUE(reader.AdvanceToNextEntry()); - } - EXPECT_FALSE(reader.AdvanceToNextEntry()); // Shouldn't go further. - EXPECT_EQ(test_zip_contents_.size(), - static_cast(reader.num_entries())); - EXPECT_EQ(test_zip_contents_.size(), actual_contents.size()); - EXPECT_EQ(test_zip_contents_, actual_contents); -} - -// Open the test zip file from a file descriptor, iterate through its contents, -// and compare that they match the expected contents. -TEST_F(ZipReaderTest, PlatformFileIteration) { - std::set actual_contents; - ZipReader reader; - FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); - ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); - while (reader.HasMore()) { - ASSERT_TRUE(reader.OpenCurrentEntryInZip()); - actual_contents.insert(reader.current_entry_info()->file_path()); - ASSERT_TRUE(reader.AdvanceToNextEntry()); - } - EXPECT_FALSE(reader.AdvanceToNextEntry()); // Shouldn't go further. - EXPECT_EQ(test_zip_contents_.size(), - static_cast(reader.num_entries())); - EXPECT_EQ(test_zip_contents_.size(), actual_contents.size()); - EXPECT_EQ(test_zip_contents_, actual_contents); -} - -TEST_F(ZipReaderTest, LocateAndOpenEntry_ValidFile) { - std::set actual_contents; - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - EXPECT_EQ(target_path, reader.current_entry_info()->file_path()); -} - -TEST_F(ZipReaderTest, LocateAndOpenEntry_NonExistentFile) { - std::set actual_contents; - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("nonexistent.txt")); - ASSERT_FALSE(reader.LocateAndOpenEntry(target_path)); - EXPECT_EQ(NULL, reader.current_entry_info()); -} - -TEST_F(ZipReaderTest, ExtractCurrentEntryToFilePath_RegularFile) { - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_TRUE(reader.ExtractCurrentEntryToFilePath( - test_dir_.AppendASCII("quux.txt"))); - // Read the output file ans compute the MD5. - std::string output; - ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("quux.txt"), - &output)); - const std::string md5 = base::MD5String(output); - EXPECT_EQ(kQuuxExpectedMD5, md5); - // quux.txt should be larger than kZipBufSize so that we can exercise - // the loop in ExtractCurrentEntry(). - EXPECT_LT(static_cast(internal::kZipBufSize), output.size()); -} - -TEST_F(ZipReaderTest, PlatformFileExtractCurrentEntryToFilePath_RegularFile) { - ZipReader reader; - FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); - ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_TRUE(reader.ExtractCurrentEntryToFilePath( - test_dir_.AppendASCII("quux.txt"))); - // Read the output file and compute the MD5. - std::string output; - ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("quux.txt"), - &output)); - const std::string md5 = base::MD5String(output); - EXPECT_EQ(kQuuxExpectedMD5, md5); - // quux.txt should be larger than kZipBufSize so that we can exercise - // the loop in ExtractCurrentEntry(). - EXPECT_LT(static_cast(internal::kZipBufSize), output.size()); -} - -TEST_F(ZipReaderTest, PlatformFileExtractCurrentEntryToFile_RegularFile) { - ZipReader reader; - FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); - ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - base::FilePath out_path = test_dir_.AppendASCII("quux.txt"); - FileWrapper out_fd_w(out_path, FileWrapper::READ_WRITE); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_TRUE(reader.ExtractCurrentEntryToFile(out_fd_w.file())); - // Read the output file and compute the MD5. - std::string output; - ASSERT_TRUE(base::ReadFileToString(out_path, &output)); - const std::string md5 = base::MD5String(output); - EXPECT_EQ(kQuuxExpectedMD5, md5); - // quux.txt should be larger than kZipBufSize so that we can exercise - // the loop in ExtractCurrentEntry(). - EXPECT_LT(static_cast(internal::kZipBufSize), output.size()); -} - -TEST_F(ZipReaderTest, ExtractCurrentEntryToFilePath_Directory) { - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("foo/")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_TRUE(reader.ExtractCurrentEntryToFilePath( - test_dir_.AppendASCII("foo"))); - // The directory should be created. - ASSERT_TRUE(base::DirectoryExists(test_dir_.AppendASCII("foo"))); -} - -TEST_F(ZipReaderTest, ExtractCurrentEntryIntoDirectory_RegularFile) { - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_TRUE(reader.ExtractCurrentEntryIntoDirectory(test_dir_)); - // Sub directories should be created. - ASSERT_TRUE(base::DirectoryExists(test_dir_.AppendASCII("foo/bar"))); - // And the file should be created. - std::string output; - ASSERT_TRUE(base::ReadFileToString( - test_dir_.AppendASCII("foo/bar/quux.txt"), &output)); - const std::string md5 = base::MD5String(output); - EXPECT_EQ(kQuuxExpectedMD5, md5); -} - -TEST_F(ZipReaderTest, current_entry_info_RegularFile) { - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ZipReader::EntryInfo* current_entry_info = reader.current_entry_info(); - - EXPECT_EQ(target_path, current_entry_info->file_path()); - EXPECT_EQ(13527, current_entry_info->original_size()); - - // The expected time stamp: 2009-05-29 06:22:20 - base::Time::Exploded exploded = {}; // Zero-clear. - current_entry_info->last_modified().LocalExplode(&exploded); - EXPECT_EQ(2009, exploded.year); - EXPECT_EQ(5, exploded.month); - EXPECT_EQ(29, exploded.day_of_month); - EXPECT_EQ(6, exploded.hour); - EXPECT_EQ(22, exploded.minute); - EXPECT_EQ(20, exploded.second); - EXPECT_EQ(0, exploded.millisecond); - - EXPECT_FALSE(current_entry_info->is_unsafe()); - EXPECT_FALSE(current_entry_info->is_directory()); -} - -TEST_F(ZipReaderTest, current_entry_info_DotDotFile) { - ZipReader reader; - ASSERT_TRUE(reader.Open(evil_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL( - "../levilevilevilevilevilevilevilevilevilevilevilevil")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ZipReader::EntryInfo* current_entry_info = reader.current_entry_info(); - EXPECT_EQ(target_path, current_entry_info->file_path()); - - // This file is unsafe because of ".." in the file name. - EXPECT_TRUE(current_entry_info->is_unsafe()); - EXPECT_FALSE(current_entry_info->is_directory()); -} - -TEST_F(ZipReaderTest, current_entry_info_InvalidUTF8File) { - ZipReader reader; - ASSERT_TRUE(reader.Open(evil_via_invalid_utf8_zip_file_)); - // The evil file is the 2nd file in the zip file. - // We cannot locate by the file name ".\x80.\\evil.txt", - // as FilePath may internally convert the string. - ASSERT_TRUE(reader.AdvanceToNextEntry()); - ASSERT_TRUE(reader.OpenCurrentEntryInZip()); - ZipReader::EntryInfo* current_entry_info = reader.current_entry_info(); - - // This file is unsafe because of invalid UTF-8 in the file name. - EXPECT_TRUE(current_entry_info->is_unsafe()); - EXPECT_FALSE(current_entry_info->is_directory()); -} - -TEST_F(ZipReaderTest, current_entry_info_AbsoluteFile) { - ZipReader reader; - ASSERT_TRUE(reader.Open(evil_via_absolute_file_name_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("/evil.txt")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ZipReader::EntryInfo* current_entry_info = reader.current_entry_info(); - EXPECT_EQ(target_path, current_entry_info->file_path()); - - // This file is unsafe because of the absolute file name. - EXPECT_TRUE(current_entry_info->is_unsafe()); - EXPECT_FALSE(current_entry_info->is_directory()); -} - -TEST_F(ZipReaderTest, current_entry_info_Directory) { - ZipReader reader; - ASSERT_TRUE(reader.Open(test_zip_file_)); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ZipReader::EntryInfo* current_entry_info = reader.current_entry_info(); - - EXPECT_EQ(base::FilePath(FILE_PATH_LITERAL("foo/bar/")), - current_entry_info->file_path()); - // The directory size should be zero. - EXPECT_EQ(0, current_entry_info->original_size()); - - // The expected time stamp: 2009-05-31 15:49:52 - base::Time::Exploded exploded = {}; // Zero-clear. - current_entry_info->last_modified().LocalExplode(&exploded); - EXPECT_EQ(2009, exploded.year); - EXPECT_EQ(5, exploded.month); - EXPECT_EQ(31, exploded.day_of_month); - EXPECT_EQ(15, exploded.hour); - EXPECT_EQ(49, exploded.minute); - EXPECT_EQ(52, exploded.second); - EXPECT_EQ(0, exploded.millisecond); - - EXPECT_FALSE(current_entry_info->is_unsafe()); - EXPECT_TRUE(current_entry_info->is_directory()); -} - -// Verifies that the ZipReader class can extract a file from a zip archive -// stored in memory. This test opens a zip archive in a std::string object, -// extracts its content, and verifies the content is the same as the expected -// text. -TEST_F(ZipReaderTest, OpenFromString) { - // A zip archive consisting of one file "test.txt", which is a 16-byte text - // file that contains "This is a test.\n". - const char kTestData[] = - "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\xa4\x66\x24\x41\x13\xe8" - "\xcb\x27\x10\x00\x00\x00\x10\x00\x00\x00\x08\x00\x1c\x00\x74\x65" - "\x73\x74\x2e\x74\x78\x74\x55\x54\x09\x00\x03\x34\x89\x45\x50\x34" - "\x89\x45\x50\x75\x78\x0b\x00\x01\x04\x8e\xf0\x00\x00\x04\x88\x13" - "\x00\x00\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74" - "\x2e\x0a\x50\x4b\x01\x02\x1e\x03\x0a\x00\x00\x00\x00\x00\xa4\x66" - "\x24\x41\x13\xe8\xcb\x27\x10\x00\x00\x00\x10\x00\x00\x00\x08\x00" - "\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xa4\x81\x00\x00\x00\x00" - "\x74\x65\x73\x74\x2e\x74\x78\x74\x55\x54\x05\x00\x03\x34\x89\x45" - "\x50\x75\x78\x0b\x00\x01\x04\x8e\xf0\x00\x00\x04\x88\x13\x00\x00" - "\x50\x4b\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00\x4e\x00\x00\x00" - "\x52\x00\x00\x00\x00\x00"; - std::string data(kTestData, arraysize(kTestData)); - ZipReader reader; - ASSERT_TRUE(reader.OpenFromString(data)); - base::FilePath target_path(FILE_PATH_LITERAL("test.txt")); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_TRUE(reader.ExtractCurrentEntryToFilePath( - test_dir_.AppendASCII("test.txt"))); - - std::string actual; - ASSERT_TRUE(base::ReadFileToString( - test_dir_.AppendASCII("test.txt"), &actual)); - EXPECT_EQ(std::string("This is a test.\n"), actual); -} - -// Verifies that the asynchronous extraction to a file works. -TEST_F(ZipReaderTest, ExtractToFileAsync_RegularFile) { - MockUnzipListener listener; - - ZipReader reader; - base::FilePath target_file = test_dir_.AppendASCII("quux.txt"); - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ASSERT_TRUE(reader.Open(test_zip_file_)); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - reader.ExtractCurrentEntryToFilePathAsync( - target_file, - base::Bind(&MockUnzipListener::OnUnzipSuccess, - listener.AsWeakPtr()), - base::Bind(&MockUnzipListener::OnUnzipFailure, - listener.AsWeakPtr()), - base::Bind(&MockUnzipListener::OnUnzipProgress, - listener.AsWeakPtr())); - - EXPECT_EQ(0, listener.success_calls()); - EXPECT_EQ(0, listener.failure_calls()); - EXPECT_EQ(0, listener.progress_calls()); - - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(1, listener.success_calls()); - EXPECT_EQ(0, listener.failure_calls()); - EXPECT_LE(1, listener.progress_calls()); - - std::string output; - ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("quux.txt"), - &output)); - const std::string md5 = base::MD5String(output); - EXPECT_EQ(kQuuxExpectedMD5, md5); - - int64_t file_size = 0; - ASSERT_TRUE(base::GetFileSize(target_file, &file_size)); - - EXPECT_EQ(file_size, listener.current_progress()); -} - -// Verifies that the asynchronous extraction to a file works. -TEST_F(ZipReaderTest, ExtractToFileAsync_Directory) { - MockUnzipListener listener; - - ZipReader reader; - base::FilePath target_file = test_dir_.AppendASCII("foo"); - base::FilePath target_path(FILE_PATH_LITERAL("foo/")); - ASSERT_TRUE(reader.Open(test_zip_file_)); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - reader.ExtractCurrentEntryToFilePathAsync( - target_file, - base::Bind(&MockUnzipListener::OnUnzipSuccess, - listener.AsWeakPtr()), - base::Bind(&MockUnzipListener::OnUnzipFailure, - listener.AsWeakPtr()), - base::Bind(&MockUnzipListener::OnUnzipProgress, - listener.AsWeakPtr())); - - EXPECT_EQ(0, listener.success_calls()); - EXPECT_EQ(0, listener.failure_calls()); - EXPECT_EQ(0, listener.progress_calls()); - - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(1, listener.success_calls()); - EXPECT_EQ(0, listener.failure_calls()); - EXPECT_GE(0, listener.progress_calls()); - - ASSERT_TRUE(base::DirectoryExists(target_file)); -} - -TEST_F(ZipReaderTest, ExtractCurrentEntryToString) { - // test_mismatch_size.zip contains files with names from 0.txt to 7.txt with - // sizes from 0 to 7 bytes respectively, being the contents of each file a - // substring of "0123456" starting at '0'. - base::FilePath test_zip_file = - test_data_dir_.AppendASCII("test_mismatch_size.zip"); - - ZipReader reader; - std::string contents; - ASSERT_TRUE(reader.Open(test_zip_file)); - - for (size_t i = 0; i < 8; i++) { - SCOPED_TRACE(base::StringPrintf("Processing %d.txt", static_cast(i))); - - base::FilePath file_name = base::FilePath::FromUTF8Unsafe( - base::StringPrintf("%d.txt", static_cast(i))); - ASSERT_TRUE(reader.LocateAndOpenEntry(file_name)); - - if (i > 1) { - // Off by one byte read limit: must fail. - EXPECT_FALSE(reader.ExtractCurrentEntryToString(i - 1, &contents)); - } - - if (i > 0) { - // Exact byte read limit: must pass. - EXPECT_TRUE(reader.ExtractCurrentEntryToString(i, &contents)); - EXPECT_EQ(i, contents.size()); - EXPECT_EQ(0, memcmp(contents.c_str(), "0123456", i)); - } - - // More than necessary byte read limit: must pass. - EXPECT_TRUE(reader.ExtractCurrentEntryToString(16, &contents)); - EXPECT_EQ(i, contents.size()); - EXPECT_EQ(0, memcmp(contents.c_str(), "0123456", i)); - } - reader.Close(); -} - -// This test exposes http://crbug.com/430959, at least on OS X -TEST_F(ZipReaderTest, DISABLED_LeakDetectionTest) { - for (int i = 0; i < 100000; ++i) { - FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); - ZipReader reader; - ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); - } -} - -// Test that when WriterDelegate::PrepareMock returns false, no other methods on -// the delegate are called and the extraction fails. -TEST_F(ZipReaderTest, ExtractCurrentEntryPrepareFailure) { - testing::StrictMock mock_writer; - - EXPECT_CALL(mock_writer, PrepareOutput()) - .WillOnce(Return(false)); - - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ZipReader reader; - - ASSERT_TRUE(reader.Open(test_zip_file_)); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_FALSE(reader.ExtractCurrentEntry(&mock_writer)); -} - -// Test that when WriterDelegate::WriteBytes returns false, no other methods on -// the delegate are called and the extraction fails. -TEST_F(ZipReaderTest, ExtractCurrentEntryWriteBytesFailure) { - testing::StrictMock mock_writer; - - EXPECT_CALL(mock_writer, PrepareOutput()) - .WillOnce(Return(true)); - EXPECT_CALL(mock_writer, WriteBytes(_, _)) - .WillOnce(Return(false)); - - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ZipReader reader; - - ASSERT_TRUE(reader.Open(test_zip_file_)); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_FALSE(reader.ExtractCurrentEntry(&mock_writer)); -} - -// Test that extraction succeeds when the writer delegate reports all is well. -TEST_F(ZipReaderTest, ExtractCurrentEntrySuccess) { - testing::StrictMock mock_writer; - - EXPECT_CALL(mock_writer, PrepareOutput()) - .WillOnce(Return(true)); - EXPECT_CALL(mock_writer, WriteBytes(_, _)) - .WillRepeatedly(Return(true)); - - base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); - ZipReader reader; - - ASSERT_TRUE(reader.Open(test_zip_file_)); - ASSERT_TRUE(reader.LocateAndOpenEntry(target_path)); - ASSERT_TRUE(reader.ExtractCurrentEntry(&mock_writer)); -} - -class FileWriterDelegateTest : public ::testing::Test { - protected: - void SetUp() override { - ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_)); - file_.Initialize(temp_file_path_, (base::File::FLAG_CREATE_ALWAYS | - base::File::FLAG_READ | - base::File::FLAG_WRITE | - base::File::FLAG_TEMPORARY | - base::File::FLAG_DELETE_ON_CLOSE)); - ASSERT_TRUE(file_.IsValid()); - } - - // Writes data to the file, leaving the current position at the end of the - // write. - void PopulateFile() { - static const char kSomeData[] = "this sure is some data."; - static const size_t kSomeDataLen = sizeof(kSomeData) - 1; - ASSERT_NE(-1LL, file_.Write(0LL, kSomeData, kSomeDataLen)); - } - - base::FilePath temp_file_path_; - base::File file_; -}; - -TEST_F(FileWriterDelegateTest, WriteToStartAndTruncate) { - // Write stuff and advance. - PopulateFile(); - - // This should rewind, write, then truncate. - static const char kSomeData[] = "short"; - static const int kSomeDataLen = sizeof(kSomeData) - 1; - { - FileWriterDelegate writer(&file_); - ASSERT_TRUE(writer.PrepareOutput()); - ASSERT_TRUE(writer.WriteBytes(kSomeData, kSomeDataLen)); - } - ASSERT_EQ(kSomeDataLen, file_.GetLength()); - char buf[kSomeDataLen] = {}; - ASSERT_EQ(kSomeDataLen, file_.Read(0LL, buf, kSomeDataLen)); - ASSERT_EQ(std::string(kSomeData), std::string(buf, kSomeDataLen)); -} - -} // namespace zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc b/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc deleted file mode 100644 index 2d969d7d9..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include -#include - -#include -#include -#include - -#include "base/files/file.h" -#include "base/files/file_enumerator.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/path_service.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "build/build_config.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" -#include "third_party/zlib/google/zip.h" -#include "third_party/zlib/google/zip_reader.h" - -namespace { - -// Make the test a PlatformTest to setup autorelease pools properly on Mac. -class ZipTest : public PlatformTest { - protected: - enum ValidYearType { - VALID_YEAR, - INVALID_YEAR - }; - - virtual void SetUp() { - PlatformTest::SetUp(); - - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - test_dir_ = temp_dir_.GetPath(); - - base::FilePath zip_path(test_dir_); - zip_contents_.insert(zip_path.AppendASCII("foo.txt")); - zip_path = zip_path.AppendASCII("foo"); - zip_contents_.insert(zip_path); - zip_contents_.insert(zip_path.AppendASCII("bar.txt")); - zip_path = zip_path.AppendASCII("bar"); - zip_contents_.insert(zip_path); - zip_contents_.insert(zip_path.AppendASCII("baz.txt")); - zip_contents_.insert(zip_path.AppendASCII("quux.txt")); - zip_contents_.insert(zip_path.AppendASCII(".hidden")); - - // Include a subset of files in |zip_file_list_| to test ZipFiles(). - zip_file_list_.push_back(base::FilePath(FILE_PATH_LITERAL("foo.txt"))); - zip_file_list_.push_back( - base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt"))); - zip_file_list_.push_back( - base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden"))); - } - - virtual void TearDown() { - PlatformTest::TearDown(); - } - - bool GetTestDataDirectory(base::FilePath* path) { - bool success = PathService::Get(base::DIR_SOURCE_ROOT, path); - EXPECT_TRUE(success); - if (!success) - return false; - *path = path->AppendASCII("third_party"); - *path = path->AppendASCII("zlib"); - *path = path->AppendASCII("google"); - *path = path->AppendASCII("test"); - *path = path->AppendASCII("data"); - return true; - } - - void TestUnzipFile(const base::FilePath::StringType& filename, - bool expect_hidden_files) { - base::FilePath test_dir; - ASSERT_TRUE(GetTestDataDirectory(&test_dir)); - TestUnzipFile(test_dir.Append(filename), expect_hidden_files); - } - - void TestUnzipFile(const base::FilePath& path, bool expect_hidden_files) { - ASSERT_TRUE(base::PathExists(path)) << "no file " << path.value(); - ASSERT_TRUE(zip::Unzip(path, test_dir_)); - - base::FileEnumerator files(test_dir_, true, - base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES); - base::FilePath next_path = files.Next(); - size_t count = 0; - while (!next_path.value().empty()) { - if (next_path.value().find(FILE_PATH_LITERAL(".svn")) == - base::FilePath::StringType::npos) { - EXPECT_EQ(zip_contents_.count(next_path), 1U) << - "Couldn't find " << next_path.value(); - count++; - } - next_path = files.Next(); - } - - size_t expected_count = 0; - for (std::set::iterator iter = zip_contents_.begin(); - iter != zip_contents_.end(); ++iter) { - if (expect_hidden_files || iter->BaseName().value()[0] != '.') - ++expected_count; - } - - EXPECT_EQ(expected_count, count); - } - - // This function does the following: - // 1) Creates a test.txt file with the given last modification timestamp - // 2) Zips test.txt and extracts it back into a different location. - // 3) Confirms that test.txt in the output directory has the specified - // last modification timestamp if it is valid (|valid_year| is true). - // If the timestamp is not supported by the zip format, the last - // modification defaults to the current time. - void TestTimeStamp(const char* date_time, ValidYearType valid_year) { - SCOPED_TRACE(std::string("TestTimeStamp(") + date_time + ")"); - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - - base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); - base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input"); - base::FilePath out_dir = temp_dir.GetPath().AppendASCII("output"); - - base::FilePath src_file = src_dir.AppendASCII("test.txt"); - base::FilePath out_file = out_dir.AppendASCII("test.txt"); - - EXPECT_TRUE(base::CreateDirectory(src_dir)); - EXPECT_TRUE(base::CreateDirectory(out_dir)); - - base::Time test_mtime; - ASSERT_TRUE(base::Time::FromString(date_time, &test_mtime)); - - // Adjusting the current timestamp to the resolution that the zip file - // supports, which is 2 seconds. Note that between this call to Time::Now() - // and zip::Zip() the clock can advance a bit, hence the use of EXPECT_GE. - base::Time::Exploded now_parts; - base::Time::Now().LocalExplode(&now_parts); - now_parts.second = now_parts.second & ~1; - now_parts.millisecond = 0; - base::Time now_time; - EXPECT_TRUE(base::Time::FromLocalExploded(now_parts, &now_time)); - - EXPECT_EQ(1, base::WriteFile(src_file, "1", 1)); - EXPECT_TRUE(base::TouchFile(src_file, base::Time::Now(), test_mtime)); - - EXPECT_TRUE(zip::Zip(src_dir, zip_file, true)); - ASSERT_TRUE(zip::Unzip(zip_file, out_dir)); - - base::File::Info file_info; - EXPECT_TRUE(base::GetFileInfo(out_file, &file_info)); - EXPECT_EQ(file_info.size, 1); - - if (valid_year == VALID_YEAR) { - EXPECT_EQ(file_info.last_modified, test_mtime); - } else { - // Invalid date means the modification time will default to 'now'. - EXPECT_GE(file_info.last_modified, now_time); - } - } - - // The path to temporary directory used to contain the test operations. - base::FilePath test_dir_; - - base::ScopedTempDir temp_dir_; - - // Hard-coded contents of a known zip file. - std::set zip_contents_; - - // Hard-coded list of relative paths for a zip file created with ZipFiles. - std::vector zip_file_list_; -}; - -TEST_F(ZipTest, Unzip) { - TestUnzipFile(FILE_PATH_LITERAL("test.zip"), true); -} - -TEST_F(ZipTest, UnzipUncompressed) { - TestUnzipFile(FILE_PATH_LITERAL("test_nocompress.zip"), true); -} - -TEST_F(ZipTest, UnzipEvil) { - base::FilePath path; - ASSERT_TRUE(GetTestDataDirectory(&path)); - path = path.AppendASCII("evil.zip"); - // Unzip the zip file into a sub directory of test_dir_ so evil.zip - // won't create a persistent file outside test_dir_ in case of a - // failure. - base::FilePath output_dir = test_dir_.AppendASCII("out"); - ASSERT_FALSE(zip::Unzip(path, output_dir)); - base::FilePath evil_file = output_dir; - evil_file = evil_file.AppendASCII( - "../levilevilevilevilevilevilevilevilevilevilevilevil"); - ASSERT_FALSE(base::PathExists(evil_file)); -} - -TEST_F(ZipTest, UnzipEvil2) { - base::FilePath path; - ASSERT_TRUE(GetTestDataDirectory(&path)); - // The zip file contains an evil file with invalid UTF-8 in its file - // name. - path = path.AppendASCII("evil_via_invalid_utf8.zip"); - // See the comment at UnzipEvil() for why we do this. - base::FilePath output_dir = test_dir_.AppendASCII("out"); - // This should fail as it contains an evil file. - ASSERT_FALSE(zip::Unzip(path, output_dir)); - base::FilePath evil_file = output_dir; - evil_file = evil_file.AppendASCII("../evil.txt"); - ASSERT_FALSE(base::PathExists(evil_file)); -} - -TEST_F(ZipTest, Zip) { - base::FilePath src_dir; - ASSERT_TRUE(GetTestDataDirectory(&src_dir)); - src_dir = src_dir.AppendASCII("test"); - - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); - - EXPECT_TRUE(zip::Zip(src_dir, zip_file, true)); - TestUnzipFile(zip_file, true); -} - -TEST_F(ZipTest, ZipIgnoreHidden) { - base::FilePath src_dir; - ASSERT_TRUE(GetTestDataDirectory(&src_dir)); - src_dir = src_dir.AppendASCII("test"); - - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); - - EXPECT_TRUE(zip::Zip(src_dir, zip_file, false)); - TestUnzipFile(zip_file, false); -} - -TEST_F(ZipTest, ZipNonASCIIDir) { - base::FilePath src_dir; - ASSERT_TRUE(GetTestDataDirectory(&src_dir)); - src_dir = src_dir.AppendASCII("test"); - - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - // Append 'Тест' (in cyrillic). - base::FilePath src_dir_russian = temp_dir.GetPath().Append( - base::FilePath::FromUTF8Unsafe("\xD0\xA2\xD0\xB5\xD1\x81\xD1\x82")); - base::CopyDirectory(src_dir, src_dir_russian, true); - base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out_russian.zip"); - - EXPECT_TRUE(zip::Zip(src_dir_russian, zip_file, true)); - TestUnzipFile(zip_file, true); -} - -TEST_F(ZipTest, ZipTimeStamp) { - // The dates tested are arbitrary, with some constraints. The zip format can - // only store years from 1980 to 2107 and an even number of seconds, due to it - // using the ms dos date format. - - // Valid arbitrary date. - TestTimeStamp("23 Oct 1997 23:22:20", VALID_YEAR); - - // Date before 1980, zip format limitation, must default to unix epoch. - TestTimeStamp("29 Dec 1979 21:00:10", INVALID_YEAR); - - // Despite the minizip headers telling the maximum year should be 2044, it - // can actually go up to 2107. Beyond that, the dos date format cannot store - // the year (2107-1980=127). To test that limit, the input file needs to be - // touched, but the code that modifies the file access and modification times - // relies on time_t which is defined as long, therefore being in many - // platforms just a 4-byte integer, like 32-bit Mac OSX or linux. As such, it - // suffers from the year-2038 bug. Therefore 2038 is the highest we can test - // in all platforms reliably. - TestTimeStamp("02 Jan 2038 23:59:58", VALID_YEAR); -} - -#if defined(OS_POSIX) -TEST_F(ZipTest, ZipFiles) { - base::FilePath src_dir; - ASSERT_TRUE(GetTestDataDirectory(&src_dir)); - src_dir = src_dir.AppendASCII("test"); - - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - base::FilePath zip_name = temp_dir.GetPath().AppendASCII("out.zip"); - - base::File zip_file(zip_name, - base::File::FLAG_CREATE | base::File::FLAG_WRITE); - ASSERT_TRUE(zip_file.IsValid()); - EXPECT_TRUE(zip::ZipFiles(src_dir, zip_file_list_, - zip_file.GetPlatformFile())); - zip_file.Close(); - - zip::ZipReader reader; - EXPECT_TRUE(reader.Open(zip_name)); - EXPECT_EQ(zip_file_list_.size(), static_cast(reader.num_entries())); - for (size_t i = 0; i < zip_file_list_.size(); ++i) { - EXPECT_TRUE(reader.LocateAndOpenEntry(zip_file_list_[i])); - // Check the path in the entry just in case. - const zip::ZipReader::EntryInfo* entry_info = reader.current_entry_info(); - EXPECT_EQ(entry_info->file_path(), zip_file_list_[i]); - } -} -#endif // defined(OS_POSIX) - -TEST_F(ZipTest, UnzipFilesWithIncorrectSize) { - base::FilePath test_data_folder; - ASSERT_TRUE(GetTestDataDirectory(&test_data_folder)); - - // test_mismatch_size.zip contains files with names from 0.txt to 7.txt with - // sizes from 0 to 7 bytes respectively, but the metadata in the zip file says - // the uncompressed size is 3 bytes. The ZipReader and minizip code needs to - // be clever enough to get all the data out. - base::FilePath test_zip_file = - test_data_folder.AppendASCII("test_mismatch_size.zip"); - - base::ScopedTempDir scoped_temp_dir; - ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir()); - const base::FilePath& temp_dir = scoped_temp_dir.GetPath(); - - ASSERT_TRUE(zip::Unzip(test_zip_file, temp_dir)); - EXPECT_TRUE(base::DirectoryExists(temp_dir.AppendASCII("d"))); - - for (int i = 0; i < 8; i++) { - SCOPED_TRACE(base::StringPrintf("Processing %d.txt", i)); - base::FilePath file_path = temp_dir.AppendASCII( - base::StringPrintf("%d.txt", i)); - int64_t file_size = -1; - EXPECT_TRUE(base::GetFileSize(file_path, &file_size)); - EXPECT_EQ(static_cast(i), file_size); - } -} - -} // namespace diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/inffast.h b/shared/sentry/external/crashpad/third_party/zlib/zlib/inffast.h deleted file mode 100644 index e5c1aa4ca..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/simd_stub.c b/shared/sentry/external/crashpad/third_party/zlib/zlib/simd_stub.c deleted file mode 100644 index c6d460514..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/simd_stub.c +++ /dev/null @@ -1,35 +0,0 @@ -/* simd_stub.c -- stub implementations -* Copyright (C) 2014 Intel Corporation -* For conditions of distribution and use, see copyright notice in zlib.h -*/ -#include - -#include "deflate.h" -#include "x86.h" - -int ZLIB_INTERNAL x86_cpu_enable_simd = 0; - -void ZLIB_INTERNAL crc_fold_init(deflate_state *const s) { - assert(0); -} - -void ZLIB_INTERNAL crc_fold_copy(deflate_state *const s, - unsigned char *dst, - const unsigned char *src, - long len) { - assert(0); -} - -unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) { - assert(0); - return 0; -} - -void ZLIB_INTERNAL fill_window_sse(deflate_state *s) -{ - assert(0); -} - -void x86_check_features(void) -{ -} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/x86.c b/shared/sentry/external/crashpad/third_party/zlib/zlib/x86.c deleted file mode 100644 index e56fe8b85..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/x86.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * x86 feature check - * - * Copyright (C) 2013 Intel Corporation. All rights reserved. - * Author: - * Jim Kukunas - * - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "x86.h" -#include "zutil.h" - -int ZLIB_INTERNAL x86_cpu_enable_simd = 0; - -#ifndef _MSC_VER -#include - -pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT; -static void _x86_check_features(void); - -void x86_check_features(void) -{ - pthread_once(&cpu_check_inited_once, _x86_check_features); -} - -static void _x86_check_features(void) -{ - int x86_cpu_has_sse2; - int x86_cpu_has_sse42; - int x86_cpu_has_pclmulqdq; - unsigned eax, ebx, ecx, edx; - - eax = 1; -#ifdef __i386__ - __asm__ __volatile__ ( - "xchg %%ebx, %1\n\t" - "cpuid\n\t" - "xchg %1, %%ebx\n\t" - : "+a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx) - ); -#else - __asm__ __volatile__ ( - "cpuid\n\t" - : "+a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - ); -#endif /* (__i386__) */ - - x86_cpu_has_sse2 = edx & 0x4000000; - x86_cpu_has_sse42 = ecx & 0x100000; - x86_cpu_has_pclmulqdq = ecx & 0x2; - - x86_cpu_enable_simd = x86_cpu_has_sse2 && - x86_cpu_has_sse42 && - x86_cpu_has_pclmulqdq; -} -#else -#include -#include - -static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, - PVOID param, - PVOID *context); -static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT; - -void x86_check_features(void) -{ - InitOnceExecuteOnce(&cpu_check_inited_once, _x86_check_features, - NULL, NULL); -} - -static BOOL CALLBACK _x86_check_features(PINIT_ONCE once, - PVOID param, - PVOID *context) -{ - int x86_cpu_has_sse2; - int x86_cpu_has_sse42; - int x86_cpu_has_pclmulqdq; - int regs[4]; - - __cpuid(regs, 1); - - x86_cpu_has_sse2 = regs[3] & 0x4000000; - x86_cpu_has_sse42= regs[2] & 0x100000; - x86_cpu_has_pclmulqdq = regs[2] & 0x2; - - x86_cpu_enable_simd = x86_cpu_has_sse2 && - x86_cpu_has_sse42 && - x86_cpu_has_pclmulqdq; - return TRUE; -} -#endif /* _MSC_VER */ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/x86.h b/shared/sentry/external/crashpad/third_party/zlib/zlib/x86.h deleted file mode 100644 index ebcf10ab0..000000000 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/x86.h +++ /dev/null @@ -1,15 +0,0 @@ -/* x86.h -- check for x86 CPU features -* Copyright (C) 2013 Intel Corporation Jim Kukunas -* For conditions of distribution and use, see copyright notice in zlib.h -*/ - -#ifndef X86_H -#define X86_H - -#include "zlib.h" - -extern int x86_cpu_enable_simd; - -void x86_check_features(void); - -#endif /* X86_H */ diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_fuchsia.S b/shared/sentry/external/crashpad/util/misc/capture_context_fuchsia.S deleted file mode 100644 index 97954f021..000000000 --- a/shared/sentry/external/crashpad/util/misc/capture_context_fuchsia.S +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2018 The Crashpad Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// namespace crashpad { -// void CaptureContext(ucontext_t* context); -// } // namespace crashpad - -#define CAPTURECONTEXT_SYMBOL _ZN8crashpad14CaptureContextEP8ucontext - - .text - .globl CAPTURECONTEXT_SYMBOL -#if defined(__x86_64__) - .balign 16, 0x90 -#elif defined(__aarch64__) - .balign 4, 0x0 -#endif - -CAPTURECONTEXT_SYMBOL: - -#if defined(__x86_64__) - - .cfi_startproc - - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset %rbp, -16 - movq %rsp, %rbp - .cfi_def_cfa_register %rbp - - // Note that 16-byte stack alignment is not maintained because this function - // does not call out to any other. - - // pushfq first, because some instructions (but probably none used here) - // affect %rflags. %rflags will be in -8(%rbp). - pushfq - - // General-purpose registers whose values haven’t changed can be captured - // directly. - movq %r8, 0x28(%rdi) // context->uc_mcontext.r8 - movq %r9, 0x30(%rdi) // context->uc_mcontext.r9 - movq %r10, 0x38(%rdi) // context->uc_mcontext.r10 - movq %r11, 0x40(%rdi) // context->uc_mcontext.r11 - movq %r12, 0x48(%rdi) // context->uc_mcontext.r12 - movq %r13, 0x50(%rdi) // context->uc_mcontext.r13 - movq %r14, 0x58(%rdi) // context->uc_mcontext.r14 - movq %r15, 0x60(%rdi) // context->uc_mcontext.r15 - - // Because of the calling convention, there’s no way to recover the value of - // the caller’s %rdi as it existed prior to calling this function. This - // function captures a snapshot of the register state at its return, which - // involves %rdi containing a pointer to its first argument. Callers that - // require the value of %rdi prior to calling this function should obtain it - // separately. For example: - // uint64_t rdi; - // asm("movq %%rdi, %0" : "=m"(rdi)); - movq %rdi, 0x68(%rdi) // context->uc_mcontext.rdi - - movq %rsi, 0x70(%rdi) // context->uc_mcontext.rsi - - // Use %r8 as a scratch register now that it has been saved. - // The original %rbp was saved on the stack in this function’s prologue. - movq (%rbp), %r8 - movq %r8, 0x78(%rdi) // context->uc_mcontext.rbp - - // Save the remaining general-purpose registers. - movq %rbx, 0x80(%rdi) // context->uc_mcontext.rbx - movq %rdx, 0x88(%rdi) // context->uc_mcontext.rdx - movq %rax, 0x90(%rdi) // context->uc_mcontext.rax - movq %rcx, 0x98(%rdi) // context->uc_mcontext.rcx - - // %rsp was saved in %rbp in this function’s prologue, but the caller’s %rsp - // is 16 more than this value: 8 for the original %rbp saved on the stack in - // this function’s prologue, and 8 for the return address saved on the stack - // by the call instruction that reached this function. - leaq 16(%rbp), %r8 - movq %r8, 0xa0(%rdi) // context->uc_mcontext.rsp - - // The return address saved on the stack used by the call of this function is - // likely more useful than the current RIP here. - movq 8(%rbp), %r8 - movq %r8, 0xa8(%rdi) // context->uc_mcontext.rip - - // The original %rflags was saved on the stack above. - movq -8(%rbp), %r8 - movq %r8, 0xb0(%rdi) // context->uc_mcontext.eflags - - // Save the segment registers - movw %cs, 0xb8(%rdi) // context->uc_mcontext.cs - movw %gs, 0xba(%rdi) // context->uc_mcontext.gs - movw %fs, 0xbc(%rdi) // context->uc_mcontext.fs - - xorw %ax, %ax - movw %ax, 0xbe(%rdi) // context->uc_mcontext.padding - - // Zero out the remainder of the unused pseudo-registers - xorq %r8, %r8 - movq %r8, 0xc0(%rdi) // context->uc_mcontext.err - movq %r8, 0xc8(%rdi) // context->uc_mcontext.trapno - movq %r8, 0xd0(%rdi) // context->uc_mcontext.oldmask - movq %r8, 0xd8(%rdi) // context->uc_mcontext.cr2 - - // Clean up by restoring clobbered registers, even those considered volatile - // by the ABI, so that the captured context represents the state at this - // function’s exit. - movq 0x90(%rdi), %rax - movq 0x28(%rdi), %r8 - - // TODO(https://crashpad.chromium.org/bug/300): save floating-point registers. - - popfq - - popq %rbp - - ret - - .cfi_endproc - -#elif defined(__aarch64__) - - // Zero out fault_address, which is unused. - str x31, [x0, #0xb0] // context->uc_mcontext.fault_address - - // Save general purpose registers in context->uc_mcontext.regs[i]. - // The original x0 can't be recovered. - stp x0, x1, [x0, #0xb8] - stp x2, x3, [x0, #0xc8] - stp x4, x5, [x0, #0xd8] - stp x6, x7, [x0, #0xe8] - stp x8, x9, [x0, #0xf8] - stp x10, x11, [x0, #0x108] - stp x12, x13, [x0, #0x118] - stp x14, x15, [x0, #0x128] - stp x16, x17, [x0, #0x138] - stp x18, x19, [x0, #0x148] - stp x20, x21, [x0, #0x158] - stp x22, x23, [x0, #0x168] - stp x24, x25, [x0, #0x178] - stp x26, x27, [x0, #0x188] - stp x28, x29, [x0, #0x198] - - // The original LR can't be recovered. - str LR, [x0, #0x1a8] - - // Use x1 as a scratch register. - mov x1, SP - str x1, [x0, #0x1b0] // context->uc_mcontext.sp - - // The link register holds the return address for this function. - str LR, [x0, #0x1b8] // context->uc_mcontext.pc - - // pstate should hold SPSR but NZCV are the only bits we know about. - mrs x1, NZCV - str x1, [x0, #0x1c0] // context->uc_mcontext.pstate - - // Restore x1 from the saved context. - ldr x1, [x0, #0xc0] - - // TODO(https://crashpad.chromium.org/bug/300): save floating-point registers. - - ret - -#endif // __x86_64__ diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_test_util_fuchsia.cc b/shared/sentry/external/crashpad/util/misc/capture_context_test_util_fuchsia.cc deleted file mode 100644 index ef38afeb7..000000000 --- a/shared/sentry/external/crashpad/util/misc/capture_context_test_util_fuchsia.cc +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2018 The Crashpad Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "util/misc/capture_context_test_util.h" - -#include "gtest/gtest.h" -#include "util/misc/from_pointer_cast.h" - -namespace crashpad { -namespace test { - -#if defined(ARCH_CPU_X86_64) -static_assert(offsetof(NativeCPUContext, uc_mcontext) == 0x28, - "unexpected mcontext offset"); -static_assert(offsetof(NativeCPUContext, uc_mcontext.gregs[REG_RSP]) == 0xa0, - "unexpected rsp offset"); -static_assert(offsetof(NativeCPUContext, uc_mcontext.gregs[REG_RIP]) == 0xa8, - "unexpected rip offset"); -#endif // ARCH_CPU_X86_64 - -void SanityCheckContext(const NativeCPUContext& context) { -#if defined(ARCH_CPU_X86_64) - EXPECT_EQ(context.uc_mcontext.gregs[REG_RDI], - FromPointerCast(&context)); -#elif defined(ARCH_CPU_ARM64) - EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast(&context)); -#endif -} - -uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) { -#if defined(ARCH_CPU_X86_64) - return context.uc_mcontext.gregs[REG_RIP]; -#elif defined(ARCH_CPU_ARM64) - return context.uc_mcontext.pc; -#endif -} - -uintptr_t StackPointerFromContext(const NativeCPUContext& context) { -#if defined(ARCH_CPU_X86_64) - return context.uc_mcontext.gregs[REG_RSP]; -#elif defined(ARCH_CPU_ARM64) - return context.uc_mcontext.sp; -#endif -} - -} // namespace test -} // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/thread/thread_log_messages.cc b/shared/sentry/external/crashpad/util/thread/thread_log_messages.cc deleted file mode 100644 index 9674d3cce..000000000 --- a/shared/sentry/external/crashpad/util/thread/thread_log_messages.cc +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2015 The Crashpad Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "util/thread/thread_log_messages.h" - -#include - -#include "base/check_op.h" -#include "base/logging.h" -#include "base/threading/thread_local_storage.h" - -namespace crashpad { - -namespace { - -// While an object of this class exists, it will be set as the log message -// handler. A thread may register its thread-specific log message list to -// receive messages produced just on that thread. -// -// Only one object of this class may exist in the program at a time as created -// by GetInstance(). There must not be any log message handler in effect when it -// is created, and nothing else can be set as a log message handler while an -// object of this class exists. -class ThreadLogMessagesMaster { - public: - ThreadLogMessagesMaster(const ThreadLogMessagesMaster&) = delete; - ThreadLogMessagesMaster& operator=(const ThreadLogMessagesMaster&) = delete; - - void SetThreadMessageList(std::vector* message_list) { - DCHECK_EQ(logging::GetLogMessageHandler(), &LogMessageHandler); - DCHECK_NE(tls_.Get() != nullptr, message_list != nullptr); - tls_.Set(message_list); - } - - static ThreadLogMessagesMaster* GetInstance() { - static auto master = new ThreadLogMessagesMaster(); - return master; - } - - private: - ThreadLogMessagesMaster() { - DCHECK(!logging::GetLogMessageHandler()); - logging::SetLogMessageHandler(LogMessageHandler); - } - - ~ThreadLogMessagesMaster() = delete; - - static bool LogMessageHandler(logging::LogSeverity severity, - const char* file_path, - int line, - size_t message_start, - const std::string& string) { - std::vector* log_messages = - reinterpret_cast*>(GetInstance()->tls_.Get()); - if (log_messages) { - log_messages->push_back(string); - } - - // Don’t consume the message. Allow it to be logged as if nothing was set as - // the log message handler. - return false; - } - - base::ThreadLocalStorage::Slot tls_; -}; - -} // namespace - -ThreadLogMessages::ThreadLogMessages() : log_messages_() { - ThreadLogMessagesMaster::GetInstance()->SetThreadMessageList(&log_messages_); -} - -ThreadLogMessages::~ThreadLogMessages() { - ThreadLogMessagesMaster::GetInstance()->SetThreadMessageList(nullptr); -} - -} // namespace crashpad diff --git a/shared/sentry/sentry-config.cmake.in b/shared/sentry/sentry-config.cmake.in deleted file mode 100644 index 89ea34511..000000000 --- a/shared/sentry/sentry-config.cmake.in +++ /dev/null @@ -1,20 +0,0 @@ -@PACKAGE_INIT@ - -set(SENTRY_BACKEND @SENTRY_BACKEND@) -set(SENTRY_TRANSPORT @SENTRY_TRANSPORT@) - -if(SENTRY_BACKEND STREQUAL "crashpad") - if(@SENTRY_CRASHPAD_SYSTEM@) - find_package(crashpad REQUIRED) - else() - include("${CMAKE_CURRENT_LIST_DIR}/sentry_crashpad-targets.cmake") - endif() -endif() - -include("${CMAKE_CURRENT_LIST_DIR}/sentry-targets.cmake") - -if(SENTRY_TRANSPORT STREQUAL "curl" AND NOT @BUILD_SHARED_LIBS@) - find_package(CURL REQUIRED) - set_property(TARGET sentry::sentry APPEND - PROPERTY INTERFACE_LINK_LIBRARIES ${CURL_LIBRARIES}) -endif() diff --git a/shared/sentry/sentry.pro b/shared/sentry/sentry.pro new file mode 100644 index 000000000..a0b33807f --- /dev/null +++ b/shared/sentry/sentry.pro @@ -0,0 +1,36 @@ +TEMPLATE = aux + +PRE_TARGETDEPS += $$OUT_PWD/src/Makefile +sentry_makefile.target = $$OUT_PWD/src/Makefile +sentry_makefile.commands = \ + cmake -B $$OUT_PWD/src \ + -S $$PWD/src \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DBUILD_SHARED_LIBS=ON \ + -DSENTRY_INTEGRATION_QT=ON \ + -DSENTRY_TRANSPORT=curl \ + -DSENTRY_BACKEND=breakpad \ + -DSENTRY_BREAKPAD_SYSTEM=OFF \ + -DSENTRY_SDK_NAME=sentry.native +QMAKE_EXTRA_TARGETS += sentry_makefile + +PRE_TARGETDEPS += $$OUT_PWD/src/libsentry.so +sentry_build.target = $$OUT_PWD/src/libsentry.so +sentry_build.depends = sentry_makefile +sentry_build.commands = \ + cmake --build $$OUT_PWD/src --parallel +QMAKE_EXTRA_TARGETS += sentry_build + +PRE_TARGETDEPS += $$OUT_PWD/lib/libsentry.so +sentry_install.target = $$OUT_PWD/lib/libsentry.so +sentry_install.depends = sentry_build +sentry_install.commands = \ + cmake --install $$OUT_PWD/src --prefix $$OUT_PWD --config RelWithDebInfo +QMAKE_EXTRA_TARGETS += sentry_install + +QMAKE_CLEAN += -r $$OUT_PWD/src/ + +target.files = $$OUT_PWD/lib/libsentry.so +target.depends = sentry_install +target.path = /opt/lib/ +INSTALLS += target diff --git a/shared/sentry/src/.vscode/extensions.json b/shared/sentry/src/.vscode/extensions.json new file mode 100644 index 000000000..3b2ac6a0f --- /dev/null +++ b/shared/sentry/src/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "ms-vscode.cpptools", + "ms-vscode.cmake-tools", + "twxs.cmake" + ] +} diff --git a/shared/sentry/src/.vscode/settings.json b/shared/sentry/src/.vscode/settings.json new file mode 100644 index 000000000..e4f9a033c --- /dev/null +++ b/shared/sentry/src/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "editor.formatOnPaste": true, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + + // C++ Extension + "C_Cpp.autoAddFileAssociations": false +} diff --git a/shared/sentry/CHANGELOG.md b/shared/sentry/src/CHANGELOG.md similarity index 75% rename from shared/sentry/CHANGELOG.md rename to shared/sentry/src/CHANGELOG.md index 18b824194..dcaaf1ebf 100644 --- a/shared/sentry/CHANGELOG.md +++ b/shared/sentry/src/CHANGELOG.md @@ -1,5 +1,179 @@ # Changelog +## 0.7.0 + +**Breaking changes**: + +- Make `crashpad` the default backend for Linux. ([#927](https://github.com/getsentry/sentry-native/pull/927)) +- Remove build option `SENTRY_CRASHPAD_SYSTEM`. ([#928](https://github.com/getsentry/sentry-native/pull/928)) + +**Fixes**: + +- Maintain `crashpad` client instance during Native SDK lifecycle. ([#910](https://github.com/getsentry/sentry-native/pull/910)) +- Specify correct dependencies for CMake client projects using a system-provided breakpad. ([#926](https://github.com/getsentry/sentry-native/pull/926)) +- Correct the Windows header include used by `sentry.h`, which fixes the build of [Swift bindings](https://github.com/thebrowsercompany/swift-sentry). ([#935](https://github.com/getsentry/sentry-native/pull/935)) + +**Internal**: + +- Updated `crashpad` to 2023-11-24. ([#912](https://github.com/getsentry/sentry-native/pull/912), [crashpad#91](https://github.com/getsentry/crashpad/pull/91)) +- Fixing `crashpad` build for Windows on ARM64. ([#919](https://github.com/getsentry/sentry-native/pull/919), [crashpad#90](https://github.com/getsentry/crashpad/pull/90), [crashpad#92](https://github.com/getsentry/crashpad/pull/92), [crashpad#93](https://github.com/getsentry/crashpad/pull/93), [crashpad#94](https://github.com/getsentry/crashpad/pull/94)) +- Remove options memory leak during consent setting. ([#922](https://github.com/getsentry/sentry-native/pull/922)) + +**Thank you**: + +Features, fixes and improvements in this release have been contributed by: + +- [@compnerd](https://github.com/compnerd) +- [@stima](https://github.com/stima) + +## 0.6.7 + +**Fixes**: + +- Disable sigaltstack on Android. ([#901](https://github.com/getsentry/sentry-native/pull/901)) +- Prevent stuck crashpad-client on Windows. ([#902](https://github.com/getsentry/sentry-native/pull/902), [crashpad#89](https://github.com/getsentry/crashpad/pull/89)) + +## 0.6.6 + +**Fixes**: + +- Use a more up-to-date version of `mini_chromium` as a `crashpad` dependency, which fixes a build error on some systems. ([#891](https://github.com/getsentry/sentry-native/pull/891), [crashpad#88](https://github.com/getsentry/crashpad/pull/88)) + +**Internal**: + +- Updated `libunwindstack` to 2023-09-13. ([#884](https://github.com/getsentry/sentry-native/pull/884), [libunwindstack-ndk#8](https://github.com/getsentry/libunwindstack-ndk/pull/8)) +- Updated `crashpad` to 2023-09-28. ([#891](https://github.com/getsentry/sentry-native/pull/891), [crashpad#88](https://github.com/getsentry/crashpad/pull/88)) +- Updated `breakpad` to 2023-10-02. ([#892](https://github.com/getsentry/sentry-native/pull/892), [breakpad#38](https://github.com/getsentry/breakpad/pull/38)) + +**Thank you**: + +Features, fixes and improvements in this release have been contributed by: + +- [@sapphonie](https://github.com/sapphonie) + +## 0.6.5 + +**Fixes**: + +- Remove deadlock pattern in dynamic sdk-name assignment ([#858](https://github.com/getsentry/sentry-native/pull/858)) + +## 0.6.4 + +**Fixes**: + +- Crash events are initialized with level `FATAL` ([#852](https://github.com/getsentry/sentry-native/pull/852)) +- Fix MSVC compiler error with on non-Unicode systems ([#846](https://github.com/getsentry/sentry-native/pull/846), [crashpad#85](https://github.com/getsentry/crashpad/pull/85)) + +**Features**: + +- crashpad_handler: log `body` if minidump endpoint response is not `OK` ([#851](https://github.com/getsentry/sentry-native/pull/851), [crashpad#87](https://github.com/getsentry/crashpad/pull/87)) + +**Thank you**: + +Features, fixes and improvements in this release have been contributed by: + +- [@xyz1001](https://github.com/xyz1001) + +## 0.6.3 + +**Features**: + +- Disable PC adjustment in the backend for libunwindstack ([#839](https://github.com/getsentry/sentry-native/pull/839)) +- Crashpad backend allows inspection and enrichment of the crash event in the on_crash/before_send hooks ([#843](https://github.com/getsentry/sentry-native/pull/843)) +- Add http-proxy support to the `crashpad_handler` ([#847](https://github.com/getsentry/sentry-native/pull/847), [crashpad#86](https://github.com/getsentry/crashpad/pull/86)) + +**Internal**: + +- Updated Breakpad backend to 2023-05-03. ([#836](https://github.com/getsentry/sentry-native/pull/836), [breakpad#35](https://github.com/getsentry/breakpad/pull/35)) +- Updated Crashpad backend to 2023-05-03. ([#837](https://github.com/getsentry/sentry-native/pull/837), [crashpad#82](https://github.com/getsentry/crashpad/pull/82)) + +## 0.6.2 + +**Features**: + +- Extend API with ptr/len-string interfaces. ([#827](https://github.com/getsentry/sentry-native/pull/827)) +- Allow setting sdk_name at runtime ([#834](https://github.com/getsentry/sentry-native/pull/834)) + +## 0.6.1 + +**Fixes**: + +- Remove OpenSSL as direct dependency for the crashpad backend on Linux. ([#812](https://github.com/getsentry/sentry-native/pull/812), [crashpad#81](https://github.com/getsentry/crashpad/pull/81)) +- Check `libcurl` for feature `AsynchDNS` at compile- and runtime. ([#813](https://github.com/getsentry/sentry-native/pull/813)) +- Allow setting `CRASHPAD_WER_ENABLED` when using system crashpad. ([#816](https://github.com/getsentry/sentry-native/pull/816)) + +**Docs**: + +- Add badges for conan, nix and vcpkg package-repos to README. ([#795](https://github.com/getsentry/sentry-native/pull/795)) + +**Thank you**: + +Features, fixes and improvements in this release have been contributed by: + +- [@Cyriuz](https://github.com/Cyriuz) +- [@MartinDelille](https://github.com/MartinDelille) + +## 0.6.0 + +**Breaking changes**: + +- When built as a shared library for Android or Linux, the Native SDK limits the export of symbols to the `sentry_`-prefix. The option `SENTRY_EXPORT_SYMBOLS` is no longer available and the linker settings are constrained to the Native SDK and no longer `PUBLIC` to parent projects. ([#363](https://github.com/getsentry/sentry-native/pull/363)) + +**Features**: + +- A session may be ended with a different status code. ([#801](https://github.com/getsentry/sentry-native/pull/801)) + +**Fixes**: + +- Switch Crashpad transport on Linux to use libcurl ([#803](https://github.com/getsentry/sentry-native/pull/803), [crashpad#75](https://github.com/getsentry/crashpad/pull/75), [crashpad#79](https://github.com/getsentry/crashpad/pull/79)) +- Avoid accidentally mutating CONTEXT when client-side stack walking in Crashpad ([#803](https://github.com/getsentry/sentry-native/pull/803), [crashpad#77](https://github.com/getsentry/crashpad/pull/77)) +- Fix various mingw compilation issues ([#794](https://github.com/getsentry/sentry-native/pull/794), [crashpad#78](https://github.com/getsentry/crashpad/pull/78)) + +**Internal**: + +- Updated Crashpad backend to 2023-02-07. ([#803](https://github.com/getsentry/sentry-native/pull/803), [crashpad#80](https://github.com/getsentry/crashpad/pull/80)) +- CI: Updated GitHub Actions to test on LLVM-mingw. ([#797](https://github.com/getsentry/sentry-native/pull/797)) +- Updated Breakpad backend to 2023-02-08. ([#805](https://github.com/getsentry/sentry-native/pull/805), [breakpad#34](https://github.com/getsentry/breakpad/pull/34)) +- Updated libunwindstack to 2023-02-09. ([#807](https://github.com/getsentry/sentry-native/pull/807), [libunwindstack-ndk#7](https://github.com/getsentry/libunwindstack-ndk/pull/7)) + +**Thank you**: + +Features, fixes and improvements in this release have been contributed by: + +- [@BogdanLivadariu](https://github.com/BogdanLivadariu) +- [@ShawnCZek](https://github.com/ShawnCZek) +- [@past-due](https://github.com/past-due) + +## 0.5.4 + +**Fixes**: + +- Better error messages in `sentry_transport_curl`. ([#777](https://github.com/getsentry/sentry-native/pull/777)) +- Increased curl headers buffer size to 512 (in `sentry_transport_curl`). ([#784](https://github.com/getsentry/sentry-native/pull/784)) +- Fix sporadic crash on Windows due to race condition when initializing background-worker thread-id. ([#785](https://github.com/getsentry/sentry-native/pull/785)) +- Open the database file-lock on "UNIX" with `O_RDRW` ([#791](https://github.com/getsentry/sentry-native/pull/791)) + +**Internal**: + +- Updated Breakpad and Crashpad backends to 2022-12-12. ([#778](https://github.com/getsentry/sentry-native/pull/778)) + +**Thank you**: + +Features, fixes and improvements in this release have been contributed by: + +- [@cnicolaescu](https://github.com/cnicolaescu) + +## 0.5.3 + +**Fixes**: + +- Linux module-finder now also searches for code-id in ".note" ELF sections ([#775](https://github.com/getsentry/sentry-native/pull/775)) + +**Internal**: + +- CI: updated github actions to upgrade deprecated node runners. ([#767](https://github.com/getsentry/sentry-native/pull/767)) +- CI: upgraded Ubuntu to 20.04 for "old gcc" (v7) job due to deprecation. ([#768](https://github.com/getsentry/sentry-native/pull/768)) + ## 0.5.2 **Fixes**: @@ -9,7 +183,7 @@ **Internal**: - Updated Breakpad and Crashpad backends to 2022-10-17. ([#765](https://github.com/getsentry/sentry-native/pull/765)) - + **Thank you**: Features, fixes and improvements in this release have been contributed by: @@ -629,6 +803,7 @@ See [#220](https://github.com/getsentry/sentry-native/issues/220) for details. This function now takes a pointer to the new `sentry_transport_t` type. Migrating from the old API can be done by wrapping with `sentry_new_function_transport`, like this: + ```c sentry_options_set_transport( options, sentry_new_function_transport(send_envelope_func, &closure_data)); diff --git a/shared/sentry/src/CMakeLists.txt b/shared/sentry/src/CMakeLists.txt index 1a7ba5949..8e460cded 100644 --- a/shared/sentry/src/CMakeLists.txt +++ b/shared/sentry/src/CMakeLists.txt @@ -1,156 +1,607 @@ -sentry_target_sources_cwd(sentry - sentry_alloc.c - sentry_alloc.h - sentry_backend.c - sentry_backend.h - sentry_boot.h - sentry_core.c - sentry_core.h - sentry_database.c - sentry_database.h - sentry_envelope.c - sentry_envelope.h - sentry_info.c - sentry_json.c - sentry_json.h - sentry_logger.c - sentry_logger.h - sentry_options.c - sentry_options.h - sentry_os.c - sentry_os.h - sentry_path.h - sentry_random.c - sentry_random.h - sentry_ratelimiter.c - sentry_ratelimiter.h - sentry_scope.c - sentry_scope.h - sentry_session.c - sentry_session.h - sentry_slice.c - sentry_slice.h - sentry_string.c - sentry_string.h - sentry_symbolizer.h - sentry_sync.c - sentry_sync.h - sentry_transport.c - sentry_transport.h - sentry_utils.c - sentry_utils.h - sentry_uuid.c - sentry_uuid.h - sentry_value.c - sentry_value.h - sentry_tracing.c - sentry_tracing.h - path/sentry_path.c - transports/sentry_disk_transport.c - transports/sentry_disk_transport.h - transports/sentry_function_transport.c - unwinder/sentry_unwinder.c +if(WIN32) + cmake_minimum_required (VERSION 3.16.4) + + # enables support for CMAKE_MSVC_RUNTIME_LIBRARY + cmake_policy(SET CMP0091 NEW) +else() + # The Android tools ship with this ancient version, which we need to support. + cmake_minimum_required (VERSION 3.10) +endif() + +#read sentry-native version +file(READ "include/sentry.h" _SENTRY_HEADER_CONTENT) +string(REGEX MATCH "#define SENTRY_SDK_VERSION \"([0-9\.]+)\"" _SENTRY_VERSION_MATCH "${_SENTRY_HEADER_CONTENT}") +set(SENTRY_VERSION "${CMAKE_MATCH_1}") +unset(_SENTRY_HEADER_CONTENT) +unset(_SENTRY_VERSION_MATCH) + +project(Sentry-Native + LANGUAGES C CXX ASM + VERSION ${SENTRY_VERSION} ) -# generic platform / path / symbolizer -if(WIN32) - sentry_target_sources_cwd(sentry - sentry_windows_dbghelp.c - sentry_windows_dbghelp.h - path/sentry_path_windows.c - symbolizer/sentry_symbolizer_windows.c - ) +set(SENTRY_MAIN_PROJECT OFF) +if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + set(SENTRY_MAIN_PROJECT ON) +endif() + +if(NOT CMAKE_C_STANDARD) + set(CMAKE_C_STANDARD 11) +endif() + +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) +endif() + +include(GNUInstallDirs) +set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/sentry") + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(LINUX TRUE) +elseif(CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") + set(AIX TRUE) +endif() + +#setup sentry library type +if(SENTRY_MAIN_PROJECT AND NOT DEFINED BUILD_SHARED_LIBS) + set(BUILD_SHARED_LIBS ON) +endif() +option(SENTRY_BUILD_SHARED_LIBS "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)" ${BUILD_SHARED_LIBS}) +if(SENTRY_BUILD_SHARED_LIBS) + set(SENTRY_LIBRARY_TYPE SHARED) else() - sentry_target_sources_cwd(sentry - sentry_unix_pageallocator.c - sentry_unix_pageallocator.h - sentry_unix_spinlock.h - path/sentry_path_unix.c - symbolizer/sentry_symbolizer_unix.c - ) + set(SENTRY_LIBRARY_TYPE STATIC) +endif() + +option(SENTRY_PIC "Build sentry (and dependent) libraries as position independent libraries" ON) + +option(SENTRY_BUILD_TESTS "Build sentry-native tests" "${SENTRY_MAIN_PROJECT}") +option(SENTRY_BUILD_EXAMPLES "Build sentry-native example(s)" "${SENTRY_MAIN_PROJECT}") + +option(SENTRY_LINK_PTHREAD "Link platform threads library" ON) +if(SENTRY_LINK_PTHREAD) + find_package(Threads REQUIRED) +endif() + +if(MSVC) + option(SENTRY_BUILD_RUNTIMESTATIC "Build sentry-native with static runtime" OFF) + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8") +endif() + +if(LINUX) + option(SENTRY_BUILD_FORCE32 "Force a 32bit compile on a 64bit host" OFF) + if(SENTRY_BUILD_FORCE32) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -m32 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE") + set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) + endif() +endif() + +# CMAKE_POSITION_INDEPENDENT_CODE must be set BEFORE adding any libraries (including subprojects) +if(SENTRY_PIC) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +else() + set(CMAKE_POSITION_INDEPENDENT_CODE OFF) endif() -# module finder if(WIN32) - sentry_target_sources_cwd(sentry - modulefinder/sentry_modulefinder_windows.c - ) -elseif(APPLE) - sentry_target_sources_cwd(sentry - modulefinder/sentry_modulefinder_apple.c - ) -elseif(LINUX OR ANDROID) - sentry_target_sources_cwd(sentry - modulefinder/sentry_modulefinder_linux.c - ) -elseif(AIX) - sentry_target_sources_cwd(sentry - modulefinder/sentry_modulefinder_aix.c + set(SENTRY_DEFAULT_TRANSPORT "winhttp") +elseif((APPLE AND NOT IOS) OR LINUX OR AIX) + set(SENTRY_DEFAULT_TRANSPORT "curl") +else() + set(SENTRY_DEFAULT_TRANSPORT "none") +endif() + +set(SENTRY_TRANSPORT ${SENTRY_DEFAULT_TRANSPORT} CACHE STRING + "The HTTP transport that sentry uses to submit events to the sentry server, can be either 'none', 'curl' or 'winhttp' on windows.") + +if(SENTRY_TRANSPORT STREQUAL "winhttp") + set(SENTRY_TRANSPORT_WINHTTP TRUE) +elseif(SENTRY_TRANSPORT STREQUAL "curl") + set(SENTRY_TRANSPORT_CURL TRUE) +elseif(SENTRY_TRANSPORT STREQUAL "none") + set(SENTRY_TRANSPORT_NONE TRUE) +else() + message(FATAL_ERROR "SENTRY_TRANSPORT must be one of 'none', 'curl' or 'winhttp'") +endif() + +if(SENTRY_TRANSPORT_WINHTTP AND NOT WIN32) + message(FATAL_ERROR "The winhttp transport is only supported on Windows.") +endif() + +if(SENTRY_BUILD_TESTS OR SENTRY_BUILD_EXAMPLES) + enable_testing() +endif() + +if("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}") + set(SENTRY_MAIN_PROJECT ON) +endif() + +option(SENTRY_ENABLE_INSTALL "Enable sentry installation" "${SENTRY_MAIN_PROJECT}") + +if(MSVC AND CMAKE_GENERATOR_TOOLSET MATCHES "_xp$") + message(WARNING "Crashpad is not supported for MSVC with XP toolset. Default backend was switched to 'breakpad'") + set(SENTRY_DEFAULT_BACKEND "breakpad") +elseif((APPLE AND NOT IOS) OR WIN32 OR LINUX) + set(SENTRY_DEFAULT_BACKEND "crashpad") +else() + set(SENTRY_DEFAULT_BACKEND "inproc") +endif() + +if(NOT DEFINED SENTRY_BACKEND) + set(SENTRY_BACKEND ${SENTRY_DEFAULT_BACKEND} CACHE STRING + "The sentry backend responsible for reporting crashes, can be either 'none', 'inproc', 'breakpad' or 'crashpad'.") +endif() + +if(SENTRY_BACKEND STREQUAL "crashpad") + set(SENTRY_BACKEND_CRASHPAD TRUE) +elseif(SENTRY_BACKEND STREQUAL "inproc") + set(SENTRY_BACKEND_INPROC TRUE) +elseif(SENTRY_BACKEND STREQUAL "breakpad") + set(SENTRY_BACKEND_BREAKPAD TRUE) +elseif(SENTRY_BACKEND STREQUAL "none") + set(SENTRY_BACKEND_NONE TRUE) +else() + message(FATAL_ERROR "SENTRY_BACKEND must be one of 'crashpad', 'inproc', 'breakpad' or 'none'") +endif() + +if(SENTRY_BACKEND_CRASHPAD AND ANDROID) + message(FATAL_ERROR "The Crashpad backend is not currently supported on Android") +endif() + +set(SENTRY_SDK_NAME "" CACHE STRING "The SDK name to report when sending events.") + +message(STATUS "SENTRY_TRANSPORT=${SENTRY_TRANSPORT}") +message(STATUS "SENTRY_BACKEND=${SENTRY_BACKEND}") +message(STATUS "SENTRY_LIBRARY_TYPE=${SENTRY_LIBRARY_TYPE}") +message(STATUS "SENTRY_SDK_NAME=${SENTRY_SDK_NAME}") + +if(ANDROID) + set(SENTRY_WITH_LIBUNWINDSTACK TRUE) +elseif(NOT WIN32) + set(SENTRY_WITH_LIBBACKTRACE TRUE) +endif() + +option(WITH_ASAN_OPTION "Build sentry-native with address sanitizer" OFF) +if(WITH_ASAN_OPTION) + add_compile_options(-g -fsanitize=address -fno-omit-frame-pointer) + link_libraries(-fsanitize=address) +endif() + +option(WITH_TSAN_OPTION "Build sentry-native with thread sanitizer" OFF) +if(WITH_TSAN_OPTION) + add_compile_options(-g -fsanitize=thread -fno-omit-frame-pointer) + link_libraries(-fsanitize=thread) +endif() + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "RelWithDebInfo") +endif() + +# use -O3 when doing `RelWithDebInfo` builds +if(NOT MSVC) + foreach(lang ASM C CXX) + string(REPLACE "-O2" "-O3" CMAKE_${lang}_FLAGS_RELWITHDEBINFO "${CMAKE_${lang}_FLAGS_RELWITHDEBINFO}") + endforeach() +endif() + +# https://gitlab.kitware.com/cmake/cmake/issues/20256 +if(APPLE) + find_program(DSYMUTIL_PROGRAM dsymutil) + if(DSYMUTIL_PROGRAM) + foreach(lang C CXX) + foreach(var LINK_EXECUTABLE CREATE_SHARED_LIBRARY) + set(CMAKE_${lang}_${var} "${CMAKE_${lang}_${var}}" "${DSYMUTIL_PROGRAM} ") + endforeach() + endforeach() + endif() +endif() + +function(sentry_install) + if(SENTRY_ENABLE_INSTALL) + install(${ARGN}) + endif() +endfunction() + +# helper function to add sources to existing TARGET prepended with ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR} +function(sentry_target_sources_cwd TARGET) + cmake_parse_arguments(STSC "" "SUBDIR" "" ${ARGN}) + foreach(src ${STSC_UNPARSED_ARGUMENTS}) + if(IS_ABSOLUTE "${src}") + target_sources(${TARGET} PRIVATE ${src}) + else() + target_sources(${TARGET} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/${STSC_SUBDIR}/${src}") + endif() + endforeach() +endfunction() + +# ===== sentry library ===== + +add_library(sentry ${SENTRY_LIBRARY_TYPE} "${PROJECT_SOURCE_DIR}/vendor/mpack.c") +target_sources(sentry PRIVATE "${PROJECT_SOURCE_DIR}/include/sentry.h") +add_library(sentry::sentry ALIAS sentry) +add_subdirectory(src) + +if (NOT SENTRY_SDK_NAME STREQUAL "") + target_compile_definitions(sentry PRIVATE SENTRY_SDK_NAME="${SENTRY_SDK_NAME}") +endif() + +# we do not need this on android, only linux +if(LINUX) + target_sources(sentry PRIVATE + "${PROJECT_SOURCE_DIR}/vendor/stb_sprintf.c" + "${PROJECT_SOURCE_DIR}/vendor/stb_sprintf.h" ) endif() -# transport +set_target_properties(sentry PROPERTIES PUBLIC_HEADER "include/sentry.h") + +if(DEFINED SENTRY_FOLDER) + set_target_properties(sentry PROPERTIES FOLDER ${SENTRY_FOLDER}) +endif() + +# check size type +include(CheckTypeSize) +check_type_size("long" CMAKE_SIZEOF_LONG) + +# https://gitlab.kitware.com/cmake/cmake/issues/18393 +if(SENTRY_BUILD_SHARED_LIBS) + if(APPLE) + sentry_install(FILES "$.dSYM" DESTINATION "${CMAKE_INSTALL_LIBDIR}") + elseif(MSVC) + sentry_install(FILES "$<$,$>:$>" + DESTINATION "${CMAKE_INSTALL_BINDIR}") + endif() +endif() + +if(SENTRY_BUILD_SHARED_LIBS) + target_compile_definitions(sentry PRIVATE SENTRY_BUILD_SHARED) +else() + target_compile_definitions(sentry PUBLIC SENTRY_BUILD_STATIC) +endif() +target_compile_definitions(sentry PRIVATE SIZEOF_LONG=${CMAKE_SIZEOF_LONG}) + +# AIX needs libm for isnan used in test suite +if(CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") + target_link_libraries(sentry PRIVATE m) +endif() +# On IBM i PASE, flock is in libutil. Here because "sentry" exists now. +if(CMAKE_SYSTEM_NAME STREQUAL "OS400") + target_link_libraries(sentry PRIVATE util) +endif() + if(SENTRY_TRANSPORT_CURL) - sentry_target_sources_cwd(sentry - transports/sentry_transport_curl.c - ) -elseif(SENTRY_TRANSPORT_WINHTTP) - sentry_target_sources_cwd(sentry - transports/sentry_transport_winhttp.c + if(NOT CURL_FOUND) # Some other lib might bring libcurl already + find_package(CURL REQUIRED COMPONENTS AsynchDNS) + endif() + + if(TARGET CURL::libcurl) # Only available in cmake 3.12+ + target_link_libraries(sentry PRIVATE CURL::libcurl) + else() + # Needed for cmake < 3.12 support (cmake 3.12 introduced the target CURL::libcurl) + target_include_directories(sentry PRIVATE ${CURL_INCLUDE_DIR}) + # The exported sentry target must not contain any path of the build machine, therefore use generator expressions + string(REPLACE ";" "$" GENEX_CURL_LIBRARIES "${CURL_LIBRARIES}") + string(REPLACE ";" "$" GENEX_CURL_COMPILE_DEFINITIONS "${CURL_COMPILE_DEFINITIONS}") + target_link_libraries(sentry PRIVATE $) + target_compile_definitions(sentry PRIVATE $) + endif() +endif() + +set_property(TARGET sentry PROPERTY C_VISIBILITY_PRESET hidden) +if(MSVC) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(CMAKE_ASM_MASM_FLAGS "${CMAKE_ASM_MASM_FLAGS} /safeseh") + endif() + + # using `/Wall` is not feasible, as it spews tons of warnings from windows headers + # supress C5105, introduced in VS 16.8, which breaks on the Windows SDKs own `winbase.h` header + target_compile_options(sentry PRIVATE $) + # ignore all warnings for mpack + set_source_files_properties( + "${PROJECT_SOURCE_DIR}/vendor/mpack.c" + PROPERTIES + COMPILE_FLAGS + "/W0" ) -elseif(SENTRY_TRANSPORT_NONE) - sentry_target_sources_cwd(sentry - transports/sentry_transport_none.c + + # set static runtime if enabled + if(SENTRY_BUILD_RUNTIMESTATIC) + set_property(TARGET sentry PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() +else() + target_compile_options(sentry PRIVATE $) + # The crashpad and breakpad headers generate the following warnings that we + # ignore specifically + target_compile_options(sentry PRIVATE $) + # ignore all warnings for mpack + set_source_files_properties( + "${PROJECT_SOURCE_DIR}/vendor/mpack.c" + PROPERTIES + COMPILE_FLAGS + "-w" ) endif() -# backends -if(SENTRY_BACKEND_CRASHPAD) - target_compile_definitions(sentry PRIVATE SENTRY_BACKEND_CRASHPAD) - sentry_target_sources_cwd(sentry - backends/sentry_backend_crashpad.cpp - ) -elseif(SENTRY_BACKEND_BREAKPAD) - target_compile_definitions(sentry PRIVATE SENTRY_BACKEND_BREAKPAD) - sentry_target_sources_cwd(sentry - backends/sentry_backend_breakpad.cpp - ) -elseif(SENTRY_BACKEND_INPROC) - target_compile_definitions(sentry PRIVATE SENTRY_BACKEND_INPROC) - sentry_target_sources_cwd(sentry - backends/sentry_backend_inproc.c - ) -elseif(SENTRY_BACKEND_NONE) - sentry_target_sources_cwd(sentry - backends/sentry_backend_none.c - ) -endif() - -# unwinder -if(SENTRY_WITH_LIBBACKTRACE) - target_compile_definitions(sentry PRIVATE SENTRY_WITH_UNWINDER_LIBBACKTRACE) - sentry_target_sources_cwd(sentry - unwinder/sentry_unwinder_libbacktrace.c + +target_include_directories(sentry + PUBLIC + "$" + "$" + PRIVATE + "$" +) + + +#respect CMAKE_SYSTEM_VERSION +if(WIN32) + if(MSVC AND CMAKE_GENERATOR_TOOLSET MATCHES "_xp$") + #force WINNT to 5.1 for Windows XP toolchain + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0501") + elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^10") + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0A00") + elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.3") + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0603") + elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.2") + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0602") + elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.1") + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0601") + elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^6.0") + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0600") + elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^5.2") + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0502") + elseif(${CMAKE_SYSTEM_VERSION} MATCHES "^5.1") + target_compile_definitions(sentry PRIVATE "_WIN32_WINNT=0x0501") + endif() + + # crashpad does not support Windows XP toolset + if(MSVC AND CMAKE_GENERATOR_TOOLSET MATCHES "_xp$" AND SENTRY_BACKEND_CRASHPAD) + message(FATAL_ERROR "MSVC XP toolset does not support Crashpad") + endif() +endif() + +# handle platform libraries +if(ANDROID) + set(_SENTRY_PLATFORM_LIBS "dl" "log") +elseif(LINUX) + set(_SENTRY_PLATFORM_LIBS "dl" "rt") +elseif(WIN32) + set(_SENTRY_PLATFORM_LIBS "dbghelp" "shlwapi" "version") +endif() + +if(SENTRY_TRANSPORT_WINHTTP) + list(APPEND _SENTRY_PLATFORM_LIBS "winhttp") +endif() + +# handle platform threads library +if(SENTRY_LINK_PTHREAD) + list(APPEND _SENTRY_PLATFORM_LIBS "Threads::Threads") +endif() + +# apply platform libraries to sentry library +if(SENTRY_LIBRARY_TYPE STREQUAL "STATIC") + target_link_libraries(sentry PUBLIC ${_SENTRY_PLATFORM_LIBS}) +else() + target_link_libraries(sentry PRIVATE ${_SENTRY_PLATFORM_LIBS}) +endif() + +# suppress some errors and warnings for MinGW target +if(MINGW) + target_compile_options(sentry PRIVATE + -Wno-unused-variable + -Wno-unused-parameter + -Wno-format + -Wno-incompatible-pointer-types + -Wno-incompatible-function-pointer-types ) endif() + if(SENTRY_WITH_LIBUNWINDSTACK) - target_compile_definitions(sentry PRIVATE SENTRY_WITH_UNWINDER_LIBUNWINDSTACK) - sentry_target_sources_cwd(sentry - unwinder/sentry_unwinder_libunwindstack.cpp - ) + target_include_directories(sentry PRIVATE + "$") + add_subdirectory("${PROJECT_SOURCE_DIR}/external/libunwindstack-ndk/cmake") + target_link_libraries(sentry PRIVATE unwindstack) + if(NOT SENTRY_BUILD_SHARED_LIBS) + sentry_install(TARGETS unwindstack EXPORT sentry + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ) + endif() endif() -if(WIN32) - target_compile_definitions(sentry PRIVATE SENTRY_WITH_UNWINDER_DBGHELP) - sentry_target_sources_cwd(sentry - unwinder/sentry_unwinder_dbghelp.c + +if(SENTRY_BACKEND_CRASHPAD) + # FIXME: required for cmake 3.12 and lower: + # - NEW behavior lets normal variable override option + cmake_policy(SET CMP0077 NEW) + if(SENTRY_BUILD_SHARED_LIBS) + set(CRASHPAD_ENABLE_INSTALL OFF CACHE BOOL "Enable crashpad installation" FORCE) + else() + set(CRASHPAD_ENABLE_INSTALL ON CACHE BOOL "Enable crashpad installation" FORCE) + endif() + add_subdirectory(external/crashpad crashpad_build) + + if(CRASHPAD_WER_ENABLED) + add_dependencies(sentry crashpad::wer) + endif() + + # set static runtime if enabled + if(SENTRY_BUILD_RUNTIMESTATIC AND MSVC) + set_property(TARGET crashpad_client PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_compat PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_getopt PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_handler PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_handler_lib PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_minidump PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_snapshot PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_tools PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET crashpad_util PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + if(CRASHPAD_WER_ENABLED) + set_property(TARGET crashpad_wer PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() + set_property(TARGET crashpad_zlib PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET mini_chromium PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() + + if(DEFINED SENTRY_FOLDER) + set_target_properties(crashpad_client PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_compat PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_getopt PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_handler PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_handler_lib PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_minidump PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_snapshot PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_tools PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_util PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(crashpad_zlib PROPERTIES FOLDER ${SENTRY_FOLDER}) + set_target_properties(mini_chromium PROPERTIES FOLDER ${SENTRY_FOLDER}) + if(CRASHPAD_WER_ENABLED) + set_target_properties(crashpad_wer PROPERTIES FOLDER ${SENTRY_FOLDER}) + endif() + endif() + + target_link_libraries(sentry PRIVATE + $ + $ + ) + install(EXPORT crashpad_export NAMESPACE sentry_crashpad:: FILE sentry_crashpad-targets.cmake + DESTINATION "${CMAKE_INSTALL_CMAKEDIR}" ) + if(WIN32 AND MSVC) + sentry_install(FILES $ + DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) + if (CRASHPAD_WER_ENABLED) + sentry_install(FILES $ + DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) + endif() + endif() + add_dependencies(sentry crashpad::handler) + + if(CRASHPAD_WER_ENABLED) + add_compile_definitions(CRASHPAD_WER_ENABLED) + endif() +elseif(SENTRY_BACKEND_BREAKPAD) + option(SENTRY_BREAKPAD_SYSTEM "Use system breakpad" OFF) + if(SENTRY_BREAKPAD_SYSTEM) + # system breakpad is using pkg-config, see `external/breakpad/breakpad-client.pc.in` + find_package(PkgConfig REQUIRED) + pkg_check_modules(BREAKPAD REQUIRED IMPORTED_TARGET breakpad-client) + if(SENTRY_BUILD_SHARED_LIBS) + target_link_libraries(sentry PRIVATE PkgConfig::BREAKPAD) + else() + target_link_libraries(sentry PUBLIC PkgConfig::BREAKPAD) + endif() + else() + add_subdirectory(external) + target_include_directories(sentry PRIVATE + "$" + ) + target_link_libraries(sentry PRIVATE + breakpad_client + ) + + if(DEFINED SENTRY_FOLDER) + set_target_properties(breakpad_client PROPERTIES FOLDER ${SENTRY_FOLDER}) + endif() + + if(NOT SENTRY_BUILD_SHARED_LIBS) + sentry_install(TARGETS breakpad_client EXPORT sentry + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ) + endif() + endif() +elseif(SENTRY_BACKEND_INPROC) + target_compile_definitions(sentry PRIVATE SENTRY_WITH_INPROC_BACKEND) endif() -# integrations +option(SENTRY_INTEGRATION_QT "Build Qt integration") if(SENTRY_INTEGRATION_QT) - target_compile_definitions(sentry PRIVATE SENTRY_INTEGRATION_QT) - sentry_target_sources_cwd(sentry - integrations/sentry_integration_qt.cpp - integrations/sentry_integration_qt.h - ) + if(QT_DEFAULT_MAJOR_VERSION) + # Let user choose major version + set(Qt_VERSION_MAJOR ${QT_DEFAULT_MAJOR_VERSION}) + else() + # Find best match, prioritizing Qt 6 if available + find_package(Qt NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) + endif() + find_package(Qt${Qt_VERSION_MAJOR} COMPONENTS Core REQUIRED) + message(STATUS "Found Qt: ${Qt${Qt_VERSION_MAJOR}_DIR} " + "(found version \"${Qt${Qt_VERSION_MAJOR}_VERSION}\")") + target_link_libraries(sentry PRIVATE Qt${Qt_VERSION_MAJOR}::Core) +endif() + +include(CMakePackageConfigHelpers) +configure_package_config_file(sentry-config.cmake.in sentry-config.cmake + INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") + +# generate package version file +# We would have liked to use `SameMinorVersion`, but that is only supported on +# CMake >= 3.11. +write_basic_package_version_file(sentry-config-version.cmake + VERSION ${SENTRY_VERSION} + COMPATIBILITY SameMajorVersion) + +sentry_install(TARGETS sentry EXPORT sentry + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" +) +sentry_install(EXPORT sentry NAMESPACE sentry:: FILE sentry-targets.cmake + DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") +sentry_install( + FILES + "${PROJECT_BINARY_DIR}/sentry-config.cmake" + "${PROJECT_BINARY_DIR}/sentry-config-version.cmake" + DESTINATION "${CMAKE_INSTALL_CMAKEDIR}") +if(WIN32 AND MSVC AND SENTRY_BUILD_SHARED_LIBS) + sentry_install(FILES $ + DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) +endif() + +# ===== tests ===== + +if(SENTRY_BUILD_TESTS) + add_subdirectory(tests/unit) endif() + +# ===== example, also used as integration test ===== + +if(SENTRY_BUILD_EXAMPLES) + add_executable(sentry_example examples/example.c) + target_link_libraries(sentry_example PRIVATE sentry) + + if(MSVC) + target_compile_options(sentry_example PRIVATE $) + if(CRASHPAD_WER_ENABLED) + # to test handling SEH by-passing exceptions we need to enable the control flow guard + target_compile_options(sentry_example PRIVATE $) + endif() + endif() + + # set static runtime if enabled + if(SENTRY_BUILD_RUNTIMESTATIC AND MSVC) + set_property(TARGET sentry_example PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() + + if(DEFINED SENTRY_FOLDER) + set_target_properties(sentry_example PROPERTIES FOLDER ${SENTRY_FOLDER}) + endif() + + add_test(NAME sentry_example COMMAND sentry_example) +endif() + +# Limit the exported symbols when sentry is built as a shared library to those with a "sentry_" prefix: +# - we do this at the end of the file as to not affect subdirectories reading target_link_libraries from the parent. +# - we do this as PRIVATE since our version script does not make sense in any other project that adds us. +# +# Used linker parameters: +# `--build-id`: To have a build-id in the ELF object. +# `--version-script`: version script either hides "foreign" symbols or defers them as unknown ("U") to system libraries. +# FIXME: cmake 3.13 introduced target_link_options (blocked by Android) +if(SENTRY_BUILD_SHARED_LIBS) + target_link_libraries(sentry PRIVATE + "$<$,$>:-Wl,--build-id=sha1,--version-script=${PROJECT_SOURCE_DIR}/src/exports.map>") +endif() \ No newline at end of file diff --git a/shared/sentry/CONTRIBUTING.md b/shared/sentry/src/CONTRIBUTING.md similarity index 98% rename from shared/sentry/CONTRIBUTING.md rename to shared/sentry/src/CONTRIBUTING.md index 61bc6f297..2af86e966 100644 --- a/shared/sentry/CONTRIBUTING.md +++ b/shared/sentry/src/CONTRIBUTING.md @@ -144,6 +144,7 @@ The example currently supports the following commands: - `discarding-before-send`: Installs a `before_send()` callback that discards the event. - `on-crash`: Installs an `on_crash()` callback that retains the crash event. - `discarding-on-crash`: Installs an `on_crash()` callback that discards the crash event. +- `override-sdk-name`: Changes the SDK name via the options at runtime. Only on Windows using crashpad with its WER handler module: diff --git a/shared/sentry/LICENSE b/shared/sentry/src/LICENSE similarity index 100% rename from shared/sentry/LICENSE rename to shared/sentry/src/LICENSE diff --git a/shared/sentry/README.md b/shared/sentry/src/README.md similarity index 95% rename from shared/sentry/README.md rename to shared/sentry/src/README.md index 77d5da1d2..3c809b50c 100644 --- a/shared/sentry/README.md +++ b/shared/sentry/src/README.md @@ -1,3 +1,5 @@ +[![Conan Center](https://shields.io/conan/v/sentry-native)](https://conan.io/center/recipes/sentry-native) [![nixpkgs unstable](https://repology.org/badge/version-for-repo/nix_unstable/sentry-native.svg)](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/development/libraries/sentry-native/default.nix) [![vcpkg](https://shields.io/vcpkg/v/sentry-native)](https://vcpkg.link/ports/sentry-native) +

@@ -15,13 +17,10 @@ applications, optimized for C and C++. Sentry allows to add tags, breadcrumbs and arbitrary custom context to enrich error reports. Supports Sentry _20.6.0_ and later. -**Note**: This SDK is being actively developed and still in Beta. We recommend -to check for updates regularly to benefit from latest features and bug fixes. -Please see [Known Limitations](#known-limitations). - ## Resources -- [Discord](https://discord.gg/ez5KZN7) server for project discussions. +- [SDK Documentation](https://docs.sentry.io/platforms/native/) +- [Discord](https://discord.gg/ez5KZN7) server for project discussions - Follow [@getsentry](https://twitter.com/getsentry) on Twitter for updates ## Table of Contents @@ -228,9 +227,9 @@ using `cmake -D BUILD_SHARED_LIBS=OFF ..`. Sentry can use different backends depending on platform. - **crashpad**: This uses the out-of-process crashpad handler. It is currently - only supported on Desktop OSs, and used as the default on Windows and macOS. + only supported on Desktop OSs, and used as the default on Windows, Linux and macOS. - **breakpad**: This uses the in-process breakpad handler. It is currently - only supported on Desktop OSs, and used as the default on Linux. + only supported on Desktop OSs. - **inproc**: A small in-process handler which is supported on all platforms, and is used as default on Android. - **none**: This builds `sentry-native` without a backend, so it does not handle @@ -239,12 +238,8 @@ using `cmake -D BUILD_SHARED_LIBS=OFF ..`. - `SENTRY_INTEGRATION_QT` (Default: OFF): Builds the Qt integration, which turns Qt log messages into breadcrumbs. -- `SENTRY_BREAKPAD_SYSTEM` / `SENTRY_CRASHPAD_SYSTEM` (Default: OFF): - This instructs the build system to use system-installed breakpad or crashpad - libraries instead of using the in-tree version. This is generally not recommended - for crashpad, as sentry uses a patched version that has attachment support. - This is being worked on upstream as well, and a future version might work with - an unmodified crashpad version as well. +- `SENTRY_BREAKPAD_SYSTEM` (Default: OFF): + This instructs the build system to use system-installed breakpad libraries instead of using the in-tree version. | Feature | Windows | macOS | Linux | Android | iOS | | ---------- | ------- | ----- | ----- | ------- | --- | diff --git a/shared/sentry/examples/example.c b/shared/sentry/src/examples/example.c similarity index 98% rename from shared/sentry/examples/example.c rename to shared/sentry/src/examples/example.c index ad9e594f9..7e1b71b0c 100644 --- a/shared/sentry/examples/example.c +++ b/shared/sentry/src/examples/example.c @@ -218,6 +218,10 @@ main(int argc, char **argv) options, discarding_on_crash_callback, NULL); } + if (has_arg(argc, argv, "override-sdk-name")) { + sentry_options_set_sdk_name(options, "sentry.native.android.flutter"); + } + sentry_init(options); if (!has_arg(argc, argv, "no-setup")) { diff --git a/shared/sentry/external/CMakeLists.txt b/shared/sentry/src/external/CMakeLists.txt similarity index 94% rename from shared/sentry/external/CMakeLists.txt rename to shared/sentry/src/external/CMakeLists.txt index ca807f71c..9f3a29869 100644 --- a/shared/sentry/external/CMakeLists.txt +++ b/shared/sentry/src/external/CMakeLists.txt @@ -20,6 +20,10 @@ set(BREAKPAD_SOURCES_COMMON_LINUX breakpad/src/common/linux/linux_libc_support.cc breakpad/src/common/linux/memory_mapped_file.cc breakpad/src/common/linux/safe_readlink.cc + breakpad/src/common/linux/scoped_pipe.cc + breakpad/src/common/linux/scoped_pipe.h + breakpad/src/common/linux/scoped_tmpfile.cc + breakpad/src/common/linux/scoped_tmpfile.h ) set(BREAKPAD_SOURCES_COMMON_LINUX_GETCONTEXT @@ -36,6 +40,8 @@ set(BREAKPAD_SOURCES_COMMON_WINDOWS ) set(BREAKPAD_SOURCES_COMMON_APPLE + breakpad/src/common/mac/arch_utilities.cc + breakpad/src/common/mac/arch_utilities.h breakpad/src/common/mac/file_id.cc breakpad/src/common/mac/file_id.h breakpad/src/common/mac/macho_id.cc @@ -119,6 +125,8 @@ set(BREAKPAD_SOURCES_CLIENT_IOS ) add_library(breakpad_client STATIC) +set_property(TARGET breakpad_client PROPERTY CXX_STANDARD 17) +set_property(TARGET breakpad_client PROPERTY CXX_STANDARD_REQUIRED On) target_sources(breakpad_client PRIVATE ${BREAKPAD_SOURCES_COMMON}) if(LINUX OR ANDROID) diff --git a/shared/sentry/external/breakpad/.clang-format b/shared/sentry/src/external/breakpad/.clang-format similarity index 100% rename from shared/sentry/external/breakpad/.clang-format rename to shared/sentry/src/external/breakpad/.clang-format diff --git a/shared/sentry/external/breakpad/.github/workflows/build-test-ci.yml b/shared/sentry/src/external/breakpad/.github/workflows/build-test-ci.yml similarity index 100% rename from shared/sentry/external/breakpad/.github/workflows/build-test-ci.yml rename to shared/sentry/src/external/breakpad/.github/workflows/build-test-ci.yml diff --git a/shared/sentry/external/breakpad/.github/workflows/coverity.yml b/shared/sentry/src/external/breakpad/.github/workflows/coverity.yml similarity index 100% rename from shared/sentry/external/breakpad/.github/workflows/coverity.yml rename to shared/sentry/src/external/breakpad/.github/workflows/coverity.yml diff --git a/shared/sentry/external/breakpad/.gitignore b/shared/sentry/src/external/breakpad/.gitignore similarity index 96% rename from shared/sentry/external/breakpad/.gitignore rename to shared/sentry/src/external/breakpad/.gitignore index efa0851af..737bda54b 100644 --- a/shared/sentry/external/breakpad/.gitignore +++ b/shared/sentry/src/external/breakpad/.gitignore @@ -69,7 +69,7 @@ config.h /Makefile stamp-h1 -# Ignore GYP generated Visual Studio artifacts. +# Ignore generated Visual Studio artifacts. *.filters *.sdf *.sln @@ -77,7 +77,7 @@ stamp-h1 *.vcproj *.vcxproj -# Ignore GYP generated Makefiles +# Ignore generated Makefiles src/Makefile *.Makefile *.target.mk @@ -89,4 +89,3 @@ src/Makefile src/testing src/third_party/lss src/third_party/protobuf -src/tools/gyp diff --git a/shared/sentry/external/breakpad/AUTHORS b/shared/sentry/src/external/breakpad/AUTHORS similarity index 100% rename from shared/sentry/external/breakpad/AUTHORS rename to shared/sentry/src/external/breakpad/AUTHORS diff --git a/shared/sentry/external/breakpad/ChangeLog b/shared/sentry/src/external/breakpad/ChangeLog similarity index 100% rename from shared/sentry/external/breakpad/ChangeLog rename to shared/sentry/src/external/breakpad/ChangeLog diff --git a/shared/sentry/external/breakpad/DEPS b/shared/sentry/src/external/breakpad/DEPS similarity index 73% rename from shared/sentry/external/breakpad/DEPS rename to shared/sentry/src/external/breakpad/DEPS index 797ceeb8c..3fcd524dc 100644 --- a/shared/sentry/external/breakpad/DEPS +++ b/shared/sentry/src/external/breakpad/DEPS @@ -43,42 +43,16 @@ deps = { "https://github.com/google/protobuf.git" + "@cb6dd4ef5f82e41e06179dcd57d3b1d9246ad6ac", - # GYP project generator. - "src/src/tools/gyp": - "https://chromium.googlesource.com/external/gyp/" + - "@324dd166b7c0b39d513026fa52d6280ac6d56770", - # Linux syscall support. "src/src/third_party/lss": "https://chromium.googlesource.com/linux-syscall-support/" + - "@ce877209e11aa69dcfffbd53ef90ea1d07136521", + "@9719c1e1e676814c456b55f5f070eabad6709d31", } hooks = [ { # Keep the manifest up to date. - "action": ["python", "src/src/tools/python/deps-to-manifest.py", + "action": ["src/src/tools/python/deps-to-manifest.py", "src/DEPS", "src/default.xml"], }, ] - -hooks_os = { - 'win': [ - { - # TODO(chrisha): Fix the GYP files so that they work without - # --no-circular-check. - "pattern": ".", - "action": ["python", - "src/src/tools/gyp/gyp_main.py", - "--no-circular-check", - "src/src/client/windows/breakpad_client.gyp"], - }, - { - # XXX: this and above should all be wired into build/all.gyp ? - "action": ["python", - "src/src/tools/gyp/gyp_main.py", - "--no-circular-check", - "src/src/tools/windows/tools_windows.gyp"], - }, - ], -} diff --git a/shared/sentry/external/breakpad/DIR_METADATA b/shared/sentry/src/external/breakpad/DIR_METADATA similarity index 100% rename from shared/sentry/external/breakpad/DIR_METADATA rename to shared/sentry/src/external/breakpad/DIR_METADATA diff --git a/shared/sentry/external/breakpad/INSTALL b/shared/sentry/src/external/breakpad/INSTALL similarity index 100% rename from shared/sentry/external/breakpad/INSTALL rename to shared/sentry/src/external/breakpad/INSTALL diff --git a/shared/sentry/src/external/breakpad/LICENSE b/shared/sentry/src/external/breakpad/LICENSE new file mode 100644 index 000000000..42af8c10c --- /dev/null +++ b/shared/sentry/src/external/breakpad/LICENSE @@ -0,0 +1,1068 @@ +Copyright 2006 Google LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------- +License for src/common/convert_UTF.cc, src/common/convert_UTF.h + +Copyright © 1991-2015 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in +http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, +(b) this copyright and permission notice appear in associated +documentation, and +(c) there is clear notice in each modified Data File or in the Software +as well as in the documentation associated with the Data File(s) or +Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. + +-------------------------------------------------------------------- +License for src/common/linux/breakpad_getcontext.S + +libunwind - a platform-independent unwind library + Copyright (C) 2008 Google, Inc + Contributed by Paul Pluzhnikov + Copyright (C) 2010 Konstantin Belousov + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +-------------------------------------------------------------------- +License for +src/client/mac/handler/breakpad_nlist_64.cc +src/third_party/mac_headers/architecture/byte_order.h +src/third_party/mac_headers/mach-o/arch.h +src/third_party/mac_headers/mach-o/fat.h: +src/third_party/mac_headers/mach-o/loader.h +src/third_party/mac_headers/mach-o/nlist.h + +APPLE PUBLIC SOURCE LICENSE + +Version 2.0 - August 6, 2003 + +Please read this License carefully before downloading this software. By +downloading or using this software, you are agreeing to be bound by the terms +of this License. If you do not or cannot agree to the terms of this License, +please do not download or use the software. + +Apple Note: In January 2007, Apple changed its corporate name from "Apple +Computer, Inc." to "Apple Inc." This change has been reflected below and +copyright years updated, but no other changes have been made to the APSL 2.0. + +1. General; Definitions. This License applies to any program or other work which Apple Inc. ("Apple") makes publicly available and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 2.0 ("License"). As used in this License: + +1.1 "Applicable Patent Rights" mean: (a) in the case where Apple is the +grantor of rights, (i) claims of patents that are now or hereafter acquired, +owned by or assigned to Apple and (ii) that cover subject matter contained in +the Original Code, but only to the extent necessary to use, reproduce and/or +distribute the Original Code without infringement; and (b) in the case where +You are the grantor of rights, (i) claims of patents that are now or hereafter +acquired, owned by or assigned to You and (ii) that cover subject matter in +Your Modifications, taken alone or in combination with Original Code. + +1.2 "Contributor" means any person or entity that creates or contributes to +the creation of Modifications. + +1.3 "Covered Code" means the Original Code, Modifications, the combination of +Original Code and any Modifications, and/or any respective portions thereof. + +1.4 "Externally Deploy" means: (a) to sublicense, distribute or otherwise make +Covered Code available, directly or indirectly, to anyone other than You; +and/or (b) to use Covered Code, alone or as part of a Larger Work, in any way +to provide a service, including but not limited to delivery of content, +through electronic communication with a client other than You. + +1.5 "Larger Work" means a work which combines Covered Code or portions thereof +with code not governed by the terms of this License. + +1.6 "Modifications" mean any addition to, deletion from, and/or change to, the +substance and/or structure of the Original Code, any previous Modifications, +the combination of Original Code and any previous Modifications, and/or any +respective portions thereof. When code is released as a series of files, a +Modification is: (a) any addition to or deletion from the contents of a file +containing Covered Code; and/or (b) any new file or other representation of +computer program statements that contains any part of Covered Code. + +1.7 "Original Code" means (a) the Source Code of a program or other work as +originally made available by Apple under this License, including the Source +Code of any updates or upgrades to such programs or works made available by +Apple under this License, and that has been expressly identified by Apple as +such in the header file(s) of such work; and (b) the object code compiled from +such Source Code and originally made available by Apple under this License + +1.8 "Source Code" means the human readable form of a program or other work +that is suitable for making modifications to it, including all modules it +contains, plus any associated interface definition files, scripts used to +control compilation and installation of an executable (object code). + +1.9 "You" or "Your" means an individual or a legal entity exercising rights +under this License. For legal entities, "You" or "Your" includes any entity +which controls, is controlled by, or is under common control with, You, where +"control" means (a) the power, direct or indirect, to cause the direction or +management of such entity, whether by contract or otherwise, or (b) ownership +of fifty percent (50%) or more of the outstanding shares or beneficial +ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions. Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Apple's Applicable Patent Rights and copyrights covering the Original Code, to do the following: + +2.1 Unmodified Code. You may use, reproduce, display, perform, internally +distribute within Your organization, and Externally Deploy verbatim, +unmodified copies of the Original Code, for commercial or non-commercial +purposes, provided that in each instance: + +(a) You must retain and reproduce in all copies of Original Code the copyright +and other proprietary notices and disclaimers of Apple as they appear in the +Original Code, and keep intact all notices in the Original Code that refer to +this License; and + +(b) You must include a copy of this License with every copy of Source Code of +Covered Code and documentation You distribute or Externally Deploy, and You +may not offer or impose any terms on such Source Code that alter or restrict +this License or the recipients' rights hereunder, except as permitted +under Section 6. + +2.2 Modified Code. You may modify Covered Code and use, reproduce, display, +perform, internally distribute within Your organization, and Externally Deploy +Your Modifications and Covered Code, for commercial or non-commercial +purposes, provided that in each instance You also meet all of these +conditions: + +(a) You must satisfy all the conditions of Section 2.1 with respect to the +Source Code of the Covered Code; + +(b) You must duplicate, to the extent it does not already exist, the notice in +Exhibit A in each file of the Source Code of all Your Modifications, and cause +the modified files to carry prominent notices stating that You changed the +files and the date of any change; and + +(c) If You Externally Deploy Your Modifications, You must make Source Code of +all Your Externally Deployed Modifications either available to those to whom +You have Externally Deployed Your Modifications, or publicly available. Source +Code of Your Externally Deployed Modifications must be released under the +terms set forth in this License, including the license grants set forth in +Section 3 below, for as long as you Externally Deploy the Covered Code or +twelve (12) months from the date of initial External Deployment, whichever is +longer. You should preferably distribute the Source Code of Your Externally +Deployed Modifications electronically (e.g. download from a web site). + +2.3 Distribution of Executable Versions. In addition, if You Externally Deploy +Covered Code (Original Code and/or Modifications) in object code, executable +form only, You must include a prominent notice, in the code itself as well as +in related documentation, stating that Source Code of the Covered Code is +available under the terms of this License with information on how and where to +obtain such Source Code. + +2.4 Third Party Rights. You expressly acknowledge and agree that although +Apple and each Contributor grants the licenses to their respective portions of +the Covered Code set forth herein, no assurances are provided by Apple or any +Contributor that the Covered Code does not infringe the patent or other +intellectual property rights of any other entity. Apple and each Contributor +disclaim any liability to You for claims brought by any other entity based on +infringement of intellectual property rights or otherwise. As a condition to +exercising the rights and licenses granted hereunder, You hereby assume sole +responsibility to secure any other intellectual property rights needed, if +any. For example, if a third party patent license is required to allow You to +distribute the Covered Code, it is Your responsibility to acquire that license +before distributing the Covered Code. + +3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License, You hereby grant to any person or entity receiving or distributing Covered Code under this License a non-exclusive, royalty-free, perpetual, irrevocable license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify, sublicense, distribute and Externally Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2 above. + +4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein. Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion. + +6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple and every Contributor harmless for any liability incurred by or claims asserted against Apple or such Contributor by reason of any such Additional Terms. + +7. Versions of the License. Apple may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple. No one other than Apple has the right to modify the terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works. The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE, AN APPLE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage. + +9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of fifty dollars ($50.00). + +10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Apple", "Mac", "Mac OS", "QuickTime", "QuickTime Streaming Server" or any other trademarks, service marks, logos or trade names belonging to Apple (collectively "Apple Marks") or to any trademark, service mark, logo or trade name belonging to any Contributor. You agree not to use any Apple Marks in or as part of the name of products derived from the Original Code or to endorse or promote products derived from the Original Code other than as expressly permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html. + +11. Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor. Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License. Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. + +12. Termination. + +12.1 Termination. This License and the rights granted hereunder will +terminate: + +(a) automatically without notice from Apple if You fail to comply with any +term(s) of this License and fail to cure such breach within 30 days of +becoming aware of such breach; + +(b) immediately in the event of the circumstances described in Section +13.5(b); or + +(c) automatically without notice from Apple if You, at any time during the +term of this License, commence an action for patent infringement against +Apple; provided that Apple did not first commence an action for patent +infringement against You in that instance. + +12.2 Effect of Termination. Upon termination, You agree to immediately stop +any further use, reproduction, modification, sublicensing and distribution of +the Covered Code. All sublicenses to the Covered Code which have been properly +granted prior to termination shall survive any termination of this License. +Provisions which, by their nature, should remain in effect beyond the +termination of this License shall survive, including but not limited to +Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other +for compensation, indemnity or damages of any sort solely as a result of +terminating this License in accordance with its terms, and termination of this +License will be without prejudice to any other right or remedy of any party. + +13. Miscellaneous. + +13.1 Government End Users. The Covered Code is a "commercial item" as defined +in FAR 2.101. Government software and technical data rights in the Covered +Code include only those rights customarily provided to the public as defined +in this License. This customary commercial license in technical data and +software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 +(Computer Software) and, for Department of Defense purchases, DFAR +252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in +Commercial Computer Software or Computer Software Documentation). Accordingly, +all U.S. Government End Users acquire Covered Code with only those rights set +forth herein. + +13.2 Relationship of Parties. This License will not be construed as creating +an agency, partnership, joint venture or any other form of legal association +between or among You, Apple or any Contributor, and You will not represent to +the contrary, whether expressly, by implication, appearance or otherwise. + +13.3 Independent Development. Nothing in this License will impair Apple's +right to acquire, license, develop, have others develop for it, market and/or +distribute technology or products that perform the same or similar functions +as, or otherwise compete with, Modifications, Larger Works, technology or +products that You may develop, produce, market or distribute. + +13.4 Waiver; Construction. Failure by Apple or any Contributor to enforce any +provision of this License will not be deemed a waiver of future enforcement of +that or any other provision. Any law or regulation which provides that the +language of a contract shall be construed against the drafter will not apply +to this License. + +13.5 Severability. (a) If for any reason a court of competent jurisdiction +finds any provision of this License, or portion thereof, to be unenforceable, +that provision of the License will be enforced to the maximum extent +permissible so as to effect the economic benefits and intent of the parties, +and the remainder of this License will continue in full force and effect. (b) +Notwithstanding the foregoing, if applicable law prohibits or restricts You +from fully and/or specifically complying with Sections 2 and/or 3 or prevents +the enforceability of either of those Sections, this License will immediately +terminate and You must immediately discontinue any use of the Covered Code and +destroy all copies of it that are in your possession or control. + +13.6 Dispute Resolution. Any litigation or other dispute resolution between +You and Apple relating to this License shall take place in the Northern +District of California, and You and Apple hereby consent to the personal +jurisdiction of, and venue in, the state and federal courts within that +District with respect to this License. The application of the United Nations +Convention on Contracts for the International Sale of Goods is expressly +excluded. + +13.7 Entire Agreement; Governing Law. This License constitutes the entire +agreement between the parties with respect to the subject matter hereof. This +License shall be governed by the laws of the United States and the State of +California, except that body of California law concerning conflicts of law. + +Where You are located in the province of Quebec, Canada, the following clause +applies: The parties hereby confirm that they have requested that this License +and all related documents be drafted in English. Les parties ont exigé que le +présent contrat et tous les documents connexes soient rédigés en anglais. + +EXHIBIT A. + +"Portions Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. + +This file contains Original Code and/or Modifications of Original Code as +defined in and that are subject to the Apple Public Source License Version 2.0 +(the 'License'). You may not use this file except in compliance with +the License. Please obtain a copy of the License at +http://www.opensource.apple.com/apsl/ and read it before using this file. + +The Original Code and all software distributed under the License are +distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the +License for the specific language governing rights and limitations under the +License." + +-------------------------------------------------------------------- +License for +src/client/mac/handler/breakpad_nlist_64.cc +src/third_party/mac_headers/mach-o/nlist.h + +Copyright (c) 1989, 1993 +The Regents of the University of California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the University of + California, Berkeley and its contributors. +4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +-------------------------------------------------------------------- +License for +src/third_party/curl/curl.h +src/third_party/curl/curlbuild.h +src/third_party/curl/curlrules.h +src/third_party/curl/curlver.h +src/third_party/curl/easy.h +src/third_party/curl/mprintf.h +src/third_party/curl/multi.h +src/third_party/curl/stdcheaders.h +src/third_party/curl/typecheck-gcc.h + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2011, Daniel Stenberg, . + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright +notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization of the copyright holder. + +-------------------------------------------------------------------- +License for +src/common/mac/GTMDefines.h +src/common/mac/GTMLogger.h +src/common/mac/GTMLogger.m +src/common/mac/testing/GTMSenTestCase.h +src/common/mac/testing/GTMSenTestCase.m + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the +copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other +entities that control, are controlled by, or are under common control with +that entity. For the purposes of this definition, "control" means (i) the +power, direct or indirect, to cause the direction or management of such +entity, whether by contract or otherwise, or (ii) ownership of fifty percent +(50%) or more of the outstanding shares, or (iii) beneficial ownership of such +entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, and +configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object +code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice that is +included in or attached to the work (an example is provided in the Appendix +below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative +Works shall not include works that remain separable from, or merely link (or +bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor for +inclusion in the Work by the copyright owner or by an individual or Legal +Entity authorized to submit on behalf of the copyright owner. For the purposes +of this definition, "submitted" means any form of electronic, verbal, or +written communication sent to the Licensor or its representatives, including +but not limited to communication on electronic mailing lists, source code +control systems, and issue tracking systems that are managed by, or on behalf +of, the Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +(a) You must give any other recipients of the Work or Derivative Works a copy +of this License; and + +(b) You must cause any modified files to carry prominent notices stating that +You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works that You +distribute, all copyright, patent, trademark, and attribution notices from the +Source form of the Work, excluding those notices that do not pertain to any +part of the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its distribution, +then any Derivative Works that You distribute must include a readable copy of +the attribution notices contained within such NOTICE file, excluding those +notices that do not pertain to any part of the Derivative Works, in at least +one of the following places: within a NOTICE text file distributed as part of +the Derivative Works; within the Source form or documentation, if provided +along with the Derivative Works; or, within a display generated by the +Derivative Works, if and wherever such third-party notices normally appear. +The contents of the NOTICE file are for informational purposes only and do not +modify the License. You may add Your own attribution notices within Derivative +Works that You distribute, alongside or as an addendum to the NOTICE text from +the Work, provided that such additional attribution notices cannot be +construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a +whole, provided Your use, reproduction, and distribution of the Work otherwise +complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +-------------------------------------------------------------------- +License for INSTALL + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +-------------------------------------------------------------------- +License for src/common/mac/testing/GTMSenTestCase.h + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------- +License for src/third_party//libdisasm + + The "Clarified Artistic License" + + Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Distribution fee" is a fee you charge for providing a copy of this + Package to another party. + + "Freely Available" means that no fee is charged for the right to use + the item, though there may be fees involved in handling the item. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain, or those made Freely Available, or from +the Copyright Holder. A Package modified in such a way shall still be +considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site allowing unrestricted access to them, or by allowing the Copyright + Holder to include your modifications in the Standard Version of the + Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + e) permit and encourge anyone who receives a copy of the modified Package + permission to make your modifications Freely Available in some specific + way. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + e) offer the machine-readable source of the Package, with your + modifications, by mail order. + +5. You may charge a distribution fee for any distribution of this Package. +If you offer support for this Package, you may charge any fee you choose +for that support. You may not charge a license fee for the right to use +this Package itself. You may distribute this Package in aggregate with +other (possibly commercial and possibly nonfree) programs as part of a +larger (possibly commercial and possibly nonfree) software distribution, +and charge license fees for other parts of that software distribution, +provided that you do not advertise this Package as a product of your own. +If the Package includes an interpreter, You may embed this Package's +interpreter within an executable of yours (by linking); this shall be +construed as a mere form of aggregation, provided that the complete +Standard Version of the interpreter is so embedded. + +6. The scripts and library files supplied as input to or produced as +output from the programs of this Package do not automatically fall +under the copyright of this Package, but belong to whoever generated +them, and may be sold commercially, and may be aggregated with this +Package. If such scripts or library files are aggregated with this +Package via the so-called "undump" or "unexec" methods of producing a +binary executable image, then distribution of such an image shall +neither be construed as a distribution of this Package nor shall it +fall under the restrictions of Paragraphs 3 and 4, provided that you do +not represent such an executable image as a Standard Version of this +Package. + +7. C subroutines (or comparably compiled subroutines in other +languages) supplied by you and linked into this Package in order to +emulate subroutines and variables of the language defined by this +Package shall not be considered part of this Package, but are the +equivalent of input as in Paragraph 6, provided these subroutines do +not change the language in any way that would cause it to fail the +regression tests for the language. + +8. Aggregation of the Standard Version of the Package with a commercial +distribution is always permitted provided that the use of this Package is +embedded; that is, when no overt attempt is made to make this Package's +interfaces visible to the end user of the commercial distribution. +Such use shall not be construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End + +-------------------------------------------------------------------- +License for Autotools + +AUTOCONF CONFIGURE SCRIPT EXCEPTION + +Version 3.0, 18 August 2009 + +Copyright © 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +This Exception is an additional permission under section 7 of the GNU General +Public License, version 3 ("GPLv3"). It applies to a given file that bears a +notice placed by the copyright holder of the file stating that the file is +governed by GPLv3 along with this Exception. + +The purpose of this Exception is to allow distribution of Autoconf's +typical output under terms of the recipient's choice (including +proprietary). + +0. Definitions. +"Covered Code" is the source or object code of a version of Autoconf that is a +covered work under this License. + +"Normally Copied Code" for a version of Autoconf means all parts of its +Covered Code which that version can copy from its code (i.e., not from its +input file) into its minimally verbose, non-debugging and non-tracing output. + +"Ineligible Code" is Covered Code that is not Normally Copied Code. + +1. Grant of Additional Permission. +You have permission to propagate output of Autoconf, even if such propagation +would otherwise violate the terms of GPLv3. However, if by modifying Autoconf +you cause any Ineligible Code of the version you received to become Normally +Copied Code of your modified version, then you void this Exception for the +resulting covered work. If you convey that resulting covered work, you must +remove this Exception in accordance with the second paragraph of Section 7 of +GPLv3. + +2. No Weakening of Autoconf Copyleft. +The availability of this Exception does not imply any general presumption that +third-party software is unaffected by the copyleft requirements of the license +of Autoconf. + +-------------------------------------------------------------------- +License for Autotools + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +Autoconf Exception + +As a special exception, the Free Software Foundation gives unlimited +permission to copy, distribute and modify the configure scripts that are the +output of Autoconf. You need not follow the terms of the GNU General Public +License when using or distributing such scripts, even though portions of the +text of Autoconf appear in them. The GNU General Public License (GPL) does +govern all other use of the material that constitutes the Autoconf program. + +Certain portions of the Autoconf source text are designed to be copied (in +certain cases, depending on the input) into the output of Autoconf. We call +these the "data" portions. The rest of the Autoconf source text consists of +comments plus executable code that decides which of the data portions to +output in any given case. We call these comments and executable code the "non- +data" portions. Autoconf never copies any of the non-data portions into its +output. + +This special exception to the GPL applies to versions of Autoconf released by +the Free Software Foundation. When you make and distribute a modified version +of Autoconf, you may extend this special exception to the GPL to apply to your +modified version as well, *unless* your modified version has the potential to +copy into its output some of the text that was the non-data portion of the +version that you started with. (In other words, unless your change moves or +copies text from the non-data portions to the data portions.) If your +modification has such potential, you must delete any notice of this special +exception to the GPL from your modified version. + + diff --git a/shared/sentry/external/breakpad/Makefile.am b/shared/sentry/src/external/breakpad/Makefile.am similarity index 94% rename from shared/sentry/external/breakpad/Makefile.am rename to shared/sentry/src/external/breakpad/Makefile.am index 0f571bcfa..06f34ce84 100644 --- a/shared/sentry/external/breakpad/Makefile.am +++ b/shared/sentry/src/external/breakpad/Makefile.am @@ -118,6 +118,22 @@ TEST_LIBS = src/testing/libtesting.a TEST_DEPS = $(TEST_LIBS) endif + +## Setup test driver +if ANDROID_HOST +# Since Autotools 1.2, tests are run through a special "test driver" script. +# Unfortunately, it's not possible anymore to specify an alternative shell to +# run them on connected devices, so use a slightly modified version of the +# driver for Android. +LOG_DRIVER = $(top_srcdir)/android/test-driver +else +if TESTS_AS_ROOT +LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver +else +LOG_DRIVER = $(top_srcdir)/autotools/test-driver +endif !TESTS_AS_ROOT +endif !ANDROID_HOST + ## Libraries check_LIBRARIES = noinst_LIBRARIES = @@ -125,13 +141,16 @@ lib_LIBRARIES = libexec_PROGRAMS = bin_PROGRAMS = check_PROGRAMS = +noinst_PROGRAMS = +noinst_SCRIPTS = EXTRA_PROGRAMS = CLEANFILES = -check_LIBRARIES += src/testing/libtesting.a -check_PROGRAMS += src/common/safe_math_unittest - +# +# Tests helper library +# if !SYSTEM_TEST_LIBS +check_LIBRARIES += src/testing/libtesting.a src_testing_libtesting_a_SOURCES = \ src/breakpad_googletest_includes.h \ src/testing/googletest/src/gtest-all.cc \ @@ -141,60 +160,175 @@ src_testing_libtesting_a_CPPFLAGS = \ $(AM_CPPFLAGS) $(TEST_CFLAGS) endif +# +# General +# Not specific to processor, client or tools +# + +check_PROGRAMS += src/common/safe_math_unittest + + +# +# Breakpad minidump and microdump +# processor library, tools and tests +# if !DISABLE_PROCESSOR + lib_LIBRARIES += src/libbreakpad.a pkgconfig_DATA += breakpad.pc noinst_LIBRARIES += src/third_party/libdisasm/libdisasm.a -endif +## Programs +bin_PROGRAMS += \ + src/processor/microdump_stackwalk \ + src/processor/minidump_dump \ + src/processor/minidump_stackwalk + +## Tests (binaries) +check_PROGRAMS += \ + src/common/test_assembler_unittest \ + src/common/dwarf/dwarf2reader_lineinfo_unittest \ + src/common/dwarf/dwarf2reader_splitfunctions_unittest \ + src/processor/address_map_unittest \ + src/processor/basic_source_line_resolver_unittest \ + src/processor/cfi_frame_info_unittest \ + src/processor/contained_range_map_unittest \ + src/processor/disassembler_x86_unittest \ + src/processor/exploitability_unittest \ + src/processor/fast_source_line_resolver_unittest \ + src/processor/map_serializers_unittest \ + src/processor/microdump_processor_unittest \ + src/processor/minidump_processor_unittest \ + src/processor/minidump_unittest \ + src/processor/static_address_map_unittest \ + src/processor/static_contained_range_map_unittest \ + src/processor/static_map_unittest \ + src/processor/static_range_map_unittest \ + src/processor/pathname_stripper_unittest \ + src/processor/postfix_evaluator_unittest \ + src/processor/proc_maps_linux_unittest \ + src/processor/range_map_truncate_lower_unittest \ + src/processor/range_map_truncate_upper_unittest \ + src/processor/range_map_unittest \ + src/processor/stackwalker_amd64_unittest \ + src/processor/stackwalker_arm_unittest \ + src/processor/stackwalker_arm64_unittest \ + src/processor/stackwalker_address_list_unittest \ + src/processor/stackwalker_mips_unittest \ + src/processor/stackwalker_mips64_unittest \ + src/processor/stackwalker_riscv_unittest \ + src/processor/stackwalker_riscv64_unittest \ + src/processor/stackwalker_x86_unittest \ + src/processor/synth_minidump_unittest +if LINUX_HOST +check_PROGRAMS += \ + src/processor/disassembler_objdump_unittest \ + src/common/linux/scoped_pipe_unittest \ + src/common/linux/scoped_tmpfile_unittest +endif LINUX_HOST +if SELFTEST +check_PROGRAMS += \ + src/processor/stackwalker_selftest +endif SELFTEST + +## Tests (scripts) +check_SCRIPTS = \ + src/processor/microdump_stackwalk_test \ + src/processor/microdump_stackwalk_machine_readable_test \ + src/processor/minidump_dump_test \ + src/processor/minidump_stackwalk_test \ + src/processor/minidump_stackwalk_machine_readable_test + +endif !DISABLE_PROCESSOR + + +# +# Breakpad client library and tests +# +# Currently Linux only, the macOS client +# is built using an Xcode project instead. +# if LINUX_HOST + lib_LIBRARIES += src/client/linux/libbreakpad_client.a pkgconfig_DATA += breakpad-client.pc -src_client_linux_libbreakpad_client_a_SOURCES = \ - src/client/linux/crash_generation/crash_generation_client.cc \ - src/client/linux/crash_generation/crash_generation_server.cc \ - src/client/linux/dump_writer_common/thread_info.cc \ - src/client/linux/dump_writer_common/ucontext_reader.cc \ - src/client/linux/handler/exception_handler.cc \ - src/client/linux/handler/exception_handler.h \ - src/client/linux/handler/minidump_descriptor.cc \ - src/client/linux/handler/minidump_descriptor.h \ - src/client/linux/log/log.cc \ - src/client/linux/log/log.h \ - src/client/linux/microdump_writer/microdump_writer.cc \ - src/client/linux/microdump_writer/microdump_writer.h \ - src/client/linux/minidump_writer/linux_core_dumper.cc \ - src/client/linux/minidump_writer/linux_dumper.cc \ - src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ - src/client/linux/minidump_writer/minidump_writer.cc \ - src/client/linux/minidump_writer/pe_file.cc \ - src/client/minidump_file_writer-inl.h \ - src/client/minidump_file_writer.cc \ - src/client/minidump_file_writer.h \ - src/common/convert_UTF.cc \ - src/common/convert_UTF.h \ - src/common/md5.cc \ - src/common/md5.h \ - src/common/string_conversion.cc \ - src/common/string_conversion.h \ - src/common/linux/elf_core_dump.cc \ - src/common/linux/elfutils.cc \ - src/common/linux/elfutils.h \ - src/common/linux/file_id.cc \ - src/common/linux/file_id.h \ - src/common/linux/guid_creator.cc \ - src/common/linux/guid_creator.h \ - src/common/linux/linux_libc_support.cc \ - src/common/linux/memory_mapped_file.cc \ - src/common/linux/safe_readlink.cc -if !HAVE_GETCONTEXT -src_client_linux_libbreakpad_client_a_SOURCES += \ - src/common/linux/breakpad_getcontext.S +check_PROGRAMS += \ + src/client/linux/linux_client_unittest \ + src/common/linux/google_crashdump_uploader_test + +EXTRA_PROGRAMS += \ + src/client/linux/linux_dumper_unittest_helper \ + src/client/linux/linux_client_unittest_shlib + +CLEANFILES += \ + src/client/linux/linux_dumper_unittest_helper \ + src/client/linux/linux_client_unittest_shlib + +endif LINUX_HOST + + +# +# Various Breakpad tools +# This includes symbol dumpers and uploaders +# +if !DISABLE_TOOLS + +if LINUX_HOST + +bin_PROGRAMS += \ + src/tools/linux/core2md/core2md \ + src/tools/linux/pid2md/pid2md \ + src/tools/linux/dump_syms/dump_syms \ + src/tools/linux/md2core/minidump-2-core \ + src/tools/linux/symupload/minidump_upload \ + src/tools/linux/symupload/sym_upload +if X86_HOST +bin_PROGRAMS += \ + src/tools/mac/dump_syms/dump_syms_mac +endif +if HAVE_MEMFD_CREATE +libexec_PROGRAMS += \ + src/tools/linux/core_handler/core_handler endif + +check_PROGRAMS += \ + src/common/dumper_unittest \ + src/tools/linux/md2core/minidump_2_core_unittest +if X86_HOST +check_PROGRAMS += \ + src/common/mac/macho_reader_unittest +endif + endif LINUX_HOST -if !DISABLE_PROCESSOR +endif !DISABLE_TOOLS + +TESTS = $(check_PROGRAMS) $(check_SCRIPTS) + +## Non-installables +noinst_SCRIPTS += $(check_SCRIPTS) + + +## Target definitions + +# All targets that were defined above should now be +# declared below. This should be done unconditionally +# so DO NOT wrap them in conditions! +# Execept for conditionally adding a specific file or +# flag that should only be added for a specific arch, +# system, etc. + +src_common_safe_math_unittest_SOURCES = \ + src/common/safe_math.h \ + src/common/safe_math_unittest.cc +src_common_safe_math_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_safe_math_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +# Breakpad processor library src_libbreakpad_a_SOURCES = \ src/google_breakpad/common/breakpad_types.h \ src/google_breakpad/common/minidump_format.h \ @@ -237,8 +371,6 @@ src_libbreakpad_a_SOURCES = \ src/processor/contained_range_map.h \ src/processor/convert_old_arm64_context.cc \ src/processor/convert_old_arm64_context.h \ - src/processor/disassembler_objdump.h \ - src/processor/disassembler_objdump.cc \ src/processor/disassembler_x86.h \ src/processor/disassembler_x86.cc \ src/processor/dump_context.cc \ @@ -320,7 +452,17 @@ src_libbreakpad_a_SOURCES = \ src/processor/symbolic_constants_win.h \ src/processor/tokenize.cc \ src/processor/tokenize.h +if LINUX_HOST +src_libbreakpad_a_SOURCES += \ + src/common/linux/scoped_pipe.h \ + src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/processor/disassembler_objdump.h \ + src/processor/disassembler_objdump.cc +endif +# libdisasm 3rd party library src_third_party_libdisasm_libdisasm_a_SOURCES = \ src/third_party/libdisasm/ia32_implicit.c \ src/third_party/libdisasm/ia32_implicit.h \ @@ -349,134 +491,50 @@ src_third_party_libdisasm_libdisasm_a_SOURCES = \ src/third_party/libdisasm/x86_operand_list.c \ src/third_party/libdisasm/x86_operand_list.h -## Programs -bin_PROGRAMS += \ - src/processor/microdump_stackwalk \ - src/processor/minidump_dump \ - src/processor/minidump_stackwalk -endif !DISABLE_PROCESSOR - -if LINUX_HOST -EXTRA_PROGRAMS += \ - src/client/linux/linux_dumper_unittest_helper -CLEANFILES += \ - src/client/linux/linux_dumper_unittest_helper - -if !DISABLE_TOOLS -bin_PROGRAMS += \ - src/tools/linux/core2md/core2md \ - src/tools/linux/pid2md/pid2md \ - src/tools/linux/dump_syms/dump_syms \ - src/tools/linux/md2core/minidump-2-core \ - src/tools/linux/symupload/minidump_upload \ - src/tools/linux/symupload/sym_upload -if X86_HOST -bin_PROGRAMS += \ - src/tools/mac/dump_syms/dump_syms_mac -endif -if HAVE_MEMFD_CREATE -libexec_PROGRAMS += \ - src/tools/linux/core_handler/core_handler -endif -endif -endif LINUX_HOST - - -## Tests -if !DISABLE_PROCESSOR -check_PROGRAMS += \ - src/common/test_assembler_unittest \ - src/common/dwarf/dwarf2reader_lineinfo_unittest \ - src/common/dwarf/dwarf2reader_splitfunctions_unittest \ - src/processor/address_map_unittest \ - src/processor/basic_source_line_resolver_unittest \ - src/processor/cfi_frame_info_unittest \ - src/processor/contained_range_map_unittest \ - src/processor/disassembler_objdump_unittest \ - src/processor/disassembler_x86_unittest \ - src/processor/exploitability_unittest \ - src/processor/fast_source_line_resolver_unittest \ - src/processor/map_serializers_unittest \ - src/processor/microdump_processor_unittest \ - src/processor/minidump_processor_unittest \ - src/processor/minidump_unittest \ - src/processor/static_address_map_unittest \ - src/processor/static_contained_range_map_unittest \ - src/processor/static_map_unittest \ - src/processor/static_range_map_unittest \ - src/processor/pathname_stripper_unittest \ - src/processor/postfix_evaluator_unittest \ - src/processor/proc_maps_linux_unittest \ - src/processor/range_map_truncate_lower_unittest \ - src/processor/range_map_truncate_upper_unittest \ - src/processor/range_map_unittest \ - src/processor/stackwalker_amd64_unittest \ - src/processor/stackwalker_arm_unittest \ - src/processor/stackwalker_arm64_unittest \ - src/processor/stackwalker_address_list_unittest \ - src/processor/stackwalker_mips_unittest \ - src/processor/stackwalker_mips64_unittest \ - src/processor/stackwalker_riscv_unittest \ - src/processor/stackwalker_riscv64_unittest \ - src/processor/stackwalker_x86_unittest \ - src/processor/synth_minidump_unittest -endif - -if LINUX_HOST -EXTRA_PROGRAMS += \ - src/client/linux/linux_client_unittest_shlib -CLEANFILES += \ - src/client/linux/linux_client_unittest_shlib - -check_PROGRAMS += \ - src/client/linux/linux_client_unittest \ - src/common/linux/google_crashdump_uploader_test - -if !DISABLE_TOOLS -check_PROGRAMS += \ - src/common/dumper_unittest \ - src/tools/linux/md2core/minidump_2_core_unittest -if X86_HOST -check_PROGRAMS += \ - src/common/mac/macho_reader_unittest -endif -endif -endif LINUX_HOST - -if !DISABLE_PROCESSOR -if SELFTEST -check_PROGRAMS += \ - src/processor/stackwalker_selftest -endif SELFTEST -endif !DISABLE_PROCESSOR - -if !DISABLE_PROCESSOR -check_SCRIPTS = \ - src/processor/microdump_stackwalk_test \ - src/processor/microdump_stackwalk_machine_readable_test \ - src/processor/minidump_dump_test \ - src/processor/minidump_stackwalk_test \ - src/processor/minidump_stackwalk_machine_readable_test +# Breakpad client +src_client_linux_libbreakpad_client_a_SOURCES = \ + src/client/linux/crash_generation/crash_generation_client.cc \ + src/client/linux/crash_generation/crash_generation_server.cc \ + src/client/linux/dump_writer_common/thread_info.cc \ + src/client/linux/dump_writer_common/ucontext_reader.cc \ + src/client/linux/handler/exception_handler.cc \ + src/client/linux/handler/exception_handler.h \ + src/client/linux/handler/minidump_descriptor.cc \ + src/client/linux/handler/minidump_descriptor.h \ + src/client/linux/log/log.cc \ + src/client/linux/log/log.h \ + src/client/linux/microdump_writer/microdump_writer.cc \ + src/client/linux/microdump_writer/microdump_writer.h \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_dumper.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ + src/client/linux/minidump_writer/minidump_writer.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/minidump_file_writer-inl.h \ + src/client/minidump_file_writer.cc \ + src/client/minidump_file_writer.h \ + src/common/convert_UTF.cc \ + src/common/convert_UTF.h \ + src/common/md5.cc \ + src/common/md5.h \ + src/common/string_conversion.cc \ + src/common/string_conversion.h \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/elfutils.cc \ + src/common/linux/elfutils.h \ + src/common/linux/file_id.cc \ + src/common/linux/file_id.h \ + src/common/linux/guid_creator.cc \ + src/common/linux/guid_creator.h \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc +if !HAVE_GETCONTEXT +src_client_linux_libbreakpad_client_a_SOURCES += \ + src/common/linux/breakpad_getcontext.S endif -TESTS = $(check_PROGRAMS) $(check_SCRIPTS) - -if ANDROID_HOST -# Since Autotools 1.2, tests are run through a special "test driver" script. -# Unfortunately, it's not possible anymore to specify an alternative shell to -# run them on connected devices, so use a slightly modified version of the -# driver for Android. -LOG_DRIVER = $(top_srcdir)/android/test-driver -else -# The default Autotools test driver script. -if TESTS_AS_ROOT -LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver -else -LOG_DRIVER = $(top_srcdir)/autotools/test-driver -endif !TESTS_AS_ROOT -endif !ANDROID_HOST - -if LINUX_HOST +# Client tests src_client_linux_linux_dumper_unittest_helper_SOURCES = \ src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc src_client_linux_linux_dumper_unittest_helper_LDFLAGS=$(PTHREAD_CFLAGS) @@ -505,7 +563,10 @@ src_client_linux_linux_client_unittest_shlib_SOURCES = \ src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc \ src/common/linux/elf_core_dump.cc \ src/common/linux/linux_libc_support_unittest.cc \ - src/common/linux/tests/auto_testfile.h \ + src/common/linux/scoped_pipe.h \ + src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ src/common/linux/tests/crash_generator.cc \ src/common/memory_allocator_unittest.cc \ src/common/tests/auto_tempdir.h \ @@ -584,7 +645,8 @@ src_client_linux_linux_client_unittest_LDADD = \ src_client_linux_linux_client_unittest_DEPENDENCIES = \ src/client/linux/linux_client_unittest_shlib -if !DISABLE_TOOLS +# Tools + src_tools_linux_core2md_core2md_SOURCES = \ src/tools/linux/core2md/core2md.cc @@ -592,14 +654,12 @@ src_tools_linux_core2md_core2md_LDADD = \ src/client/linux/libbreakpad_client.a \ src/common/path_helper.o -if HAVE_MEMFD_CREATE src_tools_linux_core_handler_core_handler_SOURCES = \ src/tools/linux/core_handler/core_handler.cc src_tools_linux_core_handler_core_handler_LDADD = \ src/client/linux/libbreakpad_client.a \ src/common/path_helper.o -endif src_tools_linux_pid2md_pid2md_SOURCES = \ src/tools/linux/pid2md/pid2md.cc @@ -634,9 +694,12 @@ src_tools_linux_dump_syms_dump_syms_SOURCES = \ src/common/linux/safe_readlink.cc \ src/tools/linux/dump_syms/dump_syms.cc src_tools_linux_dump_syms_dump_syms_CXXFLAGS = \ - $(RUSTC_DEMANGLE_CFLAGS) + $(RUSTC_DEMANGLE_CFLAGS) \ + $(ZSTD_CFLAGS) src_tools_linux_dump_syms_dump_syms_LDADD = \ - $(RUSTC_DEMANGLE_LIBS) + $(RUSTC_DEMANGLE_LIBS) \ + $(ZSTD_CFLAGS) \ + -lz src_tools_linux_md2core_minidump_2_core_SOURCES = \ src/common/linux/memory_mapped_file.cc \ @@ -699,15 +762,6 @@ src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS= \ src_tools_mac_dump_syms_dump_syms_mac_LDADD= \ $(RUSTC_DEMANGLE_LIBS) -src_common_safe_math_unittest_SOURCES = \ - src/common/safe_math.h \ - src/common/safe_math_unittest.cc -src_common_safe_math_unittest_CPPFLAGS = \ - $(AM_CPPFLAGS) $(TEST_CFLAGS) -src_common_safe_math_unittest_LDADD = \ - $(TEST_LIBS) \ - $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - src_common_dumper_unittest_SOURCES = \ src/common/byte_cursor_unittest.cc \ src/common/convert_UTF.cc \ @@ -769,11 +823,14 @@ src_common_dumper_unittest_SOURCES = \ src_common_dumper_unittest_CPPFLAGS = \ $(AM_CPPFLAGS) $(TEST_CFLAGS) \ $(RUSTC_DEMANGLE_CFLAGS) \ - $(PTHREAD_CFLAGS) + $(PTHREAD_CFLAGS) \ + $(ZSTD_CFLAGS) src_common_dumper_unittest_LDADD = \ $(TEST_LIBS) \ $(RUSTC_DEMANGLE_LIBS) \ - $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(ZSTD_LIBS) \ + -lz src_common_mac_macho_reader_unittest_SOURCES = \ src/common/dwarf_cfi_to_module.cc \ @@ -807,7 +864,6 @@ src_common_mac_macho_reader_unittest_CPPFLAGS = \ src_common_mac_macho_reader_unittest_LDADD = \ $(TEST_LIBS) \ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) -endif src_common_linux_google_crashdump_uploader_test_SOURCES = \ src/common/linux/google_crashdump_uploader.cc \ @@ -828,9 +884,6 @@ src_tools_linux_md2core_minidump_2_core_unittest_LDADD = \ $(TEST_LIBS) \ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) -endif LINUX_HOST - -if !DISABLE_PROCESSOR src_processor_address_map_unittest_SOURCES = \ src/processor/address_map_unittest.cc src_processor_address_map_unittest_LDADD = \ @@ -876,7 +929,6 @@ src_processor_exploitability_unittest_LDADD = \ src/processor/convert_old_arm64_context.o \ src/processor/minidump_processor.o \ src/processor/process_state.o \ - src/processor/disassembler_objdump.o \ src/processor/disassembler_x86.o \ src/processor/exploitability.o \ src/processor/exploitability_linux.o \ @@ -912,12 +964,38 @@ src_processor_exploitability_unittest_LDADD = \ src/third_party/libdisasm/libdisasm.a \ $(TEST_LIBS) \ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_exploitability_unittest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif + +src_common_linux_scoped_pipe_unittest_SOURCES = \ + src/common/linux/scoped_pipe_unittest.cc +src_common_linux_scoped_pipe_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_linux_scoped_pipe_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_linux_scoped_tmpfile_unittest_SOURCES = \ + src/common/linux/scoped_tmpfile_unittest.cc +src_common_linux_scoped_tmpfile_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_linux_scoped_tmpfile_unittest_LDADD = \ + src/common/linux/scoped_tmpfile.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) src_processor_disassembler_objdump_unittest_SOURCES = \ src/processor/disassembler_objdump_unittest.cc src_processor_disassembler_objdump_unittest_CPPFLAGS = \ $(AM_CPPFLAGS) $(TEST_CFLAGS) src_processor_disassembler_objdump_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ src/processor/disassembler_objdump.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ @@ -998,6 +1076,12 @@ src_processor_microdump_processor_unittest_LDADD = \ src/processor/tokenize.o \ $(TEST_LIBS) \ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_microdump_processor_unittest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif src_processor_minidump_processor_unittest_SOURCES = \ src/processor/minidump_processor_unittest.cc @@ -1009,7 +1093,6 @@ src_processor_minidump_processor_unittest_LDADD = \ src/processor/call_stack.o \ src/processor/cfi_frame_info.o \ src/processor/convert_old_arm64_context.o \ - src/processor/disassembler_objdump.o \ src/processor/disassembler_x86.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ @@ -1042,6 +1125,12 @@ src_processor_minidump_processor_unittest_LDADD = \ src/third_party/libdisasm/libdisasm.a \ $(TEST_LIBS) \ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_minidump_processor_unittest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif src_processor_minidump_unittest_SOURCES = \ src/common/test_assembler.cc \ @@ -1159,7 +1248,6 @@ src_processor_stackwalker_selftest_LDADD = \ src/processor/basic_code_modules.o \ src/processor/basic_source_line_resolver.o \ src/processor/call_stack.o \ - src/processor/disassembler_objdump.o \ src/processor/disassembler_x86.o \ src/processor/exploitability.o \ src/processor/exploitability_linux.o \ @@ -1185,6 +1273,12 @@ src_processor_stackwalker_selftest_LDADD = \ src/processor/stackwalker_x86.o \ src/processor/tokenize.o \ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_stackwalker_selftest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif src_processor_stackwalker_amd64_unittest_SOURCES = \ src/common/test_assembler.cc \ @@ -1322,10 +1416,6 @@ src_common_dwarf_dwarf2reader_splitfunctions_unittest_LDADD = \ $(TEST_LIBS) \ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) -## Non-installables -noinst_PROGRAMS = -noinst_SCRIPTS = $(check_SCRIPTS) - src_processor_minidump_dump_SOURCES = \ src/processor/minidump_dump.cc src_processor_minidump_dump_LDADD = \ @@ -1375,6 +1465,12 @@ src_processor_microdump_stackwalk_LDADD = \ src/processor/stackwalker_x86.o \ src/processor/tokenize.o \ src/third_party/libdisasm/libdisasm.a +if LINUX_HOST +src_processor_microdump_stackwalk_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif src_processor_minidump_stackwalk_SOURCES = \ src/processor/minidump_stackwalk.cc @@ -1385,7 +1481,6 @@ src_processor_minidump_stackwalk_LDADD = \ src/processor/call_stack.o \ src/processor/cfi_frame_info.o \ src/processor/convert_old_arm64_context.o \ - src/processor/disassembler_objdump.o \ src/processor/disassembler_x86.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ @@ -1418,8 +1513,12 @@ src_processor_minidump_stackwalk_LDADD = \ src/processor/symbolic_constants_win.o \ src/processor/tokenize.o \ src/third_party/libdisasm/libdisasm.a - -endif !DISABLE_PROCESSOR +if LINUX_HOST +src_processor_minidump_stackwalk_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif LINUX_HOST ## Additional files to be included in a source distribution ## @@ -1464,13 +1563,10 @@ EXTRA_DIST = \ src/client/solaris/handler/minidump_test.cc \ src/client/solaris/handler/solaris_lwp.cc \ src/client/solaris/handler/solaris_lwp.h \ - src/client/windows/breakpad_client.gyp \ src/client/windows/handler/exception_handler.cc \ src/client/windows/handler/exception_handler.h \ - src/client/windows/handler/exception_handler.gyp \ src/client/windows/sender/crash_report_sender.cc \ src/client/windows/sender/crash_report_sender.h \ - src/client/windows/sender/crash_report_sender.gyp \ src/common/dwarf/dwarf2diehandler.h \ src/common/dwarf/dwarf2enums.h \ src/common/dwarf/line_state_machine.h \ @@ -1640,10 +1736,12 @@ EXTRA_DIST = \ src/third_party/curl/typecheck-gcc.h \ src/third_party/curl/types.h \ src/third_party/mac_headers/architecture/byte_order.h \ + src/third_party/mac_headers/arm/_types.h \ src/third_party/mac_headers/i386/_types.h \ src/third_party/mac_headers/mach/boolean.h \ + src/third_party/mac_headers/mach/arm/boolean.h \ + src/third_party/mac_headers/mach/arm/vm_types.h \ src/third_party/mac_headers/mach/i386/boolean.h \ - src/third_party/mac_headers/mach/i386/vm_param.h \ src/third_party/mac_headers/mach/i386/vm_types.h \ src/third_party/mac_headers/mach/machine/boolean.h \ src/third_party/mac_headers/mach/machine.h \ @@ -1680,9 +1778,7 @@ EXTRA_DIST = \ src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym \ src/tools/windows/converter/ms_symbol_server_converter.cc \ src/tools/windows/converter/ms_symbol_server_converter.h \ - src/tools/windows/converter/ms_symbol_server_converter.gyp \ src/tools/windows/dump_syms/dump_syms.cc \ - src/tools/windows/dump_syms/dump_syms.gyp \ src/tools/windows/dump_syms/run_regtest.sh \ src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc \ src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb \ @@ -1692,8 +1788,7 @@ EXTRA_DIST = \ src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym \ src/tools/windows/dump_syms/testdata/omap_stretched.sym \ src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym \ - src/tools/windows/symupload/symupload.cc \ - src/tools/windows/symupload/symupload.gyp + src/tools/windows/symupload/symupload.cc mostlyclean-local: -find src -name '*.dwo' -exec rm -f {} + diff --git a/shared/sentry/external/breakpad/Makefile.in b/shared/sentry/src/external/breakpad/Makefile.in similarity index 87% rename from shared/sentry/external/breakpad/Makefile.in rename to shared/sentry/src/external/breakpad/Makefile.in index 0d0ccba2c..0c47bf87d 100644 --- a/shared/sentry/external/breakpad/Makefile.in +++ b/shared/sentry/src/external/breakpad/Makefile.in @@ -131,44 +131,32 @@ host_triplet = @host@ # Build as PIC on Linux, for linux_client_unittest_shlib @LINUX_HOST_TRUE@am__append_2 = -fPIC @LINUX_HOST_TRUE@am__append_3 = -fPIC -libexec_PROGRAMS = $(am__EXEEXT_10) +libexec_PROGRAMS = $(am__EXEEXT_11) bin_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) check_PROGRAMS = src/common/safe_math_unittest$(EXEEXT) \ $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \ - $(am__EXEEXT_8) $(am__EXEEXT_9) + $(am__EXEEXT_8) $(am__EXEEXT_9) $(am__EXEEXT_10) +noinst_PROGRAMS = EXTRA_PROGRAMS = $(am__EXEEXT_1) -@DISABLE_PROCESSOR_FALSE@am__append_4 = src/libbreakpad.a -@DISABLE_PROCESSOR_FALSE@am__append_5 = breakpad.pc -@DISABLE_PROCESSOR_FALSE@am__append_6 = src/third_party/libdisasm/libdisasm.a -@LINUX_HOST_TRUE@am__append_7 = src/client/linux/libbreakpad_client.a -@LINUX_HOST_TRUE@am__append_8 = breakpad-client.pc -@HAVE_GETCONTEXT_FALSE@@LINUX_HOST_TRUE@am__append_9 = \ -@HAVE_GETCONTEXT_FALSE@@LINUX_HOST_TRUE@ src/common/linux/breakpad_getcontext.S - -@DISABLE_PROCESSOR_FALSE@am__append_10 = \ + +# +# Tests helper library +# +@SYSTEM_TEST_LIBS_FALSE@am__append_4 = src/testing/libtesting.a + +# +# Breakpad minidump and microdump +# processor library, tools and tests +# +@DISABLE_PROCESSOR_FALSE@am__append_5 = src/libbreakpad.a +@DISABLE_PROCESSOR_FALSE@am__append_6 = breakpad.pc +@DISABLE_PROCESSOR_FALSE@am__append_7 = src/third_party/libdisasm/libdisasm.a +@DISABLE_PROCESSOR_FALSE@am__append_8 = \ @DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk -@LINUX_HOST_TRUE@am__append_11 = src/client/linux/linux_dumper_unittest_helper \ -@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib -@LINUX_HOST_TRUE@am__append_12 = src/client/linux/linux_dumper_unittest_helper \ -@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_13 = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/core2md/core2md \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/pid2md/pid2md \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__append_14 = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@ src/tools/mac/dump_syms/dump_syms_mac - -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@am__append_15 = \ -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@ src/tools/linux/core_handler/core_handler - -@DISABLE_PROCESSOR_FALSE@am__append_16 = \ +@DISABLE_PROCESSOR_FALSE@am__append_9 = \ @DISABLE_PROCESSOR_FALSE@ src/common/test_assembler_unittest \ @DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_lineinfo_unittest \ @DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_splitfunctions_unittest \ @@ -176,7 +164,6 @@ EXTRA_PROGRAMS = $(am__EXEEXT_1) @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map_unittest \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver_unittest \ @@ -205,29 +192,111 @@ EXTRA_PROGRAMS = $(am__EXEEXT_1) @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest -@LINUX_HOST_TRUE@am__append_17 = \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@am__append_10 = \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/processor/disassembler_objdump_unittest \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe_unittest \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile_unittest + +@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__append_11 = \ +@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@ src/processor/stackwalker_selftest + + +# +# Breakpad client library and tests +# +# Currently Linux only, the macOS client +# is built using an Xcode project instead. +# +@LINUX_HOST_TRUE@am__append_12 = src/client/linux/libbreakpad_client.a +@LINUX_HOST_TRUE@am__append_13 = breakpad-client.pc +@LINUX_HOST_TRUE@am__append_14 = \ @LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest \ @LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader_test -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_18 = \ +@LINUX_HOST_TRUE@am__append_15 = \ +@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper \ +@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib + +@LINUX_HOST_TRUE@am__append_16 = \ +@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper \ +@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib + + +# +# Various Breakpad tools +# This includes symbol dumpers and uploaders +# +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_17 = \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/core2md/core2md \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/pid2md/pid2md \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload + +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__append_18 = \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@ src/tools/mac/dump_syms/dump_syms_mac + +@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@am__append_19 = \ +@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@ src/tools/linux/core_handler/core_handler + +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_20 = \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_2_core_unittest -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__append_19 = \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__append_21 = \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@ src/common/mac/macho_reader_unittest -@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__append_20 = \ -@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@ src/processor/stackwalker_selftest - -@HAVE_GETCONTEXT_FALSE@@LINUX_HOST_TRUE@am__append_21 = src/common/linux/breakpad_getcontext.S \ -@HAVE_GETCONTEXT_FALSE@@LINUX_HOST_TRUE@ src/common/linux/breakpad_getcontext_unittest.cc -@ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@am__append_22 = \ -@ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@ -llog -lm - -@ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@am__append_23 = \ -@ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@ -llog +@LINUX_HOST_TRUE@am__append_22 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.h \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.cc \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.h \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.cc \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.h \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.cc + +@HAVE_GETCONTEXT_FALSE@am__append_23 = \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/breakpad_getcontext.S + +@HAVE_GETCONTEXT_FALSE@am__append_24 = \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/breakpad_getcontext.S \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/breakpad_getcontext_unittest.cc +@ANDROID_HOST_TRUE@am__append_25 = \ +@ANDROID_HOST_TRUE@ -llog -lm + +@ANDROID_HOST_TRUE@am__append_26 = \ +@ANDROID_HOST_TRUE@ -llog + +@LINUX_HOST_TRUE@am__append_27 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_28 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_29 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_30 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_31 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_32 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o -noinst_PROGRAMS = subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ @@ -279,7 +348,6 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver_unittest$(EXEEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info_unittest$(EXEEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map_unittest$(EXEEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump_unittest$(EXEEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86_unittest$(EXEEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest$(EXEEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver_unittest$(EXEEXT) \ @@ -307,13 +375,16 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64_unittest$(EXEEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest$(EXEEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest$(EXEEXT) -@LINUX_HOST_TRUE@am__EXEEXT_6 = src/client/linux/linux_client_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@am__EXEEXT_6 = src/processor/disassembler_objdump_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile_unittest$(EXEEXT) +@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__EXEEXT_7 = src/processor/stackwalker_selftest$(EXEEXT) +@LINUX_HOST_TRUE@am__EXEEXT_8 = src/client/linux/linux_client_unittest$(EXEEXT) \ @LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader_test$(EXEEXT) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__EXEEXT_7 = src/common/dumper_unittest$(EXEEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__EXEEXT_9 = src/common/dumper_unittest$(EXEEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__EXEEXT_8 = src/common/mac/macho_reader_unittest$(EXEEXT) -@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__EXEEXT_9 = src/processor/stackwalker_selftest$(EXEEXT) -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@am__EXEEXT_10 = src/tools/linux/core_handler/core_handler$(EXEEXT) +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__EXEEXT_10 = src/common/mac/macho_reader_unittest$(EXEEXT) +@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@am__EXEEXT_11 = src/tools/linux/core_handler/core_handler$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ @@ -381,32 +452,30 @@ am__src_client_linux_libbreakpad_client_a_SOURCES_DIST = \ src/common/linux/safe_readlink.cc \ src/common/linux/breakpad_getcontext.S am__dirstamp = $(am__leading_dot)dirstamp -@HAVE_GETCONTEXT_FALSE@@LINUX_HOST_TRUE@am__objects_1 = src/common/linux/breakpad_getcontext.$(OBJEXT) -@LINUX_HOST_TRUE@am_src_client_linux_libbreakpad_client_a_OBJECTS = src/client/linux/crash_generation/crash_generation_client.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_server.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/thread_info.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/ucontext_reader.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/handler/minidump_descriptor.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/log/log.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/microdump_writer.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_core_dumper.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_dumper.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_ptrace_dumper.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/minidump_writer.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/pe_file.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/minidump_file_writer.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/convert_UTF.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/md5.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/string_conversion.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/elf_core_dump.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/elfutils.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/file_id.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/guid_creator.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/linux_libc_support.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/memory_mapped_file.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/safe_readlink.$(OBJEXT) \ -@LINUX_HOST_TRUE@ $(am__objects_1) +@HAVE_GETCONTEXT_FALSE@am__objects_1 = src/common/linux/breakpad_getcontext.$(OBJEXT) +am_src_client_linux_libbreakpad_client_a_OBJECTS = src/client/linux/crash_generation/crash_generation_client.$(OBJEXT) \ + src/client/linux/crash_generation/crash_generation_server.$(OBJEXT) \ + src/client/linux/dump_writer_common/thread_info.$(OBJEXT) \ + src/client/linux/dump_writer_common/ucontext_reader.$(OBJEXT) \ + src/client/linux/handler/exception_handler.$(OBJEXT) \ + src/client/linux/handler/minidump_descriptor.$(OBJEXT) \ + src/client/linux/log/log.$(OBJEXT) \ + src/client/linux/microdump_writer/microdump_writer.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_core_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_ptrace_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/minidump_writer.$(OBJEXT) \ + src/client/linux/minidump_writer/pe_file.$(OBJEXT) \ + src/client/minidump_file_writer.$(OBJEXT) \ + src/common/convert_UTF.$(OBJEXT) src/common/md5.$(OBJEXT) \ + src/common/string_conversion.$(OBJEXT) \ + src/common/linux/elf_core_dump.$(OBJEXT) \ + src/common/linux/elfutils.$(OBJEXT) \ + src/common/linux/file_id.$(OBJEXT) \ + src/common/linux/guid_creator.$(OBJEXT) \ + src/common/linux/linux_libc_support.$(OBJEXT) \ + src/common/linux/memory_mapped_file.$(OBJEXT) \ + src/common/linux/safe_readlink.$(OBJEXT) $(am__objects_1) src_client_linux_libbreakpad_client_a_OBJECTS = \ $(am_src_client_linux_libbreakpad_client_a_OBJECTS) src_libbreakpad_a_AR = $(AR) $(ARFLAGS) @@ -451,8 +520,6 @@ am__src_libbreakpad_a_SOURCES_DIST = \ src/processor/contained_range_map.h \ src/processor/convert_old_arm64_context.cc \ src/processor/convert_old_arm64_context.h \ - src/processor/disassembler_objdump.h \ - src/processor/disassembler_objdump.cc \ src/processor/disassembler_x86.h \ src/processor/disassembler_x86.cc \ src/processor/dump_context.cc src/processor/dump_object.cc \ @@ -523,49 +590,58 @@ am__src_libbreakpad_a_SOURCES_DIST = \ src/processor/static_range_map.h \ src/processor/symbolic_constants_win.cc \ src/processor/symbolic_constants_win.h \ - src/processor/tokenize.cc src/processor/tokenize.h -@DISABLE_PROCESSOR_FALSE@am_src_libbreakpad_a_OBJECTS = src/processor/basic_code_modules.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_comparer.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalk_common.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.$(OBJEXT) + src/processor/tokenize.cc src/processor/tokenize.h \ + src/common/linux/scoped_pipe.h src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/processor/disassembler_objdump.h \ + src/processor/disassembler_objdump.cc +@LINUX_HOST_TRUE@am__objects_2 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.$(OBJEXT) \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.$(OBJEXT) \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.$(OBJEXT) +am_src_libbreakpad_a_OBJECTS = \ + src/processor/basic_code_modules.$(OBJEXT) \ + src/processor/basic_source_line_resolver.$(OBJEXT) \ + src/processor/call_stack.$(OBJEXT) \ + src/processor/cfi_frame_info.$(OBJEXT) \ + src/processor/convert_old_arm64_context.$(OBJEXT) \ + src/processor/disassembler_x86.$(OBJEXT) \ + src/processor/dump_context.$(OBJEXT) \ + src/processor/dump_object.$(OBJEXT) \ + src/processor/exploitability.$(OBJEXT) \ + src/processor/exploitability_linux.$(OBJEXT) \ + src/processor/exploitability_win.$(OBJEXT) \ + src/processor/fast_source_line_resolver.$(OBJEXT) \ + src/processor/logging.$(OBJEXT) \ + src/processor/microdump.$(OBJEXT) \ + src/processor/microdump_processor.$(OBJEXT) \ + src/processor/minidump.$(OBJEXT) \ + src/processor/minidump_processor.$(OBJEXT) \ + src/processor/module_comparer.$(OBJEXT) \ + src/processor/module_serializer.$(OBJEXT) \ + src/processor/pathname_stripper.$(OBJEXT) \ + src/processor/process_state.$(OBJEXT) \ + src/processor/proc_maps_linux.$(OBJEXT) \ + src/processor/simple_symbol_supplier.$(OBJEXT) \ + src/processor/source_line_resolver_base.$(OBJEXT) \ + src/processor/stack_frame_cpu.$(OBJEXT) \ + src/processor/stack_frame_symbolizer.$(OBJEXT) \ + src/processor/stackwalk_common.$(OBJEXT) \ + src/processor/stackwalker.$(OBJEXT) \ + src/processor/stackwalker_amd64.$(OBJEXT) \ + src/processor/stackwalker_arm.$(OBJEXT) \ + src/processor/stackwalker_arm64.$(OBJEXT) \ + src/processor/stackwalker_address_list.$(OBJEXT) \ + src/processor/stackwalker_mips.$(OBJEXT) \ + src/processor/stackwalker_ppc.$(OBJEXT) \ + src/processor/stackwalker_ppc64.$(OBJEXT) \ + src/processor/stackwalker_riscv.$(OBJEXT) \ + src/processor/stackwalker_riscv64.$(OBJEXT) \ + src/processor/stackwalker_sparc.$(OBJEXT) \ + src/processor/stackwalker_x86.$(OBJEXT) \ + src/processor/symbolic_constants_win.$(OBJEXT) \ + src/processor/tokenize.$(OBJEXT) $(am__objects_2) src_libbreakpad_a_OBJECTS = $(am_src_libbreakpad_a_OBJECTS) src_testing_libtesting_a_AR = $(AR) $(ARFLAGS) src_testing_libtesting_a_LIBADD = @@ -581,47 +657,21 @@ src_testing_libtesting_a_OBJECTS = \ $(am_src_testing_libtesting_a_OBJECTS) src_third_party_libdisasm_libdisasm_a_AR = $(AR) $(ARFLAGS) src_third_party_libdisasm_libdisasm_a_LIBADD = -am__src_third_party_libdisasm_libdisasm_a_SOURCES_DIST = \ - src/third_party/libdisasm/ia32_implicit.c \ - src/third_party/libdisasm/ia32_implicit.h \ - src/third_party/libdisasm/ia32_insn.c \ - src/third_party/libdisasm/ia32_insn.h \ - src/third_party/libdisasm/ia32_invariant.c \ - src/third_party/libdisasm/ia32_invariant.h \ - src/third_party/libdisasm/ia32_modrm.c \ - src/third_party/libdisasm/ia32_modrm.h \ - src/third_party/libdisasm/ia32_opcode_tables.c \ - src/third_party/libdisasm/ia32_opcode_tables.h \ - src/third_party/libdisasm/ia32_operand.c \ - src/third_party/libdisasm/ia32_operand.h \ - src/third_party/libdisasm/ia32_reg.c \ - src/third_party/libdisasm/ia32_reg.h \ - src/third_party/libdisasm/ia32_settings.c \ - src/third_party/libdisasm/ia32_settings.h \ - src/third_party/libdisasm/libdis.h \ - src/third_party/libdisasm/qword.h \ - src/third_party/libdisasm/x86_disasm.c \ - src/third_party/libdisasm/x86_format.c \ - src/third_party/libdisasm/x86_imm.c \ - src/third_party/libdisasm/x86_imm.h \ - src/third_party/libdisasm/x86_insn.c \ - src/third_party/libdisasm/x86_misc.c \ - src/third_party/libdisasm/x86_operand_list.c \ - src/third_party/libdisasm/x86_operand_list.h -@DISABLE_PROCESSOR_FALSE@am_src_third_party_libdisasm_libdisasm_a_OBJECTS = src/third_party/libdisasm/ia32_implicit.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_insn.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_invariant.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_modrm.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_opcode_tables.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_operand.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_reg.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_settings.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_disasm.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_format.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_imm.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_insn.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_misc.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_operand_list.$(OBJEXT) +am_src_third_party_libdisasm_libdisasm_a_OBJECTS = \ + src/third_party/libdisasm/ia32_implicit.$(OBJEXT) \ + src/third_party/libdisasm/ia32_insn.$(OBJEXT) \ + src/third_party/libdisasm/ia32_invariant.$(OBJEXT) \ + src/third_party/libdisasm/ia32_modrm.$(OBJEXT) \ + src/third_party/libdisasm/ia32_opcode_tables.$(OBJEXT) \ + src/third_party/libdisasm/ia32_operand.$(OBJEXT) \ + src/third_party/libdisasm/ia32_reg.$(OBJEXT) \ + src/third_party/libdisasm/ia32_settings.$(OBJEXT) \ + src/third_party/libdisasm/x86_disasm.$(OBJEXT) \ + src/third_party/libdisasm/x86_format.$(OBJEXT) \ + src/third_party/libdisasm/x86_imm.$(OBJEXT) \ + src/third_party/libdisasm/x86_insn.$(OBJEXT) \ + src/third_party/libdisasm/x86_misc.$(OBJEXT) \ + src/third_party/libdisasm/x86_operand_list.$(OBJEXT) src_third_party_libdisasm_libdisasm_a_OBJECTS = \ $(am_src_third_party_libdisasm_libdisasm_a_OBJECTS) am_src_client_linux_linux_client_unittest_OBJECTS = @@ -653,7 +703,9 @@ am__src_client_linux_linux_client_unittest_shlib_SOURCES_DIST = \ src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc \ src/common/linux/elf_core_dump.cc \ src/common/linux/linux_libc_support_unittest.cc \ - src/common/linux/tests/auto_testfile.h \ + src/common/linux/scoped_pipe.h src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ src/common/linux/tests/crash_generator.cc \ src/common/memory_allocator_unittest.cc \ src/common/tests/auto_tempdir.h src/common/tests/file_utils.cc \ @@ -666,47 +718,48 @@ am__src_client_linux_linux_client_unittest_shlib_SOURCES_DIST = \ src/processor/proc_maps_linux.cc \ src/common/linux/breakpad_getcontext.S \ src/common/linux/breakpad_getcontext_unittest.cc -@SYSTEM_TEST_LIBS_FALSE@am__objects_2 = src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.$(OBJEXT) \ +@SYSTEM_TEST_LIBS_FALSE@am__objects_3 = src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.$(OBJEXT) \ @SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.$(OBJEXT) \ @SYSTEM_TEST_LIBS_FALSE@ src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.$(OBJEXT) -@HAVE_GETCONTEXT_FALSE@@LINUX_HOST_TRUE@am__objects_3 = src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.$(OBJEXT) \ -@HAVE_GETCONTEXT_FALSE@@LINUX_HOST_TRUE@ src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.$(OBJEXT) -@LINUX_HOST_TRUE@am_src_client_linux_linux_client_unittest_shlib_OBJECTS = \ -@LINUX_HOST_TRUE@ $(am__objects_2) \ -@LINUX_HOST_TRUE@ src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-dump_context.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-dump_object.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-logging.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-minidump.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.$(OBJEXT) \ -@LINUX_HOST_TRUE@ $(am__objects_3) +@HAVE_GETCONTEXT_FALSE@am__objects_4 = src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.$(OBJEXT) \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.$(OBJEXT) +am_src_client_linux_linux_client_unittest_shlib_OBJECTS = \ + $(am__objects_3) \ + src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.$(OBJEXT) \ + src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.$(OBJEXT) \ + src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.$(OBJEXT) \ + src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.$(OBJEXT) \ + src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-dump_context.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-dump_object.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-logging.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-minidump.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.$(OBJEXT) \ + $(am__objects_4) src_client_linux_linux_client_unittest_shlib_OBJECTS = \ $(am_src_client_linux_linux_client_unittest_shlib_OBJECTS) src_client_linux_linux_client_unittest_shlib_LINK = $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) \ $(src_client_linux_linux_client_unittest_shlib_LDFLAGS) \ $(LDFLAGS) -o $@ -am__src_client_linux_linux_dumper_unittest_helper_SOURCES_DIST = src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc -@LINUX_HOST_TRUE@am_src_client_linux_linux_dumper_unittest_helper_OBJECTS = src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT) +am_src_client_linux_linux_dumper_unittest_helper_OBJECTS = src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT) src_client_linux_linux_dumper_unittest_helper_OBJECTS = \ $(am_src_client_linux_linux_dumper_unittest_helper_OBJECTS) src_client_linux_linux_dumper_unittest_helper_LDADD = $(LDADD) @@ -715,980 +768,664 @@ src_client_linux_linux_dumper_unittest_helper_LINK = $(CXXLD) \ $(CXXFLAGS) \ $(src_client_linux_linux_dumper_unittest_helper_LDFLAGS) \ $(LDFLAGS) -o $@ -am__src_common_dumper_unittest_SOURCES_DIST = \ - src/common/byte_cursor_unittest.cc src/common/convert_UTF.cc \ - src/common/dwarf_cfi_to_module.cc \ - src/common/dwarf_cfi_to_module_unittest.cc \ - src/common/dwarf_cu_to_module.cc \ - src/common/dwarf_cu_to_module_unittest.cc \ - src/common/dwarf_line_to_module.cc \ - src/common/dwarf_line_to_module_unittest.cc \ - src/common/dwarf_range_list_handler.cc src/common/language.cc \ - src/common/memory_range_unittest.cc src/common/module.cc \ - src/common/module_unittest.cc src/common/path_helper.cc \ - src/common/stabs_reader.cc src/common/stabs_reader_unittest.cc \ - src/common/stabs_to_module.cc \ - src/common/stabs_to_module_unittest.cc \ - src/common/string_conversion.cc \ - src/common/string_conversion_unittest.cc \ - src/common/test_assembler.cc src/common/dwarf/bytereader.cc \ - src/common/dwarf/bytereader.h \ - src/common/dwarf/bytereader-inl.h \ - src/common/dwarf/bytereader_unittest.cc \ - src/common/dwarf/cfi_assembler.cc \ - src/common/dwarf/cfi_assembler.h \ - src/common/dwarf/dwarf2diehandler.cc \ - src/common/dwarf/dwarf2diehandler_unittest.cc \ - src/common/dwarf/dwarf2reader.cc \ - src/common/dwarf/dwarf2reader.h src/common/dwarf/elf_reader.cc \ - src/common/dwarf/elf_reader.h \ - src/common/dwarf/dwarf2reader_cfi_unittest.cc \ - src/common/dwarf/dwarf2reader_die_unittest.cc \ - src/common/dwarf/dwarf2reader_test_common.h \ - src/common/linux/crc32.cc src/common/linux/dump_symbols.cc \ - src/common/linux/dump_symbols_unittest.cc \ - src/common/linux/elf_core_dump.cc \ - src/common/linux/elf_core_dump_unittest.cc \ - src/common/linux/elf_symbols_to_module.cc \ - src/common/linux/elf_symbols_to_module_unittest.cc \ - src/common/linux/elfutils.cc src/common/linux/file_id.cc \ - src/common/linux/file_id_unittest.cc \ - src/common/linux/linux_libc_support.cc \ - src/common/linux/memory_mapped_file.cc \ - src/common/linux/memory_mapped_file_unittest.cc \ - src/common/linux/safe_readlink.cc \ - src/common/linux/safe_readlink_unittest.cc \ - src/common/linux/synth_elf.cc \ - src/common/linux/synth_elf_unittest.cc \ - src/common/linux/tests/crash_generator.cc \ - src/common/linux/tests/crash_generator.h \ - src/common/testdata/func-line-pairing.h \ - src/common/tests/file_utils.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_common_dumper_unittest_OBJECTS = src/common/dumper_unittest-byte_cursor_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-convert_UTF.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-dwarf_cfi_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-dwarf_cfi_to_module_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-dwarf_cu_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-dwarf_cu_to_module_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-dwarf_line_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-dwarf_line_to_module_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-dwarf_range_list_handler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-language.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-memory_range_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-module_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-path_helper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-stabs_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-stabs_reader_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-stabs_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-stabs_to_module_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-string_conversion.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-string_conversion_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-bytereader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-bytereader_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-cfi_assembler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-dwarf2diehandler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-dwarf2reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-elf_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-crc32.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-dump_symbols.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-dump_symbols_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-elf_core_dump.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-elf_core_dump_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-elf_symbols_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-elfutils.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-file_id.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-file_id_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-linux_libc_support.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-memory_mapped_file.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-memory_mapped_file_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-safe_readlink.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-safe_readlink_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-synth_elf.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dumper_unittest-synth_elf_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tests/dumper_unittest-crash_generator.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tests/dumper_unittest-file_utils.$(OBJEXT) +am_src_common_dumper_unittest_OBJECTS = \ + src/common/dumper_unittest-byte_cursor_unittest.$(OBJEXT) \ + src/common/dumper_unittest-convert_UTF.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cfi_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cu_to_module.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cu_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_line_to_module.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_line_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_range_list_handler.$(OBJEXT) \ + src/common/dumper_unittest-language.$(OBJEXT) \ + src/common/dumper_unittest-memory_range_unittest.$(OBJEXT) \ + src/common/dumper_unittest-module.$(OBJEXT) \ + src/common/dumper_unittest-module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-path_helper.$(OBJEXT) \ + src/common/dumper_unittest-stabs_reader.$(OBJEXT) \ + src/common/dumper_unittest-stabs_reader_unittest.$(OBJEXT) \ + src/common/dumper_unittest-stabs_to_module.$(OBJEXT) \ + src/common/dumper_unittest-stabs_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-string_conversion.$(OBJEXT) \ + src/common/dumper_unittest-string_conversion_unittest.$(OBJEXT) \ + src/common/dumper_unittest-test_assembler.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-bytereader.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-bytereader_unittest.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-cfi_assembler.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-elf_reader.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-crc32.$(OBJEXT) \ + src/common/linux/dumper_unittest-dump_symbols.$(OBJEXT) \ + src/common/linux/dumper_unittest-dump_symbols_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_core_dump.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_core_dump_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_symbols_to_module.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-elfutils.$(OBJEXT) \ + src/common/linux/dumper_unittest-file_id.$(OBJEXT) \ + src/common/linux/dumper_unittest-file_id_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-linux_libc_support.$(OBJEXT) \ + src/common/linux/dumper_unittest-memory_mapped_file.$(OBJEXT) \ + src/common/linux/dumper_unittest-memory_mapped_file_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-safe_readlink.$(OBJEXT) \ + src/common/linux/dumper_unittest-safe_readlink_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-synth_elf.$(OBJEXT) \ + src/common/linux/dumper_unittest-synth_elf_unittest.$(OBJEXT) \ + src/common/linux/tests/dumper_unittest-crash_generator.$(OBJEXT) \ + src/common/tests/dumper_unittest-file_utils.$(OBJEXT) src_common_dumper_unittest_OBJECTS = \ $(am_src_common_dumper_unittest_OBJECTS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_dumper_unittest_DEPENDENCIES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_2) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) -am__src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES_DIST = \ - src/common/dwarf/dwarf2reader.h \ - src/common/dwarf/dwarf2reader_lineinfo_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS = src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.$(OBJEXT) +src_common_dumper_unittest_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS = src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.$(OBJEXT) src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS = \ $(am_src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_lineinfo_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/bytereader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/elf_reader.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES_DIST = \ - src/common/dwarf/dwarf2reader.h \ - src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS = src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.$(OBJEXT) +src_common_dwarf_dwarf2reader_lineinfo_unittest_DEPENDENCIES = \ + src/common/dwarf/bytereader.o src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS = src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.$(OBJEXT) src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS = $(am_src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_splitfunctions_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/bytereader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/elf_reader.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_common_linux_google_crashdump_uploader_test_SOURCES_DIST = \ - src/common/linux/google_crashdump_uploader.cc \ - src/common/linux/google_crashdump_uploader_test.cc \ - src/common/linux/libcurl_wrapper.cc -@LINUX_HOST_TRUE@am_src_common_linux_google_crashdump_uploader_test_OBJECTS = src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.$(OBJEXT) +src_common_dwarf_dwarf2reader_splitfunctions_unittest_DEPENDENCIES = \ + src/common/dwarf/bytereader.o src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_linux_google_crashdump_uploader_test_OBJECTS = src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.$(OBJEXT) \ + src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.$(OBJEXT) \ + src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.$(OBJEXT) src_common_linux_google_crashdump_uploader_test_OBJECTS = \ $(am_src_common_linux_google_crashdump_uploader_test_OBJECTS) -@LINUX_HOST_TRUE@src_common_linux_google_crashdump_uploader_test_DEPENDENCIES = \ -@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ -@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) -am__src_common_mac_macho_reader_unittest_SOURCES_DIST = \ - src/common/dwarf_cfi_to_module.cc \ - src/common/dwarf_cu_to_module.cc \ - src/common/dwarf_line_to_module.cc src/common/language.cc \ - src/common/md5.cc src/common/module.cc \ - src/common/path_helper.cc src/common/stabs_reader.cc \ - src/common/stabs_to_module.cc src/common/test_assembler.cc \ - src/common/dwarf/bytereader.cc \ - src/common/dwarf/cfi_assembler.cc \ - src/common/dwarf/dwarf2diehandler.cc \ - src/common/dwarf/dwarf2reader.cc \ - src/common/dwarf/elf_reader.cc \ - src/common/mac/arch_utilities.cc src/common/mac/file_id.cc \ - src/common/mac/macho_id.cc src/common/mac/macho_reader.cc \ - src/common/mac/macho_reader_unittest.cc \ - src/common/mac/macho_utilities.cc \ - src/common/mac/macho_walker.cc src/common/tests/file_utils.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_common_mac_macho_reader_unittest_OBJECTS = src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-dwarf_cu_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-dwarf_line_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-language.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-md5.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-path_helper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-stabs_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-stabs_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac_macho_reader_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/mac_macho_reader_unittest-bytereader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/mac_macho_reader_unittest-elf_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest-arch_utilities.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest-file_id.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest-macho_id.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest-macho_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest-macho_reader_unittest.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest-macho_utilities.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest-macho_walker.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tests/mac_macho_reader_unittest-file_utils.$(OBJEXT) +src_common_linux_google_crashdump_uploader_test_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_common_linux_scoped_pipe_unittest_OBJECTS = src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.$(OBJEXT) +src_common_linux_scoped_pipe_unittest_OBJECTS = \ + $(am_src_common_linux_scoped_pipe_unittest_OBJECTS) +src_common_linux_scoped_pipe_unittest_DEPENDENCIES = \ + src/common/linux/scoped_pipe.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_linux_scoped_tmpfile_unittest_OBJECTS = src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.$(OBJEXT) +src_common_linux_scoped_tmpfile_unittest_OBJECTS = \ + $(am_src_common_linux_scoped_tmpfile_unittest_OBJECTS) +src_common_linux_scoped_tmpfile_unittest_DEPENDENCIES = \ + src/common/linux/scoped_tmpfile.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_mac_macho_reader_unittest_OBJECTS = src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-dwarf_cu_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-dwarf_line_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-language.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-md5.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-path_helper.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-stabs_reader.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-stabs_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-test_assembler.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-bytereader.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-elf_reader.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-arch_utilities.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-file_id.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_id.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_reader.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_reader_unittest.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_utilities.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_walker.$(OBJEXT) \ + src/common/tests/mac_macho_reader_unittest-file_utils.$(OBJEXT) src_common_mac_macho_reader_unittest_OBJECTS = \ $(am_src_common_mac_macho_reader_unittest_OBJECTS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_mac_macho_reader_unittest_DEPENDENCIES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_2) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) -am__src_common_safe_math_unittest_SOURCES_DIST = \ - src/common/safe_math.h src/common/safe_math_unittest.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_common_safe_math_unittest_OBJECTS = src/common/safe_math_unittest-safe_math_unittest.$(OBJEXT) +src_common_mac_macho_reader_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_common_safe_math_unittest_OBJECTS = \ + src/common/safe_math_unittest-safe_math_unittest.$(OBJEXT) src_common_safe_math_unittest_OBJECTS = \ $(am_src_common_safe_math_unittest_OBJECTS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_safe_math_unittest_DEPENDENCIES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_2) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) -am__src_common_test_assembler_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc src/common/test_assembler.h \ - src/common/test_assembler_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_common_test_assembler_unittest_OBJECTS = src/common/test_assembler_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler_unittest-test_assembler_unittest.$(OBJEXT) +src_common_safe_math_unittest_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_test_assembler_unittest_OBJECTS = \ + src/common/test_assembler_unittest-test_assembler.$(OBJEXT) \ + src/common/test_assembler_unittest-test_assembler_unittest.$(OBJEXT) src_common_test_assembler_unittest_OBJECTS = \ $(am_src_common_test_assembler_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_common_test_assembler_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_address_map_unittest_SOURCES_DIST = \ - src/processor/address_map_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_address_map_unittest_OBJECTS = src/processor/address_map_unittest.$(OBJEXT) +src_common_test_assembler_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_address_map_unittest_OBJECTS = \ + src/processor/address_map_unittest.$(OBJEXT) src_processor_address_map_unittest_OBJECTS = \ $(am_src_processor_address_map_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_address_map_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o -am__src_processor_basic_source_line_resolver_unittest_SOURCES_DIST = \ - src/processor/basic_source_line_resolver_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_basic_source_line_resolver_unittest_OBJECTS = src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT) +src_processor_address_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o +am_src_processor_basic_source_line_resolver_unittest_OBJECTS = src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT) src_processor_basic_source_line_resolver_unittest_OBJECTS = $(am_src_processor_basic_source_line_resolver_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_DEPENDENCIES = src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_cfi_frame_info_unittest_SOURCES_DIST = \ - src/processor/cfi_frame_info_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_cfi_frame_info_unittest_OBJECTS = src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT) +src_processor_basic_source_line_resolver_unittest_DEPENDENCIES = \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/pathname_stripper.o src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_cfi_frame_info_unittest_OBJECTS = src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT) src_processor_cfi_frame_info_unittest_OBJECTS = \ $(am_src_processor_cfi_frame_info_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_contained_range_map_unittest_SOURCES_DIST = \ - src/processor/contained_range_map_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_contained_range_map_unittest_OBJECTS = src/processor/contained_range_map_unittest.$(OBJEXT) +src_processor_cfi_frame_info_unittest_DEPENDENCIES = \ + src/processor/cfi_frame_info.o src/processor/logging.o \ + src/processor/pathname_stripper.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_contained_range_map_unittest_OBJECTS = \ + src/processor/contained_range_map_unittest.$(OBJEXT) src_processor_contained_range_map_unittest_OBJECTS = \ $(am_src_processor_contained_range_map_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_contained_range_map_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o -am__src_processor_disassembler_objdump_unittest_SOURCES_DIST = \ - src/processor/disassembler_objdump_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_disassembler_objdump_unittest_OBJECTS = src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.$(OBJEXT) +src_processor_contained_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o +am_src_processor_disassembler_objdump_unittest_OBJECTS = src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.$(OBJEXT) src_processor_disassembler_objdump_unittest_OBJECTS = \ $(am_src_processor_disassembler_objdump_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_objdump_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_disassembler_x86_unittest_SOURCES_DIST = \ - src/processor/disassembler_x86_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_disassembler_x86_unittest_OBJECTS = src/processor/disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT) +src_processor_disassembler_objdump_unittest_DEPENDENCIES = \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_disassembler_x86_unittest_OBJECTS = src/processor/disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT) src_processor_disassembler_x86_unittest_OBJECTS = \ $(am_src_processor_disassembler_x86_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_x86_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_exploitability_unittest_SOURCES_DIST = \ - src/processor/exploitability_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_exploitability_unittest_OBJECTS = src/processor/exploitability_unittest-exploitability_unittest.$(OBJEXT) +src_processor_disassembler_x86_unittest_DEPENDENCIES = \ + src/processor/disassembler_x86.o \ + src/third_party/libdisasm/libdisasm.a $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_exploitability_unittest_OBJECTS = src/processor/exploitability_unittest-exploitability_unittest.$(OBJEXT) src_processor_exploitability_unittest_OBJECTS = \ $(am_src_processor_exploitability_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_DEPENDENCIES = src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_fast_source_line_resolver_unittest_SOURCES_DIST = \ - src/processor/fast_source_line_resolver_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_fast_source_line_resolver_unittest_OBJECTS = src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT) +src_processor_exploitability_unittest_DEPENDENCIES = \ + src/processor/convert_old_arm64_context.o \ + src/processor/minidump_processor.o \ + src/processor/process_state.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__append_27) +am_src_processor_fast_source_line_resolver_unittest_OBJECTS = src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT) src_processor_fast_source_line_resolver_unittest_OBJECTS = $(am_src_processor_fast_source_line_resolver_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_DEPENDENCIES = src/processor/fast_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_comparer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_map_serializers_unittest_SOURCES_DIST = \ - src/processor/map_serializers_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_map_serializers_unittest_OBJECTS = src/processor/map_serializers_unittest-map_serializers_unittest.$(OBJEXT) +src_processor_fast_source_line_resolver_unittest_DEPENDENCIES = \ + src/processor/fast_source_line_resolver.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o src/processor/module_comparer.o \ + src/processor/module_serializer.o \ + src/processor/pathname_stripper.o src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_map_serializers_unittest_OBJECTS = src/processor/map_serializers_unittest-map_serializers_unittest.$(OBJEXT) src_processor_map_serializers_unittest_OBJECTS = \ $(am_src_processor_map_serializers_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_microdump_processor_unittest_SOURCES_DIST = \ - src/processor/microdump_processor_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_microdump_processor_unittest_OBJECTS = src/processor/microdump_processor_unittest-microdump_processor_unittest.$(OBJEXT) +src_processor_map_serializers_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_microdump_processor_unittest_OBJECTS = src/processor/microdump_processor_unittest-microdump_processor_unittest.$(OBJEXT) src_processor_microdump_processor_unittest_OBJECTS = \ $(am_src_processor_microdump_processor_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_microdump_stackwalk_SOURCES_DIST = \ - src/processor/microdump_stackwalk.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_microdump_stackwalk_OBJECTS = src/processor/microdump_stackwalk.$(OBJEXT) +src_processor_microdump_processor_unittest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__append_28) +am_src_processor_microdump_stackwalk_OBJECTS = \ + src/processor/microdump_stackwalk.$(OBJEXT) src_processor_microdump_stackwalk_OBJECTS = \ $(am_src_processor_microdump_stackwalk_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_microdump_stackwalk_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/path_helper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalk_common.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a -am__src_processor_minidump_dump_SOURCES_DIST = \ - src/processor/minidump_dump.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_minidump_dump_OBJECTS = src/processor/minidump_dump.$(OBJEXT) +src_processor_microdump_stackwalk_DEPENDENCIES = \ + src/common/path_helper.o src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a $(am__append_31) +am_src_processor_minidump_dump_OBJECTS = \ + src/processor/minidump_dump.$(OBJEXT) src_processor_minidump_dump_OBJECTS = \ $(am_src_processor_minidump_dump_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_dump_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/path_helper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o -am__src_processor_minidump_processor_unittest_SOURCES_DIST = \ - src/processor/minidump_processor_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_minidump_processor_unittest_OBJECTS = src/processor/minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT) +src_processor_minidump_dump_DEPENDENCIES = src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o +am_src_processor_minidump_processor_unittest_OBJECTS = src/processor/minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT) src_processor_minidump_processor_unittest_OBJECTS = \ $(am_src_processor_minidump_processor_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_minidump_stackwalk_SOURCES_DIST = \ - src/processor/minidump_stackwalk.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_minidump_stackwalk_OBJECTS = src/processor/minidump_stackwalk.$(OBJEXT) +src_processor_minidump_processor_unittest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump_processor.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__append_29) +am_src_processor_minidump_stackwalk_OBJECTS = \ + src/processor/minidump_stackwalk.$(OBJEXT) src_processor_minidump_stackwalk_OBJECTS = \ $(am_src_processor_minidump_stackwalk_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_stackwalk_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/path_helper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalk_common.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a -am__src_processor_minidump_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/minidump_unittest.cc \ - src/processor/synth_minidump.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_minidump_unittest_OBJECTS = src/common/processor_minidump_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest-minidump_unittest.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest-synth_minidump.$(OBJEXT) +src_processor_minidump_stackwalk_DEPENDENCIES = \ + src/common/path_helper.o src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/minidump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__append_32) +am_src_processor_minidump_unittest_OBJECTS = src/common/processor_minidump_unittest-test_assembler.$(OBJEXT) \ + src/processor/minidump_unittest-minidump_unittest.$(OBJEXT) \ + src/processor/minidump_unittest-synth_minidump.$(OBJEXT) src_processor_minidump_unittest_OBJECTS = \ $(am_src_processor_minidump_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_pathname_stripper_unittest_SOURCES_DIST = \ - src/processor/pathname_stripper_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_pathname_stripper_unittest_OBJECTS = src/processor/pathname_stripper_unittest.$(OBJEXT) +src_processor_minidump_unittest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_pathname_stripper_unittest_OBJECTS = \ + src/processor/pathname_stripper_unittest.$(OBJEXT) src_processor_pathname_stripper_unittest_OBJECTS = \ $(am_src_processor_pathname_stripper_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_pathname_stripper_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_postfix_evaluator_unittest_SOURCES_DIST = \ - src/processor/postfix_evaluator_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_postfix_evaluator_unittest_OBJECTS = src/processor/postfix_evaluator_unittest.$(OBJEXT) +src_processor_pathname_stripper_unittest_DEPENDENCIES = \ + src/processor/pathname_stripper.o $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_postfix_evaluator_unittest_OBJECTS = \ + src/processor/postfix_evaluator_unittest.$(OBJEXT) src_processor_postfix_evaluator_unittest_OBJECTS = \ $(am_src_processor_postfix_evaluator_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_postfix_evaluator_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_proc_maps_linux_unittest_SOURCES_DIST = \ - src/processor/proc_maps_linux.cc \ - src/processor/proc_maps_linux_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_proc_maps_linux_unittest_OBJECTS = src/processor/proc_maps_linux_unittest-proc_maps_linux.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.$(OBJEXT) +src_processor_postfix_evaluator_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_proc_maps_linux_unittest_OBJECTS = src/processor/proc_maps_linux_unittest-proc_maps_linux.$(OBJEXT) \ + src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.$(OBJEXT) src_processor_proc_maps_linux_unittest_OBJECTS = \ $(am_src_processor_proc_maps_linux_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_range_map_truncate_lower_unittest_SOURCES_DIST = \ - src/processor/range_map_truncate_lower_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_range_map_truncate_lower_unittest_OBJECTS = src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.$(OBJEXT) +src_processor_proc_maps_linux_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + src/third_party/libdisasm/libdisasm.a $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_range_map_truncate_lower_unittest_OBJECTS = src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.$(OBJEXT) src_processor_range_map_truncate_lower_unittest_OBJECTS = \ $(am_src_processor_range_map_truncate_lower_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_lower_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_range_map_truncate_upper_unittest_SOURCES_DIST = \ - src/processor/range_map_truncate_upper_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_range_map_truncate_upper_unittest_OBJECTS = src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.$(OBJEXT) +src_processor_range_map_truncate_lower_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_range_map_truncate_upper_unittest_OBJECTS = src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.$(OBJEXT) src_processor_range_map_truncate_upper_unittest_OBJECTS = \ $(am_src_processor_range_map_truncate_upper_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_upper_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_range_map_unittest_SOURCES_DIST = \ - src/processor/range_map_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_range_map_unittest_OBJECTS = src/processor/range_map_unittest.$(OBJEXT) +src_processor_range_map_truncate_upper_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_range_map_unittest_OBJECTS = \ + src/processor/range_map_unittest.$(OBJEXT) src_processor_range_map_unittest_OBJECTS = \ $(am_src_processor_range_map_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_address_list_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_address_list_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_address_list_unittest_OBJECTS = src/common/processor_stackwalker_address_list_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.$(OBJEXT) +src_processor_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_address_list_unittest_OBJECTS = src/common/processor_stackwalker_address_list_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.$(OBJEXT) src_processor_stackwalker_address_list_unittest_OBJECTS = \ $(am_src_processor_stackwalker_address_list_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_address_list_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_amd64_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_amd64_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_amd64_unittest_OBJECTS = src/common/processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.$(OBJEXT) +src_processor_stackwalker_address_list_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_amd64_unittest_OBJECTS = src/common/processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.$(OBJEXT) src_processor_stackwalker_amd64_unittest_OBJECTS = \ $(am_src_processor_stackwalker_amd64_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_amd64_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_arm64_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_arm64_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_arm64_unittest_OBJECTS = src/common/processor_stackwalker_arm64_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.$(OBJEXT) +src_processor_stackwalker_amd64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_arm64_unittest_OBJECTS = src/common/processor_stackwalker_arm64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.$(OBJEXT) src_processor_stackwalker_arm64_unittest_OBJECTS = \ $(am_src_processor_stackwalker_arm64_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm64_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_arm_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_arm_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_arm_unittest_OBJECTS = src/common/processor_stackwalker_arm_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.$(OBJEXT) +src_processor_stackwalker_arm64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_arm_unittest_OBJECTS = src/common/processor_stackwalker_arm_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.$(OBJEXT) src_processor_stackwalker_arm_unittest_OBJECTS = \ $(am_src_processor_stackwalker_arm_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_mips64_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_mips64_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_mips64_unittest_OBJECTS = src/common/processor_stackwalker_mips64_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.$(OBJEXT) +src_processor_stackwalker_arm_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_mips64_unittest_OBJECTS = src/common/processor_stackwalker_mips64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.$(OBJEXT) src_processor_stackwalker_mips64_unittest_OBJECTS = \ $(am_src_processor_stackwalker_mips64_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips64_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_mips_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_mips_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_mips_unittest_OBJECTS = src/common/processor_stackwalker_mips_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.$(OBJEXT) +src_processor_stackwalker_mips64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_mips_unittest_OBJECTS = src/common/processor_stackwalker_mips_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.$(OBJEXT) src_processor_stackwalker_mips_unittest_OBJECTS = \ $(am_src_processor_stackwalker_mips_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_riscv64_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_riscv64_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_riscv64_unittest_OBJECTS = src/common/processor_stackwalker_riscv64_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.$(OBJEXT) +src_processor_stackwalker_mips_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_riscv64_unittest_OBJECTS = src/common/processor_stackwalker_riscv64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.$(OBJEXT) src_processor_stackwalker_riscv64_unittest_OBJECTS = \ $(am_src_processor_stackwalker_riscv64_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv64_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_riscv_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_riscv_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_riscv_unittest_OBJECTS = src/common/processor_stackwalker_riscv_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.$(OBJEXT) +src_processor_stackwalker_riscv64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_riscv_unittest_OBJECTS = src/common/processor_stackwalker_riscv_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.$(OBJEXT) src_processor_stackwalker_riscv_unittest_OBJECTS = \ $(am_src_processor_stackwalker_riscv_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_selftest_SOURCES_DIST = \ - src/processor/stackwalker_selftest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_selftest_OBJECTS = src/processor/stackwalker_selftest.$(OBJEXT) +src_processor_stackwalker_riscv_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_selftest_OBJECTS = \ + src/processor/stackwalker_selftest.$(OBJEXT) src_processor_stackwalker_selftest_OBJECTS = \ $(am_src_processor_stackwalker_selftest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_selftest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_stackwalker_x86_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc \ - src/processor/stackwalker_x86_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_stackwalker_x86_unittest_OBJECTS = src/common/processor_stackwalker_x86_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.$(OBJEXT) +src_processor_stackwalker_selftest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_30) +am_src_processor_stackwalker_x86_unittest_OBJECTS = src/common/processor_stackwalker_x86_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.$(OBJEXT) src_processor_stackwalker_x86_unittest_OBJECTS = \ $(am_src_processor_stackwalker_x86_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_x86_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_static_address_map_unittest_SOURCES_DIST = \ - src/processor/static_address_map_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_static_address_map_unittest_OBJECTS = src/processor/static_address_map_unittest-static_address_map_unittest.$(OBJEXT) +src_processor_stackwalker_x86_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_address_map_unittest_OBJECTS = src/processor/static_address_map_unittest-static_address_map_unittest.$(OBJEXT) src_processor_static_address_map_unittest_OBJECTS = \ $(am_src_processor_static_address_map_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_static_contained_range_map_unittest_SOURCES_DIST = \ - src/processor/static_contained_range_map_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_static_contained_range_map_unittest_OBJECTS = src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT) +src_processor_static_address_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_contained_range_map_unittest_OBJECTS = src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT) src_processor_static_contained_range_map_unittest_OBJECTS = $(am_src_processor_static_contained_range_map_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_static_map_unittest_SOURCES_DIST = \ - src/processor/static_map_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_static_map_unittest_OBJECTS = src/processor/static_map_unittest-static_map_unittest.$(OBJEXT) +src_processor_static_contained_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_map_unittest_OBJECTS = src/processor/static_map_unittest-static_map_unittest.$(OBJEXT) src_processor_static_map_unittest_OBJECTS = \ $(am_src_processor_static_map_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_static_range_map_unittest_SOURCES_DIST = \ - src/processor/static_range_map_unittest.cc -@DISABLE_PROCESSOR_FALSE@am_src_processor_static_range_map_unittest_OBJECTS = src/processor/static_range_map_unittest-static_range_map_unittest.$(OBJEXT) +src_processor_static_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_range_map_unittest_OBJECTS = src/processor/static_range_map_unittest-static_range_map_unittest.$(OBJEXT) src_processor_static_range_map_unittest_OBJECTS = \ $(am_src_processor_static_range_map_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_processor_synth_minidump_unittest_SOURCES_DIST = \ - src/common/test_assembler.cc src/common/test_assembler.h \ - src/processor/synth_minidump_unittest.cc \ - src/processor/synth_minidump.cc src/processor/synth_minidump.h -@DISABLE_PROCESSOR_FALSE@am_src_processor_synth_minidump_unittest_OBJECTS = src/common/processor_synth_minidump_unittest-test_assembler.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT) \ -@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest-synth_minidump.$(OBJEXT) +src_processor_static_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_synth_minidump_unittest_OBJECTS = src/common/processor_synth_minidump_unittest-test_assembler.$(OBJEXT) \ + src/processor/synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT) \ + src/processor/synth_minidump_unittest-synth_minidump.$(OBJEXT) src_processor_synth_minidump_unittest_OBJECTS = \ $(am_src_processor_synth_minidump_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_synth_minidump_unittest_DEPENDENCIES = \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_2) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) \ -@DISABLE_PROCESSOR_FALSE@ $(am__DEPENDENCIES_1) -am__src_tools_linux_core2md_core2md_SOURCES_DIST = \ - src/tools/linux/core2md/core2md.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_linux_core2md_core2md_OBJECTS = src/tools/linux/core2md/core2md.$(OBJEXT) +src_processor_synth_minidump_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_tools_linux_core2md_core2md_OBJECTS = \ + src/tools/linux/core2md/core2md.$(OBJEXT) src_tools_linux_core2md_core2md_OBJECTS = \ $(am_src_tools_linux_core2md_core2md_OBJECTS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_core2md_core2md_DEPENDENCIES = src/client/linux/libbreakpad_client.a \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.o -am__src_tools_linux_core_handler_core_handler_SOURCES_DIST = \ - src/tools/linux/core_handler/core_handler.cc -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@am_src_tools_linux_core_handler_core_handler_OBJECTS = src/tools/linux/core_handler/core_handler.$(OBJEXT) +src_tools_linux_core2md_core2md_DEPENDENCIES = \ + src/client/linux/libbreakpad_client.a src/common/path_helper.o +am_src_tools_linux_core_handler_core_handler_OBJECTS = \ + src/tools/linux/core_handler/core_handler.$(OBJEXT) src_tools_linux_core_handler_core_handler_OBJECTS = \ $(am_src_tools_linux_core_handler_core_handler_OBJECTS) -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@src_tools_linux_core_handler_core_handler_DEPENDENCIES = src/client/linux/libbreakpad_client.a \ -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@ src/common/path_helper.o -am__src_tools_linux_dump_syms_dump_syms_SOURCES_DIST = \ - src/common/dwarf_cfi_to_module.cc \ - src/common/dwarf_cu_to_module.cc \ - src/common/dwarf_line_to_module.cc \ - src/common/dwarf_range_list_handler.cc src/common/language.cc \ - src/common/module.cc src/common/path_helper.cc \ - src/common/stabs_reader.cc src/common/stabs_to_module.cc \ - src/common/dwarf/bytereader.cc \ - src/common/dwarf/dwarf2diehandler.cc \ - src/common/dwarf/dwarf2reader.cc \ - src/common/dwarf/elf_reader.cc src/common/linux/crc32.cc \ - src/common/linux/dump_symbols.cc \ - src/common/linux/dump_symbols.h \ - src/common/linux/elf_symbols_to_module.cc \ - src/common/linux/elf_symbols_to_module.h \ - src/common/linux/elfutils.cc src/common/linux/file_id.cc \ - src/common/linux/linux_libc_support.cc \ - src/common/linux/memory_mapped_file.cc \ - src/common/linux/safe_readlink.cc \ - src/tools/linux/dump_syms/dump_syms.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_linux_dump_syms_dump_syms_OBJECTS = src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-language.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-path_helper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-stabs_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-crc32.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-file_id.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms-dump_syms.$(OBJEXT) +src_tools_linux_core_handler_core_handler_DEPENDENCIES = \ + src/client/linux/libbreakpad_client.a src/common/path_helper.o +am_src_tools_linux_dump_syms_dump_syms_OBJECTS = src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-language.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-path_helper.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-stabs_reader.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-crc32.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-file_id.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.$(OBJEXT) \ + src/tools/linux/dump_syms/dump_syms-dump_syms.$(OBJEXT) src_tools_linux_dump_syms_dump_syms_OBJECTS = \ $(am_src_tools_linux_dump_syms_dump_syms_OBJECTS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_dump_syms_dump_syms_DEPENDENCIES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) +src_tools_linux_dump_syms_dump_syms_DEPENDENCIES = \ + $(am__DEPENDENCIES_1) src_tools_linux_dump_syms_dump_syms_LINK = $(CXXLD) \ $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__src_tools_linux_md2core_minidump_2_core_SOURCES_DIST = \ - src/common/linux/memory_mapped_file.cc \ - src/common/path_helper.cc \ - src/tools/linux/md2core/minidump-2-core.cc \ - src/tools/linux/md2core/minidump_memory_range.h -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_linux_md2core_minidump_2_core_OBJECTS = src/common/linux/memory_mapped_file.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core.$(OBJEXT) +am_src_tools_linux_md2core_minidump_2_core_OBJECTS = \ + src/common/linux/memory_mapped_file.$(OBJEXT) \ + src/common/path_helper.$(OBJEXT) \ + src/tools/linux/md2core/minidump-2-core.$(OBJEXT) src_tools_linux_md2core_minidump_2_core_OBJECTS = \ $(am_src_tools_linux_md2core_minidump_2_core_OBJECTS) src_tools_linux_md2core_minidump_2_core_LDADD = $(LDADD) -am__src_tools_linux_md2core_minidump_2_core_unittest_SOURCES_DIST = \ - src/tools/linux/md2core/minidump_memory_range_unittest.cc -@LINUX_HOST_TRUE@am_src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS = src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.$(OBJEXT) +am_src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS = src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.$(OBJEXT) src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS = $(am_src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) -@LINUX_HOST_TRUE@src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES = \ -@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ -@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) -am__src_tools_linux_pid2md_pid2md_SOURCES_DIST = \ - src/tools/linux/pid2md/pid2md.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_linux_pid2md_pid2md_OBJECTS = src/tools/linux/pid2md/pid2md.$(OBJEXT) +src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_tools_linux_pid2md_pid2md_OBJECTS = \ + src/tools/linux/pid2md/pid2md.$(OBJEXT) src_tools_linux_pid2md_pid2md_OBJECTS = \ $(am_src_tools_linux_pid2md_pid2md_OBJECTS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_pid2md_pid2md_DEPENDENCIES = src/client/linux/libbreakpad_client.a \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.o -am__src_tools_linux_symupload_minidump_upload_SOURCES_DIST = \ - src/common/linux/http_upload.cc src/common/path_helper.cc \ - src/tools/linux/symupload/minidump_upload.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_linux_symupload_minidump_upload_OBJECTS = src/common/linux/http_upload.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload.$(OBJEXT) +src_tools_linux_pid2md_pid2md_DEPENDENCIES = \ + src/client/linux/libbreakpad_client.a src/common/path_helper.o +am_src_tools_linux_symupload_minidump_upload_OBJECTS = \ + src/common/linux/http_upload.$(OBJEXT) \ + src/common/path_helper.$(OBJEXT) \ + src/tools/linux/symupload/minidump_upload.$(OBJEXT) src_tools_linux_symupload_minidump_upload_OBJECTS = \ $(am_src_tools_linux_symupload_minidump_upload_OBJECTS) src_tools_linux_symupload_minidump_upload_DEPENDENCIES = -am__src_tools_linux_symupload_sym_upload_SOURCES_DIST = \ - src/common/linux/http_upload.cc src/common/linux/http_upload.h \ - src/common/linux/libcurl_wrapper.cc \ - src/common/linux/libcurl_wrapper.h \ - src/common/linux/symbol_collector_client.cc \ - src/common/linux/symbol_collector_client.h \ - src/common/linux/symbol_upload.cc \ - src/common/linux/symbol_upload.h src/common/path_helper.cc \ - src/tools/linux/symupload/sym_upload.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_linux_symupload_sym_upload_OBJECTS = src/common/linux/http_upload.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/libcurl_wrapper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/symbol_collector_client.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/symbol_upload.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload.$(OBJEXT) +am_src_tools_linux_symupload_sym_upload_OBJECTS = \ + src/common/linux/http_upload.$(OBJEXT) \ + src/common/linux/libcurl_wrapper.$(OBJEXT) \ + src/common/linux/symbol_collector_client.$(OBJEXT) \ + src/common/linux/symbol_upload.$(OBJEXT) \ + src/common/path_helper.$(OBJEXT) \ + src/tools/linux/symupload/sym_upload.$(OBJEXT) src_tools_linux_symupload_sym_upload_OBJECTS = \ $(am_src_tools_linux_symupload_sym_upload_OBJECTS) src_tools_linux_symupload_sym_upload_DEPENDENCIES = -am__src_tools_mac_dump_syms_dump_syms_mac_SOURCES_DIST = \ - src/common/dwarf_cfi_to_module.cc \ - src/common/dwarf_cu_to_module.cc \ - src/common/dwarf_line_to_module.cc \ - src/common/dwarf_range_list_handler.cc src/common/language.cc \ - src/common/md5.cc src/common/module.cc \ - src/common/path_helper.cc src/common/stabs_reader.cc \ - src/common/stabs_to_module.cc src/common/dwarf/bytereader.cc \ - src/common/dwarf/dwarf2diehandler.cc \ - src/common/dwarf/dwarf2reader.cc \ - src/common/dwarf/elf_reader.cc \ - src/common/mac/arch_utilities.cc src/common/mac/dump_syms.cc \ - src/common/mac/dump_syms.h src/common/mac/file_id.cc \ - src/common/mac/file_id.h src/common/mac/macho_id.cc \ - src/common/mac/macho_id.h src/common/mac/macho_reader.cc \ - src/common/mac/macho_reader.h \ - src/common/mac/macho_utilities.cc \ - src/common/mac/macho_utilities.h \ - src/common/mac/macho_walker.cc src/common/mac/macho_walker.h \ - src/tools/mac/dump_syms/dump_syms_tool.cc -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_mac_dump_syms_dump_syms_mac_OBJECTS = src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-language.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-md5.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.$(OBJEXT) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.$(OBJEXT) +am_src_tools_mac_dump_syms_dump_syms_mac_OBJECTS = src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-language.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-md5.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.$(OBJEXT) \ + src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.$(OBJEXT) src_tools_mac_dump_syms_dump_syms_mac_OBJECTS = \ $(am_src_tools_mac_dump_syms_dump_syms_mac_OBJECTS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_mac_dump_syms_dump_syms_mac_DEPENDENCIES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(am__DEPENDENCIES_1) +src_tools_mac_dump_syms_dump_syms_mac_DEPENDENCIES = \ + $(am__DEPENDENCIES_1) src_tools_mac_dump_syms_dump_syms_mac_LINK = $(CXXLD) \ $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ @@ -1833,6 +1570,8 @@ am__depfiles_remade = src/client/$(DEPDIR)/minidump_file_writer.Po \ src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po \ src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po \ src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po \ src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po \ src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po \ src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po \ @@ -1862,6 +1601,10 @@ am__depfiles_remade = src/client/$(DEPDIR)/minidump_file_writer.Po \ src/common/linux/$(DEPDIR)/linux_libc_support.Po \ src/common/linux/$(DEPDIR)/memory_mapped_file.Po \ src/common/linux/$(DEPDIR)/safe_readlink.Po \ + src/common/linux/$(DEPDIR)/scoped_pipe.Po \ + src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po \ + src/common/linux/$(DEPDIR)/scoped_tmpfile.Po \ + src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po \ src/common/linux/$(DEPDIR)/symbol_collector_client.Po \ src/common/linux/$(DEPDIR)/symbol_upload.Po \ src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po \ @@ -2056,6 +1799,8 @@ SOURCES = $(src_client_linux_libbreakpad_client_a_SOURCES) \ $(src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES) \ $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES) \ $(src_common_linux_google_crashdump_uploader_test_SOURCES) \ + $(src_common_linux_scoped_pipe_unittest_SOURCES) \ + $(src_common_linux_scoped_tmpfile_unittest_SOURCES) \ $(src_common_mac_macho_reader_unittest_SOURCES) \ $(src_common_safe_math_unittest_SOURCES) \ $(src_common_test_assembler_unittest_SOURCES) \ @@ -2108,95 +1853,97 @@ DIST_SOURCES = \ $(am__src_client_linux_libbreakpad_client_a_SOURCES_DIST) \ $(am__src_libbreakpad_a_SOURCES_DIST) \ $(am__src_testing_libtesting_a_SOURCES_DIST) \ - $(am__src_third_party_libdisasm_libdisasm_a_SOURCES_DIST) \ + $(src_third_party_libdisasm_libdisasm_a_SOURCES) \ $(src_client_linux_linux_client_unittest_SOURCES) \ $(am__src_client_linux_linux_client_unittest_shlib_SOURCES_DIST) \ - $(am__src_client_linux_linux_dumper_unittest_helper_SOURCES_DIST) \ - $(am__src_common_dumper_unittest_SOURCES_DIST) \ - $(am__src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES_DIST) \ - $(am__src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES_DIST) \ - $(am__src_common_linux_google_crashdump_uploader_test_SOURCES_DIST) \ - $(am__src_common_mac_macho_reader_unittest_SOURCES_DIST) \ - $(am__src_common_safe_math_unittest_SOURCES_DIST) \ - $(am__src_common_test_assembler_unittest_SOURCES_DIST) \ - $(am__src_processor_address_map_unittest_SOURCES_DIST) \ - $(am__src_processor_basic_source_line_resolver_unittest_SOURCES_DIST) \ - $(am__src_processor_cfi_frame_info_unittest_SOURCES_DIST) \ - $(am__src_processor_contained_range_map_unittest_SOURCES_DIST) \ - $(am__src_processor_disassembler_objdump_unittest_SOURCES_DIST) \ - $(am__src_processor_disassembler_x86_unittest_SOURCES_DIST) \ - $(am__src_processor_exploitability_unittest_SOURCES_DIST) \ - $(am__src_processor_fast_source_line_resolver_unittest_SOURCES_DIST) \ - $(am__src_processor_map_serializers_unittest_SOURCES_DIST) \ - $(am__src_processor_microdump_processor_unittest_SOURCES_DIST) \ - $(am__src_processor_microdump_stackwalk_SOURCES_DIST) \ - $(am__src_processor_minidump_dump_SOURCES_DIST) \ - $(am__src_processor_minidump_processor_unittest_SOURCES_DIST) \ - $(am__src_processor_minidump_stackwalk_SOURCES_DIST) \ - $(am__src_processor_minidump_unittest_SOURCES_DIST) \ - $(am__src_processor_pathname_stripper_unittest_SOURCES_DIST) \ - $(am__src_processor_postfix_evaluator_unittest_SOURCES_DIST) \ - $(am__src_processor_proc_maps_linux_unittest_SOURCES_DIST) \ - $(am__src_processor_range_map_truncate_lower_unittest_SOURCES_DIST) \ - $(am__src_processor_range_map_truncate_upper_unittest_SOURCES_DIST) \ - $(am__src_processor_range_map_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_address_list_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_amd64_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_arm64_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_arm_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_mips64_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_mips_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_riscv64_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_riscv_unittest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_selftest_SOURCES_DIST) \ - $(am__src_processor_stackwalker_x86_unittest_SOURCES_DIST) \ - $(am__src_processor_static_address_map_unittest_SOURCES_DIST) \ - $(am__src_processor_static_contained_range_map_unittest_SOURCES_DIST) \ - $(am__src_processor_static_map_unittest_SOURCES_DIST) \ - $(am__src_processor_static_range_map_unittest_SOURCES_DIST) \ - $(am__src_processor_synth_minidump_unittest_SOURCES_DIST) \ - $(am__src_tools_linux_core2md_core2md_SOURCES_DIST) \ - $(am__src_tools_linux_core_handler_core_handler_SOURCES_DIST) \ - $(am__src_tools_linux_dump_syms_dump_syms_SOURCES_DIST) \ - $(am__src_tools_linux_md2core_minidump_2_core_SOURCES_DIST) \ - $(am__src_tools_linux_md2core_minidump_2_core_unittest_SOURCES_DIST) \ - $(am__src_tools_linux_pid2md_pid2md_SOURCES_DIST) \ - $(am__src_tools_linux_symupload_minidump_upload_SOURCES_DIST) \ - $(am__src_tools_linux_symupload_sym_upload_SOURCES_DIST) \ - $(am__src_tools_mac_dump_syms_dump_syms_mac_SOURCES_DIST) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -DATA = $(dist_doc_DATA) $(pkgconfig_DATA) -am__includecl_HEADERS_DIST = $(top_srcdir)/src/common/linux/*.h -am__includeclc_HEADERS_DIST = \ - $(top_srcdir)/src/client/linux/crash_generation/*.h -am__includecldwc_HEADERS_DIST = \ - $(top_srcdir)/src/client/linux/dump_writer_common/*.h -am__includeclh_HEADERS_DIST = \ - $(top_srcdir)/src/client/linux/handler/*.h -am__includeclm_HEADERS_DIST = \ - $(top_srcdir)/src/client/linux/minidump_writer/*.h -am__includelss_HEADERS_DIST = $(top_srcdir)/src/third_party/lss/*.h -HEADERS = $(includec_HEADERS) $(includecl_HEADERS) \ - $(includeclc_HEADERS) $(includecldwc_HEADERS) \ - $(includeclh_HEADERS) $(includeclm_HEADERS) \ - $(includegbc_HEADERS) $(includelss_HEADERS) \ - $(includep_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. + $(src_client_linux_linux_dumper_unittest_helper_SOURCES) \ + $(src_common_dumper_unittest_SOURCES) \ + $(src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES) \ + $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES) \ + $(src_common_linux_google_crashdump_uploader_test_SOURCES) \ + $(src_common_linux_scoped_pipe_unittest_SOURCES) \ + $(src_common_linux_scoped_tmpfile_unittest_SOURCES) \ + $(src_common_mac_macho_reader_unittest_SOURCES) \ + $(src_common_safe_math_unittest_SOURCES) \ + $(src_common_test_assembler_unittest_SOURCES) \ + $(src_processor_address_map_unittest_SOURCES) \ + $(src_processor_basic_source_line_resolver_unittest_SOURCES) \ + $(src_processor_cfi_frame_info_unittest_SOURCES) \ + $(src_processor_contained_range_map_unittest_SOURCES) \ + $(src_processor_disassembler_objdump_unittest_SOURCES) \ + $(src_processor_disassembler_x86_unittest_SOURCES) \ + $(src_processor_exploitability_unittest_SOURCES) \ + $(src_processor_fast_source_line_resolver_unittest_SOURCES) \ + $(src_processor_map_serializers_unittest_SOURCES) \ + $(src_processor_microdump_processor_unittest_SOURCES) \ + $(src_processor_microdump_stackwalk_SOURCES) \ + $(src_processor_minidump_dump_SOURCES) \ + $(src_processor_minidump_processor_unittest_SOURCES) \ + $(src_processor_minidump_stackwalk_SOURCES) \ + $(src_processor_minidump_unittest_SOURCES) \ + $(src_processor_pathname_stripper_unittest_SOURCES) \ + $(src_processor_postfix_evaluator_unittest_SOURCES) \ + $(src_processor_proc_maps_linux_unittest_SOURCES) \ + $(src_processor_range_map_truncate_lower_unittest_SOURCES) \ + $(src_processor_range_map_truncate_upper_unittest_SOURCES) \ + $(src_processor_range_map_unittest_SOURCES) \ + $(src_processor_stackwalker_address_list_unittest_SOURCES) \ + $(src_processor_stackwalker_amd64_unittest_SOURCES) \ + $(src_processor_stackwalker_arm64_unittest_SOURCES) \ + $(src_processor_stackwalker_arm_unittest_SOURCES) \ + $(src_processor_stackwalker_mips64_unittest_SOURCES) \ + $(src_processor_stackwalker_mips_unittest_SOURCES) \ + $(src_processor_stackwalker_riscv64_unittest_SOURCES) \ + $(src_processor_stackwalker_riscv_unittest_SOURCES) \ + $(src_processor_stackwalker_selftest_SOURCES) \ + $(src_processor_stackwalker_x86_unittest_SOURCES) \ + $(src_processor_static_address_map_unittest_SOURCES) \ + $(src_processor_static_contained_range_map_unittest_SOURCES) \ + $(src_processor_static_map_unittest_SOURCES) \ + $(src_processor_static_range_map_unittest_SOURCES) \ + $(src_processor_synth_minidump_unittest_SOURCES) \ + $(src_tools_linux_core2md_core2md_SOURCES) \ + $(src_tools_linux_core_handler_core_handler_SOURCES) \ + $(src_tools_linux_dump_syms_dump_syms_SOURCES) \ + $(src_tools_linux_md2core_minidump_2_core_SOURCES) \ + $(src_tools_linux_md2core_minidump_2_core_unittest_SOURCES) \ + $(src_tools_linux_pid2md_pid2md_SOURCES) \ + $(src_tools_linux_symupload_minidump_upload_SOURCES) \ + $(src_tools_linux_symupload_sym_upload_SOURCES) \ + $(src_tools_mac_dump_syms_dump_syms_mac_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(dist_doc_DATA) $(pkgconfig_DATA) +am__includecl_HEADERS_DIST = $(top_srcdir)/src/common/linux/*.h +am__includeclc_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/crash_generation/*.h +am__includecldwc_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/dump_writer_common/*.h +am__includeclh_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/handler/*.h +am__includeclm_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/minidump_writer/*.h +am__includelss_HEADERS_DIST = $(top_srcdir)/src/third_party/lss/*.h +HEADERS = $(includec_HEADERS) $(includecl_HEADERS) \ + $(includeclc_HEADERS) $(includecldwc_HEADERS) \ + $(includeclh_HEADERS) $(includeclm_HEADERS) \ + $(includegbc_HEADERS) $(includelss_HEADERS) \ + $(includep_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ @@ -2438,12 +2185,10 @@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ -EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ GMOCK_CFLAGS = @GMOCK_CFLAGS@ GMOCK_LIBS = @GMOCK_LIBS@ -GREP = @GREP@ GTEST_CFLAGS = @GTEST_CFLAGS@ GTEST_LIBS = @GTEST_LIBS@ HAVE_CXX17 = @HAVE_CXX17@ @@ -2534,1274 +2279,1248 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -# This allows #includes to be relative to src/ -AM_CPPFLAGS = -I$(top_srcdir)/src -AM_CFLAGS = $(am__append_2) -AM_CXXFLAGS = $(am__append_1) $(WARN_CXXFLAGS) $(am__append_3) +# This allows #includes to be relative to src/ +AM_CPPFLAGS = -I$(top_srcdir)/src +AM_CFLAGS = $(am__append_2) +AM_CXXFLAGS = $(am__append_1) $(WARN_CXXFLAGS) $(am__append_3) + +# Specify include paths for ac macros +ACLOCAL_AMFLAGS = -I m4 + +# License file is called LICENSE not COPYING +AUTOMAKE_OPTIONS = foreign +dist_doc_DATA = \ + AUTHORS \ + ChangeLog \ + INSTALL \ + LICENSE \ + NEWS \ + README.md + +@LINUX_HOST_TRUE@includeclhdir = $(includedir)/$(PACKAGE)/client/linux/handler +@LINUX_HOST_TRUE@includeclh_HEADERS = $(top_srcdir)/src/client/linux/handler/*.h +@LINUX_HOST_TRUE@includecldwcdir = $(includedir)/$(PACKAGE)/client/linux/dump_writer_common +@LINUX_HOST_TRUE@includecldwc_HEADERS = $(top_srcdir)/src/client/linux/dump_writer_common/*.h +@LINUX_HOST_TRUE@includeclmdir = $(includedir)/$(PACKAGE)/client/linux/minidump_writer +@LINUX_HOST_TRUE@includeclm_HEADERS = $(top_srcdir)/src/client/linux/minidump_writer/*.h +@LINUX_HOST_TRUE@includeclcdir = $(includedir)/$(PACKAGE)/client/linux/crash_generation +@LINUX_HOST_TRUE@includeclc_HEADERS = $(top_srcdir)/src/client/linux/crash_generation/*.h +@LINUX_HOST_TRUE@includelssdir = $(includedir)/$(PACKAGE)/third_party/lss +@LINUX_HOST_TRUE@includelss_HEADERS = $(top_srcdir)/src/third_party/lss/*.h +@LINUX_HOST_TRUE@includecldir = $(includedir)/$(PACKAGE)/common/linux +@LINUX_HOST_TRUE@includecl_HEADERS = $(top_srcdir)/src/common/linux/*.h +includegbcdir = $(includedir)/$(PACKAGE)/google_breakpad/common +includegbc_HEADERS = $(top_srcdir)/src/google_breakpad/common/*.h +includecdir = $(includedir)/$(PACKAGE)/common +includec_HEADERS = $(top_srcdir)/src/common/*.h +includepdir = $(includedir)/$(PACKAGE)/processor +includep_HEADERS = $(top_srcdir)/src/processor/*.h +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = $(am__append_6) $(am__append_13) +@SYSTEM_TEST_LIBS_FALSE@TEST_CFLAGS = \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/include \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googletest/include \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googletest \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googlemock/include \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googlemock \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing + +@SYSTEM_TEST_LIBS_TRUE@TEST_CFLAGS = $(GTEST_CFLAGS) $(GMOCK_CFLAGS) +@SYSTEM_TEST_LIBS_FALSE@TEST_LIBS = src/testing/libtesting.a +@SYSTEM_TEST_LIBS_TRUE@TEST_LIBS = $(GTEST_LIBS) -lgtest_main $(GMOCK_LIBS) +@SYSTEM_TEST_LIBS_FALSE@TEST_DEPS = $(TEST_LIBS) +@SYSTEM_TEST_LIBS_TRUE@TEST_DEPS = +@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_FALSE@LOG_DRIVER = $(top_srcdir)/autotools/test-driver +@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_TRUE@LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver + +# Since Autotools 1.2, tests are run through a special "test driver" script. +# Unfortunately, it's not possible anymore to specify an alternative shell to +# run them on connected devices, so use a slightly modified version of the +# driver for Android. +@ANDROID_HOST_TRUE@LOG_DRIVER = $(top_srcdir)/android/test-driver +check_LIBRARIES = $(am__append_4) +noinst_LIBRARIES = $(am__append_7) +lib_LIBRARIES = $(am__append_5) $(am__append_12) +noinst_SCRIPTS = $(check_SCRIPTS) +CLEANFILES = $(am__append_16) +@SYSTEM_TEST_LIBS_FALSE@src_testing_libtesting_a_SOURCES = \ +@SYSTEM_TEST_LIBS_FALSE@ src/breakpad_googletest_includes.h \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/gtest-all.cc \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/gtest_main.cc \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googlemock/src/gmock-all.cc + +@SYSTEM_TEST_LIBS_FALSE@src_testing_libtesting_a_CPPFLAGS = \ +@SYSTEM_TEST_LIBS_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) + +@DISABLE_PROCESSOR_FALSE@check_SCRIPTS = \ +@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk_machine_readable_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_machine_readable_test + +TESTS = $(check_PROGRAMS) $(check_SCRIPTS) + +# All targets that were defined above should now be +# declared below. This should be done unconditionally +# so DO NOT wrap them in conditions! +# Execept for conditionally adding a specific file or +# flag that should only be added for a specific arch, +# system, etc. +src_common_safe_math_unittest_SOURCES = \ + src/common/safe_math.h \ + src/common/safe_math_unittest.cc + +src_common_safe_math_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_safe_math_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + + +# Breakpad processor library +src_libbreakpad_a_SOURCES = \ + src/google_breakpad/common/breakpad_types.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_size.h \ + src/google_breakpad/processor/basic_source_line_resolver.h \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/dump_context.h \ + src/google_breakpad/processor/dump_object.h \ + src/google_breakpad/processor/exploitability.h \ + src/google_breakpad/processor/fast_source_line_resolver.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/microdump.h \ + src/google_breakpad/processor/microdump_processor.h \ + src/google_breakpad/processor/minidump.h \ + src/google_breakpad/processor/minidump_processor.h \ + src/google_breakpad/processor/process_result.h \ + src/google_breakpad/processor/process_state.h \ + src/google_breakpad/processor/proc_maps_linux.h \ + src/google_breakpad/processor/source_line_resolver_base.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/processor/stack_frame.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame_symbolizer.h \ + src/google_breakpad/processor/stackwalker.h \ + src/google_breakpad/processor/symbol_supplier.h \ + src/google_breakpad/processor/system_info.h \ + src/processor/address_map-inl.h src/processor/address_map.h \ + src/processor/basic_code_module.h \ + src/processor/basic_code_modules.cc \ + src/processor/basic_code_modules.h \ + src/processor/basic_source_line_resolver_types.h \ + src/processor/basic_source_line_resolver.cc \ + src/processor/call_stack.cc src/processor/cfi_frame_info.cc \ + src/processor/cfi_frame_info.h \ + src/processor/contained_range_map-inl.h \ + src/processor/contained_range_map.h \ + src/processor/convert_old_arm64_context.cc \ + src/processor/convert_old_arm64_context.h \ + src/processor/disassembler_x86.h \ + src/processor/disassembler_x86.cc \ + src/processor/dump_context.cc src/processor/dump_object.cc \ + src/processor/exploitability.cc \ + src/processor/exploitability_linux.h \ + src/processor/exploitability_linux.cc \ + src/processor/exploitability_win.h \ + src/processor/exploitability_win.cc \ + src/processor/fast_source_line_resolver_types.h \ + src/processor/fast_source_line_resolver.cc \ + src/processor/linked_ptr.h src/processor/logging.h \ + src/processor/logging.cc src/processor/map_serializers-inl.h \ + src/processor/map_serializers.h src/processor/microdump.cc \ + src/processor/microdump_processor.cc src/processor/minidump.cc \ + src/processor/minidump_processor.cc \ + src/processor/module_comparer.cc \ + src/processor/module_comparer.h src/processor/module_factory.h \ + src/processor/module_serializer.cc \ + src/processor/module_serializer.h \ + src/processor/pathname_stripper.cc \ + src/processor/pathname_stripper.h \ + src/processor/postfix_evaluator-inl.h \ + src/processor/postfix_evaluator.h \ + src/processor/process_state.cc \ + src/processor/proc_maps_linux.cc src/processor/range_map-inl.h \ + src/processor/range_map.h \ + src/processor/simple_serializer-inl.h \ + src/processor/simple_serializer.h \ + src/processor/simple_symbol_supplier.cc \ + src/processor/simple_symbol_supplier.h \ + src/processor/windows_frame_info.h \ + src/processor/source_line_resolver_base_types.h \ + src/processor/source_line_resolver_base.cc \ + src/processor/stack_frame_cpu.cc \ + src/processor/stack_frame_symbolizer.cc \ + src/processor/stackwalk_common.cc \ + src/processor/stackwalk_common.h src/processor/stackwalker.cc \ + src/processor/stackwalker_amd64.cc \ + src/processor/stackwalker_amd64.h \ + src/processor/stackwalker_arm.cc \ + src/processor/stackwalker_arm.h \ + src/processor/stackwalker_arm64.cc \ + src/processor/stackwalker_arm64.h \ + src/processor/stackwalker_address_list.cc \ + src/processor/stackwalker_address_list.h \ + src/processor/stackwalker_mips.cc \ + src/processor/stackwalker_mips.h \ + src/processor/stackwalker_ppc.cc \ + src/processor/stackwalker_ppc.h \ + src/processor/stackwalker_ppc64.cc \ + src/processor/stackwalker_ppc64.h \ + src/processor/stackwalker_riscv.cc \ + src/processor/stackwalker_riscv.h \ + src/processor/stackwalker_riscv64.cc \ + src/processor/stackwalker_riscv64.h \ + src/processor/stackwalker_sparc.cc \ + src/processor/stackwalker_sparc.h \ + src/processor/stackwalker_x86.cc \ + src/processor/stackwalker_x86.h \ + src/processor/static_address_map-inl.h \ + src/processor/static_address_map.h \ + src/processor/static_contained_range_map-inl.h \ + src/processor/static_contained_range_map.h \ + src/processor/static_map_iterator-inl.h \ + src/processor/static_map_iterator.h \ + src/processor/static_map-inl.h src/processor/static_map.h \ + src/processor/static_range_map-inl.h \ + src/processor/static_range_map.h \ + src/processor/symbolic_constants_win.cc \ + src/processor/symbolic_constants_win.h \ + src/processor/tokenize.cc src/processor/tokenize.h \ + $(am__append_22) + +# libdisasm 3rd party library +src_third_party_libdisasm_libdisasm_a_SOURCES = \ + src/third_party/libdisasm/ia32_implicit.c \ + src/third_party/libdisasm/ia32_implicit.h \ + src/third_party/libdisasm/ia32_insn.c \ + src/third_party/libdisasm/ia32_insn.h \ + src/third_party/libdisasm/ia32_invariant.c \ + src/third_party/libdisasm/ia32_invariant.h \ + src/third_party/libdisasm/ia32_modrm.c \ + src/third_party/libdisasm/ia32_modrm.h \ + src/third_party/libdisasm/ia32_opcode_tables.c \ + src/third_party/libdisasm/ia32_opcode_tables.h \ + src/third_party/libdisasm/ia32_operand.c \ + src/third_party/libdisasm/ia32_operand.h \ + src/third_party/libdisasm/ia32_reg.c \ + src/third_party/libdisasm/ia32_reg.h \ + src/third_party/libdisasm/ia32_settings.c \ + src/third_party/libdisasm/ia32_settings.h \ + src/third_party/libdisasm/libdis.h \ + src/third_party/libdisasm/qword.h \ + src/third_party/libdisasm/x86_disasm.c \ + src/third_party/libdisasm/x86_format.c \ + src/third_party/libdisasm/x86_imm.c \ + src/third_party/libdisasm/x86_imm.h \ + src/third_party/libdisasm/x86_insn.c \ + src/third_party/libdisasm/x86_misc.c \ + src/third_party/libdisasm/x86_operand_list.c \ + src/third_party/libdisasm/x86_operand_list.h + + +# Breakpad client +src_client_linux_libbreakpad_client_a_SOURCES = \ + src/client/linux/crash_generation/crash_generation_client.cc \ + src/client/linux/crash_generation/crash_generation_server.cc \ + src/client/linux/dump_writer_common/thread_info.cc \ + src/client/linux/dump_writer_common/ucontext_reader.cc \ + src/client/linux/handler/exception_handler.cc \ + src/client/linux/handler/exception_handler.h \ + src/client/linux/handler/minidump_descriptor.cc \ + src/client/linux/handler/minidump_descriptor.h \ + src/client/linux/log/log.cc src/client/linux/log/log.h \ + src/client/linux/microdump_writer/microdump_writer.cc \ + src/client/linux/microdump_writer/microdump_writer.h \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_dumper.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ + src/client/linux/minidump_writer/minidump_writer.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/minidump_file_writer-inl.h \ + src/client/minidump_file_writer.cc \ + src/client/minidump_file_writer.h src/common/convert_UTF.cc \ + src/common/convert_UTF.h src/common/md5.cc src/common/md5.h \ + src/common/string_conversion.cc src/common/string_conversion.h \ + src/common/linux/elf_core_dump.cc src/common/linux/elfutils.cc \ + src/common/linux/elfutils.h src/common/linux/file_id.cc \ + src/common/linux/file_id.h src/common/linux/guid_creator.cc \ + src/common/linux/guid_creator.h \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc $(am__append_23) + +# Client tests +src_client_linux_linux_dumper_unittest_helper_SOURCES = \ + src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc + +src_client_linux_linux_dumper_unittest_helper_LDFLAGS = $(PTHREAD_CFLAGS) +src_client_linux_linux_dumper_unittest_helper_CC = $(PTHREAD_CC) +@ANDROID_HOST_FALSE@src_client_linux_linux_dumper_unittest_helper_CXXFLAGS = $(PTHREAD_CFLAGS) +# On Android PTHREAD_CFLAGS is empty, and adding src/common/android/include +# to the include path is necessary to build this program. +@ANDROID_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_CXXFLAGS = $(AM_CXXFLAGS) +src_client_linux_linux_client_unittest_shlib_SOURCES = \ + $(src_testing_libtesting_a_SOURCES) \ + src/client/linux/handler/exception_handler_unittest.cc \ + src/client/linux/microdump_writer/microdump_writer_unittest.cc \ + src/client/linux/minidump_writer/directory_reader_unittest.cc \ + src/client/linux/minidump_writer/cpu_set_unittest.cc \ + src/client/linux/minidump_writer/line_reader_unittest.cc \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_core_dumper_unittest.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/linux_libc_support_unittest.cc \ + src/common/linux/scoped_pipe.h src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/common/linux/tests/crash_generator.cc \ + src/common/memory_allocator_unittest.cc \ + src/common/tests/auto_tempdir.h src/common/tests/file_utils.cc \ + src/common/tests/file_utils.h \ + src/processor/basic_code_modules.cc \ + src/processor/convert_old_arm64_context.cc \ + src/processor/dump_context.cc src/processor/dump_object.cc \ + src/processor/logging.cc src/processor/minidump.cc \ + src/processor/pathname_stripper.cc \ + src/processor/proc_maps_linux.cc $(am__append_24) +src_client_linux_linux_client_unittest_shlib_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_client_linux_linux_client_unittest_shlib_LDFLAGS = -shared \ + -Wl,-h,linux_client_unittest_shlib $(am__append_25) +src_client_linux_linux_client_unittest_shlib_LDADD = \ + src/client/linux/crash_generation/crash_generation_client.o \ + src/client/linux/dump_writer_common/thread_info.o \ + src/client/linux/dump_writer_common/ucontext_reader.o \ + src/client/linux/handler/exception_handler.o \ + src/client/linux/handler/minidump_descriptor.o \ + src/client/linux/log/log.o \ + src/client/linux/microdump_writer/microdump_writer.o \ + src/client/linux/minidump_writer/linux_dumper.o \ + src/client/linux/minidump_writer/linux_ptrace_dumper.o \ + src/client/linux/minidump_writer/minidump_writer.o \ + src/client/minidump_file_writer.o \ + src/common/convert_UTF.o \ + src/common/md5.o \ + src/common/linux/elfutils.o \ + src/common/linux/file_id.o \ + src/common/linux/guid_creator.o \ + src/common/linux/linux_libc_support.o \ + src/common/linux/memory_mapped_file.o \ + src/common/linux/safe_readlink.o \ + src/common/string_conversion.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_client_linux_linux_client_unittest_shlib_DEPENDENCIES = \ + src/client/linux/linux_dumper_unittest_helper \ + src/client/linux/libbreakpad_client.a \ + $(TEST_DEPS) \ + src/libbreakpad.a + +src_client_linux_linux_client_unittest_SOURCES = +# The extra-long build id is for a test in minidump_writer_unittest.cc. +src_client_linux_linux_client_unittest_LDFLAGS = \ + -Wl,-rpath,'$$ORIGIN' \ + -Wl,--build-id=0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f \ + $(am__append_26) +src_client_linux_linux_client_unittest_LDADD = \ + src/client/linux/linux_client_unittest_shlib \ + $(TEST_LIBS) + +src_client_linux_linux_client_unittest_DEPENDENCIES = \ + src/client/linux/linux_client_unittest_shlib + + +# Tools +src_tools_linux_core2md_core2md_SOURCES = \ + src/tools/linux/core2md/core2md.cc + +src_tools_linux_core2md_core2md_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_core_handler_core_handler_SOURCES = \ + src/tools/linux/core_handler/core_handler.cc + +src_tools_linux_core_handler_core_handler_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_pid2md_pid2md_SOURCES = \ + src/tools/linux/pid2md/pid2md.cc + +src_tools_linux_pid2md_pid2md_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_dump_syms_dump_syms_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/linux/crc32.cc \ + src/common/linux/dump_symbols.cc \ + src/common/linux/dump_symbols.h \ + src/common/linux/elf_symbols_to_module.cc \ + src/common/linux/elf_symbols_to_module.h \ + src/common/linux/elfutils.cc \ + src/common/linux/file_id.cc \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc \ + src/tools/linux/dump_syms/dump_syms.cc + +src_tools_linux_dump_syms_dump_syms_CXXFLAGS = \ + $(RUSTC_DEMANGLE_CFLAGS) + +src_tools_linux_dump_syms_dump_syms_LDADD = \ + $(RUSTC_DEMANGLE_LIBS) \ + -lz -lzstd + +src_tools_linux_md2core_minidump_2_core_SOURCES = \ + src/common/linux/memory_mapped_file.cc \ + src/common/path_helper.cc \ + src/tools/linux/md2core/minidump-2-core.cc \ + src/tools/linux/md2core/minidump_memory_range.h + +src_tools_linux_symupload_minidump_upload_SOURCES = \ + src/common/linux/http_upload.cc \ + src/common/path_helper.cc \ + src/tools/linux/symupload/minidump_upload.cc + +src_tools_linux_symupload_minidump_upload_LDADD = -ldl +src_tools_linux_symupload_sym_upload_SOURCES = \ + src/common/linux/http_upload.cc \ + src/common/linux/http_upload.h \ + src/common/linux/libcurl_wrapper.cc \ + src/common/linux/libcurl_wrapper.h \ + src/common/linux/symbol_collector_client.cc \ + src/common/linux/symbol_collector_client.h \ + src/common/linux/symbol_upload.cc \ + src/common/linux/symbol_upload.h \ + src/common/path_helper.cc \ + src/tools/linux/symupload/sym_upload.cc + +src_tools_linux_symupload_sym_upload_LDADD = -ldl +src_tools_mac_dump_syms_dump_syms_mac_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/md5.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/mac/arch_utilities.cc \ + src/common/mac/dump_syms.cc \ + src/common/mac/dump_syms.h \ + src/common/mac/file_id.cc \ + src/common/mac/file_id.h \ + src/common/mac/macho_id.cc \ + src/common/mac/macho_id.h \ + src/common/mac/macho_reader.cc \ + src/common/mac/macho_reader.h \ + src/common/mac/macho_utilities.cc \ + src/common/mac/macho_utilities.h \ + src/common/mac/macho_walker.cc \ + src/common/mac/macho_walker.h \ + src/tools/mac/dump_syms/dump_syms_tool.cc + +src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS = \ + -I$(top_srcdir)/src/third_party/mac_headers \ + $(RUSTC_DEMANGLE_CFLAGS) \ + -DHAVE_MACH_O_NLIST_H + +src_tools_mac_dump_syms_dump_syms_mac_LDADD = \ + $(RUSTC_DEMANGLE_LIBS) + +src_common_dumper_unittest_SOURCES = \ + src/common/byte_cursor_unittest.cc \ + src/common/convert_UTF.cc \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cfi_to_module_unittest.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_cu_to_module_unittest.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_line_to_module_unittest.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/memory_range_unittest.cc \ + src/common/module.cc \ + src/common/module_unittest.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_reader_unittest.cc \ + src/common/stabs_to_module.cc \ + src/common/stabs_to_module_unittest.cc \ + src/common/string_conversion.cc \ + src/common/string_conversion_unittest.cc \ + src/common/test_assembler.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/bytereader.h \ + src/common/dwarf/bytereader-inl.h \ + src/common/dwarf/bytereader_unittest.cc \ + src/common/dwarf/cfi_assembler.cc \ + src/common/dwarf/cfi_assembler.h \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2diehandler_unittest.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/elf_reader.cc \ + src/common/dwarf/elf_reader.h \ + src/common/dwarf/dwarf2reader_cfi_unittest.cc \ + src/common/dwarf/dwarf2reader_die_unittest.cc \ + src/common/dwarf/dwarf2reader_test_common.h \ + src/common/linux/crc32.cc \ + src/common/linux/dump_symbols.cc \ + src/common/linux/dump_symbols_unittest.cc \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/elf_core_dump_unittest.cc \ + src/common/linux/elf_symbols_to_module.cc \ + src/common/linux/elf_symbols_to_module_unittest.cc \ + src/common/linux/elfutils.cc \ + src/common/linux/file_id.cc \ + src/common/linux/file_id_unittest.cc \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/memory_mapped_file_unittest.cc \ + src/common/linux/safe_readlink.cc \ + src/common/linux/safe_readlink_unittest.cc \ + src/common/linux/synth_elf.cc \ + src/common/linux/synth_elf_unittest.cc \ + src/common/linux/tests/crash_generator.cc \ + src/common/linux/tests/crash_generator.h \ + src/common/testdata/func-line-pairing.h \ + src/common/tests/file_utils.cc + +src_common_dumper_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) \ + $(RUSTC_DEMANGLE_CFLAGS) \ + $(PTHREAD_CFLAGS) + +src_common_dumper_unittest_LDADD = \ + $(TEST_LIBS) \ + $(RUSTC_DEMANGLE_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + -lz -lzstd + +src_common_mac_macho_reader_unittest_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/language.cc \ + src/common/md5.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/test_assembler.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/cfi_assembler.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/mac/arch_utilities.cc \ + src/common/mac/file_id.cc \ + src/common/mac/macho_id.cc \ + src/common/mac/macho_reader.cc \ + src/common/mac/macho_reader_unittest.cc \ + src/common/mac/macho_utilities.cc \ + src/common/mac/macho_walker.cc \ + src/common/tests/file_utils.cc + +src_common_mac_macho_reader_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) \ + -I$(top_srcdir)/src/third_party/mac_headers \ + -DHAVE_MACH_O_NLIST_H \ + $(PTHREAD_CFLAGS) + +src_common_mac_macho_reader_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_linux_google_crashdump_uploader_test_SOURCES = \ + src/common/linux/google_crashdump_uploader.cc \ + src/common/linux/google_crashdump_uploader_test.cc \ + src/common/linux/libcurl_wrapper.cc + +src_common_linux_google_crashdump_uploader_test_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_linux_google_crashdump_uploader_test_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + -ldl + +src_tools_linux_md2core_minidump_2_core_unittest_SOURCES = \ + src/tools/linux/md2core/minidump_memory_range_unittest.cc + +src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_tools_linux_md2core_minidump_2_core_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_address_map_unittest_SOURCES = \ + src/processor/address_map_unittest.cc + +src_processor_address_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o + +src_processor_basic_source_line_resolver_unittest_SOURCES = \ + src/processor/basic_source_line_resolver_unittest.cc + +src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_basic_source_line_resolver_unittest_LDADD = \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/pathname_stripper.o \ + src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_cfi_frame_info_unittest_SOURCES = \ + src/processor/cfi_frame_info_unittest.cc + +src_processor_cfi_frame_info_unittest_LDADD = \ + src/processor/cfi_frame_info.o \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_cfi_frame_info_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_contained_range_map_unittest_SOURCES = \ + src/processor/contained_range_map_unittest.cc + +src_processor_contained_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o + +src_processor_exploitability_unittest_SOURCES = \ + src/processor/exploitability_unittest.cc + +src_processor_exploitability_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_exploitability_unittest_LDADD = \ + src/processor/convert_old_arm64_context.o \ + src/processor/minidump_processor.o \ + src/processor/process_state.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(am__append_27) +src_common_linux_scoped_pipe_unittest_SOURCES = \ + src/common/linux/scoped_pipe_unittest.cc + +src_common_linux_scoped_pipe_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_linux_scoped_pipe_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_linux_scoped_tmpfile_unittest_SOURCES = \ + src/common/linux/scoped_tmpfile_unittest.cc + +src_common_linux_scoped_tmpfile_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_linux_scoped_tmpfile_unittest_LDADD = \ + src/common/linux/scoped_tmpfile.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_disassembler_objdump_unittest_SOURCES = \ + src/processor/disassembler_objdump_unittest.cc + +src_processor_disassembler_objdump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_disassembler_objdump_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_disassembler_x86_unittest_SOURCES = \ + src/processor/disassembler_x86_unittest.cc + +src_processor_disassembler_x86_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_disassembler_x86_unittest_LDADD = \ + src/processor/disassembler_x86.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_fast_source_line_resolver_unittest_SOURCES = \ + src/processor/fast_source_line_resolver_unittest.cc -# Specify include paths for ac macros -ACLOCAL_AMFLAGS = -I m4 +src_processor_fast_source_line_resolver_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_fast_source_line_resolver_unittest_LDADD = \ + src/processor/fast_source_line_resolver.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/module_comparer.o \ + src/processor/module_serializer.o \ + src/processor/pathname_stripper.o \ + src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_map_serializers_unittest_SOURCES = \ + src/processor/map_serializers_unittest.cc -# License file is called LICENSE not COPYING -AUTOMAKE_OPTIONS = foreign -dist_doc_DATA = \ - AUTHORS \ - ChangeLog \ - INSTALL \ - LICENSE \ - NEWS \ - README.md +src_processor_map_serializers_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) -@LINUX_HOST_TRUE@includeclhdir = $(includedir)/$(PACKAGE)/client/linux/handler -@LINUX_HOST_TRUE@includeclh_HEADERS = $(top_srcdir)/src/client/linux/handler/*.h -@LINUX_HOST_TRUE@includecldwcdir = $(includedir)/$(PACKAGE)/client/linux/dump_writer_common -@LINUX_HOST_TRUE@includecldwc_HEADERS = $(top_srcdir)/src/client/linux/dump_writer_common/*.h -@LINUX_HOST_TRUE@includeclmdir = $(includedir)/$(PACKAGE)/client/linux/minidump_writer -@LINUX_HOST_TRUE@includeclm_HEADERS = $(top_srcdir)/src/client/linux/minidump_writer/*.h -@LINUX_HOST_TRUE@includeclcdir = $(includedir)/$(PACKAGE)/client/linux/crash_generation -@LINUX_HOST_TRUE@includeclc_HEADERS = $(top_srcdir)/src/client/linux/crash_generation/*.h -@LINUX_HOST_TRUE@includelssdir = $(includedir)/$(PACKAGE)/third_party/lss -@LINUX_HOST_TRUE@includelss_HEADERS = $(top_srcdir)/src/third_party/lss/*.h -@LINUX_HOST_TRUE@includecldir = $(includedir)/$(PACKAGE)/common/linux -@LINUX_HOST_TRUE@includecl_HEADERS = $(top_srcdir)/src/common/linux/*.h -includegbcdir = $(includedir)/$(PACKAGE)/google_breakpad/common -includegbc_HEADERS = $(top_srcdir)/src/google_breakpad/common/*.h -includecdir = $(includedir)/$(PACKAGE)/common -includec_HEADERS = $(top_srcdir)/src/common/*.h -includepdir = $(includedir)/$(PACKAGE)/processor -includep_HEADERS = $(top_srcdir)/src/processor/*.h -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = $(am__append_5) $(am__append_8) -@SYSTEM_TEST_LIBS_FALSE@TEST_CFLAGS = \ -@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/include \ -@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googletest/include \ -@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googletest \ -@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googlemock/include \ -@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googlemock \ -@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing +src_processor_map_serializers_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) -@SYSTEM_TEST_LIBS_TRUE@TEST_CFLAGS = $(GTEST_CFLAGS) $(GMOCK_CFLAGS) -@SYSTEM_TEST_LIBS_FALSE@TEST_LIBS = src/testing/libtesting.a -@SYSTEM_TEST_LIBS_TRUE@TEST_LIBS = $(GTEST_LIBS) -lgtest_main $(GMOCK_LIBS) -@SYSTEM_TEST_LIBS_FALSE@TEST_DEPS = $(TEST_LIBS) -@SYSTEM_TEST_LIBS_TRUE@TEST_DEPS = -check_LIBRARIES = src/testing/libtesting.a -noinst_LIBRARIES = $(am__append_6) -lib_LIBRARIES = $(am__append_4) $(am__append_7) -CLEANFILES = $(am__append_12) -@SYSTEM_TEST_LIBS_FALSE@src_testing_libtesting_a_SOURCES = \ -@SYSTEM_TEST_LIBS_FALSE@ src/breakpad_googletest_includes.h \ -@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/gtest-all.cc \ -@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/gtest_main.cc \ -@SYSTEM_TEST_LIBS_FALSE@ src/testing/googlemock/src/gmock-all.cc +src_processor_microdump_processor_unittest_SOURCES = \ + src/processor/microdump_processor_unittest.cc -@SYSTEM_TEST_LIBS_FALSE@src_testing_libtesting_a_CPPFLAGS = \ -@SYSTEM_TEST_LIBS_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_microdump_processor_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_microdump_processor_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(TEST_LIBS) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(am__append_28) +src_processor_minidump_processor_unittest_SOURCES = \ + src/processor/minidump_processor_unittest.cc -@LINUX_HOST_TRUE@src_client_linux_libbreakpad_client_a_SOURCES = src/client/linux/crash_generation/crash_generation_client.cc \ -@LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_server.cc \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/thread_info.cc \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/ucontext_reader.cc \ -@LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.cc \ -@LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.h \ -@LINUX_HOST_TRUE@ src/client/linux/handler/minidump_descriptor.cc \ -@LINUX_HOST_TRUE@ src/client/linux/handler/minidump_descriptor.h \ -@LINUX_HOST_TRUE@ src/client/linux/log/log.cc \ -@LINUX_HOST_TRUE@ src/client/linux/log/log.h \ -@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/microdump_writer.cc \ -@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/microdump_writer.h \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_core_dumper.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_dumper.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/minidump_writer.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/pe_file.cc \ -@LINUX_HOST_TRUE@ src/client/minidump_file_writer-inl.h \ -@LINUX_HOST_TRUE@ src/client/minidump_file_writer.cc \ -@LINUX_HOST_TRUE@ src/client/minidump_file_writer.h \ -@LINUX_HOST_TRUE@ src/common/convert_UTF.cc \ -@LINUX_HOST_TRUE@ src/common/convert_UTF.h src/common/md5.cc \ -@LINUX_HOST_TRUE@ src/common/md5.h \ -@LINUX_HOST_TRUE@ src/common/string_conversion.cc \ -@LINUX_HOST_TRUE@ src/common/string_conversion.h \ -@LINUX_HOST_TRUE@ src/common/linux/elf_core_dump.cc \ -@LINUX_HOST_TRUE@ src/common/linux/elfutils.cc \ -@LINUX_HOST_TRUE@ src/common/linux/elfutils.h \ -@LINUX_HOST_TRUE@ src/common/linux/file_id.cc \ -@LINUX_HOST_TRUE@ src/common/linux/file_id.h \ -@LINUX_HOST_TRUE@ src/common/linux/guid_creator.cc \ -@LINUX_HOST_TRUE@ src/common/linux/guid_creator.h \ -@LINUX_HOST_TRUE@ src/common/linux/linux_libc_support.cc \ -@LINUX_HOST_TRUE@ src/common/linux/memory_mapped_file.cc \ -@LINUX_HOST_TRUE@ src/common/linux/safe_readlink.cc \ -@LINUX_HOST_TRUE@ $(am__append_9) -@DISABLE_PROCESSOR_FALSE@src_libbreakpad_a_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/common/breakpad_types.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/common/minidump_format.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/common/minidump_size.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/basic_source_line_resolver.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/call_stack.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/code_module.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/code_modules.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/dump_context.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/dump_object.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/exploitability.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/fast_source_line_resolver.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/memory_region.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/microdump.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/microdump_processor.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/minidump.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/minidump_processor.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/process_result.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/process_state.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/proc_maps_linux.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_base.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_interface.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame_cpu.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame_symbolizer.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stackwalker.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/symbol_supplier.h \ -@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/system_info.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/address_map-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/address_map.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_module.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver_types.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver_types.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/linked_ptr.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_comparer.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_comparer.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_factory.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/range_map-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/range_map.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_serializer-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_serializer.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/windows_frame_info.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base_types.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalk_common.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalk_common.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_iterator-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_iterator.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_map-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_map.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map-inl.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.h - -@DISABLE_PROCESSOR_FALSE@src_third_party_libdisasm_libdisasm_a_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_implicit.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_implicit.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_insn.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_insn.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_invariant.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_invariant.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_modrm.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_modrm.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_opcode_tables.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_opcode_tables.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_operand.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_operand.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_reg.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_reg.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_settings.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/ia32_settings.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdis.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/qword.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_disasm.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_format.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_imm.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_imm.h \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_insn.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_misc.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_operand_list.c \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/x86_operand_list.h +src_processor_minidump_processor_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_minidump_processor_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump_processor.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(am__append_29) +src_processor_minidump_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/minidump_unittest.cc \ + src/processor/synth_minidump.cc -@DISABLE_PROCESSOR_FALSE@check_SCRIPTS = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk_test \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk_machine_readable_test \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump_test \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_test \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_machine_readable_test +src_processor_minidump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_minidump_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_proc_maps_linux_unittest_SOURCES = \ + src/processor/proc_maps_linux.cc \ + src/processor/proc_maps_linux_unittest.cc -TESTS = $(check_PROGRAMS) $(check_SCRIPTS) -@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_FALSE@LOG_DRIVER = $(top_srcdir)/autotools/test-driver -# The default Autotools test driver script. -@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_TRUE@LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver +src_processor_proc_maps_linux_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) -# Since Autotools 1.2, tests are run through a special "test driver" script. -# Unfortunately, it's not possible anymore to specify an alternative shell to -# run them on connected devices, so use a slightly modified version of the -# driver for Android. -@ANDROID_HOST_TRUE@LOG_DRIVER = $(top_srcdir)/android/test-driver -@LINUX_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_SOURCES = \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc +src_processor_proc_maps_linux_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) -@LINUX_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_LDFLAGS = $(PTHREAD_CFLAGS) -@LINUX_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_CC = $(PTHREAD_CC) -@ANDROID_HOST_FALSE@@LINUX_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_CXXFLAGS = $(PTHREAD_CFLAGS) -# On Android PTHREAD_CFLAGS is empty, and adding src/common/android/include -# to the include path is necessary to build this program. -@ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_CXXFLAGS = $(AM_CXXFLAGS) -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_shlib_SOURCES = \ -@LINUX_HOST_TRUE@ $(src_testing_libtesting_a_SOURCES) \ -@LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/microdump_writer_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/directory_reader_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/cpu_set_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/line_reader_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_core_dumper.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_core_dumper_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/minidump_writer_unittest.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/pe_file.cc \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc \ -@LINUX_HOST_TRUE@ src/common/linux/elf_core_dump.cc \ -@LINUX_HOST_TRUE@ src/common/linux/linux_libc_support_unittest.cc \ -@LINUX_HOST_TRUE@ src/common/linux/tests/auto_testfile.h \ -@LINUX_HOST_TRUE@ src/common/linux/tests/crash_generator.cc \ -@LINUX_HOST_TRUE@ src/common/memory_allocator_unittest.cc \ -@LINUX_HOST_TRUE@ src/common/tests/auto_tempdir.h \ -@LINUX_HOST_TRUE@ src/common/tests/file_utils.cc \ -@LINUX_HOST_TRUE@ src/common/tests/file_utils.h \ -@LINUX_HOST_TRUE@ src/processor/basic_code_modules.cc \ -@LINUX_HOST_TRUE@ src/processor/convert_old_arm64_context.cc \ -@LINUX_HOST_TRUE@ src/processor/dump_context.cc \ -@LINUX_HOST_TRUE@ src/processor/dump_object.cc \ -@LINUX_HOST_TRUE@ src/processor/logging.cc \ -@LINUX_HOST_TRUE@ src/processor/minidump.cc \ -@LINUX_HOST_TRUE@ src/processor/pathname_stripper.cc \ -@LINUX_HOST_TRUE@ src/processor/proc_maps_linux.cc \ -@LINUX_HOST_TRUE@ $(am__append_21) -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_shlib_CPPFLAGS = \ -@LINUX_HOST_TRUE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_shlib_LDFLAGS = \ -@LINUX_HOST_TRUE@ -shared -Wl,-h,linux_client_unittest_shlib \ -@LINUX_HOST_TRUE@ $(am__append_22) -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_shlib_LDADD = \ -@LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_client.o \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/thread_info.o \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/ucontext_reader.o \ -@LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.o \ -@LINUX_HOST_TRUE@ src/client/linux/handler/minidump_descriptor.o \ -@LINUX_HOST_TRUE@ src/client/linux/log/log.o \ -@LINUX_HOST_TRUE@ src/client/linux/microdump_writer/microdump_writer.o \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_dumper.o \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/linux_ptrace_dumper.o \ -@LINUX_HOST_TRUE@ src/client/linux/minidump_writer/minidump_writer.o \ -@LINUX_HOST_TRUE@ src/client/minidump_file_writer.o \ -@LINUX_HOST_TRUE@ src/common/convert_UTF.o \ -@LINUX_HOST_TRUE@ src/common/md5.o \ -@LINUX_HOST_TRUE@ src/common/linux/elfutils.o \ -@LINUX_HOST_TRUE@ src/common/linux/file_id.o \ -@LINUX_HOST_TRUE@ src/common/linux/guid_creator.o \ -@LINUX_HOST_TRUE@ src/common/linux/linux_libc_support.o \ -@LINUX_HOST_TRUE@ src/common/linux/memory_mapped_file.o \ -@LINUX_HOST_TRUE@ src/common/linux/safe_readlink.o \ -@LINUX_HOST_TRUE@ src/common/string_conversion.o \ -@LINUX_HOST_TRUE@ $(TEST_LIBS) \ -@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_shlib_DEPENDENCIES = \ -@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper \ -@LINUX_HOST_TRUE@ src/client/linux/libbreakpad_client.a \ -@LINUX_HOST_TRUE@ $(TEST_DEPS) \ -@LINUX_HOST_TRUE@ src/libbreakpad.a +src_processor_static_address_map_unittest_SOURCES = \ + src/processor/static_address_map_unittest.cc -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_SOURCES = -# The extra-long build id is for a test in minidump_writer_unittest.cc. -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_LDFLAGS = \ -@LINUX_HOST_TRUE@ -Wl,-rpath,'$$ORIGIN' \ -@LINUX_HOST_TRUE@ -Wl,--build-id=0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f \ -@LINUX_HOST_TRUE@ $(am__append_23) -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_LDADD = \ -@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib \ -@LINUX_HOST_TRUE@ $(TEST_LIBS) - -@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_DEPENDENCIES = \ -@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib +src_processor_static_address_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_address_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_contained_range_map_unittest_SOURCES = \ + src/processor/static_contained_range_map_unittest.cc + +src_processor_static_contained_range_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_contained_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_map_unittest_SOURCES = \ + src/processor/static_map_unittest.cc + +src_processor_static_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_range_map_unittest_SOURCES = \ + src/processor/static_range_map_unittest.cc + +src_processor_static_range_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_pathname_stripper_unittest_SOURCES = \ + src/processor/pathname_stripper_unittest.cc + +src_processor_pathname_stripper_unittest_LDADD = \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_postfix_evaluator_unittest_SOURCES = \ + src/processor/postfix_evaluator_unittest.cc + +src_processor_postfix_evaluator_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_range_map_truncate_lower_unittest_SOURCES = \ + src/processor/range_map_truncate_lower_unittest.cc + +src_processor_range_map_truncate_lower_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_range_map_truncate_lower_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_range_map_truncate_upper_unittest_SOURCES = \ + src/processor/range_map_truncate_upper_unittest.cc + +src_processor_range_map_truncate_upper_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_range_map_truncate_upper_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_range_map_unittest_SOURCES = \ + src/processor/range_map_unittest.cc + +src_processor_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_selftest_SOURCES = \ + src/processor/stackwalker_selftest.cc + +src_processor_stackwalker_selftest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) $(am__append_30) +src_processor_stackwalker_amd64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_amd64_unittest.cc + +src_processor_stackwalker_amd64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_amd64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_arm_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_arm_unittest.cc + +src_processor_stackwalker_arm_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_arm_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_arm64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_arm64_unittest.cc + +src_processor_stackwalker_arm64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_core2md_core2md_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/core2md/core2md.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_core2md_core2md_LDADD = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/client/linux/libbreakpad_client.a \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.o - -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@src_tools_linux_core_handler_core_handler_SOURCES = \ -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@ src/tools/linux/core_handler/core_handler.cc - -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@src_tools_linux_core_handler_core_handler_LDADD = \ -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@ src/client/linux/libbreakpad_client.a \ -@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@ src/common/path_helper.o - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_pid2md_pid2md_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/pid2md/pid2md.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_pid2md_pid2md_LDADD = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/client/linux/libbreakpad_client.a \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.o - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_dump_syms_dump_syms_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cfi_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_range_list_handler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/language.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2diehandler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/elf_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/crc32.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_symbols_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_symbols_to_module.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elfutils.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/file_id.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/linux_libc_support.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/memory_mapped_file.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/safe_readlink.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_dump_syms_dump_syms_CXXFLAGS = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(RUSTC_DEMANGLE_CFLAGS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_dump_syms_dump_syms_LDADD = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(RUSTC_DEMANGLE_LIBS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_md2core_minidump_2_core_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/memory_mapped_file.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_memory_range.h - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_symupload_minidump_upload_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/http_upload.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_symupload_minidump_upload_LDADD = -ldl -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_symupload_sym_upload_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/http_upload.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/http_upload.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/libcurl_wrapper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/libcurl_wrapper.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/symbol_collector_client.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/symbol_collector_client.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/symbol_upload.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/symbol_upload.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_linux_symupload_sym_upload_LDADD = -ldl -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_mac_dump_syms_dump_syms_mac_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cfi_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_range_list_handler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/language.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/md5.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2diehandler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/elf_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/arch_utilities.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/dump_syms.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/dump_syms.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/file_id.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/file_id.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_id.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_id.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_utilities.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_utilities.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_walker.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_walker.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/mac/dump_syms/dump_syms_tool.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ -I$(top_srcdir)/src/third_party/mac_headers \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(RUSTC_DEMANGLE_CFLAGS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ -DHAVE_MACH_O_NLIST_H - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_tools_mac_dump_syms_dump_syms_mac_LDADD = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(RUSTC_DEMANGLE_LIBS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_safe_math_unittest_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/safe_math.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/safe_math_unittest.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_safe_math_unittest_CPPFLAGS = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_safe_math_unittest_LDADD = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(TEST_LIBS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_dumper_unittest_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/byte_cursor_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/convert_UTF.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cfi_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cfi_to_module_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_range_list_handler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/language.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/memory_range_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_reader_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_to_module_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/string_conversion.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/string_conversion_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/test_assembler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader-inl.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/cfi_assembler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/cfi_assembler.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2diehandler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2diehandler_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/elf_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/elf_reader.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader_cfi_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader_die_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader_test_common.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/crc32.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_core_dump.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_core_dump_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_symbols_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_symbols_to_module_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elfutils.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/file_id.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/file_id_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/linux_libc_support.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/memory_mapped_file.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/memory_mapped_file_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/safe_readlink.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/safe_readlink_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/synth_elf.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/synth_elf_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tests/crash_generator.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/tests/crash_generator.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/testdata/func-line-pairing.h \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tests/file_utils.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_dumper_unittest_CPPFLAGS = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(RUSTC_DEMANGLE_CFLAGS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_dumper_unittest_LDADD = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(TEST_LIBS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(RUSTC_DEMANGLE_LIBS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_mac_macho_reader_unittest_SOURCES = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cfi_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/language.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/md5.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/stabs_to_module.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/test_assembler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/cfi_assembler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2diehandler.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/elf_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/arch_utilities.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/file_id.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_id.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_reader_unittest.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_utilities.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/mac/macho_walker.cc \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/tests/file_utils.cc - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_mac_macho_reader_unittest_CPPFLAGS = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ -I$(top_srcdir)/src/third_party/mac_headers \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ -DHAVE_MACH_O_NLIST_H \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) - -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@src_common_mac_macho_reader_unittest_LDADD = \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(TEST_LIBS) \ -@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@LINUX_HOST_TRUE@src_common_linux_google_crashdump_uploader_test_SOURCES = \ -@LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader.cc \ -@LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader_test.cc \ -@LINUX_HOST_TRUE@ src/common/linux/libcurl_wrapper.cc - -@LINUX_HOST_TRUE@src_common_linux_google_crashdump_uploader_test_CPPFLAGS = \ -@LINUX_HOST_TRUE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@LINUX_HOST_TRUE@src_common_linux_google_crashdump_uploader_test_LDADD = \ -@LINUX_HOST_TRUE@ $(TEST_LIBS) \ -@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ -@LINUX_HOST_TRUE@ -ldl - -@LINUX_HOST_TRUE@src_tools_linux_md2core_minidump_2_core_unittest_SOURCES = \ -@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_memory_range_unittest.cc - -@LINUX_HOST_TRUE@src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS = \ -@LINUX_HOST_TRUE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@LINUX_HOST_TRUE@src_tools_linux_md2core_minidump_2_core_unittest_LDADD = \ -@LINUX_HOST_TRUE@ $(TEST_LIBS) \ -@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_address_map_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/address_map_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_address_map_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o - -@DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_contained_range_map_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_contained_range_map_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o - -@DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_objdump_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_objdump_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_objdump_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_x86_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_x86_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_disassembler_x86_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_comparer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/module_serializer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_map_serializers_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_microdump_processor_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_proc_maps_linux_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_address_map_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_contained_range_map_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_map_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_static_range_map_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_pathname_stripper_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_pathname_stripper_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_postfix_evaluator_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_postfix_evaluator_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_lower_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_truncate_lower_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_lower_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_lower_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_upper_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_truncate_upper_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_upper_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_truncate_upper_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_range_map_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_selftest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_selftest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_selftest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_amd64_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_amd64_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_amd64_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm64_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm64_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_arm64_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_address_list_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_address_list_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_address_list_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips64_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips64_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips64_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_mips64_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv64_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv64_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_riscv64_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_x86_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_x86_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/libbreakpad.a \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_processor_stackwalker_x86_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_synth_minidump_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.h \ -@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump.cc \ -@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump.h - -@DISABLE_PROCESSOR_FALSE@src_processor_synth_minidump_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_processor_synth_minidump_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_common_test_assembler_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.cc \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler.h \ -@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_common_test_assembler_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_common_test_assembler_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader.h \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_lineinfo_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_lineinfo_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/bytereader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/elf_reader.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader.h \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc - -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS = \ -@DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) - -@DISABLE_PROCESSOR_FALSE@src_common_dwarf_dwarf2reader_splitfunctions_unittest_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/bytereader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader.o \ -@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/elf_reader.o \ -@DISABLE_PROCESSOR_FALSE@ $(TEST_LIBS) \ -@DISABLE_PROCESSOR_FALSE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) - -@DISABLE_PROCESSOR_FALSE@noinst_SCRIPTS = $(check_SCRIPTS) -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_dump_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_dump_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/common/path_helper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o - -@DISABLE_PROCESSOR_FALSE@src_processor_microdump_stackwalk_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_microdump_stackwalk_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/common/path_helper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalk_common.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_stackwalk_SOURCES = \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk.cc - -@DISABLE_PROCESSOR_FALSE@src_processor_minidump_stackwalk_LDADD = \ -@DISABLE_PROCESSOR_FALSE@ src/common/path_helper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_objdump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_cpu.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalk_common.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_ppc64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_sparc.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/symbolic_constants_win.o \ -@DISABLE_PROCESSOR_FALSE@ src/processor/tokenize.o \ -@DISABLE_PROCESSOR_FALSE@ src/third_party/libdisasm/libdisasm.a +src_processor_stackwalker_arm64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_stackwalker_address_list_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_address_list_unittest.cc + +src_processor_stackwalker_address_list_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_address_list_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_mips_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_mips_unittest.cc + +src_processor_stackwalker_mips_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_mips_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_mips64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_mips64_unittest.cc + +src_processor_stackwalker_mips64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_mips64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_riscv_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_riscv_unittest.cc + +src_processor_stackwalker_riscv_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_riscv_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_riscv64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_riscv64_unittest.cc + +src_processor_stackwalker_riscv64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_riscv64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_x86_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_x86_unittest.cc + +src_processor_stackwalker_x86_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_x86_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_synth_minidump_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/common/test_assembler.h \ + src/processor/synth_minidump_unittest.cc \ + src/processor/synth_minidump.cc \ + src/processor/synth_minidump.h + +src_processor_synth_minidump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_synth_minidump_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_test_assembler_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/common/test_assembler.h \ + src/common/test_assembler_unittest.cc + +src_common_test_assembler_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_test_assembler_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES = \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/dwarf2reader_lineinfo_unittest.cc + +src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_dwarf_dwarf2reader_lineinfo_unittest_LDADD = \ + src/common/dwarf/bytereader.o \ + src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES = \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc + +src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_dwarf_dwarf2reader_splitfunctions_unittest_LDADD = \ + src/common/dwarf/bytereader.o \ + src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_minidump_dump_SOURCES = \ + src/processor/minidump_dump.cc + +src_processor_minidump_dump_LDADD = \ + src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o + +src_processor_microdump_stackwalk_SOURCES = \ + src/processor/microdump_stackwalk.cc + +src_processor_microdump_stackwalk_LDADD = src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a $(am__append_31) +src_processor_minidump_stackwalk_SOURCES = \ + src/processor/minidump_stackwalk.cc + +src_processor_minidump_stackwalk_LDADD = src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/minidump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__append_32) EXTRA_DIST = \ $(SCRIPTS) \ src/client/linux/data/linux-gate-amd.sym \ @@ -3840,13 +3559,10 @@ EXTRA_DIST = \ src/client/solaris/handler/minidump_test.cc \ src/client/solaris/handler/solaris_lwp.cc \ src/client/solaris/handler/solaris_lwp.h \ - src/client/windows/breakpad_client.gyp \ src/client/windows/handler/exception_handler.cc \ src/client/windows/handler/exception_handler.h \ - src/client/windows/handler/exception_handler.gyp \ src/client/windows/sender/crash_report_sender.cc \ src/client/windows/sender/crash_report_sender.h \ - src/client/windows/sender/crash_report_sender.gyp \ src/common/dwarf/dwarf2diehandler.h \ src/common/dwarf/dwarf2enums.h \ src/common/dwarf/line_state_machine.h \ @@ -4016,10 +3732,12 @@ EXTRA_DIST = \ src/third_party/curl/typecheck-gcc.h \ src/third_party/curl/types.h \ src/third_party/mac_headers/architecture/byte_order.h \ + src/third_party/mac_headers/arm/_types.h \ src/third_party/mac_headers/i386/_types.h \ src/third_party/mac_headers/mach/boolean.h \ + src/third_party/mac_headers/mach/arm/boolean.h \ + src/third_party/mac_headers/mach/arm/vm_types.h \ src/third_party/mac_headers/mach/i386/boolean.h \ - src/third_party/mac_headers/mach/i386/vm_param.h \ src/third_party/mac_headers/mach/i386/vm_types.h \ src/third_party/mac_headers/mach/machine/boolean.h \ src/third_party/mac_headers/mach/machine.h \ @@ -4056,9 +3774,7 @@ EXTRA_DIST = \ src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym \ src/tools/windows/converter/ms_symbol_server_converter.cc \ src/tools/windows/converter/ms_symbol_server_converter.h \ - src/tools/windows/converter/ms_symbol_server_converter.gyp \ src/tools/windows/dump_syms/dump_syms.cc \ - src/tools/windows/dump_syms/dump_syms.gyp \ src/tools/windows/dump_syms/run_regtest.sh \ src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc \ src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb \ @@ -4068,8 +3784,7 @@ EXTRA_DIST = \ src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym \ src/tools/windows/dump_syms/testdata/omap_stretched.sym \ src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym \ - src/tools/windows/symupload/symupload.cc \ - src/tools/windows/symupload/symupload.gyp + src/tools/windows/symupload/symupload.cc all: all-am @@ -4404,9 +4119,6 @@ src/processor/cfi_frame_info.$(OBJEXT): src/processor/$(am__dirstamp) \ src/processor/convert_old_arm64_context.$(OBJEXT): \ src/processor/$(am__dirstamp) \ src/processor/$(DEPDIR)/$(am__dirstamp) -src/processor/disassembler_objdump.$(OBJEXT): \ - src/processor/$(am__dirstamp) \ - src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/disassembler_x86.$(OBJEXT): \ src/processor/$(am__dirstamp) \ src/processor/$(DEPDIR)/$(am__dirstamp) @@ -4506,6 +4218,15 @@ src/processor/symbolic_constants_win.$(OBJEXT): \ src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/tokenize.$(OBJEXT): src/processor/$(am__dirstamp) \ src/processor/$(DEPDIR)/$(am__dirstamp) +src/common/linux/scoped_pipe.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/scoped_tmpfile.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/processor/disassembler_objdump.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) @@ -4651,6 +4372,12 @@ src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.$(OBJEXT src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.$(OBJEXT): \ src/common/linux/$(am__dirstamp) \ src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) src/common/linux/tests/$(am__dirstamp): @$(MKDIR_P) src/common/linux/tests @: > src/common/linux/tests/$(am__dirstamp) @@ -4897,6 +4624,20 @@ src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.$(OBJEXT): \ src/common/linux/google_crashdump_uploader_test$(EXEEXT): $(src_common_linux_google_crashdump_uploader_test_OBJECTS) $(src_common_linux_google_crashdump_uploader_test_DEPENDENCIES) $(EXTRA_src_common_linux_google_crashdump_uploader_test_DEPENDENCIES) src/common/linux/$(am__dirstamp) @rm -f src/common/linux/google_crashdump_uploader_test$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(src_common_linux_google_crashdump_uploader_test_OBJECTS) $(src_common_linux_google_crashdump_uploader_test_LDADD) $(LIBS) +src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) + +src/common/linux/scoped_pipe_unittest$(EXEEXT): $(src_common_linux_scoped_pipe_unittest_OBJECTS) $(src_common_linux_scoped_pipe_unittest_DEPENDENCIES) $(EXTRA_src_common_linux_scoped_pipe_unittest_DEPENDENCIES) src/common/linux/$(am__dirstamp) + @rm -f src/common/linux/scoped_pipe_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_linux_scoped_pipe_unittest_OBJECTS) $(src_common_linux_scoped_pipe_unittest_LDADD) $(LIBS) +src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) + +src/common/linux/scoped_tmpfile_unittest$(EXEEXT): $(src_common_linux_scoped_tmpfile_unittest_OBJECTS) $(src_common_linux_scoped_tmpfile_unittest_DEPENDENCIES) $(EXTRA_src_common_linux_scoped_tmpfile_unittest_DEPENDENCIES) src/common/linux/$(am__dirstamp) + @rm -f src/common/linux/scoped_tmpfile_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_linux_scoped_tmpfile_unittest_OBJECTS) $(src_common_linux_scoped_tmpfile_unittest_LDADD) $(LIBS) src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.$(OBJEXT): \ src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) @@ -5687,6 +5428,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po@am__quote@ # am--include-marker @@ -5716,6 +5459,10 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/linux_libc_support.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/memory_mapped_file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/safe_readlink.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_pipe.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_tmpfile.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/symbol_collector_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/symbol_upload.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po@am__quote@ # am--include-marker @@ -6212,6 +5959,34 @@ src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_uni @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.obj `if test -f 'src/common/linux/linux_libc_support_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/linux_libc_support_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/linux_libc_support_unittest.cc'; fi` +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o: src/common/linux/scoped_pipe.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o `test -f 'src/common/linux/scoped_pipe.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o `test -f 'src/common/linux/scoped_pipe.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe.cc + +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj: src/common/linux/scoped_pipe.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj `if test -f 'src/common/linux/scoped_pipe.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj `if test -f 'src/common/linux/scoped_pipe.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe.cc'; fi` + +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o: src/common/linux/scoped_tmpfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o `test -f 'src/common/linux/scoped_tmpfile.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o `test -f 'src/common/linux/scoped_tmpfile.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile.cc + +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj: src/common/linux/scoped_tmpfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj `if test -f 'src/common/linux/scoped_tmpfile.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj `if test -f 'src/common/linux/scoped_tmpfile.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile.cc'; fi` + src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o: src/common/linux/tests/crash_generator.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o -MD -MP -MF src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Tpo -c -o src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o `test -f 'src/common/linux/tests/crash_generator.cc' || echo '$(srcdir)/'`src/common/linux/tests/crash_generator.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Tpo src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Po @@ -7150,6 +6925,34 @@ src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.obj: src/common/ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.obj `if test -f 'src/common/linux/libcurl_wrapper.cc'; then $(CYGPATH_W) 'src/common/linux/libcurl_wrapper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/libcurl_wrapper.cc'; fi` +src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o: src/common/linux/scoped_pipe_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o `test -f 'src/common/linux/scoped_pipe_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe_unittest.cc' object='src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o `test -f 'src/common/linux/scoped_pipe_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe_unittest.cc + +src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj: src/common/linux/scoped_pipe_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj `if test -f 'src/common/linux/scoped_pipe_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe_unittest.cc' object='src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj `if test -f 'src/common/linux/scoped_pipe_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe_unittest.cc'; fi` + +src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o: src/common/linux/scoped_tmpfile_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o `test -f 'src/common/linux/scoped_tmpfile_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile_unittest.cc' object='src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o `test -f 'src/common/linux/scoped_tmpfile_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile_unittest.cc + +src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj: src/common/linux/scoped_tmpfile_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj `if test -f 'src/common/linux/scoped_tmpfile_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile_unittest.cc' object='src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj `if test -f 'src/common/linux/scoped_tmpfile_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile_unittest.cc'; fi` + src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o: src/common/dwarf_cfi_to_module.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Po @@ -9205,13 +9008,6 @@ src/processor/contained_range_map_unittest.log: src/processor/contained_range_ma --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) -src/processor/disassembler_objdump_unittest.log: src/processor/disassembler_objdump_unittest$(EXEEXT) - @p='src/processor/disassembler_objdump_unittest$(EXEEXT)'; \ - b='src/processor/disassembler_objdump_unittest'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) src/processor/disassembler_x86_unittest.log: src/processor/disassembler_x86_unittest$(EXEEXT) @p='src/processor/disassembler_x86_unittest$(EXEEXT)'; \ b='src/processor/disassembler_x86_unittest'; \ @@ -9401,6 +9197,34 @@ src/processor/synth_minidump_unittest.log: src/processor/synth_minidump_unittest --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/disassembler_objdump_unittest.log: src/processor/disassembler_objdump_unittest$(EXEEXT) + @p='src/processor/disassembler_objdump_unittest$(EXEEXT)'; \ + b='src/processor/disassembler_objdump_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/linux/scoped_pipe_unittest.log: src/common/linux/scoped_pipe_unittest$(EXEEXT) + @p='src/common/linux/scoped_pipe_unittest$(EXEEXT)'; \ + b='src/common/linux/scoped_pipe_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/linux/scoped_tmpfile_unittest.log: src/common/linux/scoped_tmpfile_unittest$(EXEEXT) + @p='src/common/linux/scoped_tmpfile_unittest$(EXEEXT)'; \ + b='src/common/linux/scoped_tmpfile_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_selftest.log: src/processor/stackwalker_selftest$(EXEEXT) + @p='src/processor/stackwalker_selftest$(EXEEXT)'; \ + b='src/processor/stackwalker_selftest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) src/client/linux/linux_client_unittest.log: src/client/linux/linux_client_unittest$(EXEEXT) @p='src/client/linux/linux_client_unittest$(EXEEXT)'; \ b='src/client/linux/linux_client_unittest'; \ @@ -9436,13 +9260,6 @@ src/common/mac/macho_reader_unittest.log: src/common/mac/macho_reader_unittest$( --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) -src/processor/stackwalker_selftest.log: src/processor/stackwalker_selftest$(EXEEXT) - @p='src/processor/stackwalker_selftest$(EXEEXT)'; \ - b='src/processor/stackwalker_selftest'; \ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) src/processor/microdump_stackwalk_test.log: src/processor/microdump_stackwalk_test @p='src/processor/microdump_stackwalk_test'; \ b='src/processor/microdump_stackwalk_test'; \ @@ -9893,6 +9710,8 @@ distclean: distclean-am -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po @@ -9922,6 +9741,10 @@ distclean: distclean-am -rm -f src/common/linux/$(DEPDIR)/linux_libc_support.Po -rm -f src/common/linux/$(DEPDIR)/memory_mapped_file.Po -rm -f src/common/linux/$(DEPDIR)/safe_readlink.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po -rm -f src/common/linux/$(DEPDIR)/symbol_collector_client.Po -rm -f src/common/linux/$(DEPDIR)/symbol_upload.Po -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po @@ -10247,6 +10070,8 @@ maintainer-clean: maintainer-clean-am -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po @@ -10276,6 +10101,10 @@ maintainer-clean: maintainer-clean-am -rm -f src/common/linux/$(DEPDIR)/linux_libc_support.Po -rm -f src/common/linux/$(DEPDIR)/memory_mapped_file.Po -rm -f src/common/linux/$(DEPDIR)/safe_readlink.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po -rm -f src/common/linux/$(DEPDIR)/symbol_collector_client.Po -rm -f src/common/linux/$(DEPDIR)/symbol_upload.Po -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po diff --git a/shared/sentry/external/breakpad/NEWS b/shared/sentry/src/external/breakpad/NEWS similarity index 100% rename from shared/sentry/external/breakpad/NEWS rename to shared/sentry/src/external/breakpad/NEWS diff --git a/shared/sentry/external/breakpad/OWNERS b/shared/sentry/src/external/breakpad/OWNERS similarity index 100% rename from shared/sentry/external/breakpad/OWNERS rename to shared/sentry/src/external/breakpad/OWNERS diff --git a/shared/sentry/external/breakpad/README.ANDROID b/shared/sentry/src/external/breakpad/README.ANDROID similarity index 100% rename from shared/sentry/external/breakpad/README.ANDROID rename to shared/sentry/src/external/breakpad/README.ANDROID diff --git a/shared/sentry/external/breakpad/README.md b/shared/sentry/src/external/breakpad/README.md similarity index 100% rename from shared/sentry/external/breakpad/README.md rename to shared/sentry/src/external/breakpad/README.md diff --git a/shared/sentry/external/breakpad/aclocal.m4 b/shared/sentry/src/external/breakpad/aclocal.m4 similarity index 97% rename from shared/sentry/external/breakpad/aclocal.m4 rename to shared/sentry/src/external/breakpad/aclocal.m4 index 009cc48ed..31be0bad8 100644 --- a/shared/sentry/external/breakpad/aclocal.m4 +++ b/shared/sentry/src/external/breakpad/aclocal.m4 @@ -848,35 +848,6 @@ else fi ]) -# -*- Autoconf -*- -# Obsolete and "removed" macros, that must however still report explicit -# error messages when used, to smooth transition. -# -# Copyright (C) 1996-2021 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -AC_DEFUN([AM_CONFIG_HEADER], -[AC_DIAGNOSE([obsolete], -['$0': this macro is obsolete. -You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl -AC_CONFIG_HEADERS($@)]) - -AC_DEFUN([AM_PROG_CC_STDC], -[AC_PROG_CC -am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc -AC_DIAGNOSE([obsolete], -['$0': this macro is obsolete. -You should simply use the 'AC][_PROG_CC' macro instead. -Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', -but upon 'ac_cv_prog_cc_stdc'.])]) - -AC_DEFUN([AM_C_PROTOTYPES], - [AC_FATAL([automatic de-ANSI-fication support has been removed])]) -AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) - # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. diff --git a/shared/sentry/external/breakpad/android/common-functions.sh b/shared/sentry/src/external/breakpad/android/common-functions.sh similarity index 100% rename from shared/sentry/external/breakpad/android/common-functions.sh rename to shared/sentry/src/external/breakpad/android/common-functions.sh diff --git a/shared/sentry/external/breakpad/android/google_breakpad/Android.mk b/shared/sentry/src/external/breakpad/android/google_breakpad/Android.mk similarity index 100% rename from shared/sentry/external/breakpad/android/google_breakpad/Android.mk rename to shared/sentry/src/external/breakpad/android/google_breakpad/Android.mk diff --git a/shared/sentry/external/breakpad/android/run-checks.sh b/shared/sentry/src/external/breakpad/android/run-checks.sh similarity index 100% rename from shared/sentry/external/breakpad/android/run-checks.sh rename to shared/sentry/src/external/breakpad/android/run-checks.sh diff --git a/shared/sentry/external/breakpad/android/sample_app/README b/shared/sentry/src/external/breakpad/android/sample_app/README similarity index 100% rename from shared/sentry/external/breakpad/android/sample_app/README rename to shared/sentry/src/external/breakpad/android/sample_app/README diff --git a/shared/sentry/external/breakpad/android/sample_app/jni/Android.mk b/shared/sentry/src/external/breakpad/android/sample_app/jni/Android.mk similarity index 100% rename from shared/sentry/external/breakpad/android/sample_app/jni/Android.mk rename to shared/sentry/src/external/breakpad/android/sample_app/jni/Android.mk diff --git a/shared/sentry/external/breakpad/android/sample_app/jni/Application.mk b/shared/sentry/src/external/breakpad/android/sample_app/jni/Application.mk similarity index 100% rename from shared/sentry/external/breakpad/android/sample_app/jni/Application.mk rename to shared/sentry/src/external/breakpad/android/sample_app/jni/Application.mk diff --git a/shared/sentry/external/breakpad/android/sample_app/jni/test_breakpad.cpp b/shared/sentry/src/external/breakpad/android/sample_app/jni/test_breakpad.cpp similarity index 100% rename from shared/sentry/external/breakpad/android/sample_app/jni/test_breakpad.cpp rename to shared/sentry/src/external/breakpad/android/sample_app/jni/test_breakpad.cpp diff --git a/shared/sentry/external/breakpad/android/test-driver b/shared/sentry/src/external/breakpad/android/test-driver similarity index 100% rename from shared/sentry/external/breakpad/android/test-driver rename to shared/sentry/src/external/breakpad/android/test-driver diff --git a/shared/sentry/external/breakpad/android/test-shell.sh b/shared/sentry/src/external/breakpad/android/test-shell.sh similarity index 100% rename from shared/sentry/external/breakpad/android/test-shell.sh rename to shared/sentry/src/external/breakpad/android/test-shell.sh diff --git a/shared/sentry/external/breakpad/appveyor.yml b/shared/sentry/src/external/breakpad/appveyor.yml similarity index 100% rename from shared/sentry/external/breakpad/appveyor.yml rename to shared/sentry/src/external/breakpad/appveyor.yml diff --git a/shared/sentry/external/breakpad/autotools/ar-lib b/shared/sentry/src/external/breakpad/autotools/ar-lib similarity index 100% rename from shared/sentry/external/breakpad/autotools/ar-lib rename to shared/sentry/src/external/breakpad/autotools/ar-lib diff --git a/shared/sentry/external/breakpad/autotools/compile b/shared/sentry/src/external/breakpad/autotools/compile similarity index 100% rename from shared/sentry/external/breakpad/autotools/compile rename to shared/sentry/src/external/breakpad/autotools/compile diff --git a/shared/sentry/external/breakpad/autotools/config.guess b/shared/sentry/src/external/breakpad/autotools/config.guess similarity index 100% rename from shared/sentry/external/breakpad/autotools/config.guess rename to shared/sentry/src/external/breakpad/autotools/config.guess diff --git a/shared/sentry/external/breakpad/autotools/config.sub b/shared/sentry/src/external/breakpad/autotools/config.sub similarity index 100% rename from shared/sentry/external/breakpad/autotools/config.sub rename to shared/sentry/src/external/breakpad/autotools/config.sub diff --git a/shared/sentry/external/breakpad/autotools/depcomp b/shared/sentry/src/external/breakpad/autotools/depcomp similarity index 100% rename from shared/sentry/external/breakpad/autotools/depcomp rename to shared/sentry/src/external/breakpad/autotools/depcomp diff --git a/shared/sentry/external/breakpad/autotools/install-sh b/shared/sentry/src/external/breakpad/autotools/install-sh similarity index 100% rename from shared/sentry/external/breakpad/autotools/install-sh rename to shared/sentry/src/external/breakpad/autotools/install-sh diff --git a/shared/sentry/external/breakpad/autotools/ltmain.sh b/shared/sentry/src/external/breakpad/autotools/ltmain.sh similarity index 100% rename from shared/sentry/external/breakpad/autotools/ltmain.sh rename to shared/sentry/src/external/breakpad/autotools/ltmain.sh diff --git a/shared/sentry/external/breakpad/autotools/missing b/shared/sentry/src/external/breakpad/autotools/missing similarity index 100% rename from shared/sentry/external/breakpad/autotools/missing rename to shared/sentry/src/external/breakpad/autotools/missing diff --git a/shared/sentry/external/breakpad/autotools/root-test-driver b/shared/sentry/src/external/breakpad/autotools/root-test-driver similarity index 100% rename from shared/sentry/external/breakpad/autotools/root-test-driver rename to shared/sentry/src/external/breakpad/autotools/root-test-driver diff --git a/shared/sentry/external/breakpad/autotools/test-driver b/shared/sentry/src/external/breakpad/autotools/test-driver similarity index 100% rename from shared/sentry/external/breakpad/autotools/test-driver rename to shared/sentry/src/external/breakpad/autotools/test-driver diff --git a/shared/sentry/external/breakpad/breakpad-client.pc.in b/shared/sentry/src/external/breakpad/breakpad-client.pc.in similarity index 100% rename from shared/sentry/external/breakpad/breakpad-client.pc.in rename to shared/sentry/src/external/breakpad/breakpad-client.pc.in diff --git a/shared/sentry/external/breakpad/breakpad.pc.in b/shared/sentry/src/external/breakpad/breakpad.pc.in similarity index 100% rename from shared/sentry/external/breakpad/breakpad.pc.in rename to shared/sentry/src/external/breakpad/breakpad.pc.in diff --git a/shared/sentry/external/breakpad/codereview.settings b/shared/sentry/src/external/breakpad/codereview.settings similarity index 100% rename from shared/sentry/external/breakpad/codereview.settings rename to shared/sentry/src/external/breakpad/codereview.settings diff --git a/shared/sentry/external/breakpad/configure b/shared/sentry/src/external/breakpad/configure similarity index 90% rename from shared/sentry/external/breakpad/configure rename to shared/sentry/src/external/breakpad/configure index d131f5a91..3442e7969 100755 --- a/shared/sentry/external/breakpad/configure +++ b/shared/sentry/src/external/breakpad/configure @@ -182,8 +182,7 @@ test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes @@ -685,8 +684,6 @@ PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC ax_pthread_config -EGREP -GREP RANLIB am__fastdepCXX_FALSE am__fastdepCXX_TRUE @@ -813,6 +810,7 @@ enable_system_test_libs enable_selftest with_rustc_demangle enable_system_rustc_demangle +enable_zstd with_tests_as_root ' ac_precious_vars='build_alias @@ -1486,6 +1484,7 @@ Optional Features: is no). This assumes that rustc-demangle is installed in your sysroot, and all headers from it are available in your standard include path + --enable-zstd Enable decompression of ELF sections with zstd Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1719,39 +1718,6 @@ fi } # ac_fn_cxx_try_compile -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -printf %s "checking for $2... " >&6; } -if eval test \${$3+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - eval "$3=yes" -else $as_nop - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -eval ac_res=\$$3 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. @@ -1799,6 +1765,39 @@ fi } # ac_fn_c_try_link +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly @@ -6597,11 +6596,11 @@ if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } -if test ${ac_cv_prog_cxx_11+y} +if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_11=no + ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -6643,11 +6642,11 @@ if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } -if test ${ac_cv_prog_cxx_98+y} +if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_98=no + ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -6937,180 +6936,6 @@ if test "x$enable_m32" = xyes; then CXXFLAGS="${CXXFLAGS} -m32" fi -# Autoupdate added the next two lines to ensure that your configure -# script's behavior did not change. They are probably safe to remove. -ac_header= ac_cache= -for ac_item in $ac_header_c_list -do - if test $ac_cache; then - ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" - if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then - printf "%s\n" "#define $ac_item 1" >> confdefs.h - fi - ac_header= ac_cache= - elif test $ac_header; then - ac_cache=$ac_item - else - ac_header=$ac_item - fi -done - - - - - - - - -if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes -then : - -printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -printf %s "checking for grep that handles long lines and -e... " >&6; } -if test ${ac_cv_path_GREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in grep ggrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -printf "%s\n" "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -printf %s "checking for egrep... " >&6; } -if test ${ac_cv_path_EGREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in egrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -printf "%s\n" "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - - # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : @@ -7678,6 +7503,35 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi ac_fn_c_check_header_compile "$LINENO" "a.out.h" "ac_cv_header_a_out_h" "$ac_includes_default" if test "x$ac_cv_header_a_out_h" = xyes then : @@ -7748,23 +7602,13 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no - - - - - if test x$ac_success = xno; then - for alternative in ${ax_cxx_compile_alternatives}; do - for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do - cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 -printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } -if eval test \${$cachevar+y} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features by default" >&5 +printf %s "checking whether $CXX supports C++17 features by default... " >&6; } +if test ${ax_cv_cxx_compile_cxx17+y} then : printf %s "(cached) " >&6 else $as_nop - ac_save_CXX="$CXX" - CXX="$CXX $switch" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -8559,62 +8403,1709 @@ namespace cxx17 _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : - eval $cachevar=yes + ax_cv_cxx_compile_cxx17=yes else $as_nop - eval $cachevar=no + ax_cv_cxx_compile_cxx17=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CXX="$ac_save_CXX" fi -eval ac_res=\$$cachevar - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - if test x$ac_success = xyes; then - break - fi - done - fi - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - if test x$ax_cxx_compile_cxx17_required = xtrue; then - if test x$ac_success = xno; then - as_fn_error $? "*** A compiler with support for C++17 language features is required." "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx17" >&5 +printf "%s\n" "$ax_cv_cxx_compile_cxx17" >&6; } + if test x$ax_cv_cxx_compile_cxx17 = xyes; then + ac_success=yes fi - fi - if test x$ac_success = xno; then - HAVE_CXX17=0 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++17 support was found" >&5 -printf "%s\n" "$as_me: No compiler with C++17 support was found" >&6;} - else - HAVE_CXX17=1 -printf "%s\n" "#define HAVE_CXX17 1" >>confdefs.h + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 +printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } +if eval test \${$cachevar+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CXX="$CXX" + CXX="$CXX $switch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - fi +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. +#ifndef __cplusplus -WARN_CXXFLAGS= -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +#error "This is not a C++ compiler" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -Werror=unknown-warning-option" >&5 +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +#elif __cplusplus < 201103L && !defined _MSC_VER + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + + + + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L && !defined _MSC_VER + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + + + + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L && !defined _MSC_VER + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L && !defined _MSC_VER + + + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + eval $cachevar=yes +else $as_nop + eval $cachevar=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXX="$ac_save_CXX" +fi +eval ac_res=\$$cachevar + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi + + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 +printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } +if eval test \${$cachevar+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CXX="$CXX" + CXX="$CXX $switch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +#elif __cplusplus < 201103L && !defined _MSC_VER + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + + + + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L && !defined _MSC_VER + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + + + + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L && !defined _MSC_VER + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L && !defined _MSC_VER + + + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + eval $cachevar=yes +else $as_nop + eval $cachevar=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXX="$ac_save_CXX" +fi +eval ac_res=\$$cachevar + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + if test x$ax_cxx_compile_cxx17_required = xtrue; then + if test x$ac_success = xno; then + as_fn_error $? "*** A compiler with support for C++17 language features is required." "$LINENO" 5 + fi + fi + if test x$ac_success = xno; then + HAVE_CXX17=0 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++17 support was found" >&5 +printf "%s\n" "$as_me: No compiler with C++17 support was found" >&6;} + else + HAVE_CXX17=1 + +printf "%s\n" "#define HAVE_CXX17 1" >>confdefs.h + + fi + + + +WARN_CXXFLAGS= +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -Werror=unknown-warning-option" >&5 printf %s "checking whether C++ compiler accepts -Werror=unknown-warning-option... " >&6; } if test ${ax_cv_check_cxxflags___Werror_unknown_warning_option+y} then : @@ -9015,6 +10506,70 @@ fi +# Check whether --enable-zstd was given. +if test ${enable_zstd+y} +then : + enableval=$enable_zstd; +else $as_nop + enable_zstd=no +fi + +if test "x${enable_zstd}" != xno; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ZSTD_decompress in -lzstd" >&5 +printf %s "checking for ZSTD_decompress in -lzstd... " >&6; } +if test ${ac_cv_lib_zstd_ZSTD_decompress+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lzstd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char ZSTD_decompress (); +int +main (void) +{ +return ZSTD_decompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_zstd_ZSTD_decompress=yes +else $as_nop + ac_cv_lib_zstd_ZSTD_decompress=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_decompress" >&5 +printf "%s\n" "$ac_cv_lib_zstd_ZSTD_decompress" >&6; } +if test "x$ac_cv_lib_zstd_ZSTD_decompress" = xyes +then : + printf "%s\n" "#define HAVE_LIBZSTD 1" >>confdefs.h + + LIBS="-lzstd $LIBS" + +else $as_nop + as_fn_error $? "zstd library not found." "$LINENO" 5 +fi + + ac_fn_c_check_header_compile "$LINENO" "zstd.h" "ac_cv_header_zstd_h" "$ac_includes_default" +if test "x$ac_cv_header_zstd_h" = xyes +then : + +else $as_nop + as_fn_error $? "zstd header not found." "$LINENO" 5 +fi + +fi + # Check whether --with-tests-as-root was given. if test ${with_tests_as_root+y} @@ -9130,6 +10685,7 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' diff --git a/shared/sentry/external/breakpad/configure.ac b/shared/sentry/src/external/breakpad/configure.ac similarity index 94% rename from shared/sentry/external/breakpad/configure.ac rename to shared/sentry/src/external/breakpad/configure.ac index 69e23545f..bfee372a3 100644 --- a/shared/sentry/external/breakpad/configure.ac +++ b/shared/sentry/src/external/breakpad/configure.ac @@ -37,7 +37,7 @@ AC_CONFIG_MACRO_DIR([m4]) AC_CANONICAL_HOST AM_INIT_AUTOMAKE(subdir-objects tar-ustar 1.13) -AM_CONFIG_HEADER(src/config.h) +AC_CONFIG_HEADERS(src/config.h) AM_MAINTAINER_MODE AM_PROG_AR @@ -59,15 +59,6 @@ if test "x$enable_m32" = xyes; then CXXFLAGS="${CXXFLAGS} -m32" fi -m4_warn([obsolete], -[The preprocessor macro `STDC_HEADERS' is obsolete. - Except in unusual embedded environments, you can safely include all - ISO C90 headers unconditionally.])dnl -# Autoupdate added the next two lines to ensure that your configure -# script's behavior did not change. They are probably safe to remove. -AC_CHECK_INCLUDES_DEFAULT -AC_PROG_EGREP - AC_SYS_LARGEFILE AX_PTHREAD AC_CHECK_HEADERS([a.out.h sys/mman.h sys/random.h]) @@ -75,7 +66,7 @@ AC_CHECK_FUNCS([arc4random getcontext getrandom memfd_create]) AM_CONDITIONAL([HAVE_GETCONTEXT], [test "x$ac_cv_func_getcontext" = xyes]) AM_CONDITIONAL([HAVE_MEMFD_CREATE], [test "x$ac_cv_func_memfd_create" = xyes]) -AX_CXX_COMPILE_STDCXX(17, noext, mandatory) +AX_CXX_COMPILE_STDCXX(17, , mandatory) dnl Test supported warning flags. WARN_CXXFLAGS= @@ -221,6 +212,17 @@ fi AC_ARG_VAR([RUSTC_DEMANGLE_CFLAGS], [Compiler flags for rustc-demangle]) AC_ARG_VAR([RUSTC_DEMANGLE_LIBS], [Linker flags for rustc-demangle]) +AC_ARG_ENABLE(zstd, + AS_HELP_STRING([--enable-zstd], + [Enable decompression of ELF sections with zstd]),, + [enable_zstd=no]) +if test "x${enable_zstd}" != xno; then + AC_CHECK_LIB(zstd, ZSTD_decompress, [], + [AC_MSG_ERROR([zstd library not found.])]) + AC_CHECK_HEADER(zstd.h, [], + [AC_MSG_ERROR([zstd header not found.])]) +fi + AC_ARG_WITH(tests-as-root, AS_HELP_STRING([--with-tests-as-root], [Run the tests as root. Use this on platforms] diff --git a/shared/sentry/external/breakpad/default.xml b/shared/sentry/src/external/breakpad/default.xml similarity index 82% rename from shared/sentry/external/breakpad/default.xml rename to shared/sentry/src/external/breakpad/default.xml index b5215113e..916b41fe7 100644 --- a/shared/sentry/external/breakpad/default.xml +++ b/shared/sentry/src/external/breakpad/default.xml @@ -20,11 +20,6 @@ revision='refs/heads/main' remote='chromium' /> - - yQY(syO*h}CBVzei`~Z2&duD^ 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

Dn+UmXymPW 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 literal 0 HcmV?d00001 diff --git a/shared/sentry/external/breakpad/docs/breakpad.svg b/shared/sentry/src/external/breakpad/docs/breakpad.svg similarity index 100% rename from shared/sentry/external/breakpad/docs/breakpad.svg rename to shared/sentry/src/external/breakpad/docs/breakpad.svg diff --git a/shared/sentry/external/breakpad/docs/client_design.md b/shared/sentry/src/external/breakpad/docs/client_design.md similarity index 100% rename from shared/sentry/external/breakpad/docs/client_design.md rename to shared/sentry/src/external/breakpad/docs/client_design.md diff --git a/shared/sentry/external/breakpad/docs/contributing_to_breakpad.md b/shared/sentry/src/external/breakpad/docs/contributing_to_breakpad.md similarity index 100% rename from shared/sentry/external/breakpad/docs/contributing_to_breakpad.md rename to shared/sentry/src/external/breakpad/docs/contributing_to_breakpad.md diff --git a/shared/sentry/external/breakpad/docs/exception_handling.md b/shared/sentry/src/external/breakpad/docs/exception_handling.md similarity index 100% rename from shared/sentry/external/breakpad/docs/exception_handling.md rename to shared/sentry/src/external/breakpad/docs/exception_handling.md diff --git a/shared/sentry/external/breakpad/docs/getting_started_with_breakpad.md b/shared/sentry/src/external/breakpad/docs/getting_started_with_breakpad.md similarity index 100% rename from shared/sentry/external/breakpad/docs/getting_started_with_breakpad.md rename to shared/sentry/src/external/breakpad/docs/getting_started_with_breakpad.md diff --git a/shared/sentry/external/breakpad/docs/linux_core_handler.md b/shared/sentry/src/external/breakpad/docs/linux_core_handler.md similarity index 100% rename from shared/sentry/external/breakpad/docs/linux_core_handler.md rename to shared/sentry/src/external/breakpad/docs/linux_core_handler.md diff --git a/shared/sentry/external/breakpad/docs/linux_starter_guide.md b/shared/sentry/src/external/breakpad/docs/linux_starter_guide.md similarity index 100% rename from shared/sentry/external/breakpad/docs/linux_starter_guide.md rename to shared/sentry/src/external/breakpad/docs/linux_starter_guide.md diff --git a/shared/sentry/external/breakpad/docs/linux_system_calls.md b/shared/sentry/src/external/breakpad/docs/linux_system_calls.md similarity index 100% rename from shared/sentry/external/breakpad/docs/linux_system_calls.md rename to shared/sentry/src/external/breakpad/docs/linux_system_calls.md diff --git a/shared/sentry/external/breakpad/docs/mac_breakpad_starter_guide.md b/shared/sentry/src/external/breakpad/docs/mac_breakpad_starter_guide.md similarity index 100% rename from shared/sentry/external/breakpad/docs/mac_breakpad_starter_guide.md rename to shared/sentry/src/external/breakpad/docs/mac_breakpad_starter_guide.md diff --git a/shared/sentry/external/breakpad/docs/mozilla_brown_bag_talk.md b/shared/sentry/src/external/breakpad/docs/mozilla_brown_bag_talk.md similarity index 100% rename from shared/sentry/external/breakpad/docs/mozilla_brown_bag_talk.md rename to shared/sentry/src/external/breakpad/docs/mozilla_brown_bag_talk.md diff --git a/shared/sentry/external/breakpad/docs/processor_design.md b/shared/sentry/src/external/breakpad/docs/processor_design.md similarity index 100% rename from shared/sentry/external/breakpad/docs/processor_design.md rename to shared/sentry/src/external/breakpad/docs/processor_design.md diff --git a/shared/sentry/external/breakpad/docs/stack_walking.md b/shared/sentry/src/external/breakpad/docs/stack_walking.md similarity index 100% rename from shared/sentry/external/breakpad/docs/stack_walking.md rename to shared/sentry/src/external/breakpad/docs/stack_walking.md diff --git a/shared/sentry/external/breakpad/docs/sym_upload_v2_protocol.md b/shared/sentry/src/external/breakpad/docs/sym_upload_v2_protocol.md similarity index 100% rename from shared/sentry/external/breakpad/docs/sym_upload_v2_protocol.md rename to shared/sentry/src/external/breakpad/docs/sym_upload_v2_protocol.md diff --git a/shared/sentry/external/breakpad/docs/symbol_files.md b/shared/sentry/src/external/breakpad/docs/symbol_files.md similarity index 100% rename from shared/sentry/external/breakpad/docs/symbol_files.md rename to shared/sentry/src/external/breakpad/docs/symbol_files.md diff --git a/shared/sentry/external/breakpad/docs/windows_client_integration.md b/shared/sentry/src/external/breakpad/docs/windows_client_integration.md similarity index 100% rename from shared/sentry/external/breakpad/docs/windows_client_integration.md rename to shared/sentry/src/external/breakpad/docs/windows_client_integration.md diff --git a/shared/sentry/external/breakpad/m4/ax_append_compile_flags.m4 b/shared/sentry/src/external/breakpad/m4/ax_append_compile_flags.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ax_append_compile_flags.m4 rename to shared/sentry/src/external/breakpad/m4/ax_append_compile_flags.m4 diff --git a/shared/sentry/external/breakpad/m4/ax_append_flag.m4 b/shared/sentry/src/external/breakpad/m4/ax_append_flag.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ax_append_flag.m4 rename to shared/sentry/src/external/breakpad/m4/ax_append_flag.m4 diff --git a/shared/sentry/external/breakpad/m4/ax_check_compile_flag.m4 b/shared/sentry/src/external/breakpad/m4/ax_check_compile_flag.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ax_check_compile_flag.m4 rename to shared/sentry/src/external/breakpad/m4/ax_check_compile_flag.m4 diff --git a/shared/sentry/external/breakpad/m4/ax_check_define.m4 b/shared/sentry/src/external/breakpad/m4/ax_check_define.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ax_check_define.m4 rename to shared/sentry/src/external/breakpad/m4/ax_check_define.m4 diff --git a/shared/sentry/external/breakpad/m4/ax_cxx_compile_stdcxx.m4 b/shared/sentry/src/external/breakpad/m4/ax_cxx_compile_stdcxx.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ax_cxx_compile_stdcxx.m4 rename to shared/sentry/src/external/breakpad/m4/ax_cxx_compile_stdcxx.m4 diff --git a/shared/sentry/external/breakpad/m4/ax_pthread.m4 b/shared/sentry/src/external/breakpad/m4/ax_pthread.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ax_pthread.m4 rename to shared/sentry/src/external/breakpad/m4/ax_pthread.m4 diff --git a/shared/sentry/external/breakpad/m4/ax_require_defined.m4 b/shared/sentry/src/external/breakpad/m4/ax_require_defined.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ax_require_defined.m4 rename to shared/sentry/src/external/breakpad/m4/ax_require_defined.m4 diff --git a/shared/sentry/external/breakpad/m4/libtool.m4 b/shared/sentry/src/external/breakpad/m4/libtool.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/libtool.m4 rename to shared/sentry/src/external/breakpad/m4/libtool.m4 diff --git a/shared/sentry/external/breakpad/m4/ltoptions.m4 b/shared/sentry/src/external/breakpad/m4/ltoptions.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ltoptions.m4 rename to shared/sentry/src/external/breakpad/m4/ltoptions.m4 diff --git a/shared/sentry/external/breakpad/m4/ltsugar.m4 b/shared/sentry/src/external/breakpad/m4/ltsugar.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ltsugar.m4 rename to shared/sentry/src/external/breakpad/m4/ltsugar.m4 diff --git a/shared/sentry/external/breakpad/m4/ltversion.m4 b/shared/sentry/src/external/breakpad/m4/ltversion.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/ltversion.m4 rename to shared/sentry/src/external/breakpad/m4/ltversion.m4 diff --git a/shared/sentry/external/breakpad/m4/lt~obsolete.m4 b/shared/sentry/src/external/breakpad/m4/lt~obsolete.m4 similarity index 100% rename from shared/sentry/external/breakpad/m4/lt~obsolete.m4 rename to shared/sentry/src/external/breakpad/m4/lt~obsolete.m4 diff --git a/shared/sentry/external/breakpad/src/breakpad_googletest_includes.h b/shared/sentry/src/external/breakpad/src/breakpad_googletest_includes.h similarity index 100% rename from shared/sentry/external/breakpad/src/breakpad_googletest_includes.h rename to shared/sentry/src/external/breakpad/src/breakpad_googletest_includes.h diff --git a/shared/sentry/external/breakpad/src/client/apple/Framework/BreakpadDefines.h b/shared/sentry/src/external/breakpad/src/client/apple/Framework/BreakpadDefines.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/apple/Framework/BreakpadDefines.h rename to shared/sentry/src/external/breakpad/src/client/apple/Framework/BreakpadDefines.h diff --git a/shared/sentry/external/breakpad/src/client/ios/Breakpad.h b/shared/sentry/src/external/breakpad/src/client/ios/Breakpad.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/Breakpad.h rename to shared/sentry/src/external/breakpad/src/client/ios/Breakpad.h diff --git a/shared/sentry/external/breakpad/src/client/ios/Breakpad.mm b/shared/sentry/src/external/breakpad/src/client/ios/Breakpad.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/Breakpad.mm rename to shared/sentry/src/external/breakpad/src/client/ios/Breakpad.mm diff --git a/shared/sentry/external/breakpad/src/client/ios/Breakpad.xcodeproj/project.pbxproj b/shared/sentry/src/external/breakpad/src/client/ios/Breakpad.xcodeproj/project.pbxproj similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/Breakpad.xcodeproj/project.pbxproj rename to shared/sentry/src/external/breakpad/src/client/ios/Breakpad.xcodeproj/project.pbxproj diff --git a/shared/sentry/external/breakpad/src/client/ios/BreakpadController.h b/shared/sentry/src/external/breakpad/src/client/ios/BreakpadController.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/BreakpadController.h rename to shared/sentry/src/external/breakpad/src/client/ios/BreakpadController.h diff --git a/shared/sentry/external/breakpad/src/client/ios/BreakpadController.mm b/shared/sentry/src/external/breakpad/src/client/ios/BreakpadController.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/BreakpadController.mm rename to shared/sentry/src/external/breakpad/src/client/ios/BreakpadController.mm diff --git a/shared/sentry/external/breakpad/src/client/ios/Breakpad_Prefix.pch b/shared/sentry/src/external/breakpad/src/client/ios/Breakpad_Prefix.pch similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/Breakpad_Prefix.pch rename to shared/sentry/src/external/breakpad/src/client/ios/Breakpad_Prefix.pch diff --git a/shared/sentry/external/breakpad/src/client/ios/exception_handler_no_mach.cc b/shared/sentry/src/external/breakpad/src/client/ios/exception_handler_no_mach.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/ios/exception_handler_no_mach.cc rename to shared/sentry/src/external/breakpad/src/client/ios/exception_handler_no_mach.cc index ff6d47e06..675e3424d 100644 --- a/shared/sentry/external/breakpad/src/client/ios/exception_handler_no_mach.cc +++ b/shared/sentry/src/external/breakpad/src/client/ios/exception_handler_no_mach.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/ios/exception_handler_no_mach.h b/shared/sentry/src/external/breakpad/src/client/ios/exception_handler_no_mach.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/exception_handler_no_mach.h rename to shared/sentry/src/external/breakpad/src/client/ios/exception_handler_no_mach.h diff --git a/shared/sentry/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.h b/shared/sentry/src/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.h rename to shared/sentry/src/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.h diff --git a/shared/sentry/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.mm b/shared/sentry/src/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.mm rename to shared/sentry/src/external/breakpad/src/client/ios/handler/ios_exception_minidump_generator.mm diff --git a/shared/sentry/external/breakpad/src/client/linux/crash_generation/client_info.h b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/client_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/crash_generation/client_info.h rename to shared/sentry/src/external/breakpad/src/client/linux/crash_generation/client_info.h diff --git a/shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_client.cc b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_client.cc similarity index 91% rename from shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_client.cc rename to shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_client.cc index 5a8c6b4c9..020c61466 100644 --- a/shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_client.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_client.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/crash_generation/crash_generation_client.h" #include @@ -45,9 +49,11 @@ namespace { class CrashGenerationClientImpl : public CrashGenerationClient { public: explicit CrashGenerationClientImpl(int server_fd) : server_fd_(server_fd) {} - virtual ~CrashGenerationClientImpl() {} + CrashGenerationClientImpl(const CrashGenerationClientImpl&) = delete; + void operator=(const CrashGenerationClientImpl&) = delete; + ~CrashGenerationClientImpl() override = default; - virtual bool RequestDump(const void* blob, size_t blob_size) { + bool RequestDump(const void* blob, size_t blob_size) override { int fds[2]; if (sys_pipe(fds) < 0) return false; @@ -88,8 +94,6 @@ class CrashGenerationClientImpl : public CrashGenerationClient { private: int server_fd_; - - DISALLOW_COPY_AND_ASSIGN(CrashGenerationClientImpl); }; } // namespace diff --git a/shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_client.h b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_client.h similarity index 92% rename from shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_client.h rename to shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_client.h index 915b5700f..1e4a7a5e5 100644 --- a/shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_client.h +++ b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_client.h @@ -29,8 +29,6 @@ #ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ #define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ -#include "common/basictypes.h" - #include namespace google_breakpad { @@ -41,8 +39,10 @@ namespace google_breakpad { // via a remote process. class CrashGenerationClient { public: - CrashGenerationClient() {} - virtual ~CrashGenerationClient() {} + CrashGenerationClient() = default; + CrashGenerationClient(const CrashGenerationClient&) = delete; + void operator=(const CrashGenerationClient&) = delete; + virtual ~CrashGenerationClient() = default; // Request the crash server to generate a dump. |blob| is an opaque // CrashContext pointer from exception_handler.h. @@ -54,9 +54,6 @@ class CrashGenerationClient { // The returned CrashGenerationClient* is owned by the caller of // this function. static CrashGenerationClient* TryCreate(int server_fd); - - private: - DISALLOW_COPY_AND_ASSIGN(CrashGenerationClient); }; } // namespace google_breakpad diff --git a/shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_server.cc b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_server.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_server.cc rename to shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_server.cc index 56cc0cd7b..e3270c9d4 100644 --- a/shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_server.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_server.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_server.h b/shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_server.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/crash_generation/crash_generation_server.h rename to shared/sentry/src/external/breakpad/src/client/linux/crash_generation/crash_generation_server.h diff --git a/shared/sentry/external/breakpad/src/client/linux/data/linux-gate-amd.sym b/shared/sentry/src/external/breakpad/src/client/linux/data/linux-gate-amd.sym similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/data/linux-gate-amd.sym rename to shared/sentry/src/external/breakpad/src/client/linux/data/linux-gate-amd.sym diff --git a/shared/sentry/external/breakpad/src/client/linux/data/linux-gate-intel.sym b/shared/sentry/src/external/breakpad/src/client/linux/data/linux-gate-intel.sym similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/data/linux-gate-intel.sym rename to shared/sentry/src/external/breakpad/src/client/linux/data/linux-gate-intel.sym diff --git a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/mapping_info.h b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/mapping_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/dump_writer_common/mapping_info.h rename to shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/mapping_info.h diff --git a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h rename to shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h diff --git a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/thread_info.cc b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/thread_info.cc similarity index 93% rename from shared/sentry/external/breakpad/src/client/linux/dump_writer_common/thread_info.cc rename to shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/thread_info.cc index d8bf80b0c..6288a056e 100644 --- a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/thread_info.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/thread_info.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/dump_writer_common/thread_info.h" #include @@ -318,23 +322,19 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const { out->t5 = mcontext.__gregs[30]; out->t6 = mcontext.__gregs[31]; -# if __riscv_flen == 32 - for(int i = 0; i < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; i++) - out->float_save.regs[i] = mcontext.__fpregs.__f.__f[i]; - out->float_save.fpcsr = mcontext.__fpregs.__f.__fcsr; -# elif __riscv_flen == 64 - for(int i = 0; i < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; i++) - out->float_save.regs[i] = mcontext.__fpregs.__d.__f[i]; - out->float_save.fpcsr = mcontext.__fpregs.__d.__fcsr; -# elif __riscv_flen == 128 - for(int i = 0; i < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; i++) { - out->float_save.regs[i].high = mcontext.__fpregs.__q.__f[2*i]; - out->float_save.regs[i].low = mcontext.__fpregs.__q.__f[2*i+1]; - } - out->float_save.fpcsr = mcontext.__fpregs.__q.__fcsr; -# else -# error "Unexpected __riscv_flen" -# endif + // Breakpad only supports RISCV32 with 32 bit floating point. + // Breakpad only supports RISCV64 with 64 bit floating point. +#if __riscv_xlen == 32 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = mcontext.__fpregs.__f.__f[i]; + out->fcsr = mcontext.__fpregs.__f.__fcsr; +#elif __riscv_xlen == 64 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = mcontext.__fpregs.__d.__f[i]; + out->fcsr = mcontext.__fpregs.__d.__fcsr; +#else +#error "Unexpected __riscv_xlen" +#endif } #endif // __riscv diff --git a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/thread_info.h b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/thread_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/dump_writer_common/thread_info.h rename to shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/thread_info.h diff --git a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc similarity index 93% rename from shared/sentry/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc rename to shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc index 97ed2a9f4..764976835 100644 --- a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/dump_writer_common/ucontext_reader.h" #include "common/linux/linux_libc_support.h" @@ -306,21 +310,19 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc) { out->t5 = uc->uc_mcontext.__gregs[30]; out->t6 = uc->uc_mcontext.__gregs[31]; -# if __riscv_flen == 32 - for(int i = 0; i < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; i++) - out->float_save.regs[i] = uc->uc_mcontext.__fpregs.__f.__f[i]; - out->float_save.fpcsr = uc->uc_mcontext.__fpregs.__f.__fcsr; -# elif __riscv_flen == 64 - for(int i = 0; i < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; i++) - out->float_save.regs[i] = uc->uc_mcontext.__fpregs.__d.__f[i]; - out->float_save.fpcsr = uc->uc_mcontext.__fpregs.__d.__fcsr; -# elif __riscv_flen == 128 - for(int i = 0; i < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; i++) { - out->float_save.regs[i].high = uc->uc_mcontext.__fpregs.__q.__f[2*i]; - out->float_save.regs[i].low = uc->uc_mcontext.__fpregs.__q.__f[2*i+1]; - } - out->float_save.fpcsr = uc->uc_mcontext.__fpregs.__q.__fcsr; -# endif + // Breakpad only supports RISCV32 with 32 bit floating point. + // Breakpad only supports RISCV64 with 64 bit floating point. +#if __riscv_xlen == 32 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = uc->uc_mcontext.__fpregs.__f.__f[i]; + out->fcsr = uc->uc_mcontext.__fpregs.__f.__fcsr; +#elif __riscv_xlen == 64 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = uc->uc_mcontext.__fpregs.__d.__f[i]; + out->fcsr = uc->uc_mcontext.__fpregs.__d.__fcsr; +#else +#error "Unexpected __riscv_xlen" +#endif } #endif diff --git a/shared/sentry/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h b/shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h rename to shared/sentry/src/external/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h diff --git a/shared/sentry/external/breakpad/src/client/linux/handler/exception_handler.cc b/shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/handler/exception_handler.cc rename to shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler.cc index bbdb798b5..9e23c1194 100644 --- a/shared/sentry/external/breakpad/src/client/linux/handler/exception_handler.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler.cc @@ -62,6 +62,10 @@ // alternative malloc. Each function should have comment above it detailing the // context which it runs in. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/handler/exception_handler.h" #include diff --git a/shared/sentry/external/breakpad/src/client/linux/handler/exception_handler.h b/shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/handler/exception_handler.h rename to shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler.h diff --git a/shared/sentry/external/breakpad/src/client/linux/handler/exception_handler_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/handler/exception_handler_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler_unittest.cc index 691ea1335..b2d8d4681 100644 --- a/shared/sentry/external/breakpad/src/client/linux/handler/exception_handler_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/handler/exception_handler_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/handler/microdump_extra_info.h b/shared/sentry/src/external/breakpad/src/client/linux/handler/microdump_extra_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/handler/microdump_extra_info.h rename to shared/sentry/src/external/breakpad/src/client/linux/handler/microdump_extra_info.h diff --git a/shared/sentry/external/breakpad/src/client/linux/handler/minidump_descriptor.cc b/shared/sentry/src/external/breakpad/src/client/linux/handler/minidump_descriptor.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/linux/handler/minidump_descriptor.cc rename to shared/sentry/src/external/breakpad/src/client/linux/handler/minidump_descriptor.cc index 517fce975..db2f9b180 100644 --- a/shared/sentry/external/breakpad/src/client/linux/handler/minidump_descriptor.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/handler/minidump_descriptor.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "client/linux/handler/minidump_descriptor.h" diff --git a/shared/sentry/external/breakpad/src/client/linux/handler/minidump_descriptor.h b/shared/sentry/src/external/breakpad/src/client/linux/handler/minidump_descriptor.h similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/handler/minidump_descriptor.h rename to shared/sentry/src/external/breakpad/src/client/linux/handler/minidump_descriptor.h index 4349b88f3..d822c9d92 100644 --- a/shared/sentry/external/breakpad/src/client/linux/handler/minidump_descriptor.h +++ b/shared/sentry/src/external/breakpad/src/client/linux/handler/minidump_descriptor.h @@ -32,6 +32,7 @@ #include #include +#include #include #include "client/linux/handler/microdump_extra_info.h" diff --git a/shared/sentry/external/breakpad/src/client/linux/log/log.cc b/shared/sentry/src/external/breakpad/src/client/linux/log/log.cc similarity index 97% rename from shared/sentry/external/breakpad/src/client/linux/log/log.cc rename to shared/sentry/src/external/breakpad/src/client/linux/log/log.cc index c45de64b7..2a48d7fea 100644 --- a/shared/sentry/external/breakpad/src/client/linux/log/log.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/log/log.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/log/log.h" #if defined(__ANDROID__) diff --git a/shared/sentry/external/breakpad/src/client/linux/log/log.h b/shared/sentry/src/external/breakpad/src/client/linux/log/log.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/log/log.h rename to shared/sentry/src/external/breakpad/src/client/linux/log/log.h diff --git a/shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer.cc b/shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer.cc rename to shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer.cc index 1f19d3bb6..93dae35e5 100644 --- a/shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer.cc @@ -29,6 +29,10 @@ // This translation unit generates microdumps into the console (logcat on // Android). See crbug.com/410294 for more info and design docs. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/microdump_writer/microdump_writer.h" #include diff --git a/shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer.h b/shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer.h rename to shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer.h diff --git a/shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc index 848656643..b1d570eb4 100644 --- a/shared/sentry/external/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/cpu_set.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/cpu_set.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/cpu_set.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/cpu_set.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc similarity index 78% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc index 1db74410d..b99e98de3 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include @@ -35,7 +39,7 @@ #include "breakpad_googletest_includes.h" #include "client/linux/minidump_writer/cpu_set.h" -#include "common/linux/tests/auto_testfile.h" +#include "common/linux/scoped_tmpfile.h" using namespace google_breakpad; @@ -43,15 +47,6 @@ namespace { typedef testing::Test CpuSetTest; -// Helper class to write test text file to a temporary file and return -// its file descriptor. -class ScopedTestFile : public AutoTestFile { -public: - explicit ScopedTestFile(const char* text) - : AutoTestFile("cpu_set", text) { - } -}; - } TEST(CpuSetTest, EmptyCount) { @@ -60,8 +55,8 @@ TEST(CpuSetTest, EmptyCount) { } TEST(CpuSetTest, OneCpu) { - ScopedTestFile file("10"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("10")); CpuSet set; ASSERT_TRUE(set.ParseSysFile(file.GetFd())); @@ -69,8 +64,8 @@ TEST(CpuSetTest, OneCpu) { } TEST(CpuSetTest, OneCpuTerminated) { - ScopedTestFile file("10\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("10\n")); CpuSet set; ASSERT_TRUE(set.ParseSysFile(file.GetFd())); @@ -78,8 +73,8 @@ TEST(CpuSetTest, OneCpuTerminated) { } TEST(CpuSetTest, TwoCpusWithComma) { - ScopedTestFile file("1,10"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("1,10")); CpuSet set; ASSERT_TRUE(set.ParseSysFile(file.GetFd())); @@ -87,8 +82,8 @@ TEST(CpuSetTest, TwoCpusWithComma) { } TEST(CpuSetTest, TwoCpusWithRange) { - ScopedTestFile file("1-2"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("1-2")); CpuSet set; ASSERT_TRUE(set.ParseSysFile(file.GetFd())); @@ -96,8 +91,8 @@ TEST(CpuSetTest, TwoCpusWithRange) { } TEST(CpuSetTest, TenCpusWithRange) { - ScopedTestFile file("9-18"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("9-18")); CpuSet set; ASSERT_TRUE(set.ParseSysFile(file.GetFd())); @@ -105,8 +100,8 @@ TEST(CpuSetTest, TenCpusWithRange) { } TEST(CpuSetTest, MultiItems) { - ScopedTestFile file("0, 2-4, 128"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("0, 2-4, 128")); CpuSet set; ASSERT_TRUE(set.ParseSysFile(file.GetFd())); @@ -114,14 +109,16 @@ TEST(CpuSetTest, MultiItems) { } TEST(CpuSetTest, IntersectWith) { - ScopedTestFile file1("9-19"); - ASSERT_TRUE(file1.IsOk()); + ScopedTmpFile file1; + ASSERT_TRUE(file1.InitString("9-19")); + CpuSet set1; ASSERT_TRUE(set1.ParseSysFile(file1.GetFd())); ASSERT_EQ(11, set1.GetCount()); - ScopedTestFile file2("16-24"); - ASSERT_TRUE(file2.IsOk()); + ScopedTmpFile file2; + ASSERT_TRUE(file2.InitString("16-24")); + CpuSet set2; ASSERT_TRUE(set2.ParseSysFile(file2.GetFd())); ASSERT_EQ(9, set2.GetCount()); @@ -132,8 +129,9 @@ TEST(CpuSetTest, IntersectWith) { } TEST(CpuSetTest, SelfIntersection) { - ScopedTestFile file1("9-19"); - ASSERT_TRUE(file1.IsOk()); + ScopedTmpFile file1; + ASSERT_TRUE(file1.InitString("9-19")); + CpuSet set1; ASSERT_TRUE(set1.ParseSysFile(file1.GetFd())); ASSERT_EQ(11, set1.GetCount()); @@ -143,14 +141,16 @@ TEST(CpuSetTest, SelfIntersection) { } TEST(CpuSetTest, EmptyIntersection) { - ScopedTestFile file1("0-19"); - ASSERT_TRUE(file1.IsOk()); + ScopedTmpFile file1; + ASSERT_TRUE(file1.InitString("0-19")); + CpuSet set1; ASSERT_TRUE(set1.ParseSysFile(file1.GetFd())); ASSERT_EQ(20, set1.GetCount()); - ScopedTestFile file2("20-39"); - ASSERT_TRUE(file2.IsOk()); + ScopedTmpFile file2; + ASSERT_TRUE(file2.InitString("20-39")); + CpuSet set2; ASSERT_TRUE(set2.ParseSysFile(file2.GetFd())); ASSERT_EQ(20, set2.GetCount()); diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/directory_reader.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/directory_reader.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/directory_reader.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/directory_reader.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc similarity index 97% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc index ffc5fbfd9..708d586ed 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/line_reader.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/line_reader.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/line_reader.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/line_reader.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc similarity index 85% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc index 3062c39f7..bc1f9d399 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc @@ -26,13 +26,17 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include #include "client/linux/minidump_writer/line_reader.h" #include "breakpad_googletest_includes.h" -#include "common/linux/tests/auto_testfile.h" +#include "common/linux/scoped_tmpfile.h" using namespace google_breakpad; @@ -40,22 +44,11 @@ namespace { typedef testing::Test LineReaderTest; -class ScopedTestFile : public AutoTestFile { -public: - explicit ScopedTestFile(const char* text) - : AutoTestFile("line_reader", text) { - } - - ScopedTestFile(const char* text, size_t text_len) - : AutoTestFile("line_reader", text, text_len) { - } -}; - } TEST(LineReaderTest, EmptyFile) { - ScopedTestFile file(""); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("")); LineReader reader(file.GetFd()); const char* line; @@ -64,8 +57,8 @@ TEST(LineReaderTest, EmptyFile) { } TEST(LineReaderTest, OneLineTerminated) { - ScopedTestFile file("a\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a\n")); LineReader reader(file.GetFd()); const char* line; @@ -80,8 +73,8 @@ TEST(LineReaderTest, OneLineTerminated) { } TEST(LineReaderTest, OneLine) { - ScopedTestFile file("a"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a")); LineReader reader(file.GetFd()); const char* line; @@ -96,8 +89,8 @@ TEST(LineReaderTest, OneLine) { } TEST(LineReaderTest, TwoLinesTerminated) { - ScopedTestFile file("a\nb\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a\nb\n")); LineReader reader(file.GetFd()); const char* line; @@ -118,8 +111,8 @@ TEST(LineReaderTest, TwoLinesTerminated) { } TEST(LineReaderTest, TwoLines) { - ScopedTestFile file("a\nb"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a\nb")); LineReader reader(file.GetFd()); const char* line; @@ -142,8 +135,8 @@ TEST(LineReaderTest, TwoLines) { TEST(LineReaderTest, MaxLength) { char l[LineReader::kMaxLineLen-1]; memset(l, 'a', sizeof(l)); - ScopedTestFile file(l, sizeof(l)); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitData(l, sizeof(l))); LineReader reader(file.GetFd()); const char* line; @@ -158,8 +151,8 @@ TEST(LineReaderTest, TooLong) { // Note: this writes kMaxLineLen 'a' chars in the test file. char l[LineReader::kMaxLineLen]; memset(l, 'a', sizeof(l)); - ScopedTestFile file(l, sizeof(l)); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitData(l, sizeof(l))); LineReader reader(file.GetFd()); const char* line; diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc index 2c507c1bf..4bf9094e9 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc @@ -29,6 +29,10 @@ // linux_core_dumper.cc: Implement google_breakpad::LinuxCoreDumper. // See linux_core_dumper.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/minidump_writer/linux_core_dumper.h" #include diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc index 157e4f897..72790422e 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc @@ -29,6 +29,10 @@ // linux_core_dumper_unittest.cc: // Unit tests for google_breakpad::LinuxCoreDumoer. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "breakpad_googletest_includes.h" diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper.cc index 01b06facf..5c4c389c3 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper.cc @@ -34,6 +34,10 @@ // rules apply as detailed at the top of minidump_writer.h: no libc calls and // use the alternative allocator. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/minidump_writer/linux_dumper.h" #include @@ -342,7 +346,7 @@ LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping, return false; bool filename_modified = HandleDeletedFileInMapping(filename); - MemoryMappedFile mapped_file(filename, mapping.offset); + MemoryMappedFile mapped_file(filename, 0); if (!mapped_file.data() || mapped_file.size() < SELFMAG) return false; @@ -455,7 +459,7 @@ bool ElfFileSoName(const LinuxDumper& dumper, if (!dumper.GetMappingAbsolutePath(mapping, filename)) return false; - MemoryMappedFile mapped_file(filename, mapping.offset); + MemoryMappedFile mapped_file(filename, 0); if (!mapped_file.data() || mapped_file.size() < SELFMAG) { // mmap failed return false; diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc index bc1e4fbef..5a135fda0 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc @@ -30,6 +30,10 @@ // threads. The first word of each thread's stack is set to the thread // id. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc similarity index 95% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc index 718fab7c5..2adc39e12 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc @@ -35,6 +35,10 @@ // rules apply as detailed at the top of minidump_writer.h: no libc calls and // use the alternative allocator. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/minidump_writer/linux_ptrace_dumper.h" #include @@ -175,6 +179,13 @@ bool LinuxPtraceDumper::ReadRegisters(ThreadInfo* info, pid_t tid) { return false; } + // When running on arm processors the binary may be built with softfp or + // hardfp. If built with softfp we have no hardware registers to read from, + // so the following read will always fail. gcc defines __SOFTFP__ macro, + // clang13 does not do so. see: https://reviews.llvm.org/D135680. + // If you are using clang and the macro is NOT defined, please include the + // macro define for applicable targets. +#if !defined(__SOFTFP__) #if !(defined(__ANDROID__) && defined(__ARM_EABI__)) // When running an arm build on an arm64 device, attempting to get the // floating point registers fails. On Android, the floating point registers @@ -186,6 +197,7 @@ bool LinuxPtraceDumper::ReadRegisters(ThreadInfo* info, pid_t tid) { return false; } #endif // !(defined(__ANDROID__) && defined(__ARM_EABI__)) +#endif // !defined(__SOFTFP__) return true; #else // PTRACE_GETREGS return false; diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc index a8455165d..16a9daf1d 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc @@ -32,6 +32,10 @@ // This file was renamed from linux_dumper_unittest.cc and modified due // to LinuxDumper being splitted into two classes. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer.cc index a5f9b8416..a95dd2548 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer.cc @@ -42,6 +42,10 @@ // a canonical instance in the LinuxDumper object. We use the placement // new form to allocate objects and we don't delete them. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/linux/handler/minidump_descriptor.h" #include "client/linux/minidump_writer/minidump_writer.h" #include "client/minidump_file_writer-inl.h" diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc index 2601d29b6..effedc5e1 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc similarity index 97% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc index 92cae92e2..399f1a123 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc @@ -29,6 +29,10 @@ // minidump_writer_unittest_utils.cc: // Shared routines used by unittests under client/linux/minidump_writer. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/pe_file.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/pe_file.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/pe_file.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/pe_file.cc index 960b978b6..7b3fe6c08 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/pe_file.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/pe_file.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "client/linux/minidump_writer/pe_file.h" diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/pe_file.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/pe_file.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/pe_file.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/pe_file.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/pe_structs.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/pe_structs.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/pe_structs.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/pe_structs.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h diff --git a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc similarity index 82% rename from shared/sentry/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc index f6d3e2859..4ac525695 100644 --- a/shared/sentry/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include @@ -35,33 +39,19 @@ #include "client/linux/minidump_writer/proc_cpuinfo_reader.h" #include "breakpad_googletest_includes.h" -#include "common/linux/tests/auto_testfile.h" +#include "common/linux/scoped_tmpfile.h" using namespace google_breakpad; -#if !defined(__ANDROID__) -#define TEMPDIR "/tmp" -#else -#define TEMPDIR "/data/local/tmp" -#endif - - namespace { typedef testing::Test ProcCpuInfoReaderTest; -class ScopedTestFile : public AutoTestFile { -public: - explicit ScopedTestFile(const char* text) - : AutoTestFile("proc_cpuinfo_reader", text) { - } -}; - } TEST(ProcCpuInfoReaderTest, EmptyFile) { - ScopedTestFile file(""); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -69,8 +59,8 @@ TEST(ProcCpuInfoReaderTest, EmptyFile) { } TEST(ProcCpuInfoReaderTest, OneLineTerminated) { - ScopedTestFile file("foo : bar\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -82,8 +72,8 @@ TEST(ProcCpuInfoReaderTest, OneLineTerminated) { } TEST(ProcCpuInfoReaderTest, OneLine) { - ScopedTestFile file("foo : bar"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -97,8 +87,8 @@ TEST(ProcCpuInfoReaderTest, OneLine) { } TEST(ProcCpuInfoReaderTest, TwoLinesTerminated) { - ScopedTestFile file("foo : bar\nzoo : tut\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar\nzoo : tut\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -114,8 +104,8 @@ TEST(ProcCpuInfoReaderTest, TwoLinesTerminated) { } TEST(ProcCpuInfoReaderTest, SkipMalformedLine) { - ScopedTestFile file("this line should have a column\nfoo : bar\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("this line should have a column\nfoo : bar\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -127,8 +117,8 @@ TEST(ProcCpuInfoReaderTest, SkipMalformedLine) { } TEST(ProcCpuInfoReaderTest, SkipOneEmptyLine) { - ScopedTestFile file("\n\nfoo : bar\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("\n\nfoo : bar\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -140,8 +130,8 @@ TEST(ProcCpuInfoReaderTest, SkipOneEmptyLine) { } TEST(ProcCpuInfoReaderTest, SkipEmptyField) { - ScopedTestFile file(" : bar\nzoo : tut\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString(" : bar\nzoo : tut\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -153,8 +143,8 @@ TEST(ProcCpuInfoReaderTest, SkipEmptyField) { } TEST(ProcCpuInfoReaderTest, SkipTwoEmptyLines) { - ScopedTestFile file("foo : bar\n\n\nfoo : bar\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar\n\n\nfoo : bar\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -170,8 +160,8 @@ TEST(ProcCpuInfoReaderTest, SkipTwoEmptyLines) { } TEST(ProcCpuInfoReaderTest, FieldWithSpaces) { - ScopedTestFile file("foo bar : zoo\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo bar : zoo\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; @@ -183,8 +173,8 @@ TEST(ProcCpuInfoReaderTest, FieldWithSpaces) { } TEST(ProcCpuInfoReaderTest, EmptyValue) { - ScopedTestFile file("foo :\n"); - ASSERT_TRUE(file.IsOk()); + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo :\n")); ProcCpuInfoReader reader(file.GetFd()); const char* field; diff --git a/shared/sentry/external/breakpad/src/client/linux/sender/google_crash_report_sender.cc b/shared/sentry/src/external/breakpad/src/client/linux/sender/google_crash_report_sender.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/linux/sender/google_crash_report_sender.cc rename to shared/sentry/src/external/breakpad/src/client/linux/sender/google_crash_report_sender.cc index 6f45d831a..f6e481939 100644 --- a/shared/sentry/external/breakpad/src/client/linux/sender/google_crash_report_sender.cc +++ b/shared/sentry/src/external/breakpad/src/client/linux/sender/google_crash_report_sender.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/google_crashdump_uploader.h" #include #include diff --git a/shared/sentry/external/breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj b/shared/sentry/src/external/breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj rename to shared/sentry/src/external/breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj diff --git a/shared/sentry/external/breakpad/src/client/mac/Framework/Breakpad.h b/shared/sentry/src/external/breakpad/src/client/mac/Framework/Breakpad.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/Framework/Breakpad.h rename to shared/sentry/src/external/breakpad/src/client/mac/Framework/Breakpad.h diff --git a/shared/sentry/external/breakpad/src/client/mac/Framework/Breakpad.mm b/shared/sentry/src/external/breakpad/src/client/mac/Framework/Breakpad.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/Framework/Breakpad.mm rename to shared/sentry/src/external/breakpad/src/client/mac/Framework/Breakpad.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/Framework/Breakpad_Prefix.pch b/shared/sentry/src/external/breakpad/src/client/mac/Framework/Breakpad_Prefix.pch similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/Framework/Breakpad_Prefix.pch rename to shared/sentry/src/external/breakpad/src/client/mac/Framework/Breakpad_Prefix.pch diff --git a/shared/sentry/external/breakpad/src/client/mac/Framework/Info.plist b/shared/sentry/src/external/breakpad/src/client/mac/Framework/Info.plist similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/Framework/Info.plist rename to shared/sentry/src/external/breakpad/src/client/mac/Framework/Info.plist diff --git a/shared/sentry/external/breakpad/src/client/mac/Framework/OnDemandServer.h b/shared/sentry/src/external/breakpad/src/client/mac/Framework/OnDemandServer.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/Framework/OnDemandServer.h rename to shared/sentry/src/external/breakpad/src/client/mac/Framework/OnDemandServer.h diff --git a/shared/sentry/external/breakpad/src/client/mac/Framework/OnDemandServer.mm b/shared/sentry/src/external/breakpad/src/client/mac/Framework/OnDemandServer.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/Framework/OnDemandServer.mm rename to shared/sentry/src/external/breakpad/src/client/mac/Framework/OnDemandServer.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/UnitTests-Info.plist b/shared/sentry/src/external/breakpad/src/client/mac/UnitTests-Info.plist similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/UnitTests-Info.plist rename to shared/sentry/src/external/breakpad/src/client/mac/UnitTests-Info.plist diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/ConfigFile.h b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/ConfigFile.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/ConfigFile.h rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/ConfigFile.h diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/ConfigFile.mm b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/ConfigFile.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/ConfigFile.mm rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/ConfigFile.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/Inspector.h b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/Inspector.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/Inspector.h rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/Inspector.h diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/Inspector.mm b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/Inspector.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/Inspector.mm rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/Inspector.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/InspectorMain.mm b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/InspectorMain.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/InspectorMain.mm rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/InspectorMain.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/client_info.h b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/client_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/client_info.h rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/client_info.h diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_client.cc b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_client.cc similarity index 97% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_client.cc rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_client.cc index 32f1c827d..7622dddd2 100644 --- a/shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_client.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_client.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/mac/crash_generation/crash_generation_client.h" #include "client/mac/crash_generation/crash_generation_server.h" diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_client.h b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_client.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_client.h rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_client.h diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_server.cc b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_server.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_server.cc rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_server.cc index 6bbd4bb50..8d742f361 100644 --- a/shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_server.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_server.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/mac/crash_generation/crash_generation_server.h" #include diff --git a/shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_server.h b/shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_server.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/crash_generation/crash_generation_server.h rename to shared/sentry/src/external/breakpad/src/client/mac/crash_generation/crash_generation_server.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/breakpad_nlist_64.cc b/shared/sentry/src/external/breakpad/src/client/mac/handler/breakpad_nlist_64.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/mac/handler/breakpad_nlist_64.cc rename to shared/sentry/src/external/breakpad/src/client/mac/handler/breakpad_nlist_64.cc index b4f04c917..d59c7b080 100644 --- a/shared/sentry/external/breakpad/src/client/mac/handler/breakpad_nlist_64.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/handler/breakpad_nlist_64.cc @@ -65,6 +65,10 @@ * I've modified it to be compatible with 64-bit images. */ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "breakpad_nlist_64.h" #include diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/breakpad_nlist_64.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/breakpad_nlist_64.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/breakpad_nlist_64.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/breakpad_nlist_64.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/dynamic_images.cc b/shared/sentry/src/external/breakpad/src/client/mac/handler/dynamic_images.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/mac/handler/dynamic_images.cc rename to shared/sentry/src/external/breakpad/src/client/mac/handler/dynamic_images.cc index b1d2c464e..3db7467bf 100644 --- a/shared/sentry/external/breakpad/src/client/mac/handler/dynamic_images.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/handler/dynamic_images.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/mac/handler/dynamic_images.h" extern "C" { // needed to compile on Leopard diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/dynamic_images.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/dynamic_images.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/dynamic_images.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/dynamic_images.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/exception_handler.cc b/shared/sentry/src/external/breakpad/src/client/mac/handler/exception_handler.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/mac/handler/exception_handler.cc rename to shared/sentry/src/external/breakpad/src/client/mac/handler/exception_handler.cc index c091209fb..968e551c1 100644 --- a/shared/sentry/external/breakpad/src/client/mac/handler/exception_handler.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/handler/exception_handler.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/exception_handler.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/exception_handler.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/exception_handler.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/exception_handler.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/mach_vm_compat.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/mach_vm_compat.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/mach_vm_compat.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/mach_vm_compat.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/minidump_generator.cc b/shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_generator.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/mac/handler/minidump_generator.cc rename to shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_generator.cc index 3738416e5..fd863aea9 100644 --- a/shared/sentry/external/breakpad/src/client/mac/handler/minidump_generator.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_generator.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/minidump_generator.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_generator.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/minidump_generator.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_generator.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj b/shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj rename to shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/minidump_tests32-Info.plist b/shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_tests32-Info.plist similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/minidump_tests32-Info.plist rename to shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_tests32-Info.plist diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/minidump_tests64-Info.plist b/shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_tests64-Info.plist similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/minidump_tests64-Info.plist rename to shared/sentry/src/external/breakpad/src/client/mac/handler/minidump_tests64-Info.plist diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/obj-cTestCases-Info.plist b/shared/sentry/src/external/breakpad/src/client/mac/handler/obj-cTestCases-Info.plist similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/obj-cTestCases-Info.plist rename to shared/sentry/src/external/breakpad/src/client/mac/handler/obj-cTestCases-Info.plist diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/protected_memory_allocator.cc b/shared/sentry/src/external/breakpad/src/client/mac/handler/protected_memory_allocator.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/mac/handler/protected_memory_allocator.cc rename to shared/sentry/src/external/breakpad/src/client/mac/handler/protected_memory_allocator.cc index 833832636..8205a214d 100644 --- a/shared/sentry/external/breakpad/src/client/mac/handler/protected_memory_allocator.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/handler/protected_memory_allocator.cc @@ -30,6 +30,10 @@ // // See the header file for documentation +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "protected_memory_allocator.h" #include diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/protected_memory_allocator.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/protected_memory_allocator.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/protected_memory_allocator.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/protected_memory_allocator.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc similarity index 97% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc index 14ea88d23..d7564fc9c 100644 --- a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc @@ -33,6 +33,10 @@ // Copyright 2008 Google LLC // +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/mac/handler/testcases/DynamicImagesTests.h" #include "client/mac/handler/dynamic_images.h" diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/DynamicImagesTests.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc index a89d8c440..3779e357a 100644 --- a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc @@ -33,6 +33,10 @@ // Copyright 2008 Google LLC // +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/mac/handler/testcases/breakpad_nlist_test.h" #include #include "client/mac/handler/breakpad_nlist_64.h" diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/dwarftests.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/dwarftests.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/dwarftests.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/dwarftests.h diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/dwarftests.mm b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/dwarftests.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/dwarftests.mm rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/dwarftests.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym b/shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym rename to shared/sentry/src/external/breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym diff --git a/shared/sentry/external/breakpad/src/client/mac/handler/ucontext_compat.h b/shared/sentry/src/external/breakpad/src/client/mac/handler/ucontext_compat.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/handler/ucontext_compat.h rename to shared/sentry/src/external/breakpad/src/client/mac/handler/ucontext_compat.h diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/Breakpad.xib b/shared/sentry/src/external/breakpad/src/client/mac/sender/Breakpad.xib similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/Breakpad.xib rename to shared/sentry/src/external/breakpad/src/client/mac/sender/Breakpad.xib diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/English.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/English.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/English.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/English.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/ReporterIcon.graffle b/shared/sentry/src/external/breakpad/src/client/mac/sender/ReporterIcon.graffle similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/ReporterIcon.graffle rename to shared/sentry/src/external/breakpad/src/client/mac/sender/ReporterIcon.graffle diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender-Info.plist b/shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender-Info.plist similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender-Info.plist rename to shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender-Info.plist diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender.h b/shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender.h rename to shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender.h diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender.icns b/shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender.icns similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender.icns rename to shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender.icns diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender.m b/shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender.m similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/crash_report_sender.m rename to shared/sentry/src/external/breakpad/src/client/mac/sender/crash_report_sender.m diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/da.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/da.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/da.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/da.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/da.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/da.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/da.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/da.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/de.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/de.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/de.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/de.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/de.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/de.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/de.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/de.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/es.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/es.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/es.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/es.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/es.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/es.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/es.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/es.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/fr.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/fr.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/fr.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/fr.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/fr.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/fr.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/fr.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/fr.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/goArrow.png b/shared/sentry/src/external/breakpad/src/client/mac/sender/goArrow.png similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/goArrow.png rename to shared/sentry/src/external/breakpad/src/client/mac/sender/goArrow.png diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/it.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/it.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/it.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/it.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/it.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/it.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/it.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/it.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/ja.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/ja.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/ja.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/ja.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/ja.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/ja.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/ja.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/ja.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/nl.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/nl.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/nl.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/nl.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/nl.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/nl.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/nl.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/nl.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/no.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/no.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/no.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/no.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/no.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/no.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/no.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/no.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/sl.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/sl.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/sl.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/sl.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/sl.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/sl.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/sl.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/sl.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/sv.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/sv.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/sv.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/sv.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/sv.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/sv.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/sv.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/sv.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/tr.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/tr.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/tr.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/tr.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/tr.lproj/Localizable.strings b/shared/sentry/src/external/breakpad/src/client/mac/sender/tr.lproj/Localizable.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/tr.lproj/Localizable.strings rename to shared/sentry/src/external/breakpad/src/client/mac/sender/tr.lproj/Localizable.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/uploader.h b/shared/sentry/src/external/breakpad/src/client/mac/sender/uploader.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/uploader.h rename to shared/sentry/src/external/breakpad/src/client/mac/sender/uploader.h diff --git a/shared/sentry/external/breakpad/src/client/mac/sender/uploader.mm b/shared/sentry/src/external/breakpad/src/client/mac/sender/uploader.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/sender/uploader.mm rename to shared/sentry/src/external/breakpad/src/client/mac/sender/uploader.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/Controller.h b/shared/sentry/src/external/breakpad/src/client/mac/testapp/Controller.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/Controller.h rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/Controller.h diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/Controller.m b/shared/sentry/src/external/breakpad/src/client/mac/testapp/Controller.m similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/Controller.m rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/Controller.m diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings b/shared/sentry/src/external/breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib b/shared/sentry/src/external/breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/Info.plist b/shared/sentry/src/external/breakpad/src/client/mac/testapp/Info.plist similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/Info.plist rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/Info.plist diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/TestClass.h b/shared/sentry/src/external/breakpad/src/client/mac/testapp/TestClass.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/TestClass.h rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/TestClass.h diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/TestClass.mm b/shared/sentry/src/external/breakpad/src/client/mac/testapp/TestClass.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/TestClass.mm rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/TestClass.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/bomb.icns b/shared/sentry/src/external/breakpad/src/client/mac/testapp/bomb.icns similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/bomb.icns rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/bomb.icns diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/crashInMain b/shared/sentry/src/external/breakpad/src/client/mac/testapp/crashInMain similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/crashInMain rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/crashInMain diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/crashduringload b/shared/sentry/src/external/breakpad/src/client/mac/testapp/crashduringload similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/crashduringload rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/crashduringload diff --git a/shared/sentry/external/breakpad/src/client/mac/testapp/main.m b/shared/sentry/src/external/breakpad/src/client/mac/testapp/main.m similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/testapp/main.m rename to shared/sentry/src/external/breakpad/src/client/mac/testapp/main.m diff --git a/shared/sentry/external/breakpad/src/client/mac/tests/BreakpadFramework_Test.mm b/shared/sentry/src/external/breakpad/src/client/mac/tests/BreakpadFramework_Test.mm similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/tests/BreakpadFramework_Test.mm rename to shared/sentry/src/external/breakpad/src/client/mac/tests/BreakpadFramework_Test.mm diff --git a/shared/sentry/external/breakpad/src/client/mac/tests/crash_generation_server_test.cc b/shared/sentry/src/external/breakpad/src/client/mac/tests/crash_generation_server_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/mac/tests/crash_generation_server_test.cc rename to shared/sentry/src/external/breakpad/src/client/mac/tests/crash_generation_server_test.cc index 50825a938..743b268e0 100644 --- a/shared/sentry/external/breakpad/src/client/mac/tests/crash_generation_server_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/tests/crash_generation_server_test.cc @@ -29,6 +29,10 @@ // crash_generation_server_test.cc // Unit tests for CrashGenerationServer +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/mac/tests/exception_handler_test.cc b/shared/sentry/src/external/breakpad/src/client/mac/tests/exception_handler_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/mac/tests/exception_handler_test.cc rename to shared/sentry/src/external/breakpad/src/client/mac/tests/exception_handler_test.cc index eb9aa1bcd..91b931b94 100644 --- a/shared/sentry/external/breakpad/src/client/mac/tests/exception_handler_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/tests/exception_handler_test.cc @@ -28,6 +28,10 @@ // exception_handler_test.cc: Unit tests for google_breakpad::ExceptionHandler +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/mac/tests/minidump_generator_test.cc b/shared/sentry/src/external/breakpad/src/client/mac/tests/minidump_generator_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/mac/tests/minidump_generator_test.cc rename to shared/sentry/src/external/breakpad/src/client/mac/tests/minidump_generator_test.cc index 1a889dfec..2606e14f5 100644 --- a/shared/sentry/external/breakpad/src/client/mac/tests/minidump_generator_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/tests/minidump_generator_test.cc @@ -28,6 +28,10 @@ // minidump_generator_test.cc: Unit tests for google_breakpad::MinidumpGenerator +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #ifndef MAC_OS_X_VERSION_10_6 #define MAC_OS_X_VERSION_10_6 1060 diff --git a/shared/sentry/external/breakpad/src/client/mac/tests/minidump_generator_test_helper.cc b/shared/sentry/src/external/breakpad/src/client/mac/tests/minidump_generator_test_helper.cc similarity index 97% rename from shared/sentry/external/breakpad/src/client/mac/tests/minidump_generator_test_helper.cc rename to shared/sentry/src/external/breakpad/src/client/mac/tests/minidump_generator_test_helper.cc index 93cbe1bba..8177eeab7 100644 --- a/shared/sentry/external/breakpad/src/client/mac/tests/minidump_generator_test_helper.cc +++ b/shared/sentry/src/external/breakpad/src/client/mac/tests/minidump_generator_test_helper.cc @@ -30,6 +30,10 @@ // minidump_generator_test.cc can launch to test certain things // that require a separate executable. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "client/mac/handler/exception_handler.h" diff --git a/shared/sentry/external/breakpad/src/client/mac/tests/spawn_child_process.h b/shared/sentry/src/external/breakpad/src/client/mac/tests/spawn_child_process.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/tests/spawn_child_process.h rename to shared/sentry/src/external/breakpad/src/client/mac/tests/spawn_child_process.h diff --git a/shared/sentry/external/breakpad/src/client/mac/tests/testlogging.h b/shared/sentry/src/external/breakpad/src/client/mac/tests/testlogging.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/mac/tests/testlogging.h rename to shared/sentry/src/external/breakpad/src/client/mac/tests/testlogging.h diff --git a/shared/sentry/external/breakpad/src/client/minidump_file_writer-inl.h b/shared/sentry/src/external/breakpad/src/client/minidump_file_writer-inl.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/minidump_file_writer-inl.h rename to shared/sentry/src/external/breakpad/src/client/minidump_file_writer-inl.h diff --git a/shared/sentry/external/breakpad/src/client/minidump_file_writer.cc b/shared/sentry/src/external/breakpad/src/client/minidump_file_writer.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/minidump_file_writer.cc rename to shared/sentry/src/external/breakpad/src/client/minidump_file_writer.cc index d5193e2c0..c00af36c8 100644 --- a/shared/sentry/external/breakpad/src/client/minidump_file_writer.cc +++ b/shared/sentry/src/external/breakpad/src/client/minidump_file_writer.cc @@ -30,6 +30,10 @@ // // See minidump_file_writer.h for documentation. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/minidump_file_writer.h b/shared/sentry/src/external/breakpad/src/client/minidump_file_writer.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/minidump_file_writer.h rename to shared/sentry/src/external/breakpad/src/client/minidump_file_writer.h diff --git a/shared/sentry/external/breakpad/src/client/minidump_file_writer_unittest.cc b/shared/sentry/src/external/breakpad/src/client/minidump_file_writer_unittest.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/minidump_file_writer_unittest.cc rename to shared/sentry/src/external/breakpad/src/client/minidump_file_writer_unittest.cc index bb3a02693..21e0b8a1a 100644 --- a/shared/sentry/external/breakpad/src/client/minidump_file_writer_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/client/minidump_file_writer_unittest.cc @@ -36,6 +36,10 @@ -o minidump_file_writer_unittest */ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/Makefile b/shared/sentry/src/external/breakpad/src/client/solaris/handler/Makefile similarity index 100% rename from shared/sentry/external/breakpad/src/client/solaris/handler/Makefile rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/Makefile diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler.cc b/shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler.cc rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler.cc index b7b702acf..0e5f44976 100644 --- a/shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler.cc +++ b/shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler.cc @@ -28,6 +28,10 @@ // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler.h b/shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler.h rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler.h diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler_test.cc b/shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler_test.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler_test.cc rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler_test.cc index a84f2df13..3d656820d 100644 --- a/shared/sentry/external/breakpad/src/client/solaris/handler/exception_handler_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/solaris/handler/exception_handler_test.cc @@ -28,6 +28,10 @@ // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/minidump_generator.cc b/shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_generator.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/solaris/handler/minidump_generator.cc rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_generator.cc index 8f2f6ee25..5d24d0ae8 100644 --- a/shared/sentry/external/breakpad/src/client/solaris/handler/minidump_generator.cc +++ b/shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_generator.cc @@ -28,6 +28,10 @@ // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/minidump_generator.h b/shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_generator.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/solaris/handler/minidump_generator.h rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_generator.h diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/minidump_test.cc b/shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_test.cc similarity index 97% rename from shared/sentry/external/breakpad/src/client/solaris/handler/minidump_test.cc rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_test.cc index 00f8d9a5b..a8f690632 100644 --- a/shared/sentry/external/breakpad/src/client/solaris/handler/minidump_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/solaris/handler/minidump_test.cc @@ -28,6 +28,10 @@ // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/solaris_lwp.cc b/shared/sentry/src/external/breakpad/src/client/solaris/handler/solaris_lwp.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/solaris/handler/solaris_lwp.cc rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/solaris_lwp.cc index d707a5b31..02f1c37e8 100644 --- a/shared/sentry/external/breakpad/src/client/solaris/handler/solaris_lwp.cc +++ b/shared/sentry/src/external/breakpad/src/client/solaris/handler/solaris_lwp.cc @@ -28,6 +28,10 @@ // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/solaris/handler/solaris_lwp.h b/shared/sentry/src/external/breakpad/src/client/solaris/handler/solaris_lwp.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/solaris/handler/solaris_lwp.h rename to shared/sentry/src/external/breakpad/src/client/solaris/handler/solaris_lwp.h diff --git a/shared/sentry/external/breakpad/src/client/windows/common/auto_critical_section.h b/shared/sentry/src/external/breakpad/src/client/windows/common/auto_critical_section.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/common/auto_critical_section.h rename to shared/sentry/src/external/breakpad/src/client/windows/common/auto_critical_section.h diff --git a/shared/sentry/external/breakpad/src/client/windows/common/ipc_protocol.h b/shared/sentry/src/external/breakpad/src/client/windows/common/ipc_protocol.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/common/ipc_protocol.h rename to shared/sentry/src/external/breakpad/src/client/windows/common/ipc_protocol.h diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/ReadMe.txt b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/ReadMe.txt similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/ReadMe.txt rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/ReadMe.txt diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/client_info.cc b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/client_info.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/client_info.cc rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/client_info.cc index f0a4b9119..61ee21262 100644 --- a/shared/sentry/external/breakpad/src/client/windows/crash_generation/client_info.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/client_info.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/windows/crash_generation/client_info.h" #include "client/windows/common/ipc_protocol.h" diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/client_info.h b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/client_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/client_info.h rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/client_info.h diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_client.cc b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_client.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_client.cc rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_client.cc index d6da09eb9..c3d6a2bc8 100644 --- a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_client.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_client.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/windows/crash_generation/crash_generation_client.h" #include #include diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_client.h b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_client.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_client.h rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_client.h diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_server.cc b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_server.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_server.cc rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_server.cc index bf80ee9cf..61b0cbc0b 100644 --- a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_server.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_server.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/windows/crash_generation/crash_generation_server.h" #include #include diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_server.h b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_server.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/crash_generation_server.h rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/crash_generation_server.h diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/minidump_generator.cc b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/minidump_generator.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/minidump_generator.cc rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/minidump_generator.cc index 523db27ae..a0454cf94 100644 --- a/shared/sentry/external/breakpad/src/client/windows/crash_generation/minidump_generator.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/minidump_generator.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/windows/crash_generation/minidump_generator.h" #include diff --git a/shared/sentry/external/breakpad/src/client/windows/crash_generation/minidump_generator.h b/shared/sentry/src/external/breakpad/src/client/windows/crash_generation/minidump_generator.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/crash_generation/minidump_generator.h rename to shared/sentry/src/external/breakpad/src/client/windows/crash_generation/minidump_generator.h diff --git a/shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.cc b/shared/sentry/src/external/breakpad/src/client/windows/handler/exception_handler.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.cc rename to shared/sentry/src/external/breakpad/src/client/windows/handler/exception_handler.cc index 3b3938aa5..64b297999 100644 --- a/shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/handler/exception_handler.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.h b/shared/sentry/src/external/breakpad/src/client/windows/handler/exception_handler.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/handler/exception_handler.h rename to shared/sentry/src/external/breakpad/src/client/windows/handler/exception_handler.h diff --git a/shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.cc b/shared/sentry/src/external/breakpad/src/client/windows/sender/crash_report_sender.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.cc rename to shared/sentry/src/external/breakpad/src/client/windows/sender/crash_report_sender.cc index 27a7ec393..6ce0026ce 100644 --- a/shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/sender/crash_report_sender.cc @@ -29,6 +29,10 @@ // Disable exception handler warnings. #pragma warning( disable : 4530 ) +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "client/windows/sender/crash_report_sender.h" diff --git a/shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.h b/shared/sentry/src/external/breakpad/src/client/windows/sender/crash_report_sender.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/sender/crash_report_sender.h rename to shared/sentry/src/external/breakpad/src/client/windows/sender/crash_report_sender.h diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc similarity index 96% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc index 28b8ee14d..737c817c9 100644 --- a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/windows/tests/crash_generation_app/abstract_class.h" namespace google_breakpad { diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.h b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.h rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/abstract_class.h diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc index 883afcc69..9ae4679e3 100644 --- a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc @@ -29,6 +29,10 @@ // crash_generation_app.cpp : Defines the entry point for the application. // +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/windows/tests/crash_generation_app/crash_generation_app.h" #include diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.h b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.h rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.h diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.ico b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.ico similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.ico rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.ico diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.rc b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.rc similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.rc rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.rc diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/resource.h b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/resource.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/resource.h rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/resource.h diff --git a/shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/small.ico b/shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/small.ico similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/tests/crash_generation_app/small.ico rename to shared/sentry/src/external/breakpad/src/client/windows/tests/crash_generation_app/small.ico diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/crash_generation_server_test.cc b/shared/sentry/src/external/breakpad/src/client/windows/unittests/crash_generation_server_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/unittests/crash_generation_server_test.cc rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/crash_generation_server_test.cc index cd624f072..adb03f400 100644 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/crash_generation_server_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/unittests/crash_generation_server_test.cc @@ -27,6 +27,10 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "breakpad_googletest_includes.h" #include "client/windows/crash_generation/crash_generation_server.h" #include "client/windows/common/ipc_protocol.h" diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/dump_analysis.cc b/shared/sentry/src/external/breakpad/src/client/windows/unittests/dump_analysis.cc similarity index 98% rename from shared/sentry/external/breakpad/src/client/windows/unittests/dump_analysis.cc rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/dump_analysis.cc index 24a33769c..c403d8556 100644 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/dump_analysis.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/unittests/dump_analysis.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/dump_analysis.h b/shared/sentry/src/external/breakpad/src/client/windows/unittests/dump_analysis.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/unittests/dump_analysis.h rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/dump_analysis.h diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_death_test.cc b/shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_death_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_death_test.cc rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_death_test.cc index a7679dd66..50d3fda9d 100644 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_death_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_death_test.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc b/shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc index 81ae7dc7d..7fa6ac226 100644 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_test.cc b/shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_test.cc rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_test.cc index 237af29dd..f658726ba 100644 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_test.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "client/windows/unittests/exception_handler_test.h" #include diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_test.h b/shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_test.h similarity index 100% rename from shared/sentry/external/breakpad/src/client/windows/unittests/exception_handler_test.h rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/exception_handler_test.h diff --git a/shared/sentry/external/breakpad/src/client/windows/unittests/minidump_test.cc b/shared/sentry/src/external/breakpad/src/client/windows/unittests/minidump_test.cc similarity index 99% rename from shared/sentry/external/breakpad/src/client/windows/unittests/minidump_test.cc rename to shared/sentry/src/external/breakpad/src/client/windows/unittests/minidump_test.cc index 7bfc8d772..741447df4 100644 --- a/shared/sentry/external/breakpad/src/client/windows/unittests/minidump_test.cc +++ b/shared/sentry/src/external/breakpad/src/client/windows/unittests/minidump_test.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/android/include/asm-mips/README.md b/shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/README.md similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/asm-mips/README.md rename to shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/README.md diff --git a/shared/sentry/external/breakpad/src/common/android/include/asm-mips/asm.h b/shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/asm.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/asm-mips/asm.h rename to shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/asm.h diff --git a/shared/sentry/external/breakpad/src/common/android/include/asm-mips/fpregdef.h b/shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/fpregdef.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/asm-mips/fpregdef.h rename to shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/fpregdef.h diff --git a/shared/sentry/external/breakpad/src/common/android/include/asm-mips/regdef.h b/shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/regdef.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/asm-mips/regdef.h rename to shared/sentry/src/external/breakpad/src/common/android/include/asm-mips/regdef.h diff --git a/shared/sentry/external/breakpad/src/common/android/include/elf.h b/shared/sentry/src/external/breakpad/src/common/android/include/elf.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/elf.h rename to shared/sentry/src/external/breakpad/src/common/android/include/elf.h diff --git a/shared/sentry/external/breakpad/src/common/android/include/link.h b/shared/sentry/src/external/breakpad/src/common/android/include/link.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/link.h rename to shared/sentry/src/external/breakpad/src/common/android/include/link.h diff --git a/shared/sentry/external/breakpad/src/common/android/include/stab.h b/shared/sentry/src/external/breakpad/src/common/android/include/stab.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/stab.h rename to shared/sentry/src/external/breakpad/src/common/android/include/stab.h diff --git a/shared/sentry/external/breakpad/src/common/android/include/sys/procfs.h b/shared/sentry/src/external/breakpad/src/common/android/include/sys/procfs.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/sys/procfs.h rename to shared/sentry/src/external/breakpad/src/common/android/include/sys/procfs.h diff --git a/shared/sentry/external/breakpad/src/common/android/include/sys/user.h b/shared/sentry/src/external/breakpad/src/common/android/include/sys/user.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/include/sys/user.h rename to shared/sentry/src/external/breakpad/src/common/android/include/sys/user.h diff --git a/shared/sentry/external/breakpad/src/common/android/testing/include/wchar.h b/shared/sentry/src/external/breakpad/src/common/android/testing/include/wchar.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/testing/include/wchar.h rename to shared/sentry/src/external/breakpad/src/common/android/testing/include/wchar.h diff --git a/shared/sentry/external/breakpad/src/common/android/testing/mkdtemp.h b/shared/sentry/src/external/breakpad/src/common/android/testing/mkdtemp.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/testing/mkdtemp.h rename to shared/sentry/src/external/breakpad/src/common/android/testing/mkdtemp.h diff --git a/shared/sentry/external/breakpad/src/common/android/testing/pthread_fixes.h b/shared/sentry/src/external/breakpad/src/common/android/testing/pthread_fixes.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/android/testing/pthread_fixes.h rename to shared/sentry/src/external/breakpad/src/common/android/testing/pthread_fixes.h diff --git a/shared/sentry/external/breakpad/src/common/basictypes.h b/shared/sentry/src/external/breakpad/src/common/basictypes.h similarity index 86% rename from shared/sentry/external/breakpad/src/common/basictypes.h rename to shared/sentry/src/external/breakpad/src/common/basictypes.h index 6458a8932..79c9b7756 100644 --- a/shared/sentry/external/breakpad/src/common/basictypes.h +++ b/shared/sentry/src/external/breakpad/src/common/basictypes.h @@ -29,14 +29,6 @@ #ifndef COMMON_BASICTYPES_H_ #define COMMON_BASICTYPES_H_ -// A macro to disallow the copy constructor and operator= functions -// This should be used in the private: declarations for a class -#ifndef DISALLOW_COPY_AND_ASSIGN -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) -#endif // DISALLOW_COPY_AND_ASSIGN - namespace google_breakpad { // Used to explicitly mark the return value of a function as unused. If you are diff --git a/shared/sentry/external/breakpad/src/common/byte_cursor.h b/shared/sentry/src/external/breakpad/src/common/byte_cursor.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/byte_cursor.h rename to shared/sentry/src/external/breakpad/src/common/byte_cursor.h diff --git a/shared/sentry/external/breakpad/src/common/byte_cursor_unittest.cc b/shared/sentry/src/external/breakpad/src/common/byte_cursor_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/byte_cursor_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/byte_cursor_unittest.cc index 00648f764..41180ca2e 100644 --- a/shared/sentry/external/breakpad/src/common/byte_cursor_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/byte_cursor_unittest.cc @@ -31,6 +31,10 @@ // byte_cursor_unittest.cc: Unit tests for google_breakpad::ByteBuffer // and google_breakpad::ByteCursor. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/convert_UTF.cc b/shared/sentry/src/external/breakpad/src/common/convert_UTF.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/convert_UTF.cc rename to shared/sentry/src/external/breakpad/src/common/convert_UTF.cc index 4a5df1eb2..6e95b2f9b 100644 --- a/shared/sentry/external/breakpad/src/common/convert_UTF.cc +++ b/shared/sentry/src/external/breakpad/src/common/convert_UTF.cc @@ -55,6 +55,10 @@ See the header file "ConvertUTF.h" for complete documentation. ------------------------------------------------------------------------ */ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "convert_UTF.h" #ifdef CVTUTF_DEBUG #include diff --git a/shared/sentry/external/breakpad/src/common/convert_UTF.h b/shared/sentry/src/external/breakpad/src/common/convert_UTF.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/convert_UTF.h rename to shared/sentry/src/external/breakpad/src/common/convert_UTF.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/bytereader-inl.h b/shared/sentry/src/external/breakpad/src/common/dwarf/bytereader-inl.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/bytereader-inl.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/bytereader-inl.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/bytereader.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/bytereader.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/bytereader.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/bytereader.cc index 46bed6d03..faa7d680a 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/bytereader.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/bytereader.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/bytereader.h b/shared/sentry/src/external/breakpad/src/common/dwarf/bytereader.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/bytereader.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/bytereader.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/bytereader_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/bytereader_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/bytereader_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/bytereader_unittest.cc index c23c737be..a5eb0da53 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/bytereader_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/bytereader_unittest.cc @@ -30,6 +30,10 @@ // bytereader_unittest.cc: Unit tests for google_breakpad::ByteReader +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/cfi_assembler.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/cfi_assembler.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/dwarf/cfi_assembler.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/cfi_assembler.cc index 9ed979b41..b3e064f06 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/cfi_assembler.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/cfi_assembler.cc @@ -31,6 +31,10 @@ // cfi_assembler.cc: Implementation of google_breakpad::CFISection class. // See cfi_assembler.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/dwarf/cfi_assembler.h" #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/cfi_assembler.h b/shared/sentry/src/external/breakpad/src/common/dwarf/cfi_assembler.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/cfi_assembler.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/cfi_assembler.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler.cc index ea3ac71c8..8aea0f2ff 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler.cc @@ -31,6 +31,10 @@ // dwarf2diehandler.cc: Implement the dwarf2reader::DieDispatcher class. // See dwarf2diehandler.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler.h b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc index 67c9489dc..afcbf6254 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc @@ -32,6 +32,10 @@ // dwarf2diehander_unittest.cc: Unit tests for google_breakpad::DIEDispatcher. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2enums.h b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2enums.h similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2enums.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2enums.h index 777d9bfca..f1c995f92 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2enums.h +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2enums.h @@ -580,10 +580,10 @@ enum DwarfSectionId { DW_SECT_TYPES = 2, DW_SECT_ABBREV = 3, DW_SECT_LINE = 4, - DW_SECT_LOC = 5, + DW_SECT_LOCLISTS = 5, DW_SECT_STR_OFFSETS = 6, - DW_SECT_MACINFO = 7, - DW_SECT_MACRO = 8 + DW_SECT_MACRO = 7, + DW_SECT_RNGLISTS = 8 }; // Source languages. These are values for DW_AT_language. diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader.cc similarity index 96% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader.cc index b191d78c5..8a8bf6f86 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader.cc @@ -31,6 +31,10 @@ // Implementation of LineInfo, CompilationUnit, // and CallFrameInfo. See dwarf2reader.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/dwarf/dwarf2reader.h" #include @@ -76,9 +80,10 @@ CompilationUnit::CompilationUnit(const string& path, str_offsets_buffer_(NULL), str_offsets_buffer_length_(0), addr_buffer_(NULL), addr_buffer_length_(0), is_split_dwarf_(false), is_type_unit_(false), dwo_id_(0), dwo_name_(), - skeleton_dwo_id_(0), ranges_base_(0), addr_base_(0), - str_offsets_base_(0), have_checked_for_dwp_(false), dwp_path_(), - dwp_byte_reader_(), dwp_reader_() {} + skeleton_dwo_id_(0), addr_base_(0), + str_offsets_base_(0), have_checked_for_dwp_(false), + should_process_split_dwarf_(false), low_pc_(0), + has_source_line_info_(false), source_line_offset_(0) {} // Initialize a compilation unit from a .dwo or .dwp file. // In this case, we need the .debug_addr section from the @@ -87,16 +92,10 @@ CompilationUnit::CompilationUnit(const string& path, // the executable file, and call it as if we were still // processing the original compilation unit. -void CompilationUnit::SetSplitDwarf(const uint8_t* addr_buffer, - uint64_t addr_buffer_length, - uint64_t addr_base, - uint64_t ranges_base, +void CompilationUnit::SetSplitDwarf(uint64_t addr_base, uint64_t dwo_id) { is_split_dwarf_ = true; - addr_buffer_ = addr_buffer; - addr_buffer_length_ = addr_buffer_length; addr_base_ = addr_base; - ranges_base_ = ranges_base; skeleton_dwo_id_ = dwo_id; } @@ -396,7 +395,13 @@ uint64_t CompilationUnit::Start() { // Set up our buffer buffer_ = iter->second.first + offset_from_section_start_; - buffer_length_ = iter->second.second - offset_from_section_start_; + if (is_split_dwarf_) { + iter = GetSectionByName(sections_, ".debug_info_offset"); + assert(iter != sections_.end()); + buffer_length_ = iter->second.second; + } else { + buffer_length_ = iter->second.second - offset_from_section_start_; + } // Read the header ReadHeader(); @@ -430,6 +435,12 @@ uint64_t CompilationUnit::Start() { string_buffer_length_ = iter->second.second; } + iter = GetSectionByName(sections_, ".debug_line"); + if (iter != sections_.end()) { + line_buffer_ = iter->second.first; + line_buffer_length_ = iter->second.second; + } + // Set the line string section if we have one. iter = GetSectionByName(sections_, ".debug_line_str"); if (iter != sections_.end()) { @@ -457,10 +468,8 @@ uint64_t CompilationUnit::Start() { // If this is a skeleton compilation unit generated with split DWARF, // and the client needs the full debug info, we need to find the full // compilation unit in a .dwo or .dwp file. - if (!is_split_dwarf_ - && dwo_name_ != NULL - && handler_->NeedSplitDebugInfo()) - ProcessSplitDwarf(); + should_process_split_dwarf_ = + !is_split_dwarf_ && dwo_name_ != NULL && handler_->NeedSplitDebugInfo(); return ourlength; } @@ -881,7 +890,9 @@ const uint8_t* CompilationUnit::ProcessDIE(uint64_t dieoffset, // DW_AT_str_offsets_base or DW_AT_addr_base. If it does, that attribute must // be found and processed before trying to process the other attributes; // otherwise the string or address values will all come out incorrect. - if (abbrev.tag == DW_TAG_compile_unit && header_.version == 5) { + if ((abbrev.tag == DW_TAG_compile_unit || + abbrev.tag == DW_TAG_skeleton_unit) && + header_.version == 5) { uint64_t dieoffset_copy = dieoffset; const uint8_t* start_copy = start; for (AttributeList::const_iterator i = abbrev.attributes.begin(); @@ -990,66 +1001,69 @@ inline int GetElfWidth(const ElfReader& elf) { return 0; } -void CompilationUnit::ProcessSplitDwarf() { +bool CompilationUnit::ProcessSplitDwarf(std::string& split_file, + SectionMap& sections, + ByteReader& split_byte_reader, + uint64_t& cu_offset) { + if (!should_process_split_dwarf_) + return false; struct stat statbuf; + bool found_in_dwp = false; if (!have_checked_for_dwp_) { // Look for a .dwp file in the same directory as the executable. have_checked_for_dwp_ = true; string dwp_suffix(".dwp"); - dwp_path_ = path_ + dwp_suffix; - if (stat(dwp_path_.c_str(), &statbuf) != 0) { + std::string dwp_path = path_ + dwp_suffix; + if (stat(dwp_path.c_str(), &statbuf) != 0) { // Fall back to a split .debug file in the same directory. string debug_suffix(".debug"); - dwp_path_ = path_; + dwp_path = path_; size_t found = path_.rfind(debug_suffix); - if (found + debug_suffix.length() == path_.length()) - dwp_path_ = dwp_path_.replace(found, debug_suffix.length(), dwp_suffix); + if (found != string::npos && + found + debug_suffix.length() == path_.length()) + dwp_path = dwp_path.replace(found, debug_suffix.length(), dwp_suffix); } - if (stat(dwp_path_.c_str(), &statbuf) == 0) { - ElfReader* elf = new ElfReader(dwp_path_); - int width = GetElfWidth(*elf); + if (stat(dwp_path.c_str(), &statbuf) == 0) { + split_elf_reader_ = std::make_unique(dwp_path); + int width = GetElfWidth(*split_elf_reader_.get()); if (width != 0) { - dwp_byte_reader_.reset(new ByteReader(reader_->GetEndianness())); - dwp_byte_reader_->SetAddressSize(width); - dwp_reader_.reset(new DwpReader(*dwp_byte_reader_, elf)); + split_byte_reader = ByteReader(reader_->GetEndianness()); + split_byte_reader.SetAddressSize(width); + dwp_reader_ = std::make_unique(split_byte_reader, + split_elf_reader_.get()); dwp_reader_->Initialize(); - } else { - delete elf; + // If we have a .dwp file, read the debug sections for the requested CU. + dwp_reader_->ReadDebugSectionsForCU(dwo_id_, §ions); + if (!sections.empty()) { + SectionMap::const_iterator cu_iter = + GetSectionByName(sections, ".debug_info_offset"); + SectionMap::const_iterator debug_info_iter = + GetSectionByName(sections, ".debug_info"); + assert(cu_iter != sections.end()); + assert(debug_info_iter != sections.end()); + cu_offset = cu_iter->second.first - debug_info_iter->second.first; + found_in_dwp = true; + split_file = dwp_path; + } } } } - bool found_in_dwp = false; - if (dwp_reader_) { - // If we have a .dwp file, read the debug sections for the requested CU. - SectionMap sections; - dwp_reader_->ReadDebugSectionsForCU(dwo_id_, §ions); - if (!sections.empty()) { - found_in_dwp = true; - CompilationUnit dwp_comp_unit(dwp_path_, sections, 0, - dwp_byte_reader_.get(), handler_); - dwp_comp_unit.SetSplitDwarf(addr_buffer_, addr_buffer_length_, addr_base_, - ranges_base_, dwo_id_); - dwp_comp_unit.Start(); - } - } if (!found_in_dwp) { // If no .dwp file, try to open the .dwo file. if (stat(dwo_name_, &statbuf) == 0) { - ElfReader elf(dwo_name_); - int width = GetElfWidth(elf); + split_elf_reader_ = std::make_unique(dwo_name_); + int width = GetElfWidth(*split_elf_reader_.get()); if (width != 0) { - ByteReader reader(ENDIANNESS_LITTLE); - reader.SetAddressSize(width); - SectionMap sections; - ReadDebugSectionsFromDwo(&elf, §ions); - CompilationUnit dwo_comp_unit(dwo_name_, sections, 0, &reader, - handler_); - dwo_comp_unit.SetSplitDwarf(addr_buffer_, addr_buffer_length_, - addr_base_, ranges_base_, dwo_id_); - dwo_comp_unit.Start(); + split_byte_reader = ByteReader(ENDIANNESS_LITTLE); + split_byte_reader.SetAddressSize(width); + ReadDebugSectionsFromDwo(split_elf_reader_.get(), §ions); + if (!sections.empty()) { + split_file = dwo_name_; + } } } } + return !split_file.empty(); } void CompilationUnit::ReadDebugSectionsFromDwo(ElfReader* elf_reader, @@ -1084,10 +1098,6 @@ DwpReader::DwpReader(const ByteReader& byte_reader, ElfReader* elf_reader) abbrev_size_(0), info_data_(NULL), info_size_(0), str_offsets_data_(NULL), str_offsets_size_(0) {} -DwpReader::~DwpReader() { - if (elf_reader_) delete elf_reader_; -} - void DwpReader::Initialize() { cu_index_ = elf_reader_->GetSectionByName(".debug_cu_index", &cu_index_size_); @@ -1127,6 +1137,8 @@ void DwpReader::Initialize() { info_data_ = elf_reader_->GetSectionByName(".debug_info.dwo", &info_size_); str_offsets_data_ = elf_reader_->GetSectionByName(".debug_str_offsets.dwo", &str_offsets_size_); + rnglist_data_ = + elf_reader_->GetSectionByName(".debug_rnglists.dwo", &rnglist_size_); if (size_table_ >= cu_index_ + cu_index_size_) { version_ = 0; } @@ -1227,13 +1239,24 @@ void DwpReader::ReadDebugSectionsForCU(uint64_t dwo_id, } else if (section_id == DW_SECT_INFO) { sections->insert(std::make_pair( ".debug_info", - std::make_pair(reinterpret_cast (info_data_) - + offset, size))); + std::make_pair(reinterpret_cast(info_data_), 0))); + // .debug_info_offset will points the buffer for the CU with given + // dwo_id. + sections->insert(std::make_pair( + ".debug_info_offset", + std::make_pair( + reinterpret_cast(info_data_) + offset, size))); } else if (section_id == DW_SECT_STR_OFFSETS) { sections->insert(std::make_pair( ".debug_str_offsets", std::make_pair(reinterpret_cast (str_offsets_data_) + offset, size))); + } else if (section_id == DW_SECT_RNGLISTS) { + sections->insert(std::make_pair( + ".debug_rnglists", + std::make_pair( + reinterpret_cast(rnglist_data_) + offset, + size))); } } sections->insert(std::make_pair( @@ -1819,6 +1842,11 @@ bool RangeListReader::ReadRanges(enum DwarfForm form, uint64_t data) { return ReadDebugRngList(data); } } else if (form == DW_FORM_rnglistx) { + if (cu_info_->ranges_base_ == 0) { + // In split dwarf, there's no DW_AT_rnglists_base attribute, range_base + // will just be the first byte after the header. + cu_info_->ranges_base_ = reader_->OffsetSize() == 4? 12: 20; + } offset_array_ = cu_info_->ranges_base_; uint64_t index_offset = reader_->OffsetSize() * data; uint64_t range_list_offset = diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader.h b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader.h similarity index 97% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader.h index ddcdd8011..b6bd2f31a 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader.h +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader.h @@ -469,8 +469,7 @@ class CompilationUnit { // compilation unit. We also inherit the Dwarf2Handler from // the executable file, and call it as if we were still // processing the original compilation unit. - void SetSplitDwarf(const uint8_t* addr_buffer, uint64_t addr_buffer_length, - uint64_t addr_base, uint64_t ranges_base, uint64_t dwo_id); + void SetSplitDwarf(uint64_t addr_base, uint64_t dwo_id); // Begin reading a Dwarf2 compilation unit, and calling the // callbacks in the Dwarf2Handler @@ -481,6 +480,36 @@ class CompilationUnit { // start of the next compilation unit, if there is one. uint64_t Start(); + // Process the actual debug information in a split DWARF file. + bool ProcessSplitDwarf(std::string& split_file, + SectionMap& sections, + ByteReader& split_byte_reader, + uint64_t& cu_offset); + + const uint8_t* GetAddrBuffer() { return addr_buffer_; } + + uint64_t GetAddrBufferLen() { return addr_buffer_length_; } + + uint64_t GetAddrBase() { return addr_base_; } + + uint64_t GetLowPC() { return low_pc_; } + + uint64_t GetDWOID() { return dwo_id_; } + + const uint8_t* GetLineBuffer() { return line_buffer_; } + + uint64_t GetLineBufferLen() { return line_buffer_length_; } + + const uint8_t* GetLineStrBuffer() { return line_string_buffer_; } + + uint64_t GetLineStrBufferLen() { return line_string_buffer_length_; } + + bool HasSourceLineInfo() { return has_source_line_info_; } + + uint64_t GetSourceLineOffset() { return source_line_offset_; } + + bool ShouldProcessSplitDwarf() { return should_process_split_dwarf_; } + private: // This struct represents a single DWARF2/3 abbreviation @@ -565,14 +594,12 @@ class CompilationUnit { else if (attr == DW_AT_str_offsets_base) { str_offsets_base_ = data; } - else if (attr == DW_AT_GNU_ranges_base || attr == DW_AT_rnglists_base) { - ranges_base_ = data; + else if (attr == DW_AT_low_pc) { + low_pc_ = data; } - // TODO(yunlian): When we add DW_AT_ranges_base from DWARF-5, - // that base will apply to DW_AT_ranges attributes in the - // skeleton CU as well as in the .dwo/.dwp files. - else if (attr == DW_AT_ranges && is_split_dwarf_) { - data += ranges_base_; + else if (attr == DW_AT_stmt_list) { + has_source_line_info_ = true; + source_line_offset_ = data; } handler_->ProcessAttributeUnsigned(offset, attr, form, data); } @@ -647,9 +674,6 @@ class CompilationUnit { // new place to position the stream to. const uint8_t* SkipAttribute(const uint8_t* start, enum DwarfForm form); - // Process the actual debug information in a split DWARF file. - void ProcessSplitDwarf(); - // Read the debug sections from a .dwo file. void ReadDebugSectionsFromDwo(ElfReader* elf_reader, SectionMap* sections); @@ -658,7 +682,7 @@ class CompilationUnit { const string path_; // Offset from section start is the offset of this compilation unit - // from the beginning of the .debug_info section. + // from the beginning of the .debug_info/.debug_info.dwo section. uint64_t offset_from_section_start_; // buffer is the buffer for our CU, starting at .debug_info + offset @@ -688,7 +712,7 @@ class CompilationUnit { const uint8_t* string_buffer_; uint64_t string_buffer_length_; - // Similarly for .debug_line_string. + // Similarly for .debug_line_str. const uint8_t* line_string_buffer_; uint64_t line_string_buffer_length_; @@ -702,6 +726,10 @@ class CompilationUnit { const uint8_t* addr_buffer_; uint64_t addr_buffer_length_; + // .debug_line section buffer and length. + const uint8_t* line_buffer_; + uint64_t line_buffer_length_; + // Flag indicating whether this compilation unit is part of a .dwo // or .dwp file. If true, we are reading this unit because a // skeleton compilation unit in an executable file had a @@ -730,10 +758,6 @@ class CompilationUnit { // from the skeleton CU. uint64_t skeleton_dwo_id_; - // The value of the DW_AT_GNU_ranges_base or DW_AT_rnglists_base attribute, - // if any. - uint64_t ranges_base_; - // The value of the DW_AT_GNU_addr_base attribute, if any. uint64_t addr_base_; @@ -743,14 +767,20 @@ class CompilationUnit { // True if we have already looked for a .dwp file. bool have_checked_for_dwp_; - // Path to the .dwp file. - string dwp_path_; - - // ByteReader for the DWP file. - std::unique_ptr dwp_byte_reader_; + // ElfReader for the dwo/dwo file. + std::unique_ptr split_elf_reader_; // DWP reader. - std::unique_ptr dwp_reader_; + std::unique_ptr dwp_reader_; + + bool should_process_split_dwarf_; + + // The value of the DW_AT_low_pc attribute, if any. + uint64_t low_pc_; + + // The value of DW_AT_stmt_list attribute if any. + bool has_source_line_info_; + uint64_t source_line_offset_; }; // A Reader for a .dwp file. Supports the fetching of DWARF debug @@ -770,8 +800,6 @@ class DwpReader { public: DwpReader(const ByteReader& byte_reader, ElfReader* elf_reader); - ~DwpReader(); - // Read the CU index and initialize data members. void Initialize(); @@ -839,6 +867,8 @@ class DwpReader { size_t info_size_; const char* str_offsets_data_; size_t str_offsets_size_; + const char* rnglist_data_; + size_t rnglist_size_; }; // This class is a reader for DWARF's Call Frame Information. CFI diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc index dc4418c72..67b662a35 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc @@ -30,6 +30,10 @@ // dwarf2reader_cfi_unittest.cc: Unit tests for google_breakpad::CallFrameInfo +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc index fc639a64b..2b365396d 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc @@ -30,6 +30,10 @@ // dwarf2reader_die_unittest.cc: Unit tests for google_breakpad::CompilationUnit +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include @@ -329,7 +333,8 @@ struct DwarfFormsFixture: public DIEFixture { uint64_t offset=0) { ByteReader byte_reader(params.endianness == kLittleEndian ? ENDIANNESS_LITTLE : ENDIANNESS_BIG); - CompilationUnit parser("", MakeSectionMap(), offset, &byte_reader, &handler); + CompilationUnit parser("", MakeSectionMap(), offset, &byte_reader, + &handler); EXPECT_EQ(offset + parser.Start(), info_contents.size()); } diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc index 033c63336..7de627d3c 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc @@ -30,6 +30,10 @@ // dwarf2reader_lineinfo_unittest.cc: Unit tests for google_breakpad::LineInfo +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc index 9ceea1097..12b27e686 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc @@ -32,6 +32,10 @@ // information generated when with splitting optimizations such as // -fsplit-machine-functions (clang) -freorder-blocks-and-partition (gcc). +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_test_common.h b/shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_test_common.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/dwarf2reader_test_common.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/dwarf2reader_test_common.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/elf_reader.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/elf_reader.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/dwarf/elf_reader.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/elf_reader.cc index 4f8b6030c..31deb9db4 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/elf_reader.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/elf_reader.cc @@ -30,6 +30,10 @@ #define _GNU_SOURCE // needed for pread() #endif +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include @@ -39,9 +43,9 @@ #include #include -#include #include #include +#include #include // TODO(saugustine): Add support for compressed debug. // Also need to add configure tests for zlib. @@ -107,6 +111,12 @@ const int kAARCH64PLT0Size = 0x20; // Suffix for PLT functions when it needs to be explicitly identified as such. const char kPLTFunctionSuffix[] = "@plt"; +// Replace callsites of this function to std::string_view::starts_with after +// adopting C++20. +bool StringViewStartsWith(std::string_view sv, std::string_view prefix) { + return sv.compare(0, prefix.size(), prefix) == 0; +} + } // namespace namespace google_breakpad { @@ -183,7 +193,7 @@ class Elf64 { template class ElfSectionReader { public: - ElfSectionReader(const char* name, const string& path, int fd, + ElfSectionReader(const char* cname, const string& path, int fd, const typename ElfArch::Shdr& section_header) : contents_aligned_(NULL), contents_(NULL), @@ -198,8 +208,8 @@ class ElfSectionReader { if (header_.sh_type == SHT_NOBITS || header_.sh_size == 0) return; // extra sh_type check for string table. - if ((std::strcmp(name, ".strtab") == 0 || - std::strcmp(name, ".shstrtab") == 0) && + std::string_view name{cname}; + if ((name == ".strtab" || name == ".shstrtab") && header_.sh_type != SHT_STRTAB) { fprintf(stderr, "Invalid sh_type for string table section: expected " @@ -215,7 +225,7 @@ class ElfSectionReader { (header_.sh_offset - offset_aligned); // Check for and handle any compressed contents. - //if (strncmp(name, ".zdebug_", strlen(".zdebug_")) == 0) + //if (StringViewStartsWith(name, ".zdebug_")) // DecompressZlibContents(); // TODO(saugustine): Add support for proposed elf-section flag // "SHF_COMPRESS". @@ -359,8 +369,8 @@ class ElfReaderImpl { // "opd_section_" must always be checked for NULL before use. opd_section_ = GetSectionInfoByName(".opd", &opd_info_); for (unsigned int k = 0u; k < GetNumSections(); ++k) { - const char* name = GetSectionName(section_headers_[k].sh_name); - if (strncmp(name, ".text", strlen(".text")) == 0) { + std::string_view name{GetSectionName(section_headers_[k].sh_name)}; + if (StringViewStartsWith(name, ".text")) { base_for_text_ = section_headers_[k].sh_addr - section_headers_[k].sh_offset; break; @@ -809,9 +819,11 @@ class ElfReaderImpl { // Debug sections are likely to be near the end, so reverse the // direction of iteration. for (int k = GetNumSections() - 1; k >= 0; --k) { - const char* name = GetSectionName(section_headers_[k].sh_name); - if (strncmp(name, ".debug", strlen(".debug")) == 0) return true; - if (strncmp(name, ".zdebug", strlen(".zdebug")) == 0) return true; + std::string_view name{GetSectionName(section_headers_[k].sh_name)}; + if (StringViewStartsWith(name, ".debug") || + StringViewStartsWith(name, ".zdebug")) { + return true; + } } return false; } @@ -1213,11 +1225,15 @@ const char* ElfReader::GetSectionInfoByName(const string& section_name, } } -bool ElfReader::SectionNamesMatch(const string& name, const string& sh_name) { - if ((name.find(".debug_", 0) == 0) && (sh_name.find(".zdebug_", 0) == 0)) { - const string name_suffix(name, strlen(".debug_")); - const string sh_name_suffix(sh_name, strlen(".zdebug_")); - return name_suffix == sh_name_suffix; +bool ElfReader::SectionNamesMatch(std::string_view name, + std::string_view sh_name) { + std::string_view debug_prefix{".debug_"}; + std::string_view zdebug_prefix{".zdebug_"}; + if (StringViewStartsWith(name, debug_prefix) && + StringViewStartsWith(sh_name, zdebug_prefix)) { + name.remove_prefix(debug_prefix.length()); + sh_name.remove_prefix(zdebug_prefix.length()); + return name == sh_name; } return name == sh_name; } diff --git a/shared/sentry/external/breakpad/src/common/dwarf/elf_reader.h b/shared/sentry/src/external/breakpad/src/common/dwarf/elf_reader.h similarity index 97% rename from shared/sentry/external/breakpad/src/common/dwarf/elf_reader.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/elf_reader.h index 672969d81..a6dec7555 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/elf_reader.h +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/elf_reader.h @@ -16,6 +16,7 @@ #define COMMON_DWARF_ELF_READER_H__ #include +#include #include #include "common/dwarf/types.h" @@ -145,7 +146,8 @@ class ElfReader { // appears in the elf-file, adjusting for compressed debug section // names. For example, returns true if name == ".debug_abbrev" and // sh_name == ".zdebug_abbrev" - static bool SectionNamesMatch(const string& name, const string& sh_name); + static bool SectionNamesMatch(std::string_view name, + std::string_view sh_name); private: // Lazily initialize impl32_ and return it. diff --git a/shared/sentry/external/breakpad/src/common/dwarf/functioninfo.cc b/shared/sentry/src/external/breakpad/src/common/dwarf/functioninfo.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf/functioninfo.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf/functioninfo.cc index d8fdb842d..5b0ce81a4 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf/functioninfo.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf/functioninfo.cc @@ -29,6 +29,10 @@ // This is a client for the dwarf2reader to extract function and line // information from the debug info. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf/functioninfo.h b/shared/sentry/src/external/breakpad/src/common/dwarf/functioninfo.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/functioninfo.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/functioninfo.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/line_state_machine.h b/shared/sentry/src/external/breakpad/src/common/dwarf/line_state_machine.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/line_state_machine.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/line_state_machine.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf/types.h b/shared/sentry/src/external/breakpad/src/common/dwarf/types.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf/types.h rename to shared/sentry/src/external/breakpad/src/common/dwarf/types.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module.cc b/shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module.cc similarity index 89% rename from shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module.cc index e7e595e76..4c594175e 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module.cc @@ -33,7 +33,13 @@ // Implementation of google_breakpad::DwarfCFIToModule. // See dwarf_cfi_to_module.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include #include +#include #include "common/dwarf_cfi_to_module.h" @@ -141,6 +147,29 @@ vector DwarfCFIToModule::RegisterNames::MIPS() { sizeof(kRegisterNames) / sizeof(kRegisterNames[0])); } +vector DwarfCFIToModule::RegisterNames::RISCV() { + static const char *const names[] = { + "pc", "ra", "sp", "gp", "tp", "t0", "t1", "t2", + "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", + "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", + "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + }; + + return MakeVector(names, sizeof(names) / sizeof(names[0])); +} + bool DwarfCFIToModule::Entry(size_t offset, uint64_t address, uint64_t length, uint8_t version, const string& augmentation, unsigned return_address) { @@ -151,7 +180,7 @@ bool DwarfCFIToModule::Entry(size_t offset, uint64_t address, uint64_t length, // need to check them here. // Get ready to collect entries. - entry_ = new Module::StackFrameEntry; + entry_ = std::make_unique(); entry_->address = address; entry_->size = length; entry_offset_ = offset; @@ -258,8 +287,7 @@ bool DwarfCFIToModule::ValExpressionRule(uint64_t address, int reg, } bool DwarfCFIToModule::End() { - module_->AddStackFrameEntry(entry_); - entry_ = NULL; + module_->AddStackFrameEntry(std::move(entry_)); return true; } diff --git a/shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module.h b/shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module.h similarity index 97% rename from shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module.h rename to shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module.h index 3b092654d..19297db93 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module.h +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module.h @@ -43,6 +43,7 @@ #include #include +#include #include #include "common/module.h" @@ -113,6 +114,9 @@ class DwarfCFIToModule: public CallFrameInfo::Handler { // MIPS. static vector MIPS(); + // RISC-V. + static vector RISCV(); + private: // Given STRINGS, an array of C strings with SIZE elements, return an // equivalent vector. @@ -131,9 +135,9 @@ class DwarfCFIToModule: public CallFrameInfo::Handler { DwarfCFIToModule(Module* module, const vector& register_names, Reporter* reporter) : module_(module), register_names_(register_names), reporter_(reporter), - entry_(NULL), return_address_(-1), cfa_name_(".cfa"), ra_name_(".ra") { + return_address_(-1), cfa_name_(".cfa"), ra_name_(".ra") { } - virtual ~DwarfCFIToModule() { delete entry_; } + virtual ~DwarfCFIToModule() = default; virtual bool Entry(size_t offset, uint64_t address, uint64_t length, uint8_t version, const string& augmentation, @@ -170,7 +174,7 @@ class DwarfCFIToModule: public CallFrameInfo::Handler { Reporter* reporter_; // The current entry we're constructing. - Module::StackFrameEntry* entry_; + std::unique_ptr entry_; // The section offset of the current frame description entry, for // use in error messages. diff --git a/shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module_unittest.cc similarity index 96% rename from shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module_unittest.cc index 0b677b211..52653ec6e 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_cfi_to_module_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_cfi_to_module_unittest.cc @@ -30,6 +30,10 @@ // dwarf_cfi_to_module_unittest.cc: Tests for google_breakpad::DwarfCFIToModule. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include @@ -303,3 +307,15 @@ TEST(RegisterNames, X86_64) { EXPECT_EQ("$rsp", names[7]); EXPECT_EQ("$rip", names[16]); } + +TEST(RegisterNames, RISCV) { + vector names = DwarfCFIToModule::RegisterNames::RISCV(); + + EXPECT_EQ("pc", names[0]); + EXPECT_EQ("t6", names[31]); + EXPECT_EQ("f0", names[32]); + EXPECT_EQ("f31", names[63]); + EXPECT_EQ("v0", names[96]); + EXPECT_EQ("v31", names[127]); +} + diff --git a/shared/sentry/external/breakpad/src/common/dwarf_cu_to_module.cc b/shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module.cc similarity index 94% rename from shared/sentry/external/breakpad/src/common/dwarf_cu_to_module.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module.cc index f5293de49..94a0d428e 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_cu_to_module.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module.cc @@ -35,6 +35,10 @@ #define __STDC_FORMAT_MACROS #endif /* __STDC_FORMAT_MACROS */ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/dwarf_cu_to_module.h" #include @@ -123,6 +127,10 @@ DwarfCUToModule::FileContext::FileContext(const string& filename, } DwarfCUToModule::FileContext::~FileContext() { + for (std::vector::iterator i = uncompressed_sections_.begin(); + i != uncompressed_sections_.end(); ++i) { + delete[] *i; + } } void DwarfCUToModule::FileContext::AddSectionToSectionMap( @@ -130,6 +138,12 @@ void DwarfCUToModule::FileContext::AddSectionToSectionMap( section_map_[name] = std::make_pair(contents, length); } +void DwarfCUToModule::FileContext::AddManagedSectionToSectionMap( + const string& name, uint8_t* contents, uint64_t length) { + section_map_[name] = std::make_pair(contents, length); + uncompressed_sections_.push_back(contents); +} + void DwarfCUToModule::FileContext::ClearSectionMapForTest() { section_map_.clear(); } @@ -155,19 +169,23 @@ bool DwarfCUToModule::FileContext::IsUnhandledInterCUReference( // parsing. This is for data shared across the CU's entire DIE tree, // and parameters from the code invoking the CU parser. struct DwarfCUToModule::CUContext { - CUContext(FileContext* file_context_arg, WarningReporter* reporter_arg, - RangesHandler* ranges_handler_arg) + CUContext(FileContext* file_context_arg, + WarningReporter* reporter_arg, + RangesHandler* ranges_handler_arg, + uint64_t low_pc, + uint64_t addr_base) : version(0), file_context(file_context_arg), reporter(reporter_arg), ranges_handler(ranges_handler_arg), language(Language::CPlusPlus), - low_pc(0), + low_pc(low_pc), high_pc(0), ranges_form(DW_FORM_sec_offset), ranges_data(0), ranges_base(0), - str_offsets_base(0) { } + addr_base(addr_base), + str_offsets_base(0) {} ~CUContext() { for (vector::iterator it = functions.begin(); @@ -316,7 +334,10 @@ class DwarfCUToModule::GenericDIEHandler: public DIEHandler { // Use this from EndAttributes member functions, not ProcessAttribute* // functions; only the former can be sure that all the DIE's attributes // have been seen. - StringView ComputeQualifiedName(); + // + // On return, if has_qualified_name is non-NULL, *has_qualified_name is set to + // true if the DIE includes a fully-qualified name, false otherwise. + StringView ComputeQualifiedName(bool* has_qualified_name); CUContext* cu_context_; DIEContext* parent_context_; @@ -452,7 +473,8 @@ void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString( } } -StringView DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() { +StringView DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName( + bool* has_qualified_name) { // Use the demangled name, if one is available. Demangled names are // preferable to those inferred from the DWARF structure because they // include argument types. @@ -468,6 +490,15 @@ StringView DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() { StringView* unqualified_name = nullptr; StringView* enclosing_name = nullptr; if (!qualified_name) { + if (has_qualified_name) { + // dSYMs built with -gmlt do not include the DW_AT_linkage_name + // with the unmangled symbol, but rather include it in the + // LC_SYMTAB STABS, which end up in the externs of the module. + // + // Remember this so the Module can copy over the extern name later. + *has_qualified_name = false; + } + // Find the unqualified name. If the DIE has its own DW_AT_name // attribute, then use that; otherwise, check the specification. if (!name_attribute_.empty()) { @@ -486,6 +517,10 @@ StringView DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() { } else if (parent_context_) { enclosing_name = &parent_context_->name; } + } else { + if (has_qualified_name) { + *has_qualified_name = true; + } } // Prepare the return value before upcoming mutations possibly invalidate the @@ -544,6 +579,7 @@ class DwarfCUToModule::InlineHandler : public GenericDIEHandler { ranges_data_(0), call_site_line_(0), inline_nest_level_(inline_nest_level), + has_range_data_(false), inlines_(inlines) {} void ProcessAttributeUnsigned(enum DwarfAttribute attr, @@ -565,6 +601,7 @@ class DwarfCUToModule::InlineHandler : public GenericDIEHandler { int call_site_line_; // DW_AT_call_line int call_site_file_id_; // DW_AT_call_file int inline_nest_level_; + bool has_range_data_; // A vector of inlines in the same nest level. It's owned by its parent // function/inline. At Finish(), add this inline into the vector. vector>& inlines_; @@ -585,6 +622,7 @@ void DwarfCUToModule::InlineHandler::ProcessAttributeUnsigned( high_pc_ = data; break; case DW_AT_ranges: + has_range_data_ = true; ranges_data_ = data; ranges_form_ = form; break; @@ -628,7 +666,7 @@ bool DwarfCUToModule::InlineHandler::EndAttributes() { void DwarfCUToModule::InlineHandler::Finish() { vector ranges; - if (low_pc_ && high_pc_) { + if (!has_range_data_) { if (high_pc_form_ != DW_FORM_addr && high_pc_form_ != DW_FORM_GNU_addr_index && high_pc_form_ != DW_FORM_addrx && @@ -665,11 +703,12 @@ void DwarfCUToModule::InlineHandler::Finish() { // Every DW_TAG_inlined_subroutine should have a DW_AT_abstract_origin. assert(specification_offset_ != 0); - cu_context_->file_context->module_->inline_origin_map.SetReference( - specification_offset_, specification_offset_); + Module::InlineOriginMap& inline_origin_map = + cu_context_->file_context->module_ + ->inline_origin_maps[cu_context_->file_context->filename_]; + inline_origin_map.SetReference(specification_offset_, specification_offset_); Module::InlineOrigin* origin = - cu_context_->file_context->module_->inline_origin_map - .GetOrCreateInlineOrigin(specification_offset_, name_); + inline_origin_map.GetOrCreateInlineOrigin(specification_offset_, name_); unique_ptr in( new Module::Inline(origin, ranges, call_site_line_, call_site_file_id_, inline_nest_level_, std::move(child_inlines_))); @@ -708,7 +747,9 @@ class DwarfCUToModule::FuncHandler: public GenericDIEHandler { ranges_form_(DW_FORM_sec_offset), ranges_data_(0), inline_(false), - handle_inline_(handle_inline) {} + handle_inline_(handle_inline), + has_qualified_name_(false), + has_range_data_(false) {} void ProcessAttributeUnsigned(enum DwarfAttribute attr, enum DwarfForm form, @@ -731,6 +772,8 @@ class DwarfCUToModule::FuncHandler: public GenericDIEHandler { bool inline_; vector> child_inlines_; bool handle_inline_; + bool has_qualified_name_; + bool has_range_data_; DIEContext child_context_; // A context for our children. }; @@ -750,6 +793,7 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned( high_pc_ = data; break; case DW_AT_ranges: + has_range_data_ = true; ranges_data_ = data; ranges_form_ = form; break; @@ -794,7 +838,7 @@ DIEHandler* DwarfCUToModule::FuncHandler::FindChildHandler( bool DwarfCUToModule::FuncHandler::EndAttributes() { // Compute our name, and record a specification, if appropriate. - name_ = ComputeQualifiedName(); + name_ = ComputeQualifiedName(&has_qualified_name_); if (name_.empty() && abstract_origin_) { name_ = abstract_origin_->name; } @@ -820,7 +864,7 @@ void DwarfCUToModule::FuncHandler::Finish() { iter->second->name = name_; } - if (!ranges_data_) { + if (!has_range_data_) { // Make high_pc_ an address, if it isn't already. if (high_pc_form_ != DW_FORM_addr && high_pc_form_ != DW_FORM_GNU_addr_index && @@ -867,6 +911,9 @@ void DwarfCUToModule::FuncHandler::Finish() { scoped_ptr func(new Module::Function(name, low_pc_)); func->ranges = ranges; func->parameter_size = 0; + // If the name was unqualified, prefer the Extern name if there's a mismatch + // (the Extern name will be fully-qualified in that case). + func->prefer_extern_name = !has_qualified_name_; if (func->address) { // If the function address is zero this is a sign that this function // description is just empty debug data and should just be discarded. @@ -893,15 +940,16 @@ void DwarfCUToModule::FuncHandler::Finish() { StringView name = name_.empty() ? name_omitted : name_; uint64_t offset = specification_offset_ != 0 ? specification_offset_ : offset_; - cu_context_->file_context->module_->inline_origin_map.SetReference(offset_, - offset); - cu_context_->file_context->module_->inline_origin_map - .GetOrCreateInlineOrigin(offset_, name); + Module::InlineOriginMap& inline_origin_map = + cu_context_->file_context->module_ + ->inline_origin_maps[cu_context_->file_context->filename_]; + inline_origin_map.SetReference(offset_, offset); + inline_origin_map.GetOrCreateInlineOrigin(offset_, name); } } bool DwarfCUToModule::NamedScopeHandler::EndAttributes() { - child_context_.name = ComputeQualifiedName(); + child_context_.name = ComputeQualifiedName(NULL); if (child_context_.name.empty() && no_specification) { cu_context_->reporter->UnknownSpecification(offset_, specification_offset_); } @@ -1031,12 +1079,21 @@ DwarfCUToModule::DwarfCUToModule(FileContext* file_context, LineToModuleHandler* line_reader, RangesHandler* ranges_handler, WarningReporter* reporter, - bool handle_inline) + bool handle_inline, + uint64_t low_pc, + uint64_t addr_base, + bool has_source_line_info, + uint64_t source_line_offset) : RootDIEHandler(handle_inline), line_reader_(line_reader), - cu_context_(new CUContext(file_context, reporter, ranges_handler)), + cu_context_(new CUContext(file_context, + reporter, + ranges_handler, + low_pc, + addr_base)), child_context_(new DIEContext()), - has_source_line_info_(false) {} + has_source_line_info_(has_source_line_info), + source_line_offset_(source_line_offset) {} DwarfCUToModule::~DwarfCUToModule() { } diff --git a/shared/sentry/external/breakpad/src/common/dwarf_cu_to_module.h b/shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module.h similarity index 96% rename from shared/sentry/external/breakpad/src/common/dwarf_cu_to_module.h rename to shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module.h index f44be8ced..1ff0ebc7f 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_cu_to_module.h +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module.h @@ -41,6 +41,7 @@ #include #include +#include #include "common/language.h" #include "common/module.h" @@ -82,6 +83,10 @@ class DwarfCUToModule: public RootDIEHandler { const uint8_t* contents, uint64_t length); + void AddManagedSectionToSectionMap(const string& name, + uint8_t* contents, + uint64_t length); + // Clear the section map for testing. void ClearSectionMapForTest(); @@ -114,6 +119,7 @@ class DwarfCUToModule: public RootDIEHandler { // Inter-compilation unit data used internally by the handlers. scoped_ptr file_private_; + std::vector uncompressed_sections_; }; // An abstract base class for handlers that handle DWARF range lists for @@ -258,7 +264,11 @@ class DwarfCUToModule: public RootDIEHandler { LineToModuleHandler* line_reader, RangesHandler* ranges_handler, WarningReporter* reporter, - bool handle_inline = false); + bool handle_inline = false, + uint64_t low_pc = 0, + uint64_t addr_base = 0, + bool has_source_line_info = false, + uint64_t source_line_offset = 0); ~DwarfCUToModule(); void ProcessAttributeSigned(enum DwarfAttribute attr, diff --git a/shared/sentry/external/breakpad/src/common/dwarf_cu_to_module_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf_cu_to_module_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module_unittest.cc index f3fa49032..134b2c243 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_cu_to_module_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_cu_to_module_unittest.cc @@ -30,6 +30,10 @@ // dwarf_cu_to_module.cc: Unit tests for google_breakpad::DwarfCUToModule. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include @@ -263,6 +267,10 @@ class CUFixtureBase { void TestFunction(int i, const string& name, Module::Address address, Module::Address size); + // Test that the I'th function (ordered by address) in the module + // this.module_ has the given prefer_extern_name. + void TestFunctionPreferExternName(int i, bool prefer_extern_name); + // Test that the number of source lines owned by the I'th function // in the module this.module_ is equal to EXPECTED. void TestLineCount(int i, size_t expected); @@ -611,6 +619,15 @@ void CUFixtureBase::TestFunction(int i, const string& name, EXPECT_EQ(0U, function->parameter_size); } +void CUFixtureBase::TestFunctionPreferExternName(int i, + bool prefer_extern_name) { + FillFunctions(); + ASSERT_LT((size_t)i, functions_.size()); + + Module::Function* function = functions_[i]; + EXPECT_EQ(prefer_extern_name, function->prefer_extern_name); +} + void CUFixtureBase::TestLineCount(int i, size_t expected) { FillFunctions(); ASSERT_LT((size_t) i, functions_.size()); diff --git a/shared/sentry/external/breakpad/src/common/dwarf_line_to_module.cc b/shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/dwarf_line_to_module.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module.cc index e716d483c..940ab2d69 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_line_to_module.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module.cc @@ -31,6 +31,10 @@ // dwarf_line_to_module.cc: Implementation of DwarfLineToModule class. // See dwarf_line_to_module.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/dwarf_line_to_module.h b/shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf_line_to_module.h rename to shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module.h diff --git a/shared/sentry/external/breakpad/src/common/dwarf_line_to_module_unittest.cc b/shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/dwarf_line_to_module_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module_unittest.cc index c4a02dfa2..9eb1469fa 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_line_to_module_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_line_to_module_unittest.cc @@ -30,6 +30,10 @@ // dwarf_line_to_module.cc: Unit tests for google_breakpad::DwarfLineToModule. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "breakpad_googletest_includes.h" diff --git a/shared/sentry/external/breakpad/src/common/dwarf_range_list_handler.cc b/shared/sentry/src/external/breakpad/src/common/dwarf_range_list_handler.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/dwarf_range_list_handler.cc rename to shared/sentry/src/external/breakpad/src/common/dwarf_range_list_handler.cc index 4d3dbd2eb..c40a5c3bc 100644 --- a/shared/sentry/external/breakpad/src/common/dwarf_range_list_handler.cc +++ b/shared/sentry/src/external/breakpad/src/common/dwarf_range_list_handler.cc @@ -32,6 +32,10 @@ // dwarf_range_list_handler.cc: Implementation of DwarfRangeListHandler class. // See dwarf_range_list_handler.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "common/dwarf_range_list_handler.h" diff --git a/shared/sentry/external/breakpad/src/common/dwarf_range_list_handler.h b/shared/sentry/src/external/breakpad/src/common/dwarf_range_list_handler.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/dwarf_range_list_handler.h rename to shared/sentry/src/external/breakpad/src/common/dwarf_range_list_handler.h diff --git a/shared/sentry/external/breakpad/src/common/language.cc b/shared/sentry/src/external/breakpad/src/common/language.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/language.cc rename to shared/sentry/src/external/breakpad/src/common/language.cc index 0096a8d1e..61693a8cd 100644 --- a/shared/sentry/external/breakpad/src/common/language.cc +++ b/shared/sentry/src/external/breakpad/src/common/language.cc @@ -31,6 +31,10 @@ // language.cc: Subclasses and singletons for google_breakpad::Language. // See language.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/language.h" #include diff --git a/shared/sentry/external/breakpad/src/common/language.h b/shared/sentry/src/external/breakpad/src/common/language.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/language.h rename to shared/sentry/src/external/breakpad/src/common/language.h diff --git a/shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext.S b/shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext.S similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext.S rename to shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext.S diff --git a/shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext.h b/shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext.h similarity index 97% rename from shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext.h rename to shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext.h index c553219f8..d64784d46 100644 --- a/shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext.h +++ b/shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext.h @@ -29,10 +29,6 @@ #ifndef GOOGLE_BREAKPAD_COMMON_LINUX_INCLUDE_UCONTEXT_H #define GOOGLE_BREAKPAD_COMMON_LINUX_INCLUDE_UCONTEXT_H -#ifdef HAVE_CONFIG_H -#include -#endif - #ifndef HAVE_GETCONTEXT #include diff --git a/shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext_unittest.cc index 573ddd88c..5b340eb74 100644 --- a/shared/sentry/external/breakpad/src/common/linux/breakpad_getcontext_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/breakpad_getcontext_unittest.cc @@ -29,6 +29,10 @@ // asm/sigcontext.h can't be included with signal.h on glibc or // musl, so only compare _libc_fpstate and _fpstate on Android. #if defined(__ANDROID__) && defined(__x86_64__) +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #endif diff --git a/shared/sentry/external/breakpad/src/common/linux/crc32.cc b/shared/sentry/src/external/breakpad/src/common/linux/crc32.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/linux/crc32.cc rename to shared/sentry/src/external/breakpad/src/common/linux/crc32.cc index c02f06c4f..cf386a24c 100644 --- a/shared/sentry/external/breakpad/src/common/linux/crc32.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/crc32.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/crc32.h" namespace google_breakpad { diff --git a/shared/sentry/external/breakpad/src/common/linux/crc32.h b/shared/sentry/src/external/breakpad/src/common/linux/crc32.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/crc32.h rename to shared/sentry/src/external/breakpad/src/common/linux/crc32.h diff --git a/shared/sentry/external/breakpad/src/common/linux/dump_symbols.cc b/shared/sentry/src/external/breakpad/src/common/linux/dump_symbols.cc similarity index 83% rename from shared/sentry/external/breakpad/src/common/linux/dump_symbols.cc rename to shared/sentry/src/external/breakpad/src/common/linux/dump_symbols.cc index 8ccbbbd10..b693fc9e1 100644 --- a/shared/sentry/external/breakpad/src/common/linux/dump_symbols.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/dump_symbols.cc @@ -31,6 +31,10 @@ // dump_symbols.cc: implement google_breakpad::WriteSymbolFile: // Find all the debugging info in a file and dump it as a Breakpad symbol file. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/dump_symbols.h" #include @@ -46,8 +50,11 @@ #include #include #include +#include +#ifdef HAVE_LIBZSTD +#include +#endif -#include #include #include #include @@ -104,6 +111,11 @@ using google_breakpad::wasteful_vector; #define EM_AARCH64 183 #endif +// Define ZStd compression if host machine does not include this define. +#ifndef ELFCOMPRESS_ZSTD +#define ELFCOMPRESS_ZSTD 2 +#endif + // // FDWrapper // @@ -281,6 +293,139 @@ class DumperLineToModule: public DwarfCUToModule::LineToModuleHandler { google_breakpad::ByteReader* byte_reader_; }; +template +bool IsCompressedHeader(const typename ElfClass::Shdr* section) { + return (section->sh_flags & SHF_COMPRESSED) != 0; +} + +template +uint32_t GetCompressionHeader( + typename ElfClass::Chdr& compression_header, + const uint8_t* content, uint64_t size) { + const typename ElfClass::Chdr* header = + reinterpret_cast(content); + + if (size < sizeof (*header)) { + return 0; + } + + compression_header = *header; + return sizeof (*header); +} + +std::pair UncompressZlibSectionContents( + const uint8_t* compressed_buffer, uint64_t compressed_size, uint64_t uncompressed_size) { + z_stream stream; + memset(&stream, 0, sizeof stream); + + stream.avail_in = compressed_size; + stream.avail_out = uncompressed_size; + stream.next_in = const_cast(compressed_buffer); + + google_breakpad::scoped_array uncompressed_buffer( + new uint8_t[uncompressed_size]); + + int status = inflateInit(&stream); + while (stream.avail_in != 0 && status == Z_OK) { + stream.next_out = + uncompressed_buffer.get() + uncompressed_size - stream.avail_out; + + if ((status = inflate(&stream, Z_FINISH)) != Z_STREAM_END) { + break; + } + + status = inflateReset(&stream); + } + + return inflateEnd(&stream) != Z_OK || status != Z_OK || stream.avail_out != 0 + ? std::make_pair(nullptr, 0) + : std::make_pair(uncompressed_buffer.release(), uncompressed_size); +} + +#ifdef HAVE_LIBZSTD +std::pair UncompressZstdSectionContents( + const uint8_t* compressed_buffer, uint64_t compressed_size,uint64_t uncompressed_size) { + + google_breakpad::scoped_array uncompressed_buffer(new uint8_t[uncompressed_size]); + size_t out_size = ZSTD_decompress(uncompressed_buffer.get(), uncompressed_size, + compressed_buffer, compressed_size); + if (ZSTD_isError(out_size)) { + return std::make_pair(nullptr, 0); + } + assert(out_size == uncompressed_size); + return std::make_pair(uncompressed_buffer.release(), uncompressed_size); +} +#endif + +std::pair UncompressSectionContents( + uint64_t compression_type, const uint8_t* compressed_buffer, + uint64_t compressed_size, uint64_t uncompressed_size) { + if (compression_type == ELFCOMPRESS_ZLIB) { + return UncompressZlibSectionContents(compressed_buffer, compressed_size, uncompressed_size); + } + +#ifdef HAVE_LIBZSTD + if (compression_type == ELFCOMPRESS_ZSTD) { + return UncompressZstdSectionContents(compressed_buffer, compressed_size, uncompressed_size); + } +#endif + + return std::make_pair(nullptr, 0); +} + +void StartProcessSplitDwarf(google_breakpad::CompilationUnit* reader, + Module* module, + google_breakpad::Endianness endianness, + bool handle_inter_cu_refs, + bool handle_inline) { + std::string split_file; + google_breakpad::SectionMap split_sections; + google_breakpad::ByteReader split_byte_reader(endianness); + uint64_t cu_offset = 0; + if (!reader->ProcessSplitDwarf(split_file, split_sections, split_byte_reader, + cu_offset)) + return; + DwarfCUToModule::FileContext file_context(split_file, module, + handle_inter_cu_refs); + for (auto section : split_sections) + file_context.AddSectionToSectionMap(section.first, section.second.first, + section.second.second); + // Because DWP/DWO file doesn't have .debug_addr/.debug_line/.debug_line_str, + // its debug info will refer to .debug_addr/.debug_line in the main binary. + if (file_context.section_map().find(".debug_addr") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_addr", reader->GetAddrBuffer(), + reader->GetAddrBufferLen()); + if (file_context.section_map().find(".debug_line") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line", reader->GetLineBuffer(), + reader->GetLineBufferLen()); + if (file_context.section_map().find(".debug_line_str") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line_str", + reader->GetLineStrBuffer(), + reader->GetLineStrBufferLen()); + + DumperRangesHandler ranges_handler(&split_byte_reader); + DumperLineToModule line_to_module(&split_byte_reader); + DwarfCUToModule::WarningReporter reporter(split_file, cu_offset); + DwarfCUToModule root_handler( + &file_context, &line_to_module, &ranges_handler, &reporter, handle_inline, + reader->GetLowPC(), reader->GetAddrBase(), reader->HasSourceLineInfo(), + reader->GetSourceLineOffset()); + google_breakpad::DIEDispatcher die_dispatcher(&root_handler); + google_breakpad::CompilationUnit split_reader( + split_file, file_context.section_map(), cu_offset, &split_byte_reader, + &die_dispatcher); + split_reader.SetSplitDwarf(reader->GetAddrBase(), reader->GetDWOID()); + split_reader.Start(); + // Normally, it won't happen unless we have transitive reference. + if (split_reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&split_reader, module, endianness, + handle_inter_cu_refs, handle_inline); + } +} + template bool LoadDwarf(const string& dwarf_filename, const typename ElfClass::Ehdr* elf_header, @@ -311,7 +456,31 @@ bool LoadDwarf(const string& dwarf_filename, section->sh_name; const uint8_t* contents = GetOffset(elf_header, section->sh_offset); - file_context.AddSectionToSectionMap(name, contents, section->sh_size); + uint64_t size = section->sh_size; + + if (!IsCompressedHeader(section)) { + file_context.AddSectionToSectionMap(name, contents, size); + continue; + } + + typename ElfClass::Chdr chdr; + + uint32_t compression_header_size = + GetCompressionHeader(chdr, contents, size); + + if (compression_header_size == 0 || chdr.ch_size == 0) { + continue; + } + + contents += compression_header_size; + size -= compression_header_size; + + std::pair uncompressed = + UncompressSectionContents(chdr.ch_type, contents, size, chdr.ch_size); + + if (uncompressed.first != nullptr && uncompressed.second != 0) { + file_context.AddManagedSectionToSectionMap(name, uncompressed.first, uncompressed.second); + } } // .debug_ranges and .debug_rnglists reader @@ -344,6 +513,11 @@ bool LoadDwarf(const string& dwarf_filename, &die_dispatcher); // Process the entire compilation unit; get the offset of the next. offset += reader.Start(); + // Start to process split dwarf file. + if (reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&reader, module, endianness, handle_inter_cu_refs, + handle_inline); + } } return true; } @@ -372,6 +546,9 @@ bool DwarfCFIRegisterNames(const typename ElfClass::Ehdr* elf_header, case EM_X86_64: *register_names = DwarfCFIToModule::RegisterNames::X86_64(); return true; + case EM_RISCV: + *register_names = DwarfCFIToModule::RegisterNames::RISCV(); + return true; default: return false; } @@ -422,9 +599,42 @@ bool LoadDwarfCFI(const string& dwarf_filename, google_breakpad::CallFrameInfo::Reporter dwarf_reporter(dwarf_filename, section_name); - google_breakpad::CallFrameInfo parser(cfi, cfi_size, - &byte_reader, &handler, &dwarf_reporter, - eh_frame); + if (!IsCompressedHeader(section)) { + google_breakpad::CallFrameInfo parser(cfi, cfi_size, + &byte_reader, &handler, + &dwarf_reporter, eh_frame); + parser.Start(); + return true; + } + + typename ElfClass::Chdr chdr; + uint32_t compression_header_size = + GetCompressionHeader(chdr, cfi, cfi_size); + + if (compression_header_size == 0 || chdr.ch_size == 0) { + fprintf(stderr, "%s: decompression failed at header\n", + dwarf_filename.c_str()); + return false; + } + if (compression_header_size > cfi_size) { + fprintf(stderr, "%s: decompression error, compression_header too large\n", + dwarf_filename.c_str()); + return false; + } + + cfi += compression_header_size; + cfi_size -= compression_header_size; + + std::pair uncompressed = + UncompressSectionContents(chdr.ch_type, cfi, cfi_size, chdr.ch_size); + + if (uncompressed.first == nullptr || uncompressed.second == 0) { + fprintf(stderr, "%s: decompression failed\n", dwarf_filename.c_str()); + return false; + } + google_breakpad::CallFrameInfo parser(uncompressed.first, uncompressed.second, + &byte_reader, &handler, &dwarf_reporter, + eh_frame); parser.Start(); return true; } @@ -912,6 +1122,7 @@ const char* ElfArchitecture(const typename ElfClass::Ehdr* elf_header) { case EM_SPARC: return "sparc"; case EM_SPARCV9: return "sparcv9"; case EM_X86_64: return "x86_64"; + case EM_RISCV: return "riscv"; default: return NULL; } } @@ -951,7 +1162,8 @@ template bool InitModuleForElfClass(const typename ElfClass::Ehdr* elf_header, const string& obj_filename, const string& obj_os, - scoped_ptr& module) { + scoped_ptr& module, + bool enable_multiple_field) { PageAllocator allocator; wasteful_vector identifier(&allocator, kDefaultBuildIdSize); if (!FileID::ElfFileIdentifierFromMappedFile(elf_header, identifier)) { @@ -980,7 +1192,8 @@ bool InitModuleForElfClass(const typename ElfClass::Ehdr* elf_header, // This is just the raw Build ID in hex. string code_id = FileID::ConvertIdentifierToString(identifier); - module.reset(new Module(name, obj_os, architecture, id, code_id)); + module.reset(new Module(name, obj_os, architecture, id, code_id, + enable_multiple_field)); return true; } @@ -997,8 +1210,8 @@ bool ReadSymbolDataElfClass(const typename ElfClass::Ehdr* elf_header, *out_module = NULL; scoped_ptr module; - if (!InitModuleForElfClass(elf_header, obj_filename, obj_os, - module)) { + if (!InitModuleForElfClass(elf_header, obj_filename, obj_os, module, + options.enable_multiple_field)) { return false; } @@ -1110,14 +1323,14 @@ bool WriteSymbolFileHeader(const string& load_path, if (elfclass == ELFCLASS32) { if (!InitModuleForElfClass( reinterpret_cast(elf_header), obj_file, obj_os, - module)) { + module, /*enable_multiple_field=*/false)) { fprintf(stderr, "Failed to load ELF module: %s\n", obj_file.c_str()); return false; } } else if (elfclass == ELFCLASS64) { if (!InitModuleForElfClass( reinterpret_cast(elf_header), obj_file, obj_os, - module)) { + module, /*enable_multiple_field=*/false)) { fprintf(stderr, "Failed to load ELF module: %s\n", obj_file.c_str()); return false; } diff --git a/shared/sentry/external/breakpad/src/common/linux/dump_symbols.h b/shared/sentry/src/external/breakpad/src/common/linux/dump_symbols.h similarity index 93% rename from shared/sentry/external/breakpad/src/common/linux/dump_symbols.h rename to shared/sentry/src/external/breakpad/src/common/linux/dump_symbols.h index 8ac169c9f..f1802ecc3 100644 --- a/shared/sentry/external/breakpad/src/common/linux/dump_symbols.h +++ b/shared/sentry/src/external/breakpad/src/common/linux/dump_symbols.h @@ -46,13 +46,16 @@ namespace google_breakpad { class Module; struct DumpOptions { - DumpOptions(SymbolData symbol_data, bool handle_inter_cu_refs) + DumpOptions(SymbolData symbol_data, + bool handle_inter_cu_refs, + bool enable_multiple_field) : symbol_data(symbol_data), - handle_inter_cu_refs(handle_inter_cu_refs) { - } + handle_inter_cu_refs(handle_inter_cu_refs), + enable_multiple_field(enable_multiple_field) {} SymbolData symbol_data; bool handle_inter_cu_refs; + bool enable_multiple_field; }; // Find all the debugging information in OBJ_FILE, an ELF executable diff --git a/shared/sentry/external/breakpad/src/common/linux/dump_symbols_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/dump_symbols_unittest.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/linux/dump_symbols_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/dump_symbols_unittest.cc index 4167ccc59..55dcdeed8 100644 --- a/shared/sentry/external/breakpad/src/common/linux/dump_symbols_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/dump_symbols_unittest.cc @@ -31,6 +31,10 @@ // dump_symbols_unittest.cc: // Unittests for google_breakpad::DumpSymbols +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include @@ -91,7 +95,7 @@ TYPED_TEST(DumpSymbols, Invalid) { Elf32_Ehdr header; memset(&header, 0, sizeof(header)); Module* module; - DumpOptions options(ALL_SYMBOL_DATA, true); + DumpOptions options(ALL_SYMBOL_DATA, true, false); EXPECT_FALSE(ReadSymbolDataInternal(reinterpret_cast(&header), "foo", "Linux", @@ -128,7 +132,7 @@ TYPED_TEST(DumpSymbols, SimplePublic) { this->GetElfContents(elf); Module* module; - DumpOptions options(ALL_SYMBOL_DATA, true); + DumpOptions options(ALL_SYMBOL_DATA, true, false); EXPECT_TRUE(ReadSymbolDataInternal(this->elfdata, "foo", "Linux", @@ -185,7 +189,7 @@ TYPED_TEST(DumpSymbols, SimpleBuildID) { this->GetElfContents(elf); Module* module; - DumpOptions options(ALL_SYMBOL_DATA, true); + DumpOptions options(ALL_SYMBOL_DATA, true, false); EXPECT_TRUE(ReadSymbolDataInternal(this->elfdata, "foo", "Linux", diff --git a/shared/sentry/external/breakpad/src/common/linux/eintr_wrapper.h b/shared/sentry/src/external/breakpad/src/common/linux/eintr_wrapper.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/eintr_wrapper.h rename to shared/sentry/src/external/breakpad/src/common/linux/eintr_wrapper.h diff --git a/shared/sentry/external/breakpad/src/common/linux/elf_core_dump.cc b/shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/linux/elf_core_dump.cc rename to shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump.cc index f5ee30337..67257fd27 100644 --- a/shared/sentry/external/breakpad/src/common/linux/elf_core_dump.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump.cc @@ -29,6 +29,10 @@ // elf_core_dump.cc: Implement google_breakpad::ElfCoreDump. // See elf_core_dump.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/elf_core_dump.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/elf_core_dump.h b/shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/elf_core_dump.h rename to shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump.h diff --git a/shared/sentry/external/breakpad/src/common/linux/elf_core_dump_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/elf_core_dump_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump_unittest.cc index 6789dd84c..25cab99f8 100644 --- a/shared/sentry/external/breakpad/src/common/linux/elf_core_dump_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/elf_core_dump_unittest.cc @@ -28,6 +28,10 @@ // elf_core_dump_unittest.cc: Unit tests for google_breakpad::ElfCoreDump. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/linux/elf_gnu_compat.h b/shared/sentry/src/external/breakpad/src/common/linux/elf_gnu_compat.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/elf_gnu_compat.h rename to shared/sentry/src/external/breakpad/src/common/linux/elf_gnu_compat.h diff --git a/shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module.cc b/shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module.cc similarity index 96% rename from shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module.cc rename to shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module.cc index 4aee38d6a..70d50f891 100644 --- a/shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module.cc @@ -30,12 +30,19 @@ // Original author: Ted Mielczarek +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/elf_symbols_to_module.h" #include #include #include +#include +#include + #include "common/byte_cursor.h" #include "common/module.h" @@ -156,7 +163,7 @@ bool ELFSymbolsToModule(const uint8_t* symtab_section, while(!iterator->at_end) { if (ELF32_ST_TYPE(iterator->info) == STT_FUNC && iterator->shndx != SHN_UNDEF) { - Module::Extern* ext = new Module::Extern(iterator->value); + auto ext = std::make_unique(iterator->value); ext->name = SymbolString(iterator->name_offset, strings); #if !defined(__ANDROID__) // Android NDK doesn't provide abi::__cxa_demangle. int status = 0; @@ -168,7 +175,7 @@ bool ELFSymbolsToModule(const uint8_t* symtab_section, free(demangled); } #endif - module->AddExtern(ext); + module->AddExtern(std::move(ext)); } ++iterator; } diff --git a/shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module.h b/shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module.h rename to shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module.h diff --git a/shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module_unittest.cc index 17eb670ff..a74b29f0f 100644 --- a/shared/sentry/external/breakpad/src/common/linux/elf_symbols_to_module_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/elf_symbols_to_module_unittest.cc @@ -31,6 +31,10 @@ // elf_symbols_to_module_unittest.cc: // Unittests for google_breakpad::ELFSymbolsToModule +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/linux/elfutils-inl.h b/shared/sentry/src/external/breakpad/src/common/linux/elfutils-inl.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/elfutils-inl.h rename to shared/sentry/src/external/breakpad/src/common/linux/elfutils-inl.h diff --git a/shared/sentry/external/breakpad/src/common/linux/elfutils.cc b/shared/sentry/src/external/breakpad/src/common/linux/elfutils.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/elfutils.cc rename to shared/sentry/src/external/breakpad/src/common/linux/elfutils.cc index a68cc0af3..95b5db829 100644 --- a/shared/sentry/external/breakpad/src/common/linux/elfutils.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/elfutils.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/elfutils.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/elfutils.h b/shared/sentry/src/external/breakpad/src/common/linux/elfutils.h similarity index 83% rename from shared/sentry/external/breakpad/src/common/linux/elfutils.h rename to shared/sentry/src/external/breakpad/src/common/linux/elfutils.h index d44d4762c..130a8ac13 100644 --- a/shared/sentry/external/breakpad/src/common/linux/elfutils.h +++ b/shared/sentry/src/external/breakpad/src/common/linux/elfutils.h @@ -40,6 +40,39 @@ namespace google_breakpad { +typedef struct Elf32_Chdr { + typedef Elf32_Word Type; + typedef Elf32_Word Size; + typedef Elf32_Addr Addr; + + static_assert(sizeof (Type) == 4); + static_assert(sizeof (Size) == 4); + static_assert(sizeof (Addr) == 4); + + Type ch_type; // Compression type + Size ch_size; // Uncompressed data size in bytes + Addr ch_addralign; // Uncompressed data alignment +} Elf32_Chdr; + +static_assert(sizeof (Elf32_Chdr) == 12); + +typedef struct Elf64_Chdr { + typedef Elf64_Word Type; + typedef Elf64_Xword Size; + typedef Elf64_Addr Addr; + + static_assert(sizeof (Type) == 4); + static_assert(sizeof (Size) == 8); + static_assert(sizeof (Addr) == 8); + + Type ch_type; // Compression type + Type ch_reserved; // Padding + Size ch_size; // Uncompressed data size in bytes + Addr ch_addralign; // Uncompressed data alignment +} Elf64_Chdr; + +static_assert(sizeof (Elf64_Chdr) == 24); + // Traits classes so consumers can write templatized code to deal // with specific ELF bits. struct ElfClass32 { @@ -49,6 +82,7 @@ struct ElfClass32 { typedef Elf32_Nhdr Nhdr; typedef Elf32_Phdr Phdr; typedef Elf32_Shdr Shdr; + typedef Elf32_Chdr Chdr; typedef Elf32_Half Half; typedef Elf32_Off Off; typedef Elf32_Sym Sym; @@ -67,6 +101,7 @@ struct ElfClass64 { typedef Elf64_Nhdr Nhdr; typedef Elf64_Phdr Phdr; typedef Elf64_Shdr Shdr; + typedef Elf64_Chdr Chdr; typedef Elf64_Half Half; typedef Elf64_Off Off; typedef Elf64_Sym Sym; diff --git a/shared/sentry/external/breakpad/src/common/linux/file_id.cc b/shared/sentry/src/external/breakpad/src/common/linux/file_id.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/file_id.cc rename to shared/sentry/src/external/breakpad/src/common/linux/file_id.cc index 0bd2a759e..d8fcbd8d6 100644 --- a/shared/sentry/external/breakpad/src/common/linux/file_id.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/file_id.cc @@ -31,6 +31,10 @@ // See file_id.h for documentation // +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/file_id.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/file_id.h b/shared/sentry/src/external/breakpad/src/common/linux/file_id.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/file_id.h rename to shared/sentry/src/external/breakpad/src/common/linux/file_id.h diff --git a/shared/sentry/external/breakpad/src/common/linux/file_id_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/file_id_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/file_id_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/file_id_unittest.cc index 74bf9e1b5..0ef453532 100644 --- a/shared/sentry/external/breakpad/src/common/linux/file_id_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/file_id_unittest.cc @@ -28,6 +28,10 @@ // Unit tests for FileID +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader.cc b/shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader.cc rename to shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader.cc index 6242e6d23..8c5e04925 100644 --- a/shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader.cc @@ -27,6 +27,10 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/google_crashdump_uploader.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader.h b/shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader.h rename to shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader.h diff --git a/shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader_test.cc b/shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader_test.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader_test.cc rename to shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader_test.cc index 39aab65d0..e81f21d64 100644 --- a/shared/sentry/external/breakpad/src/common/linux/google_crashdump_uploader_test.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/google_crashdump_uploader_test.cc @@ -28,6 +28,10 @@ // Unit test for crash dump uploader. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "common/linux/google_crashdump_uploader.h" diff --git a/shared/sentry/external/breakpad/src/common/linux/guid_creator.cc b/shared/sentry/src/external/breakpad/src/common/linux/guid_creator.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/guid_creator.cc rename to shared/sentry/src/external/breakpad/src/common/linux/guid_creator.cc index 31a326c71..8635f9dc0 100644 --- a/shared/sentry/external/breakpad/src/common/linux/guid_creator.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/guid_creator.cc @@ -27,7 +27,7 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef HAVE_CONFIG_H -#include +#include // Must come first #endif #include "common/linux/eintr_wrapper.h" diff --git a/shared/sentry/external/breakpad/src/common/linux/guid_creator.h b/shared/sentry/src/external/breakpad/src/common/linux/guid_creator.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/guid_creator.h rename to shared/sentry/src/external/breakpad/src/common/linux/guid_creator.h diff --git a/shared/sentry/external/breakpad/src/common/linux/http_upload.cc b/shared/sentry/src/external/breakpad/src/common/linux/http_upload.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/http_upload.cc rename to shared/sentry/src/external/breakpad/src/common/linux/http_upload.cc index 1b576ea60..0a5bdb502 100644 --- a/shared/sentry/external/breakpad/src/common/linux/http_upload.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/http_upload.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/http_upload.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/http_upload.h b/shared/sentry/src/external/breakpad/src/common/linux/http_upload.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/http_upload.h rename to shared/sentry/src/external/breakpad/src/common/linux/http_upload.h diff --git a/shared/sentry/external/breakpad/src/common/linux/ignore_ret.h b/shared/sentry/src/external/breakpad/src/common/linux/ignore_ret.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/ignore_ret.h rename to shared/sentry/src/external/breakpad/src/common/linux/ignore_ret.h diff --git a/shared/sentry/external/breakpad/src/common/linux/libcurl_wrapper.cc b/shared/sentry/src/external/breakpad/src/common/linux/libcurl_wrapper.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/linux/libcurl_wrapper.cc rename to shared/sentry/src/external/breakpad/src/common/linux/libcurl_wrapper.cc index 096681614..2b6390981 100644 --- a/shared/sentry/external/breakpad/src/common/linux/libcurl_wrapper.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/libcurl_wrapper.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include @@ -47,6 +51,7 @@ LibcurlWrapper::LibcurlWrapper() LibcurlWrapper::~LibcurlWrapper() { if (init_ok_) { (*easy_cleanup_)(curl_); + (*global_cleanup_)(); dlclose(curl_lib_); } } @@ -262,6 +267,10 @@ bool LibcurlWrapper::SetFunctionPointers() { SET_AND_CHECK_FUNCTION_POINTER(formfree_, "curl_formfree", void(*)(curl_httppost*)); + + SET_AND_CHECK_FUNCTION_POINTER(global_cleanup_, + "curl_global_cleanup", + void(*)(void)); return true; } @@ -298,12 +307,10 @@ bool LibcurlWrapper::SendRequestInner(const string& url, (*easy_getinfo_)(curl_, CURLINFO_RESPONSE_CODE, http_status_code); } -#ifndef NDEBUG if (err_code != CURLE_OK) fprintf(stderr, "Failed to send http request to %s, error: %s\n", url.c_str(), (*easy_strerror_)(err_code)); -#endif Reset(); diff --git a/shared/sentry/external/breakpad/src/common/linux/libcurl_wrapper.h b/shared/sentry/src/external/breakpad/src/common/linux/libcurl_wrapper.h similarity index 96% rename from shared/sentry/external/breakpad/src/common/linux/libcurl_wrapper.h rename to shared/sentry/src/external/breakpad/src/common/linux/libcurl_wrapper.h index f4a4dca40..f8f961c1b 100644 --- a/shared/sentry/external/breakpad/src/common/linux/libcurl_wrapper.h +++ b/shared/sentry/src/external/breakpad/src/common/linux/libcurl_wrapper.h @@ -39,6 +39,9 @@ #include "third_party/curl/curl.h" namespace google_breakpad { + +// This class is only safe to be used on single-threaded code because of its +// usage of libcurl's curl_global_cleanup(). class LibcurlWrapper { public: LibcurlWrapper(); @@ -111,6 +114,7 @@ class LibcurlWrapper { CURLcode (*easy_getinfo_)(CURL*, CURLINFO info, ...); void (*easy_reset_)(CURL*); void (*formfree_)(struct curl_httppost*); + void (*global_cleanup_)(void); }; } diff --git a/shared/sentry/external/breakpad/src/common/linux/linux_libc_support.cc b/shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/linux/linux_libc_support.cc rename to shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support.cc index 10cbeaef1..abcbfde8a 100644 --- a/shared/sentry/external/breakpad/src/common/linux/linux_libc_support.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support.cc @@ -30,6 +30,10 @@ // we call the libc functions directly we risk crashing in the dynamic linker // as it tries to resolve uncached PLT entries. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/linux_libc_support.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/linux_libc_support.h b/shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/linux_libc_support.h rename to shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support.h diff --git a/shared/sentry/external/breakpad/src/common/linux/linux_libc_support_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support_unittest.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/linux/linux_libc_support_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support_unittest.cc index 449f995fc..30dd1430c 100644 --- a/shared/sentry/external/breakpad/src/common/linux/linux_libc_support_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/linux_libc_support_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "breakpad_googletest_includes.h" #include "common/linux/linux_libc_support.h" diff --git a/shared/sentry/external/breakpad/src/common/linux/memory_mapped_file.cc b/shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file.cc similarity index 89% rename from shared/sentry/external/breakpad/src/common/linux/memory_mapped_file.cc rename to shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file.cc index 7e4446070..a7b96eb59 100644 --- a/shared/sentry/external/breakpad/src/common/linux/memory_mapped_file.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file.cc @@ -29,6 +29,10 @@ // memory_mapped_file.cc: Implement google_breakpad::MemoryMappedFile. // See memory_mapped_file.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/memory_mapped_file.h" #include @@ -57,8 +61,11 @@ MemoryMappedFile::~MemoryMappedFile() { bool MemoryMappedFile::Map(const char* path, size_t offset) { Unmap(); - - int fd = sys_open(path, O_RDONLY, 0); + // Based on https://pubs.opengroup.org/onlinepubs/7908799/xsh/open.html + // If O_NONBLOCK is set: The open() function will return without blocking + // for the device to be ready or available. Setting this value will provent + // hanging if file is not avilable. + int fd = sys_open(path, O_RDONLY | O_NONBLOCK, 0); if (fd == -1) { return false; } diff --git a/shared/sentry/external/breakpad/src/common/linux/memory_mapped_file.h b/shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file.h similarity index 97% rename from shared/sentry/external/breakpad/src/common/linux/memory_mapped_file.h rename to shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file.h index d4a85051e..462e116eb 100644 --- a/shared/sentry/external/breakpad/src/common/linux/memory_mapped_file.h +++ b/shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file.h @@ -33,7 +33,7 @@ #define COMMON_LINUX_MEMORY_MAPPED_FILE_H_ #include -#include "common/basictypes.h" + #include "common/memory_range.h" namespace google_breakpad { @@ -49,6 +49,9 @@ class MemoryMappedFile { // If Map() fails, the object behaves as if it is default constructed. MemoryMappedFile(const char* path, size_t offset); + MemoryMappedFile(const MemoryMappedFile&) = delete; + void operator=(const MemoryMappedFile&) = delete; + ~MemoryMappedFile(); // Maps a file at |path| into memory, which can then be accessed via @@ -77,8 +80,6 @@ class MemoryMappedFile { private: // Mapped file content as a MemoryRange object. MemoryRange content_; - - DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile); }; } // namespace google_breakpad diff --git a/shared/sentry/external/breakpad/src/common/linux/memory_mapped_file_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/memory_mapped_file_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file_unittest.cc index 5ed677df8..b7a61a70e 100644 --- a/shared/sentry/external/breakpad/src/common/linux/memory_mapped_file_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/memory_mapped_file_unittest.cc @@ -29,6 +29,10 @@ // memory_mapped_file_unittest.cc: // Unit tests for google_breakpad::MemoryMappedFile. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/linux/safe_readlink.cc b/shared/sentry/src/external/breakpad/src/common/linux/safe_readlink.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/linux/safe_readlink.cc rename to shared/sentry/src/external/breakpad/src/common/linux/safe_readlink.cc index 97ea62c03..a42b01a5f 100644 --- a/shared/sentry/external/breakpad/src/common/linux/safe_readlink.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/safe_readlink.cc @@ -29,6 +29,10 @@ // safe_readlink.cc: Implement google_breakpad::SafeReadLink. // See safe_readlink.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "third_party/lss/linux_syscall_support.h" diff --git a/shared/sentry/external/breakpad/src/common/linux/safe_readlink.h b/shared/sentry/src/external/breakpad/src/common/linux/safe_readlink.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/safe_readlink.h rename to shared/sentry/src/external/breakpad/src/common/linux/safe_readlink.h diff --git a/shared/sentry/external/breakpad/src/common/linux/safe_readlink_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/safe_readlink_unittest.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/linux/safe_readlink_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/safe_readlink_unittest.cc index 6f5f9d753..8fa6d0656 100644 --- a/shared/sentry/external/breakpad/src/common/linux/safe_readlink_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/safe_readlink_unittest.cc @@ -28,6 +28,10 @@ // safe_readlink_unittest.cc: Unit tests for google_breakpad::SafeReadLink. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "breakpad_googletest_includes.h" #include "common/linux/safe_readlink.h" diff --git a/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.cc b/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.cc new file mode 100644 index 000000000..8de04ce95 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.cc @@ -0,0 +1,132 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_pipe.h" + +#include + +#include "common/linux/eintr_wrapper.h" + +namespace google_breakpad { + +ScopedPipe::ScopedPipe() { + fds_[0] = -1; + fds_[1] = -1; +} + +ScopedPipe::~ScopedPipe() { + CloseReadFd(); + CloseWriteFd(); +} + +bool ScopedPipe::Init() { + return pipe(fds_) == 0; +} + +void ScopedPipe::CloseReadFd() { + if (fds_[0] != -1) { + close(fds_[0]); + fds_[0] = -1; + } +} + +void ScopedPipe::CloseWriteFd() { + if (fds_[1] != -1) { + close(fds_[1]); + fds_[1] = -1; + } +} + +bool ScopedPipe::ReadLine(std::string& line) { + // Simple buffered file read. `read_buffer_` stores previously read bytes, and + // we either return a line from this buffer, or we append blocks of read bytes + // to the buffer until we have a complete line. + size_t eol_index = read_buffer_.find('\n'); + + // While we don't have a full line, and read pipe is valid. + while (eol_index == std::string::npos && GetReadFd() != -1) { + // Read a block of 128 bytes from the read pipe. + char read_buf[128]; + ssize_t read_len = HANDLE_EINTR( + read(GetReadFd(), read_buf, sizeof(read_buf))); + if (read_len <= 0) { + // Pipe error, or pipe has been closed. + CloseReadFd(); + break; + } + + // Append the block, and check if we have a full line now. + read_buffer_.append(read_buf, read_len); + eol_index = read_buffer_.find('\n'); + } + + if (eol_index != std::string::npos) { + // We have a full line to output. + line = read_buffer_.substr(0, eol_index); + if (eol_index < read_buffer_.size()) { + read_buffer_ = read_buffer_.substr(eol_index + 1); + } else { + read_buffer_ = ""; + } + + return true; + } + + if (read_buffer_.size()) { + // We don't have a full line to output, but we can only reach here if the + // pipe has closed and there are some bytes left at the end, so we should + // return those bytes. + line = std::move(read_buffer_); + read_buffer_ = ""; + + return true; + } + + // We don't have any buffered data left, and the pipe has closed. + return false; +} + +int ScopedPipe::Dup2WriteFd(int new_fd) const { + return dup2(fds_[1], new_fd); +} + +bool ScopedPipe::WriteForTesting(const void* bytes, size_t bytes_len) { + ssize_t r = HANDLE_EINTR(write(GetWriteFd(), bytes, bytes_len)); + if (r != static_cast(bytes_len)) { + CloseWriteFd(); + return false; + } + + return true; +} + +} // namespace google_breakpad diff --git a/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.h b/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.h new file mode 100644 index 000000000..25394c2ab --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe.h @@ -0,0 +1,115 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_SCOPED_PIPE_H_ +#define COMMON_LINUX_SCOPED_PIPE_H_ + +#include +#include + +namespace google_breakpad { + +// Small RAII wrapper for a pipe pair. +// +// Example (both ends of pipe in same process): +// ScopedPipe tmp; +// std::string line; +// if (tmp.Init() && tmp.Write(bytes, bytes_len)) { +// tmp.CloseWriteFd(); +// while (tmp.ReadLine(&line)) { +// std::cerr << line << std::endl; +// } +// } +// +// Example (reading output from a child process): +// ScopedPipe tmp; +// if (fork()) { +// // Parent process, read from the read end of the pipe. +// std::string line; +// while (tmp.ReadLine(line)) { +// // Process output... +// } +// // Close read pipe once done processing the output that we wanted, this +// // should ensure that the child process exits even if we didn't read all +// // of the output. +// tmp.CloseReadFd(); +// // Parent process should handle waiting for child to exit here... +// } else { +// // Child process, close the read fd and dup the write fd before exec'ing. +// tmp.CloseReadFd(); +// tmp.Dup2WriteFd(STDOUT_FILENO); +// tmp.Dup2WriteFd(STDERR_FILENO); +// execl("some-command", "some-arguments"); +// } +class ScopedPipe { + public: + ScopedPipe(); + ~ScopedPipe(); + + // Creates the pipe pair - returns false on error. + bool Init(); + + // Close the read pipe. This only needs to be used when the read pipe needs to + // be closed earlier. + void CloseReadFd(); + + // Close the write pipe. This only needs to be used when the write pipe needs + // to be closed earlier. + void CloseWriteFd(); + + // Reads characters until newline or end of pipe. On read failure this will + // close the read pipe, but continue to return true and read buffered lines + // until the internal buffering is exhausted. This will block if there is no + // data available on the read pipe. + bool ReadLine(std::string& line); + + // Writes bytes to the write end of the pipe, returns false and closes write + // pipe on failure. + bool WriteForTesting(const void* bytes, size_t bytes_len); + + // Calls the dup2 system call to replace any existing open file descriptor + // with number new_fd with a copy of the current write end file descriptor + // for the pipe. + int Dup2WriteFd(int new_fd) const; + + private: + int GetReadFd() const { + return fds_[0]; + } + + int GetWriteFd() const { + return fds_[1]; + } + + int fds_[2]; + std::string read_buffer_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_SCOPED_PIPE_H_ diff --git a/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe_unittest.cc new file mode 100644 index 000000000..4daa5c255 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/common/linux/scoped_pipe_unittest.cc @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// scoped_pipe_unittest.cc: Unit tests for google_breakpad::ScopedPipe. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_pipe.h" + +#include "breakpad_googletest_includes.h" + +namespace google_breakpad { + +TEST(ScopedPipeTest, WriteAndClose) { + const char kTestData[] = "One\nTwo\nThree"; + ScopedPipe pipe; + std::string line; + + ASSERT_TRUE(pipe.Init()); + ASSERT_TRUE(pipe.WriteForTesting(kTestData, strlen(kTestData))); + pipe.CloseWriteFd(); + + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "One"); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "Two"); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "Three"); + ASSERT_FALSE(pipe.ReadLine(line)); +} + +TEST(ScopedPipeTest, MultipleWrites) { + const char kTestDataOne[] = "One\n"; + const char kTestDataTwo[] = "Two\n"; + ScopedPipe pipe; + std::string line; + + ASSERT_TRUE(pipe.Init()); + ASSERT_TRUE(pipe.WriteForTesting(kTestDataOne, strlen(kTestDataOne))); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "One"); + + ASSERT_TRUE(pipe.WriteForTesting(kTestDataTwo, strlen(kTestDataTwo))); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "Two"); +} + +} // namespace google_breakpad diff --git a/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.cc b/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.cc new file mode 100644 index 000000000..2395a64e8 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.cc @@ -0,0 +1,103 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utility class for creating a temporary file that is deleted in the +// destructor. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_tmpfile.h" + +#include +#include +#include +#include +#include + +#include "common/linux/eintr_wrapper.h" + +#if !defined(__ANDROID__) +#define TEMPDIR "/tmp" +#else +#define TEMPDIR "/data/local/tmp" +#endif + +namespace google_breakpad { + +ScopedTmpFile::ScopedTmpFile() = default; + +ScopedTmpFile::~ScopedTmpFile() { + if (fd_ >= 0) { + close(fd_); + fd_ = -1; + } +} + +bool ScopedTmpFile::InitEmpty() { + // Prevent calling Init when fd_ is already valid, leaking the file. + if (fd_ != -1) { + return false; + } + + // Respect the TMPDIR environment variable. + const char* tempdir = getenv("TMPDIR"); + if (!tempdir) { + tempdir = TEMPDIR; + } + + // Create a temporary file that is not linked in to the filesystem, and that + // is only accessible by the current user. + fd_ = open(tempdir, O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); + + return fd_ >= 0; +} + +bool ScopedTmpFile::InitString(const char* text) { + return InitData(text, strlen(text)); +} + +bool ScopedTmpFile::InitData(const void* data, size_t data_len) { + if (!InitEmpty()) { + return false; + } + + return SetContents(data, data_len); +} + +bool ScopedTmpFile::SetContents(const void* data, size_t data_len) { + ssize_t r = HANDLE_EINTR(write(fd_, data, data_len)); + if (r != static_cast(data_len)) { + return false; + } + + return 0 == lseek(fd_, 0, SEEK_SET); +} + +} // namespace google_breakpad diff --git a/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.h b/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.h new file mode 100644 index 000000000..dffec182f --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile.h @@ -0,0 +1,85 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utility class for creating a temporary file for that is deleted in the +// destructor. + +#ifndef COMMON_LINUX_SCOPED_TMPFILE_H_ +#define COMMON_LINUX_SCOPED_TMPFILE_H_ + +#include + +namespace google_breakpad { + +// Small RAII wrapper for temporary files. +// +// Example: +// ScopedTmpFile tmp; +// if (tmp.Init("Some file contents")) { +// ... +// } +class ScopedTmpFile { + public: + // Initialize the ScopedTmpFile object - this does not create the temporary + // file until Init is called. + ScopedTmpFile(); + + // Destroy temporary file on scope exit. + ~ScopedTmpFile(); + + // Creates the empty temporary file - returns true iff the temporary file was + // created successfully. Should always be checked before using the file. + bool InitEmpty(); + + // Creates the temporary file with the provided C string. The terminating null + // is not written. Returns true iff the temporary file was created + // successfully and the contents were written successfully. + bool InitString(const char* text); + + // Creates the temporary file with the provided data. Returns true iff the + // temporary file was created successfully and the contents were written + // successfully. + bool InitData(const void* data, size_t data_len); + + // Returns the Posix file descriptor for the test file, or -1 if Init() + // returned false. Note: on Windows, this always returns -1. + int GetFd() const { + return fd_; + } + + private: + // Set the contents of the temporary file, and seek back to the start of the + // file. On failure, returns false. + bool SetContents(const void* data, size_t data_len); + + int fd_ = -1; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_SCOPED_TMPFILE_H_ diff --git a/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile_unittest.cc new file mode 100644 index 000000000..f0bb2bbb4 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/common/linux/scoped_tmpfile_unittest.cc @@ -0,0 +1,50 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// scoped_tmpfile_unittest.cc: Unit tests for google_breakpad::ScopedTmpfile. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_tmpfile.h" + +#include + +#include "breakpad_googletest_includes.h" + +using google_breakpad::ScopedTmpFile; + +TEST(ScopedTmpFileTest, CheckContentsMatch) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("Test")); + + char file_contents[5] = {0}; + ASSERT_EQ(4, read(file.GetFd(), file_contents, sizeof(file_contents))); + EXPECT_STREQ(file_contents, "Test"); +} diff --git a/shared/sentry/external/breakpad/src/common/linux/symbol_collector_client.cc b/shared/sentry/src/external/breakpad/src/common/linux/symbol_collector_client.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/linux/symbol_collector_client.cc rename to shared/sentry/src/external/breakpad/src/common/linux/symbol_collector_client.cc index 1c1dc97a5..e9a1893c2 100644 --- a/shared/sentry/external/breakpad/src/common/linux/symbol_collector_client.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/symbol_collector_client.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/symbol_collector_client.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/symbol_collector_client.h b/shared/sentry/src/external/breakpad/src/common/linux/symbol_collector_client.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/symbol_collector_client.h rename to shared/sentry/src/external/breakpad/src/common/linux/symbol_collector_client.h diff --git a/shared/sentry/external/breakpad/src/common/linux/symbol_upload.cc b/shared/sentry/src/external/breakpad/src/common/linux/symbol_upload.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/symbol_upload.cc rename to shared/sentry/src/external/breakpad/src/common/linux/symbol_upload.cc index c080533af..8ab143c6f 100644 --- a/shared/sentry/external/breakpad/src/common/linux/symbol_upload.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/symbol_upload.cc @@ -29,6 +29,10 @@ // symbol_upload.cc: implemented google_breakpad::sym_upload::Start, a helper // function for linux symbol upload tool. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/symbol_upload.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/symbol_upload.h b/shared/sentry/src/external/breakpad/src/common/linux/symbol_upload.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/symbol_upload.h rename to shared/sentry/src/external/breakpad/src/common/linux/symbol_upload.h diff --git a/shared/sentry/external/breakpad/src/common/linux/synth_elf.cc b/shared/sentry/src/external/breakpad/src/common/linux/synth_elf.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/synth_elf.cc rename to shared/sentry/src/external/breakpad/src/common/linux/synth_elf.cc index 2ba25e611..8e9170e7f 100644 --- a/shared/sentry/external/breakpad/src/common/linux/synth_elf.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/synth_elf.cc @@ -1,3 +1,7 @@ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/synth_elf.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/synth_elf.h b/shared/sentry/src/external/breakpad/src/common/linux/synth_elf.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/synth_elf.h rename to shared/sentry/src/external/breakpad/src/common/linux/synth_elf.h diff --git a/shared/sentry/external/breakpad/src/common/linux/synth_elf_unittest.cc b/shared/sentry/src/external/breakpad/src/common/linux/synth_elf_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/synth_elf_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/linux/synth_elf_unittest.cc index 44ef6ef3b..578f6a261 100644 --- a/shared/sentry/external/breakpad/src/common/linux/synth_elf_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/synth_elf_unittest.cc @@ -31,6 +31,10 @@ // synth_elf_unittest.cc: // Unittests for google_breakpad::synth_elf::ELF +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "breakpad_googletest_includes.h" diff --git a/shared/sentry/external/breakpad/src/common/linux/tests/crash_generator.cc b/shared/sentry/src/external/breakpad/src/common/linux/tests/crash_generator.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/linux/tests/crash_generator.cc rename to shared/sentry/src/external/breakpad/src/common/linux/tests/crash_generator.cc index 0db0c4a24..1cad9ae26 100644 --- a/shared/sentry/external/breakpad/src/common/linux/tests/crash_generator.cc +++ b/shared/sentry/src/external/breakpad/src/common/linux/tests/crash_generator.cc @@ -29,6 +29,10 @@ // crash_generator.cc: Implement google_breakpad::CrashGenerator. // See crash_generator.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/linux/tests/crash_generator.h" #include diff --git a/shared/sentry/external/breakpad/src/common/linux/tests/crash_generator.h b/shared/sentry/src/external/breakpad/src/common/linux/tests/crash_generator.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/tests/crash_generator.h rename to shared/sentry/src/external/breakpad/src/common/linux/tests/crash_generator.h diff --git a/shared/sentry/external/breakpad/src/common/linux/ucontext_constants.h b/shared/sentry/src/external/breakpad/src/common/linux/ucontext_constants.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/linux/ucontext_constants.h rename to shared/sentry/src/external/breakpad/src/common/linux/ucontext_constants.h diff --git a/shared/sentry/external/breakpad/src/common/long_string_dictionary.cc b/shared/sentry/src/external/breakpad/src/common/long_string_dictionary.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/long_string_dictionary.cc rename to shared/sentry/src/external/breakpad/src/common/long_string_dictionary.cc index f504aa429..19a649e7b 100644 --- a/shared/sentry/external/breakpad/src/common/long_string_dictionary.cc +++ b/shared/sentry/src/external/breakpad/src/common/long_string_dictionary.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/long_string_dictionary.h" #include diff --git a/shared/sentry/external/breakpad/src/common/long_string_dictionary.h b/shared/sentry/src/external/breakpad/src/common/long_string_dictionary.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/long_string_dictionary.h rename to shared/sentry/src/external/breakpad/src/common/long_string_dictionary.h diff --git a/shared/sentry/external/breakpad/src/common/long_string_dictionary_unittest.cc b/shared/sentry/src/external/breakpad/src/common/long_string_dictionary_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/long_string_dictionary_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/long_string_dictionary_unittest.cc index be34efdfc..f10dc0d97 100644 --- a/shared/sentry/external/breakpad/src/common/long_string_dictionary_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/long_string_dictionary_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/mac/Breakpad.xcconfig b/shared/sentry/src/external/breakpad/src/common/mac/Breakpad.xcconfig similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/Breakpad.xcconfig rename to shared/sentry/src/external/breakpad/src/common/mac/Breakpad.xcconfig diff --git a/shared/sentry/external/breakpad/src/common/mac/BreakpadDebug.xcconfig b/shared/sentry/src/external/breakpad/src/common/mac/BreakpadDebug.xcconfig similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/BreakpadDebug.xcconfig rename to shared/sentry/src/external/breakpad/src/common/mac/BreakpadDebug.xcconfig diff --git a/shared/sentry/external/breakpad/src/common/mac/BreakpadRelease.xcconfig b/shared/sentry/src/external/breakpad/src/common/mac/BreakpadRelease.xcconfig similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/BreakpadRelease.xcconfig rename to shared/sentry/src/external/breakpad/src/common/mac/BreakpadRelease.xcconfig diff --git a/shared/sentry/external/breakpad/src/common/mac/GTMDefines.h b/shared/sentry/src/external/breakpad/src/common/mac/GTMDefines.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/GTMDefines.h rename to shared/sentry/src/external/breakpad/src/common/mac/GTMDefines.h diff --git a/shared/sentry/external/breakpad/src/common/mac/GTMLogger.h b/shared/sentry/src/external/breakpad/src/common/mac/GTMLogger.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/GTMLogger.h rename to shared/sentry/src/external/breakpad/src/common/mac/GTMLogger.h diff --git a/shared/sentry/external/breakpad/src/common/mac/GTMLogger.m b/shared/sentry/src/external/breakpad/src/common/mac/GTMLogger.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/GTMLogger.m rename to shared/sentry/src/external/breakpad/src/common/mac/GTMLogger.m diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPGetRequest.h b/shared/sentry/src/external/breakpad/src/common/mac/HTTPGetRequest.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPGetRequest.h rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPGetRequest.h diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPGetRequest.m b/shared/sentry/src/external/breakpad/src/common/mac/HTTPGetRequest.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPGetRequest.m rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPGetRequest.m diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPMultipartUpload.h b/shared/sentry/src/external/breakpad/src/common/mac/HTTPMultipartUpload.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPMultipartUpload.h rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPMultipartUpload.h diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPMultipartUpload.m b/shared/sentry/src/external/breakpad/src/common/mac/HTTPMultipartUpload.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPMultipartUpload.m rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPMultipartUpload.m diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPPutRequest.h b/shared/sentry/src/external/breakpad/src/common/mac/HTTPPutRequest.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPPutRequest.h rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPPutRequest.h diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPPutRequest.m b/shared/sentry/src/external/breakpad/src/common/mac/HTTPPutRequest.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPPutRequest.m rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPPutRequest.m diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPRequest.h b/shared/sentry/src/external/breakpad/src/common/mac/HTTPRequest.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPRequest.h rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPRequest.h diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPRequest.m b/shared/sentry/src/external/breakpad/src/common/mac/HTTPRequest.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPRequest.m rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPRequest.m diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPSimplePostRequest.h b/shared/sentry/src/external/breakpad/src/common/mac/HTTPSimplePostRequest.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPSimplePostRequest.h rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPSimplePostRequest.h diff --git a/shared/sentry/external/breakpad/src/common/mac/HTTPSimplePostRequest.m b/shared/sentry/src/external/breakpad/src/common/mac/HTTPSimplePostRequest.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/HTTPSimplePostRequest.m rename to shared/sentry/src/external/breakpad/src/common/mac/HTTPSimplePostRequest.m diff --git a/shared/sentry/external/breakpad/src/common/mac/MachIPC.h b/shared/sentry/src/external/breakpad/src/common/mac/MachIPC.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/MachIPC.h rename to shared/sentry/src/external/breakpad/src/common/mac/MachIPC.h diff --git a/shared/sentry/external/breakpad/src/common/mac/MachIPC.mm b/shared/sentry/src/external/breakpad/src/common/mac/MachIPC.mm similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/MachIPC.mm rename to shared/sentry/src/external/breakpad/src/common/mac/MachIPC.mm diff --git a/shared/sentry/external/breakpad/src/common/mac/SymbolCollectorClient.h b/shared/sentry/src/external/breakpad/src/common/mac/SymbolCollectorClient.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/SymbolCollectorClient.h rename to shared/sentry/src/external/breakpad/src/common/mac/SymbolCollectorClient.h diff --git a/shared/sentry/external/breakpad/src/common/mac/SymbolCollectorClient.m b/shared/sentry/src/external/breakpad/src/common/mac/SymbolCollectorClient.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/SymbolCollectorClient.m rename to shared/sentry/src/external/breakpad/src/common/mac/SymbolCollectorClient.m diff --git a/shared/sentry/src/external/breakpad/src/common/mac/arch_utilities.cc b/shared/sentry/src/external/breakpad/src/common/mac/arch_utilities.cc new file mode 100644 index 000000000..742108205 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/common/mac/arch_utilities.cc @@ -0,0 +1,179 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/mac/arch_utilities.h" + +#include +#include +#include +#include +#include + +#if defined(__APPLE__) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 130000 || \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= 160000 || \ + __TVOS_OS_VERSION_MAX_ALLOWED >= 160000) +#include +#endif + +namespace { + +enum Architecture { + kArch_i386 = 0, + kArch_x86_64, + kArch_x86_64h, + kArch_arm, + kArch_arm64, + kArch_arm64e, + kArch_ppc, + // This must be last. + kNumArchitectures +}; + +struct NamedArchInfo { + const char* name; + ArchInfo info; +}; + +// enum Architecture above and kKnownArchitectures below +// must be kept in sync. +constexpr NamedArchInfo kKnownArchitectures[] = { + {"i386", {CPU_TYPE_I386, CPU_SUBTYPE_I386_ALL}}, + {"x86_64", {CPU_TYPE_X86_64, CPU_SUBTYPE_X86_64_ALL}}, + {"x86_64h", {CPU_TYPE_X86_64, CPU_SUBTYPE_X86_64_H}}, + {"arm", {CPU_TYPE_ARM, CPU_SUBTYPE_ARM_ALL}}, + {"arm64", {CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64_ALL}}, + {"arm64e", {CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64E}}, + {"ppc", {CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL}}}; + +} // namespace + +ArchInfo GetLocalArchInfo(void) { + Architecture arch; +#if defined(__i386__) + arch = kArch_i386; +#elif defined(__x86_64__) + arch = kArch_x86_64; +#elif defined(__arm64__) || defined(__aarch64__) + arch = kArch_arm64; +#elif defined(__arm__) + arch = kArch_arm; +#elif defined(__powerpc__) + arch = kArch_ppc; +#else +#error "Unsupported CPU architecture" +#endif + return kKnownArchitectures[arch].info; +} + +#ifdef __APPLE__ + +std::optional GetArchInfoFromName(const char* arch_name) { +#if (__MAC_OS_X_VERSION_MAX_ALLOWED >= 130000 || \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= 160000 || \ + __TVOS_OS_VERSION_MAX_ALLOWED >= 160000) + if (__builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, *)) { + cpu_type_t type; + cpu_subtype_t subtype; + if (macho_cpu_type_for_arch_name(arch_name, &type, &subtype)) { + return ArchInfo{type, subtype}; + } + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + const NXArchInfo* info = NXGetArchInfoFromName(arch_name); +#pragma clang diagnostic pop + if (info) { + return ArchInfo{info->cputype, info->cpusubtype}; + } + } +#else + const NXArchInfo* info = NXGetArchInfoFromName(arch_name); + if (info) { + return ArchInfo{info->cputype, info->cpusubtype}; + } +#endif + return std::nullopt; +} + +const char* GetNameFromCPUType(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { +#if (__MAC_OS_X_VERSION_MAX_ALLOWED >= 130000 || \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= 160000 || \ + __TVOS_OS_VERSION_MAX_ALLOWED >= 160000) + if (__builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, *)) { + const char* name = macho_arch_name_for_cpu_type(cpu_type, cpu_subtype); + if (name) { + return name; + } + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + const NXArchInfo* info = NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); +#pragma clang diagnostic pop + if (info) { + return info->name; + } + } +#else + const NXArchInfo* info = NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); + if (info) { + return info->name; + } +#endif + return kUnknownArchName; +} + +#else + +std::optional GetArchInfoFromName(const char* arch_name) { + for (int arch = 0; arch < kNumArchitectures; ++arch) { + if (!strcmp(arch_name, kKnownArchitectures[arch].name)) { + return kKnownArchitectures[arch].info; + } + } + return std::nullopt; +} + +const char* GetNameFromCPUType(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { + const char* candidate = kUnknownArchName; + for (int arch = 0; arch < kNumArchitectures; ++arch) { + if (kKnownArchitectures[arch].info.cputype == cpu_type) { + if (kKnownArchitectures[arch].info.cpusubtype == cpu_subtype) { + return kKnownArchitectures[arch].name; + } + if (!strcmp(candidate, kUnknownArchName)) { + candidate = kKnownArchitectures[arch].name; + } + } + } + return candidate; +} +#endif // __APPLE__ diff --git a/shared/sentry/external/breakpad/src/common/mac/arch_utilities.h b/shared/sentry/src/external/breakpad/src/common/mac/arch_utilities.h similarity index 71% rename from shared/sentry/external/breakpad/src/common/mac/arch_utilities.h rename to shared/sentry/src/external/breakpad/src/common/mac/arch_utilities.h index d267c43b8..3b036738a 100644 --- a/shared/sentry/external/breakpad/src/common/mac/arch_utilities.h +++ b/shared/sentry/src/external/breakpad/src/common/mac/arch_utilities.h @@ -31,16 +31,26 @@ #ifndef COMMON_MAC_ARCH_UTILITIES_H__ #define COMMON_MAC_ARCH_UTILITIES_H__ -#include +#include -namespace google_breakpad { +#include -// Custom implementation of |NXGetArchInfoFromName| and -// |NXGetArchInfoFromCpuType| that handle newer CPU on older OSes. -const NXArchInfo* BreakpadGetArchInfoFromName(const char* arch_name); -const NXArchInfo* BreakpadGetArchInfoFromCpuType(cpu_type_t cpu_type, - cpu_subtype_t cpu_subtype); +static constexpr const char* kUnknownArchName = ""; -} // namespace google_breakpad +struct ArchInfo { + cpu_type_t cputype; + cpu_subtype_t cpusubtype; +}; + +// Returns architecture info if `arch_name` corresponds to a valid, known +// architecture, and std::nullopt otherwise. +std::optional GetArchInfoFromName(const char* arch_name); + +// Returns the name of the architecture specified by `cpu_type` and +// `cpu_subtype`, or `kUnknownArchName` if it's unknown or invalid. +const char* GetNameFromCPUType(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype); + +// Returns the architecture of the machine this code is running on. +ArchInfo GetLocalArchInfo(); #endif // COMMON_MAC_ARCH_UTILITIES_H__ diff --git a/shared/sentry/external/breakpad/src/common/mac/bootstrap_compat.cc b/shared/sentry/src/external/breakpad/src/common/mac/bootstrap_compat.cc similarity index 96% rename from shared/sentry/external/breakpad/src/common/mac/bootstrap_compat.cc rename to shared/sentry/src/external/breakpad/src/common/mac/bootstrap_compat.cc index 6647bae36..408589ba9 100644 --- a/shared/sentry/external/breakpad/src/common/mac/bootstrap_compat.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/bootstrap_compat.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/mac/bootstrap_compat.h" namespace breakpad { diff --git a/shared/sentry/external/breakpad/src/common/mac/bootstrap_compat.h b/shared/sentry/src/external/breakpad/src/common/mac/bootstrap_compat.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/bootstrap_compat.h rename to shared/sentry/src/external/breakpad/src/common/mac/bootstrap_compat.h diff --git a/shared/sentry/external/breakpad/src/common/mac/byteswap.h b/shared/sentry/src/external/breakpad/src/common/mac/byteswap.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/byteswap.h rename to shared/sentry/src/external/breakpad/src/common/mac/byteswap.h diff --git a/shared/sentry/external/breakpad/src/common/mac/dump_syms.cc b/shared/sentry/src/external/breakpad/src/common/mac/dump_syms.cc similarity index 79% rename from shared/sentry/external/breakpad/src/common/mac/dump_syms.cc rename to shared/sentry/src/external/breakpad/src/common/mac/dump_syms.cc index c7afb2152..c06945e48 100644 --- a/shared/sentry/external/breakpad/src/common/mac/dump_syms.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/dump_syms.cc @@ -32,6 +32,10 @@ // dump_syms.cc: Create a symbol file for use with minidumps +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/mac/dump_syms.h" #include @@ -217,11 +221,10 @@ bool DumpSymbols::ReadData(uint8_t* contents, size_t size, return true; } -bool DumpSymbols::SetArchitecture(cpu_type_t cpu_type, - cpu_subtype_t cpu_subtype) { +bool DumpSymbols::SetArchitecture(const ArchInfo& info) { // Find the best match for the architecture the user requested. - const SuperFatArch* best_match = FindBestMatchForArchitecture( - cpu_type, cpu_subtype); + const SuperFatArch* best_match = + FindBestMatchForArchitecture(info.cputype, info.cpusubtype); if (!best_match) return false; // Record the selected object file. @@ -229,65 +232,37 @@ bool DumpSymbols::SetArchitecture(cpu_type_t cpu_type, return true; } -bool DumpSymbols::SetArchitecture(const std::string& arch_name) { - bool arch_set = false; - const NXArchInfo* arch_info = - google_breakpad::BreakpadGetArchInfoFromName(arch_name.c_str()); - if (arch_info) { - arch_set = SetArchitecture(arch_info->cputype, arch_info->cpusubtype); - } - return arch_set; -} SuperFatArch* DumpSymbols::FindBestMatchForArchitecture( - cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { - // Check if all the object files can be converted to struct fat_arch. - bool can_convert_to_fat_arch = true; - vector fat_arch_vector; - for (vector::const_iterator it = object_files_.begin(); - it != object_files_.end(); - ++it) { - struct fat_arch arch; - bool success = it->ConvertToFatArch(&arch); - if (!success) { - can_convert_to_fat_arch = false; - break; - } - fat_arch_vector.push_back(arch); - } - - // If all the object files can be converted to struct fat_arch, use - // NXFindBestFatArch. - if (can_convert_to_fat_arch) { - const struct fat_arch* best_match - = NXFindBestFatArch(cpu_type, cpu_subtype, &fat_arch_vector[0], - static_cast(fat_arch_vector.size())); - - for (size_t i = 0; i < fat_arch_vector.size(); ++i) { - if (best_match == &fat_arch_vector[i]) - return &object_files_[i]; + cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype) { + SuperFatArch* closest_match = nullptr; + for (auto& object_file : object_files_) { + if (static_cast(object_file.cputype) == cpu_type) { + // If there's an exact match, return it directly. + if ((static_cast(object_file.cpusubtype) & + ~CPU_SUBTYPE_MASK) == (cpu_subtype & ~CPU_SUBTYPE_MASK)) { + return &object_file; + } + // Otherwise, hold on to this as the closest match since at least the CPU + // type matches. + if (!closest_match) { + closest_match = &object_file; + } } - assert(best_match == NULL); - return NULL; } - - // Check for an exact match with cpu_type and cpu_subtype. - for (vector::iterator it = object_files_.begin(); - it != object_files_.end(); - ++it) { - if (static_cast(it->cputype) == cpu_type && - static_cast(it->cpusubtype) == cpu_subtype) - return &*it; - } - // No exact match found. - // TODO(erikchen): If it becomes necessary, we can copy the implementation of - // NXFindBestFatArch, located at - // http://web.mit.edu/darwin/src/modules/cctools/libmacho/arch.c. - fprintf(stderr, "Failed to find an exact match for an object file with cpu " - "type: %d and cpu subtype: %d. Furthermore, at least one object file is " - "larger than 2**32.\n", cpu_type, cpu_subtype); - return NULL; + fprintf(stderr, + "Failed to find an exact match for an object file with cpu " + "type: %d and cpu subtype: %d.\n", + cpu_type, cpu_subtype); + if (closest_match) { + fprintf(stderr, "Using %s as the closest match.\n", + GetNameFromCPUType(closest_match->cputype, + closest_match->cpusubtype)); + return closest_match; + } + return nullptr; } string DumpSymbols::Identifier() { @@ -393,8 +368,8 @@ bool DumpSymbols::CreateEmptyModule(scoped_ptr& module) { selected_object_file_ = &object_files_[0]; else { // Look for an object file whose architecture matches our own. - const NXArchInfo* local_arch = NXGetLocalArchInfo(); - if (!SetArchitecture(local_arch->cputype, local_arch->cpusubtype)) { + ArchInfo local_arch = GetLocalArchInfo(); + if (!SetArchitecture(local_arch)) { fprintf(stderr, "%s: object file contains more than one" " architecture, none of which match the current" " architecture; specify an architecture explicitly" @@ -409,18 +384,16 @@ bool DumpSymbols::CreateEmptyModule(scoped_ptr& module) { // Find the name of the selected file's architecture, to appear in // the MODULE record and in error messages. - const NXArchInfo* selected_arch_info = - google_breakpad::BreakpadGetArchInfoFromCpuType( - selected_object_file_->cputype, selected_object_file_->cpusubtype); + const char* selected_arch_name = GetNameFromCPUType( + selected_object_file_->cputype, selected_object_file_->cpusubtype); // In certain cases, it is possible that architecture info can't be reliably // determined, e.g. new architectures that breakpad is unware of. In that // case, avoid crashing and return false instead. - if (selected_arch_info == NULL) { + if (selected_arch_name == kUnknownArchName) { return false; } - const char* selected_arch_name = selected_arch_info->name; if (strcmp(selected_arch_name, "i386") == 0) selected_arch_name = "x86"; @@ -433,7 +406,12 @@ bool DumpSymbols::CreateEmptyModule(scoped_ptr& module) { } // Compute a module name, to appear in the MODULE record. - string module_name = google_breakpad::BaseName(object_filename_); + string module_name; + if (!module_name_.empty()) { + module_name = module_name_; + } else { + module_name = google_breakpad::BaseName(object_filename_); + } // Choose an identifier string, to appear in the MODULE record. string identifier = Identifier(); @@ -441,21 +419,72 @@ bool DumpSymbols::CreateEmptyModule(scoped_ptr& module) { return false; // Create a module to hold the debugging information. - module.reset(new Module(module_name, - "mac", - selected_arch_name, - identifier)); + module.reset(new Module(module_name, "mac", selected_arch_name, identifier, + "", enable_multiple_, prefer_extern_name_)); return true; } +void DumpSymbols::StartProcessSplitDwarf( + google_breakpad::CompilationUnit* reader, + Module* module, + google_breakpad::Endianness endianness, + bool handle_inter_cu_refs, + bool handle_inline) const { + std::string split_file; + google_breakpad::SectionMap split_sections; + google_breakpad::ByteReader split_byte_reader(endianness); + uint64_t cu_offset = 0; + if (reader->ProcessSplitDwarf(split_file, split_sections, split_byte_reader, + cu_offset)) + return; + DwarfCUToModule::FileContext file_context(split_file, module, + handle_inter_cu_refs); + for (auto section : split_sections) + file_context.AddSectionToSectionMap(section.first, section.second.first, + section.second.second); + // Because DWP/DWO file doesn't have .debug_addr/.debug_line/.debug_line_str, + // its debug info will refer to .debug_addr/.debug_line in the main binary. + if (file_context.section_map().find(".debug_addr") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_addr", reader->GetAddrBuffer(), + reader->GetAddrBufferLen()); + if (file_context.section_map().find(".debug_line") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line", reader->GetLineBuffer(), + reader->GetLineBufferLen()); + if (file_context.section_map().find(".debug_line_str") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line_str", + reader->GetLineStrBuffer(), + reader->GetLineStrBufferLen()); + DumperRangesHandler ranges_handler(&split_byte_reader); + DumperLineToModule line_to_module(&split_byte_reader); + DwarfCUToModule::WarningReporter reporter(split_file, cu_offset); + DwarfCUToModule root_handler( + &file_context, &line_to_module, &ranges_handler, &reporter, handle_inline, + reader->GetLowPC(), reader->GetAddrBase(), reader->HasSourceLineInfo(), + reader->GetSourceLineOffset()); + google_breakpad::DIEDispatcher die_dispatcher(&root_handler); + google_breakpad::CompilationUnit split_reader( + split_file, file_context.section_map(), cu_offset, &split_byte_reader, + &die_dispatcher); + split_reader.SetSplitDwarf(reader->GetAddrBase(), reader->GetDWOID()); + split_reader.Start(); + // Normally, it won't happen unless we have transitive reference. + if (split_reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&split_reader, module, endianness, + handle_inter_cu_refs, handle_inline); + } +} + void DumpSymbols::ReadDwarf(google_breakpad::Module* module, const mach_o::Reader& macho_reader, const mach_o::SectionMap& dwarf_sections, bool handle_inter_cu_refs) const { // Build a byte reader of the appropriate endianness. - ByteReader byte_reader(macho_reader.big_endian() - ? ENDIANNESS_BIG - : ENDIANNESS_LITTLE); + google_breakpad::Endianness endianness = + macho_reader.big_endian() ? ENDIANNESS_BIG : ENDIANNESS_LITTLE; + ByteReader byte_reader(endianness); // Construct a context for this file. DwarfCUToModule::FileContext file_context(selected_object_name_, @@ -491,14 +520,14 @@ void DumpSymbols::ReadDwarf(google_breakpad::Module* module, // Walk the __debug_info section, one compilation unit at a time. uint64_t debug_info_length = debug_info_section.second; + bool handle_inline = symbol_data_ & INLINES; for (uint64_t offset = 0; offset < debug_info_length;) { // Make a handler for the root DIE that populates MODULE with the // debug info. DwarfCUToModule::WarningReporter reporter(selected_object_name_, offset); DwarfCUToModule root_handler(&file_context, &line_to_module, - &ranges_handler, &reporter, - symbol_data_ & INLINES); + &ranges_handler, &reporter, handle_inline); // Make a Dwarf2Handler that drives our DIEHandler. DIEDispatcher die_dispatcher(&root_handler); // Make a DWARF parser for the compilation unit at OFFSET. @@ -509,6 +538,11 @@ void DumpSymbols::ReadDwarf(google_breakpad::Module* module, &die_dispatcher); // Process the entire compilation unit; get the offset of the next. offset += dwarf_reader.Start(); + // Start to process split dwarf file. + if (dwarf_reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&dwarf_reader, module, endianness, + handle_inter_cu_refs, handle_inline); + } } } @@ -533,16 +567,14 @@ bool DumpSymbols::ReadCFI(google_breakpad::Module* module, register_names = DwarfCFIToModule::RegisterNames::ARM64(); break; default: { - const NXArchInfo* arch = google_breakpad::BreakpadGetArchInfoFromCpuType( - macho_reader.cpu_type(), macho_reader.cpu_subtype()); - fprintf(stderr, "%s: cannot convert DWARF call frame information for ", - selected_object_name_.c_str()); - if (arch) - fprintf(stderr, "architecture '%s'", arch->name); - else - fprintf(stderr, "architecture %d,%d", - macho_reader.cpu_type(), macho_reader.cpu_subtype()); - fprintf(stderr, " to Breakpad symbol file: no register name table\n"); + const char* arch_name = GetNameFromCPUType(macho_reader.cpu_type(), + macho_reader.cpu_subtype()); + fprintf( + stderr, + "%s: cannot convert DWARF call frame information for architecture " + "'%s' (%d, %d) to Breakpad symbol file: no register name table\n", + selected_object_name_.c_str(), arch_name, macho_reader.cpu_type(), + macho_reader.cpu_subtype()); return false; } } @@ -680,18 +712,6 @@ bool DumpSymbols::ReadSymbolData(Module** out_module) { return true; } -bool DumpSymbols::WriteSymbolFile(std::ostream& stream) { - Module* module = NULL; - - if (ReadSymbolData(&module) && module) { - bool res = module->Write(stream, symbol_data_); - delete module; - return res; - } - - return false; -} - // Read the selected object file's debugging information, and write out the // header only to |stream|. Return true on success; if an error occurs, report // it and return false. diff --git a/shared/sentry/external/breakpad/src/common/mac/dump_syms.h b/shared/sentry/src/external/breakpad/src/common/mac/dump_syms.h similarity index 75% rename from shared/sentry/external/breakpad/src/common/mac/dump_syms.h rename to shared/sentry/src/external/breakpad/src/common/mac/dump_syms.h index d097cfa55..5ccf49e3e 100644 --- a/shared/sentry/external/breakpad/src/common/mac/dump_syms.h +++ b/shared/sentry/src/external/breakpad/src/common/mac/dump_syms.h @@ -43,6 +43,8 @@ #include #include "common/byte_cursor.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/mac/arch_utilities.h" #include "common/mac/macho_reader.h" #include "common/mac/super_fat_arch.h" #include "common/module.h" @@ -53,7 +55,11 @@ namespace google_breakpad { class DumpSymbols { public: - DumpSymbols(SymbolData symbol_data, bool handle_inter_cu_refs) + DumpSymbols(SymbolData symbol_data, + bool handle_inter_cu_refs, + bool enable_multiple = false, + const std::string& module_name = "", + bool prefer_extern_name = false) : symbol_data_(symbol_data), handle_inter_cu_refs_(handle_inter_cu_refs), object_filename_(), @@ -62,13 +68,20 @@ class DumpSymbols { from_disk_(false), object_files_(), selected_object_file_(), - selected_object_name_() {} - ~DumpSymbols() { - } + selected_object_name_(), + enable_multiple_(enable_multiple), + module_name_(module_name), + prefer_extern_name_(prefer_extern_name) {} + ~DumpSymbols() = default; // Prepare to read debugging information from |filename|. |filename| may be // the name of a fat file, a Mach-O file, or a dSYM bundle containing either - // of the above. On success, return true; if there is a problem reading + // of the above. + // + // If |module_name_| is empty, uses the basename of |filename| as the module + // name. Otherwise, uses |module_name_| as the module name. + // + // On success, return true; if there is a problem reading // |filename|, report it and return false. bool Read(const std::string& filename); @@ -80,26 +93,15 @@ class DumpSymbols { // problem reading |contents|, report it and return false. bool ReadData(uint8_t* contents, size_t size, const std::string& filename); - // If this dumper's file includes an object file for |cpu_type| and - // |cpu_subtype|, then select that object file for dumping, and return - // true. Otherwise, return false, and leave this dumper's selected - // architecture unchanged. + // If this dumper's file includes an object file for `info`, then select that + // object file for dumping, and return true. Otherwise, return false, and + // leave this dumper's selected architecture unchanged. // // By default, if this dumper's file contains only one object file, then // the dumper will dump those symbols; and if it contains more than one // object file, then the dumper will dump the object file whose // architecture matches that of this dumper program. - bool SetArchitecture(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype); - - // If this dumper's file includes an object file for |arch_name|, then select - // that object file for dumping, and return true. Otherwise, return false, - // and leave this dumper's selected architecture unchanged. - // - // By default, if this dumper's file contains only one object file, then - // the dumper will dump those symbols; and if it contains more than one - // object file, then the dumper will dump the object file whose - // architecture matches that of this dumper program. - bool SetArchitecture(const std::string& arch_name); + bool SetArchitecture(const ArchInfo& info); // Return a pointer to an array of SuperFatArch structures describing the // object files contained in this dumper's file. Set *|count| to the number @@ -115,19 +117,14 @@ class DumpSymbols { return NULL; } - // Read the selected object file's debugging information, and write it out to - // |stream|. Return true on success; if an error occurs, report it and - // return false. - bool WriteSymbolFile(std::ostream& stream); - // Read the selected object file's debugging information, and write out the // header only to |stream|. Return true on success; if an error occurs, report // it and return false. bool WriteSymbolFileHeader(std::ostream& stream); - // As above, but simply return the debugging information in module - // instead of writing it to a stream. The caller owns the resulting - // module object and must delete it when finished. + // Read the selected object file's debugging information and store it in + // `module`. The caller owns the resulting module object and must delete + // it when finished. bool ReadSymbolData(Module** module); // Return an identifier string for the file this DumpSymbols is dumping. @@ -147,6 +144,13 @@ class DumpSymbols { // Creates an empty module object. bool CreateEmptyModule(scoped_ptr& module); + // Process the split dwarf file referenced by reader. + void StartProcessSplitDwarf(google_breakpad::CompilationUnit* reader, + Module* module, + google_breakpad::Endianness endianness, + bool handle_inter_cu_refs, + bool handle_inline) const; + // Read debugging information from |dwarf_sections|, which was taken from // |macho_reader|, and add it to |module|. void ReadDwarf(google_breakpad::Module* module, @@ -201,6 +205,25 @@ class DumpSymbols { // fat binary, it includes an indication of the particular architecture // within that binary. string selected_object_name_; + + // Whether symbols sharing an address should be collapsed into a single entry + // and marked with an `m` in the output. + // See: https://crbug.com/google-breakpad/751 and docs at + // docs/symbol_files.md#records-3 + bool enable_multiple_; + + // If non-empty, used as the module name. Otherwise, the basename of + // |object_filename_| is used as the module name. + const std::string module_name_; + + // If a Function and an Extern share the same address but have a different + // name, prefer the name of the Extern. + // + // Use this when dumping Mach-O .dSYMs built with -gmlt (Minimum Line Tables), + // as the Function's fully-qualified name will only be present in the STABS + // (which are placed in the Extern), not in the DWARF symbols (which are + // placed in the Function). + bool prefer_extern_name_; }; } // namespace google_breakpad diff --git a/shared/sentry/external/breakpad/src/common/mac/encoding_util.h b/shared/sentry/src/external/breakpad/src/common/mac/encoding_util.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/encoding_util.h rename to shared/sentry/src/external/breakpad/src/common/mac/encoding_util.h diff --git a/shared/sentry/external/breakpad/src/common/mac/encoding_util.m b/shared/sentry/src/external/breakpad/src/common/mac/encoding_util.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/encoding_util.m rename to shared/sentry/src/external/breakpad/src/common/mac/encoding_util.m diff --git a/shared/sentry/external/breakpad/src/common/mac/file_id.cc b/shared/sentry/src/external/breakpad/src/common/mac/file_id.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/mac/file_id.cc rename to shared/sentry/src/external/breakpad/src/common/mac/file_id.cc index a6c1d26f6..ee4a66bbe 100644 --- a/shared/sentry/external/breakpad/src/common/mac/file_id.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/file_id.cc @@ -32,6 +32,10 @@ // // Author: Dan Waylonis +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/mac/file_id.h" #include diff --git a/shared/sentry/external/breakpad/src/common/mac/file_id.h b/shared/sentry/src/external/breakpad/src/common/mac/file_id.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/file_id.h rename to shared/sentry/src/external/breakpad/src/common/mac/file_id.h diff --git a/shared/sentry/external/breakpad/src/common/mac/launch_reporter.cc b/shared/sentry/src/external/breakpad/src/common/mac/launch_reporter.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/mac/launch_reporter.cc rename to shared/sentry/src/external/breakpad/src/common/mac/launch_reporter.cc index de554ee3a..f6b8aed1c 100644 --- a/shared/sentry/external/breakpad/src/common/mac/launch_reporter.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/launch_reporter.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/mac/launch_reporter.h b/shared/sentry/src/external/breakpad/src/common/mac/launch_reporter.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/launch_reporter.h rename to shared/sentry/src/external/breakpad/src/common/mac/launch_reporter.h diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_id.cc b/shared/sentry/src/external/breakpad/src/common/mac/macho_id.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/mac/macho_id.cc rename to shared/sentry/src/external/breakpad/src/common/mac/macho_id.cc index e67ccddb7..bb0058ced 100644 --- a/shared/sentry/external/breakpad/src/common/mac/macho_id.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/macho_id.cc @@ -33,6 +33,10 @@ // Author: Dan Waylonis +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_id.h b/shared/sentry/src/external/breakpad/src/common/mac/macho_id.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/macho_id.h rename to shared/sentry/src/external/breakpad/src/common/mac/macho_id.h diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_reader.cc b/shared/sentry/src/external/breakpad/src/common/mac/macho_reader.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/mac/macho_reader.cc rename to shared/sentry/src/external/breakpad/src/common/mac/macho_reader.cc index 23c809c48..0324be143 100644 --- a/shared/sentry/external/breakpad/src/common/mac/macho_reader.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/macho_reader.cc @@ -31,6 +31,10 @@ // macho_reader.cc: Implementation of google_breakpad::Mach_O::FatReader and // google_breakpad::Mach_O::Reader. See macho_reader.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/mac/macho_reader.h" #include diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_reader.h b/shared/sentry/src/external/breakpad/src/common/mac/macho_reader.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/macho_reader.h rename to shared/sentry/src/external/breakpad/src/common/mac/macho_reader.h diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_reader_unittest.cc b/shared/sentry/src/external/breakpad/src/common/mac/macho_reader_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/mac/macho_reader_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/mac/macho_reader_unittest.cc index 3beec341f..4b5ac6ca0 100644 --- a/shared/sentry/external/breakpad/src/common/mac/macho_reader_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/macho_reader_unittest.cc @@ -31,6 +31,10 @@ // macho_reader_unittest.cc: Unit tests for google_breakpad::Mach_O::FatReader // and google_breakpad::Mach_O::Reader. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_utilities.cc b/shared/sentry/src/external/breakpad/src/common/mac/macho_utilities.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/mac/macho_utilities.cc rename to shared/sentry/src/external/breakpad/src/common/mac/macho_utilities.cc index 16e430df9..113e8d3fa 100644 --- a/shared/sentry/external/breakpad/src/common/mac/macho_utilities.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/macho_utilities.cc @@ -30,6 +30,10 @@ // // Author: Dave Camp +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/mac/byteswap.h" #include "common/mac/macho_utilities.h" diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_utilities.h b/shared/sentry/src/external/breakpad/src/common/mac/macho_utilities.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/macho_utilities.h rename to shared/sentry/src/external/breakpad/src/common/mac/macho_utilities.h diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_walker.cc b/shared/sentry/src/external/breakpad/src/common/mac/macho_walker.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/mac/macho_walker.cc rename to shared/sentry/src/external/breakpad/src/common/mac/macho_walker.cc index 505a4df1d..4b9f56c2a 100644 --- a/shared/sentry/external/breakpad/src/common/mac/macho_walker.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/macho_walker.cc @@ -32,17 +32,21 @@ // // Author: Dan Waylonis +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include -#include #include #include #include #include +#include "common/mac/arch_utilities.h" #include "common/mac/byteswap.h" -#include "common/mac/macho_walker.h" #include "common/mac/macho_utilities.h" +#include "common/mac/macho_walker.h" namespace MacFileUtilities { @@ -81,9 +85,8 @@ bool MachoWalker::WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { cpu_subtype_t valid_cpu_subtype = cpu_subtype; // if |cpu_type| is 0, use the native cpu type. if (cpu_type == 0) { - const NXArchInfo* arch = NXGetLocalArchInfo(); - assert(arch); - valid_cpu_type = arch->cputype; + ArchInfo arch = GetLocalArchInfo(); + valid_cpu_type = arch.cputype; valid_cpu_subtype = CPU_SUBTYPE_MULTIPLE; } off_t offset; diff --git a/shared/sentry/external/breakpad/src/common/mac/macho_walker.h b/shared/sentry/src/external/breakpad/src/common/mac/macho_walker.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/macho_walker.h rename to shared/sentry/src/external/breakpad/src/common/mac/macho_walker.h diff --git a/shared/sentry/external/breakpad/src/common/mac/minidump_upload.m b/shared/sentry/src/external/breakpad/src/common/mac/minidump_upload.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/minidump_upload.m rename to shared/sentry/src/external/breakpad/src/common/mac/minidump_upload.m diff --git a/shared/sentry/external/breakpad/src/common/mac/scoped_task_suspend-inl.h b/shared/sentry/src/external/breakpad/src/common/mac/scoped_task_suspend-inl.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/scoped_task_suspend-inl.h rename to shared/sentry/src/external/breakpad/src/common/mac/scoped_task_suspend-inl.h diff --git a/shared/sentry/external/breakpad/src/common/mac/string_utilities.cc b/shared/sentry/src/external/breakpad/src/common/mac/string_utilities.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/mac/string_utilities.cc rename to shared/sentry/src/external/breakpad/src/common/mac/string_utilities.cc index 861029d4e..3b83351f4 100644 --- a/shared/sentry/external/breakpad/src/common/mac/string_utilities.cc +++ b/shared/sentry/src/external/breakpad/src/common/mac/string_utilities.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/scoped_ptr.h" #include "common/mac/string_utilities.h" diff --git a/shared/sentry/external/breakpad/src/common/mac/string_utilities.h b/shared/sentry/src/external/breakpad/src/common/mac/string_utilities.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/string_utilities.h rename to shared/sentry/src/external/breakpad/src/common/mac/string_utilities.h diff --git a/shared/sentry/external/breakpad/src/common/mac/super_fat_arch.h b/shared/sentry/src/external/breakpad/src/common/mac/super_fat_arch.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/super_fat_arch.h rename to shared/sentry/src/external/breakpad/src/common/mac/super_fat_arch.h diff --git a/shared/sentry/external/breakpad/src/common/mac/testing/GTMSenTestCase.h b/shared/sentry/src/external/breakpad/src/common/mac/testing/GTMSenTestCase.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/testing/GTMSenTestCase.h rename to shared/sentry/src/external/breakpad/src/common/mac/testing/GTMSenTestCase.h diff --git a/shared/sentry/external/breakpad/src/common/mac/testing/GTMSenTestCase.m b/shared/sentry/src/external/breakpad/src/common/mac/testing/GTMSenTestCase.m similarity index 100% rename from shared/sentry/external/breakpad/src/common/mac/testing/GTMSenTestCase.m rename to shared/sentry/src/external/breakpad/src/common/mac/testing/GTMSenTestCase.m diff --git a/shared/sentry/external/breakpad/src/common/macros.h b/shared/sentry/src/external/breakpad/src/common/macros.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/macros.h rename to shared/sentry/src/external/breakpad/src/common/macros.h diff --git a/shared/sentry/external/breakpad/src/common/md5.cc b/shared/sentry/src/external/breakpad/src/common/md5.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/md5.cc rename to shared/sentry/src/external/breakpad/src/common/md5.cc index b6e710da9..86298f4de 100644 --- a/shared/sentry/external/breakpad/src/common/md5.cc +++ b/shared/sentry/src/external/breakpad/src/common/md5.cc @@ -13,6 +13,10 @@ * will fill a supplied 16-byte array with the digest. */ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "common/md5.h" diff --git a/shared/sentry/external/breakpad/src/common/md5.h b/shared/sentry/src/external/breakpad/src/common/md5.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/md5.h rename to shared/sentry/src/external/breakpad/src/common/md5.h diff --git a/shared/sentry/external/breakpad/src/common/memory_allocator.h b/shared/sentry/src/external/breakpad/src/common/memory_allocator.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/memory_allocator.h rename to shared/sentry/src/external/breakpad/src/common/memory_allocator.h diff --git a/shared/sentry/external/breakpad/src/common/memory_allocator_unittest.cc b/shared/sentry/src/external/breakpad/src/common/memory_allocator_unittest.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/memory_allocator_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/memory_allocator_unittest.cc index 6ca625bb5..8ef68913b 100644 --- a/shared/sentry/external/breakpad/src/common/memory_allocator_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/memory_allocator_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "breakpad_googletest_includes.h" #include "common/memory_allocator.h" diff --git a/shared/sentry/external/breakpad/src/common/memory_range.h b/shared/sentry/src/external/breakpad/src/common/memory_range.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/memory_range.h rename to shared/sentry/src/external/breakpad/src/common/memory_range.h diff --git a/shared/sentry/external/breakpad/src/common/memory_range_unittest.cc b/shared/sentry/src/external/breakpad/src/common/memory_range_unittest.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/memory_range_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/memory_range_unittest.cc index f112e7616..f081d6798 100644 --- a/shared/sentry/external/breakpad/src/common/memory_range_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/memory_range_unittest.cc @@ -28,6 +28,10 @@ // memory_range_unittest.cc: Unit tests for google_breakpad::MemoryRange. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "breakpad_googletest_includes.h" #include "common/memory_range.h" diff --git a/shared/sentry/external/breakpad/src/common/minidump_type_helper.h b/shared/sentry/src/external/breakpad/src/common/minidump_type_helper.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/minidump_type_helper.h rename to shared/sentry/src/external/breakpad/src/common/minidump_type_helper.h diff --git a/shared/sentry/external/breakpad/src/common/module.cc b/shared/sentry/src/external/breakpad/src/common/module.cc similarity index 81% rename from shared/sentry/external/breakpad/src/common/module.cc rename to shared/sentry/src/external/breakpad/src/common/module.cc index 73c5f723e..0eb5aad82 100644 --- a/shared/sentry/external/breakpad/src/common/module.cc +++ b/shared/sentry/src/external/breakpad/src/common/module.cc @@ -30,6 +30,10 @@ // module.cc: Implement google_breakpad::Module. See module.h. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/module.h" #include "common/string_view.h" @@ -96,15 +100,21 @@ void Module::InlineOriginMap::SetReference(uint64_t offset, references_[offset] = specification_offset; } -Module::Module(const string& name, const string& os, - const string& architecture, const string& id, - const string& code_id /* = "" */) : - name_(name), - os_(os), - architecture_(architecture), - id_(id), - code_id_(code_id), - load_address_(0) { } +Module::Module(const string& name, + const string& os, + const string& architecture, + const string& id, + const string& code_id /* = "" */, + bool enable_multiple_field /* = false*/, + bool prefer_extern_name /* = false*/) + : name_(name), + os_(os), + architecture_(architecture), + id_(id), + code_id_(code_id), + load_address_(0), + enable_multiple_field_(enable_multiple_field), + prefer_extern_name_(prefer_extern_name) {} Module::~Module() { for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); ++it) @@ -113,12 +123,6 @@ Module::~Module() { it != functions_.end(); ++it) { delete *it; } - for (vector::iterator it = stack_frame_entries_.begin(); - it != stack_frame_entries_.end(); ++it) { - delete *it; - } - for (ExternSet::iterator it = externs_.begin(); it != externs_.end(); ++it) - delete *it; } void Module::SetLoadAddress(Address address) { @@ -150,7 +154,29 @@ bool Module::AddFunction(Function* function) { it_ext = externs_.find(&arm_thumb_ext); } if (it_ext != externs_.end()) { - delete *it_ext; + Extern* found_ext = it_ext->get(); + bool name_mismatch = found_ext->name != function->name; + if (enable_multiple_field_) { + bool is_multiple_based_on_name; + // In the case of a .dSYM built with -gmlt, the external name will be the + // fully-qualified symbol name, but the function name will be the partial + // name (or omitted). + // + // Don't mark multiple in this case. + if (name_mismatch && + (function->name == "" || + found_ext->name.find(function->name.str()) != string::npos)) { + is_multiple_based_on_name = false; + } else { + is_multiple_based_on_name = name_mismatch; + } + // If the PUBLIC is for the same symbol as the FUNC, don't mark multiple. + function->is_multiple |= + is_multiple_based_on_name || found_ext->is_multiple; + } + if (name_mismatch && prefer_extern_name_) { + function->name = AddStringToPool(it_ext->get()->name); + } externs_.erase(it_ext); } #if _DEBUG @@ -164,8 +190,18 @@ bool Module::AddFunction(Function* function) { } } #endif - - std::pair ret = functions_.insert(function); + if (enable_multiple_field_ && function_addresses_.count(function->address)) { + FunctionSet::iterator existing_function = std::find_if( + functions_.begin(), functions_.end(), + [&](Function* other) { return other->address == function->address; }); + assert(existing_function != functions_.end()); + (*existing_function)->is_multiple = true; + // Free the duplicate that was not inserted because this Module + // now owns it. + return false; + } + function_addresses_.emplace(function->address); + std::pair ret = functions_.insert(function); if (!ret.second && (*ret.first != function)) { // Free the duplicate that was not inserted because this Module // now owns it. @@ -174,24 +210,22 @@ bool Module::AddFunction(Function* function) { return true; } -void Module::AddStackFrameEntry(StackFrameEntry* stack_frame_entry) { +void Module::AddStackFrameEntry(std::unique_ptr stack_frame_entry) { if (!AddressIsInModule(stack_frame_entry->address)) { return; } - stack_frame_entries_.push_back(stack_frame_entry); + stack_frame_entries_.push_back(std::move(stack_frame_entry)); } -void Module::AddExtern(Extern* ext) { +void Module::AddExtern(std::unique_ptr ext) { if (!AddressIsInModule(ext->address)) { return; } - std::pair ret = externs_.insert(ext); - if (!ret.second) { - // Free the duplicate that was not inserted because this Module - // now owns it. - delete ext; + std::pair ret = externs_.emplace(std::move(ext)); + if (!ret.second && enable_multiple_field_) { + (*ret.first)->is_multiple = true; } } @@ -202,7 +236,11 @@ void Module::GetFunctions(vector* vec, void Module::GetExterns(vector* vec, vector::iterator i) { - vec->insert(i, externs_.begin(), externs_.end()); + auto pos = vec->insert(i, externs_.size(), nullptr); + for (const std::unique_ptr& ext : externs_) { + *pos = ext.get(); + ++pos; + } } Module::File* Module::FindFile(const string& name) { @@ -244,11 +282,14 @@ void Module::GetFiles(vector* vec) { } void Module::GetStackFrameEntries(vector* vec) const { - *vec = stack_frame_entries_; + vec->clear(); + vec->reserve(stack_frame_entries_.size()); + for (const auto& ent : stack_frame_entries_) { + vec->push_back(ent.get()); + } } -void Module::AssignSourceIds( - set& inline_origins) { +void Module::AssignSourceIds() { // First, give every source file an id of -1. for (FileByNameMap::iterator file_it = files_.begin(); file_it != files_.end(); ++file_it) { @@ -352,7 +393,7 @@ bool Module::Write(std::ostream& stream, SymbolData symbol_data) { // Get all referenced inline origins. set inline_origins; CreateInlineOrigins(inline_origins); - AssignSourceIds(inline_origins); + AssignSourceIds(); // Write out files. for (FileByNameMap::iterator file_it = files_.begin(); @@ -378,11 +419,10 @@ bool Module::Write(std::ostream& stream, SymbolData symbol_data) { vector::iterator line_it = func->lines.begin(); for (auto range_it = func->ranges.cbegin(); range_it != func->ranges.cend(); ++range_it) { - stream << "FUNC " << hex - << (range_it->address - load_address_) << " " - << range_it->size << " " - << func->parameter_size << " " - << func->name << dec << "\n"; + stream << "FUNC " << (func->is_multiple ? "m " : "") << hex + << (range_it->address - load_address_) << " " << range_it->size + << " " << func->parameter_size << " " << func->name << dec + << "\n"; if (!stream.good()) return ReportError(); @@ -421,19 +461,18 @@ bool Module::Write(std::ostream& stream, SymbolData symbol_data) { // Write out 'PUBLIC' records. for (ExternSet::const_iterator extern_it = externs_.begin(); extern_it != externs_.end(); ++extern_it) { - Extern* ext = *extern_it; - stream << "PUBLIC " << hex - << (ext->address - load_address_) << " 0 " - << ext->name << dec << "\n"; + Extern* ext = extern_it->get(); + stream << "PUBLIC " << (ext->is_multiple ? "m " : "") << hex + << (ext->address - load_address_) << " 0 " << ext->name << dec + << "\n"; } } if (symbol_data & CFI) { // Write out 'STACK CFI INIT' and 'STACK CFI' records. - vector::const_iterator frame_it; - for (frame_it = stack_frame_entries_.begin(); + for (auto frame_it = stack_frame_entries_.begin(); frame_it != stack_frame_entries_.end(); ++frame_it) { - StackFrameEntry* entry = *frame_it; + StackFrameEntry* entry = frame_it->get(); stream << "STACK CFI INIT " << hex << (entry->address - load_address_) << " " << entry->size << " " << dec; diff --git a/shared/sentry/external/breakpad/src/common/module.h b/shared/sentry/src/external/breakpad/src/common/module.h similarity index 87% rename from shared/sentry/external/breakpad/src/common/module.h rename to shared/sentry/src/external/breakpad/src/common/module.h index 05bdbfb72..28e8e9c50 100644 --- a/shared/sentry/external/breakpad/src/common/module.h +++ b/shared/sentry/src/external/breakpad/src/common/module.h @@ -128,6 +128,13 @@ class Module { // Inlined call sites belonging to this functions. vector> inlines; + + // If this symbol has been folded with other symbols in the linked binary. + bool is_multiple = false; + + // If the function's name should be filled out from a matching Extern, + // should they not match. + bool prefer_extern_name = false; }; struct InlineOrigin { @@ -139,10 +146,6 @@ class Module { // The inlined function's name. StringView name; - - File* file; - - int getFileID() const { return file ? file->source_id : -1; } }; // A inlined call site. @@ -221,7 +224,7 @@ class Module { map references_; }; - InlineOriginMap inline_origin_map; + map inline_origin_maps; // A source line. struct Line { @@ -241,6 +244,8 @@ class Module { explicit Extern(const Address& address_input) : address(address_input) {} const Address address; string name; + // If this symbol has been folded with other symbols in the linked binary. + bool is_multiple = false; }; // A map from register names to postfix expressions that recover @@ -287,15 +292,33 @@ class Module { }; struct ExternCompare { - bool operator() (const Extern* lhs, const Extern* rhs) const { + // Defining is_transparent allows + // std::set, ExternCompare>::find() to be called + // with an Extern* and have set use the overloads below. + using is_transparent = void; + bool operator() (const std::unique_ptr& lhs, + const std::unique_ptr& rhs) const { + return lhs->address < rhs->address; + } + bool operator() (const Extern* lhs, const std::unique_ptr& rhs) const { + return lhs->address < rhs->address; + } + bool operator() (const std::unique_ptr& lhs, const Extern* rhs) const { return lhs->address < rhs->address; } }; // Create a new module with the given name, operating system, // architecture, and ID string. - Module(const string& name, const string& os, const string& architecture, - const string& id, const string& code_id = ""); + // NB: `enable_multiple_field` is temporary while transitioning to enabling + // writing the multiple field permanently. + Module(const string& name, + const string& os, + const string& architecture, + const string& id, + const string& code_id = "", + bool enable_multiple_field = false, + bool prefer_extern_name = false); ~Module(); // Set the module's load address to LOAD_ADDRESS; addresses given @@ -329,12 +352,12 @@ class Module { // Add STACK_FRAME_ENTRY to the module. // This module owns all StackFrameEntry objects added with this // function: destroying the module destroys them as well. - void AddStackFrameEntry(StackFrameEntry* stack_frame_entry); + void AddStackFrameEntry(std::unique_ptr stack_frame_entry); // Add PUBLIC to the module. // This module owns all Extern objects added with this function: // destroying the module destroys them as well. - void AddExtern(Extern* ext); + void AddExtern(std::unique_ptr ext); // If this module has a file named NAME, return a pointer to it. If // it has none, then create one and return a pointer to the new @@ -380,7 +403,7 @@ class Module { // Set the source id numbers for all other files --- unused by the // source line data --- to -1. We do this before writing out the // symbol file, at which point we omit any unused files. - void AssignSourceIds(set& inline_origins); + void AssignSourceIds(); // This function should be called before AssignSourceIds() to get the set of // valid InlineOrigins*. @@ -454,23 +477,41 @@ class Module { typedef set FunctionSet; // A set containing Extern structures, sorted by address. - typedef set ExternSet; + typedef set, ExternCompare> ExternSet; // The module owns all the files and functions that have been added // to it; destroying the module frees the Files and Functions these // point to. FileByNameMap files_; // This module's source files. FunctionSet functions_; // This module's functions. + // Used to quickly look up whether a function exists at a particular address. + unordered_set

function_addresses_; // The module owns all the call frame info entries that have been // added to it. - vector stack_frame_entries_; + vector> stack_frame_entries_; // The module owns all the externs that have been added to it; // destroying the module frees the Externs these point to. ExternSet externs_; unordered_set common_strings_; + + // Whether symbols sharing an address should be collapsed into a single entry + // and marked with an `m` in the output. See + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=751 and docs + // at + // https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md#records-3 + bool enable_multiple_field_; + + // If a Function and an Extern share the same address but have a different + // name, prefer the name of the Extern. + // + // Use this when dumping Mach-O .dSYMs built with -gmlt (Minimum Line Tables), + // as the Function's fully-qualified name will only be present in the STABS + // (which are placed in the Extern), not in the DWARF symbols (which are + // placed in the Function). + bool prefer_extern_name_; }; } // namespace google_breakpad diff --git a/shared/sentry/external/breakpad/src/common/module_unittest.cc b/shared/sentry/src/external/breakpad/src/common/module_unittest.cc similarity index 78% rename from shared/sentry/external/breakpad/src/common/module_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/module_unittest.cc index 5b44f97ca..c51162e52 100644 --- a/shared/sentry/external/breakpad/src/common/module_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/module_unittest.cc @@ -30,14 +30,20 @@ // module_unittest.cc: Unit tests for google_breakpad::Module. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include #include #include +#include #include #include +#include #include "breakpad_googletest_includes.h" #include "common/module.h" @@ -137,7 +143,7 @@ TEST(Module, WriteRelativeLoadAddress) { m.AddFunction(function); // Some stack information. - Module::StackFrameEntry* entry = new Module::StackFrameEntry(); + auto entry = std::make_unique(); entry->address = 0x30f9e5c83323973dULL; entry->size = 0x49fc9ca7c7c13dc2ULL; entry->initial_rules[".cfa"] = "he was a handsome man"; @@ -145,7 +151,7 @@ TEST(Module, WriteRelativeLoadAddress) { entry->rule_changes[0x30f9e5c83323973eULL]["how"] = "do you like your blueeyed boy"; entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death"; - m.AddStackFrameEntry(entry); + m.AddStackFrameEntry(std::move(entry)); // Set the load address. Doing this after adding all the data to // the module must work fine. @@ -192,9 +198,7 @@ TEST(Module, WriteOmitUnusedFiles) { function->lines.push_back(line1); function->lines.push_back(line2); m.AddFunction(function); - - std::set inline_origins; - m.AssignSourceIds(inline_origins); + m.AssignSourceIds(); vector vec; m.GetFiles(&vec); @@ -242,7 +246,7 @@ TEST(Module, WriteNoCFI) { m.AddFunction(function); // Some stack information. - Module::StackFrameEntry* entry = new Module::StackFrameEntry(); + auto entry = std::make_unique(); entry->address = 0x30f9e5c83323973dULL; entry->size = 0x49fc9ca7c7c13dc2ULL; entry->initial_rules[".cfa"] = "he was a handsome man"; @@ -250,7 +254,7 @@ TEST(Module, WriteNoCFI) { entry->rule_changes[0x30f9e5c83323973eULL]["how"] = "do you like your blueeyed boy"; entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death"; - m.AddStackFrameEntry(entry); + m.AddStackFrameEntry(std::move(entry)); // Set the load address. Doing this after adding all the data to // the module must work fine. @@ -321,18 +325,18 @@ TEST(Module, WriteOutOfRangeAddresses) { // Add three stack frames (one lower, one in, and one higher than the allowed // address range). Only the middle frame should be captured. - Module::StackFrameEntry* entry1 = new Module::StackFrameEntry(); + auto entry1 = std::make_unique(); entry1->address = 0x1000ULL; entry1->size = 0x100ULL; - m.AddStackFrameEntry(entry1); - Module::StackFrameEntry* entry2 = new Module::StackFrameEntry(); + m.AddStackFrameEntry(std::move(entry1)); + auto entry2 = std::make_unique(); entry2->address = 0x2000ULL; entry2->size = 0x100ULL; - m.AddStackFrameEntry(entry2); - Module::StackFrameEntry* entry3 = new Module::StackFrameEntry(); + m.AddStackFrameEntry(std::move(entry2)); + auto entry3 = std::make_unique(); entry3->address = 0x3000ULL; entry3->size = 0x100ULL; - m.AddStackFrameEntry(entry3); + m.AddStackFrameEntry(std::move(entry3)); // Add a function outside the allowed range. Module::File* file = m.FindFile("file_name.cc"); @@ -346,9 +350,9 @@ TEST(Module, WriteOutOfRangeAddresses) { m.AddFunction(function); // Add an extern outside the allowed range. - Module::Extern* extern1 = new Module::Extern(0x5000ULL); + auto extern1 = std::make_unique(0x5000ULL); extern1->name = "_xyz"; - m.AddExtern(extern1); + m.AddExtern(std::move(extern1)); m.Write(s, ALL_SYMBOL_DATA); @@ -357,10 +361,7 @@ TEST(Module, WriteOutOfRangeAddresses) { s.str().c_str()); // Cleanup - Prevent Memory Leak errors. - delete (extern1); delete (function); - delete (entry3); - delete (entry1); } TEST(Module, ConstructAddFrames) { @@ -368,22 +369,22 @@ TEST(Module, ConstructAddFrames) { Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); // First STACK CFI entry, with no initial rules or deltas. - Module::StackFrameEntry* entry1 = new Module::StackFrameEntry(); + auto entry1 = std::make_unique(); entry1->address = 0xddb5f41285aa7757ULL; entry1->size = 0x1486493370dc5073ULL; - m.AddStackFrameEntry(entry1); + m.AddStackFrameEntry(std::move(entry1)); // Second STACK CFI entry, with initial rules but no deltas. - Module::StackFrameEntry* entry2 = new Module::StackFrameEntry(); + auto entry2 = std::make_unique(); entry2->address = 0x8064f3af5e067e38ULL; entry2->size = 0x0de2a5ee55509407ULL; entry2->initial_rules[".cfa"] = "I think that I shall never see"; entry2->initial_rules["stromboli"] = "a poem lovely as a tree"; entry2->initial_rules["cannoli"] = "a tree whose hungry mouth is prest"; - m.AddStackFrameEntry(entry2); + m.AddStackFrameEntry(std::move(entry2)); // Third STACK CFI entry, with initial rules and deltas. - Module::StackFrameEntry* entry3 = new Module::StackFrameEntry(); + auto entry3 = std::make_unique(); entry3->address = 0x5e8d0db0a7075c6cULL; entry3->size = 0x1c7edb12a7aea229ULL; entry3->initial_rules[".cfa"] = "Whose woods are these"; @@ -395,7 +396,7 @@ TEST(Module, ConstructAddFrames) { "his house is in"; entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] = "I think I know"; - m.AddStackFrameEntry(entry3); + m.AddStackFrameEntry(std::move(entry3)); // Check that Write writes STACK CFI records properly. m.Write(s, ALL_SYMBOL_DATA); @@ -506,6 +507,34 @@ TEST(Module, ConstructFunctionsWithSameAddress) { contents.c_str()); } +// If multiple fields are enabled, only one function is included per address. +// The entry will be tagged with `m` to show that there are multiple symbols +// at that address. +// TODO(lgrey): Remove the non-multiple versions of these tests and remove the +// suffixes from the suffxed ones when removing `enable_multiple_field_`. +TEST(Module, ConstructFunctionsWithSameAddressMultiple) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", true); + + // Two functions. + Module::Function* function1 = generate_duplicate_function("_without_form"); + Module::Function* function2 = generate_duplicate_function("_and_void"); + + m.AddFunction(function1); + // If this succeeds, we'll have a double-free with the `delete` below. Avoid + // that. + ASSERT_FALSE(m.AddFunction(function2)); + delete function2; + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ( + "MODULE os-name architecture id-string name with spaces\n" + "FUNC m d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99" + " _without_form\n", + contents.c_str()); +} + // Externs should be written out as PUBLIC records, sorted by // address. TEST(Module, ConstructExterns) { @@ -513,13 +542,13 @@ TEST(Module, ConstructExterns) { Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); // Two externs. - Module::Extern* extern1 = new Module::Extern(0xffff); + auto extern1 = std::make_unique(0xffff); extern1->name = "_abc"; - Module::Extern* extern2 = new Module::Extern(0xaaaa); + auto extern2 = std::make_unique(0xaaaa); extern2->name = "_xyz"; - m.AddExtern(extern1); - m.AddExtern(extern2); + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); m.Write(s, ALL_SYMBOL_DATA); string contents = s.str(); @@ -538,13 +567,13 @@ TEST(Module, ConstructDuplicateExterns) { Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); // Two externs. - Module::Extern* extern1 = new Module::Extern(0xffff); + auto extern1 = std::make_unique(0xffff); extern1->name = "_xyz"; - Module::Extern* extern2 = new Module::Extern(0xffff); + auto extern2 = std::make_unique(0xffff); extern2->name = "_abc"; - m.AddExtern(extern1); - m.AddExtern(extern2); + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); m.Write(s, ALL_SYMBOL_DATA); string contents = s.str(); @@ -554,6 +583,29 @@ TEST(Module, ConstructDuplicateExterns) { "PUBLIC ffff 0 _xyz\n", contents.c_str()); } +// Externs with the same address have the `m` tag if the multiple field are +// enabled. +TEST(Module, ConstructDuplicateExternsMultiple) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", true); + + // Two externs. + auto extern1 = std::make_unique(0xffff); + extern1->name = "_xyz"; + auto extern2 = std::make_unique(0xffff); + extern2->name = "_abc"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " MODULE_ID " " MODULE_NAME + "\n" + "PUBLIC m ffff 0 _xyz\n", + contents.c_str()); +} // If there exists an extern and a function at the same address, only write // out the FUNC entry. @@ -562,13 +614,13 @@ TEST(Module, ConstructFunctionsAndExternsWithSameAddress) { Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); // Two externs. - Module::Extern* extern1 = new Module::Extern(0xabc0); + auto extern1 = std::make_unique(0xabc0); extern1->name = "abc"; - Module::Extern* extern2 = new Module::Extern(0xfff0); + auto extern2 = std::make_unique(0xfff0); extern2->name = "xyz"; - m.AddExtern(extern1); - m.AddExtern(extern2); + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); Module::Function* function = new Module::Function("_xyz", 0xfff0); Module::Range range(0xfff0, 0x10); @@ -586,6 +638,68 @@ TEST(Module, ConstructFunctionsAndExternsWithSameAddress) { contents.c_str()); } +// If there exists an extern and a function at the same address, only write +// out the FUNC entry. +TEST(Module, ConstructFunctionsAndExternsWithSameAddressPreferExternName) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", false, true); + + // Two externs. + auto extern1 = std::make_unique(0xabc0); + extern1->name = "extern1"; + auto extern2 = std::make_unique(0xfff0); + extern2->name = "extern2"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + Module::Function* function = new Module::Function("function2", 0xfff0); + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); + function->parameter_size = 0; + m.AddFunction(function); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " MODULE_ID " " MODULE_NAME + "\n" + "FUNC fff0 10 0 extern2\n" + "PUBLIC abc0 0 extern1\n", + contents.c_str()); +} + +// If there exists an extern and a function at the same address, only write +// out the FUNC entry, and mark it with `m` if the multiple field is enabled. +TEST(Module, ConstructFunctionsAndExternsWithSameAddressMultiple) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", true); + + // Two externs. + auto extern1 = std::make_unique(0xabc0); + extern1->name = "abc"; + auto extern2 = std::make_unique(0xfff0); + extern2->name = "xyz"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + Module::Function* function = new Module::Function("_xyz", 0xfff0); + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); + function->parameter_size = 0; + m.AddFunction(function); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " MODULE_ID " " MODULE_NAME + "\n" + "FUNC m fff0 10 0 _xyz\n" + "PUBLIC abc0 0 abc\n", + contents.c_str()); +} + // If there exists an extern and a function at the same address, only write // out the FUNC entry. For ARM THUMB, the extern that comes from the ELF // symbol section has bit 0 set. @@ -594,17 +708,17 @@ TEST(Module, ConstructFunctionsAndThumbExternsWithSameAddress) { Module m(MODULE_NAME, MODULE_OS, "arm", MODULE_ID); // Two THUMB externs. - Module::Extern* thumb_extern1 = new Module::Extern(0xabc1); + auto thumb_extern1 = std::make_unique(0xabc1); thumb_extern1->name = "thumb_abc"; - Module::Extern* thumb_extern2 = new Module::Extern(0xfff1); + auto thumb_extern2 = std::make_unique(0xfff1); thumb_extern2->name = "thumb_xyz"; - Module::Extern* arm_extern1 = new Module::Extern(0xcc00); + auto arm_extern1 = std::make_unique(0xcc00); arm_extern1->name = "arm_func"; - m.AddExtern(thumb_extern1); - m.AddExtern(thumb_extern2); - m.AddExtern(arm_extern1); + m.AddExtern(std::move(thumb_extern1)); + m.AddExtern(std::move(thumb_extern2)); + m.AddExtern(std::move(arm_extern1)); // The corresponding function from the DWARF debug data have the actual // address. diff --git a/shared/sentry/external/breakpad/src/common/path_helper.cc b/shared/sentry/src/external/breakpad/src/common/path_helper.cc similarity index 96% rename from shared/sentry/external/breakpad/src/common/path_helper.cc rename to shared/sentry/src/external/breakpad/src/common/path_helper.cc index e51a1b681..fbbcfca31 100644 --- a/shared/sentry/external/breakpad/src/common/path_helper.cc +++ b/shared/sentry/src/external/breakpad/src/common/path_helper.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/path_helper.h" #include diff --git a/shared/sentry/external/breakpad/src/common/path_helper.h b/shared/sentry/src/external/breakpad/src/common/path_helper.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/path_helper.h rename to shared/sentry/src/external/breakpad/src/common/path_helper.h diff --git a/shared/sentry/external/breakpad/src/common/safe_math.h b/shared/sentry/src/external/breakpad/src/common/safe_math.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/safe_math.h rename to shared/sentry/src/external/breakpad/src/common/safe_math.h diff --git a/shared/sentry/external/breakpad/src/common/safe_math_unittest.cc b/shared/sentry/src/external/breakpad/src/common/safe_math_unittest.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/safe_math_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/safe_math_unittest.cc index 1908155d4..453afbe03 100644 --- a/shared/sentry/external/breakpad/src/common/safe_math_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/safe_math_unittest.cc @@ -28,6 +28,10 @@ // safe_math_unittest.cc: Unit tests for SafeMath +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "safe_math.h" #include "breakpad_googletest_includes.h" diff --git a/shared/sentry/external/breakpad/src/common/scoped_ptr.h b/shared/sentry/src/external/breakpad/src/common/scoped_ptr.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/scoped_ptr.h rename to shared/sentry/src/external/breakpad/src/common/scoped_ptr.h diff --git a/shared/sentry/external/breakpad/src/common/simple_string_dictionary.cc b/shared/sentry/src/external/breakpad/src/common/simple_string_dictionary.cc similarity index 96% rename from shared/sentry/external/breakpad/src/common/simple_string_dictionary.cc rename to shared/sentry/src/external/breakpad/src/common/simple_string_dictionary.cc index 682888978..d3e09b8fc 100644 --- a/shared/sentry/external/breakpad/src/common/simple_string_dictionary.cc +++ b/shared/sentry/src/external/breakpad/src/common/simple_string_dictionary.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/simple_string_dictionary.h" namespace google_breakpad { diff --git a/shared/sentry/external/breakpad/src/common/simple_string_dictionary.h b/shared/sentry/src/external/breakpad/src/common/simple_string_dictionary.h similarity index 98% rename from shared/sentry/external/breakpad/src/common/simple_string_dictionary.h rename to shared/sentry/src/external/breakpad/src/common/simple_string_dictionary.h index f7253a34e..166d56c8d 100644 --- a/shared/sentry/external/breakpad/src/common/simple_string_dictionary.h +++ b/shared/sentry/src/external/breakpad/src/common/simple_string_dictionary.h @@ -32,8 +32,6 @@ #include #include -#include "common/basictypes.h" - namespace google_breakpad { // Opaque type for the serialized representation of a NonAllocatingMap. One is @@ -80,6 +78,8 @@ class NonAllocatingMap { : map_(map), current_(0) { } + Iterator(const Iterator&) = delete; + void operator=(const Iterator&) = delete; // Returns the next entry in the map, or NULL if at the end of the // collection. @@ -90,14 +90,12 @@ class NonAllocatingMap { return entry; } } - return NULL; + return nullptr; } private: const NonAllocatingMap& map_; size_t current_; - - DISALLOW_COPY_AND_ASSIGN(Iterator); }; NonAllocatingMap() : entries_() { diff --git a/shared/sentry/external/breakpad/src/common/simple_string_dictionary_unittest.cc b/shared/sentry/src/external/breakpad/src/common/simple_string_dictionary_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/simple_string_dictionary_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/simple_string_dictionary_unittest.cc index 4f3f1f5c3..b4dd7fe90 100644 --- a/shared/sentry/external/breakpad/src/common/simple_string_dictionary_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/simple_string_dictionary_unittest.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "breakpad_googletest_includes.h" #include "common/simple_string_dictionary.h" diff --git a/shared/sentry/external/breakpad/src/common/solaris/dump_symbols.cc b/shared/sentry/src/external/breakpad/src/common/solaris/dump_symbols.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/solaris/dump_symbols.cc rename to shared/sentry/src/external/breakpad/src/common/solaris/dump_symbols.cc index 8277fd661..09e5b376b 100644 --- a/shared/sentry/external/breakpad/src/common/solaris/dump_symbols.cc +++ b/shared/sentry/src/external/breakpad/src/common/solaris/dump_symbols.cc @@ -28,6 +28,10 @@ // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/solaris/dump_symbols.h b/shared/sentry/src/external/breakpad/src/common/solaris/dump_symbols.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/solaris/dump_symbols.h rename to shared/sentry/src/external/breakpad/src/common/solaris/dump_symbols.h diff --git a/shared/sentry/external/breakpad/src/common/solaris/file_id.cc b/shared/sentry/src/external/breakpad/src/common/solaris/file_id.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/solaris/file_id.cc rename to shared/sentry/src/external/breakpad/src/common/solaris/file_id.cc index 53d205b67..5a9982bb4 100644 --- a/shared/sentry/external/breakpad/src/common/solaris/file_id.cc +++ b/shared/sentry/src/external/breakpad/src/common/solaris/file_id.cc @@ -32,6 +32,10 @@ // // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/solaris/file_id.h b/shared/sentry/src/external/breakpad/src/common/solaris/file_id.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/solaris/file_id.h rename to shared/sentry/src/external/breakpad/src/common/solaris/file_id.h diff --git a/shared/sentry/external/breakpad/src/common/solaris/guid_creator.cc b/shared/sentry/src/external/breakpad/src/common/solaris/guid_creator.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/solaris/guid_creator.cc rename to shared/sentry/src/external/breakpad/src/common/solaris/guid_creator.cc index 4802f5a74..998d24991 100644 --- a/shared/sentry/external/breakpad/src/common/solaris/guid_creator.cc +++ b/shared/sentry/src/external/breakpad/src/common/solaris/guid_creator.cc @@ -28,6 +28,10 @@ // Author: Alfred Peng +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/solaris/guid_creator.h b/shared/sentry/src/external/breakpad/src/common/solaris/guid_creator.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/solaris/guid_creator.h rename to shared/sentry/src/external/breakpad/src/common/solaris/guid_creator.h diff --git a/shared/sentry/external/breakpad/src/common/solaris/message_output.h b/shared/sentry/src/external/breakpad/src/common/solaris/message_output.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/solaris/message_output.h rename to shared/sentry/src/external/breakpad/src/common/solaris/message_output.h diff --git a/shared/sentry/external/breakpad/src/common/stabs_reader.cc b/shared/sentry/src/external/breakpad/src/common/stabs_reader.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/stabs_reader.cc rename to shared/sentry/src/external/breakpad/src/common/stabs_reader.cc index 30118830a..e18780c9d 100644 --- a/shared/sentry/external/breakpad/src/common/stabs_reader.cc +++ b/shared/sentry/src/external/breakpad/src/common/stabs_reader.cc @@ -31,6 +31,10 @@ // This file implements the google_breakpad::StabsReader class. // See stabs_reader.h. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/stabs_reader.h" #include diff --git a/shared/sentry/external/breakpad/src/common/stabs_reader.h b/shared/sentry/src/external/breakpad/src/common/stabs_reader.h similarity index 99% rename from shared/sentry/external/breakpad/src/common/stabs_reader.h rename to shared/sentry/src/external/breakpad/src/common/stabs_reader.h index 3f5f0a8f2..655683f12 100644 --- a/shared/sentry/external/breakpad/src/common/stabs_reader.h +++ b/shared/sentry/src/external/breakpad/src/common/stabs_reader.h @@ -49,10 +49,6 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - #ifdef HAVE_MACH_O_NLIST_H #include #elif defined(HAVE_A_OUT_H) diff --git a/shared/sentry/external/breakpad/src/common/stabs_reader_unittest.cc b/shared/sentry/src/external/breakpad/src/common/stabs_reader_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/stabs_reader_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/stabs_reader_unittest.cc index 79888815e..294e8836a 100644 --- a/shared/sentry/external/breakpad/src/common/stabs_reader_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/stabs_reader_unittest.cc @@ -30,6 +30,10 @@ // stabs_reader_unittest.cc: Unit tests for google_breakpad::StabsReader. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/stabs_to_module.cc b/shared/sentry/src/external/breakpad/src/common/stabs_to_module.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/stabs_to_module.cc rename to shared/sentry/src/external/breakpad/src/common/stabs_to_module.cc index 6cdb96a27..f04c987ad 100644 --- a/shared/sentry/external/breakpad/src/common/stabs_to_module.cc +++ b/shared/sentry/src/external/breakpad/src/common/stabs_to_module.cc @@ -30,12 +30,18 @@ // dump_stabs.cc --- implement the StabsToModule class. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include #include #include +#include +#include #include "common/stabs_to_module.h" #include "common/using_std_string.h" @@ -132,7 +138,7 @@ bool StabsToModule::Line(uint64_t address, const char *name, int number) { } bool StabsToModule::Extern(const string& name, uint64_t address) { - Module::Extern *ext = new Module::Extern(address); + auto ext = std::make_unique(address); // Older libstdc++ demangle implementations can crash on unexpected // input, so be careful about what gets passed in. if (name.compare(0, 3, "__Z") == 0) { @@ -142,7 +148,7 @@ bool StabsToModule::Extern(const string& name, uint64_t address) { } else { ext->name = name; } - module_->AddExtern(ext); + module_->AddExtern(std::move(ext)); return true; } diff --git a/shared/sentry/external/breakpad/src/common/stabs_to_module.h b/shared/sentry/src/external/breakpad/src/common/stabs_to_module.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/stabs_to_module.h rename to shared/sentry/src/external/breakpad/src/common/stabs_to_module.h diff --git a/shared/sentry/external/breakpad/src/common/stabs_to_module_unittest.cc b/shared/sentry/src/external/breakpad/src/common/stabs_to_module_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/stabs_to_module_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/stabs_to_module_unittest.cc index 95bdb261f..c6d40281b 100644 --- a/shared/sentry/external/breakpad/src/common/stabs_to_module_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/stabs_to_module_unittest.cc @@ -30,6 +30,10 @@ // dump_stabs_unittest.cc: Unit tests for StabsToModule. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "breakpad_googletest_includes.h" diff --git a/shared/sentry/external/breakpad/src/common/stdio_wrapper.h b/shared/sentry/src/external/breakpad/src/common/stdio_wrapper.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/stdio_wrapper.h rename to shared/sentry/src/external/breakpad/src/common/stdio_wrapper.h diff --git a/shared/sentry/external/breakpad/src/common/string_conversion.cc b/shared/sentry/src/external/breakpad/src/common/string_conversion.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/string_conversion.cc rename to shared/sentry/src/external/breakpad/src/common/string_conversion.cc index 213d6ed7c..a4e64ff06 100644 --- a/shared/sentry/external/breakpad/src/common/string_conversion.cc +++ b/shared/sentry/src/external/breakpad/src/common/string_conversion.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "common/convert_UTF.h" diff --git a/shared/sentry/external/breakpad/src/common/string_conversion.h b/shared/sentry/src/external/breakpad/src/common/string_conversion.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/string_conversion.h rename to shared/sentry/src/external/breakpad/src/common/string_conversion.h diff --git a/shared/sentry/external/breakpad/src/common/string_conversion_unittest.cc b/shared/sentry/src/external/breakpad/src/common/string_conversion_unittest.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/string_conversion_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/string_conversion_unittest.cc index 2e64a9576..0f372c800 100644 --- a/shared/sentry/external/breakpad/src/common/string_conversion_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/string_conversion_unittest.cc @@ -28,6 +28,10 @@ // string_conversion_unittest.cc: Unit tests for google_breakpad::UTF* helpers. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/string_view.h b/shared/sentry/src/external/breakpad/src/common/string_view.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/string_view.h rename to shared/sentry/src/external/breakpad/src/common/string_view.h diff --git a/shared/sentry/external/breakpad/src/common/symbol_data.h b/shared/sentry/src/external/breakpad/src/common/symbol_data.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/symbol_data.h rename to shared/sentry/src/external/breakpad/src/common/symbol_data.h diff --git a/shared/sentry/external/breakpad/src/common/test_assembler.cc b/shared/sentry/src/external/breakpad/src/common/test_assembler.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/test_assembler.cc rename to shared/sentry/src/external/breakpad/src/common/test_assembler.cc index 918996638..6b1c1fd35 100644 --- a/shared/sentry/external/breakpad/src/common/test_assembler.cc +++ b/shared/sentry/src/external/breakpad/src/common/test_assembler.cc @@ -31,6 +31,10 @@ // test_assembler.cc: Implementation of google_breakpad::TestAssembler. // See test_assembler.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/test_assembler.h" #include diff --git a/shared/sentry/external/breakpad/src/common/test_assembler.h b/shared/sentry/src/external/breakpad/src/common/test_assembler.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/test_assembler.h rename to shared/sentry/src/external/breakpad/src/common/test_assembler.h diff --git a/shared/sentry/external/breakpad/src/common/test_assembler_unittest.cc b/shared/sentry/src/external/breakpad/src/common/test_assembler_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/test_assembler_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/test_assembler_unittest.cc index f16594f1d..0307fdbf4 100644 --- a/shared/sentry/external/breakpad/src/common/test_assembler_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/test_assembler_unittest.cc @@ -30,6 +30,10 @@ // test_assembler_unittest.cc: Unit tests for google_breakpad::TestAssembler. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/testdata/func-line-pairing.h b/shared/sentry/src/external/breakpad/src/common/testdata/func-line-pairing.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/testdata/func-line-pairing.h rename to shared/sentry/src/external/breakpad/src/common/testdata/func-line-pairing.h diff --git a/shared/sentry/external/breakpad/src/common/tests/auto_tempdir.h b/shared/sentry/src/external/breakpad/src/common/tests/auto_tempdir.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/tests/auto_tempdir.h rename to shared/sentry/src/external/breakpad/src/common/tests/auto_tempdir.h diff --git a/shared/sentry/external/breakpad/src/common/tests/file_utils.cc b/shared/sentry/src/external/breakpad/src/common/tests/file_utils.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/tests/file_utils.cc rename to shared/sentry/src/external/breakpad/src/common/tests/file_utils.cc index 814b2094f..84a228095 100644 --- a/shared/sentry/external/breakpad/src/common/tests/file_utils.cc +++ b/shared/sentry/src/external/breakpad/src/common/tests/file_utils.cc @@ -29,6 +29,10 @@ // file_utils.cc: Implement utility functions for file manipulation. // See file_utils.h for details. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include #include diff --git a/shared/sentry/external/breakpad/src/common/tests/file_utils.h b/shared/sentry/src/external/breakpad/src/common/tests/file_utils.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/tests/file_utils.h rename to shared/sentry/src/external/breakpad/src/common/tests/file_utils.h diff --git a/shared/sentry/external/breakpad/src/common/unordered.h b/shared/sentry/src/external/breakpad/src/common/unordered.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/unordered.h rename to shared/sentry/src/external/breakpad/src/common/unordered.h diff --git a/shared/sentry/external/breakpad/src/common/using_std_string.h b/shared/sentry/src/external/breakpad/src/common/using_std_string.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/using_std_string.h rename to shared/sentry/src/external/breakpad/src/common/using_std_string.h diff --git a/shared/sentry/external/breakpad/src/common/windows/dia_util.cc b/shared/sentry/src/external/breakpad/src/common/windows/dia_util.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/windows/dia_util.cc rename to shared/sentry/src/external/breakpad/src/common/windows/dia_util.cc index dcfe0ef97..a5d984d1a 100644 --- a/shared/sentry/external/breakpad/src/common/windows/dia_util.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/dia_util.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/windows/dia_util.h" #include diff --git a/shared/sentry/external/breakpad/src/common/windows/dia_util.h b/shared/sentry/src/external/breakpad/src/common/windows/dia_util.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/dia_util.h rename to shared/sentry/src/external/breakpad/src/common/windows/dia_util.h diff --git a/shared/sentry/external/breakpad/src/common/windows/guid_string.cc b/shared/sentry/src/external/breakpad/src/common/windows/guid_string.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/windows/guid_string.cc rename to shared/sentry/src/external/breakpad/src/common/windows/guid_string.cc index be9eb8a39..2c298c33a 100644 --- a/shared/sentry/external/breakpad/src/common/windows/guid_string.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/guid_string.cc @@ -30,6 +30,10 @@ // // See guid_string.h for documentation. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include "common/windows/string_utils-inl.h" diff --git a/shared/sentry/external/breakpad/src/common/windows/guid_string.h b/shared/sentry/src/external/breakpad/src/common/windows/guid_string.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/guid_string.h rename to shared/sentry/src/external/breakpad/src/common/windows/guid_string.h diff --git a/shared/sentry/external/breakpad/src/common/windows/http_upload.cc b/shared/sentry/src/external/breakpad/src/common/windows/http_upload.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/windows/http_upload.cc rename to shared/sentry/src/external/breakpad/src/common/windows/http_upload.cc index 093cd71d6..bd48a2339 100644 --- a/shared/sentry/external/breakpad/src/common/windows/http_upload.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/http_upload.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include // Disable exception handler warnings. @@ -390,7 +394,6 @@ namespace { if (!contents.empty()) { request_body->append(&(contents[0]), contents.size()); } - request_body->append("\r\n"); return true; } diff --git a/shared/sentry/external/breakpad/src/common/windows/http_upload.h b/shared/sentry/src/external/breakpad/src/common/windows/http_upload.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/http_upload.h rename to shared/sentry/src/external/breakpad/src/common/windows/http_upload.h diff --git a/shared/sentry/external/breakpad/src/common/windows/module_info.h b/shared/sentry/src/external/breakpad/src/common/windows/module_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/module_info.h rename to shared/sentry/src/external/breakpad/src/common/windows/module_info.h diff --git a/shared/sentry/external/breakpad/src/common/windows/omap.cc b/shared/sentry/src/external/breakpad/src/common/windows/omap.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/windows/omap.cc rename to shared/sentry/src/external/breakpad/src/common/windows/omap.cc index ad9169974..1ffcec765 100644 --- a/shared/sentry/external/breakpad/src/common/windows/omap.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/omap.cc @@ -100,6 +100,10 @@ // position) so that resolution will work as expected for translated addresses. // This is transparent to the rest of the toolchain. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/windows/omap.h" #include diff --git a/shared/sentry/external/breakpad/src/common/windows/omap.h b/shared/sentry/src/external/breakpad/src/common/windows/omap.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/omap.h rename to shared/sentry/src/external/breakpad/src/common/windows/omap.h diff --git a/shared/sentry/external/breakpad/src/common/windows/omap_internal.h b/shared/sentry/src/external/breakpad/src/common/windows/omap_internal.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/omap_internal.h rename to shared/sentry/src/external/breakpad/src/common/windows/omap_internal.h diff --git a/shared/sentry/external/breakpad/src/common/windows/omap_unittest.cc b/shared/sentry/src/external/breakpad/src/common/windows/omap_unittest.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/windows/omap_unittest.cc rename to shared/sentry/src/external/breakpad/src/common/windows/omap_unittest.cc index 841e53910..ebe0d47e3 100644 --- a/shared/sentry/external/breakpad/src/common/windows/omap_unittest.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/omap_unittest.cc @@ -28,6 +28,10 @@ // Unittests for OMAP related functions. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/windows/omap.h" #include "breakpad_googletest_includes.h" diff --git a/shared/sentry/external/breakpad/src/common/windows/pdb_source_line_writer.cc b/shared/sentry/src/external/breakpad/src/common/windows/pdb_source_line_writer.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/windows/pdb_source_line_writer.cc rename to shared/sentry/src/external/breakpad/src/common/windows/pdb_source_line_writer.cc index 800c316fb..dd80a6d25 100644 --- a/shared/sentry/external/breakpad/src/common/windows/pdb_source_line_writer.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/pdb_source_line_writer.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/windows/pdb_source_line_writer.h" #include diff --git a/shared/sentry/external/breakpad/src/common/windows/pdb_source_line_writer.h b/shared/sentry/src/external/breakpad/src/common/windows/pdb_source_line_writer.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/pdb_source_line_writer.h rename to shared/sentry/src/external/breakpad/src/common/windows/pdb_source_line_writer.h diff --git a/shared/sentry/external/breakpad/src/common/windows/pe_source_line_writer.cc b/shared/sentry/src/external/breakpad/src/common/windows/pe_source_line_writer.cc similarity index 97% rename from shared/sentry/external/breakpad/src/common/windows/pe_source_line_writer.cc rename to shared/sentry/src/external/breakpad/src/common/windows/pe_source_line_writer.cc index a568e0c75..d1d25cf43 100644 --- a/shared/sentry/external/breakpad/src/common/windows/pe_source_line_writer.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/pe_source_line_writer.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/windows/pe_source_line_writer.h" #include "common/windows/pe_util.h" diff --git a/shared/sentry/external/breakpad/src/common/windows/pe_source_line_writer.h b/shared/sentry/src/external/breakpad/src/common/windows/pe_source_line_writer.h similarity index 94% rename from shared/sentry/external/breakpad/src/common/windows/pe_source_line_writer.h rename to shared/sentry/src/external/breakpad/src/common/windows/pe_source_line_writer.h index a37481459..324663bac 100644 --- a/shared/sentry/external/breakpad/src/common/windows/pe_source_line_writer.h +++ b/shared/sentry/src/external/breakpad/src/common/windows/pe_source_line_writer.h @@ -31,7 +31,6 @@ #include -#include "common/basictypes.h" #include "common/windows/module_info.h" namespace google_breakpad { @@ -44,6 +43,8 @@ using std::wstring; class PESourceLineWriter { public: explicit PESourceLineWriter(const wstring& pe_file); + PESourceLineWriter(const PESourceLineWriter&) = delete; + void operator=(const PESourceLineWriter&) = delete; ~PESourceLineWriter(); // Writes Breakpad symbols from the pe file to |symbol_file|. @@ -58,9 +59,7 @@ class PESourceLineWriter { bool GetPEInfo(PEModuleInfo* info); private: - const wstring pe_file_; - - DISALLOW_COPY_AND_ASSIGN(PESourceLineWriter); + const wstring pe_file_; }; } // namespace google_breakpad diff --git a/shared/sentry/external/breakpad/src/common/windows/pe_util.cc b/shared/sentry/src/external/breakpad/src/common/windows/pe_util.cc similarity index 99% rename from shared/sentry/external/breakpad/src/common/windows/pe_util.cc rename to shared/sentry/src/external/breakpad/src/common/windows/pe_util.cc index 1df931051..2d4aebe79 100644 --- a/shared/sentry/external/breakpad/src/common/windows/pe_util.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/pe_util.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "pe_util.h" #include diff --git a/shared/sentry/external/breakpad/src/common/windows/pe_util.h b/shared/sentry/src/external/breakpad/src/common/windows/pe_util.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/pe_util.h rename to shared/sentry/src/external/breakpad/src/common/windows/pe_util.h diff --git a/shared/sentry/external/breakpad/src/common/windows/string_utils-inl.h b/shared/sentry/src/external/breakpad/src/common/windows/string_utils-inl.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/string_utils-inl.h rename to shared/sentry/src/external/breakpad/src/common/windows/string_utils-inl.h diff --git a/shared/sentry/external/breakpad/src/common/windows/string_utils.cc b/shared/sentry/src/external/breakpad/src/common/windows/string_utils.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/windows/string_utils.cc rename to shared/sentry/src/external/breakpad/src/common/windows/string_utils.cc index 01dca1937..1e570b525 100644 --- a/shared/sentry/external/breakpad/src/common/windows/string_utils.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/string_utils.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include #include diff --git a/shared/sentry/external/breakpad/src/common/windows/sym_upload_v2_protocol.cc b/shared/sentry/src/external/breakpad/src/common/windows/sym_upload_v2_protocol.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/windows/sym_upload_v2_protocol.cc rename to shared/sentry/src/external/breakpad/src/common/windows/sym_upload_v2_protocol.cc index f2dc660cf..450f3626b 100644 --- a/shared/sentry/external/breakpad/src/common/windows/sym_upload_v2_protocol.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/sym_upload_v2_protocol.cc @@ -26,6 +26,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/windows/sym_upload_v2_protocol.h" #include diff --git a/shared/sentry/external/breakpad/src/common/windows/sym_upload_v2_protocol.h b/shared/sentry/src/external/breakpad/src/common/windows/sym_upload_v2_protocol.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/sym_upload_v2_protocol.h rename to shared/sentry/src/external/breakpad/src/common/windows/sym_upload_v2_protocol.h diff --git a/shared/sentry/external/breakpad/src/common/windows/symbol_collector_client.cc b/shared/sentry/src/external/breakpad/src/common/windows/symbol_collector_client.cc similarity index 98% rename from shared/sentry/external/breakpad/src/common/windows/symbol_collector_client.cc rename to shared/sentry/src/external/breakpad/src/common/windows/symbol_collector_client.cc index 187b100ec..d91b702b0 100644 --- a/shared/sentry/external/breakpad/src/common/windows/symbol_collector_client.cc +++ b/shared/sentry/src/external/breakpad/src/common/windows/symbol_collector_client.cc @@ -1,3 +1,7 @@ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + #include "common/windows/symbol_collector_client.h" #include diff --git a/shared/sentry/external/breakpad/src/common/windows/symbol_collector_client.h b/shared/sentry/src/external/breakpad/src/common/windows/symbol_collector_client.h similarity index 100% rename from shared/sentry/external/breakpad/src/common/windows/symbol_collector_client.h rename to shared/sentry/src/external/breakpad/src/common/windows/symbol_collector_client.h diff --git a/shared/sentry/external/breakpad/src/config.h.in b/shared/sentry/src/external/breakpad/src/config.h.in similarity index 97% rename from shared/sentry/external/breakpad/src/config.h.in rename to shared/sentry/src/external/breakpad/src/config.h.in index 8fd7b0aa3..9a4eb0de9 100644 --- a/shared/sentry/external/breakpad/src/config.h.in +++ b/shared/sentry/src/external/breakpad/src/config.h.in @@ -21,6 +21,9 @@ /* Define to 1 if you have the `rustc_demangle' library (-lrustc_demangle). */ #undef HAVE_LIBRUSTC_DEMANGLE +/* Define to 1 if you have the `zstd' library (-lzstd). */ +#undef HAVE_LIBZSTD + /* Define to 1 if you have the `memfd_create' function. */ #undef HAVE_MEMFD_CREATE diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/breakpad_types.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/breakpad_types.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/breakpad_types.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/breakpad_types.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_amd64.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_amd64.h similarity index 99% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_amd64.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_amd64.h index 308f21ecb..be209801a 100644 --- a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_amd64.h +++ b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_amd64.h @@ -227,7 +227,7 @@ typedef struct { #define MD_CONTEXT_AMD64_ALL (MD_CONTEXT_AMD64_FULL | \ MD_CONTEXT_AMD64_SEGMENTS | \ - MD_CONTEXT_X86_DEBUG_REGISTERS) + MD_CONTEXT_AMD64_DEBUG_REGISTERS) /* CONTEXT_ALL */ diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_arm.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_arm.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_arm.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_arm.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_arm64.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_arm64.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_arm64.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_arm64.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_mips.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_mips.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_mips.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_mips.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_riscv.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_riscv.h similarity index 87% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_riscv.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_riscv.h index 94d061175..812cf5fda 100644 --- a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_riscv.h +++ b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_riscv.h @@ -39,28 +39,8 @@ #include "google_breakpad/common/breakpad_types.h" -#define MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT 32 -#if defined(__riscv) -# if __riscv_flen == 32 -typedef uint32_t riscv_fpr_size; -# elif __riscv_flen == 64 -typedef uint64_t riscv_fpr_size; -# elif __riscv_flen == 128 -typedef uint128_struct riscv_fpr_size; -# else -# error "Unexpected __riscv_flen" -# endif -#else -typedef uint32_t riscv_fpr_size; -#endif - #define MD_CONTEXT_RISCV_GPR_COUNT 32 - -typedef struct { - /* 32 floating point registers, f0 .. f31. */ - riscv_fpr_size regs[MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT]; - uint32_t fpcsr; -} MDFloatingSaveAreaRISCV; +#define MD_CONTEXT_RISCV_FPR_COUNT 32 enum MDRISCVRegisterNumbers { MD_CONTEXT_RISCV_REG_PC = 0, @@ -72,13 +52,14 @@ enum MDRISCVRegisterNumbers { * context stored in the structure. */ #define MD_CONTEXT_RISCV 0x00800000 #define MD_CONTEXT_RISCV_INTEGER (MD_CONTEXT_RISCV | 0x00000001) -#define MD_CONTEXT_RISCV_FLOATING_POINT (MD_CONTEXT_RISCV | 0x00000004) +#define MD_CONTEXT_RISCV_FLOATING_POINT (MD_CONTEXT_RISCV | 0x00000002) #define MD_CONTEXT_RISCV_FULL (MD_CONTEXT_RISCV_INTEGER | \ MD_CONTEXT_RISCV_FLOATING_POINT) typedef struct { /* Determines which fields of this struct are populated */ uint32_t context_flags; + uint32_t version; uint32_t pc; uint32_t ra; @@ -113,20 +94,24 @@ typedef struct { uint32_t t5; uint32_t t6; - MDFloatingSaveAreaRISCV float_save; + /* 32 floating point registers, f0 .. f31. Breakpad only supports RISCV32 + * with 32 bit floating point. */ + uint32_t fpregs[MD_CONTEXT_RISCV_FPR_COUNT]; + uint32_t fcsr; } MDRawContextRISCV; /* For (MDRawContextRISCV64).context_flags. These values indicate the type of * context stored in the structure. */ #define MD_CONTEXT_RISCV64 0x08000000 #define MD_CONTEXT_RISCV64_INTEGER (MD_CONTEXT_RISCV64 | 0x00000001) -#define MD_CONTEXT_RISCV64_FLOATING_POINT (MD_CONTEXT_RISCV64 | 0x00000004) +#define MD_CONTEXT_RISCV64_FLOATING_POINT (MD_CONTEXT_RISCV64 | 0x00000002) #define MD_CONTEXT_RISCV64_FULL (MD_CONTEXT_RISCV64_INTEGER | \ MD_CONTEXT_RISCV64_FLOATING_POINT) typedef struct { /* Determines which fields of this struct are populated */ uint32_t context_flags; + uint32_t version; uint64_t pc; uint64_t ra; @@ -161,7 +146,10 @@ typedef struct { uint64_t t5; uint64_t t6; - MDFloatingSaveAreaRISCV float_save; + /* 32 floating point registers, f0 .. f31. Breakpad only supports RISCV64 with + * 64 bit floating point. */ + uint64_t fpregs[MD_CONTEXT_RISCV_FPR_COUNT]; + uint32_t fcsr; } MDRawContextRISCV64; diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_sparc.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_sparc.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_sparc.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_sparc.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_x86.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_x86.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_cpu_x86.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_cpu_x86.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_fuchsia.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_fuchsia.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_fuchsia.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_fuchsia.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_linux.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_linux.h similarity index 96% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_linux.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_linux.h index 06d36fd15..a3bc000ee 100644 --- a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_linux.h +++ b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_linux.h @@ -157,6 +157,11 @@ typedef enum { MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR = 2, MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR = 3, MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR = 4, + MD_EXCEPTION_FLAG_LIN_SEGV_ACCADI = 5, + MD_EXCEPTION_FLAG_LIN_SEGV_ADIDERR = 6, + MD_EXCEPTION_FLAG_LIN_SEGV_ADIPERR = 7, + MD_EXCEPTION_FLAG_LIN_SEGV_MTEAERR = 8, + MD_EXCEPTION_FLAG_LIN_SEGV_MTESERR = 9, /* SIGBUS */ MD_EXCEPTION_FLAG_LIN_BUS_ADRALN = 1, diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_mac.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_mac.h similarity index 98% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_mac.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_mac.h index feb47079f..acfafaa0f 100644 --- a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_mac.h +++ b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_mac.h @@ -65,6 +65,10 @@ typedef enum { MD_EXCEPTION_MAC_MACH_SYSCALL = 8, /* EXC_MACH_SYSCALL */ MD_EXCEPTION_MAC_RPC_ALERT = 9, + /* EXC_RESOURCE */ + MD_EXCEPTION_MAC_RESOURCE = 11, + /* EXC_GUARD */ + MD_EXCEPTION_MAC_GUARD = 12, /* EXC_RPC_ALERT */ MD_EXCEPTION_MAC_SIMULATED = 0x43507378, /* Fake exception code used by Crashpad's SimulateCrash ('CPsx'). */ diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_ps3.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_ps3.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_ps3.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_ps3.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_solaris.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_solaris.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_solaris.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_solaris.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_win32.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_win32.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_exception_win32.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_exception_win32.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_format.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_format.h similarity index 99% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_format.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_format.h index 9edead934..959d15ba2 100644 --- a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_format.h +++ b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_format.h @@ -1096,10 +1096,23 @@ typedef struct { MDRawSimpleStringDictionaryEntry entries[0]; } MDRawSimpleStringDictionary; +typedef struct { + MDRVA name; + uint16_t type; + uint16_t reserved; + MDRVA value; +} MDRawCrashpadAnnotation; + +typedef struct { + uint32_t count; + MDRawCrashpadAnnotation objects[0]; +} MDRawCrashpadAnnotationList; + typedef struct { uint32_t version; MDLocationDescriptor list_annotations; MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */ + MDLocationDescriptor annotation_objects; /* MDRawCrashpadAnnotationList */ } MDRawModuleCrashpadInfo; typedef struct { @@ -1109,7 +1122,7 @@ typedef struct { typedef struct { uint32_t count; - MDLocationDescriptor modules[0]; /* MDRawModuleCrashpadInfoLink */ + MDRawModuleCrashpadInfoLink modules[0]; } MDRawModuleCrashpadInfoList; typedef struct { @@ -1118,6 +1131,8 @@ typedef struct { MDGUID client_id; MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */ MDLocationDescriptor module_list; /* MDRawModuleCrashpadInfoList */ + uint32_t reserved; + uint64_t address_mask; } MDRawCrashpadInfo; #if defined(_MSC_VER) diff --git a/shared/sentry/external/breakpad/src/google_breakpad/common/minidump_size.h b/shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_size.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/common/minidump_size.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/common/minidump_size.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/basic_source_line_resolver.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/basic_source_line_resolver.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/basic_source_line_resolver.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/basic_source_line_resolver.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/call_stack.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/call_stack.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/call_stack.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/call_stack.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/code_module.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/code_module.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/code_module.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/code_module.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/code_modules.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/code_modules.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/code_modules.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/code_modules.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/dump_context.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/dump_context.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/dump_context.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/dump_context.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/dump_object.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/dump_object.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/dump_object.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/dump_object.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/exception_record.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/exception_record.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/exception_record.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/exception_record.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/exploitability.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/exploitability.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/exploitability.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/exploitability.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/fast_source_line_resolver.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/fast_source_line_resolver.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/fast_source_line_resolver.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/fast_source_line_resolver.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/memory_region.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/memory_region.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/memory_region.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/memory_region.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/microdump.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/microdump.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/microdump.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/microdump.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/microdump_processor.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/microdump_processor.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/microdump_processor.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/microdump_processor.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/minidump.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/minidump.h similarity index 91% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/minidump.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/minidump.h index 54d288176..e523ab367 100644 --- a/shared/sentry/external/breakpad/src/google_breakpad/processor/minidump.h +++ b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/minidump.h @@ -89,7 +89,6 @@ #include #include -#include "common/basictypes.h" #include "common/using_std_string.h" #include "google_breakpad/processor/code_module.h" #include "google_breakpad/processor/code_modules.h" @@ -114,7 +113,7 @@ template class RangeMap; // itself. class MinidumpObject : public DumpObject { public: - virtual ~MinidumpObject() {} + virtual ~MinidumpObject() = default; protected: explicit MinidumpObject(Minidump* minidump); @@ -136,7 +135,9 @@ class MinidumpObject : public DumpObject { // same interface, and may be derived from this class. class MinidumpStream : public MinidumpObject { public: - virtual ~MinidumpStream() {} + MinidumpStream(const MinidumpStream&) = delete; + void operator=(const MinidumpStream&) = delete; + ~MinidumpStream() override = default; protected: explicit MinidumpStream(Minidump* minidump); @@ -150,8 +151,6 @@ class MinidumpStream : public MinidumpObject { // that implements MinidumpStream can compare expected_size to a // known size as an integrity check. virtual bool Read(uint32_t expected_size) = 0; - - DISALLOW_COPY_AND_ASSIGN(MinidumpStream); }; @@ -167,7 +166,9 @@ class MinidumpStream : public MinidumpObject { // user wants). class MinidumpContext : public DumpContext { public: - virtual ~MinidumpContext(); + MinidumpContext(const MinidumpContext&) = delete; + void operator=(const MinidumpContext&) = delete; + ~MinidumpContext() override; protected: explicit MinidumpContext(Minidump* minidump); @@ -192,8 +193,6 @@ class MinidumpContext : public DumpContext { // for access to data about the minidump file itself, such as whether // it should be byte-swapped. Minidump* minidump_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpContext); }; @@ -208,7 +207,7 @@ class MinidumpContext : public DumpContext { class MinidumpMemoryRegion : public MinidumpObject, public MemoryRegion { public: - virtual ~MinidumpMemoryRegion(); + ~MinidumpMemoryRegion() override; static void set_max_bytes(uint32_t max_bytes) { max_bytes_ = max_bytes; } static uint32_t max_bytes() { return max_bytes_; } @@ -219,22 +218,22 @@ class MinidumpMemoryRegion : public MinidumpObject, const uint8_t* GetMemory() const; // The address of the base of the memory region. - uint64_t GetBase() const; + uint64_t GetBase() const override; // The size, in bytes, of the memory region. - uint32_t GetSize() const; + uint32_t GetSize() const override; // Frees the cached memory region, if cached. void FreeMemory(); // Obtains the value of memory at the pointer specified by address. - bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const; - bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const; - bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const; - bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const; + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const override; // Print a human-readable representation of the object to stdout. - void Print() const; + void Print() const override; void SetPrintMode(bool hexdump, unsigned int width); protected: @@ -277,9 +276,9 @@ class MinidumpMemoryRegion : public MinidumpObject, // contain a memory region or context. class MinidumpThread : public MinidumpObject { public: - virtual ~MinidumpThread(); + ~MinidumpThread() override; - const MDRawThread* thread() const { return valid_ ? &thread_ : NULL; } + const MDRawThread* thread() const { return valid_ ? &thread_ : nullptr; } // GetMemory may return NULL even if the MinidumpThread is valid, // if the thread memory cannot be read. virtual MinidumpMemoryRegion* GetMemory(); @@ -322,7 +321,9 @@ class MinidumpThread : public MinidumpObject { // a process. class MinidumpThreadList : public MinidumpStream { public: - virtual ~MinidumpThreadList(); + MinidumpThreadList(const MinidumpThreadList&) = delete; + void operator=(const MinidumpThreadList&) = delete; + ~MinidumpThreadList() override; static void set_max_threads(uint32_t max_threads) { max_threads_ = max_threads; @@ -364,18 +365,16 @@ class MinidumpThreadList : public MinidumpStream { // The list of threads. MinidumpThreads* threads_; - uint32_t thread_count_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpThreadList); + uint32_t thread_count_; }; // MinidumpThreadName contains the name of a thread. class MinidumpThreadName : public MinidumpObject { public: - virtual ~MinidumpThreadName(); + ~MinidumpThreadName() override; const MDRawThreadName* thread_name() const { - return valid_ ? &thread_name_ : NULL; + return valid_ ? &thread_name_ : nullptr; } // Gets the thread ID. @@ -419,7 +418,9 @@ class MinidumpThreadName : public MinidumpObject { // MinidumpThreadNames) in a process. class MinidumpThreadNameList : public MinidumpStream { public: - virtual ~MinidumpThreadNameList(); + MinidumpThreadNameList(const MinidumpThreadNameList&) = delete; + void operator=(const MinidumpThreadNameList&) = delete; + ~MinidumpThreadNameList() override; virtual unsigned int thread_name_count() const { return valid_ ? thread_name_count_ : 0; @@ -446,8 +447,6 @@ class MinidumpThreadNameList : public MinidumpStream { // The list of thread names. MinidumpThreadNames* thread_names_; uint32_t thread_name_count_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpThreadNameList); }; // MinidumpModule wraps MDRawModule, which contains information about loaded @@ -457,7 +456,7 @@ class MinidumpThreadNameList : public MinidumpStream { class MinidumpModule : public MinidumpObject, public CodeModule { public: - virtual ~MinidumpModule(); + ~MinidumpModule() override; static void set_max_cv_bytes(uint32_t max_cv_bytes) { max_cv_bytes_ = max_cv_bytes; @@ -469,27 +468,27 @@ class MinidumpModule : public MinidumpObject, } static uint32_t max_misc_bytes() { return max_misc_bytes_; } - const MDRawModule* module() const { return valid_ ? &module_ : NULL; } + const MDRawModule* module() const { return valid_ ? &module_ : nullptr; } // CodeModule implementation - virtual uint64_t base_address() const { + uint64_t base_address() const override { return valid_ ? module_.base_of_image : static_cast(-1); } - virtual uint64_t size() const { return valid_ ? module_.size_of_image : 0; } - virtual string code_file() const; - virtual string code_identifier() const; - virtual string debug_file() const; - virtual string debug_identifier() const; - virtual string version() const; - virtual CodeModule* Copy() const; - virtual bool is_unloaded() const { return false; } + uint64_t size() const override { return valid_ ? module_.size_of_image : 0; } + string code_file() const override; + string code_identifier() const override; + string debug_file() const override; + string debug_identifier() const override; + string version() const override; + CodeModule* Copy() const override; + bool is_unloaded() const override { return false; } // Getter and setter for shrink_down_delta. This is used when the address // range for a module is shrunk down due to address range conflicts with // other modules. The base_address and size fields are not updated and they // should always reflect the original values (reported in the minidump). - virtual uint64_t shrink_down_delta() const; - virtual void SetShrinkDownDelta(uint64_t shrink_down_delta); + uint64_t shrink_down_delta() const override; + void SetShrinkDownDelta(uint64_t shrink_down_delta) override; // The CodeView record, which contains information to locate the module's // debugging information (pdb). This is returned as uint8_t* because @@ -580,7 +579,9 @@ class MinidumpModule : public MinidumpObject, class MinidumpModuleList : public MinidumpStream, public CodeModules { public: - virtual ~MinidumpModuleList(); + MinidumpModuleList(const MinidumpModuleList&) = delete; + void operator=(const MinidumpModuleList&) = delete; + ~MinidumpModuleList() override; static void set_max_modules(uint32_t max_modules) { max_modules_ = max_modules; @@ -588,19 +589,19 @@ class MinidumpModuleList : public MinidumpStream, static uint32_t max_modules() { return max_modules_; } // CodeModules implementation. - virtual unsigned int module_count() const { + unsigned int module_count() const override { return valid_ ? module_count_ : 0; } - virtual const MinidumpModule* GetModuleForAddress(uint64_t address) const; - virtual const MinidumpModule* GetMainModule() const; - virtual const MinidumpModule* GetModuleAtSequence( - unsigned int sequence) const; - virtual const MinidumpModule* GetModuleAtIndex(unsigned int index) const; - virtual const CodeModules* Copy() const; + const MinidumpModule* GetModuleForAddress(uint64_t address) const override; + const MinidumpModule* GetMainModule() const override; + const MinidumpModule* GetModuleAtSequence( + unsigned int sequence) const override; + const MinidumpModule* GetModuleAtIndex(unsigned int index) const override; + const CodeModules* Copy() const override; // Returns a vector of all modules which address ranges needed to be shrunk // down due to address range conflicts with other modules. - virtual vector > GetShrunkRangeModules() const; + vector> GetShrunkRangeModules() const override; // Print a human-readable representation of the object to stdout. void Print(); @@ -615,7 +616,7 @@ class MinidumpModuleList : public MinidumpStream, static const uint32_t kStreamType = MD_MODULE_LIST_STREAM; - bool Read(uint32_t expected_size); + bool Read(uint32_t expected_size) override; bool StoreRange(const MinidumpModule& module, uint64_t base_address, @@ -632,8 +633,6 @@ class MinidumpModuleList : public MinidumpStream, MinidumpModules* modules_; uint32_t module_count_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleList); }; @@ -648,7 +647,9 @@ class MinidumpModuleList : public MinidumpStream, // memory minidumps contain all of a process' mapped memory. class MinidumpMemoryList : public MinidumpStream { public: - virtual ~MinidumpMemoryList(); + MinidumpMemoryList(const MinidumpMemoryList&) = delete; + void operator=(const MinidumpMemoryList&) = delete; + ~MinidumpMemoryList() override; static void set_max_regions(uint32_t max_regions) { max_regions_ = max_regions; @@ -696,8 +697,6 @@ class MinidumpMemoryList : public MinidumpStream { // The list of regions. MemoryRegions* regions_; uint32_t region_count_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpMemoryList); }; @@ -709,10 +708,12 @@ class MinidumpMemoryList : public MinidumpStream { // occurred. class MinidumpException : public MinidumpStream { public: - virtual ~MinidumpException(); + MinidumpException(const MinidumpException&) = delete; + void operator=(const MinidumpException&) = delete; + ~MinidumpException() override; const MDRawExceptionStream* exception() const { - return valid_ ? &exception_ : NULL; + return valid_ ? &exception_ : nullptr; } // The thread ID is used to determine if a thread is the exception thread, @@ -736,19 +737,19 @@ class MinidumpException : public MinidumpStream { bool Read(uint32_t expected_size) override; MDRawExceptionStream exception_; - MinidumpContext* context_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpException); + MinidumpContext* context_; }; // MinidumpAssertion wraps MDRawAssertionInfo, which contains information // about an assertion that caused the minidump to be generated. class MinidumpAssertion : public MinidumpStream { public: - virtual ~MinidumpAssertion(); + MinidumpAssertion(const MinidumpAssertion&) = delete; + void operator=(const MinidumpAssertion&) = delete; + ~MinidumpAssertion() override; const MDRawAssertionInfo* assertion() const { - return valid_ ? &assertion_ : NULL; + return valid_ ? &assertion_ : nullptr; } string expression() const { @@ -779,8 +780,6 @@ class MinidumpAssertion : public MinidumpStream { string expression_; string function_; string file_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpAssertion); }; @@ -788,10 +787,12 @@ class MinidumpAssertion : public MinidumpStream { // the system on which the minidump was generated. See also MinidumpMiscInfo. class MinidumpSystemInfo : public MinidumpStream { public: - virtual ~MinidumpSystemInfo(); + MinidumpSystemInfo(const MinidumpSystemInfo&) = delete; + void operator=(const MinidumpSystemInfo&) = delete; + ~MinidumpSystemInfo() override; const MDRawSystemInfo* system_info() const { - return valid_ ? &system_info_ : NULL; + return valid_ ? &system_info_ : nullptr; } // GetOS and GetCPU return textual representations of the operating system @@ -834,8 +835,6 @@ class MinidumpSystemInfo : public MinidumpStream { // A string identifying the CPU vendor, if known. const string* cpu_vendor_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpSystemInfo); }; @@ -846,7 +845,7 @@ class MinidumpUnloadedModule : public MinidumpObject, ~MinidumpUnloadedModule() override; const MDRawUnloadedModule* module() const { - return valid_ ? &unloaded_module_ : NULL; + return valid_ ? &unloaded_module_ : nullptr; } // CodeModule implementation @@ -903,6 +902,8 @@ class MinidumpUnloadedModule : public MinidumpObject, class MinidumpUnloadedModuleList : public MinidumpStream, public CodeModules { public: + MinidumpUnloadedModuleList(const MinidumpUnloadedModuleList&) = delete; + void operator=(const MinidumpUnloadedModuleList&) = delete; ~MinidumpUnloadedModuleList() override; static void set_max_modules(uint32_t max_modules) { @@ -945,8 +946,6 @@ class MinidumpUnloadedModuleList : public MinidumpStream, MinidumpUnloadedModules* unloaded_modules_; uint32_t module_count_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpUnloadedModuleList); }; @@ -955,8 +954,11 @@ class MinidumpUnloadedModuleList : public MinidumpStream, // information. See also MinidumpSystemInfo. class MinidumpMiscInfo : public MinidumpStream { public: + MinidumpMiscInfo(const MinidumpMiscInfo&) = delete; + void operator=(const MinidumpMiscInfo&) = delete; + const MDRawMiscInfo* misc_info() const { - return valid_ ? &misc_info_ : NULL; + return valid_ ? &misc_info_ : nullptr; } // Print a human-readable representation of the object to stdout. @@ -980,8 +982,6 @@ class MinidumpMiscInfo : public MinidumpStream { string daylight_name_; string build_string_; string dbg_bld_str_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpMiscInfo); }; @@ -990,8 +990,11 @@ class MinidumpMiscInfo : public MinidumpStream { // at the time the minidump was generated. class MinidumpBreakpadInfo : public MinidumpStream { public: + MinidumpBreakpadInfo(const MinidumpBreakpadInfo&) = delete; + void operator=(const MinidumpBreakpadInfo&) = delete; + const MDRawBreakpadInfo* breakpad_info() const { - return valid_ ? &breakpad_info_ : NULL; + return valid_ ? &breakpad_info_ : nullptr; } // These thread IDs are used to determine if threads deserve special @@ -1014,8 +1017,6 @@ class MinidumpBreakpadInfo : public MinidumpStream { bool Read(uint32_t expected_size_) override; MDRawBreakpadInfo breakpad_info_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpBreakpadInfo); }; // MinidumpMemoryInfo wraps MDRawMemoryInfo, which provides information @@ -1023,7 +1024,9 @@ class MinidumpBreakpadInfo : public MinidumpStream { // and protection. class MinidumpMemoryInfo : public MinidumpObject { public: - const MDRawMemoryInfo* info() const { return valid_ ? &memory_info_ : NULL; } + const MDRawMemoryInfo* info() const { + return valid_ ? &memory_info_ : nullptr; + } // The address of the base of the memory region. uint64_t GetBase() const { return valid_ ? memory_info_.base_address : 0; } @@ -1060,7 +1063,9 @@ class MinidumpMemoryInfo : public MinidumpObject { // info corresponding to a specific address. class MinidumpMemoryInfoList : public MinidumpStream { public: - virtual ~MinidumpMemoryInfoList(); + MinidumpMemoryInfoList(const MinidumpMemoryInfoList&) = delete; + void operator=(const MinidumpMemoryInfoList&) = delete; + ~MinidumpMemoryInfoList() override; unsigned int info_count() const { return valid_ ? info_count_ : 0; } @@ -1086,14 +1091,15 @@ class MinidumpMemoryInfoList : public MinidumpStream { MinidumpMemoryInfos* infos_; uint32_t info_count_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpMemoryInfoList); }; // MinidumpLinuxMaps wraps information about a single mapped memory region // from /proc/self/maps. class MinidumpLinuxMaps : public MinidumpObject { public: + MinidumpLinuxMaps(const MinidumpLinuxMaps&) = delete; + void operator=(const MinidumpLinuxMaps&) = delete; + // The memory address of the base of the mapped region. uint64_t GetBase() const { return valid_ ? region_.start : 0; } // The size of the mapped region. @@ -1139,8 +1145,6 @@ class MinidumpLinuxMaps : public MinidumpObject { // The memory region struct that this class wraps. MappedMemoryRegion region_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpLinuxMaps); }; // MinidumpLinuxMapsList corresponds to the Linux-exclusive MD_LINUX_MAPS @@ -1148,7 +1152,9 @@ class MinidumpLinuxMaps : public MinidumpObject { // the mapped memory regions and their access permissions. class MinidumpLinuxMapsList : public MinidumpStream { public: - virtual ~MinidumpLinuxMapsList(); + MinidumpLinuxMapsList(const MinidumpLinuxMapsList&) = delete; + void operator=(const MinidumpLinuxMapsList&) = delete; + ~MinidumpLinuxMapsList() override; // Get number of mappings. unsigned int get_maps_count() const { return valid_ ? maps_count_ : 0; } @@ -1180,8 +1186,6 @@ class MinidumpLinuxMapsList : public MinidumpStream { MinidumpLinuxMappings* maps_; // The number of mappings. uint32_t maps_count_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpLinuxMapsList); }; // MinidumpCrashpadInfo wraps MDRawCrashpadInfo, which is an optional stream in @@ -1189,8 +1193,19 @@ class MinidumpLinuxMapsList : public MinidumpStream { // at the time the minidump was generated. class MinidumpCrashpadInfo : public MinidumpStream { public: + struct AnnotationObject { + uint16_t type; + std::string name; + std::vector value; + }; + const MDRawCrashpadInfo* crashpad_info() const { - return valid_ ? &crashpad_info_ : NULL; + return valid_ ? &crashpad_info_ : nullptr; + } + + const std::vector>* + GetModuleCrashpadInfoAnnotationObjects() const { + return valid_ ? &module_crashpad_info_annotation_objects_ : nullptr; } // Print a human-readable representation of the object to stdout. @@ -1211,6 +1226,9 @@ class MinidumpCrashpadInfo : public MinidumpStream { std::vector> module_crashpad_info_list_annotations_; std::vector> module_crashpad_info_simple_annotations_; + std::vector> + module_crashpad_info_annotation_objects_; + std::map simple_annotations_; }; @@ -1228,6 +1246,9 @@ class Minidump { // is valid as long as the Minidump object is. explicit Minidump(std::istream& input); + Minidump(const Minidump&) = delete; + void operator=(const Minidump&) = delete; + virtual ~Minidump(); // path may be empty if the minidump was not opened from a file @@ -1244,7 +1265,9 @@ class Minidump { } static uint32_t max_string_length() { return max_string_length_; } - virtual const MDRawHeader* header() const { return valid_ ? &header_ : NULL; } + virtual const MDRawHeader* header() const { + return valid_ ? &header_ : nullptr; + } // Reads the CPU information from the system info stream and generates the // appropriate CPU flags. The returned context_cpu_flags are the same as @@ -1320,6 +1343,10 @@ class Minidump { off_t offset, std::map* simple_string_dictionary); + bool ReadCrashpadAnnotationsList( + off_t offset, + std::vector* annotations_list); + // SeekToStreamType positions the file at the beginning of a stream // identified by stream_type, and informs the caller of the stream's // length by setting *stream_length. Because stream_map maps each stream @@ -1356,7 +1383,7 @@ class Minidump { // the Minidump object locate interesting streams quickly, and // provides a convenient place to stash MinidumpStream objects. struct MinidumpStreamInfo { - MinidumpStreamInfo() : stream_index(0), stream(NULL) {} + MinidumpStreamInfo() : stream_index(0), stream(nullptr) {} ~MinidumpStreamInfo() { delete stream; } // Index into the MinidumpDirectoryEntries vector @@ -1418,8 +1445,6 @@ class Minidump { // Knobs for controlling display of memory printing. bool hexdump_; unsigned int hexdump_width_; - - DISALLOW_COPY_AND_ASSIGN(Minidump); }; diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/minidump_processor.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/minidump_processor.h similarity index 89% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/minidump_processor.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/minidump_processor.h index 137ef4444..8475407e7 100644 --- a/shared/sentry/external/breakpad/src/google_breakpad/processor/minidump_processor.h +++ b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/minidump_processor.h @@ -126,8 +126,18 @@ class MinidumpProcessor { // does not exist or cannot be determined. static string GetAssertion(Minidump* dump); + // Sets the flag to enable/disable use of objdump during normal crash + // processing. This is independent from the flag for use of objdump during + // exploitability analysis. void set_enable_objdump(bool enabled) { enable_objdump_ = enabled; } + // Sets the flag to enable/disable use of objdump during exploitability + // analysis. This is independent from the flag for use of objdump during + // normal crash processing. + void set_enable_objdump_for_exploitability(bool enabled) { + enable_objdump_for_exploitability_ = enabled; + } + private: StackFrameSymbolizer* frame_symbolizer_; // Indicate whether resolver_helper_ is owned by this instance. @@ -138,9 +148,15 @@ class MinidumpProcessor { // memory corruption issue. bool enable_exploitability_; - // This flag permits the exploitability scanner to shell out to objdump - // for purposes of disassembly. + // This flag permits the processor to shell out to objdump for purposes of + // disassembly during normal crash processing, but not during exploitability + // analysis. bool enable_objdump_; + + // This flag permits the exploitability scanner to shell out to objdump for + // purposes of disassembly. This results in significantly more overhead than + // the enable_objdump_ flag. + bool enable_objdump_for_exploitability_; }; } // namespace google_breakpad diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/proc_maps_linux.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/proc_maps_linux.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/proc_maps_linux.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/proc_maps_linux.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/process_result.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/process_result.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/process_result.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/process_result.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/process_state.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/process_state.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/process_state.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/process_state.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/source_line_resolver_base.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/source_line_resolver_base.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/source_line_resolver_base.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/source_line_resolver_base.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/source_line_resolver_interface.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/source_line_resolver_interface.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/source_line_resolver_interface.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/source_line_resolver_interface.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/stack_frame.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/stack_frame.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/stack_frame.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/stack_frame.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/stack_frame_cpu.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/stack_frame_cpu.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/stack_frame_cpu.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/stack_frame_cpu.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/stack_frame_symbolizer.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/stack_frame_symbolizer.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/stack_frame_symbolizer.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/stack_frame_symbolizer.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/stackwalker.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/stackwalker.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/stackwalker.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/stackwalker.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/symbol_supplier.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/symbol_supplier.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/symbol_supplier.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/symbol_supplier.h diff --git a/shared/sentry/external/breakpad/src/google_breakpad/processor/system_info.h b/shared/sentry/src/external/breakpad/src/google_breakpad/processor/system_info.h similarity index 100% rename from shared/sentry/external/breakpad/src/google_breakpad/processor/system_info.h rename to shared/sentry/src/external/breakpad/src/google_breakpad/processor/system_info.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/COPYING b/shared/sentry/src/external/breakpad/src/third_party/curl/COPYING similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/COPYING rename to shared/sentry/src/external/breakpad/src/third_party/curl/COPYING diff --git a/shared/sentry/external/breakpad/src/third_party/curl/curl.h b/shared/sentry/src/external/breakpad/src/third_party/curl/curl.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/curl.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/curl.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/curlbuild.h b/shared/sentry/src/external/breakpad/src/third_party/curl/curlbuild.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/curlbuild.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/curlbuild.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/curlrules.h b/shared/sentry/src/external/breakpad/src/third_party/curl/curlrules.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/curlrules.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/curlrules.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/curlver.h b/shared/sentry/src/external/breakpad/src/third_party/curl/curlver.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/curlver.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/curlver.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/easy.h b/shared/sentry/src/external/breakpad/src/third_party/curl/easy.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/easy.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/easy.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/mprintf.h b/shared/sentry/src/external/breakpad/src/third_party/curl/mprintf.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/mprintf.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/mprintf.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/multi.h b/shared/sentry/src/external/breakpad/src/third_party/curl/multi.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/multi.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/multi.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/stdcheaders.h b/shared/sentry/src/external/breakpad/src/third_party/curl/stdcheaders.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/stdcheaders.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/stdcheaders.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/typecheck-gcc.h b/shared/sentry/src/external/breakpad/src/third_party/curl/typecheck-gcc.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/typecheck-gcc.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/typecheck-gcc.h diff --git a/shared/sentry/external/breakpad/src/third_party/curl/types.h b/shared/sentry/src/external/breakpad/src/third_party/curl/types.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/curl/types.h rename to shared/sentry/src/external/breakpad/src/third_party/curl/types.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/LICENSE b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/LICENSE similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/LICENSE rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/LICENSE diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/Makefile.am b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/Makefile.am similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/Makefile.am rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/Makefile.am diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/README.breakpad b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/README.breakpad similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/README.breakpad rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/README.breakpad diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/TODO b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/TODO similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/TODO rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/TODO diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_implicit.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_implicit.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_implicit.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_implicit.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_implicit.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_implicit.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_implicit.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_implicit.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_insn.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_insn.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_insn.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_insn.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_insn.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_insn.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_insn.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_insn.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_invariant.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_invariant.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_invariant.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_invariant.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_invariant.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_invariant.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_invariant.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_invariant.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_modrm.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_modrm.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_modrm.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_modrm.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_modrm.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_modrm.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_modrm.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_modrm.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_opcode_tables.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_operand.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_operand.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_operand.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_operand.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_operand.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_operand.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_operand.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_operand.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_reg.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_reg.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_reg.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_reg.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_reg.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_reg.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_reg.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_reg.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_settings.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_settings.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_settings.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_settings.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_settings.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_settings.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/ia32_settings.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/ia32_settings.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/libdis.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/libdis.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/libdis.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/libdis.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/qword.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/qword.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/qword.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/qword.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/Makefile b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/Makefile similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/Makefile rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/Makefile diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/README b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/README similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/README rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/README diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/libdisasm.i b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/libdisasm.i similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/libdisasm.i rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/libdisasm.i diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/libdisasm_oop.i b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/libdisasm_oop.i similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/libdisasm_oop.i rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/libdisasm_oop.i diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile-swig b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile-swig similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile-swig rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile-swig diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile.PL b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile.PL similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile.PL rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/perl/Makefile.PL diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/python/Makefile-swig b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/python/Makefile-swig similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/python/Makefile-swig rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/python/Makefile-swig diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/ruby/Makefile-swig b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/ruby/Makefile-swig similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/ruby/Makefile-swig rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/ruby/Makefile-swig diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/ruby/extconf.rb b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/ruby/extconf.rb similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/ruby/extconf.rb rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/ruby/extconf.rb diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/swig/tcl/Makefile-swig b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/tcl/Makefile-swig similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/swig/tcl/Makefile-swig rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/swig/tcl/Makefile-swig diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_disasm.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_disasm.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_disasm.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_disasm.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_format.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_format.c similarity index 99% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_format.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_format.c index 0ec960dc8..bb547ad4c 100644 --- a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_format.c +++ b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_format.c @@ -29,7 +29,7 @@ } while( 0 ) #define STRNCATF( buf, fmt, data, len ) do { \ - char _tmp[MAX_OP_STRING]; \ + char _tmp[MAX_OP_XML_STRING]; \ \ snprintf( _tmp, sizeof _tmp, fmt, data ); \ STRNCAT( buf, _tmp, len ); \ diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_imm.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_imm.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_imm.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_imm.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_imm.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_imm.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_imm.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_imm.h diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_insn.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_insn.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_insn.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_insn.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_misc.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_misc.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_misc.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_misc.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_operand_list.c b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_operand_list.c similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_operand_list.c rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_operand_list.c diff --git a/shared/sentry/external/breakpad/src/third_party/libdisasm/x86_operand_list.h b/shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_operand_list.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/libdisasm/x86_operand_list.h rename to shared/sentry/src/external/breakpad/src/third_party/libdisasm/x86_operand_list.h diff --git a/shared/sentry/external/breakpad/src/third_party/linux/include/gflags/gflags_completions.h b/shared/sentry/src/external/breakpad/src/third_party/linux/include/gflags/gflags_completions.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/linux/include/gflags/gflags_completions.h rename to shared/sentry/src/external/breakpad/src/third_party/linux/include/gflags/gflags_completions.h diff --git a/shared/sentry/src/external/breakpad/src/third_party/mac_headers/README b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/README new file mode 100644 index 000000000..2b855b60c --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/README @@ -0,0 +1,25 @@ +These headers were copied to enable building the Mac dump_syms code that +processes Mach-O files on Linux. + +From xnu-8792.41.9 (https://github.com/apple-oss-distributions/xnu at 5c2921b) +i386/_types.h +arm/_types.h +mach/boolean.h +mach/machine.h +mach/thread_status.h +mach/vm_prot.h +mach/i386/boolean.h +mach/i386/vm_types.h +mach/arm/boolean.h +mach/arm/vm_types.h +mach/machine/boolean.h +mach/machine/vm_types.h + +From cctools-986 (https://github.com/apple-oss-distributions/cctools at cbe977a) +mach-o/arch.h +mach-o/fat.h +mach-o/loader.h +mach-o/nlist.h + +From architecture-282 (https://github.com/apple-oss-distributions/architecture at fe86900) +architecture/byte_order.h diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/architecture/byte_order.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/architecture/byte_order.h similarity index 86% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/architecture/byte_order.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/architecture/byte_order.h index b772d9f38..1f723ae14 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/architecture/byte_order.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/architecture/byte_order.h @@ -2,14 +2,14 @@ * Copyright (c) 1999-2008 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -17,7 +17,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_LICENSE_HEADER_END@ */ /* @@ -26,20 +26,14 @@ * Byte ordering conversion. * */ -/* This file mostly left blank */ -#ifndef _ARCHITECTURE_BYTE_ORDER_H_ +#ifndef _ARCHITECTURE_BYTE_ORDER_H_ #define _ARCHITECTURE_BYTE_ORDER_H_ -/* - * Identify the byte order - * of the current host. - */ - enum NXByteOrder { NX_UnknownByteOrder, NX_LittleEndian, NX_BigEndian }; -#endif /* _ARCHITECTURE_BYTE_ORDER_H_ */ +#endif /* _ARCHITECTURE_BYTE_ORDER_H_ */ \ No newline at end of file diff --git a/shared/sentry/src/external/breakpad/src/third_party/mac_headers/arm/_types.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/arm/_types.h new file mode 100644 index 000000000..f464d6bd6 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/arm/_types.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + */ +#ifndef _BSD_ARM__TYPES_H_ +#define _BSD_ARM__TYPES_H_ + +#if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) + + +typedef long __darwin_intptr_t; +typedef unsigned int __darwin_natural_t; + + +#endif /* defined (__arm__) || defined (__arm64__) || defined (__aarch64__) */ + +#endif /* _BSD_ARM__TYPES_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/i386/_types.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/i386/_types.h similarity index 81% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/i386/_types.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/i386/_types.h index 2ed7fd675..c0478d3ff 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/i386/_types.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/i386/_types.h @@ -2,7 +2,7 @@ * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,13 +22,17 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ -#ifndef _BSD_I386__TYPES_H_ -#define _BSD_I386__TYPES_H_ +#ifndef _BSD_I386__TYPES_H_ +#define _BSD_I386__TYPES_H_ + +#if defined (__i386__) || defined (__x86_64__) + +typedef long __darwin_intptr_t; +typedef unsigned int __darwin_natural_t; -typedef long __darwin_intptr_t; -typedef unsigned int __darwin_natural_t; +#endif /* defined (__i386__) || defined (__x86_64__) */ -#endif /* _BSD_I386__TYPES_H_ */ +#endif /* _BSD_I386__TYPES_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/arch.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/arch.h similarity index 67% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/arch.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/arch.h index 526c10fc8..29b81c5ba 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/arch.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/arch.h @@ -48,7 +48,7 @@ typedef struct { const char *description; } NXArchInfo; -#if __cplusplus +#ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -72,6 +72,36 @@ extern const NXArchInfo *NXGetArchInfoFromName(const char *name); extern const NXArchInfo *NXGetArchInfoFromCpuType(cpu_type_t cputype, cpu_subtype_t cpusubtype); +/* The above interfaces that return pointers to NXArchInfo structs in normal + * cases returns a pointer from the array returned in NXGetAllArchInfos(). + * In some cases when the cputype is CPU_TYPE_I386 or CPU_TYPE_POWERPC it will + * retun malloc(3)'ed NXArchInfo struct which contains a string in the + * description field also a malloc(3)'ed pointer. To allow programs not to + * leak memory they can call NXFreeArchInfo() on pointers returned from the + * above interfaces. Since this is a new API on older systems can use the + * code below. Going forward the above interfaces will only return pointers + * from the array returned in NXGetAllArchInfos(). + */ +extern void NXFreeArchInfo(const NXArchInfo *x); + +/* The code that can be used for NXFreeArchInfo() when it is not available is: + * + * static void NXFreeArchInfo( + * const NXArchInfo *x) + * { + * const NXArchInfo *p; + * + * p = NXGetAllArchInfos(); + * while(p->name != NULL){ + * if(x == p) + * return; + * p++; + * } + * free((char *)x->description); + * free((NXArchInfo *)x); + * } + */ + /* NXFindBestFatArch() is passed a cputype and cpusubtype and a set of * fat_arch structs and selects the best one that matches (if any) and returns * a pointer to that fat_arch struct (or NULL). The fat_arch structs must be @@ -86,6 +116,21 @@ extern struct fat_arch *NXFindBestFatArch(cpu_type_t cputype, struct fat_arch *fat_archs, uint32_t nfat_archs); +/* NXFindBestFatArch_64() is passed a cputype and cpusubtype and a set of + * fat_arch_64 structs and selects the best one that matches (if any) and + * returns a pointer to that fat_arch_64 struct (or NULL). The fat_arch_64 + * structs must be in the host byte order and correct such that the fat_archs64 + * really points to enough memory for nfat_arch structs. It is possible that + * this routine could fail if new cputypes or cpusubtypes are added and an old + * version of this routine is used. But if there is an exact match between the + * cputype and cpusubtype and one of the fat_arch_64 structs this routine will + * always succeed. + */ +extern struct fat_arch_64 *NXFindBestFatArch_64(cpu_type_t cputype, + cpu_subtype_t cpusubtype, + struct fat_arch_64 *fat_archs64, + uint32_t nfat_archs); + /* NXCombineCpuSubtypes() returns the resulting cpusubtype when combining two * different cpusubtypes for the specified cputype. If the two cpusubtypes * can't be combined (the specific subtypes are mutually exclusive) -1 is @@ -98,8 +143,8 @@ extern cpu_subtype_t NXCombineCpuSubtypes(cpu_type_t cputype, cpu_subtype_t cpusubtype1, cpu_subtype_t cpusubtype2); -#if __cplusplus +#ifdef __cplusplus } #endif /* __cplusplus */ -#endif /* _MACH_O_ARCH_H_ */ +#endif /* _MACH_O_ARCH_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/fat.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/fat.h similarity index 74% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/fat.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/fat.h index e2bcf433d..0e5927dc2 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/fat.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/fat.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2016 Apple, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -49,7 +49,7 @@ #define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */ struct fat_header { - uint32_t magic; /* FAT_MAGIC */ + uint32_t magic; /* FAT_MAGIC or FAT_MAGIC_64 */ uint32_t nfat_arch; /* number of structs that follow */ }; @@ -61,4 +61,23 @@ struct fat_arch { uint32_t align; /* alignment as a power of 2 */ }; -#endif /* _MACH_O_FAT_H_ */ +/* + * The support for the 64-bit fat file format described here is a work in + * progress and not yet fully supported in all the Apple Developer Tools. + * + * When a slice is greater than 4mb or an offset to a slice is greater than 4mb + * then the 64-bit fat file format is used. + */ +#define FAT_MAGIC_64 0xcafebabf +#define FAT_CIGAM_64 0xbfbafeca /* NXSwapLong(FAT_MAGIC_64) */ + +struct fat_arch_64 { + cpu_type_t cputype; /* cpu specifier (int) */ + cpu_subtype_t cpusubtype; /* machine specifier (int) */ + uint64_t offset; /* file offset to this object file */ + uint64_t size; /* size of this object file */ + uint32_t align; /* alignment as a power of 2 */ + uint32_t reserved; /* reserved */ +}; + +#endif /* _MACH_O_FAT_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/loader.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/loader.h similarity index 87% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/loader.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/loader.h index ff18e29c7..2b03dfdc4 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/loader.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/loader.h @@ -115,11 +115,14 @@ struct mach_header_64 { #define MH_DYLIB 0x6 /* dynamically bound shared library */ #define MH_DYLINKER 0x7 /* dynamic link editor */ #define MH_BUNDLE 0x8 /* dynamically bound bundle file */ -#define MH_DYLIB_STUB 0x9 /* shared library stub for static */ - /* linking only, no section contents */ -#define MH_DSYM 0xa /* companion file with only debug */ - /* sections */ +#define MH_DYLIB_STUB 0x9 /* shared library stub for static + linking only, no section contents */ +#define MH_DSYM 0xa /* companion file with only debug + sections */ #define MH_KEXT_BUNDLE 0xb /* x86_64 kexts */ +#define MH_FILESET 0xc /* a file composed of other Mach-Os to + be run in the same userspace sharing + a single linkedit. */ /* Constants for the flags field of the mach_header */ #define MH_NOUNDEFS 0x1 /* the object file has no undefined @@ -207,6 +210,25 @@ struct mach_header_64 { require it. Only used in MH_EXECUTE filetypes. */ +#define MH_APP_EXTENSION_SAFE 0x02000000 /* The code was linked for use in an + application extension. */ + +#define MH_NLIST_OUTOFSYNC_WITH_DYLDINFO 0x04000000 /* The external symbols + listed in the nlist symbol table do + not include all the symbols listed in + the dyld info. */ + +#define MH_SIM_SUPPORT 0x08000000 /* Allow LC_MIN_VERSION_MACOS and + LC_BUILD_VERSION load commands with + the platforms macOS, macCatalyst, + iOSSimulator, tvOSSimulator and + watchOSSimulator. */ + +#define MH_DYLIB_IN_CACHE 0x80000000 /* Only for use on dylibs. When this bit + is set, the dylib is part of the dyld + shared cache, rather than loose in + the filesystem. */ + /* * The load commands directly follow the mach_header. The total size of all * of the commands is given by the sizeofcmds field in the mach_header. All @@ -290,6 +312,20 @@ struct load_command { #define LC_FUNCTION_STARTS 0x26 /* compressed table of function start addresses */ #define LC_DYLD_ENVIRONMENT 0x27 /* string for dyld to treat like environment variable */ +#define LC_MAIN (0x28|LC_REQ_DYLD) /* replacement for LC_UNIXTHREAD */ +#define LC_DATA_IN_CODE 0x29 /* table of non-instructions in __text */ +#define LC_SOURCE_VERSION 0x2A /* source version used to build binary */ +#define LC_DYLIB_CODE_SIGN_DRS 0x2B /* Code signing DRs copied from linked dylibs */ +#define LC_ENCRYPTION_INFO_64 0x2C /* 64-bit encrypted segment information */ +#define LC_LINKER_OPTION 0x2D /* linker options in MH_OBJECT files */ +#define LC_LINKER_OPTIMIZATION_HINT 0x2E /* optimization hints in MH_OBJECT files */ +#define LC_VERSION_MIN_TVOS 0x2F /* build for AppleTV min OS version */ +#define LC_VERSION_MIN_WATCHOS 0x30 /* build for Watch min OS version */ +#define LC_NOTE 0x31 /* arbitrary data included within a Mach-O file */ +#define LC_BUILD_VERSION 0x32 /* build for platform min OS version */ +#define LC_DYLD_EXPORTS_TRIE (0x33 | LC_REQ_DYLD) /* used with linkedit_data_command, payload is trie */ +#define LC_DYLD_CHAINED_FIXUPS (0x34 | LC_REQ_DYLD) /* used with linkedit_data_command */ +#define LC_FILESET_ENTRY (0x35 | LC_REQ_DYLD) /* used with fileset_entry_command */ /* * A variable length string in a load command is represented by an lc_str @@ -367,6 +403,9 @@ struct segment_command_64 { /* for 64-bit architectures */ first page of the segment is not protected. All other pages of the segment are protected. */ +#define SG_READ_ONLY 0x10 /* This segment is made read-only after fixups */ + + /* * A segment is made up of zero or more sections. Non-MH_OBJECT files have @@ -492,6 +531,8 @@ struct section_64 { /* for 64-bit architectures */ #define S_THREAD_LOCAL_INIT_FUNCTION_POINTERS 0x15 /* functions to call to initialize TLV values */ +#define S_INIT_FUNC_OFFSETS 0x16 /* 32-bit offsets to + initializers */ /* * Constants for the section attributes part of the flags field of a section @@ -753,14 +794,14 @@ struct dylinker_command { * Thread commands contain machine-specific data structures suitable for * use in the thread state primitives. The machine specific data structures * follow the struct thread_command as follows. - * Each flavor of machine specific data structure is preceded by an unsigned - * long constant for the flavor of that data structure, an uint32_t - * that is the count of longs of the size of the state data structure and then + * Each flavor of machine specific data structure is preceded by an uint32_t + * constant for the flavor of that data structure, an uint32_t that is the + * count of uint32_t's of the size of the state data structure and then * the state data structure follows. This triple may be repeated for many * flavors. The constants for the flavors, counts and state data structure * definitions are expected to be in the header file . * These machine specific data structures sizes must be multiples of - * 4 bytes The cmdsize reflects the total size of the thread_command + * 4 bytes. The cmdsize reflects the total size of the thread_command * and all of the sizes of the constants for the flavors, counts and state * data structures. * @@ -774,7 +815,7 @@ struct thread_command { uint32_t cmd; /* LC_THREAD or LC_UNIXTHREAD */ uint32_t cmdsize; /* total size of this command */ /* uint32_t flavor flavor of thread state */ - /* uint32_t count count of longs in thread state */ + /* uint32_t count count of uint32_t's in thread state */ /* struct XXX_thread_state state thread state for this flavor */ /* ... */ }; @@ -1149,7 +1190,11 @@ struct rpath_command { */ struct linkedit_data_command { uint32_t cmd; /* LC_CODE_SIGNATURE, LC_SEGMENT_SPLIT_INFO, - or LC_FUNCTION_STARTS */ + LC_FUNCTION_STARTS, LC_DATA_IN_CODE, + LC_DYLIB_CODE_SIGN_DRS, + LC_LINKER_OPTIMIZATION_HINT, + LC_DYLD_EXPORTS_TRIE, or + LC_DYLD_CHAINED_FIXUPS. */ uint32_t cmdsize; /* sizeof(struct linkedit_data_command) */ uint32_t dataoff; /* file offset of data in __LINKEDIT segment */ uint32_t datasize; /* file size of data in __LINKEDIT segment */ @@ -1168,18 +1213,75 @@ struct encryption_info_command { 0 means not-encrypted yet */ }; +/* + * The encryption_info_command_64 contains the file offset and size of an + * of an encrypted segment (for use in x86_64 targets). + */ +struct encryption_info_command_64 { + uint32_t cmd; /* LC_ENCRYPTION_INFO_64 */ + uint32_t cmdsize; /* sizeof(struct encryption_info_command_64) */ + uint32_t cryptoff; /* file offset of encrypted range */ + uint32_t cryptsize; /* file size of encrypted range */ + uint32_t cryptid; /* which enryption system, + 0 means not-encrypted yet */ + uint32_t pad; /* padding to make this struct's size a multiple + of 8 bytes */ +}; + /* * The version_min_command contains the min OS version on which this * binary was built to run. */ struct version_min_command { uint32_t cmd; /* LC_VERSION_MIN_MACOSX or - LC_VERSION_MIN_IPHONEOS */ + LC_VERSION_MIN_IPHONEOS or + LC_VERSION_MIN_WATCHOS or + LC_VERSION_MIN_TVOS */ uint32_t cmdsize; /* sizeof(struct min_version_command) */ uint32_t version; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ - uint32_t reserved; /* zero */ + uint32_t sdk; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ +}; + +/* + * The build_version_command contains the min OS version on which this + * binary was built to run for its platform. The list of known platforms and + * tool values following it. + */ +struct build_version_command { + uint32_t cmd; /* LC_BUILD_VERSION */ + uint32_t cmdsize; /* sizeof(struct build_version_command) plus */ + /* ntools * sizeof(struct build_tool_version) */ + uint32_t platform; /* platform */ + uint32_t minos; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ + uint32_t sdk; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ + uint32_t ntools; /* number of tool entries following this */ +}; + +struct build_tool_version { + uint32_t tool; /* enum for the tool */ + uint32_t version; /* version number of the tool */ }; +/* Known values for the platform field above. */ +#define PLATFORM_MACOS 1 +#define PLATFORM_IOS 2 +#define PLATFORM_TVOS 3 +#define PLATFORM_WATCHOS 4 +#define PLATFORM_BRIDGEOS 5 +#define PLATFORM_MACCATALYST 6 +#define PLATFORM_IOSSIMULATOR 7 +#define PLATFORM_TVOSSIMULATOR 8 +#define PLATFORM_WATCHOSSIMULATOR 9 +#define PLATFORM_DRIVERKIT 10 + +#ifndef __APPLE_BLEACH_SDK__ +#endif /* __APPLE_BLEACH_SDK__ */ + +/* Known values for the tool field above. */ +#define TOOL_CLANG 1 +#define TOOL_SWIFT 2 +#define TOOL_LD 3 + /* * The dyld_info_command contains the file offsets and sizes of * the new compressed form of the information dyld needs to @@ -1265,14 +1367,19 @@ struct dyld_info_command { * Nodes for a symbol start with a uleb128 that is the length of * the exported symbol information for the string so far. * If there is no exported symbol, the node starts with a zero byte. - * If there is exported info, it follows the length. First is - * a uleb128 containing flags. Normally, it is followed by a - * uleb128 encoded offset which is location of the content named + * If there is exported info, it follows the length. + * + * First is a uleb128 containing flags. Normally, it is followed by + * a uleb128 encoded offset which is location of the content named * by the symbol from the mach_header for the image. If the flags * is EXPORT_SYMBOL_FLAGS_REEXPORT, then following the flags is * a uleb128 encoded library ordinal, then a zero terminated * UTF8 string. If the string is zero length, then the symbol * is re-export from the specified dylib with the same name. + * If the flags is EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER, then following + * the flags is two uleb128s: the stub offset and the resolver offset. + * The stub is used by non-lazy pointers. The resolver is used + * by lazy pointers and must be called to get the actual address to use. * * After the optional exported symbol information is a byte of * how many edges (0-255) that this node has leaving it, @@ -1316,6 +1423,7 @@ struct dyld_info_command { #define BIND_SPECIAL_DYLIB_SELF 0 #define BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE -1 #define BIND_SPECIAL_DYLIB_FLAT_LOOKUP -2 +#define BIND_SPECIAL_DYLIB_WEAK_LOOKUP -3 #define BIND_SYMBOL_FLAGS_WEAK_IMPORT 0x1 #define BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION 0x8 @@ -1335,6 +1443,9 @@ struct dyld_info_command { #define BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB 0xA0 #define BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED 0xB0 #define BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB 0xC0 +#define BIND_OPCODE_THREADED 0xD0 +#define BIND_SUBOPCODE_THREADED_SET_BIND_ORDINAL_TABLE_SIZE_ULEB 0x00 +#define BIND_SUBOPCODE_THREADED_APPLY 0x01 /* @@ -1344,9 +1455,23 @@ struct dyld_info_command { #define EXPORT_SYMBOL_FLAGS_KIND_MASK 0x03 #define EXPORT_SYMBOL_FLAGS_KIND_REGULAR 0x00 #define EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL 0x01 +#define EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE 0x02 #define EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION 0x04 #define EXPORT_SYMBOL_FLAGS_REEXPORT 0x08 #define EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER 0x10 +#define EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER 0x20 + + +/* + * The linker_option_command contains linker options embedded in object files. + */ +struct linker_option_command { + uint32_t cmd; /* LC_LINKER_OPTION only used in MH_OBJECT filetypes */ + uint32_t cmdsize; + uint32_t count; /* number of strings */ + /* concatenation of zero terminated UTF8 strings. + Zero filled at end to align */ +}; /* * The symseg_command contains the offset and size of the GNU style @@ -1388,6 +1513,50 @@ struct fvmfile_command { uint32_t header_addr; /* files virtual address */ }; + +/* + * The entry_point_command is a replacement for thread_command. + * It is used for main executables to specify the location (file offset) + * of main(). If -stack_size was used at link time, the stacksize + * field will contain the stack size need for the main thread. + */ +struct entry_point_command { + uint32_t cmd; /* LC_MAIN only used in MH_EXECUTE filetypes */ + uint32_t cmdsize; /* 24 */ + uint64_t entryoff; /* file (__TEXT) offset of main() */ + uint64_t stacksize;/* if not zero, initial stack size */ +}; + + +/* + * The source_version_command is an optional load command containing + * the version of the sources used to build the binary. + */ +struct source_version_command { + uint32_t cmd; /* LC_SOURCE_VERSION */ + uint32_t cmdsize; /* 16 */ + uint64_t version; /* A.B.C.D.E packed as a24.b10.c10.d10.e10 */ +}; + + +/* + * The LC_DATA_IN_CODE load commands uses a linkedit_data_command + * to point to an array of data_in_code_entry entries. Each entry + * describes a range of data in a code section. + */ +struct data_in_code_entry { + uint32_t offset; /* from mach_header to start of data range*/ + uint16_t length; /* number of bytes in data range */ + uint16_t kind; /* a DICE_KIND_* value */ +}; +#define DICE_KIND_DATA 0x0001 +#define DICE_KIND_JUMP_TABLE8 0x0002 +#define DICE_KIND_JUMP_TABLE16 0x0003 +#define DICE_KIND_JUMP_TABLE32 0x0004 +#define DICE_KIND_ABS_JUMP_TABLE32 0x0005 + + + /* * Sections of type S_THREAD_LOCAL_VARIABLES contain an array * of tlv_descriptor structures. @@ -1399,4 +1568,39 @@ struct tlv_descriptor unsigned long offset; }; -#endif /* _MACHO_LOADER_H_ */ +/* + * LC_NOTE commands describe a region of arbitrary data included in a Mach-O + * file. Its initial use is to record extra data in MH_CORE files. + */ +struct note_command { + uint32_t cmd; /* LC_NOTE */ + uint32_t cmdsize; /* sizeof(struct note_command) */ + char data_owner[16]; /* owner name for this LC_NOTE */ + uint64_t offset; /* file offset of this data */ + uint64_t size; /* length of data region */ +}; + +/* + * LC_FILESET_ENTRY commands describe constituent Mach-O files that are part + * of a fileset. In one implementation, entries are dylibs with individual + * mach headers and repositionable text and data segments. Each entry is + * further described by its own mach header. + */ +struct fileset_entry_command { + uint32_t cmd; /* LC_FILESET_ENTRY */ + uint32_t cmdsize; /* includes entry_id string */ + uint64_t vmaddr; /* memory address of the entry */ + uint64_t fileoff; /* file offset of the entry */ + union lc_str entry_id; /* contained entry id */ + uint32_t reserved; /* reserved */ +}; + +/* + * These deprecated values may still be used within Apple but are mechanically + * removed from public API. The mechanical process may produce unusual results. + */ +#if (!defined(PLATFORM_IOSMAC)) +#define PLATFORM_IOSMAC PLATFORM_MACCATALYST +#endif + +#endif /* _MACHO_LOADER_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/nlist.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/nlist.h similarity index 96% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/nlist.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/nlist.h index 1c1941012..7b979a52a 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach-o/nlist.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach-o/nlist.h @@ -78,7 +78,7 @@ struct nlist { #ifndef __LP64__ char *n_name; /* for use when in-core */ #endif - int32_t n_strx; /* index into the string table */ + uint32_t n_strx; /* index into the string table */ } n_un; uint8_t n_type; /* type flag, see below */ uint8_t n_sect; /* section number or NO_SECT */ @@ -296,17 +296,29 @@ struct nlist_64 { */ #define N_SYMBOL_RESOLVER 0x0100 +/* + * The N_ALT_ENTRY bit of the n_desc field indicates that the + * symbol is pinned to the previous content. + */ +#define N_ALT_ENTRY 0x0200 + +/* + * The N_COLD_FUNC bit of the n_desc field indicates that the symbol is used + * infrequently and the linker should order it towards the end of the section. + */ +#define N_COLD_FUNC 0x0400 + #ifndef __STRICT_BSD__ -#if __cplusplus +#ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* * The function nlist(3) from the C library. */ extern int nlist (const char *filename, struct nlist *list); -#if __cplusplus +#ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __STRICT_BSD__ */ -#endif /* _MACHO_LIST_H_ */ +#endif /* _MACHO_LIST_H_ */ \ No newline at end of file diff --git a/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/boolean.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/boolean.h new file mode 100644 index 000000000..d653a394c --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/boolean.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ + +/* + * File: boolean.h + * + * Boolean type, for ARM. + */ + +#ifndef _MACH_ARM_BOOLEAN_H_ +#define _MACH_ARM_BOOLEAN_H_ + +#if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) + +typedef int boolean_t; + +#endif /* defined (__arm__) || defined (__arm64__) */ + +#endif /* _MACH_ARM_BOOLEAN_H_ */ \ No newline at end of file diff --git a/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/vm_types.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/vm_types.h new file mode 100644 index 000000000..3650a8690 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/arm/vm_types.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ + +/* + * File: vm_types.h + * Author: Avadis Tevanian, Jr. + * Date: 1985 + * + * Header file for VM data types. ARM version. + */ + +#ifndef _MACH_ARM_VM_TYPES_H_ +#define _MACH_ARM_VM_TYPES_H_ + +#if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) + +#ifndef ASSEMBLER + +#include +#include +#include + +/* + * natural_t and integer_t are Mach's legacy types for machine- + * independent integer types (unsigned, and signed, respectively). + * Their original purpose was to define other types in a machine/ + * compiler independent way. + * + * They also had an implicit "same size as pointer" characteristic + * to them (i.e. Mach's traditional types are very ILP32 or ILP64 + * centric). We will likely support x86 ABIs that do not follow + * either ofthese models (specifically LP64). Therefore, we had to + * make a choice between making these types scale with pointers or stay + * tied to integers. Because their use is predominantly tied to + * to the size of an integer, we are keeping that association and + * breaking free from pointer size guarantees. + * + * New use of these types is discouraged. + */ +typedef __darwin_natural_t natural_t; +typedef int integer_t; + +/* + * A vm_offset_t is a type-neutral pointer, + * e.g. an offset into a virtual memory space. + */ +#ifdef __LP64__ +typedef uintptr_t vm_offset_t ; +typedef uintptr_t vm_size_t; + +typedef uint64_t mach_vm_address_t ; +typedef uint64_t mach_vm_offset_t ; +typedef uint64_t mach_vm_size_t; + +typedef uint64_t vm_map_offset_t ; +typedef uint64_t vm_map_address_t ; +typedef uint64_t vm_map_size_t; +#else +typedef natural_t vm_offset_t ; +/* + * A vm_size_t is the proper type for e.g. + * expressing the difference between two + * vm_offset_t entities. + */ +typedef natural_t vm_size_t; + +/* + * This new type is independent of a particular vm map's + * implementation size - and represents appropriate types + * for all possible maps. This is used for interfaces + * where the size of the map is not known - or we don't + * want to have to distinguish. + */ +typedef uint64_t mach_vm_address_t ; +typedef uint64_t mach_vm_offset_t ; +typedef uint64_t mach_vm_size_t; + +typedef uint32_t vm_map_offset_t ; +typedef uint32_t vm_map_address_t ; +typedef uint32_t vm_map_size_t; +#endif /* __LP64__ */ + + +typedef uint32_t vm32_offset_t; +typedef uint32_t vm32_address_t; +typedef uint32_t vm32_size_t; + +typedef vm_offset_t mach_port_context_t; + +#ifdef MACH_KERNEL_PRIVATE +typedef vm32_offset_t mach_port_context32_t; +typedef mach_vm_offset_t mach_port_context64_t; +#endif + +#endif /* ASSEMBLER */ + +/* + * If composing messages by hand (please do not) + */ +#define MACH_MSG_TYPE_INTEGER_T MACH_MSG_TYPE_INTEGER_32 + +#endif /* defined (__arm__) || defined (__arm64__) || defined (__aarch64__) */ + +#endif /* _MACH_ARM_VM_TYPES_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/boolean.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/boolean.h similarity index 90% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/boolean.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/boolean.h index 641c3962d..ba8842934 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/boolean.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/boolean.h @@ -2,7 +2,7 @@ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,34 +22,34 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ */ -/* +/* * Mach Operating System * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ @@ -62,27 +62,27 @@ * */ -#ifndef _MACH_BOOLEAN_H_ -#define _MACH_BOOLEAN_H_ +#ifndef _MACH_BOOLEAN_H_ +#define _MACH_BOOLEAN_H_ /* * Pick up "boolean_t" type definition */ -#ifndef ASSEMBLER +#ifndef ASSEMBLER #include -#endif /* ASSEMBLER */ +#endif /* ASSEMBLER */ /* * Define TRUE and FALSE if not defined. */ -#ifndef TRUE -#define TRUE 1 -#endif /* TRUE */ +#ifndef TRUE +#define TRUE 1 +#endif /* TRUE */ -#ifndef FALSE -#define FALSE 0 -#endif /* FALSE */ +#ifndef FALSE +#define FALSE 0 +#endif /* FALSE */ -#endif /* _MACH_BOOLEAN_H_ */ +#endif /* _MACH_BOOLEAN_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/boolean.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/i386/boolean.h similarity index 90% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/boolean.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/i386/boolean.h index 100f7e7b5..b1d69a193 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/boolean.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/i386/boolean.h @@ -2,7 +2,7 @@ * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,34 +22,34 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ */ -/* +/* * Mach Operating System * Copyright (c) 1991,1990,1989 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ @@ -62,13 +62,17 @@ * Boolean type, for I386. */ -#ifndef _MACH_I386_BOOLEAN_H_ +#ifndef _MACH_I386_BOOLEAN_H_ #define _MACH_I386_BOOLEAN_H_ +#if defined (__i386__) || defined (__x86_64__) + #if defined(__x86_64__) && !defined(KERNEL) -typedef unsigned int boolean_t; +typedef unsigned int boolean_t; #else -typedef int boolean_t; +typedef int boolean_t; #endif -#endif /* _MACH_I386_BOOLEAN_H_ */ +#endif /* defined (__i386__) || defined (__x86_64__) */ + +#endif /* _MACH_I386_BOOLEAN_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/vm_types.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/i386/vm_types.h similarity index 73% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/vm_types.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/i386/vm_types.h index 2c38fa2d7..0c3bb6ba4 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/i386/vm_types.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/i386/vm_types.h @@ -1,8 +1,8 @@ /* - * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2016 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,34 +22,34 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ */ -/* +/* * Mach Operating System * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ @@ -64,14 +64,16 @@ * Header file for VM data types. I386 version. */ -#ifndef _MACH_I386_VM_TYPES_H_ +#ifndef _MACH_I386_VM_TYPES_H_ #define _MACH_I386_VM_TYPES_H_ -#ifndef ASSEMBLER +#if defined (__i386__) || defined (__x86_64__) + +#ifndef ASSEMBLER #include -#include #include +#include /* * natural_t and integer_t are Mach's legacy types for machine- @@ -90,18 +92,18 @@ * * New use of these types is discouraged. */ -typedef __darwin_natural_t natural_t; -typedef int integer_t; +typedef __darwin_natural_t natural_t; +typedef int integer_t; /* * A vm_offset_t is a type-neutral pointer, * e.g. an offset into a virtual memory space. */ #ifdef __LP64__ -typedef uintptr_t vm_offset_t; -#else /* __LP64__ */ -typedef natural_t vm_offset_t; -#endif /* __LP64__ */ +typedef uintptr_t vm_offset_t ; +#else /* __LP64__ */ +typedef natural_t vm_offset_t ; +#endif /* __LP64__ */ /* * A vm_size_t is the proper type for e.g. @@ -109,10 +111,10 @@ typedef natural_t vm_offset_t; * vm_offset_t entities. */ #ifdef __LP64__ -typedef uintptr_t vm_size_t; -#else /* __LP64__ */ -typedef natural_t vm_size_t; -#endif /* __LP64__ */ +typedef uintptr_t vm_size_t; +#else /* __LP64__ */ +typedef natural_t vm_size_t; +#endif /* __LP64__ */ /* * This new type is independent of a particular vm map's @@ -121,20 +123,35 @@ typedef natural_t vm_size_t; * where the size of the map is not known - or we don't * want to have to distinguish. */ -typedef uint64_t mach_vm_address_t; -typedef uint64_t mach_vm_offset_t; -typedef uint64_t mach_vm_size_t; +typedef uint64_t mach_vm_address_t ; +typedef uint64_t mach_vm_offset_t ; +typedef uint64_t mach_vm_size_t; + +typedef uint64_t vm_map_offset_t ; +typedef uint64_t vm_map_address_t ; +typedef uint64_t vm_map_size_t; + +typedef mach_vm_address_t mach_port_context_t; -typedef uint64_t vm_map_offset_t; -typedef uint64_t vm_map_address_t; -typedef uint64_t vm_map_size_t; +#ifdef MACH_KERNEL_PRIVATE +/* + * These are types used internal to Mach to implement the + * legacy 32-bit VM APIs published by the kernel. + */ +typedef uint32_t vm32_address_t; +typedef uint32_t vm32_offset_t; +typedef uint32_t vm32_size_t; -#endif /* ASSEMBLER */ +#endif /* MACH_KERNEL_PRIVATE */ + +#endif /* ASSEMBLER */ /* * If composing messages by hand (please do not) */ -#define MACH_MSG_TYPE_INTEGER_T MACH_MSG_TYPE_INTEGER_32 +#define MACH_MSG_TYPE_INTEGER_T MACH_MSG_TYPE_INTEGER_32 + +#endif /* defined (__i386__) || defined (__x86_64__) */ -#endif /* _MACH_I386_VM_TYPES_H_ */ +#endif /* _MACH_I386_VM_TYPES_H_ */ \ No newline at end of file diff --git a/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine.h new file mode 100644 index 000000000..53457cca7 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine.h @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2007-2016 Apple, Inc. All rights reserved. + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* File: machine.h + * Author: Avadis Tevanian, Jr. + * Date: 1986 + * + * Machine independent machine abstraction. + */ + +#ifndef _MACH_MACHINE_H_ +#define _MACH_MACHINE_H_ + +#ifndef __ASSEMBLER__ + +#include +#include +#include + +typedef integer_t cpu_type_t; +typedef integer_t cpu_subtype_t; +typedef integer_t cpu_threadtype_t; + +#define CPU_STATE_MAX 4 + +#define CPU_STATE_USER 0 +#define CPU_STATE_SYSTEM 1 +#define CPU_STATE_IDLE 2 +#define CPU_STATE_NICE 3 + +#ifdef KERNEL_PRIVATE + +#include + +__BEGIN_DECLS +cpu_type_t cpu_type(void); + +cpu_subtype_t cpu_subtype(void); + +cpu_threadtype_t cpu_threadtype(void); +__END_DECLS + +#ifdef MACH_KERNEL_PRIVATE + +struct machine_info { + integer_t major_version; /* kernel major version id */ + integer_t minor_version; /* kernel minor version id */ + integer_t max_cpus; /* max number of CPUs possible */ + uint32_t memory_size; /* size of memory in bytes, capped at 2 GB */ + uint64_t max_mem; /* actual size of physical memory */ + uint32_t physical_cpu; /* number of physical CPUs now available */ + integer_t physical_cpu_max; /* max number of physical CPUs possible */ + uint32_t logical_cpu; /* number of logical cpu now available */ + integer_t logical_cpu_max; /* max number of physical CPUs possible */ +}; + +typedef struct machine_info *machine_info_t; +typedef struct machine_info machine_info_data_t; + +extern struct machine_info machine_info; + +__BEGIN_DECLS +cpu_type_t slot_type( + int slot_num); + +cpu_subtype_t slot_subtype( + int slot_num); + +cpu_threadtype_t slot_threadtype( + int slot_num); +__END_DECLS + +#endif /* MACH_KERNEL_PRIVATE */ +#endif /* KERNEL_PRIVATE */ + + +/* + * Capability bits used in the definition of cpu_type. + */ +#define CPU_ARCH_MASK 0xff000000 /* mask for architecture bits */ +#define CPU_ARCH_ABI64 0x01000000 /* 64 bit ABI */ +#define CPU_ARCH_ABI64_32 0x02000000 /* ABI for 64-bit hardware with 32-bit types; LP32 */ + +/* + * Machine types known by all. + */ + +#define CPU_TYPE_ANY ((cpu_type_t) -1) + +#define CPU_TYPE_VAX ((cpu_type_t) 1) +/* skip ((cpu_type_t) 2) */ +/* skip ((cpu_type_t) 3) */ +/* skip ((cpu_type_t) 4) */ +/* skip ((cpu_type_t) 5) */ +#define CPU_TYPE_MC680x0 ((cpu_type_t) 6) +#define CPU_TYPE_X86 ((cpu_type_t) 7) +#define CPU_TYPE_I386 CPU_TYPE_X86 /* compatibility */ +#define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64) + +/* skip CPU_TYPE_MIPS ((cpu_type_t) 8) */ +/* skip ((cpu_type_t) 9) */ +#define CPU_TYPE_MC98000 ((cpu_type_t) 10) +#define CPU_TYPE_HPPA ((cpu_type_t) 11) +#define CPU_TYPE_ARM ((cpu_type_t) 12) +#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) +#define CPU_TYPE_ARM64_32 (CPU_TYPE_ARM | CPU_ARCH_ABI64_32) +#define CPU_TYPE_MC88000 ((cpu_type_t) 13) +#define CPU_TYPE_SPARC ((cpu_type_t) 14) +#define CPU_TYPE_I860 ((cpu_type_t) 15) +/* skip CPU_TYPE_ALPHA ((cpu_type_t) 16) */ +/* skip ((cpu_type_t) 17) */ +#define CPU_TYPE_POWERPC ((cpu_type_t) 18) +#define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64) +/* skip ((cpu_type_t) 19) */ +/* skip ((cpu_type_t) 20 */ +/* skip ((cpu_type_t) 21 */ +/* skip ((cpu_type_t) 22 */ +/* skip ((cpu_type_t) 23 */ + +/* + * Machine subtypes (these are defined here, instead of in a machine + * dependent directory, so that any program can get all definitions + * regardless of where is it compiled). + */ + +/* + * Capability bits used in the definition of cpu_subtype. + */ +#define CPU_SUBTYPE_MASK 0xff000000 /* mask for feature flags */ +#define CPU_SUBTYPE_LIB64 0x80000000 /* 64 bit libraries */ +#define CPU_SUBTYPE_PTRAUTH_ABI 0x80000000 /* pointer authentication with versioned ABI */ + +/* + * When selecting a slice, ANY will pick the slice with the best + * grading for the selected cpu_type_t, unlike the "ALL" subtypes, + * which are the slices that can run on any hardware for that cpu type. + */ +#define CPU_SUBTYPE_ANY ((cpu_subtype_t) -1) + +/* + * Object files that are hand-crafted to run on any + * implementation of an architecture are tagged with + * CPU_SUBTYPE_MULTIPLE. This functions essentially the same as + * the "ALL" subtype of an architecture except that it allows us + * to easily find object files that may need to be modified + * whenever a new implementation of an architecture comes out. + * + * It is the responsibility of the implementor to make sure the + * software handles unsupported implementations elegantly. + */ +#define CPU_SUBTYPE_MULTIPLE ((cpu_subtype_t) -1) +#define CPU_SUBTYPE_LITTLE_ENDIAN ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_BIG_ENDIAN ((cpu_subtype_t) 1) + +/* + * Machine threadtypes. + * This is none - not defined - for most machine types/subtypes. + */ +#define CPU_THREADTYPE_NONE ((cpu_threadtype_t) 0) + +/* + * VAX subtypes (these do *not* necessary conform to the actual cpu + * ID assigned by DEC available via the SID register). + */ + +#define CPU_SUBTYPE_VAX_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_VAX780 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_VAX785 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_VAX750 ((cpu_subtype_t) 3) +#define CPU_SUBTYPE_VAX730 ((cpu_subtype_t) 4) +#define CPU_SUBTYPE_UVAXI ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_UVAXII ((cpu_subtype_t) 6) +#define CPU_SUBTYPE_VAX8200 ((cpu_subtype_t) 7) +#define CPU_SUBTYPE_VAX8500 ((cpu_subtype_t) 8) +#define CPU_SUBTYPE_VAX8600 ((cpu_subtype_t) 9) +#define CPU_SUBTYPE_VAX8650 ((cpu_subtype_t) 10) +#define CPU_SUBTYPE_VAX8800 ((cpu_subtype_t) 11) +#define CPU_SUBTYPE_UVAXIII ((cpu_subtype_t) 12) + +/* + * 680x0 subtypes + * + * The subtype definitions here are unusual for historical reasons. + * NeXT used to consider 68030 code as generic 68000 code. For + * backwards compatability: + * + * CPU_SUBTYPE_MC68030 symbol has been preserved for source code + * compatability. + * + * CPU_SUBTYPE_MC680x0_ALL has been defined to be the same + * subtype as CPU_SUBTYPE_MC68030 for binary comatability. + * + * CPU_SUBTYPE_MC68030_ONLY has been added to allow new object + * files to be tagged as containing 68030-specific instructions. + */ + +#define CPU_SUBTYPE_MC680x0_ALL ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_MC68030 ((cpu_subtype_t) 1) /* compat */ +#define CPU_SUBTYPE_MC68040 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_MC68030_ONLY ((cpu_subtype_t) 3) + +/* + * I386 subtypes + */ + +#define CPU_SUBTYPE_INTEL(f, m) ((cpu_subtype_t) (f) + ((m) << 4)) + +#define CPU_SUBTYPE_I386_ALL CPU_SUBTYPE_INTEL(3, 0) +#define CPU_SUBTYPE_386 CPU_SUBTYPE_INTEL(3, 0) +#define CPU_SUBTYPE_486 CPU_SUBTYPE_INTEL(4, 0) +#define CPU_SUBTYPE_486SX CPU_SUBTYPE_INTEL(4, 8) // 8 << 4 = 128 +#define CPU_SUBTYPE_586 CPU_SUBTYPE_INTEL(5, 0) +#define CPU_SUBTYPE_PENT CPU_SUBTYPE_INTEL(5, 0) +#define CPU_SUBTYPE_PENTPRO CPU_SUBTYPE_INTEL(6, 1) +#define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3) +#define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5) +#define CPU_SUBTYPE_CELERON CPU_SUBTYPE_INTEL(7, 6) +#define CPU_SUBTYPE_CELERON_MOBILE CPU_SUBTYPE_INTEL(7, 7) +#define CPU_SUBTYPE_PENTIUM_3 CPU_SUBTYPE_INTEL(8, 0) +#define CPU_SUBTYPE_PENTIUM_3_M CPU_SUBTYPE_INTEL(8, 1) +#define CPU_SUBTYPE_PENTIUM_3_XEON CPU_SUBTYPE_INTEL(8, 2) +#define CPU_SUBTYPE_PENTIUM_M CPU_SUBTYPE_INTEL(9, 0) +#define CPU_SUBTYPE_PENTIUM_4 CPU_SUBTYPE_INTEL(10, 0) +#define CPU_SUBTYPE_PENTIUM_4_M CPU_SUBTYPE_INTEL(10, 1) +#define CPU_SUBTYPE_ITANIUM CPU_SUBTYPE_INTEL(11, 0) +#define CPU_SUBTYPE_ITANIUM_2 CPU_SUBTYPE_INTEL(11, 1) +#define CPU_SUBTYPE_XEON CPU_SUBTYPE_INTEL(12, 0) +#define CPU_SUBTYPE_XEON_MP CPU_SUBTYPE_INTEL(12, 1) + +#define CPU_SUBTYPE_INTEL_FAMILY(x) ((x) & 15) +#define CPU_SUBTYPE_INTEL_FAMILY_MAX 15 + +#define CPU_SUBTYPE_INTEL_MODEL(x) ((x) >> 4) +#define CPU_SUBTYPE_INTEL_MODEL_ALL 0 + +/* + * X86 subtypes. + */ + +#define CPU_SUBTYPE_X86_ALL ((cpu_subtype_t)3) +#define CPU_SUBTYPE_X86_64_ALL ((cpu_subtype_t)3) +#define CPU_SUBTYPE_X86_ARCH1 ((cpu_subtype_t)4) +#define CPU_SUBTYPE_X86_64_H ((cpu_subtype_t)8) /* Haswell feature subset */ + + +#define CPU_THREADTYPE_INTEL_HTT ((cpu_threadtype_t) 1) + +/* + * Mips subtypes. + */ + +#define CPU_SUBTYPE_MIPS_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_MIPS_R2300 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_MIPS_R2600 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_MIPS_R2800 ((cpu_subtype_t) 3) +#define CPU_SUBTYPE_MIPS_R2000a ((cpu_subtype_t) 4) /* pmax */ +#define CPU_SUBTYPE_MIPS_R2000 ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_MIPS_R3000a ((cpu_subtype_t) 6) /* 3max */ +#define CPU_SUBTYPE_MIPS_R3000 ((cpu_subtype_t) 7) + +/* + * MC98000 (PowerPC) subtypes + */ +#define CPU_SUBTYPE_MC98000_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_MC98601 ((cpu_subtype_t) 1) + +/* + * HPPA subtypes for Hewlett-Packard HP-PA family of + * risc processors. Port by NeXT to 700 series. + */ + +#define CPU_SUBTYPE_HPPA_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_HPPA_7100 ((cpu_subtype_t) 0) /* compat */ +#define CPU_SUBTYPE_HPPA_7100LC ((cpu_subtype_t) 1) + +/* + * MC88000 subtypes. + */ +#define CPU_SUBTYPE_MC88000_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_MC88100 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_MC88110 ((cpu_subtype_t) 2) + +/* + * SPARC subtypes + */ +#define CPU_SUBTYPE_SPARC_ALL ((cpu_subtype_t) 0) + +/* + * I860 subtypes + */ +#define CPU_SUBTYPE_I860_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_I860_860 ((cpu_subtype_t) 1) + +/* + * PowerPC subtypes + */ +#define CPU_SUBTYPE_POWERPC_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_POWERPC_601 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_POWERPC_602 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_POWERPC_603 ((cpu_subtype_t) 3) +#define CPU_SUBTYPE_POWERPC_603e ((cpu_subtype_t) 4) +#define CPU_SUBTYPE_POWERPC_603ev ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_POWERPC_604 ((cpu_subtype_t) 6) +#define CPU_SUBTYPE_POWERPC_604e ((cpu_subtype_t) 7) +#define CPU_SUBTYPE_POWERPC_620 ((cpu_subtype_t) 8) +#define CPU_SUBTYPE_POWERPC_750 ((cpu_subtype_t) 9) +#define CPU_SUBTYPE_POWERPC_7400 ((cpu_subtype_t) 10) +#define CPU_SUBTYPE_POWERPC_7450 ((cpu_subtype_t) 11) +#define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) + +/* + * ARM subtypes + */ +#define CPU_SUBTYPE_ARM_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_ARM_V4T ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_ARM_V6 ((cpu_subtype_t) 6) +#define CPU_SUBTYPE_ARM_V5TEJ ((cpu_subtype_t) 7) +#define CPU_SUBTYPE_ARM_XSCALE ((cpu_subtype_t) 8) +#define CPU_SUBTYPE_ARM_V7 ((cpu_subtype_t) 9) /* ARMv7-A and ARMv7-R */ +#define CPU_SUBTYPE_ARM_V7F ((cpu_subtype_t) 10) /* Cortex A9 */ +#define CPU_SUBTYPE_ARM_V7S ((cpu_subtype_t) 11) /* Swift */ +#define CPU_SUBTYPE_ARM_V7K ((cpu_subtype_t) 12) +#define CPU_SUBTYPE_ARM_V8 ((cpu_subtype_t) 13) +#define CPU_SUBTYPE_ARM_V6M ((cpu_subtype_t) 14) /* Not meant to be run under xnu */ +#define CPU_SUBTYPE_ARM_V7M ((cpu_subtype_t) 15) /* Not meant to be run under xnu */ +#define CPU_SUBTYPE_ARM_V7EM ((cpu_subtype_t) 16) /* Not meant to be run under xnu */ +#define CPU_SUBTYPE_ARM_V8M ((cpu_subtype_t) 17) /* Not meant to be run under xnu */ + +/* + * ARM64 subtypes + */ +#define CPU_SUBTYPE_ARM64_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_ARM64_V8 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_ARM64E ((cpu_subtype_t) 2) + +/* CPU subtype feature flags for ptrauth on arm64e platforms */ +#define CPU_SUBTYPE_ARM64_PTR_AUTH_MASK 0x0f000000 +#define CPU_SUBTYPE_ARM64_PTR_AUTH_VERSION(x) (((x) & CPU_SUBTYPE_ARM64_PTR_AUTH_MASK) >> 24) +#ifdef PRIVATE +#define CPU_SUBTYPE_ARM64_PTR_AUTH_CURRENT_VERSION 0 +#endif /* PRIVATE */ + +/* + * ARM64_32 subtypes + */ +#define CPU_SUBTYPE_ARM64_32_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_ARM64_32_V8 ((cpu_subtype_t) 1) + +#endif /* !__ASSEMBLER__ */ + +/* + * CPU families (sysctl hw.cpufamily) + * + * These are meant to identify the CPU's marketing name - an + * application can map these to (possibly) localized strings. + * NB: the encodings of the CPU families are intentionally arbitrary. + * There is no ordering, and you should never try to deduce whether + * or not some feature is available based on the family. + * Use feature flags (eg, hw.optional.altivec) to test for optional + * functionality. + */ +#define CPUFAMILY_UNKNOWN 0 +#define CPUFAMILY_POWERPC_G3 0xcee41549 +#define CPUFAMILY_POWERPC_G4 0x77c184ae +#define CPUFAMILY_POWERPC_G5 0xed76d8aa +#define CPUFAMILY_INTEL_6_13 0xaa33392b +#define CPUFAMILY_INTEL_PENRYN 0x78ea4fbc +#define CPUFAMILY_INTEL_NEHALEM 0x6b5a4cd2 +#define CPUFAMILY_INTEL_WESTMERE 0x573b5eec +#define CPUFAMILY_INTEL_SANDYBRIDGE 0x5490b78c +#define CPUFAMILY_INTEL_IVYBRIDGE 0x1f65e835 +#define CPUFAMILY_INTEL_HASWELL 0x10b282dc +#define CPUFAMILY_INTEL_BROADWELL 0x582ed09c +#define CPUFAMILY_INTEL_SKYLAKE 0x37fc219f +#define CPUFAMILY_INTEL_KABYLAKE 0x0f817246 +#define CPUFAMILY_INTEL_ICELAKE 0x38435547 +#define CPUFAMILY_ARM_9 0xe73283ae +#define CPUFAMILY_ARM_11 0x8ff620d8 +#define CPUFAMILY_ARM_XSCALE 0x53b005f5 +#define CPUFAMILY_ARM_12 0xbd1b0ae9 +#define CPUFAMILY_ARM_13 0x0cc90e64 +#define CPUFAMILY_ARM_14 0x96077ef1 +#define CPUFAMILY_ARM_15 0xa8511bca +#define CPUFAMILY_ARM_SWIFT 0x1e2d6381 +#define CPUFAMILY_ARM_CYCLONE 0x37a09642 +#define CPUFAMILY_ARM_TYPHOON 0x2c91a47e +#define CPUFAMILY_ARM_TWISTER 0x92fb37c8 +#define CPUFAMILY_ARM_HURRICANE 0x67ceee93 +#define CPUFAMILY_ARM_MONSOON_MISTRAL 0xe81e7ef6 +#define CPUFAMILY_ARM_VORTEX_TEMPEST 0x07d34b9f +#define CPUFAMILY_ARM_LIGHTNING_THUNDER 0x462504d2 +#ifndef RC_HIDE_XNU_FIRESTORM +#define CPUFAMILY_ARM_FIRESTORM_ICESTORM 0x1b588bb3 +#endif /* !RC_HIDE_XNU_FIRESTORM */ + +/* Described in rdar://64125549 */ +#define CPUSUBFAMILY_UNKNOWN 0 +#define CPUSUBFAMILY_ARM_HP 1 +#define CPUSUBFAMILY_ARM_HG 2 +#define CPUSUBFAMILY_ARM_M 3 +#ifndef RC_HIDE_XNU_FIRESTORM +#define CPUSUBFAMILY_ARM_HS 4 +#define CPUSUBFAMILY_ARM_HC_HD 5 +#endif /* !RC_HIDE_XNU_FIRESTORM */ + +/* The following synonyms are deprecated: */ +#define CPUFAMILY_INTEL_6_23 CPUFAMILY_INTEL_PENRYN +#define CPUFAMILY_INTEL_6_26 CPUFAMILY_INTEL_NEHALEM + + +#endif /* _MACH_MACHINE_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/boolean.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/boolean.h similarity index 92% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/boolean.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/boolean.h index ffdc2390a..adca083dc 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/boolean.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/boolean.h @@ -2,7 +2,7 @@ * Copyright (c) 2000-2007 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,7 +22,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ @@ -31,10 +31,10 @@ #if defined (__i386__) || defined(__x86_64__) #include "mach/i386/boolean.h" -#elif defined (__arm__) +#elif defined (__arm__) || defined (__arm64__) || defined(__aarch64__) #include "mach/arm/boolean.h" #else #error architecture not supported #endif -#endif /* _MACH_MACHINE_BOOLEAN_H_ */ +#endif /* _MACH_MACHINE_BOOLEAN_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/thread_state.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/thread_state.h similarity index 81% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/thread_state.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/thread_state.h index 1547acac7..fceb4279e 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/thread_state.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/thread_state.h @@ -6,4 +6,4 @@ #define THREAD_STATE_MAX 1 -#endif /* _MACH_MACHINE_THREAD_STATE_H_ */ +#endif /* _MACH_MACHINE_THREAD_STATE_H_ */ \ No newline at end of file diff --git a/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h new file mode 100644 index 000000000..4309afdc3 --- /dev/null +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/thread_status.h @@ -0,0 +1 @@ +/* This file intentionally left blank */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/vm_types.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/vm_types.h similarity index 92% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/vm_types.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/vm_types.h index 8ccd24be5..7ee7ac8e8 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/machine/vm_types.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/machine/vm_types.h @@ -2,7 +2,7 @@ * Copyright (c) 2000-2007 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,7 +22,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ @@ -31,10 +31,10 @@ #if defined (__i386__) || defined(__x86_64__) #include "mach/i386/vm_types.h" -#elif defined (__arm__) +#elif defined (__arm__) || defined (__arm64__) || defined(__aarch64__) #include "mach/arm/vm_types.h" #else #error architecture not supported #endif -#endif /* _MACH_MACHINE_VM_TYPES_H_ */ +#endif /* _MACH_MACHINE_VM_TYPES_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/thread_status.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/thread_status.h similarity index 80% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/thread_status.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/thread_status.h index aead09bf9..f742500ca 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/thread_status.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/thread_status.h @@ -2,7 +2,7 @@ * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,7 +22,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* @@ -32,24 +32,24 @@ * Mach Operating System * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ @@ -65,8 +65,8 @@ * */ -#ifndef _MACH_THREAD_STATUS_H_ -#define _MACH_THREAD_STATUS_H_ +#ifndef _MACH_THREAD_STATUS_H_ +#define _MACH_THREAD_STATUS_H_ /* * The actual structure that comprises the thread state is defined @@ -80,15 +80,21 @@ * Generic definition for machine-dependent thread status. */ -typedef natural_t *thread_state_t; /* Variable-length array */ +typedef natural_t *thread_state_t; /* Variable-length array */ /* THREAD_STATE_MAX is now defined in */ -typedef natural_t thread_state_data_t[THREAD_STATE_MAX]; +typedef natural_t thread_state_data_t[THREAD_STATE_MAX]; + +#define THREAD_STATE_FLAVOR_LIST 0 /* List of valid flavors */ +#define THREAD_STATE_FLAVOR_LIST_NEW 128 +#define THREAD_STATE_FLAVOR_LIST_10_9 129 +#define THREAD_STATE_FLAVOR_LIST_10_13 130 +#define THREAD_STATE_FLAVOR_LIST_10_15 131 -#define THREAD_STATE_FLAVOR_LIST 0 /* List of valid flavors */ -#define THREAD_STATE_FLAVOR_LIST_NEW 128 +typedef int thread_state_flavor_t; +typedef thread_state_flavor_t *thread_state_flavor_array_t; -typedef int thread_state_flavor_t; -typedef thread_state_flavor_t *thread_state_flavor_array_t; +#define THREAD_CONVERT_THREAD_STATE_TO_SELF 1 +#define THREAD_CONVERT_THREAD_STATE_FROM_SELF 2 -#endif /* _MACH_THREAD_STATUS_H_ */ +#endif /* _MACH_THREAD_STATUS_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/vm_prot.h b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/vm_prot.h similarity index 57% rename from shared/sentry/external/breakpad/src/third_party/mac_headers/mach/vm_prot.h rename to shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/vm_prot.h index 07c2114e5..b19c8e247 100644 --- a/shared/sentry/external/breakpad/src/third_party/mac_headers/mach/vm_prot.h +++ b/shared/sentry/src/external/breakpad/src/third_party/mac_headers/mach/vm_prot.h @@ -1,8 +1,8 @@ /* - * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2021 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,34 +22,34 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ */ -/* +/* * Mach Operating System * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ @@ -63,8 +63,8 @@ * */ -#ifndef _MACH_VM_PROT_H_ -#define _MACH_VM_PROT_H_ +#ifndef _MACH_VM_PROT_H_ +#define _MACH_VM_PROT_H_ /* * Types defined: @@ -72,29 +72,36 @@ * vm_prot_t VM protection values. */ -typedef int vm_prot_t; +typedef int vm_prot_t; /* * Protection values, defined as bits within the vm_prot_t type */ -#define VM_PROT_NONE ((vm_prot_t) 0x00) +#define VM_PROT_NONE ((vm_prot_t) 0x00) -#define VM_PROT_READ ((vm_prot_t) 0x01) /* read permission */ -#define VM_PROT_WRITE ((vm_prot_t) 0x02) /* write permission */ -#define VM_PROT_EXECUTE ((vm_prot_t) 0x04) /* execute permission */ +#define VM_PROT_READ ((vm_prot_t) 0x01) /* read permission */ +#define VM_PROT_WRITE ((vm_prot_t) 0x02) /* write permission */ +#define VM_PROT_EXECUTE ((vm_prot_t) 0x04) /* execute permission */ /* * The default protection for newly-created virtual memory */ -#define VM_PROT_DEFAULT (VM_PROT_READ|VM_PROT_WRITE) +#define VM_PROT_DEFAULT (VM_PROT_READ|VM_PROT_WRITE) /* * The maximum privileges possible, for parameter checking. */ -#define VM_PROT_ALL (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) +#define VM_PROT_ALL (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) + +/* + * This is an alias to VM_PROT_EXECUTE to identify callers that + * want to allocate an hardware assisted Read-only/read-write + * trusted path in userland. + */ +#define VM_PROT_RORW_TP (VM_PROT_EXECUTE) /* * An invalid protection value. @@ -103,15 +110,16 @@ typedef int vm_prot_t; * looks like VM_PROT_ALL and then some. */ -#define VM_PROT_NO_CHANGE ((vm_prot_t) 0x08) +#define VM_PROT_NO_CHANGE_LEGACY ((vm_prot_t) 0x08) +#define VM_PROT_NO_CHANGE ((vm_prot_t) 0x01000000) -/* +/* * When a caller finds that he cannot obtain write permission on a * mapped entry, the following flag can be used. The entry will * be made "needs copy" effectively copying the object (using COW), * and write permission will be added to the maximum protections - * for the associated entry. - */ + * for the associated entry. + */ #define VM_PROT_COPY ((vm_prot_t) 0x10) @@ -127,14 +135,59 @@ typedef int vm_prot_t; * walking down the shadow chain. */ -#define VM_PROT_WANTS_COPY ((vm_prot_t) 0x10) +#define VM_PROT_WANTS_COPY ((vm_prot_t) 0x10) +#ifdef PRIVATE +/* + * The caller wants this memory region treated as if it had a valid + * code signature. + */ + +#define VM_PROT_TRUSTED ((vm_prot_t) 0x20) +#endif /* PRIVATE */ /* - * Another invalid protection value. + * Another invalid protection value. * Indicates that the other protection bits are to be applied as a mask * against the actual protection bits of the map entry. */ -#define VM_PROT_IS_MASK ((vm_prot_t) 0x40) +#define VM_PROT_IS_MASK ((vm_prot_t) 0x40) + +/* + * Another invalid protection value to support execute-only protection. + * VM_PROT_STRIP_READ is a special marker that tells mprotect to not + * set VM_PROT_READ. We have to do it this way because existing code + * expects the system to set VM_PROT_READ if VM_PROT_EXECUTE is set. + * VM_PROT_EXECUTE_ONLY is just a convenience value to indicate that + * the memory should be executable and explicitly not readable. It will + * be ignored on platforms that do not support this type of protection. + */ +#define VM_PROT_STRIP_READ ((vm_prot_t) 0x80) +#define VM_PROT_EXECUTE_ONLY (VM_PROT_EXECUTE|VM_PROT_STRIP_READ) + +#ifdef PRIVATE +/* + * When using VM_PROT_COPY, fail instead of copying an executable mapping, + * since that could cause code-signing violations. + */ +#define VM_PROT_COPY_FAIL_IF_EXECUTABLE ((vm_prot_t)0x100) +#endif /* PRIVATE */ + +#if defined(__x86_64__) +/* + * Another invalid protection value to support specifying different + * execute permissions for user- and supervisor- modes. When + * MBE is enabled in a VM, VM_PROT_EXECUTE is used to indicate + * supervisor-mode execute permission, and VM_PROT_UEXEC specifies + * user-mode execute permission. Currently only used by the + * x86 Hypervisor kext. + */ +#define VM_PROT_UEXEC ((vm_prot_t) 0x8) /* User-mode Execute Permission */ + +#define VM_PROT_ALLEXEC (VM_PROT_EXECUTE | VM_PROT_UEXEC) +#else +#define VM_PROT_ALLEXEC (VM_PROT_EXECUTE) +#endif /* defined(__x86_64__) */ + -#endif /* _MACH_VM_PROT_H_ */ +#endif /* _MACH_VM_PROT_H_ */ \ No newline at end of file diff --git a/shared/sentry/external/breakpad/src/third_party/musl/COPYRIGHT b/shared/sentry/src/external/breakpad/src/third_party/musl/COPYRIGHT similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/musl/COPYRIGHT rename to shared/sentry/src/external/breakpad/src/third_party/musl/COPYRIGHT diff --git a/shared/sentry/external/breakpad/src/third_party/musl/README b/shared/sentry/src/external/breakpad/src/third_party/musl/README similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/musl/README rename to shared/sentry/src/external/breakpad/src/third_party/musl/README diff --git a/shared/sentry/external/breakpad/src/third_party/musl/README.breakpad b/shared/sentry/src/external/breakpad/src/third_party/musl/README.breakpad similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/musl/README.breakpad rename to shared/sentry/src/external/breakpad/src/third_party/musl/README.breakpad diff --git a/shared/sentry/external/breakpad/src/third_party/musl/VERSION b/shared/sentry/src/external/breakpad/src/third_party/musl/VERSION similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/musl/VERSION rename to shared/sentry/src/external/breakpad/src/third_party/musl/VERSION diff --git a/shared/sentry/external/breakpad/src/third_party/musl/include/elf.h b/shared/sentry/src/external/breakpad/src/third_party/musl/include/elf.h similarity index 100% rename from shared/sentry/external/breakpad/src/third_party/musl/include/elf.h rename to shared/sentry/src/external/breakpad/src/third_party/musl/include/elf.h diff --git a/shared/sentry/external/crashpad/.clang-format b/shared/sentry/src/external/crashpad/.clang-format similarity index 100% rename from shared/sentry/external/crashpad/.clang-format rename to shared/sentry/src/external/crashpad/.clang-format diff --git a/shared/sentry/external/crashpad/.gitattributes b/shared/sentry/src/external/crashpad/.gitattributes similarity index 100% rename from shared/sentry/external/crashpad/.gitattributes rename to shared/sentry/src/external/crashpad/.gitattributes diff --git a/shared/sentry/src/external/crashpad/.github/CODEOWNERS b/shared/sentry/src/external/crashpad/.github/CODEOWNERS new file mode 100644 index 000000000..7afbb99cb --- /dev/null +++ b/shared/sentry/src/external/crashpad/.github/CODEOWNERS @@ -0,0 +1 @@ +* @getsentry/owners-native diff --git a/shared/sentry/external/crashpad/.github/workflows/build.yml b/shared/sentry/src/external/crashpad/.github/workflows/build.yml similarity index 60% rename from shared/sentry/external/crashpad/.github/workflows/build.yml rename to shared/sentry/src/external/crashpad/.github/workflows/build.yml index cbefe8fea..5161a689e 100644 --- a/shared/sentry/external/crashpad/.github/workflows/build.yml +++ b/shared/sentry/src/external/crashpad/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: - name: Build crashpad run: | - cmake -B cmake-build + cmake -B cmake-build -D CRASHPAD_BUILD_TOOLS=On cmake --build cmake-build --parallel - name: Build crashpad with client-side stack traces @@ -34,6 +34,18 @@ jobs: cmake -B cmake-build-stacks -D CRASHPAD_ENABLE_STACKTRACE=ON cmake --build cmake-build-stacks --parallel + - name: Build crashpad Windows ARM64 + if: ${{ runner.os == 'Windows' }} + run: | + cmake -B cmake-build-arm64 -DCMAKE_TOOLCHAIN_FILE="cmake/toolchains/win_arm64.cmake" -DCRASHPAD_BUILD_TOOLS=On + cmake --build cmake-build-arm64 --config RelWithDebInfo -- /p:Platform=ARM64 + + - name: Build crashpad with client-side stack traces Windows ARM64 + if: ${{ runner.os == 'Windows' }} + run: | + cmake -B cmake-build-stacks-arm64 -DCMAKE_TOOLCHAIN_FILE="cmake/toolchains/win_arm64.cmake" -DCRASHPAD_ENABLE_STACKTRACE=ON + cmake --build cmake-build-stacks-arm64 --config RelWithDebInfo -- /p:Platform=ARM64 + build-ios: runs-on: macos-latest steps: diff --git a/shared/sentry/external/crashpad/.gitignore b/shared/sentry/src/external/crashpad/.gitignore similarity index 100% rename from shared/sentry/external/crashpad/.gitignore rename to shared/sentry/src/external/crashpad/.gitignore diff --git a/shared/sentry/external/crashpad/.gitmodules b/shared/sentry/src/external/crashpad/.gitmodules similarity index 100% rename from shared/sentry/external/crashpad/.gitmodules rename to shared/sentry/src/external/crashpad/.gitmodules diff --git a/shared/sentry/external/crashpad/.gn b/shared/sentry/src/external/crashpad/.gn similarity index 100% rename from shared/sentry/external/crashpad/.gn rename to shared/sentry/src/external/crashpad/.gn diff --git a/shared/sentry/external/crashpad/.style.yapf b/shared/sentry/src/external/crashpad/.style.yapf similarity index 100% rename from shared/sentry/external/crashpad/.style.yapf rename to shared/sentry/src/external/crashpad/.style.yapf diff --git a/shared/sentry/external/crashpad/.vpython3 b/shared/sentry/src/external/crashpad/.vpython3 similarity index 100% rename from shared/sentry/external/crashpad/.vpython3 rename to shared/sentry/src/external/crashpad/.vpython3 diff --git a/shared/sentry/external/crashpad/AUTHORS b/shared/sentry/src/external/crashpad/AUTHORS similarity index 93% rename from shared/sentry/external/crashpad/AUTHORS rename to shared/sentry/src/external/crashpad/AUTHORS index 021039243..e797d3db7 100644 --- a/shared/sentry/external/crashpad/AUTHORS +++ b/shared/sentry/src/external/crashpad/AUTHORS @@ -13,3 +13,4 @@ Vewd Software AS LG Electronics, Inc. MIPS Technologies, Inc. Darshan Sen +Ho Cheung diff --git a/shared/sentry/external/crashpad/BUILD.gn b/shared/sentry/src/external/crashpad/BUILD.gn similarity index 96% rename from shared/sentry/external/crashpad/BUILD.gn rename to shared/sentry/src/external/crashpad/BUILD.gn index a2d92e62a..83c4a32c0 100644 --- a/shared/sentry/external/crashpad/BUILD.gn +++ b/shared/sentry/src/external/crashpad/BUILD.gn @@ -39,6 +39,8 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { if (crashpad_is_in_fuchsia) { # TODO(fuchsia:46559): Fix the leaks and remove this. deps += [ "//build/config/sanitizers:suppress-lsan.DO-NOT-USE-THIS" ] + # TODO(fxbug.dev/108368): Remove this once the underlying issue is addressed. + exclude_toolchain_tags = [ "hwasan" ] } if (crashpad_is_android) { use_raw_android_executable = true @@ -121,11 +123,6 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { deps = _resources } - fuchsia_shell_package("crashpad-database-util") { - package_name = "crashpad_database_util" - deps = [ "tools:crashpad_database_util" ] - } - group("tests") { testonly = true diff --git a/shared/sentry/external/crashpad/CMakeLists.txt b/shared/sentry/src/external/crashpad/CMakeLists.txt similarity index 90% rename from shared/sentry/external/crashpad/CMakeLists.txt rename to shared/sentry/src/external/crashpad/CMakeLists.txt index f418e4af5..79edcfafc 100644 --- a/shared/sentry/external/crashpad/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/CMakeLists.txt @@ -25,11 +25,10 @@ if(CRASHPAD_ZLIB_SYSTEM) find_package(ZLIB REQUIRED) endif() -if(LINUX OR ANDROID) - find_package(OpenSSL) - if(OPENSSL_FOUND) - set(CRASHPAD_USE_BORINGSSL ON) - endif() +if (NOT (ANDROID OR FUCHSIA)) + add_compile_definitions(CRASHPAD_FLOCK_ALWAYS_SUPPORTED=1) +else() + add_compile_definitions(CRASHPAD_FLOCK_ALWAYS_SUPPORTED=0) endif() include(GNUInstallDirs) @@ -51,7 +50,11 @@ function(crashpad_install_dev) endfunction() if(WIN32) - enable_language(ASM_MASM) + if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES ARM64) + enable_language(ASM_MARMASM) + else() + enable_language(ASM_MASM) + endif() if(MINGW) find_program(JWASM_FOUND jwasm) @@ -92,7 +95,7 @@ target_compile_definitions(crashpad_interface INTERFACE CRASHPAD_LSS_SOURCE_EMBEDDED ) -if(MSVC) +if(WIN32) target_compile_definitions(crashpad_interface INTERFACE NOMINMAX UNICODE @@ -101,6 +104,11 @@ if(MSVC) _HAS_EXCEPTIONS=0 _UNICODE ) +endif() +if(MSVC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8") + string(REGEX REPLACE "/[Ww][0123]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") string(REGEX REPLACE "/[Ww][0123]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") target_compile_options(crashpad_interface INTERFACE @@ -128,6 +136,11 @@ elseif(MINGW) # redirect to wmain # FIXME: cmake 3.13 added target_link_options set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode") + if(CRASHPAD_WER_ENABLED) + message(STATUS "WER support enabled") + else() + message(STATUS "WER support disabled. Define CRASHPAD_WER_ENABLED = TRUE to enable.") + endif() endif() add_library(crashpad::interface ALIAS crashpad_interface) diff --git a/shared/sentry/external/crashpad/CONTRIBUTORS b/shared/sentry/src/external/crashpad/CONTRIBUTORS similarity index 100% rename from shared/sentry/external/crashpad/CONTRIBUTORS rename to shared/sentry/src/external/crashpad/CONTRIBUTORS diff --git a/shared/sentry/external/crashpad/DEPS b/shared/sentry/src/external/crashpad/DEPS similarity index 68% rename from shared/sentry/external/crashpad/DEPS rename to shared/sentry/src/external/crashpad/DEPS index cd9ee99f7..80c1aabf3 100644 --- a/shared/sentry/external/crashpad/DEPS +++ b/shared/sentry/src/external/crashpad/DEPS @@ -14,7 +14,10 @@ vars = { 'chromium_git': 'https://chromium.googlesource.com', - 'gn_version': 'git_revision:2ecd43a10266bd091c98e6dcde507c64f6a0dad3', + 'gn_version': 'git_revision:5e19d2fb166fbd4f6f32147fbb2f497091a54ad8', + # ninja CIPD package version. + # https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja + 'ninja_version': 'version:2@1.8.2.chromium.3', 'pull_linux_clang': False, 'pull_win_toolchain': False, # Controls whether crashpad/build/ios/setup-ios-gn.py is run as part of @@ -41,22 +44,22 @@ deps = { 'af29db7ec28d6df1c7f0f745186884091e602e07', 'crashpad/third_party/lss/lss': Var('chromium_git') + '/linux-syscall-support.git@' + - 'e1e7b0ad8ee99a875b272c8e33e308472e897660', + '9719c1e1e676814c456b55f5f070eabad6709d31', 'crashpad/third_party/mini_chromium/mini_chromium': Var('chromium_git') + '/chromium/mini_chromium@' + - '4332ddb6963750e1106efdcece6d6e2de6dc6430', + '9e21183c1ea369398d6f6ddd302c8db580bd19c4', 'crashpad/third_party/libfuzzer/src': Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' + 'fda403cf93ecb8792cb1d061564d89a6553ca020', 'crashpad/third_party/zlib/zlib': Var('chromium_git') + '/chromium/src/third_party/zlib@' + - '13dc246a58e4b72104d35f9b1809af95221ebda7', + 'fef58692c1d7bec94c4ed3d030a45a1832a9615d', # CIPD packages. 'buildtools/linux64': { 'packages': [ { - 'package': 'gn/gn/linux-amd64', + 'package': 'gn/gn/linux-${{arch}}', 'version': Var('gn_version'), } ], @@ -86,8 +89,8 @@ deps = { 'crashpad/third_party/linux/clang/linux-amd64': { 'packages': [ { - 'package': 'fuchsia/clang/linux-amd64', - 'version': 'goma', + 'package': 'fuchsia/third_party/clang/linux-amd64', + 'version': 'Tpc85d1ZwSlZ6UKl2d96GRUBGNA5JKholOKe24sRDr0C', }, ], 'condition': 'checkout_linux and pull_linux_clang', @@ -96,8 +99,8 @@ deps = { 'crashpad/third_party/fuchsia/clang/mac-amd64': { 'packages': [ { - 'package': 'fuchsia/clang/mac-amd64', - 'version': 'goma', + 'package': 'fuchsia/third_party/clang/mac-amd64', + 'version': 'MAOjNhwTu5JU3P_0C9dITiyCTtQ1n7lRJnMfB9hhvOkC', }, ], 'condition': 'checkout_fuchsia and host_os == "mac"', @@ -106,17 +109,22 @@ deps = { 'crashpad/third_party/fuchsia/clang/linux-amd64': { 'packages': [ { - 'package': 'fuchsia/clang/linux-amd64', - 'version': 'goma', + 'package': 'fuchsia/third_party/clang/linux-amd64', + 'version': 'Tpc85d1ZwSlZ6UKl2d96GRUBGNA5JKholOKe24sRDr0C', }, ], 'condition': 'checkout_fuchsia and host_os == "linux"', 'dep_type': 'cipd' }, + 'crashpad/third_party/fuchsia-gn-sdk': { + 'url': Var('chromium_git') + '/chromium/src/third_party/fuchsia-gn-sdk.git@' + + '0d6902558d92fe3d49ba9a8f638ddea829be595b', + 'condition': 'checkout_fuchsia', + }, 'crashpad/third_party/fuchsia/sdk/mac-amd64': { 'packages': [ { - 'package': 'fuchsia/sdk/gn/mac-amd64', + 'package': 'fuchsia/sdk/core/mac-amd64', 'version': 'latest' }, ], @@ -126,13 +134,58 @@ deps = { 'crashpad/third_party/fuchsia/sdk/linux-amd64': { 'packages': [ { - 'package': 'fuchsia/sdk/gn/linux-amd64', + 'package': 'fuchsia/sdk/core/linux-amd64', 'version': 'latest' }, ], 'condition': 'checkout_fuchsia and host_os == "linux"', 'dep_type': 'cipd' }, + # depot_tools/ninja wrapper calls third_party/ninja/{ninja, ninja.exe}. + # crashpad/third_party/ninja/ninja is another wrapper to call linux ninja + # or mac ninja. + # This allows crashpad developers to work for multiple platforms on the same + # machine. + 'crashpad/third_party/ninja': { + 'packages': [ + { + 'package': 'infra/3pp/tools/ninja/${{platform}}', + 'version': Var('ninja_version'), + } + ], + 'condition': 'host_os == "win"', + 'dep_type': 'cipd', + }, + 'crashpad/third_party/ninja/linux': { + 'packages': [ + { + 'package': 'infra/3pp/tools/ninja/${{platform}}', + 'version': Var('ninja_version'), + } + ], + 'condition': 'host_os == "linux"', + 'dep_type': 'cipd', + }, + 'crashpad/third_party/ninja/mac-amd64': { + 'packages': [ + { + 'package': 'infra/3pp/tools/ninja/mac-amd64', + 'version': Var('ninja_version'), + } + ], + 'condition': 'host_os == "mac" and host_cpu == "x64"', + 'dep_type': 'cipd', + }, + 'crashpad/third_party/ninja/mac-arm64': { + 'packages': [ + { + 'package': 'infra/3pp/tools/ninja/mac-arm64', + 'version': Var('ninja_version'), + } + ], + 'condition': 'host_os == "mac" and host_cpu == "arm64"', + 'dep_type': 'cipd', + }, 'crashpad/third_party/win/toolchain': { # This package is only updated when the solution in .gclient includes an # entry like: @@ -201,6 +254,15 @@ hooks = [ 'crashpad/build/install_linux_sysroot.py', ], }, + { + 'name': 'Generate Fuchsia Build Definitions', + 'pattern': '.', + 'condition': 'checkout_fuchsia', + 'action': [ + 'python3', + 'crashpad/build/fuchsia/gen_build_defs.py' + ], + }, { 'name': 'setup_gn_ios', 'pattern': '.', diff --git a/shared/sentry/external/crashpad/LICENSE b/shared/sentry/src/external/crashpad/LICENSE similarity index 100% rename from shared/sentry/external/crashpad/LICENSE rename to shared/sentry/src/external/crashpad/LICENSE diff --git a/shared/sentry/external/crashpad/README.getsentry.md b/shared/sentry/src/external/crashpad/README.getsentry.md similarity index 100% rename from shared/sentry/external/crashpad/README.getsentry.md rename to shared/sentry/src/external/crashpad/README.getsentry.md diff --git a/shared/sentry/external/crashpad/README.md b/shared/sentry/src/external/crashpad/README.md similarity index 100% rename from shared/sentry/external/crashpad/README.md rename to shared/sentry/src/external/crashpad/README.md diff --git a/shared/sentry/external/crashpad/client/BUILD.gn b/shared/sentry/src/external/crashpad/client/BUILD.gn similarity index 87% rename from shared/sentry/external/crashpad/client/BUILD.gn rename to shared/sentry/src/external/crashpad/client/BUILD.gn index 3f8880561..bc67b32f1 100644 --- a/shared/sentry/external/crashpad/client/BUILD.gn +++ b/shared/sentry/src/external/crashpad/client/BUILD.gn @@ -89,6 +89,10 @@ crashpad_static_library("client") { cflags = [ "/wd4201" ] # nonstandard extension used : nameless struct/union } + if (crashpad_is_apple) { + deps += [ "../build:apple_enable_arc" ] + } + if (crashpad_is_ios) { deps += [ "../handler:common", @@ -119,13 +123,15 @@ static_library("common") { "crash_report_database.h", "crashpad_info.cc", "crashpad_info.h", + "length_delimited_ring_buffer.h", + "ring_buffer_annotation.h", "settings.cc", "settings.h", "simple_address_range_bag.h", "simple_string_dictionary.h", ] - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { sources += [ "crash_report_database_mac.mm" ] } if (crashpad_is_win) { @@ -144,6 +150,21 @@ static_library("common") { "../util", ] deps = [ "../util" ] + configs += [ "../build:flock_always_supported_defines" ] + + if (crashpad_is_apple) { + deps += [ "../build:apple_enable_arc" ] + } +} + +crashpad_executable("ring_buffer_annotation_load_test") { + testonly = true + sources = [ "ring_buffer_annotation_load_test_main.cc" ] + deps = [ + ":client", + "$mini_chromium_source_parent:base", + "../tools:tool_support", + ] } source_set("client_test") { @@ -153,7 +174,9 @@ source_set("client_test") { "annotation_list_test.cc", "annotation_test.cc", "crash_report_database_test.cc", + "length_delimited_ring_buffer_test.cc", "prune_crash_reports_test.cc", + "ring_buffer_annotation_test.cc", "settings_test.cc", "simple_address_range_bag_test.cc", "simple_string_dictionary_test.cc", @@ -195,6 +218,10 @@ source_set("client_test") { data_deps = [ "../handler:crashpad_handler" ] } + if (crashpad_is_apple) { + deps += [ "../build:apple_enable_arc" ] + } + if (crashpad_is_win) { data_deps += [ "../handler:crashpad_handler_console", diff --git a/shared/sentry/external/crashpad/client/CMakeLists.txt b/shared/sentry/src/external/crashpad/client/CMakeLists.txt similarity index 98% rename from shared/sentry/external/crashpad/client/CMakeLists.txt rename to shared/sentry/src/external/crashpad/client/CMakeLists.txt index 4b35a0f18..1ed52149c 100644 --- a/shared/sentry/external/crashpad/client/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/client/CMakeLists.txt @@ -8,6 +8,8 @@ add_library(crashpad_client STATIC crashpad_client.h crashpad_info.cc crashpad_info.h + length_delimited_ring_buffer.h + ring_buffer_annotation.h prune_crash_reports.cc prune_crash_reports.h settings.cc diff --git a/shared/sentry/external/crashpad/client/annotation.cc b/shared/sentry/src/external/crashpad/client/annotation.cc similarity index 100% rename from shared/sentry/external/crashpad/client/annotation.cc rename to shared/sentry/src/external/crashpad/client/annotation.cc diff --git a/shared/sentry/external/crashpad/client/annotation.h b/shared/sentry/src/external/crashpad/client/annotation.h similarity index 71% rename from shared/sentry/external/crashpad/client/annotation.h rename to shared/sentry/src/external/crashpad/client/annotation.h index c4ab074d6..a5d14f0d9 100644 --- a/shared/sentry/external/crashpad/client/annotation.h +++ b/shared/sentry/src/external/crashpad/client/annotation.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -26,6 +27,7 @@ #include "base/numerics/safe_conversions.h" #include "base/strings/string_piece.h" #include "build/build_config.h" +#include "util/synchronization/scoped_spin_guard.h" namespace crashpad { #if BUILDFLAG(IS_IOS) @@ -94,6 +96,20 @@ class Annotation { kUserDefinedStart = 0x8000, }; + //! \brief Mode used to guard concurrent reads from writes. + enum class ConcurrentAccessGuardMode : bool { + //! \!brief Annotation does not guard reads from concurrent + //! writes. Annotation values can be corrupted if the process crashes + //! mid-write and the handler tries to read from the Annotation while + //! being written to. + kUnguarded = false, + + //! \!brief Annotation guards reads from concurrent writes using + //! ScopedSpinGuard. Clients must use TryCreateScopedSpinGuard() + //! before reading or writing the data in this Annotation. + kScopedSpinGuard = true, + }; + //! \brief Creates a user-defined Annotation::Type. //! //! This exists to remove the casting overhead of `enum class`. @@ -132,12 +148,11 @@ class Annotation { //! \param[in] value_ptr A pointer to the value for the annotation. The //! pointer may not be changed once associated with an annotation, but //! the data may be mutated. - constexpr Annotation(Type type, const char name[], void* const value_ptr) - : link_node_(nullptr), - name_(name), - value_ptr_(value_ptr), - size_(0), - type_(type) {} + constexpr Annotation(Type type, const char name[], void* value_ptr) + : Annotation(type, + name, + value_ptr, + ConcurrentAccessGuardMode::kUnguarded) {} Annotation(const Annotation&) = delete; Annotation& operator=(const Annotation&) = delete; @@ -172,7 +187,58 @@ class Annotation { const char* name() const { return name_; } const void* value() const { return value_ptr_; } + ConcurrentAccessGuardMode concurrent_access_guard_mode() const { + return concurrent_access_guard_mode_; + } + + //! \brief If this Annotation guards concurrent access using ScopedSpinGuard, + //! tries to obtain the spin guard and returns the result. + //! + //! \param[in] timeout_ns The timeout in nanoseconds after which to give up + //! trying to obtain the spin guard. + //! \return std::nullopt if the spin guard could not be obtained within + //! timeout_ns, or the obtained spin guard otherwise. + std::optional TryCreateScopedSpinGuard(uint64_t timeout_ns) { + // This can't use DCHECK_EQ() because ostream doesn't support + // operator<<(bool). + DCHECK(concurrent_access_guard_mode_ == + ConcurrentAccessGuardMode::kScopedSpinGuard); + if (concurrent_access_guard_mode_ == + ConcurrentAccessGuardMode::kUnguarded) { + return std::nullopt; + } + return ScopedSpinGuard::TryCreateScopedSpinGuard(timeout_ns, + spin_guard_state_); + } + protected: + //! \brief Constructs a new annotation. + //! + //! Upon construction, the annotation will not be included in any crash + //! reports until \sa SetSize() is called with a value greater than `0`. + //! + //! \param[in] type The data type of the value of the annotation. + //! \param[in] name A `NUL`-terminated C-string name for the annotation. Names + //! do not have to be unique, though not all crash processors may handle + //! Annotations with the same name. Names should be constexpr data with + //! static storage duration. + //! \param[in] value_ptr A pointer to the value for the annotation. The + //! pointer may not be changed once associated with an annotation, but + //! the data may be mutated. + //! \param[in] concurrent_access_guard_mode Mode used to guard concurrent + //! reads from writes. + constexpr Annotation(Type type, + const char name[], + void* value_ptr, + ConcurrentAccessGuardMode concurrent_access_guard_mode) + : link_node_(nullptr), + name_(name), + value_ptr_(value_ptr), + size_(0), + type_(type), + concurrent_access_guard_mode_(concurrent_access_guard_mode), + spin_guard_state_() {} + friend class AnnotationList; #if BUILDFLAG(IS_IOS) friend class internal::InProcessIntermediateDumpHandler; @@ -180,6 +246,14 @@ class Annotation { std::atomic& link_node() { return link_node_; } + Annotation* GetLinkNode(std::memory_order order = std::memory_order_seq_cst) { + return link_node_.load(order); + } + const Annotation* GetLinkNode( + std::memory_order order = std::memory_order_seq_cst) const { + return link_node_.load(order); + } + private: //! \brief Linked list next-node pointer. Accessed only by \sa AnnotationList. //! @@ -192,6 +266,11 @@ class Annotation { void* const value_ptr_; ValueSizeType size_; const Type type_; + + //! \brief Mode used to guard concurrent reads from writes. + const ConcurrentAccessGuardMode concurrent_access_guard_mode_; + + SpinGuardState spin_guard_state_; }; //! \brief An \sa Annotation that stores a `NUL`-terminated C-string value. @@ -252,9 +331,11 @@ class StringAnnotation : public Annotation { void Set(base::StringPiece string) { Annotation::ValueSizeType size = std::min(MaxSize, base::saturated_cast(string.size())); - memcpy(value_, string.data(), size); + string = string.substr(0, size); + std::copy(string.begin(), string.end(), value_); // Check for no embedded `NUL` characters. - DCHECK(!memchr(value_, '\0', size)) << "embedded NUL"; + DCHECK(string.find('\0', /*pos=*/0) == base::StringPiece::npos) + << "embedded NUL"; SetSize(size); } diff --git a/shared/sentry/external/crashpad/client/annotation_list.cc b/shared/sentry/src/external/crashpad/client/annotation_list.cc similarity index 75% rename from shared/sentry/external/crashpad/client/annotation_list.cc rename to shared/sentry/src/external/crashpad/client/annotation_list.cc index 188cadbd7..bcf7ca76a 100644 --- a/shared/sentry/external/crashpad/client/annotation_list.cc +++ b/shared/sentry/src/external/crashpad/client/annotation_list.cc @@ -77,7 +77,7 @@ Annotation* AnnotationList::Iterator::operator*() const { AnnotationList::Iterator& AnnotationList::Iterator::operator++() { CHECK_NE(curr_, tail_); - curr_ = curr_->link_node(); + curr_ = curr_->GetLinkNode(); return *this; } @@ -86,12 +86,42 @@ bool AnnotationList::Iterator::operator==( return curr_ == other.curr_; } +AnnotationList::ConstIterator::ConstIterator(const Annotation* head, + const Annotation* tail) + : curr_(head), tail_(tail) {} + +AnnotationList::ConstIterator::~ConstIterator() = default; + +const Annotation* AnnotationList::ConstIterator::operator*() const { + CHECK_NE(curr_, tail_); + return curr_; +} + +AnnotationList::ConstIterator& AnnotationList::ConstIterator::operator++() { + CHECK_NE(curr_, tail_); + curr_ = curr_->GetLinkNode(); + return *this; +} + +bool AnnotationList::ConstIterator::operator==( + const AnnotationList::ConstIterator& other) const { + return curr_ == other.curr_; +} + AnnotationList::Iterator AnnotationList::begin() { - return Iterator(head_.link_node(), tail_pointer_); + return Iterator(head_.GetLinkNode(), tail_pointer_); +} + +AnnotationList::ConstIterator AnnotationList::cbegin() const { + return ConstIterator(head_.GetLinkNode(), tail_pointer_); } AnnotationList::Iterator AnnotationList::end() { return Iterator(&tail_, tail_pointer_); } +AnnotationList::ConstIterator AnnotationList::cend() const { + return ConstIterator(&tail_, tail_pointer_); +} + } // namespace crashpad diff --git a/shared/sentry/external/crashpad/client/annotation_list.h b/shared/sentry/src/external/crashpad/client/annotation_list.h similarity index 83% rename from shared/sentry/external/crashpad/client/annotation_list.h rename to shared/sentry/src/external/crashpad/client/annotation_list.h index 10e6e37aa..eec7fb4c1 100644 --- a/shared/sentry/external/crashpad/client/annotation_list.h +++ b/shared/sentry/src/external/crashpad/client/annotation_list.h @@ -80,11 +80,37 @@ class AnnotationList { // Copy and assign are required. }; + //! \brief An InputIterator for iterating a const AnnotationList. + class ConstIterator { + public: + ~ConstIterator(); + + const Annotation* operator*() const; + ConstIterator& operator++(); + bool operator==(const ConstIterator& other) const; + bool operator!=(const ConstIterator& other) const { + return !(*this == other); + } + + private: + friend class AnnotationList; + ConstIterator(const Annotation* head, const Annotation* tail); + + const Annotation* curr_; + const Annotation* const tail_; + + // Copy and assign are required. + }; + //! \brief Returns an iterator to the first element of the annotation list. Iterator begin(); + ConstIterator begin() const { return cbegin(); } + ConstIterator cbegin() const; //! \brief Returns an iterator past the last element of the annotation list. Iterator end(); + ConstIterator end() const { return cend(); } + ConstIterator cend() const; protected: #if BUILDFLAG(IS_IOS) diff --git a/shared/sentry/external/crashpad/client/annotation_list_test.cc b/shared/sentry/src/external/crashpad/client/annotation_list_test.cc similarity index 67% rename from shared/sentry/external/crashpad/client/annotation_list_test.cc rename to shared/sentry/src/external/crashpad/client/annotation_list_test.cc index d9473c544..0ac87ffae 100644 --- a/shared/sentry/external/crashpad/client/annotation_list_test.cc +++ b/shared/sentry/src/external/crashpad/client/annotation_list_test.cc @@ -128,6 +128,100 @@ TEST_F(AnnotationList, DuplicateKeys) { EXPECT_EQ(1u, annotations.size()); } +TEST_F(AnnotationList, IteratorSingleAnnotation) { + ASSERT_EQ(annotations_.begin(), annotations_.end()); + ASSERT_EQ(annotations_.cbegin(), annotations_.cend()); + + one_.Set("1"); + + auto iterator = annotations_.begin(); + auto const_iterator = annotations_.cbegin(); + + ASSERT_NE(iterator, annotations_.end()); + ASSERT_NE(const_iterator, annotations_.cend()); + + EXPECT_EQ(*iterator, &one_); + EXPECT_EQ(*const_iterator, &one_); + + ++iterator; + ++const_iterator; + + EXPECT_EQ(iterator, annotations_.end()); + EXPECT_EQ(const_iterator, annotations_.cend()); +} + +TEST_F(AnnotationList, IteratorMultipleAnnotationsInserted) { + ASSERT_EQ(annotations_.begin(), annotations_.end()); + ASSERT_EQ(annotations_.cbegin(), annotations_.cend()); + + one_.Set("1"); + two_.Set("2"); + + // New annotations are inserted to the beginning of the list. Hence, |two_| + // must be the first annotation, followed by |one_|. + { + auto iterator = annotations_.begin(); + auto const_iterator = annotations_.cbegin(); + + ASSERT_NE(iterator, annotations_.end()); + ASSERT_NE(const_iterator, annotations_.cend()); + + EXPECT_EQ(*iterator, &two_); + EXPECT_EQ(*const_iterator, &two_); + + ++iterator; + ++const_iterator; + + ASSERT_NE(iterator, annotations_.end()); + ASSERT_NE(const_iterator, annotations_.cend()); + + EXPECT_EQ(*iterator, &one_); + EXPECT_EQ(*const_iterator, &one_); + + ++iterator; + ++const_iterator; + + EXPECT_EQ(iterator, annotations_.end()); + EXPECT_EQ(const_iterator, annotations_.cend()); + } +} + +TEST_F(AnnotationList, IteratorMultipleAnnotationsInsertedAndRemoved) { + ASSERT_EQ(annotations_.begin(), annotations_.end()); + ASSERT_EQ(annotations_.cbegin(), annotations_.cend()); + + one_.Set("1"); + two_.Set("2"); + one_.Clear(); + two_.Clear(); + + // Even after clearing, Annotations are still inserted in the list and + // reachable via the iterators. + auto iterator = annotations_.begin(); + auto const_iterator = annotations_.cbegin(); + + ASSERT_NE(iterator, annotations_.end()); + ASSERT_NE(const_iterator, annotations_.cend()); + + EXPECT_EQ(*iterator, &two_); + EXPECT_EQ(*const_iterator, &two_); + + ++iterator; + ++const_iterator; + + ASSERT_NE(iterator, annotations_.end()); + ASSERT_NE(const_iterator, annotations_.cend()); + + EXPECT_EQ(*iterator, &one_); + EXPECT_EQ(*const_iterator, &one_); + + ++iterator; + ++const_iterator; + + EXPECT_EQ(iterator, annotations_.end()); + EXPECT_EQ(const_iterator, annotations_.cend()); +} + class RaceThread : public Thread { public: explicit RaceThread(test::AnnotationList* test) : Thread(), test_(test) {} diff --git a/shared/sentry/src/external/crashpad/client/annotation_test.cc b/shared/sentry/src/external/crashpad/client/annotation_test.cc new file mode 100644 index 000000000..fd22c2a0b --- /dev/null +++ b/shared/sentry/src/external/crashpad/client/annotation_test.cc @@ -0,0 +1,238 @@ +// Copyright 2017 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "client/annotation.h" + +#include +#include + +#include "client/annotation_list.h" +#include "client/crashpad_info.h" +#include "gtest/gtest.h" +#include "test/gtest_death.h" +#include "util/misc/clock.h" +#include "util/synchronization/scoped_spin_guard.h" +#include "util/thread/thread.h" + +namespace crashpad { +namespace test { +namespace { + +class SpinGuardAnnotation final : public Annotation { + public: + SpinGuardAnnotation(Annotation::Type type, const char name[]) + : Annotation(type, + name, + &value_, + ConcurrentAccessGuardMode::kScopedSpinGuard) {} + + bool Set(bool value, uint64_t spin_guard_timeout_ns) { + auto guard = TryCreateScopedSpinGuard(spin_guard_timeout_ns); + if (!guard) { + return false; + } + value_ = value; + SetSize(sizeof(value_)); + return true; + } + + private: + bool value_; +}; + +class ScopedSpinGuardUnlockThread final : public Thread { + public: + ScopedSpinGuardUnlockThread(ScopedSpinGuard scoped_spin_guard, + uint64_t sleep_time_ns) + : scoped_spin_guard_(std::move(scoped_spin_guard)), + sleep_time_ns_(sleep_time_ns) {} + + private: + void ThreadMain() override { + SleepNanoseconds(sleep_time_ns_); + + // Move the ScopedSpinGuard member into a local variable which is + // destroyed when ThreadMain() returns. + ScopedSpinGuard local_scoped_spin_guard(std::move(scoped_spin_guard_)); + + // After this point, local_scoped_spin_guard will be destroyed and unlocked. + } + + ScopedSpinGuard scoped_spin_guard_; + const uint64_t sleep_time_ns_; +}; + +class Annotation : public testing::Test { + public: + void SetUp() override { + CrashpadInfo::GetCrashpadInfo()->set_annotations_list(&annotations_); + } + + void TearDown() override { + CrashpadInfo::GetCrashpadInfo()->set_annotations_list(nullptr); + } + + size_t AnnotationsCount() { + size_t result = 0; + for (auto* annotation : annotations_) { + if (annotation->is_set()) + ++result; + } + return result; + } + + protected: + crashpad::AnnotationList annotations_; +}; + +TEST_F(Annotation, Basics) { + constexpr crashpad::Annotation::Type kType = + crashpad::Annotation::UserDefinedType(1); + + const char kName[] = "annotation 1"; + char buffer[1024]; + crashpad::Annotation annotation(kType, kName, buffer); + + EXPECT_FALSE(annotation.is_set()); + EXPECT_EQ(0u, AnnotationsCount()); + + EXPECT_EQ(kType, annotation.type()); + EXPECT_EQ(0u, annotation.size()); + EXPECT_EQ(std::string(kName), annotation.name()); + EXPECT_EQ(buffer, annotation.value()); + + annotation.SetSize(10); + + EXPECT_TRUE(annotation.is_set()); + EXPECT_EQ(1u, AnnotationsCount()); + + EXPECT_EQ(10u, annotation.size()); + EXPECT_EQ(&annotation, *annotations_.begin()); + + annotation.Clear(); + + EXPECT_FALSE(annotation.is_set()); + EXPECT_EQ(0u, AnnotationsCount()); + + EXPECT_EQ(0u, annotation.size()); +} + +TEST_F(Annotation, StringType) { + crashpad::StringAnnotation<5> annotation("name"); + + EXPECT_FALSE(annotation.is_set()); + + EXPECT_EQ(crashpad::Annotation::Type::kString, annotation.type()); + EXPECT_EQ(0u, annotation.size()); + EXPECT_EQ(std::string("name"), annotation.name()); + EXPECT_EQ(0u, annotation.value().size()); + + annotation.Set("test"); + + EXPECT_TRUE(annotation.is_set()); + EXPECT_EQ(1u, AnnotationsCount()); + + EXPECT_EQ(4u, annotation.size()); + EXPECT_EQ("test", annotation.value()); + + annotation.Set(std::string("loooooooooooong")); + + EXPECT_TRUE(annotation.is_set()); + EXPECT_EQ(1u, AnnotationsCount()); + + EXPECT_EQ(5u, annotation.size()); + EXPECT_EQ("loooo", annotation.value()); +} + +TEST_F(Annotation, BaseAnnotationShouldNotSupportSpinGuard) { + char buffer[1024]; + crashpad::Annotation annotation( + crashpad::Annotation::Type::kString, "no-spin-guard", buffer); + EXPECT_EQ(annotation.concurrent_access_guard_mode(), + crashpad::Annotation::ConcurrentAccessGuardMode::kUnguarded); +#if !DCHECK_IS_ON() + // This fails a DCHECK() in debug builds, so only test it when DCHECK() + // is not on. + EXPECT_EQ(std::nullopt, annotation.TryCreateScopedSpinGuard(0)); +#endif +} + +TEST_F(Annotation, CustomAnnotationShouldSupportSpinGuardAndSet) { + constexpr crashpad::Annotation::Type kType = + crashpad::Annotation::UserDefinedType(1); + SpinGuardAnnotation spin_guard_annotation(kType, "spin-guard"); + EXPECT_EQ(spin_guard_annotation.concurrent_access_guard_mode(), + crashpad::Annotation::ConcurrentAccessGuardMode::kScopedSpinGuard); + EXPECT_TRUE(spin_guard_annotation.Set(true, 0)); + EXPECT_EQ(1U, spin_guard_annotation.size()); +} + +TEST_F(Annotation, CustomAnnotationSetShouldFailIfRunConcurrently) { + constexpr crashpad::Annotation::Type kType = + crashpad::Annotation::UserDefinedType(1); + SpinGuardAnnotation spin_guard_annotation(kType, "spin-guard"); + auto guard = spin_guard_annotation.TryCreateScopedSpinGuard(0); + EXPECT_NE(std::nullopt, guard); + // This should fail, since the guard is already held and the timeout is 0. + EXPECT_FALSE(spin_guard_annotation.Set(true, 0)); +} + +TEST_F(Annotation, + CustomAnnotationSetShouldSucceedIfSpinGuardUnlockedAsynchronously) { + constexpr crashpad::Annotation::Type kType = + crashpad::Annotation::UserDefinedType(1); + SpinGuardAnnotation spin_guard_annotation(kType, "spin-guard"); + auto guard = spin_guard_annotation.TryCreateScopedSpinGuard(0); + EXPECT_NE(std::nullopt, guard); + // Pass the guard off to a background thread which unlocks it after 1 ms. + constexpr uint64_t kSleepTimeNs = 1000000; // 1 ms + ScopedSpinGuardUnlockThread unlock_thread(std::move(guard.value()), + kSleepTimeNs); + unlock_thread.Start(); + + // Try to set the annotation with a 100 ms timeout. + constexpr uint64_t kSpinGuardTimeoutNanos = 100000000; // 100 ms + + // This should succeed after 1 ms, since the timeout is much larger than the + // time the background thread holds the guard. + EXPECT_TRUE(spin_guard_annotation.Set(true, kSpinGuardTimeoutNanos)); + + unlock_thread.Join(); +} + +TEST(StringAnnotation, ArrayOfString) { + static crashpad::StringAnnotation<4> annotations[] = { + {"test-1", crashpad::StringAnnotation<4>::Tag::kArray}, + {"test-2", crashpad::StringAnnotation<4>::Tag::kArray}, + {"test-3", crashpad::StringAnnotation<4>::Tag::kArray}, + {"test-4", crashpad::StringAnnotation<4>::Tag::kArray}, + }; + + for (auto& annotation : annotations) { + EXPECT_FALSE(annotation.is_set()); + } +} + +#if DCHECK_IS_ON() + +TEST(AnnotationDeathTest, EmbeddedNUL) { + crashpad::StringAnnotation<5> annotation("name"); + EXPECT_DEATH_CHECK(annotation.Set(std::string("te\0st", 5)), "embedded NUL"); +} + +#endif + +} // namespace +} // namespace test +} // namespace crashpad diff --git a/shared/sentry/external/crashpad/client/client_argv_handling.cc b/shared/sentry/src/external/crashpad/client/client_argv_handling.cc similarity index 94% rename from shared/sentry/external/crashpad/client/client_argv_handling.cc rename to shared/sentry/src/external/crashpad/client/client_argv_handling.cc index 766812cdf..af7270b38 100644 --- a/shared/sentry/external/crashpad/client/client_argv_handling.cc +++ b/shared/sentry/src/external/crashpad/client/client_argv_handling.cc @@ -32,6 +32,7 @@ std::vector BuildHandlerArgvStrings( const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments) { @@ -54,6 +55,10 @@ std::vector BuildHandlerArgvStrings( argv_strings.push_back(FormatArgumentString("url", url)); } + if (!http_proxy.empty()) { + argv_strings.push_back(FormatArgumentString("http-proxy", http_proxy)); + } + for (const auto& kv : annotations) { argv_strings.push_back( FormatArgumentString("annotation", kv.first + '=' + kv.second)); diff --git a/shared/sentry/external/crashpad/client/client_argv_handling.h b/shared/sentry/src/external/crashpad/client/client_argv_handling.h similarity index 98% rename from shared/sentry/external/crashpad/client/client_argv_handling.h rename to shared/sentry/src/external/crashpad/client/client_argv_handling.h index ba05bd352..d3c083f7a 100644 --- a/shared/sentry/external/crashpad/client/client_argv_handling.h +++ b/shared/sentry/src/external/crashpad/client/client_argv_handling.h @@ -34,6 +34,7 @@ std::vector BuildHandlerArgvStrings( const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments = {}); diff --git a/shared/sentry/external/crashpad/client/crash_report_database.cc b/shared/sentry/src/external/crashpad/client/crash_report_database.cc similarity index 100% rename from shared/sentry/external/crashpad/client/crash_report_database.cc rename to shared/sentry/src/external/crashpad/client/crash_report_database.cc diff --git a/shared/sentry/external/crashpad/client/crash_report_database.h b/shared/sentry/src/external/crashpad/client/crash_report_database.h similarity index 100% rename from shared/sentry/external/crashpad/client/crash_report_database.h rename to shared/sentry/src/external/crashpad/client/crash_report_database.h diff --git a/shared/sentry/external/crashpad/client/crash_report_database_generic.cc b/shared/sentry/src/external/crashpad/client/crash_report_database_generic.cc similarity index 98% rename from shared/sentry/external/crashpad/client/crash_report_database_generic.cc rename to shared/sentry/src/external/crashpad/client/crash_report_database_generic.cc index 1ba729ac2..617a07451 100644 --- a/shared/sentry/external/crashpad/client/crash_report_database_generic.cc +++ b/shared/sentry/src/external/crashpad/client/crash_report_database_generic.cc @@ -22,6 +22,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "build/build_config.h" #include "client/settings.h" @@ -549,6 +550,16 @@ int CrashReportDatabaseGeneric::CleanDatabase(time_t lockfile_ttl) { removed += CleanReportsInState(kPending, lockfile_ttl); removed += CleanReportsInState(kCompleted, lockfile_ttl); CleanOrphanedAttachments(); +#if !CRASHPAD_FLOCK_ALWAYS_SUPPORTED + base::FilePath settings_path(kSettings); + if (Settings::IsLockExpired(settings_path, lockfile_ttl)) { + base::FilePath lockfile_path(settings_path.value() + + Settings::kLockfileExtension); + if (LoggingRemoveFile(lockfile_path)) { + ++removed; + } + } +#endif // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED return removed; } diff --git a/shared/sentry/external/crashpad/client/crash_report_database_mac.mm b/shared/sentry/src/external/crashpad/client/crash_report_database_mac.mm similarity index 98% rename from shared/sentry/external/crashpad/client/crash_report_database_mac.mm rename to shared/sentry/src/external/crashpad/client/crash_report_database_mac.mm index 7221b5955..5d72b17e5 100644 --- a/shared/sentry/external/crashpad/client/crash_report_database_mac.mm +++ b/shared/sentry/src/external/crashpad/client/crash_report_database_mac.mm @@ -30,12 +30,12 @@ #include #include +#include "base/apple/scoped_nsautorelease_pool.h" #include "base/logging.h" -#include "base/mac/scoped_nsautorelease_pool.h" #include "base/posix/eintr_wrapper.h" #include "base/scoped_generic.h" +#include "base/strings/strcat.h" #include "base/strings/string_piece.h" -#include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "client/settings.h" #include "util/file/directory_reader.h" @@ -116,9 +116,9 @@ bool CreateOrEnsureDirectoryExists(const base::FilePath& path) { // have changed, and new_name determines whether the returned xattr name will be // the old name or its new equivalent. std::string XattrNameInternal(const base::StringPiece& name, bool new_name) { - return base::StringPrintf(new_name ? "org.chromium.crashpad.database.%s" - : "com.googlecode.crashpad.%s", - name.data()); + return base::StrCat({new_name ? "org.chromium.crashpad.database." + : "com.googlecode.crashpad.", + name}); } } // namespace @@ -813,7 +813,7 @@ OperationStatus ReportsInDirectory(const base::FilePath& path, CrashReportDatabase::OperationStatus CrashReportDatabaseMac::ReportsInDirectory( const base::FilePath& path, std::vector* reports) { - base::mac::ScopedNSAutoreleasePool pool; + base::apple::ScopedNSAutoreleasePool pool; DCHECK(reports->empty()); diff --git a/shared/sentry/external/crashpad/client/crash_report_database_test.cc b/shared/sentry/src/external/crashpad/client/crash_report_database_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/crash_report_database_test.cc rename to shared/sentry/src/external/crashpad/client/crash_report_database_test.cc diff --git a/shared/sentry/external/crashpad/client/crash_report_database_win.cc b/shared/sentry/src/external/crashpad/client/crash_report_database_win.cc similarity index 98% rename from shared/sentry/external/crashpad/client/crash_report_database_win.cc rename to shared/sentry/src/external/crashpad/client/crash_report_database_win.cc index b0c5229ec..d0a630458 100644 --- a/shared/sentry/external/crashpad/client/crash_report_database_win.cc +++ b/shared/sentry/src/external/crashpad/client/crash_report_database_win.cc @@ -25,6 +25,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_math.h" #include "base/strings/utf_string_conversions.h" @@ -545,8 +546,7 @@ void Metadata::Write() { for (const auto& report : reports_) { const base::FilePath& path = report.file_path; if (path.DirName() != report_dir_) { - LOG(ERROR) << path.value().c_str() << " expected to start with " - << base::WideToUTF8(report_dir_.value()); + LOG(ERROR) << path << " expected to start with " << report_dir_; return; } records.push_back(MetadataFileReportRecord(report, &string_table)); @@ -590,12 +590,11 @@ OperationStatus Metadata::VerifyReport(const ReportDisk& report_disk, bool EnsureDirectory(const base::FilePath& path) { DWORD fileattr = GetFileAttributes(path.value().c_str()); if (fileattr == INVALID_FILE_ATTRIBUTES) { - PLOG(ERROR) << "GetFileAttributes " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "GetFileAttributes " << path; return false; } if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) == 0) { - LOG(ERROR) << "GetFileAttributes " << base::WideToUTF8(path.value()) - << ": not a directory"; + LOG(ERROR) << "GetFileAttributes " << path << ": not a directory"; return false; } return true; @@ -877,7 +876,7 @@ OperationStatus CrashReportDatabaseWin::DeleteReport(const UUID& uuid) { return os; if (!DeleteFile(report_path.value().c_str())) { - PLOG(ERROR) << "DeleteFile " << base::WideToUTF8(report_path.value()); + PLOG(ERROR) << "DeleteFile " << report_path; return kFileSystemError; } @@ -1021,8 +1020,7 @@ void CrashReportDatabaseWin::CleanOrphanedAttachments() { if (IsDirectory(path, false)) { UUID uuid; if (!uuid.InitializeFromString(filename.value())) { - LOG(ERROR) << "unexpected attachment dir name " - << filename.value().c_str(); + LOG(ERROR) << "unexpected attachment dir name " << filename; continue; } diff --git a/shared/sentry/external/crashpad/client/crashpad_client.h b/shared/sentry/src/external/crashpad/client/crashpad_client.h similarity index 95% rename from shared/sentry/external/crashpad/client/crashpad_client.h rename to shared/sentry/src/external/crashpad/client/crashpad_client.h index 2cb8eb99c..06528e309 100644 --- a/shared/sentry/external/crashpad/client/crashpad_client.h +++ b/shared/sentry/src/external/crashpad/client/crashpad_client.h @@ -27,10 +27,13 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "util/file/file_io.h" + +#if !BUILDFLAG(IS_FUCHSIA) #include "util/misc/capture_context.h" +#endif // !BUILDFLAG(IS_FUCHSIA) #if BUILDFLAG(IS_APPLE) -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #elif BUILDFLAG(IS_WIN) #include #include "util/win/scoped_handle.h" @@ -124,6 +127,7 @@ class CrashpadClient { const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, bool restartable, @@ -363,6 +367,8 @@ class CrashpadClient { //! path as its `--metrics-dir` argument. //! \param[in] url The URL of an upload server. The handler will be started //! with this URL as its `--url` argument. + //! \param[in] http_proxy The URL of an HTTP proxy. The handler will be started + //! with this URL as its `--http-proxy` argument. //! \param[in] annotations Process annotations to set in each crash report. //! The handler will be started with an `--annotation` argument for each //! element in this map. @@ -377,6 +383,7 @@ class CrashpadClient { const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments = {}); @@ -394,6 +401,8 @@ class CrashpadClient { //! path as its `--metrics-dir` argument. //! \param[in] url The URL of an upload server. The handler will be started //! with this URL as its `--url` argument. + //! \param[in] http_proxy The URL of an HTTP proxy. The handler will be started + //! with this URL as its `--http-proxy` argument. //! \param[in] annotations Process annotations to set in each crash report. //! The handler will be started with an `--annotation` argument for each //! element in this map. @@ -410,6 +419,7 @@ class CrashpadClient { const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, int socket); @@ -433,7 +443,7 @@ class CrashpadClient { static void CrashWithoutDump(const std::string& message); //! \brief The type for custom handlers installed by clients. - using FirstChanceHandlerLinux = bool (*)(int, siginfo_t*, ucontext_t*); + using FirstChanceHandler = bool (*)(int, siginfo_t*, ucontext_t*); //! \brief Installs a custom crash signal handler which runs before the //! currently installed Crashpad handler. @@ -451,7 +461,25 @@ class CrashpadClient { //! signal handler is run. //! //! \param[in] handler The custom crash signal handler to install. - static void SetFirstChanceExceptionHandler(FirstChanceHandlerLinux handler); + static void SetFirstChanceExceptionHandler(FirstChanceHandler handler); + + //! \brief Installs a custom crash signal handler which runs after the + //! currently installed Crashpad handler. + //! + //! Handling signals appropriately can be tricky and use of this method + //! should be avoided, if possible. + //! + //! A handler must have already been installed before calling this method. + //! + //! The custom handler runs in a signal handler context and must be safe for + //! that purpose. + //! + //! If the custom handler returns `true`, the signal is not reraised. + //! + //! \param[in] handler The custom crash signal handler to install. + static void SetLastChanceExceptionHandler(bool (*handler)(int, + siginfo_t*, + ucontext_t*)); //! \brief Configures a set of signals that shouldn't have Crashpad signal //! handlers installed. @@ -624,7 +652,7 @@ class CrashpadClient { //! Crashpad exception handler service. //! //! \return `true` on success, `false` on failure with a message logged. - bool SetHandlerMachPort(base::mac::ScopedMachSendRight exception_port); + bool SetHandlerMachPort(base::apple::ScopedMachSendRight exception_port); //! \brief Retrieves a send right to the process’ crash handler Mach port. //! @@ -645,12 +673,12 @@ class CrashpadClient { //! SetHandlerMachService(). This method must only be called after a //! successful call to one of those methods. `MACH_PORT_NULL` on failure //! with a message logged. - base::mac::ScopedMachSendRight GetHandlerMachPort() const; + base::apple::ScopedMachSendRight GetHandlerMachPort() const; #endif #if BUILDFLAG(IS_WIN) || DOXYGEN //! \brief The type for custom handlers installed by clients. - using FirstChanceHandlerWin = bool (*)(EXCEPTION_POINTERS*); + using FirstChanceHandler = bool (*)(EXCEPTION_POINTERS*); //! \brief Installs a custom unhandled exception filter which runs before the //! currently installed Crashpad handler. @@ -668,7 +696,7 @@ class CrashpadClient { //! unhandled exception handler is run. //! //! \param[in] handler The custom unhandled exception handler to install. - static void SetFirstChanceExceptionHandler(FirstChanceHandlerWin handler); + static void SetFirstChanceExceptionHandler(FirstChanceHandler handler); //! \brief Sets the IPC pipe of a presumably-running Crashpad handler process //! which was started with StartHandler() or by other compatible means @@ -807,11 +835,17 @@ class CrashpadClient { #endif private: +#if BUILDFLAG(IS_WIN) + //! \brief Registers process handlers for the client. + void RegisterHandlers(); +#endif + #if BUILDFLAG(IS_APPLE) - base::mac::ScopedMachSendRight exception_port_; + base::apple::ScopedMachSendRight exception_port_; #elif BUILDFLAG(IS_WIN) std::wstring ipc_pipe_; ScopedKernelHANDLE handler_start_thread_; + ScopedVectoredExceptionRegistration vectored_handler_; #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) std::set unhandled_signals_; #endif // BUILDFLAG(IS_APPLE) diff --git a/shared/sentry/external/crashpad/client/crashpad_client_fuchsia.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_fuchsia.cc similarity index 99% rename from shared/sentry/external/crashpad/client/crashpad_client_fuchsia.cc rename to shared/sentry/src/external/crashpad/client/crashpad_client_fuchsia.cc index e6addb1ce..9b09ad1bb 100644 --- a/shared/sentry/external/crashpad/client/crashpad_client_fuchsia.cc +++ b/shared/sentry/src/external/crashpad/client/crashpad_client_fuchsia.cc @@ -20,6 +20,7 @@ #include #include +#include "base/check_op.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/logging.h" #include "client/client_argv_handling.h" diff --git a/shared/sentry/external/crashpad/client/crashpad_client_ios.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_ios.cc similarity index 99% rename from shared/sentry/external/crashpad/client/crashpad_client_ios.cc rename to shared/sentry/src/external/crashpad/client/crashpad_client_ios.cc index 53adf8d4a..a34cc15e3 100644 --- a/shared/sentry/external/crashpad/client/crashpad_client_ios.cc +++ b/shared/sentry/src/external/crashpad/client/crashpad_client_ios.cc @@ -21,9 +21,9 @@ #include #include +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" #include "client/ios_handler/exception_processor.h" #include "client/ios_handler/in_process_handler.h" #include "util/ios/raw_logging.h" @@ -393,7 +393,7 @@ class CrashHandler : public Thread, Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, old_action); } - base::mac::ScopedMachReceiveRight exception_port_; + base::apple::ScopedMachReceiveRight exception_port_; ExceptionPorts::ExceptionHandlerVector original_handlers_; struct sigaction old_action_ = {}; internal::InProcessHandler in_process_handler_; diff --git a/shared/sentry/external/crashpad/client/crashpad_client_ios_test.mm b/shared/sentry/src/external/crashpad/client/crashpad_client_ios_test.mm similarity index 100% rename from shared/sentry/external/crashpad/client/crashpad_client_ios_test.mm rename to shared/sentry/src/external/crashpad/client/crashpad_client_ios_test.mm diff --git a/shared/sentry/external/crashpad/client/crashpad_client_linux.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_linux.cc similarity index 94% rename from shared/sentry/external/crashpad/client/crashpad_client_linux.cc rename to shared/sentry/src/external/crashpad/client/crashpad_client_linux.cc index 925732732..238413709 100644 --- a/shared/sentry/external/crashpad/client/crashpad_client_linux.cc +++ b/shared/sentry/src/external/crashpad/client/crashpad_client_linux.cc @@ -30,6 +30,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" @@ -131,6 +132,8 @@ std::vector BuildArgsToLaunchWithLinker( #endif // BUILDFLAG(IS_ANDROID) +using LastChanceHandler = bool (*)(int, siginfo_t*, ucontext_t*); + // A base class for Crashpad signal handler implementations. class SignalHandler { public: @@ -150,10 +153,14 @@ class SignalHandler { } } - void SetFirstChanceHandler(CrashpadClient::FirstChanceHandlerLinux handler) { + void SetFirstChanceHandler(CrashpadClient::FirstChanceHandler handler) { first_chance_handler_ = handler; } + void SetLastChanceExceptionHandler(LastChanceHandler handler) { + last_chance_handler_ = handler; + } + // The base implementation for all signal handlers, suitable for calling // directly to simulate signal delivery. void HandleCrash(int signo, siginfo_t* siginfo, void* context) { @@ -180,8 +187,10 @@ class SignalHandler { DCHECK(!handler_); handler_ = this; - return Signals::InstallCrashHandlers( - HandleOrReraiseSignal, SA_ONSTACK, &old_actions_, unhandled_signals); + return Signals::InstallCrashHandlers(HandleOrReraiseSignal, + SA_ONSTACK | SA_EXPOSE_TAGBITS, + &old_actions_, + unhandled_signals); } const ExceptionInformation& GetExceptionInfo() { @@ -210,6 +219,11 @@ class SignalHandler { if (!handler_->disabled_.test_and_set()) { handler_->HandleCrash(signo, siginfo, context); handler_->WakeThreads(); + if (handler_->last_chance_handler_ && + handler_->last_chance_handler_( + signo, siginfo, static_cast(context))) { + return; + } } else { // Processes on Android normally have several chained signal handlers that // co-operate to report crashes. e.g. WebView will have this signal @@ -251,7 +265,8 @@ class SignalHandler { Signals::OldActions old_actions_ = {}; ExceptionInformation exception_information_ = {}; - CrashpadClient::FirstChanceHandlerLinux first_chance_handler_ = nullptr; + CrashpadClient::FirstChanceHandler first_chance_handler_ = nullptr; + LastChanceHandler last_chance_handler_ = nullptr; int32_t dump_done_futex_ = kDumpNotDone; #if !defined(__cpp_lib_atomic_value_initialization) || \ __cpp_lib_atomic_value_initialization < 201911L @@ -441,6 +456,7 @@ bool CrashpadClient::StartHandler( const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, bool restartable, @@ -455,7 +471,7 @@ bool CrashpadClient::StartHandler( } std::vector argv = BuildHandlerArgvStrings( - handler, database, metrics_dir, url, annotations, arguments, attachments); + handler, database, metrics_dir, url, http_proxy, annotations, arguments, attachments); argv.push_back(FormatArgumentInt("initial-client-fd", handler_sock.get())); argv.push_back("--shared-client-connection"); @@ -674,11 +690,12 @@ bool CrashpadClient::StartHandlerAtCrash( const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments) { std::vector argv = BuildHandlerArgvStrings( - handler, database, metrics_dir, url, annotations, arguments, attachments); + handler, database, metrics_dir, url, http_proxy, annotations, arguments, attachments); auto signal_handler = LaunchAtCrashHandler::Get(); return signal_handler->Initialize(&argv, nullptr, &unhandled_signals_); @@ -690,11 +707,12 @@ bool CrashpadClient::StartHandlerForClient( const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, int socket) { std::vector argv = BuildHandlerArgvStrings( - handler, database, metrics_dir, url, annotations, arguments); + handler, database, metrics_dir, url, http_proxy, annotations, arguments); argv.push_back(FormatArgumentInt("initial-client-fd", socket)); @@ -732,11 +750,17 @@ void CrashpadClient::CrashWithoutDump(const std::string& message) { // static void CrashpadClient::SetFirstChanceExceptionHandler( - FirstChanceHandlerLinux handler) { + FirstChanceHandler handler) { DCHECK(SignalHandler::Get()); SignalHandler::Get()->SetFirstChanceHandler(handler); } +// static +void CrashpadClient::SetLastChanceExceptionHandler(LastChanceHandler handler) { + DCHECK(SignalHandler::Get()); + SignalHandler::Get()->SetLastChanceExceptionHandler(handler); +} + void CrashpadClient::SetUnhandledSignals(const std::set& signals) { DCHECK(!SignalHandler::Get()); unhandled_signals_ = signals; diff --git a/shared/sentry/external/crashpad/client/crashpad_client_linux_test.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_linux_test.cc similarity index 85% rename from shared/sentry/external/crashpad/client/crashpad_client_linux_test.cc rename to shared/sentry/src/external/crashpad/client/crashpad_client_linux_test.cc index 3e0b3decc..5d492009c 100644 --- a/shared/sentry/external/crashpad/client/crashpad_client_linux_test.cc +++ b/shared/sentry/src/external/crashpad/client/crashpad_client_linux_test.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "base/check_op.h" @@ -69,11 +70,15 @@ enum class CrashType : uint32_t { kSimulated, kBuiltinTrap, kInfiniteRecursion, + kSegvWithTagBits, + // kFakeSegv is meant to simulate a MTE segv error. + kFakeSegv, }; struct StartHandlerForSelfTestOptions { bool start_handler_at_crash; bool set_first_chance_handler; + bool set_last_chance_handler; bool crash_non_main_thread; bool client_uses_signals; bool gather_indirectly_referenced_memory; @@ -82,7 +87,7 @@ struct StartHandlerForSelfTestOptions { class StartHandlerForSelfTest : public testing::TestWithParam< - std::tuple> { + std::tuple> { public: StartHandlerForSelfTest() = default; @@ -97,6 +102,7 @@ class StartHandlerForSelfTest memset(&options_, 0, sizeof(options_)); std::tie(options_.start_handler_at_crash, options_.set_first_chance_handler, + options_.set_last_chance_handler, options_.crash_non_main_thread, options_.client_uses_signals, options_.gather_indirectly_referenced_memory, @@ -170,6 +176,10 @@ void ValidateExtraMemory(const StartHandlerForSelfTestOptions& options, } } EXPECT_EQ(pc_found, options.gather_indirectly_referenced_memory); + + if (options.crash_type == CrashType::kSegvWithTagBits) { + EXPECT_EQ(exception->ExceptionAddress(), 0xefull << 56); + } } void ValidateDump(const StartHandlerForSelfTestOptions& options, @@ -213,6 +223,15 @@ void ValidateDump(const StartHandlerForSelfTestOptions& options, #pragma clang diagnostic push #pragma clang diagnostic ignored "-Winfinite-recursion" +// Clang (masquerading as gcc) is too smart, and removes the recursion +// otherwise. May need to change if either clang or another compiler becomes +// smarter. +#if defined(COMPILER_GCC) +__attribute__((noinline)) +#endif +#if defined(__clang__) +__attribute__((optnone)) +#endif int RecurseInfinitely(int* ptr) { int buf[1 << 20]; return *ptr + RecurseInfinitely(buf); @@ -229,6 +248,10 @@ bool HandleCrashSuccessfully(int, siginfo_t*, ucontext_t*) { #pragma clang diagnostic pop } +bool HandleCrashSuccessfullyAfterReporting(int, siginfo_t*, ucontext_t*) { + return true; +} + void DoCrash(const StartHandlerForSelfTestOptions& options, CrashpadClient* client) { if (sigsetjmp(do_crash_sigjmp_env, 1) != 0) { @@ -236,16 +259,37 @@ void DoCrash(const StartHandlerForSelfTestOptions& options, } switch (options.crash_type) { - case CrashType::kSimulated: + case CrashType::kSimulated: { CRASHPAD_SIMULATE_CRASH(); break; + } - case CrashType::kBuiltinTrap: + case CrashType::kBuiltinTrap: { __builtin_trap(); + } - case CrashType::kInfiniteRecursion: + case CrashType::kInfiniteRecursion: { int val = 42; exit(RecurseInfinitely(&val)); + } + + case CrashType::kSegvWithTagBits: { + volatile char* x = nullptr; +#ifdef __aarch64__ + x += 0xefull << 56; +#endif // __aarch64__ + *x; + break; + } + + case CrashType::kFakeSegv: { + // With a regular SIGSEGV like null dereference, the signal gets reraised + // automatically, causing HandleOrReraiseSignal() to be called a second + // time, terminating the process with the signal regardless of the last + // chance handler. + raise(SIGSEGV); + break; + } } } @@ -268,7 +312,7 @@ class ScopedAltSignalStack { void Initialize() { ScopedMmap local_stack_mem; - constexpr size_t stack_size = MINSIGSTKSZ; + const size_t stack_size = MINSIGSTKSZ; ASSERT_TRUE(local_stack_mem.ResetMmap(nullptr, stack_size, PROT_READ | PROT_WRITE, @@ -376,6 +420,10 @@ CRASHPAD_CHILD_TEST_MAIN(StartHandlerForSelfTestChild) { client.SetFirstChanceExceptionHandler(HandleCrashSuccessfully); } + if (options.set_last_chance_handler) { + client.SetLastChanceExceptionHandler(HandleCrashSuccessfullyAfterReporting); + } + #if BUILDFLAG(IS_ANDROID) if (android_set_abort_message) { android_set_abort_message(kTestAbortMessage); @@ -410,6 +458,19 @@ class StartHandlerForSelfInChildTest : public MultiprocessExec { SetExpectedChildTermination(TerminationReason::kTerminationSignal, SIGSEGV); break; + case CrashType::kSegvWithTagBits: + SetExpectedChildTermination(TerminationReason::kTerminationSignal, + SIGSEGV); + break; + case CrashType::kFakeSegv: + if (!options.set_last_chance_handler) { + SetExpectedChildTermination(TerminationReason::kTerminationSignal, + SIGSEGV); + } else { + SetExpectedChildTermination(TerminationReason::kTerminationNormal, + EXIT_SUCCESS); + } + break; } } } @@ -441,7 +502,11 @@ class StartHandlerForSelfInChildTest : public MultiprocessExec { writer.Close(); if (options_.client_uses_signals && !options_.set_first_chance_handler && - options_.crash_type != CrashType::kSimulated) { + options_.crash_type != CrashType::kSimulated && + // The last chance handler will prevent the client handler from being + // called if crash type is kFakeSegv. + (!options_.set_last_chance_handler || + options_.crash_type != CrashType::kFakeSegv)) { // Wait for child's client signal handler. char c; EXPECT_TRUE(LoggingReadFileExactly(ReadPipeHandle(), &c, sizeof(c))); @@ -486,6 +551,36 @@ TEST_P(StartHandlerForSelfTest, StartHandlerInChild) { GTEST_SKIP(); } #endif // defined(ADDRESS_SANITIZER) + + // kFakeSegv does raise(SIGSEGV) to simulate a MTE error which is a SEGSEGV + // that doesn't get reraised automatically, but this causes the child process + // to flakily terminate normally on some bots (e.g. android-nougat-x86-rel) + // for some reason so this is skipped. + if (!Options().set_last_chance_handler && + Options().crash_type == CrashType::kFakeSegv) { + GTEST_SKIP(); + } + + if (Options().crash_type == CrashType::kSegvWithTagBits) { +#if !defined(ARCH_CPU_ARM64) + GTEST_SKIP() << "Testing for tag bits only exists on aarch64."; +#else + struct utsname uname_info; + ASSERT_EQ(uname(&uname_info), 0); + ASSERT_NE(uname_info.release, nullptr); + + char* release = uname_info.release; + unsigned major = strtoul(release, &release, 10); + ASSERT_EQ(*release++, '.'); + unsigned minor = strtoul(release, nullptr, 10); + + if (major < 5 || (major == 5 && minor < 11)) { + GTEST_SKIP() << "Linux kernel v" << uname_info.release + << " does not support SA_EXPOSE_TAGBITS"; + } +#endif // !defined(ARCH_CPU_ARM64) + } + StartHandlerForSelfInChildTest test(Options()); test.Run(); } @@ -498,9 +593,12 @@ INSTANTIATE_TEST_SUITE_P( testing::Bool(), testing::Bool(), testing::Bool(), + testing::Bool(), testing::Values(CrashType::kSimulated, CrashType::kBuiltinTrap, - CrashType::kInfiniteRecursion))); + CrashType::kInfiniteRecursion, + CrashType::kSegvWithTagBits, + CrashType::kFakeSegv))); // Test state for starting the handler for another process. class StartHandlerForClientTest { diff --git a/shared/sentry/external/crashpad/client/crashpad_client_mac.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_mac.cc similarity index 90% rename from shared/sentry/external/crashpad/client/crashpad_client_mac.cc rename to shared/sentry/src/external/crashpad/client/crashpad_client_mac.cc index 17cee8ecc..5dc512e2a 100644 --- a/shared/sentry/external/crashpad/client/crashpad_client_mac.cc +++ b/shared/sentry/src/external/crashpad/client/crashpad_client_mac.cc @@ -24,8 +24,9 @@ #include #include +#include "base/apple/mach_logging.h" +#include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "base/strings/stringprintf.h" #include "util/mac/mac_util.h" #include "util/mach/bootstrap.h" @@ -122,19 +123,20 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { //! //! \return On success, a send right to the Crashpad handler that has been //! started. On failure, `MACH_PORT_NULL` with a message logged. - static base::mac::ScopedMachSendRight InitialStart( + static base::apple::ScopedMachSendRight InitialStart( const base::FilePath& handler, const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments, bool restartable) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); if (!receive_right.is_valid()) { - return base::mac::ScopedMachSendRight(); + return base::apple::ScopedMachSendRight(); } mach_port_t port; @@ -146,9 +148,9 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { &right_type); if (kr != KERN_SUCCESS) { MACH_LOG(ERROR, kr) << "mach_port_extract_right"; - return base::mac::ScopedMachSendRight(); + return base::apple::ScopedMachSendRight(); } - base::mac::ScopedMachSendRight send_right(port); + base::apple::ScopedMachSendRight send_right(port); DCHECK_EQ(port, receive_right.get()); DCHECK_EQ(right_type, implicit_cast(MACH_MSG_TYPE_PORT_SEND)); @@ -167,18 +169,25 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { database, metrics_dir, url, + http_proxy, annotations, arguments, attachments, std::move(receive_right), handler_restarter.get(), false)) { - return base::mac::ScopedMachSendRight(); + return base::apple::ScopedMachSendRight(); } if (handler_restarter && - handler_restarter->StartRestartThread( - handler, database, metrics_dir, url, annotations, arguments, attachments)) { + handler_restarter->StartRestartThread(handler, + database, + metrics_dir, + url, + http_proxy, + annotations, + arguments, + attachments)) { // The thread owns the object now. std::ignore = handler_restarter.release(); } @@ -211,10 +220,11 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { database_, metrics_dir_, url_, + http_proxy_, annotations_, arguments_, attachments_, - base::mac::ScopedMachReceiveRight(rights), + base::apple::ScopedMachReceiveRight(rights), this, true); @@ -258,10 +268,11 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments, - base::mac::ScopedMachReceiveRight receive_right, + base::apple::ScopedMachReceiveRight receive_right, HandlerStarter* handler_restarter, bool restart) { DCHECK(!restart || handler_restarter); @@ -287,7 +298,7 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { // port-destroyed notifications can be delivered. handler_restarter->notify_port_.reset(); } else { - base::mac::ScopedMachSendRight previous_owner(previous); + base::apple::ScopedMachSendRight previous_owner(previous); DCHECK(restart || !previous_owner.is_valid()); } @@ -337,6 +348,9 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { if (!url.empty()) { argv.push_back(FormatArgumentString("url", url)); } + if (!http_proxy.empty()) { + argv.push_back(FormatArgumentString("http-proxy", http_proxy)); + } for (const auto& kv : annotations) { argv.push_back( FormatArgumentString("annotation", kv.first + '=' + kv.second)); @@ -380,6 +394,7 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments) { @@ -387,6 +402,7 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { database_ = database; metrics_dir_ = metrics_dir; url_ = url; + http_proxy_ = http_proxy; annotations_ = annotations; arguments_ = arguments; attachments_ = attachments; @@ -440,10 +456,11 @@ class HandlerStarter final : public NotifyServer::DefaultInterface { base::FilePath database_; base::FilePath metrics_dir_; std::string url_; + std::string http_proxy_; std::map annotations_; std::vector arguments_; std::vector attachments_; - base::mac::ScopedMachReceiveRight notify_port_; + base::apple::ScopedMachReceiveRight notify_port_; uint64_t last_start_time_; }; @@ -460,6 +477,7 @@ bool CrashpadClient::StartHandler( const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, bool restartable, @@ -468,11 +486,12 @@ bool CrashpadClient::StartHandler( // The “restartable” behavior can only be selected on OS X 10.10 and later. In // previous OS versions, if the initial client were to crash while attempting // to restart the handler, it would become an unkillable process. - base::mac::ScopedMachSendRight exception_port(HandlerStarter::InitialStart( + base::apple::ScopedMachSendRight exception_port(HandlerStarter::InitialStart( handler, database, metrics_dir, url, + http_proxy, annotations, arguments, attachments, @@ -487,7 +506,8 @@ bool CrashpadClient::StartHandler( } bool CrashpadClient::SetHandlerMachService(const std::string& service_name) { - base::mac::ScopedMachSendRight exception_port(BootstrapLookUp(service_name)); + base::apple::ScopedMachSendRight exception_port( + BootstrapLookUp(service_name)); if (!exception_port.is_valid()) { return false; } @@ -497,7 +517,7 @@ bool CrashpadClient::SetHandlerMachService(const std::string& service_name) { } bool CrashpadClient::SetHandlerMachPort( - base::mac::ScopedMachSendRight exception_port) { + base::apple::ScopedMachSendRight exception_port) { DCHECK(!exception_port_.is_valid()); DCHECK(exception_port.is_valid()); @@ -509,7 +529,7 @@ bool CrashpadClient::SetHandlerMachPort( return true; } -base::mac::ScopedMachSendRight CrashpadClient::GetHandlerMachPort() const { +base::apple::ScopedMachSendRight CrashpadClient::GetHandlerMachPort() const { DCHECK(exception_port_.is_valid()); // For the purposes of this method, only return a port set by @@ -530,16 +550,16 @@ base::mac::ScopedMachSendRight CrashpadClient::GetHandlerMachPort() const { mach_task_self(), exception_port_.get(), MACH_PORT_RIGHT_SEND, 1); if (kr != KERN_SUCCESS) { MACH_LOG(ERROR, kr) << "mach_port_mod_refs"; - return base::mac::ScopedMachSendRight(MACH_PORT_NULL); + return base::apple::ScopedMachSendRight(MACH_PORT_NULL); } - return base::mac::ScopedMachSendRight(exception_port_.get()); + return base::apple::ScopedMachSendRight(exception_port_.get()); } // static void CrashpadClient::UseSystemDefaultHandler() { - base::mac::ScopedMachSendRight - system_crash_reporter_handler(SystemCrashReporterHandler()); + base::apple::ScopedMachSendRight system_crash_reporter_handler( + SystemCrashReporterHandler()); // Proceed even if SystemCrashReporterHandler() failed, setting MACH_PORT_NULL // to clear the current exception ports. diff --git a/shared/sentry/external/crashpad/client/crashpad_client_win.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_win.cc similarity index 96% rename from shared/sentry/external/crashpad/client/crashpad_client_win.cc rename to shared/sentry/src/external/crashpad/client/crashpad_client_win.cc index 0bb7aa89c..fa87ef996 100644 --- a/shared/sentry/external/crashpad/client/crashpad_client_win.cc +++ b/shared/sentry/src/external/crashpad/client/crashpad_client_win.cc @@ -23,8 +23,10 @@ #include #include +#include #include "base/atomicops.h" +#include "base/check_op.h" #include "base/logging.h" #include "base/scoped_generic.h" #include "base/strings/stringprintf.h" @@ -63,7 +65,7 @@ HANDLE g_signal_exception = INVALID_HANDLE_VALUE; // Where we store the exception information that the crash handler reads. ExceptionInformation g_crash_exception_information; -CrashpadClient::FirstChanceHandlerWin first_chance_handler_ = nullptr; +CrashpadClient::FirstChanceHandler first_chance_handler_ = nullptr; // Guards multiple simultaneous calls to DumpWithoutCrash() in the client. base::Lock* g_non_crash_dump_lock = nullptr; @@ -203,6 +205,17 @@ LONG WINAPI UnhandledExceptionHandler(EXCEPTION_POINTERS* exception_pointers) { return EXCEPTION_CONTINUE_SEARCH; } +#if !defined(ADDRESS_SANITIZER) +LONG WINAPI HandleHeapCorruption(EXCEPTION_POINTERS* exception_pointers) { + if (exception_pointers->ExceptionRecord->ExceptionCode == + STATUS_HEAP_CORRUPTION) { + return UnhandledExceptionHandler(exception_pointers); + } + + return EXCEPTION_CONTINUE_SEARCH; +} +#endif + void HandleAbortSignal(int signum) { DCHECK_EQ(signum, SIGABRT); @@ -331,6 +344,7 @@ struct BackgroundHandlerStartThreadData { const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, const std::vector& attachments, @@ -340,6 +354,7 @@ struct BackgroundHandlerStartThreadData { database(database), metrics_dir(metrics_dir), url(url), + http_proxy(http_proxy), annotations(annotations), arguments(arguments), attachments(attachments), @@ -350,6 +365,7 @@ struct BackgroundHandlerStartThreadData { base::FilePath database; base::FilePath metrics_dir; std::string url; + std::string http_proxy; std::map annotations; std::vector arguments; std::vector attachments; @@ -405,6 +421,11 @@ bool StartHandlerProcess( FormatArgumentString("url", base::UTF8ToWide(data->url)), &command_line); } + if (!data->http_proxy.empty()) { + AppendCommandLineArgument( + FormatArgumentString("http-proxy", base::UTF8ToWide(data->http_proxy)), + &command_line); + } for (const auto& kv : data->annotations) { AppendCommandLineArgument( FormatArgumentString("annotation", @@ -520,7 +541,7 @@ bool StartHandlerProcess( // invalid command line where the first argument needed by rundll32 is not in // the correct format as required in: // https://support.microsoft.com/en-ca/help/164787/info-windows-rundll-and-rundll32-interface - const base::WStringPiece kRunDll32Exe(L"rundll32.exe"); + const std::wstring_view kRunDll32Exe(L"rundll32.exe"); bool is_embedded_in_dll = false; if (data->handler.value().size() >= kRunDll32Exe.size() && _wcsicmp(data->handler.value() @@ -592,35 +613,10 @@ void CommonInProcessInitialization() { g_non_crash_dump_lock = new base::Lock(); } -void RegisterHandlers() { - SetUnhandledExceptionFilter(&UnhandledExceptionHandler); - - // The Windows CRT's signal.h lists: - // - SIGINT - // - SIGILL - // - SIGFPE - // - SIGSEGV - // - SIGTERM - // - SIGBREAK - // - SIGABRT - // SIGILL and SIGTERM are documented as not being generated. SIGBREAK and - // SIGINT are for Ctrl-Break and Ctrl-C, and aren't something for which - // capturing a dump is warranted. SIGFPE and SIGSEGV are captured as regular - // exceptions through the unhandled exception filter. This leaves SIGABRT. In - // the standard CRT, abort() is implemented as a synchronous call to the - // SIGABRT signal handler if installed, but after doing so, the unhandled - // exception filter is not triggered (it instead __fastfail()s). So, register - // to handle SIGABRT to catch abort() calls, as client code might use this and - // expect it to cause a crash dump. This will only work when the abort() - // that's called in client code is the same (or has the same behavior) as the - // one in use here. - void (*rv)(int) = signal(SIGABRT, HandleAbortSignal); - DCHECK_NE(rv, SIG_ERR); -} - } // namespace -CrashpadClient::CrashpadClient() : ipc_pipe_(), handler_start_thread_() {} +CrashpadClient::CrashpadClient() + : ipc_pipe_(), handler_start_thread_(), vectored_handler_() {} CrashpadClient::~CrashpadClient() {} @@ -629,6 +625,7 @@ bool CrashpadClient::StartHandler( const base::FilePath& database, const base::FilePath& metrics_dir, const std::string& url, + const std::string& http_proxy, const std::map& annotations, const std::vector& arguments, bool restartable, @@ -661,6 +658,7 @@ bool CrashpadClient::StartHandler( database, metrics_dir, url, + http_proxy, annotations, arguments, attachments, @@ -694,6 +692,42 @@ bool CrashpadClient::StartHandler( } } +void CrashpadClient::RegisterHandlers() { + SetUnhandledExceptionFilter(&UnhandledExceptionHandler); + + // Windows swallows heap corruption failures but we can intercept them with + // a vectored exception handler. Note that a vectored exception handler is + // not compatible with or generally helpful in ASAN builds (ASAN inserts a + // bad dereference at the beginning of the handler, leading to recursive + // invocation of the handler). +#if !defined(ADDRESS_SANITIZER) + PVOID handler = AddVectoredExceptionHandler(true, HandleHeapCorruption); + vectored_handler_.reset(handler); +#endif + + // The Windows CRT's signal.h lists: + // - SIGINT + // - SIGILL + // - SIGFPE + // - SIGSEGV + // - SIGTERM + // - SIGBREAK + // - SIGABRT + // SIGILL and SIGTERM are documented as not being generated. SIGBREAK and + // SIGINT are for Ctrl-Break and Ctrl-C, and aren't something for which + // capturing a dump is warranted. SIGFPE and SIGSEGV are captured as regular + // exceptions through the unhandled exception filter. This leaves SIGABRT. In + // the standard CRT, abort() is implemented as a synchronous call to the + // SIGABRT signal handler if installed, but after doing so, the unhandled + // exception filter is not triggered (it instead __fastfail()s). So, register + // to handle SIGABRT to catch abort() calls, as client code might use this and + // expect it to cause a crash dump. This will only work when the abort() + // that's called in client code is the same (or has the same behavior) as the + // one in use here. + void (*rv)(int) = signal(SIGABRT, HandleAbortSignal); + DCHECK_NE(rv, SIG_ERR); +} + bool CrashpadClient::SetHandlerIPCPipe(const std::wstring& ipc_pipe) { DCHECK(ipc_pipe_.empty()); DCHECK(!ipc_pipe.empty()); @@ -1119,7 +1153,7 @@ bool CrashpadClient::DumpAndCrashTargetProcess(HANDLE process, // static void CrashpadClient::SetFirstChanceExceptionHandler( - FirstChanceHandlerWin handler) { + FirstChanceHandler handler) { first_chance_handler_ = handler; } diff --git a/shared/sentry/external/crashpad/client/crashpad_client_win_test.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_win_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/crashpad_client_win_test.cc rename to shared/sentry/src/external/crashpad/client/crashpad_client_win_test.cc diff --git a/shared/sentry/external/crashpad/client/crashpad_info.cc b/shared/sentry/src/external/crashpad/client/crashpad_info.cc similarity index 100% rename from shared/sentry/external/crashpad/client/crashpad_info.cc rename to shared/sentry/src/external/crashpad/client/crashpad_info.cc diff --git a/shared/sentry/external/crashpad/client/crashpad_info.h b/shared/sentry/src/external/crashpad/client/crashpad_info.h similarity index 100% rename from shared/sentry/external/crashpad/client/crashpad_info.h rename to shared/sentry/src/external/crashpad/client/crashpad_info.h diff --git a/shared/sentry/external/crashpad/client/crashpad_info_note.S b/shared/sentry/src/external/crashpad/client/crashpad_info_note.S similarity index 100% rename from shared/sentry/external/crashpad/client/crashpad_info_note.S rename to shared/sentry/src/external/crashpad/client/crashpad_info_note.S diff --git a/shared/sentry/external/crashpad/client/ios_handler/exception_processor.h b/shared/sentry/src/external/crashpad/client/ios_handler/exception_processor.h similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/exception_processor.h rename to shared/sentry/src/external/crashpad/client/ios_handler/exception_processor.h diff --git a/shared/sentry/external/crashpad/client/ios_handler/exception_processor.mm b/shared/sentry/src/external/crashpad/client/ios_handler/exception_processor.mm similarity index 92% rename from shared/sentry/external/crashpad/client/ios_handler/exception_processor.mm rename to shared/sentry/src/external/crashpad/client/ios_handler/exception_processor.mm index 3deaa0f5c..470b0e76f 100644 --- a/shared/sentry/external/crashpad/client/ios_handler/exception_processor.mm +++ b/shared/sentry/src/external/crashpad/client/ios_handler/exception_processor.mm @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -64,7 +65,7 @@ Class cls_unremapped; }; struct objc_exception { - id obj; + id __unsafe_unretained obj; objc_typeinfo tinfo; }; @@ -218,7 +219,7 @@ id HandleUncaughtException(NativeCPUContext* cpu_context, id exception) { // preprocessor didn't catch anything, so pass the frames or just the context // to the exception_delegate. void FinalizeUncaughtNSException(id exception) { - if ([last_exception_ isEqual:exception] && + if (last_exception() == (__bridge void*)exception && !last_handled_intermediate_dump_.empty() && exception_delegate_->MoveIntermediateDumpAtPathToPending( last_handled_intermediate_dump_)) { @@ -227,8 +228,11 @@ void FinalizeUncaughtNSException(id exception) { } std::string name, reason; - SetNSExceptionAnnotations(exception, name, reason); - NSArray* address_array = [exception callStackReturnAddresses]; + NSArray* address_array = nil; + if ([exception isKindOfClass:[NSException class]]) { + SetNSExceptionAnnotations(exception, name, reason); + address_array = [exception callStackReturnAddresses]; + } if ([address_array count] > 0) { static StringAnnotation<256> name_key("UncaughtNSException"); @@ -258,11 +262,8 @@ id MaybeCallNextPreprocessor(id exception) { // Restore the objc_setExceptionPreprocessor and NSUncaughtExceptionHandler. void Uninstall(); - NSException* last_exception() { return last_exception_; } - void set_last_exception(NSException* exception) { - [last_exception_ release]; - last_exception_ = [exception retain]; - } + void* last_exception() { return last_exception_; } + void set_last_exception(void* exception) { last_exception_ = exception; } private: ExceptionPreprocessorState() = default; @@ -272,9 +273,11 @@ void set_last_exception(NSException* exception) { // HANDLE_UNCAUGHT_NSEXCEPTION. base::FilePath last_handled_intermediate_dump_; - // Recorded last NSException in case the exception is caught and thrown again - // (without using objc_exception_rethrow.) - NSException* last_exception_ = nil; + // Recorded last NSException pointer in case the exception is caught and + // thrown again (without using objc_exception_rethrow) as an + // unsafe_unretained reference. Stored as a void* as the only safe + // operation is pointer comparison. + std::atomic last_exception_ = nil; ObjcExceptionDelegate* exception_delegate_ = nullptr; objc_exception_preprocessor next_preprocessor_ = nullptr; @@ -291,7 +294,9 @@ static __attribute__((noinline)) id HANDLE_UNCAUGHT_NSEXCEPTION( id exception, const char* sinkhole) { std::string name, reason; - SetNSExceptionAnnotations(exception, name, reason); + if ([exception isKindOfClass:[NSException class]]) { + SetNSExceptionAnnotations(exception, name, reason); + } LOG(WARNING) << "Handling Objective-C exception name: " << name << " reason: " << reason << " with sinkhole: " << sinkhole; NativeCPUContext cpu_context{}; @@ -319,6 +324,20 @@ bool ModulePathMatchesSinkhole(const char* path, const char* sinkhole) { #endif } +//! \brief Helper to release memory from calls to __cxa_allocate_exception. +class ScopedException { + public: + explicit ScopedException(objc_exception* exception) : exception_(exception) {} + + ScopedException(const ScopedException&) = delete; + ScopedException& operator=(const ScopedException&) = delete; + + ~ScopedException() { __cxxabiv1::__cxa_free_exception(exception_); } + + private: + objc_exception* exception_; // weak +}; + id ObjcExceptionPreprocessor(id exception) { // Some sinkholes don't use objc_exception_rethrow when they should, which // would otherwise prevent the exception_preprocessor from getting called @@ -326,10 +345,10 @@ id ObjcExceptionPreprocessor(id exception) { // ignore it. ExceptionPreprocessorState* preprocessor_state = ExceptionPreprocessorState::Get(); - if ([preprocessor_state->last_exception() isEqual:exception]) { + if (preprocessor_state->last_exception() == (__bridge void*)exception) { return preprocessor_state->MaybeCallNextPreprocessor(exception); } - preprocessor_state->set_last_exception(exception); + preprocessor_state->set_last_exception((__bridge void*)exception); static bool seen_first_exception; @@ -339,9 +358,14 @@ id ObjcExceptionPreprocessor(id exception) { static StringAnnotation<1024> lastexception_bt("lastexception_bt"); auto* key = seen_first_exception ? &lastexception : &firstexception; auto* bt_key = seen_first_exception ? &lastexception_bt : &firstexception_bt; - NSString* value = [NSString - stringWithFormat:@"%@ reason %@", [exception name], [exception reason]]; - key->Set(base::SysNSStringToUTF8(value)); + + if ([exception isKindOfClass:[NSException class]]) { + NSString* value = [NSString + stringWithFormat:@"%@ reason %@", [exception name], [exception reason]]; + key->Set(base::SysNSStringToUTF8(value)); + } else { + key->Set(base::SysNSStringToUTF8([exception description])); + } // This exception preprocessor runs prior to the one in libobjc, which sets // the -[NSException callStackReturnAddresses]. @@ -374,6 +398,7 @@ id ObjcExceptionPreprocessor(id exception) { // From 10.15.0 objc4-779.1/runtime/objc-exception.mm objc_exception_throw. objc_exception* exception_objc = reinterpret_cast( __cxxabiv1::__cxa_allocate_exception(sizeof(objc_exception))); + ScopedException exception_objc_owner(exception_objc); exception_objc->obj = exception; exception_objc->tinfo.vtable = objc_ehtype_vtable + 2; exception_objc->tinfo.name = object_getClassName(exception); diff --git a/shared/sentry/external/crashpad/client/ios_handler/exception_processor_test.mm b/shared/sentry/src/external/crashpad/client/ios_handler/exception_processor_test.mm similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/exception_processor_test.mm rename to shared/sentry/src/external/crashpad/client/ios_handler/exception_processor_test.mm diff --git a/shared/sentry/external/crashpad/client/ios_handler/in_process_handler.cc b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_handler.cc similarity index 99% rename from shared/sentry/external/crashpad/client/ios_handler/in_process_handler.cc rename to shared/sentry/src/external/crashpad/client/ios_handler/in_process_handler.cc index 4dd032f05..dfdc03c9b 100644 --- a/shared/sentry/external/crashpad/client/ios_handler/in_process_handler.cc +++ b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_handler.cc @@ -19,7 +19,6 @@ #include -#include "base/cxx17_backports.h" #include "base/logging.h" #include "client/ios_handler/in_process_intermediate_dump_handler.h" #include "client/prune_crash_reports.h" @@ -93,7 +92,7 @@ bool InProcessHandler::Initialize( upload_thread_options.identify_client_via_url = true; upload_thread_.reset(new CrashReportUploadThread( - database_.get(), url, upload_thread_options, callback)); + database_.get(), url, "", upload_thread_options, callback)); } if (!CreateDirectory(database)) diff --git a/shared/sentry/external/crashpad/client/ios_handler/in_process_handler.h b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_handler.h similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/in_process_handler.h rename to shared/sentry/src/external/crashpad/client/ios_handler/in_process_handler.h diff --git a/shared/sentry/external/crashpad/client/ios_handler/in_process_handler_test.cc b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_handler_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/in_process_handler_test.cc rename to shared/sentry/src/external/crashpad/client/ios_handler/in_process_handler_test.cc diff --git a/shared/sentry/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc similarity index 95% rename from shared/sentry/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc rename to shared/sentry/src/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc index b2a1b2734..a7ac5dae1 100644 --- a/shared/sentry/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc +++ b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc @@ -22,12 +22,16 @@ #include #include +#include +#include "base/check_op.h" #include "build/build_config.h" #include "snapshot/snapshot_constants.h" #include "util/ios/ios_intermediate_dump_writer.h" #include "util/ios/raw_logging.h" +#include "util/ios/scoped_vm_map.h" #include "util/ios/scoped_vm_read.h" +#include "util/synchronization/scoped_spin_guard.h" namespace crashpad { namespace internal { @@ -672,6 +676,8 @@ void InProcessIntermediateDumpHandler::WriteSystemInfo( IntermediateDumpKey::kDaylightName, daylight_name.c_str(), daylight_name.length()); + uint64_t address_mask = system_data.AddressMask(); + WriteProperty(writer, IntermediateDumpKey::kAddressMask, &address_mask); vm_size_t page_size; host_page_size(mach_host_self(), &page_size); @@ -1161,6 +1167,13 @@ void InProcessIntermediateDumpHandler::WriteCrashpadAnnotationsList( IOSIntermediateDumpWriter::ScopedArray annotations_array( writer, IntermediateDumpKey::kAnnotationObjects); ScopedVMRead current; + + // Use vm_read() to ensure that the linked-list AnnotationList head (which is + // a dummy node of type kInvalid) is valid and copy its memory into a + // newly-allocated buffer. + // + // In the case where the pointer has been clobbered or the memory range is not + // readable, skip reading all the Annotations. if (!current.Read(annotation_list->head())) { CRASHPAD_RAW_LOG("Unable to read annotation"); return; @@ -1171,6 +1184,12 @@ void InProcessIntermediateDumpHandler::WriteCrashpadAnnotationsList( index < kMaxNumberOfAnnotations; ++index) { ScopedVMRead node; + + // Like above, use vm_read() to ensure that the node in the linked list is + // valid and copy its memory into a newly-allocated buffer. + // + // In the case where the pointer has been clobbered or the memory range is + // not readable, skip reading this and all further Annotations. if (!node.Read(current->link_node())) { CRASHPAD_RAW_LOG("Unable to read annotation"); return; @@ -1185,6 +1204,36 @@ void InProcessIntermediateDumpHandler::WriteCrashpadAnnotationsList( continue; } + // For Annotations which support guarding reads from concurrent writes, map + // their memory read-write using vm_remap(), then declare a ScopedSpinGuard + // which lives for the duration of the read. + ScopedVMMap mapped_node; + std::optional annotation_guard; + if (node->concurrent_access_guard_mode() == + Annotation::ConcurrentAccessGuardMode::kScopedSpinGuard) { + constexpr vm_prot_t kDesiredProtection = VM_PROT_WRITE | VM_PROT_READ; + if (!mapped_node.Map(node.get()) || + (mapped_node.CurrentProtection() & kDesiredProtection) != + kDesiredProtection) { + CRASHPAD_RAW_LOG("Unable to map annotation"); + + // Skip this annotation rather than giving up entirely, since the linked + // node should still be valid. + continue; + } + + // TODO(https://crbug.com/crashpad/438): Pass down a `params` object into + // this method to optionally enable a timeout here. + constexpr uint64_t kTimeoutNanoseconds = 0; + annotation_guard = + mapped_node->TryCreateScopedSpinGuard(kTimeoutNanoseconds); + if (!annotation_guard) { + // This is expected if the process is writing to the Annotation, so + // don't log here and skip the annotation. + continue; + } + } + IOSIntermediateDumpWriter::ScopedArrayMap annotation_map(writer); WritePropertyCString(writer, IntermediateDumpKey::kAnnotationName, diff --git a/shared/sentry/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h rename to shared/sentry/src/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h diff --git a/shared/sentry/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc b/shared/sentry/src/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc rename to shared/sentry/src/external/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc diff --git a/shared/sentry/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc b/shared/sentry/src/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc rename to shared/sentry/src/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc diff --git a/shared/sentry/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h b/shared/sentry/src/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h similarity index 100% rename from shared/sentry/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h rename to shared/sentry/src/external/crashpad/client/ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h diff --git a/shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer.h b/shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer.h new file mode 100644 index 000000000..20a0bf149 --- /dev/null +++ b/shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer.h @@ -0,0 +1,603 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_CLIENT_LENGTH_DELIMITED_RING_BUFFER_H_ +#define CRASHPAD_CLIENT_LENGTH_DELIMITED_RING_BUFFER_H_ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "base/numerics/safe_math.h" + +namespace crashpad { + +//! \brief Capacity of a `RingBufferData`, in bytes. +using RingBufferCapacity = uint32_t; + +namespace internal { + +//! \brief Default capacity of `RingBufferData`, in bytes. +inline constexpr RingBufferCapacity kDefaultRingBufferDataCapacity = 8192; + +//! \brief A tuple holding the current range of bytes which can be read from or +//! have been written to. +struct Range final { + //! \brief The offset into a `RingBufferData` at which a `Range` begins. + using Offset = uint32_t; + + //! \brief The length inside a `RingBufferData` of a `Range` of data. + using Length = uint32_t; + + Offset offset; + Length length; +}; + +// This struct is persisted to disk, so its size must not change. +static_assert(sizeof(Range) == 8, + "struct Range is not packed on this platform"); + +//! \brief The number of bits encoded in each byte of a Base 128-encoded varint. +inline constexpr int kBase128ByteValueBits = 7; + +//! \!brief Calculates the length in bytes of `value` encoded using +//! little-endian Base 128 varint encoding. +//! \sa https://developers.google.com/protocol-buffers/docs/encoding#varints +//! +//! `LengthDelimitedRingBufferWriter` uses varint-encoded delimiters to enable +//! zero-copy deserialization of the ringbuffer's contents when storing +//! protobufs inside the ringbuffer, e.g. via +//! `google::protobuf::util::ParseDelimitedFromZeroCopyStream()` or similar. +//! +//! \sa +//! https://github.com/protocolbuffers/protobuf/blob/3202b9da88ceb75b65bbabaf4033c95e872f828d/src/google/protobuf/util/delimited_message_util.h#L85 +//! \sa +//! https://github.com/protocolbuffers/protobuf/blob/8bd49dea5e167a389d94b71d24c981d8f9fa0c99/src/google/protobuf/io/zero_copy_stream_impl_lite.h#L68 +//! \sa +//! https://github.com/protocolbuffers/protobuf/blob/8bd49dea5e167a389d94b71d24c981d8f9fa0c99/src/google/protobuf/io/coded_stream.h#L171 +//! +//! \!param[in] value Value to be encoded in Base 128 varint encoding. +//! \!return The length in bytes of `value` in Base 128 varint encoding. +template +constexpr Range::Length Base128VarintEncodedLength(IntegerType value) { + static_assert(std::is_unsigned::value); + + Range::Length size = 1; + while (value >= 0x80) { + value >>= kBase128ByteValueBits; + size++; + } + return size; +} + +// Note that std::array capacity is a size_t, not a RingBufferCapacity. +template +using RingBufferArray = std::array; + +//! \return The size of the `RingBufferArray` as a `Range::Length`. +template +constexpr Range::Length RingBufferArraySize( + const RingBufferArray& ring_buffer_data) { + static_assert(ArrayCapacity <= std::numeric_limits::max()); + return static_cast(ring_buffer_data.size()); +} + +//! \brief Reads data from the ring buffer into a target buffer. +//! \param[in] ring_buffer_data The ring buffer to read. +//! \param[in,out] ring_buffer_read_range The range of the data available +//! to read. Upon return, set to the remaining range of data available +//! to read, if any. +//! \param[in] target_buffer Buffer into which data will be written. +//! \param[in] target_buffer_length Number of bytes to write into +//! `target_buffer`. +//! +//! \return `true` if the read succeeded, `false` otherwise. On success, updates +//! `ring_buffer_read_range` to reflect the bytes consumed. +//! +//! The bytes can wrap around the end of the ring buffer, in which case the read +//! continues at the beginning of the ring buffer (if the ring buffer is long +//! enough). +template +bool ReadBytesFromRingBuffer(const RingBufferArrayType& ring_buffer_data, + internal::Range& ring_buffer_read_range, + uint8_t* target_buffer, + Range::Length target_buffer_length) { + if (target_buffer_length > ring_buffer_read_range.length) { + return false; + } + if (target_buffer_length == 0) { + return true; + } + const Range::Length initial_read_length = std::min( + target_buffer_length, + RingBufferArraySize(ring_buffer_data) - ring_buffer_read_range.offset); + memcpy(target_buffer, + &ring_buffer_data[ring_buffer_read_range.offset], + initial_read_length); + if (initial_read_length < target_buffer_length) { + const Range::Length remaining_read_length = + target_buffer_length - initial_read_length; + memcpy(target_buffer + initial_read_length, + &ring_buffer_data[0], + remaining_read_length); + } + ring_buffer_read_range.offset = + (ring_buffer_read_range.offset + target_buffer_length) % + RingBufferArraySize(ring_buffer_data); + ring_buffer_read_range.length -= target_buffer_length; + return true; +} + +//! \brief Reads a single little-endian Base 128 varint-encoded integer from +//! the ring buffer. +//! \param[in] ring_buffer_data The ring buffer to read. +//! \param[in,out] ring_buffer_read_range The range of the data available +//! to read. Upon return, set to the remaining range of data available +//! to read, if any. +//! \param[out] result Upon success, set to the decoded value read from the +//! buffer. +//! +//! \return The length in bytes of the varint if the read succeeded, +//! `std::nullopt` otherwise. On success, updates `ring_buffer_read_range` +//! to reflect the bytes available to read. +//! +//! The varint can wrap around the end of the ring buffer, in which case the +//! read continues at the beginning of the ring buffer (if the ring buffer is +//! long enough). +template +std::optional ReadBase128VarintFromRingBuffer( + const RingBufferArrayType& ring_buffer_data, + internal::Range& ring_buffer_read_range, + IntegerType& result) { + static_assert(std::is_unsigned::value); + + result = 0; + uint8_t cur_varint_byte = 0; + constexpr uint8_t kValueMask = 0x7f; + constexpr uint8_t kContinuationMask = 0x80; + Range::Length length = 0; + do { + if (!ReadBytesFromRingBuffer( + ring_buffer_data, ring_buffer_read_range, &cur_varint_byte, 1)) { + // No capacity remaining in `ring_buffer_read_range` to read the varint. + return std::nullopt; + } + IntegerType cur_varint_value = + static_cast(cur_varint_byte & kValueMask); + + // This is equivalent to: + // + // result |= (cur_varint_value << (length * kBase128ByteValueBits)); + // + // but checks the result at each step for overflow, which handles two types + // of invalid input: + // + // 1) Too many bytes with kContinuationMask set (e.g., trying to encode 6 + // bytes worth of data in a 32-bit value) + // 2) Too many bits in the final byte (e.g., the 5th byte for a 32-bit value + // has bits 33 and 34 set) + IntegerType next_result_bits; + if (!base::CheckLsh(cur_varint_value, length * kBase128ByteValueBits) + .AssignIfValid(&next_result_bits)) { + return std::nullopt; + } + result |= next_result_bits; + ++length; + } while ((cur_varint_byte & kContinuationMask) == kContinuationMask); + return length; +} + +//! \brief Writes data from the source buffer into the ring buffer. +//! \param[in] source_buffer Buffer from which data will be read. +//! \param[in] source_buffer_length The length in bytes of `source_buffer`. +//! \param[in] ring_buffer_data The ring buffer into which data will be read. +//! \param[in,out] ring_buffer_write_range The range of the data available +//! to write. Upon return, set to the remaining range of data available +//! to write, if any. +//! +//! \return `true` if write read succeeded, `false` otherwise. On success, +//! updates +//! `ring_buffer_write_range` to reflect the bytes written. +//! +//! The bytes can wrap around the end of the ring buffer, in which case the +//! write continues at the beginning of the ring buffer (if the ring buffer is +//! long enough). +template +bool WriteBytesToRingBuffer(const uint8_t* const source_buffer, + Range::Length source_buffer_length, + RingBufferArrayType& ring_buffer_data, + internal::Range& ring_buffer_write_range) { + const Range::Length ring_buffer_bytes_remaining = + RingBufferArraySize(ring_buffer_data) - ring_buffer_write_range.length; + if (source_buffer_length > ring_buffer_bytes_remaining) { + return false; + } + const Range::Length initial_write_length = std::min( + source_buffer_length, + RingBufferArraySize(ring_buffer_data) - ring_buffer_write_range.offset); + memcpy(&ring_buffer_data[ring_buffer_write_range.offset], + source_buffer, + initial_write_length); + if (initial_write_length < source_buffer_length) { + const Range::Length remaining_write_length = + source_buffer_length - initial_write_length; + memcpy(&ring_buffer_data[0], + source_buffer + initial_write_length, + remaining_write_length); + } + ring_buffer_write_range.offset = + (ring_buffer_write_range.offset + source_buffer_length) % + RingBufferArraySize(ring_buffer_data); + ring_buffer_write_range.length -= source_buffer_length; + return true; +} + +//! \brief Writes a single Base 128 varint-encoded little-endian unsigned +//! integer into the ring buffer. +//! \param[in] value The value to encode and write into the ring buffer. +//! \param[in] ring_buffer_data The ring buffer into which to write. +//! \param[in,out] ring_buffer_write_range The range of the data available +//! to write. Upon return, set to the remaining range of data available +//! to write, if any. +//! +//! \return The length in bytes of the varint if the write succeeded, +//! `std::nullopt` otherwise. On success, updates `write_buffer_read_range` +//! to reflect the range available to write, if any. +//! +//! The varint can wrap around the end of the ring buffer, in which case the +//! write continues at the beginning of the ring buffer (if the ring buffer is +//! long enough). +template +std::optional WriteBase128VarintToRingBuffer( + IntegerType value, + RingBufferArrayType& ring_buffer_data, + internal::Range& ring_buffer_write_range) { + static_assert(std::is_unsigned::value); + + uint8_t cur_varint_byte; + constexpr uint8_t kValueMask = 0x7f; + constexpr uint8_t kContinuationMask = 0x80; + + // Every varint encodes to at least 1 byte of data. + int length = 1; + + while (value > kValueMask) { + cur_varint_byte = + (static_cast(value) & kValueMask) | kContinuationMask; + if (!WriteBytesToRingBuffer( + &cur_varint_byte, 1, ring_buffer_data, ring_buffer_write_range)) { + return std::nullopt; + } + value >>= kBase128ByteValueBits; + ++length; + } + cur_varint_byte = static_cast(value); + if (!WriteBytesToRingBuffer( + &cur_varint_byte, 1, ring_buffer_data, ring_buffer_write_range)) { + return std::nullopt; + } + return length; +} + +} // namespace internal + +//! \brief Storage for a ring buffer which can hold up to +//! `RingBufferCapacity` +//! bytes of Base 128-varint delimited variable-length items. +//! +//! This struct contains a header immediately followed by the ring buffer +//! data. The current read offset and length are stored in `header.data_range`. +//! +//! The structure of this object is: +//! +//! `|magic|version|data_offset|data_length|ring_buffer_data|` +//! +//! To write data to this object, see `LengthDelimitedRingBufferWriter`. +//! To read data from this object, see `LengthDelimitedRingBufferReader`. +//! +//! The bytes of this structure are suitable for direct serialization from +//! memory to disk, e.g. as a crashpad::Annotation. +template +struct RingBufferData final { + RingBufferData() = default; + RingBufferData(RingBufferData&) = delete; + RingBufferData& operator=(RingBufferData&) = delete; + + //! \brief The type of the array holding the data in this object. + using RingBufferArrayType = internal::RingBufferArray; + + //! \brief The type of the size in bytes of operations on this object. + using SizeType = internal::Range::Length; + + //! \brief Attempts to overwrite the contents of this object by deserializing + //! the buffer into this object. + //! \param[in] buffer The bytes to deserialize into this object. + //! \param[in] length The length in bytes of `buffer`. + //! + //! \return `true` if the buffer was a valid RingBufferData and this object + //! has enough capacity to store its bytes, `false` otherwise. + bool DeserializeFromBuffer(const void* buffer, SizeType length) { + if (length < sizeof(header) || length > sizeof(header) + sizeof(data)) { + return false; + } + const Header* other_header = reinterpret_cast(buffer); + if (other_header->magic != kMagic || other_header->version != kVersion) { + return false; + } + header.data_range = other_header->data_range; + const uint8_t* other_ring_buffer_bytes = + reinterpret_cast(buffer) + sizeof(*other_header); + const SizeType other_ring_buffer_len = length - sizeof(*other_header); + memcpy(&data[0], other_ring_buffer_bytes, other_ring_buffer_len); + return true; + } + + //! \return The current length in bytes of the data written to the ring + //! buffer. + SizeType GetRingBufferLength() const { + internal::Range data_range = header.data_range; + return sizeof(header) + std::min(internal::RingBufferArraySize(data), + data_range.offset + data_range.length); + } + + //! \brief Resets the state of the ring buffer (e.g., for testing). + void ResetForTesting() { header.data_range = {0, 0}; } + + //! \brief The magic signature of the ring buffer. + static constexpr uint32_t kMagic = 0xcab00d1e; + //! \brief The version of the ring buffer. + static constexpr uint32_t kVersion = 1; + + //! \brief A header containing metadata preceding the ring buffer data. + struct Header final { + Header() : magic(kMagic), version(kVersion), data_range({0, 0}) {} + + //! \brief The fixed magic value identifying this as a ring buffer. + const uint32_t magic; + + //! \brief The version of this ring buffer data. + const uint32_t version; + + //! \brief The range of readable data in the ring buffer. + internal::Range data_range; + }; + + //! \brief The header containing ring buffer metadata. + Header header; + + //! \brief The bytes of the ring buffer data. + RingBufferArrayType data; + + // This struct is persisted to disk, so its size must not change. + static_assert(sizeof(Header) == 16); + static_assert(Capacity <= std::numeric_limits::max()); +}; + +// Ensure the ring buffer is packed correctly at its default capacity. +static_assert( + sizeof(RingBufferData) == + 16 + internal::kDefaultRingBufferDataCapacity); + +// Allow just `RingBufferData foo;` to be declared without template arguments +// using C++17 class template argument deduction. +template < + RingBufferCapacity Capacity = internal::kDefaultRingBufferDataCapacity> +RingBufferData() -> RingBufferData; + +//! \brief Reads variable-length data buffers from a `RingBufferData`, +//! delimited by Base128 varint-encoded length delimiters. +//! +//! Holds a reference to a `RingBufferData` with the capacity to hold +//! `RingBufferDataType::size()` bytes of variable-length buffers each +//! preceded by its length (encoded as a Base128 length varint). +//! +//! Provides reading capabilities via `Pop()`. +template +class LengthDelimitedRingBufferReader final { + public: + //! \brief Constructs a reader which holds a reference to `ring_buffer`. + //! \param[in] ring_buffer The ring buffer from which data will be read. + //! This object must outlive the lifetime of `ring_buffer`. + constexpr explicit LengthDelimitedRingBufferReader( + RingBufferDataType& ring_buffer) + : ring_buffer_(ring_buffer), + data_range_(ring_buffer_.header.data_range) {} + + LengthDelimitedRingBufferReader(const LengthDelimitedRingBufferReader&) = + delete; + LengthDelimitedRingBufferReader& operator=( + const LengthDelimitedRingBufferReader&) = delete; + + //! \brief Pops off the next buffer from the front of the ring buffer. + //! + //! \param[in] target_buffer On success, the buffer into which data will + //! be read. + //! \return On success, returns `true` and advances `ring_buffer.data_range` + //! past the end of the buffer read. Otherwise, returns `false`. + bool Pop(std::vector& target_buffer) { + return PopWithRange(target_buffer, data_range_); + } + + //! \brief Resets the state of the reader (e.g., for testing). + void ResetForTesting() { data_range_ = {0, 0}; } + + private: + //! \brief Pops off the next buffer from the front of the ring buffer. + //! \param[in] target_buffer On success, the buffer into which data will + //! be read. + //! \param[in,out] data_range The range of data available to read. + //! On success, updated to the remaining range avilable to read. + //! \return On success, returns `true` and advances `ring_buffer.data_range` + //! past the end of the buffer read. Otherwise, returns `false`. + bool PopWithRange(std::vector& target_buffer, + internal::Range& data_range) { + internal::Range::Length buffer_length; + if (!ReadBase128VarintFromRingBuffer( + ring_buffer_.data, data_range, buffer_length)) { + return false; + } + if (buffer_length == 0) { + // A zero-length buffer means the buffer was truncated in the middle of a + // Push(). + return false; + } + const auto previous_target_buffer_size = target_buffer.size(); + target_buffer.resize(previous_target_buffer_size + buffer_length); + if (!ReadBytesFromRingBuffer(ring_buffer_.data, + data_range, + &target_buffer[previous_target_buffer_size], + buffer_length)) { + return false; + } + return true; + } + + //! \brief Reference to the ring buffer from which data is read. + const RingBufferDataType& ring_buffer_; + //! \brief Range of data currently available to read. + internal::Range data_range_; +}; + +// Allow just `LengthDelimitedRingBufferReader reader(foo);` to be declared +// without template arguments using C++17 class template argument deduction. +template +LengthDelimitedRingBufferReader(RingBufferDataType&) + -> LengthDelimitedRingBufferReader; + +//! \brief Writes variable-length data buffers to a `RingBufferData`, +//! delimited by Base128 varint-encoded length delimiters. +//! +//! Holds a reference to a `RingBufferData` with the capacity to hold +//! `RingBufferDataType::size()` bytes of variable-length buffers each +//! preceded by its length (encoded as a Base128 length varint). +//! +//! Provides writing capabilities via `Push()`. +template +class LengthDelimitedRingBufferWriter final { + public: + //! \brief Constructs a writer which holds a reference to `ring_buffer`. + //! \param[in] ring_buffer The ring buffer into which data will be written. + //! This object must outlive the lifetime of `ring_buffer`. + constexpr explicit LengthDelimitedRingBufferWriter( + RingBufferDataType& ring_buffer) + : ring_buffer_(ring_buffer), ring_buffer_write_offset_(0) {} + + LengthDelimitedRingBufferWriter(const LengthDelimitedRingBufferWriter&) = + delete; + LengthDelimitedRingBufferWriter& operator=( + const LengthDelimitedRingBufferWriter&) = delete; + + //! \brief Writes data to the ring buffer. + //! + //! If there is not enough room remaining in the ring buffer to store the new + //! data, old data will be removed from the ring buffer in FIFO order until + //! there is room for the new data. + //! + //! \param[in] buffer The data to be written. + //! \param[in] buffer_length The lengh of `buffer`, in bytes. + //! \return On success, returns `true`, updates `ring_buffer.data_range` + //! to reflect the remaining data available to read, and updates + //! `ring_buffer_write_offset_` to reflec the current write positionl. + //! Otherwise, returns `false`. + bool Push(const void* const buffer, + typename RingBufferDataType::SizeType buffer_length) { + if (buffer_length == 0) { + // Pushing a zero-length buffer is not allowed + // (`LengthDelimitedRingBufferWriter` reserves that to represent a + // temporarily truncated item below). + return false; + } + const internal::Range::Length buffer_varint_encoded_length = + internal::Base128VarintEncodedLength(buffer_length); + const internal::Range::Length bytes_needed = + buffer_varint_encoded_length + buffer_length; + if (bytes_needed > ring_buffer_.data.size()) { + return false; + } + // If needed, move the readable region forward one buffer at a time to make + // room for `buffer_length` bytes of new data. + auto readable_data_range = ring_buffer_.header.data_range; + internal::Range::Length bytes_available = + internal::RingBufferArraySize(ring_buffer_.data) - + readable_data_range.length; + while (bytes_available < bytes_needed) { + internal::Range::Length bytes_to_skip; + auto varint_length = ReadBase128VarintFromRingBuffer( + ring_buffer_.data, readable_data_range, bytes_to_skip); + if (!varint_length.has_value()) { + return false; + } + // Skip past the next entry including its prepended varint length. + readable_data_range.offset = + (readable_data_range.offset + bytes_to_skip) % + internal::RingBufferArraySize(ring_buffer_.data); + readable_data_range.length -= bytes_to_skip; + bytes_available += varint_length.value() + bytes_to_skip; + } + // Write the varint containing `buffer_length` to the current write + // position. + internal::Range write_range = { + ring_buffer_write_offset_, + bytes_needed, + }; + + internal::WriteBase128VarintToRingBuffer( + buffer_length, ring_buffer_.data, write_range); + // Next, write the bytes from `buffer`. + internal::WriteBytesToRingBuffer( + reinterpret_cast(buffer), + buffer_length, + ring_buffer_.data, + write_range); + // Finally, update the write position and read data range taking into + // account any items skipped to make room plus the new buffer's varint + // length and the new buffer's length. + ring_buffer_write_offset_ = write_range.offset; + const internal::Range final_data_range = { + readable_data_range.offset, + readable_data_range.length + bytes_needed, + }; + ring_buffer_.header.data_range = final_data_range; + return true; + } + + //! \brief Resets the state of the ring buffer and writer (e.g., for testing). + void ResetForTesting() { + ring_buffer_.ResetForTesting(); + ring_buffer_write_offset_ = 0; + } + + private: + //! \brief Reference to the ring buffer from which data is written. + RingBufferDataType& ring_buffer_; + + // \brief Current write position next time `Push()` is invoked. + internal::Range::Offset ring_buffer_write_offset_; +}; + +// Allow just `LengthDelimitedRingBufferWriter writer(foo);` to be declared +// without template arguments using C++17 class template argument deduction. +template +LengthDelimitedRingBufferWriter(RingBufferDataType&) + -> LengthDelimitedRingBufferWriter; + +} // namespace crashpad + +#endif // CRASHPAD_CLIENT_LENGTH_DELIMITED_RING_BUFFER_H_ diff --git a/shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer_test.cc b/shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer_test.cc new file mode 100644 index 000000000..6ead89810 --- /dev/null +++ b/shared/sentry/src/external/crashpad/client/length_delimited_ring_buffer_test.cc @@ -0,0 +1,348 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "client/length_delimited_ring_buffer.h" + +#include + +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +namespace crashpad { +namespace test { +namespace { + +using testing::Eq; +using testing::IsFalse; +using testing::IsTrue; + +// Buffer with magic 0xcab00d1e, version 1, read_pos 0, length 3, and 3 bytes of +// data (1 varint length, 2 bytes data) +constexpr char kValidBufferSize3[] = + "\x1e\x0d\xb0\xca\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\x42" + "\x23"; +constexpr size_t kValidBufferSize3Len = + sizeof(kValidBufferSize3) - 1; // Remove trailing NUL. + +// Buffer with magic 0xcab00d1e, version 8, read_pos 0, length 3, and 3 bytes of +// data (1 varint length, 2 bytes data). +constexpr char kInvalidVersionBuffer[] = + "\x1e\x0d\xb0\xca\x08\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\xab" + "\xcd"; +constexpr size_t kInvalidVersionBufferLen = + sizeof(kInvalidVersionBuffer) - 1; // Remove trailing NUL. + +// Buffer representing process which crashed while in the middle of a Push() +// operation, with a previously-Push()ed buffer whose length was zeroed out at +// the start. +constexpr char kMidCrashBuffer[] = + "\x1e\x0d\xb0\xca\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x42" + "\x23"; +constexpr size_t kMidCrashBufferLen = + sizeof(kMidCrashBuffer) - 1; // Remove trailing NUL. + +constexpr uint8_t kHello[] = {0x68, 0x65, 0x6c, 0x6c, 0x6f}; + +// Invalid buffer containing malformed varint in data payload (Base 128 varint +// with length 6, which would represent a data length > 32 bits). +constexpr char kInvalidBase128VarintBuffer[] = + "\x1e\x0d\xb0\xca\x01\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x80\x80" + "\x80\x80\x80\x01"; +constexpr size_t kInvalidBase128VarintBufferLen = + sizeof(kInvalidBase128VarintBuffer) - 1; // Remove trailing NUL. + +// Invalid buffer containing malformed varint in data payload (Base 128 varint +// with length 5 but bits 33 and 34 set, which would represent a data length > +// 32 bits). +constexpr char kInvalidBase128VarintBits33And34SetBuffer[] = + "\x1e\x0d\xb0\xca\x01\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x80\x80" + "\x80\x80\x60"; +constexpr size_t kInvalidBase128VarintBits33And34SetBufferLen = + sizeof(kInvalidBase128VarintBits33And34SetBuffer) - + 1; // Remove trailing NUL. + +// Invalid buffer containing too-short data payload (varint length indicates +// payload length is 4 but payload only contains 3 bytes). +constexpr char kInvalidPayloadBufferTooShort[] = + "\x1e\x0d\xb0\xca\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04" + "\x42\x42\x42"; +constexpr size_t kInvalidPayloadBufferTooShortLen = + sizeof(kInvalidPayloadBufferTooShort) - 1; // Remove trailing NUL. + +TEST(LengthDelimitedRingBufferTest, + RingBufferDataShouldStartWithMagicAndVersion) { + RingBufferData ring_buffer; + const void* ring_buffer_bytes = static_cast(&ring_buffer); + EXPECT_THAT(memcmp(ring_buffer_bytes, "\x1e\x0d\xb0\xca\x01\x00\x00\x00", 8), + Eq(0)); +} + +TEST(LengthDelimitedRingBufferTest, + EmptyBufferSizeShouldIncludeHeaderInRingBufferLength) { + RingBufferData ring_buffer; + EXPECT_THAT(ring_buffer.GetRingBufferLength(), + Eq(16U)); // 4 for uint32 magic, 4 for uint32 version, 4 for + // uint32 read_pos, 4 for uint32 length +} + +TEST(LengthDelimitedRingBufferTest, + NonEmptyBufferSizeShouldIncludeHeaderAndData) { + RingBufferData ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + ASSERT_THAT(writer.Push(kHello, sizeof(kHello)), IsTrue()); + EXPECT_THAT(ring_buffer.GetRingBufferLength(), + Eq(22U)); // 16 for header, 1 for varint length, 5 for data +} + +TEST(LengthDelimitedRingBufferTest, PopOnEmptyBufferShouldFail) { + RingBufferData ring_buffer; + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector result; + EXPECT_THAT(reader.Pop(result), IsFalse()); +} + +TEST(LengthDelimitedRingBufferTest, PushZeroLengthShouldFail) { + RingBufferData ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + ASSERT_THAT(writer.Push(nullptr, 0), IsFalse()); +} + +TEST(LengthDelimitedRingBufferTest, PushExactlyBufferSizeThenPopShouldSucceed) { + RingBufferData ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + ASSERT_THAT(writer.Push(kHello, sizeof(kHello)), IsTrue()); + + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector result; + EXPECT_THAT(reader.Pop(result), IsTrue()); + const std::vector expected_first = {0x68, 0x65, 0x6c, 0x6c, 0x6f}; + EXPECT_THAT(result, Eq(expected_first)); +} + +TEST(LengthDelimitedRingBufferTest, PushLargerThanBufferSizeShouldFail) { + RingBufferData<4> ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + EXPECT_THAT(writer.Push(kHello, sizeof(kHello)), IsFalse()); +} + +TEST(LengthDelimitedRingBufferTest, + PushUntilFullThenPopUntilEmptyShouldReturnInFIFOOrder) { + RingBufferData<4> ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + constexpr uint8_t a = 0x41; + EXPECT_THAT(writer.Push(&a, sizeof(a)), + IsTrue()); // Writes 2 bytes (1 for length) + constexpr uint8_t b = 0x42; + EXPECT_THAT(writer.Push(&b, sizeof(b)), + IsTrue()); // Writes 2 bytes (1 for length) + + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector first; + EXPECT_THAT(reader.Pop(first), IsTrue()); + const std::vector expected_first = {0x41}; + EXPECT_THAT(first, Eq(expected_first)); + + std::vector second; + EXPECT_THAT(reader.Pop(second), IsTrue()); + const std::vector expected_second = {0x42}; + EXPECT_THAT(second, Eq(expected_second)); + + std::vector empty; + EXPECT_THAT(reader.Pop(empty), IsFalse()); +} + +TEST(LengthDelimitedRingBufferTest, + PushThenPopBuffersOfDifferingLengthsShouldReturnBuffers) { + RingBufferData<5> ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + constexpr uint8_t ab[2] = {0x41, 0x42}; + EXPECT_THAT(writer.Push(ab, sizeof(ab)), + IsTrue()); // Writes 3 bytes (1 for length) + constexpr uint8_t c = 0x43; + EXPECT_THAT(writer.Push(&c, sizeof(c)), + IsTrue()); // Writes 2 bytes (1 for length) + + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector first; + EXPECT_THAT(reader.Pop(first), IsTrue()); + const std::vector expected_first = {0x41, 0x42}; + EXPECT_THAT(first, Eq(expected_first)); + + std::vector second; + EXPECT_THAT(reader.Pop(second), IsTrue()); + const std::vector expected_second = {0x43}; + EXPECT_THAT(second, Eq(expected_second)); + + std::vector empty; + EXPECT_THAT(reader.Pop(empty), IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, PushOnFullBufferShouldOverwriteOldest) { + RingBufferData<4> ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + constexpr uint8_t a = 0x41; + EXPECT_THAT(writer.Push(&a, sizeof(a)), + IsTrue()); // Writes 2 bytes (1 for length) + constexpr uint8_t b = 0x42; + EXPECT_THAT(writer.Push(&b, sizeof(b)), + IsTrue()); // Writes 2 bytes (1 for length) + constexpr uint8_t c = 0x43; + EXPECT_THAT(writer.Push(&c, sizeof(c)), IsTrue()); // Should overwrite "A" + + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector first; + EXPECT_THAT(reader.Pop(first), IsTrue()); + const std::vector expected_first = {uint8_t{0x42}}; + EXPECT_THAT(first, Eq(expected_first)); + + std::vector second; + EXPECT_THAT(reader.Pop(second), IsTrue()); + const std::vector expected_second = {uint8_t{0x43}}; + EXPECT_THAT(second, Eq(expected_second)); +} + +TEST(LengthDelimitedRingBufferDataTest, + PushOnFullBufferShouldOverwriteMultipleOldest) { + RingBufferData<4> ring_buffer; + LengthDelimitedRingBufferWriter writer(ring_buffer); + constexpr uint8_t a = 0x41; + EXPECT_THAT(writer.Push(&a, sizeof(a)), + IsTrue()); // Writes 2 bytes (1 for length) + constexpr uint8_t b = 0x42; + EXPECT_THAT(writer.Push(&b, sizeof(b)), + IsTrue()); // Writes 2 bytes (1 for length) + constexpr uint8_t cd[] = {0x43, 0x44}; + EXPECT_THAT(writer.Push(cd, sizeof(cd)), + IsTrue()); // Needs 3 bytes; should overwrite "A" and "B" + + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector first; + EXPECT_THAT(reader.Pop(first), IsTrue()); + const std::vector expected_first = {0x43, 0x44}; + EXPECT_THAT(first, Eq(expected_first)); + + std::vector empty; + EXPECT_THAT(reader.Pop(empty), IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, PushThenPopWithLengthVarintTwoBytes) { + RingBufferData ring_buffer; + decltype(ring_buffer)::SizeType size = 150; + std::string s(size, 'X'); + LengthDelimitedRingBufferWriter writer(ring_buffer); + ASSERT_THAT(writer.Push(reinterpret_cast(s.c_str()), size), + IsTrue()); + + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector first; + EXPECT_THAT(reader.Pop(first), IsTrue()); + std::string result(reinterpret_cast(first.data()), first.size()); + EXPECT_THAT(result, Eq(s)); +} + +TEST(LengthDelimitedRingBufferDataTest, DeserializeFromTooShortShouldFail) { + RingBufferData<1> ring_buffer; + EXPECT_THAT(ring_buffer.DeserializeFromBuffer(nullptr, 0), IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, DeserializeFromTooLongShouldFail) { + RingBufferData<1> ring_buffer; + // This buffer is size 3; it won't fit in the template arg (size 1). + EXPECT_THAT(ring_buffer.DeserializeFromBuffer( + reinterpret_cast(kValidBufferSize3), + kValidBufferSize3Len), + IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, + DeserializeFromInvalidVersionShouldFail) { + RingBufferData<3> ring_buffer; + EXPECT_THAT(ring_buffer.DeserializeFromBuffer( + reinterpret_cast(kInvalidVersionBuffer), + kInvalidVersionBufferLen), + IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, + DeserializeFromInvalidVarintLengthShouldSucceedButPopShouldFail) { + RingBufferData ring_buffer; + EXPECT_THAT(ring_buffer.DeserializeFromBuffer( + reinterpret_cast(kInvalidBase128VarintBuffer), + kInvalidBase128VarintBufferLen), + IsTrue()); + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector data; + EXPECT_THAT(reader.Pop(data), IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, + DeserializeFromInvalidVarintBitsShouldSucceedButPopShouldFail) { + RingBufferData ring_buffer; + EXPECT_THAT(ring_buffer.DeserializeFromBuffer( + reinterpret_cast( + kInvalidBase128VarintBits33And34SetBuffer), + kInvalidBase128VarintBits33And34SetBufferLen), + IsTrue()); + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector data; + EXPECT_THAT(reader.Pop(data), IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, + DeserializeFromInvalidPayloadBufferTooShortShouldSucceedButPopShouldFail) { + RingBufferData ring_buffer; + EXPECT_THAT( + ring_buffer.DeserializeFromBuffer( + reinterpret_cast(kInvalidPayloadBufferTooShort), + kInvalidPayloadBufferTooShortLen), + IsTrue()); + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector data; + EXPECT_THAT(reader.Pop(data), IsFalse()); +} + +TEST(LengthDelimitedRingBufferDataTest, + DeserializeFromFullBufferShouldSucceed) { + RingBufferData<3> ring_buffer; + EXPECT_THAT(ring_buffer.DeserializeFromBuffer( + reinterpret_cast(kValidBufferSize3), + kValidBufferSize3Len), + IsTrue()); + LengthDelimitedRingBufferReader reader(ring_buffer); + std::vector data; + EXPECT_THAT(reader.Pop(data), IsTrue()); + const std::vector expected = {0x42, 0x23}; + EXPECT_THAT(data, Eq(expected)); +} + +TEST(LengthDelimitedRingBufferDataTest, + DeserializeFromMidCrashBufferShouldSucceedButSubsequentPopShouldFail) { + RingBufferData ring_buffer; + EXPECT_THAT(ring_buffer.DeserializeFromBuffer( + reinterpret_cast(kMidCrashBuffer), + kMidCrashBufferLen), + IsTrue()); + LengthDelimitedRingBufferReader reader(ring_buffer); + // Pop should fail since the length was written to be 0. + std::vector data; + EXPECT_THAT(reader.Pop(data), IsFalse()); +} + +} // namespace +} // namespace test +} // namespace crashpad diff --git a/shared/sentry/external/crashpad/client/prune_crash_reports.cc b/shared/sentry/src/external/crashpad/client/prune_crash_reports.cc similarity index 100% rename from shared/sentry/external/crashpad/client/prune_crash_reports.cc rename to shared/sentry/src/external/crashpad/client/prune_crash_reports.cc diff --git a/shared/sentry/external/crashpad/client/prune_crash_reports.h b/shared/sentry/src/external/crashpad/client/prune_crash_reports.h similarity index 100% rename from shared/sentry/external/crashpad/client/prune_crash_reports.h rename to shared/sentry/src/external/crashpad/client/prune_crash_reports.h diff --git a/shared/sentry/external/crashpad/client/prune_crash_reports_test.cc b/shared/sentry/src/external/crashpad/client/prune_crash_reports_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/prune_crash_reports_test.cc rename to shared/sentry/src/external/crashpad/client/prune_crash_reports_test.cc diff --git a/shared/sentry/external/crashpad/client/pthread_create_linux.cc b/shared/sentry/src/external/crashpad/client/pthread_create_linux.cc similarity index 98% rename from shared/sentry/external/crashpad/client/pthread_create_linux.cc rename to shared/sentry/src/external/crashpad/client/pthread_create_linux.cc index acbf57d57..86ff8dba6 100644 --- a/shared/sentry/external/crashpad/client/pthread_create_linux.cc +++ b/shared/sentry/src/external/crashpad/client/pthread_create_linux.cc @@ -15,6 +15,7 @@ #include #include +#include "base/check.h" #include "base/logging.h" #include "client/crashpad_client.h" #include "util/misc/no_cfi_icall.h" diff --git a/shared/sentry/src/external/crashpad/client/ring_buffer_annotation.h b/shared/sentry/src/external/crashpad/client/ring_buffer_annotation.h new file mode 100644 index 000000000..fc0482ea2 --- /dev/null +++ b/shared/sentry/src/external/crashpad/client/ring_buffer_annotation.h @@ -0,0 +1,136 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_CLIENT_RING_BUFFER_ANNOTATION_H_ +#define CRASHPAD_CLIENT_RING_BUFFER_ANNOTATION_H_ + +#include + +#include "client/annotation.h" +#include "client/length_delimited_ring_buffer.h" + +namespace crashpad { + +//! \brief Capacity of `RingBufferAnnotation`, in bytes. +using RingBufferAnnotationCapacity = RingBufferCapacity; + +namespace internal { + +//! \brief Default capacity of `RingBufferAnnotation`, in bytes. +inline constexpr RingBufferAnnotationCapacity + kDefaultRingBufferAnnotationCapacity = 8192; + +} // namespace internal + +//! \brief An `Annotation` which wraps a `LengthDelimitedRingBuffer` +//! of up to `Capacity` bytes in length. +//! +//! Supports writing variable-length data via `Push()`. When the ring buffer is +//! full, it will drop old data items in FIFO order until enough space is +//! available for the write. +//! +//! Supports guarding concurrent reads from writes via `ScopedSpinGuard`, so +//! writing to this object is thread-safe. +//! +//! Clients which read this `Annotation`'s memory can optionally invoke +//! `TryCreateScopedSpinGuard()` on this object to ensure any pending write +//! finishes before the memory is read. +//! +//! Each item in this ring buffer is delimited by its length encoded in +//! little-endian Base 128 varint encoding. +//! +//! `RingBufferAnnotation` uses varint-encoded delimiters to enable +//! zero-copy deserialization of the ringbuffer's contents when storing +//! protobufs inside the ringbuffer, e.g. via +//! `google::protobuf::util::ParseDelimitedFromZeroCopyStream()` or similar. +//! +//! \sa +//! https://github.com/protocolbuffers/protobuf/blob/3202b9da88ceb75b65bbabaf4033c95e872f828d/src/google/protobuf/util/delimited_message_util.h#L85 +//! \sa +//! https://github.com/protocolbuffers/protobuf/blob/8bd49dea5e167a389d94b71d24c981d8f9fa0c99/src/google/protobuf/io/zero_copy_stream_impl_lite.h#L68 +//! \sa +//! https://github.com/protocolbuffers/protobuf/blob/8bd49dea5e167a389d94b71d24c981d8f9fa0c99/src/google/protobuf/io/coded_stream.h#L171 +//! +//! To deserialize the items stored in this annotation, use +//! `LengthDelimitedRingBufferReader`. +template +class RingBufferAnnotation final : public Annotation { + public: + //! \brief Constructs a `RingBufferAnnotation`. + //! \param[in] type A unique identifier for the type of data in the ring + //! buffer. + //! \param[in] name The name of the annotation. + constexpr RingBufferAnnotation(Annotation::Type type, const char name[]) + : Annotation(type, + name, + reinterpret_cast(&ring_buffer_data_), + ConcurrentAccessGuardMode::kScopedSpinGuard), + ring_buffer_data_(), + ring_buffer_writer_(ring_buffer_data_) {} + RingBufferAnnotation(const RingBufferAnnotation&) = delete; + RingBufferAnnotation& operator=(const RingBufferAnnotation&) = delete; + RingBufferAnnotation(RingBufferAnnotation&&) = default; + RingBufferAnnotation& operator=(RingBufferAnnotation&&) = default; + + //! \brief Pushes data onto this annotation's ring buffer. + //! + //! If the ring buffer does not have enough space to store `buffer_length` + //! bytes of data, old data items are dropped in FIFO order until + //! enough space is available to store the new data. + bool Push(const void* const buffer, + RingBufferAnnotationCapacity buffer_length) { + // Use a zero timeout so the operation immediately fails if another thread + // or process is currently reading this Annotation. + constexpr uint64_t kSpinGuardTimeoutNanoseconds = 0; + + auto spin_guard = TryCreateScopedSpinGuard(kSpinGuardTimeoutNanoseconds); + if (!spin_guard) { + return false; + } + bool success = ring_buffer_writer_.Push(buffer, buffer_length); + if (success) { + SetSize(ring_buffer_data_.GetRingBufferLength()); + } + return success; + } + + //! \brief Reset the annotation (e.g., for testing). + //! This method is not thread-safe. + void ResetForTesting() { + ring_buffer_data_.ResetForTesting(); + ring_buffer_writer_.ResetForTesting(); + } + + private: + using RingBufferWriter = + LengthDelimitedRingBufferWriter>; + + //! \brief The ring buffer data stored in this Anotation. + RingBufferData ring_buffer_data_; + + //! \brief The writer which wraps `ring_buffer_data_`. + RingBufferWriter ring_buffer_writer_; +}; + +// Allow just `RingBufferAnnotation foo;` to be declared without template +// arguments using C++17 class template argument deduction. +template +RingBufferAnnotation(Annotation::Type type, const char name[]) + -> RingBufferAnnotation; + +} // namespace crashpad + +#endif // CRASHPAD_CLIENT_RING_BUFFER_ANNOTATION_H_ diff --git a/shared/sentry/src/external/crashpad/client/ring_buffer_annotation_load_test_main.cc b/shared/sentry/src/external/crashpad/client/ring_buffer_annotation_load_test_main.cc new file mode 100644 index 000000000..2a767be58 --- /dev/null +++ b/shared/sentry/src/external/crashpad/client/ring_buffer_annotation_load_test_main.cc @@ -0,0 +1,476 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "base/notreached.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" +#include "base/strings/stringprintf.h" +#include "build/build_config.h" +#include "client/annotation.h" +#include "client/length_delimited_ring_buffer.h" +#include "client/ring_buffer_annotation.h" +#include "tools/tool_support.h" +#include "util/stdlib/string_number_conversion.h" +#include "util/synchronization/scoped_spin_guard.h" +#include "util/thread/thread.h" + +#if BUILDFLAG(IS_WIN) +#include +#else +#include +#endif // BUILDFLAG(IS_WIN) + +namespace crashpad { + +namespace test { + +namespace { + +constexpr Annotation::Type kRingBufferLoadTestType = + Annotation::UserDefinedType(0x0042); +std::atomic g_should_exit = false; + +struct RingBufferAnnotationSnapshotParams final { + enum class Mode { + kUseScopedSpinGuard = 1, + kDoNotUseSpinGuard = 2, + }; + Mode mode = Mode::kUseScopedSpinGuard; + using Duration = std::chrono::duration; + Duration producer_thread_min_run_duration = std::chrono::milliseconds(1); + Duration producer_thread_max_run_duration = std::chrono::milliseconds(10); + Duration producer_thread_sleep_duration = std::chrono::nanoseconds(10); + Duration consumer_thread_min_run_duration = std::chrono::milliseconds(5); + Duration consumer_thread_max_run_duration = std::chrono::milliseconds(100); + Duration quiesce_timeout = std::chrono::microseconds(500); + uint64_t num_loops = std::numeric_limits::max(); + std::optional main_thread_run_duration = std::nullopt; +}; + +template +class RingBufferAnnotationSnapshot final { + using RingBufferAnnotationType = RingBufferAnnotation; + + struct State final { + State() + : ring_buffer_annotation(kRingBufferLoadTestType, + "ring-buffer-load-test"), + ring_buffer_ready(false), + producer_thread_running(false), + producer_thread_finished(false), + consumer_thread_finished(false), + should_exit(false) {} + + State(const State&) = delete; + State& operator=(const State&) = delete; + + RingBufferAnnotationType ring_buffer_annotation; + bool ring_buffer_ready; + bool producer_thread_running; + bool producer_thread_finished; + bool consumer_thread_finished; + bool should_exit; + }; + + class Thread final : public crashpad::Thread { + public: + Thread(std::function thread_main) + : thread_main_(std::move(thread_main)) {} + + private: + void ThreadMain() override { thread_main_(); } + + const std::function thread_main_; + }; + + public: + RingBufferAnnotationSnapshot(const RingBufferAnnotationSnapshotParams& params) + : params_(params), + main_loop_thread_([this]() { MainLoopThreadMain(); }), + producer_thread_([this]() { ProducerThreadMain(); }), + consumer_thread_([this]() { ConsumerThreadMain(); }), + mutex_(), + state_changed_condition_(), + state_() {} + + RingBufferAnnotationSnapshot(const RingBufferAnnotationSnapshot&) = delete; + RingBufferAnnotationSnapshot& operator=(const RingBufferAnnotationSnapshot&) = + delete; + + void Start() { + main_loop_thread_.Start(); + producer_thread_.Start(); + consumer_thread_.Start(); + } + + void Stop() { + consumer_thread_.Join(); + producer_thread_.Join(); + main_loop_thread_.Join(); + } + + private: + void MainLoopThreadMain() { + std::chrono::steady_clock::time_point main_thread_end_time; + if (params_.main_thread_run_duration) { + main_thread_end_time = + std::chrono::steady_clock::now() + *params_.main_thread_run_duration; + } else { + main_thread_end_time = std::chrono::steady_clock::time_point::max(); + } + for (uint64_t i = 0; + i < params_.num_loops && + std::chrono::steady_clock::now() < main_thread_end_time; + i++) { + { + std::unique_lock start_lock(mutex_); + state_.ring_buffer_annotation.ResetForTesting(); + state_.ring_buffer_ready = true; + state_changed_condition_.notify_all(); + } + + { + std::unique_lock lock(mutex_); + state_changed_condition_.wait(lock, [this] { + return state_.producer_thread_finished && + state_.consumer_thread_finished; + }); + state_.ring_buffer_ready = false; + if (g_should_exit) { + printf("Exiting on Control-C.\n"); + break; + } + printf("."); + fflush(stdout); + state_changed_condition_.notify_all(); + } + } + state_.should_exit = true; + state_changed_condition_.notify_all(); + } + + void ProducerThreadMain() { + while (true) { + { + std::unique_lock lock(mutex_); + state_changed_condition_.wait(lock, [this] { + return state_.should_exit || state_.ring_buffer_ready; + }); + if (state_.should_exit) { + return; + } + state_.producer_thread_running = true; + state_.producer_thread_finished = false; + state_changed_condition_.notify_all(); + } + + auto min_run_duration_micros = + std::chrono::duration_cast( + params_.producer_thread_min_run_duration); + auto max_run_duration_micros = + std::chrono::duration_cast( + params_.producer_thread_max_run_duration); + std::uniform_int_distribution + run_duration_distribution(min_run_duration_micros.count(), + max_run_duration_micros.count()); + static thread_local std::mt19937 random_number_generator; + auto run_duration = std::chrono::microseconds( + run_duration_distribution(random_number_generator)); + auto end_time = std::chrono::steady_clock::now() + run_duration; + uint64_t next_value = 0; + while (std::chrono::steady_clock::now() < end_time) { + if (!Produce(next_value++)) { + // The consumer thread interrupted this. + break; + } + } + { + std::unique_lock lock(mutex_); + state_changed_condition_.wait( + lock, [this] { return state_.consumer_thread_finished; }); + state_.producer_thread_running = false; + state_.producer_thread_finished = true; + state_changed_condition_.notify_all(); + } + } + } + + bool Produce(uint64_t value) { + std::string hex_value = base::StringPrintf("0x%08" PRIx64, value); + if (!state_.ring_buffer_annotation.Push( + hex_value.data(), static_cast(hex_value.size()))) { + fprintf(stderr, + "Ignoring failed call to Push(0x%" PRIx64 + ") (ScopedSpinGuard was held by snapshot thread)\n", + value); + return false; + } + return true; + } + + void ConsumerThreadMain() { + while (true) { + { + std::unique_lock lock(mutex_); + state_changed_condition_.wait(lock, [this] { + return state_.should_exit || + (state_.ring_buffer_ready && state_.producer_thread_running); + }); + if (state_.should_exit) { + return; + } + state_.consumer_thread_finished = false; + state_changed_condition_.notify_all(); + } + auto min_run_duration_micros = + std::chrono::duration_cast( + params_.consumer_thread_min_run_duration); + auto max_run_duration_micros = + std::chrono::duration_cast( + params_.consumer_thread_max_run_duration); + std::uniform_int_distribution + run_duration_distribution(min_run_duration_micros.count(), + max_run_duration_micros.count()); + static thread_local std::mt19937 random_number_generator; + auto run_duration = std::chrono::microseconds( + run_duration_distribution(random_number_generator)); + auto end_time = std::chrono::steady_clock::now() + run_duration; + while (std::chrono::steady_clock::now() < end_time) { + constexpr uint64_t kSleepTimeNs = 10000; // 10 us + SleepNanoseconds(kSleepTimeNs); + } + Snapshot(); + { + std::unique_lock lock(mutex_); + state_.consumer_thread_finished = true; + state_.ring_buffer_ready = false; + state_changed_condition_.notify_all(); + } + } + } + + void Snapshot() { + int64_t timeout_ns = static_cast( + std::chrono::duration_cast( + params_.quiesce_timeout) + .count()); + uint8_t serialized_ring_buffer[sizeof(state_.ring_buffer_annotation)]; + Annotation::ValueSizeType ring_buffer_size; + { + std::optional scoped_spin_guard; + if (params_.mode == + RingBufferAnnotationSnapshotParams::Mode::kUseScopedSpinGuard) { + scoped_spin_guard = + state_.ring_buffer_annotation.TryCreateScopedSpinGuard(timeout_ns); + } + if (params_.mode == + RingBufferAnnotationSnapshotParams::Mode::kUseScopedSpinGuard && + !scoped_spin_guard) { + fprintf(stderr, + "Could not quiesce writes within %" PRIi64 " ns\n", + timeout_ns); + abort(); + } + ring_buffer_size = state_.ring_buffer_annotation.size(); + memcpy(&serialized_ring_buffer[0], + state_.ring_buffer_annotation.value(), + ring_buffer_size); + } + RingBufferData ring_buffer; + if (!ring_buffer.DeserializeFromBuffer(serialized_ring_buffer, + ring_buffer_size)) { + fprintf(stderr, "Could not deserialize ring buffer\n"); + abort(); + } + LengthDelimitedRingBufferReader ring_buffer_reader(ring_buffer); + int value = std::numeric_limits::max(); + std::vector bytes; + while (ring_buffer_reader.Pop(bytes)) { + int next_value; + base::StringPiece str(reinterpret_cast(&bytes[0]), + bytes.size()); + if (!base::HexStringToInt(str, &next_value)) { + fprintf(stderr, + "Couldn't parse value: [%.*s]\n", + base::checked_cast(bytes.size()), + bytes.data()); + abort(); + } + if (value == std::numeric_limits::max()) { + // First value in buffer. + } else if (value + 1 != next_value) { + fprintf(stderr, + "Expected value 0x%08x, got 0x%08x\n", + value + 1, + next_value); + abort(); + } + value = next_value; + bytes.clear(); + } + } + + const RingBufferAnnotationSnapshotParams params_; + Thread main_loop_thread_; + Thread producer_thread_; + Thread consumer_thread_; + std::mutex mutex_; + + // Fired whenever `state_` changes. + std::condition_variable state_changed_condition_; + + // Protected by `mutex_`. + State state_; +}; + +void Usage(const base::FilePath& me) { + // clang-format off + fprintf(stderr, +"Usage: %" PRFilePath " [OPTION]...\n" +"Runs a load test for concurrent I/O to RingBufferAnnotation.\n" +"\n" +"By default, enables the annotation spin guard and runs indefinitely\n" +"until interrupted (e.g., with Control-C or SIGINT).\n" +"\n" +" -d,--disable-spin-guard Disables the annotation spin guard\n" +" (the test is expected to crash in this case)\n" +" -n,--num-loops=N Runs the test for N iterations, not indefinitely\n" +" -s,--duration-secs=SECS Runs the test for SECS seconds, not indefinitely\n", + me.value().c_str()); + // clang-format on + ToolSupport::UsageTail(me); +} + +int TestMain(int argc, char** argv) { + const base::FilePath argv0( + ToolSupport::CommandLineArgumentToFilePathStringType(argv[0])); + const base::FilePath me(argv0.BaseName()); + +#if BUILDFLAG(IS_WIN) + auto handler_routine = [](DWORD type) -> BOOL { + if (type == CTRL_C_EVENT) { + g_should_exit = true; + return TRUE; + } + return FALSE; + }; + if (!SetConsoleCtrlHandler(handler_routine, /*Add=*/TRUE)) { + fprintf(stderr, "Couldn't set Control-C handler\n"); + return EXIT_FAILURE; + } +#else + signal(SIGINT, [](int signal) { g_should_exit = true; }); +#endif // BUILDFLAG(IS_WIN) + RingBufferAnnotationSnapshotParams params; + enum OptionFlags { + // "Short" (single-character) options. + kOptionDisableSpinGuard = 'd', + kOptionNumLoops = 'n', + kOptionDurationSecs = 's', + + // Standard options. + kOptionHelp = -2, + kOptionVersion = -3, + }; + static constexpr option long_options[] = { + {"disable-spin-guard", no_argument, nullptr, kOptionDisableSpinGuard}, + {"num-loops", required_argument, nullptr, kOptionNumLoops}, + {"duration-secs", required_argument, nullptr, kOptionDurationSecs}, + {"help", no_argument, nullptr, kOptionHelp}, + {"version", no_argument, nullptr, kOptionVersion}, + {nullptr, 0, nullptr, 0}, + }; + + int opt; + while ((opt = getopt_long(argc, argv, "dn:s:", long_options, nullptr)) != + -1) { + switch (opt) { + case kOptionDisableSpinGuard: + printf("Disabling spin guard logic (this test will fail!)\n"); + params.mode = + RingBufferAnnotationSnapshotParams::Mode::kDoNotUseSpinGuard; + break; + case kOptionNumLoops: { + std::string num_loops(optarg); + uint64_t num_loops_value; + if (!StringToNumber(num_loops, &num_loops_value)) { + ToolSupport::UsageHint(me, "--num-loops requires integer value"); + return EXIT_FAILURE; + } + params.num_loops = num_loops_value; + break; + } + case kOptionDurationSecs: { + std::string duration_secs(optarg); + uint64_t duration_secs_value; + if (!StringToNumber(duration_secs, &duration_secs_value)) { + ToolSupport::UsageHint(me, "--duration-secs requires integer value"); + return EXIT_FAILURE; + } + params.main_thread_run_duration = + std::chrono::seconds(duration_secs_value); + break; + } + case kOptionHelp: + Usage(me); + return EXIT_SUCCESS; + case kOptionVersion: + ToolSupport::Version(me); + return EXIT_SUCCESS; + default: + ToolSupport::UsageHint(me, nullptr); + return EXIT_FAILURE; + } + } + + RingBufferAnnotationSnapshot<8192> test_producer_snapshot(params); + printf("Starting test (Control-C to exit)...\n"); + test_producer_snapshot.Start(); + test_producer_snapshot.Stop(); + printf("Test finished.\n"); + return EXIT_SUCCESS; +} + +} // namespace +} // namespace test +} // namespace crashpad + +#if BUILDFLAG(IS_POSIX) + +int main(int argc, char** argv) { + return crashpad::test::TestMain(argc, argv); +} + +#elif BUILDFLAG(IS_WIN) + +int wmain(int argc, wchar_t* argv[]) { + return crashpad::ToolSupport::Wmain(argc, argv, crashpad::test::TestMain); +} + +#endif diff --git a/shared/sentry/src/external/crashpad/client/ring_buffer_annotation_test.cc b/shared/sentry/src/external/crashpad/client/ring_buffer_annotation_test.cc new file mode 100644 index 000000000..0893470ee --- /dev/null +++ b/shared/sentry/src/external/crashpad/client/ring_buffer_annotation_test.cc @@ -0,0 +1,188 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "client/ring_buffer_annotation.h" +#include "client/length_delimited_ring_buffer.h" + +#include +#include + +#include "client/annotation_list.h" +#include "client/crashpad_info.h" +#include "gtest/gtest.h" +#include "test/gtest_death.h" + +namespace crashpad { +namespace test { +namespace { + +constexpr uint32_t kRingBufferHeaderSize = 16; +constexpr uint32_t kLengthDelimiter1ByteSize = 1; + +class RingBufferAnnotationTest : public testing::Test { + public: + void SetUp() override { + CrashpadInfo::GetCrashpadInfo()->set_annotations_list(&annotations_); + } + + void TearDown() override { + CrashpadInfo::GetCrashpadInfo()->set_annotations_list(nullptr); + } + + size_t AnnotationsCount() { + size_t result = 0; + for (auto* annotation : annotations_) { + if (annotation->is_set()) + ++result; + } + return result; + } + + protected: + AnnotationList annotations_; +}; + +TEST_F(RingBufferAnnotationTest, Basics) { + constexpr Annotation::Type kType = Annotation::UserDefinedType(1); + + constexpr char kName[] = "annotation 1"; + RingBufferAnnotation annotation(kType, kName); + + EXPECT_FALSE(annotation.is_set()); + EXPECT_EQ(0u, AnnotationsCount()); + + EXPECT_EQ(kType, annotation.type()); + EXPECT_EQ(0u, annotation.size()); + EXPECT_EQ(std::string(kName), annotation.name()); + + EXPECT_TRUE( + annotation.Push(reinterpret_cast("0123456789"), 10)); + + EXPECT_TRUE(annotation.is_set()); + EXPECT_EQ(1u, AnnotationsCount()); + + constexpr Annotation::ValueSizeType kExpectedSize = + kRingBufferHeaderSize + kLengthDelimiter1ByteSize + 10u; + EXPECT_EQ(kExpectedSize, annotation.size()); + EXPECT_EQ(&annotation, *annotations_.begin()); + + RingBufferData data; + EXPECT_TRUE( + data.DeserializeFromBuffer(annotation.value(), annotation.size())); + EXPECT_EQ(kExpectedSize, data.GetRingBufferLength()); + + std::vector popped_value; + LengthDelimitedRingBufferReader reader(data); + EXPECT_TRUE(reader.Pop(popped_value)); + + const std::vector expected = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + EXPECT_EQ(expected, popped_value); + + annotation.Clear(); + + EXPECT_FALSE(annotation.is_set()); + EXPECT_EQ(0u, AnnotationsCount()); + + EXPECT_EQ(0u, annotation.size()); +} + +TEST_F(RingBufferAnnotationTest, MultiplePushesWithoutWrapping) { + constexpr Annotation::Type kType = Annotation::UserDefinedType(1); + + constexpr char kName[] = "annotation 1"; + RingBufferAnnotation annotation(kType, kName); + + EXPECT_TRUE( + annotation.Push(reinterpret_cast("0123456789"), 10)); + EXPECT_TRUE(annotation.Push(reinterpret_cast("ABCDEF"), 6)); + + EXPECT_TRUE(annotation.is_set()); + EXPECT_EQ(1u, AnnotationsCount()); + + constexpr Annotation::ValueSizeType kExpectedSize = + kRingBufferHeaderSize + kLengthDelimiter1ByteSize + 10u + + kLengthDelimiter1ByteSize + 6u; + EXPECT_EQ(kExpectedSize, annotation.size()); + EXPECT_EQ(&annotation, *annotations_.begin()); + + RingBufferData data; + EXPECT_TRUE( + data.DeserializeFromBuffer(annotation.value(), annotation.size())); + EXPECT_EQ(kExpectedSize, data.GetRingBufferLength()); + + std::vector popped_value; + LengthDelimitedRingBufferReader reader(data); + EXPECT_TRUE(reader.Pop(popped_value)); + + const std::vector expected1 = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + EXPECT_EQ(expected1, popped_value); + + popped_value.clear(); + EXPECT_TRUE(reader.Pop(popped_value)); + + const std::vector expected2 = {'A', 'B', 'C', 'D', 'E', 'F'}; + EXPECT_EQ(expected2, popped_value); +} + +TEST_F(RingBufferAnnotationTest, + MultiplePushCallsWithWrappingShouldOverwriteInFIFOOrder) { + constexpr Annotation::Type kType = Annotation::UserDefinedType(1); + + constexpr char kName[] = "annotation 1"; + RingBufferAnnotation<10> annotation(kType, kName); + + // Each Push() call will push 1 byte for the varint 128-encoded length, + // then the number of bytes specified. + constexpr char kFirst[] = "AAA"; + constexpr char kSecond[] = "BBB"; + constexpr char kThird[] = "CCC"; + + // This takes up bytes 0-3 of the 10-byte RingBufferAnnotation. + ASSERT_TRUE(annotation.Push(reinterpret_cast(kFirst), 3)); + + // This takes up bytes 4-7 of the 10-byte RingBufferAnnotation. + ASSERT_TRUE(annotation.Push(reinterpret_cast(kSecond), 3)); + + // This should wrap around the end of the array and overwrite kFirst since it + // needs 4 bytes but there are only 2 left. + ASSERT_TRUE(annotation.Push(reinterpret_cast(kThird), 3)); + + // The size of the annotation should include the header and the full 10 bytes + // of the ring buffer, since the third write wrapped around the end. + ASSERT_EQ(kRingBufferHeaderSize + 10u, annotation.size()); + + // This data size needs to match the size in the RingBufferAnnotation above. + RingBufferData<10> data; + ASSERT_TRUE( + data.DeserializeFromBuffer(annotation.value(), annotation.size())); + + std::vector popped_value; + LengthDelimitedRingBufferReader reader(data); + ASSERT_TRUE(reader.Pop(popped_value)); + + // "AAA" has been overwritten, so the first thing popped should be "BBB". + const std::vector expected_b = {'B', 'B', 'B'}; + EXPECT_EQ(expected_b, popped_value); + + popped_value.clear(); + ASSERT_TRUE(reader.Pop(popped_value)); + const std::vector expected_c = {'C', 'C', 'C'}; + EXPECT_EQ(expected_c, popped_value); +} + +} // namespace +} // namespace test +} // namespace crashpad diff --git a/shared/sentry/external/crashpad/client/settings.cc b/shared/sentry/src/external/crashpad/client/settings.cc similarity index 79% rename from shared/sentry/external/crashpad/client/settings.cc rename to shared/sentry/src/external/crashpad/client/settings.cc index 68fae16af..5e4119e21 100644 --- a/shared/sentry/external/crashpad/client/settings.cc +++ b/shared/sentry/src/external/crashpad/client/settings.cc @@ -19,6 +19,7 @@ #include #include "base/logging.h" +#include "base/notreached.h" #include "base/posix/eintr_wrapper.h" #include "build/build_config.h" #include "util/file/filesystem.h" @@ -26,7 +27,7 @@ namespace crashpad { -#if BUILDFLAG(IS_FUCHSIA) +#if !CRASHPAD_FLOCK_ALWAYS_SUPPORTED Settings::ScopedLockedFileHandle::ScopedLockedFileHandle() : handle_(kInvalidFileHandle), lockfile_path_() { @@ -69,7 +70,7 @@ void Settings::ScopedLockedFileHandle::Destroy() { } } -#else // BUILDFLAG(IS_FUCHSIA) +#else // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED #if BUILDFLAG(IS_IOS) @@ -217,25 +218,50 @@ bool Settings::SetLastUploadAttemptTime(time_t time) { return WriteSettings(handle.get(), settings); } +#if !CRASHPAD_FLOCK_ALWAYS_SUPPORTED +// static +bool Settings::IsLockExpired(const base::FilePath& file_path, + time_t lockfile_ttl) { + time_t now = time(nullptr); + base::FilePath lock_path(file_path.value() + Settings::kLockfileExtension); + ScopedFileHandle lock_fd(LoggingOpenFileForRead(lock_path)); + time_t lock_timestamp; + if (!LoggingReadFileExactly( + lock_fd.get(), &lock_timestamp, sizeof(lock_timestamp))) { + return false; + } + return now >= lock_timestamp + lockfile_ttl; +} +#endif // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED + // static Settings::ScopedLockedFileHandle Settings::MakeScopedLockedFileHandle( - FileHandle file, + const internal::MakeScopedLockedFileHandleOptions& options, FileLocking locking, const base::FilePath& file_path) { - ScopedFileHandle scoped(file); -#if BUILDFLAG(IS_FUCHSIA) - base::FilePath lockfile_path(file_path.value() + ".__lock__"); +#if !CRASHPAD_FLOCK_ALWAYS_SUPPORTED + base::FilePath lockfile_path(file_path.value() + + Settings::kLockfileExtension); + ScopedFileHandle lockfile_scoped( + LoggingOpenFileForWrite(lockfile_path, + FileWriteMode::kCreateOrFail, + FilePermissions::kWorldReadable)); + if (!lockfile_scoped.is_valid()) { + return ScopedLockedFileHandle(); + } + time_t now = time(nullptr); + if (!LoggingWriteFile(lockfile_scoped.get(), &now, sizeof(now))) { + return ScopedLockedFileHandle(); + } + ScopedFileHandle scoped(GetHandleFromOptions(file_path, options)); if (scoped.is_valid()) { - ScopedFileHandle lockfile_scoped( - LoggingOpenFileForWrite(lockfile_path, - FileWriteMode::kCreateOrFail, - FilePermissions::kWorldReadable)); - // This is a lightweight attempt to try to catch racy behavior. - DCHECK(lockfile_scoped.is_valid()); return ScopedLockedFileHandle(scoped.release(), lockfile_path); } - return ScopedLockedFileHandle(scoped.release(), base::FilePath()); + bool success = LoggingRemoveFile(lockfile_path); + DCHECK(success); + return ScopedLockedFileHandle(); #else + ScopedFileHandle scoped(GetHandleFromOptions(file_path, options)); // It's important to create the ScopedLockedFileHandle before calling // LoggingLockFile on iOS, so a ScopedBackgroundTask is created *before* // the LoggingLockFile call below. @@ -249,29 +275,50 @@ Settings::ScopedLockedFileHandle Settings::MakeScopedLockedFileHandle( } handle.reset(scoped.release()); return handle; -#endif +#endif // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED +} + +// static +FileHandle Settings::GetHandleFromOptions( + const base::FilePath& file_path, + const internal::MakeScopedLockedFileHandleOptions& options) { + switch (options.function_enum) { + case internal::FileOpenFunction::kLoggingOpenFileForRead: + return LoggingOpenFileForRead(file_path); + case internal::FileOpenFunction::kLoggingOpenFileForReadAndWrite: + return LoggingOpenFileForReadAndWrite( + file_path, options.mode, options.permissions); + case internal::FileOpenFunction::kOpenFileForReadAndWrite: + return OpenFileForReadAndWrite( + file_path, options.mode, options.permissions); + } + NOTREACHED(); + return kInvalidFileHandle; } Settings::ScopedLockedFileHandle Settings::OpenForReading() { - return MakeScopedLockedFileHandle( - LoggingOpenFileForRead(file_path()), FileLocking::kShared, file_path()); + internal::MakeScopedLockedFileHandleOptions options; + options.function_enum = internal::FileOpenFunction::kLoggingOpenFileForRead; + return MakeScopedLockedFileHandle(options, FileLocking::kShared, file_path()); } Settings::ScopedLockedFileHandle Settings::OpenForReadingAndWriting( FileWriteMode mode, bool log_open_error) { DCHECK(mode != FileWriteMode::kTruncateOrCreate); - FileHandle handle; + internal::MakeScopedLockedFileHandleOptions options; + options.mode = mode; + options.permissions = FilePermissions::kOwnerOnly; if (log_open_error) { - handle = LoggingOpenFileForReadAndWrite( - file_path(), mode, FilePermissions::kOwnerOnly); + options.function_enum = + internal::FileOpenFunction::kLoggingOpenFileForReadAndWrite; } else { - handle = OpenFileForReadAndWrite( - file_path(), mode, FilePermissions::kOwnerOnly); + options.function_enum = + internal::FileOpenFunction::kOpenFileForReadAndWrite; } return MakeScopedLockedFileHandle( - handle, FileLocking::kExclusive, file_path()); + options, FileLocking::kExclusive, file_path()); } bool Settings::OpenAndReadSettings(Data* out_data) { diff --git a/shared/sentry/external/crashpad/client/settings.h b/shared/sentry/src/external/crashpad/client/settings.h similarity index 88% rename from shared/sentry/external/crashpad/client/settings.h rename to shared/sentry/src/external/crashpad/client/settings.h index 2b27474a6..39b2de869 100644 --- a/shared/sentry/external/crashpad/client/settings.h +++ b/shared/sentry/src/external/crashpad/client/settings.h @@ -37,6 +37,18 @@ struct ScopedLockedFileHandleTraits { static void Free(FileHandle handle); }; +enum class FileOpenFunction { + kLoggingOpenFileForRead, + kLoggingOpenFileForReadAndWrite, + kOpenFileForReadAndWrite, +}; + +struct MakeScopedLockedFileHandleOptions { + FileOpenFunction function_enum; + FileWriteMode mode; + FilePermissions permissions; +}; + // TODO(mark): The timeout should be configurable by the client. #if BUILDFLAG(IS_IOS) // iOS background assertions only last 30 seconds, keep the timeout shorter. @@ -54,6 +66,8 @@ constexpr double kUploadReportTimeoutSeconds = 60; //! should be retrieved via CrashReportDatabase::GetSettings(). class Settings { public: + static inline constexpr char kLockfileExtension[] = ".__lock__"; + Settings(); Settings(const Settings&) = delete; @@ -128,6 +142,20 @@ class Settings { //! error logged. bool SetLastUploadAttemptTime(time_t time); +#if !CRASHPAD_FLOCK_ALWAYS_SUPPORTED + //! \brief Returns whether the lockfile for a file is expired. + //! + //! This could be part of ScopedLockedFileHandle, but this needs to be + //! public while ScopedLockedFileHandle is private to Settings. + //! + //! \param[in] file_path The path to the file whose lockfile will be checked. + //! \param[in] lockfile_ttl How long the lockfile has to live before expiring. + //! + //! \return `true` if the lock for the file is expired, otherwise `false`. + static bool IsLockExpired(const base::FilePath& file_path, + time_t lockfile_ttl); +#endif // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED + private: struct Data; @@ -135,7 +163,7 @@ class Settings { // and closes the file on destruction. Note that on Fuchsia, this handle DOES // NOT offer correct operation, only an attempt to DCHECK if racy behavior is // detected. -#if BUILDFLAG(IS_FUCHSIA) +#if !CRASHPAD_FLOCK_ALWAYS_SUPPORTED struct ScopedLockedFileHandle { public: ScopedLockedFileHandle(); @@ -187,12 +215,16 @@ class Settings { #else using ScopedLockedFileHandle = base::ScopedGeneric; -#endif // BUILDFLAG(IS_FUCHSIA) +#endif // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED static ScopedLockedFileHandle MakeScopedLockedFileHandle( - FileHandle file, + const internal::MakeScopedLockedFileHandleOptions& options, FileLocking locking, const base::FilePath& file_path); + static FileHandle GetHandleFromOptions( + const base::FilePath& file_path, + const internal::MakeScopedLockedFileHandleOptions& options); + // Opens the settings file for reading. On error, logs a message and returns // the invalid handle. ScopedLockedFileHandle OpenForReading(); diff --git a/shared/sentry/external/crashpad/client/settings_test.cc b/shared/sentry/src/external/crashpad/client/settings_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/settings_test.cc rename to shared/sentry/src/external/crashpad/client/settings_test.cc diff --git a/shared/sentry/external/crashpad/client/simple_address_range_bag.h b/shared/sentry/src/external/crashpad/client/simple_address_range_bag.h similarity index 100% rename from shared/sentry/external/crashpad/client/simple_address_range_bag.h rename to shared/sentry/src/external/crashpad/client/simple_address_range_bag.h diff --git a/shared/sentry/external/crashpad/client/simple_address_range_bag_test.cc b/shared/sentry/src/external/crashpad/client/simple_address_range_bag_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/simple_address_range_bag_test.cc rename to shared/sentry/src/external/crashpad/client/simple_address_range_bag_test.cc diff --git a/shared/sentry/external/crashpad/client/simple_string_dictionary.h b/shared/sentry/src/external/crashpad/client/simple_string_dictionary.h similarity index 100% rename from shared/sentry/external/crashpad/client/simple_string_dictionary.h rename to shared/sentry/src/external/crashpad/client/simple_string_dictionary.h diff --git a/shared/sentry/external/crashpad/client/simple_string_dictionary_test.cc b/shared/sentry/src/external/crashpad/client/simple_string_dictionary_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/simple_string_dictionary_test.cc rename to shared/sentry/src/external/crashpad/client/simple_string_dictionary_test.cc diff --git a/shared/sentry/external/crashpad/client/simulate_crash.h b/shared/sentry/src/external/crashpad/client/simulate_crash.h similarity index 100% rename from shared/sentry/external/crashpad/client/simulate_crash.h rename to shared/sentry/src/external/crashpad/client/simulate_crash.h diff --git a/shared/sentry/external/crashpad/client/simulate_crash_ios.h b/shared/sentry/src/external/crashpad/client/simulate_crash_ios.h similarity index 100% rename from shared/sentry/external/crashpad/client/simulate_crash_ios.h rename to shared/sentry/src/external/crashpad/client/simulate_crash_ios.h diff --git a/shared/sentry/external/crashpad/client/simulate_crash_linux.h b/shared/sentry/src/external/crashpad/client/simulate_crash_linux.h similarity index 100% rename from shared/sentry/external/crashpad/client/simulate_crash_linux.h rename to shared/sentry/src/external/crashpad/client/simulate_crash_linux.h diff --git a/shared/sentry/external/crashpad/client/simulate_crash_mac.cc b/shared/sentry/src/external/crashpad/client/simulate_crash_mac.cc similarity index 98% rename from shared/sentry/external/crashpad/client/simulate_crash_mac.cc rename to shared/sentry/src/external/crashpad/client/simulate_crash_mac.cc index d801a4317..427d9d542 100644 --- a/shared/sentry/external/crashpad/client/simulate_crash_mac.cc +++ b/shared/sentry/src/external/crashpad/client/simulate_crash_mac.cc @@ -19,10 +19,10 @@ #include +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" #include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" #include "build/build_config.h" #include "util/mach/exc_client_variants.h" #include "util/mach/exception_behaviors.h" @@ -205,7 +205,7 @@ void SimulateCrash(const NativeCPUContext& cpu_context) { #error Port to your CPU architecture #endif - base::mac::ScopedMachSendRight thread(mach_thread_self()); + base::apple::ScopedMachSendRight thread(mach_thread_self()); exception_type_t exception = kMachExceptionSimulated; mach_exception_data_type_t codes[] = {0, 0}; mach_msg_type_number_t code_count = std::size(codes); diff --git a/shared/sentry/external/crashpad/client/simulate_crash_mac.h b/shared/sentry/src/external/crashpad/client/simulate_crash_mac.h similarity index 100% rename from shared/sentry/external/crashpad/client/simulate_crash_mac.h rename to shared/sentry/src/external/crashpad/client/simulate_crash_mac.h diff --git a/shared/sentry/external/crashpad/client/simulate_crash_mac_test.cc b/shared/sentry/src/external/crashpad/client/simulate_crash_mac_test.cc similarity index 100% rename from shared/sentry/external/crashpad/client/simulate_crash_mac_test.cc rename to shared/sentry/src/external/crashpad/client/simulate_crash_mac_test.cc diff --git a/shared/sentry/external/crashpad/client/simulate_crash_win.h b/shared/sentry/src/external/crashpad/client/simulate_crash_win.h similarity index 100% rename from shared/sentry/external/crashpad/client/simulate_crash_win.h rename to shared/sentry/src/external/crashpad/client/simulate_crash_win.h diff --git a/shared/sentry/external/crashpad/client/upload_behavior_ios.h b/shared/sentry/src/external/crashpad/client/upload_behavior_ios.h similarity index 100% rename from shared/sentry/external/crashpad/client/upload_behavior_ios.h rename to shared/sentry/src/external/crashpad/client/upload_behavior_ios.h diff --git a/shared/sentry/src/external/crashpad/cmake/toolchains/win_arm64.cmake b/shared/sentry/src/external/crashpad/cmake/toolchains/win_arm64.cmake new file mode 100644 index 000000000..26ae4f386 --- /dev/null +++ b/shared/sentry/src/external/crashpad/cmake/toolchains/win_arm64.cmake @@ -0,0 +1,6 @@ +# Toolchain file that should provide required and non-conflicting build- +# parameters to allow normal and cross-compilation to ARM64 targets on +# Windows using any generator. +SET(CMAKE_GENERATOR_PLATFORM "ARM64") +SET(CMAKE_SYSTEM_PROCESSOR "ARM64") +SET(CMAKE_SYSTEM_NAME "Windows") \ No newline at end of file diff --git a/shared/sentry/external/crashpad/codereview.settings b/shared/sentry/src/external/crashpad/codereview.settings similarity index 100% rename from shared/sentry/external/crashpad/codereview.settings rename to shared/sentry/src/external/crashpad/codereview.settings diff --git a/shared/sentry/external/crashpad/compat/BUILD.gn b/shared/sentry/src/external/crashpad/compat/BUILD.gn similarity index 96% rename from shared/sentry/external/crashpad/compat/BUILD.gn rename to shared/sentry/src/external/crashpad/compat/BUILD.gn index 63cfa6eb0..d75c26e1d 100644 --- a/shared/sentry/external/crashpad/compat/BUILD.gn +++ b/shared/sentry/src/external/crashpad/compat/BUILD.gn @@ -17,7 +17,7 @@ import("../build/crashpad_buildconfig.gni") config("compat_config") { include_dirs = [] - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { include_dirs += [ "mac" ] } @@ -41,7 +41,7 @@ config("compat_config") { } template("compat_target") { - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { # There are no sources to compile, which doesn’t mix will with a # static_library. group(target_name) { @@ -64,7 +64,7 @@ template("compat_target") { compat_target("compat") { sources = [] - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { sources += [ "mac/Availability.h", "mac/AvailabilityVersions.h", diff --git a/shared/sentry/external/crashpad/compat/CMakeLists.txt b/shared/sentry/src/external/crashpad/compat/CMakeLists.txt similarity index 100% rename from shared/sentry/external/crashpad/compat/CMakeLists.txt rename to shared/sentry/src/external/crashpad/compat/CMakeLists.txt diff --git a/shared/sentry/external/crashpad/compat/android/dlfcn_internal.cc b/shared/sentry/src/external/crashpad/compat/android/dlfcn_internal.cc similarity index 100% rename from shared/sentry/external/crashpad/compat/android/dlfcn_internal.cc rename to shared/sentry/src/external/crashpad/compat/android/dlfcn_internal.cc diff --git a/shared/sentry/external/crashpad/compat/android/dlfcn_internal.h b/shared/sentry/src/external/crashpad/compat/android/dlfcn_internal.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/dlfcn_internal.h rename to shared/sentry/src/external/crashpad/compat/android/dlfcn_internal.h diff --git a/shared/sentry/external/crashpad/compat/android/elf.h b/shared/sentry/src/external/crashpad/compat/android/elf.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/elf.h rename to shared/sentry/src/external/crashpad/compat/android/elf.h diff --git a/shared/sentry/external/crashpad/compat/android/linux/elf.h b/shared/sentry/src/external/crashpad/compat/android/linux/elf.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/linux/elf.h rename to shared/sentry/src/external/crashpad/compat/android/linux/elf.h diff --git a/shared/sentry/external/crashpad/compat/android/linux/prctl.h b/shared/sentry/src/external/crashpad/compat/android/linux/prctl.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/linux/prctl.h rename to shared/sentry/src/external/crashpad/compat/android/linux/prctl.h diff --git a/shared/sentry/external/crashpad/compat/android/linux/ptrace.h b/shared/sentry/src/external/crashpad/compat/android/linux/ptrace.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/linux/ptrace.h rename to shared/sentry/src/external/crashpad/compat/android/linux/ptrace.h diff --git a/shared/sentry/external/crashpad/compat/android/sched.h b/shared/sentry/src/external/crashpad/compat/android/sched.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/sched.h rename to shared/sentry/src/external/crashpad/compat/android/sched.h diff --git a/shared/sentry/external/crashpad/compat/android/sys/epoll.cc b/shared/sentry/src/external/crashpad/compat/android/sys/epoll.cc similarity index 100% rename from shared/sentry/external/crashpad/compat/android/sys/epoll.cc rename to shared/sentry/src/external/crashpad/compat/android/sys/epoll.cc diff --git a/shared/sentry/external/crashpad/compat/android/sys/epoll.h b/shared/sentry/src/external/crashpad/compat/android/sys/epoll.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/sys/epoll.h rename to shared/sentry/src/external/crashpad/compat/android/sys/epoll.h diff --git a/shared/sentry/external/crashpad/compat/android/sys/mman.h b/shared/sentry/src/external/crashpad/compat/android/sys/mman.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/sys/mman.h rename to shared/sentry/src/external/crashpad/compat/android/sys/mman.h diff --git a/shared/sentry/external/crashpad/compat/android/sys/mman_mmap.cc b/shared/sentry/src/external/crashpad/compat/android/sys/mman_mmap.cc similarity index 100% rename from shared/sentry/external/crashpad/compat/android/sys/mman_mmap.cc rename to shared/sentry/src/external/crashpad/compat/android/sys/mman_mmap.cc diff --git a/shared/sentry/external/crashpad/compat/android/sys/syscall.h b/shared/sentry/src/external/crashpad/compat/android/sys/syscall.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/sys/syscall.h rename to shared/sentry/src/external/crashpad/compat/android/sys/syscall.h diff --git a/shared/sentry/external/crashpad/compat/android/sys/user.h b/shared/sentry/src/external/crashpad/compat/android/sys/user.h similarity index 100% rename from shared/sentry/external/crashpad/compat/android/sys/user.h rename to shared/sentry/src/external/crashpad/compat/android/sys/user.h diff --git a/shared/sentry/external/crashpad/compat/ios/mach/exc.defs b/shared/sentry/src/external/crashpad/compat/ios/mach/exc.defs similarity index 100% rename from shared/sentry/external/crashpad/compat/ios/mach/exc.defs rename to shared/sentry/src/external/crashpad/compat/ios/mach/exc.defs diff --git a/shared/sentry/external/crashpad/compat/ios/mach/mach_exc.defs b/shared/sentry/src/external/crashpad/compat/ios/mach/mach_exc.defs similarity index 100% rename from shared/sentry/external/crashpad/compat/ios/mach/mach_exc.defs rename to shared/sentry/src/external/crashpad/compat/ios/mach/mach_exc.defs diff --git a/shared/sentry/external/crashpad/compat/ios/mach/mach_types.defs b/shared/sentry/src/external/crashpad/compat/ios/mach/mach_types.defs similarity index 100% rename from shared/sentry/external/crashpad/compat/ios/mach/mach_types.defs rename to shared/sentry/src/external/crashpad/compat/ios/mach/mach_types.defs diff --git a/shared/sentry/external/crashpad/compat/ios/mach/machine/machine_types.defs b/shared/sentry/src/external/crashpad/compat/ios/mach/machine/machine_types.defs similarity index 100% rename from shared/sentry/external/crashpad/compat/ios/mach/machine/machine_types.defs rename to shared/sentry/src/external/crashpad/compat/ios/mach/machine/machine_types.defs diff --git a/shared/sentry/external/crashpad/compat/ios/mach/std_types.defs b/shared/sentry/src/external/crashpad/compat/ios/mach/std_types.defs similarity index 100% rename from shared/sentry/external/crashpad/compat/ios/mach/std_types.defs rename to shared/sentry/src/external/crashpad/compat/ios/mach/std_types.defs diff --git a/shared/sentry/external/crashpad/compat/linux/signal.h b/shared/sentry/src/external/crashpad/compat/linux/signal.h similarity index 89% rename from shared/sentry/external/crashpad/compat/linux/signal.h rename to shared/sentry/src/external/crashpad/compat/linux/signal.h index e602e70a9..757b84fe8 100644 --- a/shared/sentry/external/crashpad/compat/linux/signal.h +++ b/shared/sentry/src/external/crashpad/compat/linux/signal.h @@ -22,6 +22,12 @@ #define SS_AUTODISARM (1u << 31) #endif +// Linux Kernel >= 5.11 flag for `sigaction::sa_flags`. Missing in headers from +// earlier versions of Linux. +#if !defined(SA_EXPOSE_TAGBITS) +#define SA_EXPOSE_TAGBITS 0x00000800 +#endif + // Missing from glibc and bionic-x86_64 #if defined(__x86_64__) || defined(__i386__) diff --git a/shared/sentry/external/crashpad/compat/linux/sys/mman.h b/shared/sentry/src/external/crashpad/compat/linux/sys/mman.h similarity index 100% rename from shared/sentry/external/crashpad/compat/linux/sys/mman.h rename to shared/sentry/src/external/crashpad/compat/linux/sys/mman.h diff --git a/shared/sentry/external/crashpad/compat/linux/sys/mman_memfd_create.cc b/shared/sentry/src/external/crashpad/compat/linux/sys/mman_memfd_create.cc similarity index 100% rename from shared/sentry/external/crashpad/compat/linux/sys/mman_memfd_create.cc rename to shared/sentry/src/external/crashpad/compat/linux/sys/mman_memfd_create.cc diff --git a/shared/sentry/external/crashpad/compat/linux/sys/ptrace.h b/shared/sentry/src/external/crashpad/compat/linux/sys/ptrace.h similarity index 100% rename from shared/sentry/external/crashpad/compat/linux/sys/ptrace.h rename to shared/sentry/src/external/crashpad/compat/linux/sys/ptrace.h diff --git a/shared/sentry/external/crashpad/compat/linux/sys/user.h b/shared/sentry/src/external/crashpad/compat/linux/sys/user.h similarity index 100% rename from shared/sentry/external/crashpad/compat/linux/sys/user.h rename to shared/sentry/src/external/crashpad/compat/linux/sys/user.h diff --git a/shared/sentry/external/crashpad/compat/mac/Availability.h b/shared/sentry/src/external/crashpad/compat/mac/Availability.h similarity index 100% rename from shared/sentry/external/crashpad/compat/mac/Availability.h rename to shared/sentry/src/external/crashpad/compat/mac/Availability.h diff --git a/shared/sentry/external/crashpad/compat/mac/AvailabilityVersions.h b/shared/sentry/src/external/crashpad/compat/mac/AvailabilityVersions.h similarity index 100% rename from shared/sentry/external/crashpad/compat/mac/AvailabilityVersions.h rename to shared/sentry/src/external/crashpad/compat/mac/AvailabilityVersions.h diff --git a/shared/sentry/external/crashpad/compat/mac/kern/exc_resource.h b/shared/sentry/src/external/crashpad/compat/mac/kern/exc_resource.h similarity index 100% rename from shared/sentry/external/crashpad/compat/mac/kern/exc_resource.h rename to shared/sentry/src/external/crashpad/compat/mac/kern/exc_resource.h diff --git a/shared/sentry/external/crashpad/compat/mac/mach-o/loader.h b/shared/sentry/src/external/crashpad/compat/mac/mach-o/loader.h similarity index 100% rename from shared/sentry/external/crashpad/compat/mac/mach-o/loader.h rename to shared/sentry/src/external/crashpad/compat/mac/mach-o/loader.h diff --git a/shared/sentry/external/crashpad/compat/mac/mach/i386/thread_state.h b/shared/sentry/src/external/crashpad/compat/mac/mach/i386/thread_state.h similarity index 100% rename from shared/sentry/external/crashpad/compat/mac/mach/i386/thread_state.h rename to shared/sentry/src/external/crashpad/compat/mac/mach/i386/thread_state.h diff --git a/shared/sentry/external/crashpad/compat/mac/mach/mach.h b/shared/sentry/src/external/crashpad/compat/mac/mach/mach.h similarity index 100% rename from shared/sentry/external/crashpad/compat/mac/mach/mach.h rename to shared/sentry/src/external/crashpad/compat/mac/mach/mach.h diff --git a/shared/sentry/external/crashpad/compat/mac/sys/resource.h b/shared/sentry/src/external/crashpad/compat/mac/sys/resource.h similarity index 100% rename from shared/sentry/external/crashpad/compat/mac/sys/resource.h rename to shared/sentry/src/external/crashpad/compat/mac/sys/resource.h diff --git a/shared/sentry/external/crashpad/compat/mingw/dbghelp.h b/shared/sentry/src/external/crashpad/compat/mingw/dbghelp.h similarity index 92% rename from shared/sentry/external/crashpad/compat/mingw/dbghelp.h rename to shared/sentry/src/external/crashpad/compat/mingw/dbghelp.h index b49219848..a7fdb4ef4 100644 --- a/shared/sentry/external/crashpad/compat/mingw/dbghelp.h +++ b/shared/sentry/src/external/crashpad/compat/mingw/dbghelp.h @@ -17,6 +17,7 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu-include-next" +#pragma clang diagnostic ignored "-Wzero-length-array" #include_next #include @@ -329,6 +330,36 @@ typedef struct MINIDUMP_MISC_INFO_5 MINIDUMP_MISC_INFO_N; #endif +#ifdef __cplusplus +extern "C" { +#endif + +//! \brief Contains the name of the thread with the given thread ID. +struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_NAME { + //! \brief The identifier of the thread. + uint32_t ThreadId; + + //! \brief RVA64 of a MINIDUMP_STRING containing the name of the thread. + RVA64 RvaOfThreadName; +}; + +//! \brief Variable-sized struct which contains a list of MINIDUMP_THREAD_NAME +//! structs. +struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_NAME_LIST { + //! \brief The number of MINIDUMP_THREAD_NAME structs following this field. + uint32_t NumberOfThreadNames; + + //! \brief A variably-sized array containing zero of more + //! MINIDUMP_THREAD_NAME. + //! The length of the array is indicated by the NumberOfThreadNames field + //! in this struct. + struct MINIDUMP_THREAD_NAME ThreadNames[0]; +}; + +#ifdef __cplusplus +} +#endif + #pragma clang diagnostic pop #endif // CRASHPAD_COMPAT_MINGW_DBGHELP_H_ diff --git a/shared/sentry/src/external/crashpad/compat/mingw/werapi.h b/shared/sentry/src/external/crashpad/compat/mingw/werapi.h new file mode 100644 index 000000000..2007a0538 --- /dev/null +++ b/shared/sentry/src/external/crashpad/compat/mingw/werapi.h @@ -0,0 +1,28 @@ +// Copyright 2015 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_COMPAT_MINGW_WERAPI_H_ +#define CRASHPAD_COMPAT_MINGW_WERAPI_H_ + +typedef HANDLE HREPORT; + +#ifndef WER_MAX_PREFERRED_MODULES_BUFFER +#define WER_MAX_PREFERRED_MODULES_BUFFER 256 +#endif + +#define PWER_SUBMIT_RESULT WER_SUBMIT_RESULT* + +#include_next + +#endif // CRASHPAD_COMPAT_MINGW_WERAPI_H_ diff --git a/shared/sentry/external/crashpad/compat/mingw/winnt.h b/shared/sentry/src/external/crashpad/compat/mingw/winnt.h similarity index 91% rename from shared/sentry/external/crashpad/compat/mingw/winnt.h rename to shared/sentry/src/external/crashpad/compat/mingw/winnt.h index 268af1b3b..44216d785 100644 --- a/shared/sentry/external/crashpad/compat/mingw/winnt.h +++ b/shared/sentry/src/external/crashpad/compat/mingw/winnt.h @@ -57,4 +57,16 @@ struct PROCESSOR_POWER_INFORMATION { #define PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 13 #endif +#include + +#ifdef __cplusplus +extern "C" { +#endif + +WINBASEAPI HRESULT WINAPI GetThreadDescription(HANDLE,PWSTR *); + +#ifdef __cplusplus +} +#endif + #endif // CRASHPAD_COMPAT_MINGW_WINNT_H_ diff --git a/shared/sentry/external/crashpad/compat/non_mac/mach-o/loader.h b/shared/sentry/src/external/crashpad/compat/non_mac/mach-o/loader.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_mac/mach-o/loader.h rename to shared/sentry/src/external/crashpad/compat/non_mac/mach-o/loader.h diff --git a/shared/sentry/external/crashpad/compat/non_mac/mach/mach.h b/shared/sentry/src/external/crashpad/compat/non_mac/mach/mach.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_mac/mach/mach.h rename to shared/sentry/src/external/crashpad/compat/non_mac/mach/mach.h diff --git a/shared/sentry/external/crashpad/compat/non_mac/mach/machine.h b/shared/sentry/src/external/crashpad/compat/non_mac/mach/machine.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_mac/mach/machine.h rename to shared/sentry/src/external/crashpad/compat/non_mac/mach/machine.h diff --git a/shared/sentry/external/crashpad/compat/non_mac/mach/vm_prot.h b/shared/sentry/src/external/crashpad/compat/non_mac/mach/vm_prot.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_mac/mach/vm_prot.h rename to shared/sentry/src/external/crashpad/compat/non_mac/mach/vm_prot.h diff --git a/shared/sentry/external/crashpad/compat/non_win/dbghelp.h b/shared/sentry/src/external/crashpad/compat/non_win/dbghelp.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_win/dbghelp.h rename to shared/sentry/src/external/crashpad/compat/non_win/dbghelp.h diff --git a/shared/sentry/external/crashpad/compat/non_win/minwinbase.h b/shared/sentry/src/external/crashpad/compat/non_win/minwinbase.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_win/minwinbase.h rename to shared/sentry/src/external/crashpad/compat/non_win/minwinbase.h diff --git a/shared/sentry/external/crashpad/compat/non_win/timezoneapi.h b/shared/sentry/src/external/crashpad/compat/non_win/timezoneapi.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_win/timezoneapi.h rename to shared/sentry/src/external/crashpad/compat/non_win/timezoneapi.h diff --git a/shared/sentry/external/crashpad/compat/non_win/verrsrc.h b/shared/sentry/src/external/crashpad/compat/non_win/verrsrc.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_win/verrsrc.h rename to shared/sentry/src/external/crashpad/compat/non_win/verrsrc.h diff --git a/shared/sentry/external/crashpad/compat/non_win/windows.h b/shared/sentry/src/external/crashpad/compat/non_win/windows.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_win/windows.h rename to shared/sentry/src/external/crashpad/compat/non_win/windows.h diff --git a/shared/sentry/external/crashpad/compat/non_win/winnt.h b/shared/sentry/src/external/crashpad/compat/non_win/winnt.h similarity index 100% rename from shared/sentry/external/crashpad/compat/non_win/winnt.h rename to shared/sentry/src/external/crashpad/compat/non_win/winnt.h diff --git a/shared/sentry/external/crashpad/compat/win/getopt.h b/shared/sentry/src/external/crashpad/compat/win/getopt.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/getopt.h rename to shared/sentry/src/external/crashpad/compat/win/getopt.h diff --git a/shared/sentry/external/crashpad/compat/win/strings.cc b/shared/sentry/src/external/crashpad/compat/win/strings.cc similarity index 100% rename from shared/sentry/external/crashpad/compat/win/strings.cc rename to shared/sentry/src/external/crashpad/compat/win/strings.cc diff --git a/shared/sentry/external/crashpad/compat/win/strings.h b/shared/sentry/src/external/crashpad/compat/win/strings.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/strings.h rename to shared/sentry/src/external/crashpad/compat/win/strings.h diff --git a/shared/sentry/external/crashpad/compat/win/sys/time.h b/shared/sentry/src/external/crashpad/compat/win/sys/time.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/sys/time.h rename to shared/sentry/src/external/crashpad/compat/win/sys/time.h diff --git a/shared/sentry/external/crashpad/compat/win/sys/types.h b/shared/sentry/src/external/crashpad/compat/win/sys/types.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/sys/types.h rename to shared/sentry/src/external/crashpad/compat/win/sys/types.h diff --git a/shared/sentry/external/crashpad/compat/win/time.cc b/shared/sentry/src/external/crashpad/compat/win/time.cc similarity index 100% rename from shared/sentry/external/crashpad/compat/win/time.cc rename to shared/sentry/src/external/crashpad/compat/win/time.cc diff --git a/shared/sentry/external/crashpad/compat/win/time.h b/shared/sentry/src/external/crashpad/compat/win/time.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/time.h rename to shared/sentry/src/external/crashpad/compat/win/time.h diff --git a/shared/sentry/external/crashpad/compat/win/winbase.h b/shared/sentry/src/external/crashpad/compat/win/winbase.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/winbase.h rename to shared/sentry/src/external/crashpad/compat/win/winbase.h diff --git a/shared/sentry/external/crashpad/compat/win/winnt.h b/shared/sentry/src/external/crashpad/compat/win/winnt.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/winnt.h rename to shared/sentry/src/external/crashpad/compat/win/winnt.h diff --git a/shared/sentry/external/crashpad/compat/win/winternl.h b/shared/sentry/src/external/crashpad/compat/win/winternl.h similarity index 100% rename from shared/sentry/external/crashpad/compat/win/winternl.h rename to shared/sentry/src/external/crashpad/compat/win/winternl.h diff --git a/shared/sentry/external/crashpad/crashpad-config.cmake.in b/shared/sentry/src/external/crashpad/crashpad-config.cmake.in similarity index 100% rename from shared/sentry/external/crashpad/crashpad-config.cmake.in rename to shared/sentry/src/external/crashpad/crashpad-config.cmake.in diff --git a/shared/sentry/external/crashpad/doc/.gitignore b/shared/sentry/src/external/crashpad/doc/.gitignore similarity index 100% rename from shared/sentry/external/crashpad/doc/.gitignore rename to shared/sentry/src/external/crashpad/doc/.gitignore diff --git a/shared/sentry/external/crashpad/doc/appengine/README b/shared/sentry/src/external/crashpad/doc/appengine/README similarity index 100% rename from shared/sentry/external/crashpad/doc/appengine/README rename to shared/sentry/src/external/crashpad/doc/appengine/README diff --git a/shared/sentry/external/crashpad/doc/appengine/src/crashpad-home/app.yaml b/shared/sentry/src/external/crashpad/doc/appengine/src/crashpad-home/app.yaml similarity index 100% rename from shared/sentry/external/crashpad/doc/appengine/src/crashpad-home/app.yaml rename to shared/sentry/src/external/crashpad/doc/appengine/src/crashpad-home/app.yaml diff --git a/shared/sentry/external/crashpad/doc/appengine/src/crashpad-home/main.go b/shared/sentry/src/external/crashpad/doc/appengine/src/crashpad-home/main.go similarity index 98% rename from shared/sentry/external/crashpad/doc/appengine/src/crashpad-home/main.go rename to shared/sentry/src/external/crashpad/doc/appengine/src/crashpad-home/main.go index 1af2125e8..d988af3ce 100644 --- a/shared/sentry/external/crashpad/doc/appengine/src/crashpad-home/main.go +++ b/shared/sentry/src/external/crashpad/doc/appengine/src/crashpad-home/main.go @@ -63,7 +63,7 @@ func handler(w http.ResponseWriter, r *http.Request) { "/man/generate_dump.html": mainBaseURL + "tools/generate_dump.md", "/man/index.html": mainBaseURL + "doc/man.md", "/man/on_demand_service_tool.html": mainBaseURL + "tools/mac/on_demand_service_tool.md", - "/man/run_with_crashpad.html": mainBaseURL + "tools/mac/run_with_crashpad.md", + "/man/run_with_crashpad.html": mainBaseURL + "tools/run_with_crashpad.md", } ctx := appengine.NewContext(r) diff --git a/shared/sentry/external/crashpad/doc/developing.md b/shared/sentry/src/external/crashpad/doc/developing.md similarity index 100% rename from shared/sentry/external/crashpad/doc/developing.md rename to shared/sentry/src/external/crashpad/doc/developing.md diff --git a/shared/sentry/external/crashpad/doc/favicon.ico b/shared/sentry/src/external/crashpad/doc/favicon.ico similarity index 100% rename from shared/sentry/external/crashpad/doc/favicon.ico rename to shared/sentry/src/external/crashpad/doc/favicon.ico diff --git a/shared/sentry/external/crashpad/doc/ios_overview_design.md b/shared/sentry/src/external/crashpad/doc/ios_overview_design.md similarity index 100% rename from shared/sentry/external/crashpad/doc/ios_overview_design.md rename to shared/sentry/src/external/crashpad/doc/ios_overview_design.md diff --git a/shared/sentry/src/external/crashpad/doc/layering.png b/shared/sentry/src/external/crashpad/doc/layering.png new file mode 100644 index 0000000000000000000000000000000000000000..791bea5383d404e3bbfe08b0d1884e0e031e425d GIT binary patch literal 23460 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 literal 0 HcmV?d00001 diff --git a/shared/sentry/external/crashpad/doc/man.md b/shared/sentry/src/external/crashpad/doc/man.md similarity index 94% rename from shared/sentry/external/crashpad/doc/man.md rename to shared/sentry/src/external/crashpad/doc/man.md index 7789a014d..098c8483f 100644 --- a/shared/sentry/external/crashpad/doc/man.md +++ b/shared/sentry/src/external/crashpad/doc/man.md @@ -27,7 +27,7 @@ limitations under the License. * [catch_exception_tool](../tools/mac/catch_exception_tool.md) * [exception_port_tool](../tools/mac/exception_port_tool.md) * [on_demand_service_tool](../tools/mac/on_demand_service_tool.md) - * [run_with_crashpad](../tools/mac/run_with_crashpad.md) + * [run_with_crashpad](../tools/run_with_crashpad.md) ## Section 8: Dӕmons diff --git a/shared/sentry/src/external/crashpad/doc/overview.png b/shared/sentry/src/external/crashpad/doc/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..78f849efffcf48b3887df080361592be7b4e0a5e GIT binary patch literal 26517 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 A%K!iX literal 0 HcmV?d00001 diff --git a/shared/sentry/external/crashpad/doc/overview_design.md b/shared/sentry/src/external/crashpad/doc/overview_design.md similarity index 100% rename from shared/sentry/external/crashpad/doc/overview_design.md rename to shared/sentry/src/external/crashpad/doc/overview_design.md diff --git a/shared/sentry/external/crashpad/doc/status.md b/shared/sentry/src/external/crashpad/doc/status.md similarity index 100% rename from shared/sentry/external/crashpad/doc/status.md rename to shared/sentry/src/external/crashpad/doc/status.md diff --git a/shared/sentry/external/crashpad/doc/support/compat.sh b/shared/sentry/src/external/crashpad/doc/support/compat.sh similarity index 100% rename from shared/sentry/external/crashpad/doc/support/compat.sh rename to shared/sentry/src/external/crashpad/doc/support/compat.sh diff --git a/shared/sentry/external/crashpad/doc/support/crashpad.doxy b/shared/sentry/src/external/crashpad/doc/support/crashpad.doxy similarity index 100% rename from shared/sentry/external/crashpad/doc/support/crashpad.doxy rename to shared/sentry/src/external/crashpad/doc/support/crashpad.doxy diff --git a/shared/sentry/external/crashpad/doc/support/crashpad.doxy.h b/shared/sentry/src/external/crashpad/doc/support/crashpad.doxy.h similarity index 100% rename from shared/sentry/external/crashpad/doc/support/crashpad.doxy.h rename to shared/sentry/src/external/crashpad/doc/support/crashpad.doxy.h diff --git a/shared/sentry/external/crashpad/doc/support/crashpad_doxygen.css b/shared/sentry/src/external/crashpad/doc/support/crashpad_doxygen.css similarity index 100% rename from shared/sentry/external/crashpad/doc/support/crashpad_doxygen.css rename to shared/sentry/src/external/crashpad/doc/support/crashpad_doxygen.css diff --git a/shared/sentry/external/crashpad/doc/support/generate.sh b/shared/sentry/src/external/crashpad/doc/support/generate.sh similarity index 100% rename from shared/sentry/external/crashpad/doc/support/generate.sh rename to shared/sentry/src/external/crashpad/doc/support/generate.sh diff --git a/shared/sentry/external/crashpad/doc/support/generate_doxygen.py b/shared/sentry/src/external/crashpad/doc/support/generate_doxygen.py similarity index 100% rename from shared/sentry/external/crashpad/doc/support/generate_doxygen.py rename to shared/sentry/src/external/crashpad/doc/support/generate_doxygen.py diff --git a/shared/sentry/external/crashpad/doc/support/generate_git.sh b/shared/sentry/src/external/crashpad/doc/support/generate_git.sh similarity index 100% rename from shared/sentry/external/crashpad/doc/support/generate_git.sh rename to shared/sentry/src/external/crashpad/doc/support/generate_git.sh diff --git a/shared/sentry/external/crashpad/example.cpp b/shared/sentry/src/external/crashpad/example.cpp similarity index 100% rename from shared/sentry/external/crashpad/example.cpp rename to shared/sentry/src/external/crashpad/example.cpp diff --git a/shared/sentry/external/crashpad/handler/BUILD.gn b/shared/sentry/src/external/crashpad/handler/BUILD.gn similarity index 95% rename from shared/sentry/external/crashpad/handler/BUILD.gn rename to shared/sentry/src/external/crashpad/handler/BUILD.gn index e5d488e26..a2d6f7fb4 100644 --- a/shared/sentry/external/crashpad/handler/BUILD.gn +++ b/shared/sentry/src/external/crashpad/handler/BUILD.gn @@ -49,6 +49,9 @@ static_library("handler") { "linux/cros_crash_report_exception_handler.cc", "linux/cros_crash_report_exception_handler.h", ] + + # TODO(https://crbug.com/1420445): Remove this config when M115 branches. + configs += [ "../build:crashpad_is_in_chromium" ] } if (crashpad_is_win) { @@ -97,7 +100,7 @@ static_library("common") { "minidump_to_upload_parameters.cc", "minidump_to_upload_parameters.h", ] - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { sources += [ "mac/file_limit_annotation.cc", "mac/file_limit_annotation.h", @@ -342,6 +345,19 @@ if (crashpad_is_win) { ] } + crashpad_executable("heap_corrupting_program") { + testonly = true + + sources = [ "win/heap_corrupting_program.cc" ] + + deps = [ + "../client", + "../compat", + "../snapshot", + "../third_party/mini_chromium:base", + ] + } + if (current_cpu == "x86") { # Cannot create an x64 DLL with embedded debug info. crashpad_executable("crashy_z7_loader") { diff --git a/shared/sentry/external/crashpad/handler/CMakeLists.txt b/shared/sentry/src/external/crashpad/handler/CMakeLists.txt similarity index 96% rename from shared/sentry/external/crashpad/handler/CMakeLists.txt rename to shared/sentry/src/external/crashpad/handler/CMakeLists.txt index 8fe882ac8..0e5851c09 100644 --- a/shared/sentry/external/crashpad/handler/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/handler/CMakeLists.txt @@ -137,9 +137,11 @@ if(CRASHPAD_WER_ENABLED) target_link_libraries(crashpad_wer PRIVATE $ + $ ) set_property(TARGET crashpad_wer PROPERTY EXPORT_NAME crashpad_wer) + set_property(TARGET crashpad_wer PROPERTY PREFIX "") # ensure MINGW doesn't prefix "lib" to dll name add_library(crashpad::wer ALIAS crashpad_wer) install(TARGETS crashpad_wer EXPORT crashpad_export diff --git a/shared/sentry/external/crashpad/handler/crash_report_upload_thread.cc b/shared/sentry/src/external/crashpad/handler/crash_report_upload_thread.cc similarity index 98% rename from shared/sentry/external/crashpad/handler/crash_report_upload_thread.cc rename to shared/sentry/src/external/crashpad/handler/crash_report_upload_thread.cc index 5bd2889ed..7cea398e1 100644 --- a/shared/sentry/external/crashpad/handler/crash_report_upload_thread.cc +++ b/shared/sentry/src/external/crashpad/handler/crash_report_upload_thread.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "base/logging.h" @@ -88,12 +89,14 @@ class ScopedFunctionInvoker final { CrashReportUploadThread::CrashReportUploadThread( CrashReportDatabase* database, - const std::string& url, + std::string url, + std::string http_proxy, const Options& options, ProcessPendingReportsObservationCallback callback) : options_(options), - callback_(callback), - url_(url), + callback_(std::move(callback)), + url_(std::move(url)), + http_proxy_(std::move(http_proxy)), // When watching for pending reports, check every 15 minutes, even in the // absence of a signal from the handler thread. This allows for failed // uploads to be retried periodically, and for pending reports written by @@ -365,6 +368,7 @@ CrashReportUploadThread::UploadResult CrashReportUploadThread::UploadReport( } } http_transport->SetURL(url); + http_transport->SetHTTPProxy(http_proxy_); if (!http_transport->ExecuteSynchronously(response_body)) { return UploadResult::kRetry; diff --git a/shared/sentry/external/crashpad/handler/crash_report_upload_thread.h b/shared/sentry/src/external/crashpad/handler/crash_report_upload_thread.h similarity index 98% rename from shared/sentry/external/crashpad/handler/crash_report_upload_thread.h rename to shared/sentry/src/external/crashpad/handler/crash_report_upload_thread.h index 22bb26e31..6bde3835b 100644 --- a/shared/sentry/external/crashpad/handler/crash_report_upload_thread.h +++ b/shared/sentry/src/external/crashpad/handler/crash_report_upload_thread.h @@ -85,7 +85,8 @@ class CrashReportUploadThread : public WorkerThread::Delegate, //! processing and attempting to upload on-disk crash reports. //! If this callback is empty, it is not invoked. CrashReportUploadThread(CrashReportDatabase* database, - const std::string& url, + std::string url, + std::string http_proxy, const Options& options, ProcessPendingReportsObservationCallback callback); @@ -226,6 +227,7 @@ class CrashReportUploadThread : public WorkerThread::Delegate, const Options options_; const ProcessPendingReportsObservationCallback callback_; const std::string url_; + const std::string http_proxy_; WorkerThread thread_; ThreadSafeVector known_pending_report_uuids_; #if BUILDFLAG(IS_IOS) diff --git a/shared/sentry/external/crashpad/handler/crashpad_handler.md b/shared/sentry/src/external/crashpad/handler/crashpad_handler.md similarity index 99% rename from shared/sentry/external/crashpad/handler/crashpad_handler.md rename to shared/sentry/src/external/crashpad/handler/crashpad_handler.md index 324957de5..3e722bad5 100644 --- a/shared/sentry/external/crashpad/handler/crashpad_handler.md +++ b/shared/sentry/src/external/crashpad/handler/crashpad_handler.md @@ -83,7 +83,7 @@ closed. It is not normally appropriate to invoke this program directly. Usually, it will be invoked by a Crashpad client using the Crashpad client library, or started by another system service. On macOS, arbitrary programs may be run with a Crashpad -handler by using [run_with_crashpad(1)](../tools/mac/run_with_crashpad.md) to +handler by using [run_with_crashpad(1)](../tools/run_with_crashpad.md) to establish the Crashpad client environment before running a program. ## Options @@ -321,7 +321,7 @@ establish the Crashpad client environment before running a program. [catch_exception_tool(1)](../tools/mac/catch_exception_tool.md), [crashpad_database_util(1)](../tools/crashpad_database_util.md), [generate_dump(1)](../tools/generate_dump.md), -[run_with_crashpad(1)](../tools/mac/run_with_crashpad.md) +[run_with_crashpad(1)](../tools/run_with_crashpad.md) ## Resources diff --git a/shared/sentry/external/crashpad/handler/crashpad_handler_main.cc b/shared/sentry/src/external/crashpad/handler/crashpad_handler_main.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/crashpad_handler_main.cc rename to shared/sentry/src/external/crashpad/handler/crashpad_handler_main.cc diff --git a/shared/sentry/external/crashpad/handler/crashpad_handler_test.cc b/shared/sentry/src/external/crashpad/handler/crashpad_handler_test.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/crashpad_handler_test.cc rename to shared/sentry/src/external/crashpad/handler/crashpad_handler_test.cc diff --git a/shared/sentry/external/crashpad/handler/crashpad_handler_test_extended_handler.cc b/shared/sentry/src/external/crashpad/handler/crashpad_handler_test_extended_handler.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/crashpad_handler_test_extended_handler.cc rename to shared/sentry/src/external/crashpad/handler/crashpad_handler_test_extended_handler.cc diff --git a/shared/sentry/external/crashpad/handler/handler_main.cc b/shared/sentry/src/external/crashpad/handler/handler_main.cc similarity index 99% rename from shared/sentry/external/crashpad/handler/handler_main.cc rename to shared/sentry/src/external/crashpad/handler/handler_main.cc index 7f875b9e9..0ba16ae31 100644 --- a/shared/sentry/external/crashpad/handler/handler_main.cc +++ b/shared/sentry/src/external/crashpad/handler/handler_main.cc @@ -71,7 +71,7 @@ #include #include -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "handler/mac/crash_report_exception_handler.h" #include "handler/mac/exception_handler_server.h" #include "handler/mac/file_limit_annotation.h" @@ -223,6 +223,7 @@ struct Options { std::map annotations; std::map monitor_self_annotations; std::string url; + std::string http_proxy; base::FilePath database; base::FilePath metrics_dir; std::vector monitor_self_arguments; @@ -515,6 +516,7 @@ void MonitorSelf(const Options& options) { options.database, base::FilePath(), options.url, + options.http_proxy, options.annotations, extra_arguments, true, @@ -621,6 +623,7 @@ int HandlerMain(int argc, kOptionTraceParentWithException, #endif kOptionURL, + kOptionHttpProxy, #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) kOptionUseCrosCrashReporter, kOptionMinidumpDirForTests, @@ -705,6 +708,7 @@ int HandlerMain(int argc, #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || // BUILDFLAG(IS_ANDROID) {"url", required_argument, nullptr, kOptionURL}, + {"http-proxy", optional_argument, nullptr, kOptionHttpProxy}, #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) {"use-cros-crash-reporter", no_argument, @@ -878,6 +882,10 @@ int HandlerMain(int argc, options.url = optarg; break; } + case kOptionHttpProxy: { + options.http_proxy = optarg; + break; + } #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) case kOptionUseCrosCrashReporter: { options.use_cros_crash_reporter = true; @@ -1030,6 +1038,7 @@ int HandlerMain(int argc, upload_thread.Reset(new CrashReportUploadThread( database.get(), options.url, + options.http_proxy, upload_thread_options, CrashReportUploadThread::ProcessPendingReportsObservationCallback())); upload_thread.Get()->Start(); @@ -1112,7 +1121,7 @@ int HandlerMain(int argc, CloseStdinAndStdout(); } - base::mac::ScopedMachReceiveRight receive_right; + base::apple::ScopedMachReceiveRight receive_right; if (options.handshake_fd >= 0) { receive_right.reset( diff --git a/shared/sentry/external/crashpad/handler/handler_main.h b/shared/sentry/src/external/crashpad/handler/handler_main.h similarity index 100% rename from shared/sentry/external/crashpad/handler/handler_main.h rename to shared/sentry/src/external/crashpad/handler/handler_main.h diff --git a/shared/sentry/external/crashpad/handler/linux/capture_snapshot.cc b/shared/sentry/src/external/crashpad/handler/linux/capture_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/linux/capture_snapshot.cc rename to shared/sentry/src/external/crashpad/handler/linux/capture_snapshot.cc diff --git a/shared/sentry/external/crashpad/handler/linux/capture_snapshot.h b/shared/sentry/src/external/crashpad/handler/linux/capture_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/handler/linux/capture_snapshot.h rename to shared/sentry/src/external/crashpad/handler/linux/capture_snapshot.h diff --git a/shared/sentry/external/crashpad/handler/linux/crash_report_exception_handler.cc b/shared/sentry/src/external/crashpad/handler/linux/crash_report_exception_handler.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/linux/crash_report_exception_handler.cc rename to shared/sentry/src/external/crashpad/handler/linux/crash_report_exception_handler.cc diff --git a/shared/sentry/external/crashpad/handler/linux/crash_report_exception_handler.h b/shared/sentry/src/external/crashpad/handler/linux/crash_report_exception_handler.h similarity index 100% rename from shared/sentry/external/crashpad/handler/linux/crash_report_exception_handler.h rename to shared/sentry/src/external/crashpad/handler/linux/crash_report_exception_handler.h diff --git a/shared/sentry/external/crashpad/handler/linux/cros_crash_report_exception_handler.cc b/shared/sentry/src/external/crashpad/handler/linux/cros_crash_report_exception_handler.cc similarity index 89% rename from shared/sentry/external/crashpad/handler/linux/cros_crash_report_exception_handler.cc rename to shared/sentry/src/external/crashpad/handler/linux/cros_crash_report_exception_handler.cc index a3a685524..bfccd1f2e 100644 --- a/shared/sentry/external/crashpad/handler/linux/cros_crash_report_exception_handler.cc +++ b/shared/sentry/src/external/crashpad/handler/linux/cros_crash_report_exception_handler.cc @@ -17,6 +17,10 @@ #include #include "base/logging.h" +#include "base/strings/stringprintf.h" +#if defined(CRASHPAD_IS_IN_CHROMIUM) +#include "base/system/sys_info.h" +#endif // CRASHPAD_IS_IN_CHROMIUM #include "client/settings.h" #include "handler/linux/capture_snapshot.h" #include "handler/minidump_to_upload_parameters.h" @@ -246,6 +250,29 @@ bool CrosCrashReportExceptionHandler::HandleExceptionWithConnection( // crash_reporter needs to know the pid and uid of the crashing process. std::vector argv({"/sbin/crash_reporter"}); +#if defined(CRASHPAD_IS_IN_CHROMIUM) + int32_t major_version = 0, minor_version = 0, bugfix_version = 0; + base::SysInfo::OperatingSystemVersionNumbers( + &major_version, &minor_version, &bugfix_version); + // The version on which https://crrev.com/c/4265753 landed. + constexpr int32_t kFixedVersion = 15363; + // TODO(https://crbug.com/1420445): Remove this check (and the + // CRASHPAD_IS_IN_CHROMIUM defines) when M115 branches. + // (Lacros is guaranteed not to be more than 2 milestones ahead of ash, and + // M113 on ash has the relevant crash_reporter change.) + if (major_version >= kFixedVersion) { + // Used to distinguish between non-fatal and fatal crashes. + const ExceptionSnapshot* const exception_snapshot = snapshot->Exception(); + if (exception_snapshot) { + // convert to int32, since crashpad uses -1 as a signal for non-fatal + // crashes. + argv.push_back(base::StringPrintf( + "--chrome_signal=%d", + static_cast(exception_snapshot->Exception()))); + } + } +#endif // CRASHPAD_IS_IN_CHROMIUM + argv.push_back("--chrome_memfd=" + std::to_string(file_writer.fd())); const pid_t pid = process_snapshot->ProcessID(); diff --git a/shared/sentry/external/crashpad/handler/linux/cros_crash_report_exception_handler.h b/shared/sentry/src/external/crashpad/handler/linux/cros_crash_report_exception_handler.h similarity index 100% rename from shared/sentry/external/crashpad/handler/linux/cros_crash_report_exception_handler.h rename to shared/sentry/src/external/crashpad/handler/linux/cros_crash_report_exception_handler.h diff --git a/shared/sentry/external/crashpad/handler/linux/exception_handler_server.cc b/shared/sentry/src/external/crashpad/handler/linux/exception_handler_server.cc similarity index 99% rename from shared/sentry/external/crashpad/handler/linux/exception_handler_server.cc rename to shared/sentry/src/external/crashpad/handler/linux/exception_handler_server.cc index a267e2f12..00b076469 100644 --- a/shared/sentry/external/crashpad/handler/linux/exception_handler_server.cc +++ b/shared/sentry/src/external/crashpad/handler/linux/exception_handler_server.cc @@ -25,6 +25,7 @@ #include +#include "base/check_op.h" #include "base/compiler_specific.h" #include "base/logging.h" #include "base/posix/eintr_wrapper.h" diff --git a/shared/sentry/external/crashpad/handler/linux/exception_handler_server.h b/shared/sentry/src/external/crashpad/handler/linux/exception_handler_server.h similarity index 100% rename from shared/sentry/external/crashpad/handler/linux/exception_handler_server.h rename to shared/sentry/src/external/crashpad/handler/linux/exception_handler_server.h diff --git a/shared/sentry/external/crashpad/handler/linux/exception_handler_server_test.cc b/shared/sentry/src/external/crashpad/handler/linux/exception_handler_server_test.cc similarity index 97% rename from shared/sentry/external/crashpad/handler/linux/exception_handler_server_test.cc rename to shared/sentry/src/external/crashpad/handler/linux/exception_handler_server_test.cc index 40f06e645..e16d93b75 100644 --- a/shared/sentry/external/crashpad/handler/linux/exception_handler_server_test.cc +++ b/shared/sentry/src/external/crashpad/handler/linux/exception_handler_server_test.cc @@ -253,7 +253,10 @@ class ExceptionHandlerServerTest : public testing::TestWithParam { pid_t last_client; ASSERT_TRUE(server_test_->Delegate()->WaitForException( 5.0, &last_client, &last_address)); - EXPECT_EQ(last_address, info.exception_information_address); + // `exception_information_address` is underaligned and `EXPECT_EQ` + // internally takes arguments by reference. Copy it into a temporary + // before comparing to avoid undefined behavior. + EXPECT_EQ(last_address, VMAddress{info.exception_information_address}); EXPECT_EQ(last_client, ChildPID()); } else { CheckedReadFileAtEOF(ReadPipeHandle()); diff --git a/shared/sentry/external/crashpad/handler/linux/handler_trampoline.cc b/shared/sentry/src/external/crashpad/handler/linux/handler_trampoline.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/linux/handler_trampoline.cc rename to shared/sentry/src/external/crashpad/handler/linux/handler_trampoline.cc diff --git a/shared/sentry/external/crashpad/handler/mac/crash_report_exception_handler.cc b/shared/sentry/src/external/crashpad/handler/mac/crash_report_exception_handler.cc similarity index 98% rename from shared/sentry/external/crashpad/handler/mac/crash_report_exception_handler.cc rename to shared/sentry/src/external/crashpad/handler/mac/crash_report_exception_handler.cc index 445046804..906dbad91 100644 --- a/shared/sentry/external/crashpad/handler/mac/crash_report_exception_handler.cc +++ b/shared/sentry/src/external/crashpad/handler/mac/crash_report_exception_handler.cc @@ -17,9 +17,9 @@ #include #include +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" #include "base/strings/stringprintf.h" #include "client/settings.h" #include "handler/mac/file_limit_annotation.h" @@ -222,8 +222,8 @@ kern_return_t CrashReportExceptionHandler::CatchMachException( // processes that haven’t actually crashed, and could result in reports not // actually associated with crashes being sent to the operating system // vendor. - base::mac::ScopedMachSendRight - system_crash_reporter_handler(SystemCrashReporterHandler()); + base::apple::ScopedMachSendRight system_crash_reporter_handler( + SystemCrashReporterHandler()); if (system_crash_reporter_handler.get()) { // Make copies of mutable out parameters so that the system crash reporter // can’t influence the state returned by this method. diff --git a/shared/sentry/external/crashpad/handler/mac/crash_report_exception_handler.h b/shared/sentry/src/external/crashpad/handler/mac/crash_report_exception_handler.h similarity index 100% rename from shared/sentry/external/crashpad/handler/mac/crash_report_exception_handler.h rename to shared/sentry/src/external/crashpad/handler/mac/crash_report_exception_handler.h diff --git a/shared/sentry/external/crashpad/handler/mac/exception_handler_server.cc b/shared/sentry/src/external/crashpad/handler/mac/exception_handler_server.cc similarity index 97% rename from shared/sentry/external/crashpad/handler/mac/exception_handler_server.cc rename to shared/sentry/src/external/crashpad/handler/mac/exception_handler_server.cc index 0e7f505c0..5c1814c8c 100644 --- a/shared/sentry/external/crashpad/handler/mac/exception_handler_server.cc +++ b/shared/sentry/src/external/crashpad/handler/mac/exception_handler_server.cc @@ -16,8 +16,9 @@ #include +#include "base/apple/mach_logging.h" +#include "base/check.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "util/mach/composite_mach_message_server.h" #include "util/mach/mach_extensions.h" #include "util/mach/mach_message.h" @@ -73,7 +74,7 @@ class ExceptionHandlerServerRun : public UniversalMachExcServer::Interface, MACH_MSG_TYPE_MAKE_SEND_ONCE, &previous); MACH_CHECK(kr == KERN_SUCCESS, kr) << "mach_port_request_notification"; - base::mac::ScopedMachSendRight previous_owner(previous); + base::apple::ScopedMachSendRight previous_owner(previous); } // A single CompositeMachMessageServer will dispatch both exception messages @@ -84,7 +85,7 @@ class ExceptionHandlerServerRun : public UniversalMachExcServer::Interface, // from ever existing. Using distinct receive rights also allows the handler // methods to ensure that the messages they process were sent by a holder of // the proper send right. - base::mac::ScopedMachPortSet server_port_set( + base::apple::ScopedMachPortSet server_port_set( NewMachPort(MACH_PORT_RIGHT_PORT_SET)); CHECK(server_port_set.is_valid()); @@ -192,7 +193,7 @@ class ExceptionHandlerServerRun : public UniversalMachExcServer::Interface, } // namespace ExceptionHandlerServer::ExceptionHandlerServer( - base::mac::ScopedMachReceiveRight receive_port, + base::apple::ScopedMachReceiveRight receive_port, bool launchd) : receive_port_(std::move(receive_port)), notify_port_(NewMachPort(MACH_PORT_RIGHT_RECEIVE)), diff --git a/shared/sentry/external/crashpad/handler/mac/exception_handler_server.h b/shared/sentry/src/external/crashpad/handler/mac/exception_handler_server.h similarity index 93% rename from shared/sentry/external/crashpad/handler/mac/exception_handler_server.h rename to shared/sentry/src/external/crashpad/handler/mac/exception_handler_server.h index 085ebd8a5..6d63a290d 100644 --- a/shared/sentry/external/crashpad/handler/mac/exception_handler_server.h +++ b/shared/sentry/src/external/crashpad/handler/mac/exception_handler_server.h @@ -17,7 +17,7 @@ #include -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "util/mach/exc_server_variants.h" namespace crashpad { @@ -34,7 +34,7 @@ class ExceptionHandlerServer { //! launchd. \a receive_port is not monitored for no-senders //! notifications, and instead, Stop() must be called to provide a “quit” //! signal. - ExceptionHandlerServer(base::mac::ScopedMachReceiveRight receive_port, + ExceptionHandlerServer(base::apple::ScopedMachReceiveRight receive_port, bool launchd); ExceptionHandlerServer(const ExceptionHandlerServer&) = delete; @@ -73,8 +73,8 @@ class ExceptionHandlerServer { void Stop(); private: - base::mac::ScopedMachReceiveRight receive_port_; - base::mac::ScopedMachReceiveRight notify_port_; + base::apple::ScopedMachReceiveRight receive_port_; + base::apple::ScopedMachReceiveRight notify_port_; bool launchd_; }; diff --git a/shared/sentry/external/crashpad/handler/mac/file_limit_annotation.cc b/shared/sentry/src/external/crashpad/handler/mac/file_limit_annotation.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/mac/file_limit_annotation.cc rename to shared/sentry/src/external/crashpad/handler/mac/file_limit_annotation.cc diff --git a/shared/sentry/external/crashpad/handler/mac/file_limit_annotation.h b/shared/sentry/src/external/crashpad/handler/mac/file_limit_annotation.h similarity index 100% rename from shared/sentry/external/crashpad/handler/mac/file_limit_annotation.h rename to shared/sentry/src/external/crashpad/handler/mac/file_limit_annotation.h diff --git a/shared/sentry/external/crashpad/handler/main.cc b/shared/sentry/src/external/crashpad/handler/main.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/main.cc rename to shared/sentry/src/external/crashpad/handler/main.cc diff --git a/shared/sentry/external/crashpad/handler/minidump_to_upload_parameters.cc b/shared/sentry/src/external/crashpad/handler/minidump_to_upload_parameters.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/minidump_to_upload_parameters.cc rename to shared/sentry/src/external/crashpad/handler/minidump_to_upload_parameters.cc diff --git a/shared/sentry/external/crashpad/handler/minidump_to_upload_parameters.h b/shared/sentry/src/external/crashpad/handler/minidump_to_upload_parameters.h similarity index 100% rename from shared/sentry/external/crashpad/handler/minidump_to_upload_parameters.h rename to shared/sentry/src/external/crashpad/handler/minidump_to_upload_parameters.h diff --git a/shared/sentry/external/crashpad/handler/minidump_to_upload_parameters_test.cc b/shared/sentry/src/external/crashpad/handler/minidump_to_upload_parameters_test.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/minidump_to_upload_parameters_test.cc rename to shared/sentry/src/external/crashpad/handler/minidump_to_upload_parameters_test.cc diff --git a/shared/sentry/external/crashpad/handler/prune_crash_reports_thread.cc b/shared/sentry/src/external/crashpad/handler/prune_crash_reports_thread.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/prune_crash_reports_thread.cc rename to shared/sentry/src/external/crashpad/handler/prune_crash_reports_thread.cc diff --git a/shared/sentry/external/crashpad/handler/prune_crash_reports_thread.h b/shared/sentry/src/external/crashpad/handler/prune_crash_reports_thread.h similarity index 100% rename from shared/sentry/external/crashpad/handler/prune_crash_reports_thread.h rename to shared/sentry/src/external/crashpad/handler/prune_crash_reports_thread.h diff --git a/shared/sentry/external/crashpad/handler/user_stream_data_source.cc b/shared/sentry/src/external/crashpad/handler/user_stream_data_source.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/user_stream_data_source.cc rename to shared/sentry/src/external/crashpad/handler/user_stream_data_source.cc diff --git a/shared/sentry/external/crashpad/handler/user_stream_data_source.h b/shared/sentry/src/external/crashpad/handler/user_stream_data_source.h similarity index 100% rename from shared/sentry/external/crashpad/handler/user_stream_data_source.h rename to shared/sentry/src/external/crashpad/handler/user_stream_data_source.h diff --git a/shared/sentry/external/crashpad/handler/win/.gitattributes b/shared/sentry/src/external/crashpad/handler/win/.gitattributes similarity index 100% rename from shared/sentry/external/crashpad/handler/win/.gitattributes rename to shared/sentry/src/external/crashpad/handler/win/.gitattributes diff --git a/shared/sentry/external/crashpad/handler/win/crash_other_program.cc b/shared/sentry/src/external/crashpad/handler/win/crash_other_program.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/crash_other_program.cc rename to shared/sentry/src/external/crashpad/handler/win/crash_other_program.cc diff --git a/shared/sentry/external/crashpad/handler/win/crash_report_exception_handler.cc b/shared/sentry/src/external/crashpad/handler/win/crash_report_exception_handler.cc similarity index 97% rename from shared/sentry/external/crashpad/handler/win/crash_report_exception_handler.cc rename to shared/sentry/src/external/crashpad/handler/win/crash_report_exception_handler.cc index eab593cd3..84979f100 100644 --- a/shared/sentry/external/crashpad/handler/win/crash_report_exception_handler.cc +++ b/shared/sentry/src/external/crashpad/handler/win/crash_report_exception_handler.cc @@ -115,7 +115,7 @@ unsigned int CrashReportExceptionHandler::ExceptionHandlerServerException( for (const auto& attachment : (*attachments_)) { FileReader file_reader; if (!file_reader.Open(attachment)) { - LOG(ERROR) << "attachment " << attachment.value().c_str() + LOG(ERROR) << "attachment " << attachment << " couldn't be opened, skipping"; continue; } @@ -124,7 +124,7 @@ unsigned int CrashReportExceptionHandler::ExceptionHandlerServerException( FileWriter* file_writer = new_report->AddAttachment(base::WideToUTF8(filename.value())); if (file_writer == nullptr) { - LOG(ERROR) << "attachment " << filename.value().c_str() + LOG(ERROR) << "attachment " << filename << " couldn't be created, skipping"; continue; } diff --git a/shared/sentry/external/crashpad/handler/win/crash_report_exception_handler.h b/shared/sentry/src/external/crashpad/handler/win/crash_report_exception_handler.h similarity index 100% rename from shared/sentry/external/crashpad/handler/win/crash_report_exception_handler.h rename to shared/sentry/src/external/crashpad/handler/win/crash_report_exception_handler.h diff --git a/shared/sentry/external/crashpad/handler/win/crashy_signal.cc b/shared/sentry/src/external/crashpad/handler/win/crashy_signal.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/crashy_signal.cc rename to shared/sentry/src/external/crashpad/handler/win/crashy_signal.cc diff --git a/shared/sentry/external/crashpad/handler/win/crashy_test_program.cc b/shared/sentry/src/external/crashpad/handler/win/crashy_test_program.cc similarity index 99% rename from shared/sentry/external/crashpad/handler/win/crashy_test_program.cc rename to shared/sentry/src/external/crashpad/handler/win/crashy_test_program.cc index 658a22535..0929f3375 100644 --- a/shared/sentry/external/crashpad/handler/win/crashy_test_program.cc +++ b/shared/sentry/src/external/crashpad/handler/win/crashy_test_program.cc @@ -25,6 +25,7 @@ #include #include +#include "base/check.h" #include "base/files/file_path.h" #include "base/logging.h" #include "build/build_config.h" diff --git a/shared/sentry/external/crashpad/handler/win/crashy_test_z7_loader.cc b/shared/sentry/src/external/crashpad/handler/win/crashy_test_z7_loader.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/crashy_test_z7_loader.cc rename to shared/sentry/src/external/crashpad/handler/win/crashy_test_z7_loader.cc diff --git a/shared/sentry/external/crashpad/handler/win/fake_handler_that_crashes_at_startup.cc b/shared/sentry/src/external/crashpad/handler/win/fake_handler_that_crashes_at_startup.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/fake_handler_that_crashes_at_startup.cc rename to shared/sentry/src/external/crashpad/handler/win/fake_handler_that_crashes_at_startup.cc diff --git a/shared/sentry/external/crashpad/handler/win/fastfail_test_program.cc b/shared/sentry/src/external/crashpad/handler/win/fastfail_test_program.cc similarity index 95% rename from shared/sentry/external/crashpad/handler/win/fastfail_test_program.cc rename to shared/sentry/src/external/crashpad/handler/win/fastfail_test_program.cc index 510ee56e7..f654119f8 100644 --- a/shared/sentry/external/crashpad/handler/win/fastfail_test_program.cc +++ b/shared/sentry/src/external/crashpad/handler/win/fastfail_test_program.cc @@ -14,6 +14,7 @@ #include +#include "base/check.h" #include "base/files/file_path.h" #include "base/logging.h" #include "client/crashpad_client.h" @@ -129,6 +130,10 @@ int CrashyMain(int argc, wchar_t* argv[]) { return EXIT_FAILURE; } + // Some versions of python call SetErrorMode() which extends to children, and + // prevents the WerFault infrastructure from running. + SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); + if (type == L"cf") CfgCrash(); if (type == L"ff") diff --git a/shared/sentry/external/crashpad/handler/win/hanging_program.cc b/shared/sentry/src/external/crashpad/handler/win/hanging_program.cc similarity index 99% rename from shared/sentry/external/crashpad/handler/win/hanging_program.cc rename to shared/sentry/src/external/crashpad/handler/win/hanging_program.cc index 2404bf30e..72f903f21 100644 --- a/shared/sentry/external/crashpad/handler/win/hanging_program.cc +++ b/shared/sentry/src/external/crashpad/handler/win/hanging_program.cc @@ -17,6 +17,7 @@ #include +#include "base/check.h" #include "base/debug/alias.h" #include "base/logging.h" #include "base/notreached.h" diff --git a/shared/sentry/src/external/crashpad/handler/win/heap_corrupting_program.cc b/shared/sentry/src/external/crashpad/handler/win/heap_corrupting_program.cc new file mode 100644 index 000000000..8fe62f6ef --- /dev/null +++ b/shared/sentry/src/external/crashpad/handler/win/heap_corrupting_program.cc @@ -0,0 +1,96 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "base/check.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "client/crashpad_client.h" +#include "util/misc/paths.h" + +#include + +// We set up a program that crashes with a heap corruption exception. +// STATUS_HEAP_CORRUPTION (0xC0000374 3221226356). +namespace crashpad { +namespace { + +void HeapCorruptionCrash() { + __try { + HANDLE heap = ::HeapCreate(0, 0, 0); + CHECK(heap); + CHECK(HeapSetInformation( + heap, HeapEnableTerminationOnCorruption, nullptr, 0)); + void* addr = ::HeapAlloc(heap, 0, 0x1000); + CHECK(addr); + // Corrupt heap header. + char* addr_mutable = reinterpret_cast(addr); + memset(addr_mutable - sizeof(addr), 0xCC, sizeof(addr)); + + HeapFree(heap, 0, addr); + HeapDestroy(heap); + } __except (EXCEPTION_EXECUTE_HANDLER) { + // Heap corruption exception should never be caught. + CHECK(false); + } + // Should never reach here. + abort(); +} + +int CrashyMain(int argc, wchar_t* argv[]) { + static CrashpadClient* client = new crashpad::CrashpadClient(); + + if (argc == 2) { + // We call this from end_to_end_test.py. + if (!client->SetHandlerIPCPipe(argv[1])) { + LOG(ERROR) << "SetHandler"; + return EXIT_FAILURE; + } + } else if (argc == 3) { + // This is helpful for debugging. + if (!client->StartHandler(base::FilePath(argv[1]), + base::FilePath(argv[2]), + base::FilePath(), + std::string(), + std::map(), + std::vector(), + false, + true)) { + LOG(ERROR) << "StartHandler"; + return EXIT_FAILURE; + } + // Got to have a handler & registration. + if (!client->WaitForHandlerStart(10000)) { + LOG(ERROR) << "Handler failed to start"; + return EXIT_FAILURE; + } + } else { + fprintf(stderr, "Usage: %ls \n", argv[0]); + fprintf(stderr, " %ls \n", argv[0]); + return EXIT_FAILURE; + } + + HeapCorruptionCrash(); + + LOG(ERROR) << "Invalid type or exception failed."; + return EXIT_FAILURE; +} + +} // namespace +} // namespace crashpad + +int wmain(int argc, wchar_t* argv[]) { + return crashpad::CrashyMain(argc, argv); +} diff --git a/shared/sentry/external/crashpad/handler/win/loader_lock_dll.cc b/shared/sentry/src/external/crashpad/handler/win/loader_lock_dll.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/loader_lock_dll.cc rename to shared/sentry/src/external/crashpad/handler/win/loader_lock_dll.cc diff --git a/shared/sentry/external/crashpad/handler/win/self_destroying_test_program.cc b/shared/sentry/src/external/crashpad/handler/win/self_destroying_test_program.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/self_destroying_test_program.cc rename to shared/sentry/src/external/crashpad/handler/win/self_destroying_test_program.cc diff --git a/shared/sentry/external/crashpad/handler/win/wer/BUILD.gn b/shared/sentry/src/external/crashpad/handler/win/wer/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/handler/win/wer/BUILD.gn rename to shared/sentry/src/external/crashpad/handler/win/wer/BUILD.gn diff --git a/shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.cc b/shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.cc similarity index 98% rename from shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.cc rename to shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.cc index 3379d00d2..1394e203a 100644 --- a/shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.cc +++ b/shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.cc @@ -102,7 +102,8 @@ bool ProcessException(const DWORD* handled_exceptions, break; } } - if (!found) + // If num_handled_exceptions == 0, all exceptions should be passed on. + if (!found && num_handled_exceptions != 0) return false; // Grab out the handles to the crashpad server. diff --git a/shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.def b/shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.def similarity index 100% rename from shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.def rename to shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.def diff --git a/shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.h b/shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.h similarity index 100% rename from shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.h rename to shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.h diff --git a/shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.ver b/shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.ver similarity index 100% rename from shared/sentry/external/crashpad/handler/win/wer/crashpad_wer.ver rename to shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer.ver diff --git a/shared/sentry/external/crashpad/handler/win/wer/crashpad_wer_main.cc b/shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer_main.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/wer/crashpad_wer_main.cc rename to shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer_main.cc diff --git a/shared/sentry/external/crashpad/handler/win/wer/crashpad_wer_module_unittest.cc b/shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer_module_unittest.cc similarity index 100% rename from shared/sentry/external/crashpad/handler/win/wer/crashpad_wer_module_unittest.cc rename to shared/sentry/src/external/crashpad/handler/win/wer/crashpad_wer_module_unittest.cc diff --git a/shared/sentry/external/crashpad/handler/win/z7_test.cpp b/shared/sentry/src/external/crashpad/handler/win/z7_test.cpp similarity index 100% rename from shared/sentry/external/crashpad/handler/win/z7_test.cpp rename to shared/sentry/src/external/crashpad/handler/win/z7_test.cpp diff --git a/shared/sentry/external/crashpad/handler/win/z7_test.dll b/shared/sentry/src/external/crashpad/handler/win/z7_test.dll similarity index 100% rename from shared/sentry/external/crashpad/handler/win/z7_test.dll rename to shared/sentry/src/external/crashpad/handler/win/z7_test.dll diff --git a/shared/sentry/external/crashpad/infra/config/PRESUBMIT.py b/shared/sentry/src/external/crashpad/infra/config/PRESUBMIT.py similarity index 100% rename from shared/sentry/external/crashpad/infra/config/PRESUBMIT.py rename to shared/sentry/src/external/crashpad/infra/config/PRESUBMIT.py diff --git a/shared/sentry/external/crashpad/infra/config/generated/commit-queue.cfg b/shared/sentry/src/external/crashpad/infra/config/generated/commit-queue.cfg similarity index 100% rename from shared/sentry/external/crashpad/infra/config/generated/commit-queue.cfg rename to shared/sentry/src/external/crashpad/infra/config/generated/commit-queue.cfg diff --git a/shared/sentry/external/crashpad/infra/config/generated/cr-buildbucket.cfg b/shared/sentry/src/external/crashpad/infra/config/generated/cr-buildbucket.cfg similarity index 100% rename from shared/sentry/external/crashpad/infra/config/generated/cr-buildbucket.cfg rename to shared/sentry/src/external/crashpad/infra/config/generated/cr-buildbucket.cfg diff --git a/shared/sentry/external/crashpad/infra/config/generated/luci-logdog.cfg b/shared/sentry/src/external/crashpad/infra/config/generated/luci-logdog.cfg similarity index 100% rename from shared/sentry/external/crashpad/infra/config/generated/luci-logdog.cfg rename to shared/sentry/src/external/crashpad/infra/config/generated/luci-logdog.cfg diff --git a/shared/sentry/external/crashpad/infra/config/generated/luci-milo.cfg b/shared/sentry/src/external/crashpad/infra/config/generated/luci-milo.cfg similarity index 100% rename from shared/sentry/external/crashpad/infra/config/generated/luci-milo.cfg rename to shared/sentry/src/external/crashpad/infra/config/generated/luci-milo.cfg diff --git a/shared/sentry/external/crashpad/infra/config/generated/luci-scheduler.cfg b/shared/sentry/src/external/crashpad/infra/config/generated/luci-scheduler.cfg similarity index 100% rename from shared/sentry/external/crashpad/infra/config/generated/luci-scheduler.cfg rename to shared/sentry/src/external/crashpad/infra/config/generated/luci-scheduler.cfg diff --git a/shared/sentry/external/crashpad/infra/config/generated/project.cfg b/shared/sentry/src/external/crashpad/infra/config/generated/project.cfg similarity index 100% rename from shared/sentry/external/crashpad/infra/config/generated/project.cfg rename to shared/sentry/src/external/crashpad/infra/config/generated/project.cfg diff --git a/shared/sentry/external/crashpad/infra/config/generated/realms.cfg b/shared/sentry/src/external/crashpad/infra/config/generated/realms.cfg similarity index 100% rename from shared/sentry/external/crashpad/infra/config/generated/realms.cfg rename to shared/sentry/src/external/crashpad/infra/config/generated/realms.cfg diff --git a/shared/sentry/external/crashpad/infra/config/main.star b/shared/sentry/src/external/crashpad/infra/config/main.star similarity index 100% rename from shared/sentry/external/crashpad/infra/config/main.star rename to shared/sentry/src/external/crashpad/infra/config/main.star diff --git a/shared/sentry/external/crashpad/libunwind/.clang-format b/shared/sentry/src/external/crashpad/libunwind/.clang-format similarity index 100% rename from shared/sentry/external/crashpad/libunwind/.clang-format rename to shared/sentry/src/external/crashpad/libunwind/.clang-format diff --git a/shared/sentry/external/crashpad/libunwind/CMakeLists.txt b/shared/sentry/src/external/crashpad/libunwind/CMakeLists.txt similarity index 100% rename from shared/sentry/external/crashpad/libunwind/CMakeLists.txt rename to shared/sentry/src/external/crashpad/libunwind/CMakeLists.txt diff --git a/shared/sentry/external/crashpad/libunwind/LICENSE.TXT b/shared/sentry/src/external/crashpad/libunwind/LICENSE.TXT similarity index 100% rename from shared/sentry/external/crashpad/libunwind/LICENSE.TXT rename to shared/sentry/src/external/crashpad/libunwind/LICENSE.TXT diff --git a/shared/sentry/external/crashpad/libunwind/cmake/Modules/HandleCompilerRT.cmake b/shared/sentry/src/external/crashpad/libunwind/cmake/Modules/HandleCompilerRT.cmake similarity index 100% rename from shared/sentry/external/crashpad/libunwind/cmake/Modules/HandleCompilerRT.cmake rename to shared/sentry/src/external/crashpad/libunwind/cmake/Modules/HandleCompilerRT.cmake diff --git a/shared/sentry/external/crashpad/libunwind/cmake/Modules/HandleLibunwindFlags.cmake b/shared/sentry/src/external/crashpad/libunwind/cmake/Modules/HandleLibunwindFlags.cmake similarity index 100% rename from shared/sentry/external/crashpad/libunwind/cmake/Modules/HandleLibunwindFlags.cmake rename to shared/sentry/src/external/crashpad/libunwind/cmake/Modules/HandleLibunwindFlags.cmake diff --git a/shared/sentry/external/crashpad/libunwind/cmake/config-ix.cmake b/shared/sentry/src/external/crashpad/libunwind/cmake/config-ix.cmake similarity index 100% rename from shared/sentry/external/crashpad/libunwind/cmake/config-ix.cmake rename to shared/sentry/src/external/crashpad/libunwind/cmake/config-ix.cmake diff --git a/shared/sentry/external/crashpad/libunwind/docs/BuildingLibunwind.rst b/shared/sentry/src/external/crashpad/libunwind/docs/BuildingLibunwind.rst similarity index 100% rename from shared/sentry/external/crashpad/libunwind/docs/BuildingLibunwind.rst rename to shared/sentry/src/external/crashpad/libunwind/docs/BuildingLibunwind.rst diff --git a/shared/sentry/external/crashpad/libunwind/docs/CMakeLists.txt b/shared/sentry/src/external/crashpad/libunwind/docs/CMakeLists.txt similarity index 100% rename from shared/sentry/external/crashpad/libunwind/docs/CMakeLists.txt rename to shared/sentry/src/external/crashpad/libunwind/docs/CMakeLists.txt diff --git a/shared/sentry/external/crashpad/libunwind/docs/README.txt b/shared/sentry/src/external/crashpad/libunwind/docs/README.txt similarity index 100% rename from shared/sentry/external/crashpad/libunwind/docs/README.txt rename to shared/sentry/src/external/crashpad/libunwind/docs/README.txt diff --git a/shared/sentry/external/crashpad/libunwind/docs/conf.py b/shared/sentry/src/external/crashpad/libunwind/docs/conf.py similarity index 100% rename from shared/sentry/external/crashpad/libunwind/docs/conf.py rename to shared/sentry/src/external/crashpad/libunwind/docs/conf.py diff --git a/shared/sentry/external/crashpad/libunwind/docs/index.rst b/shared/sentry/src/external/crashpad/libunwind/docs/index.rst similarity index 100% rename from shared/sentry/external/crashpad/libunwind/docs/index.rst rename to shared/sentry/src/external/crashpad/libunwind/docs/index.rst diff --git a/shared/sentry/external/crashpad/libunwind/include/__libunwind_config.h b/shared/sentry/src/external/crashpad/libunwind/include/__libunwind_config.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/include/__libunwind_config.h rename to shared/sentry/src/external/crashpad/libunwind/include/__libunwind_config.h diff --git a/shared/sentry/external/crashpad/libunwind/include/libunwind.h b/shared/sentry/src/external/crashpad/libunwind/include/libunwind.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/include/libunwind.h rename to shared/sentry/src/external/crashpad/libunwind/include/libunwind.h diff --git a/shared/sentry/external/crashpad/libunwind/include/mach-o/compact_unwind_encoding.h b/shared/sentry/src/external/crashpad/libunwind/include/mach-o/compact_unwind_encoding.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/include/mach-o/compact_unwind_encoding.h rename to shared/sentry/src/external/crashpad/libunwind/include/mach-o/compact_unwind_encoding.h diff --git a/shared/sentry/external/crashpad/libunwind/include/unwind.h b/shared/sentry/src/external/crashpad/libunwind/include/unwind.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/include/unwind.h rename to shared/sentry/src/external/crashpad/libunwind/include/unwind.h diff --git a/shared/sentry/external/crashpad/libunwind/include/unwind_arm_ehabi.h b/shared/sentry/src/external/crashpad/libunwind/include/unwind_arm_ehabi.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/include/unwind_arm_ehabi.h rename to shared/sentry/src/external/crashpad/libunwind/include/unwind_arm_ehabi.h diff --git a/shared/sentry/external/crashpad/libunwind/include/unwind_itanium.h b/shared/sentry/src/external/crashpad/libunwind/include/unwind_itanium.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/include/unwind_itanium.h rename to shared/sentry/src/external/crashpad/libunwind/include/unwind_itanium.h diff --git a/shared/sentry/external/crashpad/libunwind/src/AddressSpace.hpp b/shared/sentry/src/external/crashpad/libunwind/src/AddressSpace.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/AddressSpace.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/AddressSpace.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/CMakeLists.txt b/shared/sentry/src/external/crashpad/libunwind/src/CMakeLists.txt similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/CMakeLists.txt rename to shared/sentry/src/external/crashpad/libunwind/src/CMakeLists.txt diff --git a/shared/sentry/external/crashpad/libunwind/src/CompactUnwinder.hpp b/shared/sentry/src/external/crashpad/libunwind/src/CompactUnwinder.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/CompactUnwinder.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/CompactUnwinder.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/DwarfInstructions.hpp b/shared/sentry/src/external/crashpad/libunwind/src/DwarfInstructions.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/DwarfInstructions.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/DwarfInstructions.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/DwarfParser.hpp b/shared/sentry/src/external/crashpad/libunwind/src/DwarfParser.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/DwarfParser.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/DwarfParser.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/EHHeaderParser.hpp b/shared/sentry/src/external/crashpad/libunwind/src/EHHeaderParser.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/EHHeaderParser.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/EHHeaderParser.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/FrameHeaderCache.hpp b/shared/sentry/src/external/crashpad/libunwind/src/FrameHeaderCache.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/FrameHeaderCache.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/FrameHeaderCache.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/RWMutex.hpp b/shared/sentry/src/external/crashpad/libunwind/src/RWMutex.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/RWMutex.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/RWMutex.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/Registers.hpp b/shared/sentry/src/external/crashpad/libunwind/src/Registers.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/Registers.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/Registers.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/Unwind-EHABI.cpp b/shared/sentry/src/external/crashpad/libunwind/src/Unwind-EHABI.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/Unwind-EHABI.cpp rename to shared/sentry/src/external/crashpad/libunwind/src/Unwind-EHABI.cpp diff --git a/shared/sentry/external/crashpad/libunwind/src/Unwind-EHABI.h b/shared/sentry/src/external/crashpad/libunwind/src/Unwind-EHABI.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/Unwind-EHABI.h rename to shared/sentry/src/external/crashpad/libunwind/src/Unwind-EHABI.h diff --git a/shared/sentry/external/crashpad/libunwind/src/Unwind-seh.cpp b/shared/sentry/src/external/crashpad/libunwind/src/Unwind-seh.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/Unwind-seh.cpp rename to shared/sentry/src/external/crashpad/libunwind/src/Unwind-seh.cpp diff --git a/shared/sentry/external/crashpad/libunwind/src/Unwind-sjlj.c b/shared/sentry/src/external/crashpad/libunwind/src/Unwind-sjlj.c similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/Unwind-sjlj.c rename to shared/sentry/src/external/crashpad/libunwind/src/Unwind-sjlj.c diff --git a/shared/sentry/external/crashpad/libunwind/src/UnwindCursor.hpp b/shared/sentry/src/external/crashpad/libunwind/src/UnwindCursor.hpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/UnwindCursor.hpp rename to shared/sentry/src/external/crashpad/libunwind/src/UnwindCursor.hpp diff --git a/shared/sentry/external/crashpad/libunwind/src/UnwindLevel1-gcc-ext.c b/shared/sentry/src/external/crashpad/libunwind/src/UnwindLevel1-gcc-ext.c similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/UnwindLevel1-gcc-ext.c rename to shared/sentry/src/external/crashpad/libunwind/src/UnwindLevel1-gcc-ext.c diff --git a/shared/sentry/external/crashpad/libunwind/src/UnwindLevel1.c b/shared/sentry/src/external/crashpad/libunwind/src/UnwindLevel1.c similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/UnwindLevel1.c rename to shared/sentry/src/external/crashpad/libunwind/src/UnwindLevel1.c diff --git a/shared/sentry/external/crashpad/libunwind/src/UnwindRegistersRestore.S b/shared/sentry/src/external/crashpad/libunwind/src/UnwindRegistersRestore.S similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/UnwindRegistersRestore.S rename to shared/sentry/src/external/crashpad/libunwind/src/UnwindRegistersRestore.S diff --git a/shared/sentry/external/crashpad/libunwind/src/UnwindRegistersSave.S b/shared/sentry/src/external/crashpad/libunwind/src/UnwindRegistersSave.S similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/UnwindRegistersSave.S rename to shared/sentry/src/external/crashpad/libunwind/src/UnwindRegistersSave.S diff --git a/shared/sentry/external/crashpad/libunwind/src/Unwind_AppleExtras.cpp b/shared/sentry/src/external/crashpad/libunwind/src/Unwind_AppleExtras.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/Unwind_AppleExtras.cpp rename to shared/sentry/src/external/crashpad/libunwind/src/Unwind_AppleExtras.cpp diff --git a/shared/sentry/external/crashpad/libunwind/src/assembly.h b/shared/sentry/src/external/crashpad/libunwind/src/assembly.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/assembly.h rename to shared/sentry/src/external/crashpad/libunwind/src/assembly.h diff --git a/shared/sentry/external/crashpad/libunwind/src/cet_unwind.h b/shared/sentry/src/external/crashpad/libunwind/src/cet_unwind.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/cet_unwind.h rename to shared/sentry/src/external/crashpad/libunwind/src/cet_unwind.h diff --git a/shared/sentry/external/crashpad/libunwind/src/config.h b/shared/sentry/src/external/crashpad/libunwind/src/config.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/config.h rename to shared/sentry/src/external/crashpad/libunwind/src/config.h diff --git a/shared/sentry/external/crashpad/libunwind/src/dwarf2.h b/shared/sentry/src/external/crashpad/libunwind/src/dwarf2.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/dwarf2.h rename to shared/sentry/src/external/crashpad/libunwind/src/dwarf2.h diff --git a/shared/sentry/external/crashpad/libunwind/src/libunwind.cpp b/shared/sentry/src/external/crashpad/libunwind/src/libunwind.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/libunwind.cpp rename to shared/sentry/src/external/crashpad/libunwind/src/libunwind.cpp diff --git a/shared/sentry/external/crashpad/libunwind/src/libunwind_ext.h b/shared/sentry/src/external/crashpad/libunwind/src/libunwind_ext.h similarity index 100% rename from shared/sentry/external/crashpad/libunwind/src/libunwind_ext.h rename to shared/sentry/src/external/crashpad/libunwind/src/libunwind_ext.h diff --git a/shared/sentry/external/crashpad/libunwind/test/CMakeLists.txt b/shared/sentry/src/external/crashpad/libunwind/test/CMakeLists.txt similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/CMakeLists.txt rename to shared/sentry/src/external/crashpad/libunwind/test/CMakeLists.txt diff --git a/shared/sentry/external/crashpad/libunwind/test/alignment.compile.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/alignment.compile.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/alignment.compile.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/alignment.compile.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/floatregister.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/floatregister.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/floatregister.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/floatregister.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/forceunwind.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/forceunwind.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/forceunwind.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/forceunwind.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/frameheadercache_test.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/frameheadercache_test.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/frameheadercache_test.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/frameheadercache_test.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/libunwind/__init__.py b/shared/sentry/src/external/crashpad/libunwind/test/libunwind/__init__.py similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/libunwind/__init__.py rename to shared/sentry/src/external/crashpad/libunwind/test/libunwind/__init__.py diff --git a/shared/sentry/external/crashpad/libunwind/test/libunwind/test/__init__.py b/shared/sentry/src/external/crashpad/libunwind/test/libunwind/test/__init__.py similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/libunwind/test/__init__.py rename to shared/sentry/src/external/crashpad/libunwind/test/libunwind/test/__init__.py diff --git a/shared/sentry/external/crashpad/libunwind/test/libunwind/test/config.py b/shared/sentry/src/external/crashpad/libunwind/test/libunwind/test/config.py similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/libunwind/test/config.py rename to shared/sentry/src/external/crashpad/libunwind/test/libunwind/test/config.py diff --git a/shared/sentry/external/crashpad/libunwind/test/libunwind_01.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/libunwind_01.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/libunwind_01.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/libunwind_01.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/libunwind_02.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/libunwind_02.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/libunwind_02.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/libunwind_02.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/lit.cfg.py b/shared/sentry/src/external/crashpad/libunwind/test/lit.cfg.py similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/lit.cfg.py rename to shared/sentry/src/external/crashpad/libunwind/test/lit.cfg.py diff --git a/shared/sentry/external/crashpad/libunwind/test/lit.site.cfg.in b/shared/sentry/src/external/crashpad/libunwind/test/lit.site.cfg.in similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/lit.site.cfg.in rename to shared/sentry/src/external/crashpad/libunwind/test/lit.site.cfg.in diff --git a/shared/sentry/external/crashpad/libunwind/test/remember_state_leak.pass.sh.s b/shared/sentry/src/external/crashpad/libunwind/test/remember_state_leak.pass.sh.s similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/remember_state_leak.pass.sh.s rename to shared/sentry/src/external/crashpad/libunwind/test/remember_state_leak.pass.sh.s diff --git a/shared/sentry/external/crashpad/libunwind/test/signal_frame.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/signal_frame.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/signal_frame.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/signal_frame.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/signal_unwind.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/signal_unwind.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/signal_unwind.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/signal_unwind.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/unw_getcontext.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/unw_getcontext.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/unw_getcontext.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/unw_getcontext.pass.cpp diff --git a/shared/sentry/external/crashpad/libunwind/test/unwind_leaffunction.pass.cpp b/shared/sentry/src/external/crashpad/libunwind/test/unwind_leaffunction.pass.cpp similarity index 100% rename from shared/sentry/external/crashpad/libunwind/test/unwind_leaffunction.pass.cpp rename to shared/sentry/src/external/crashpad/libunwind/test/unwind_leaffunction.pass.cpp diff --git a/shared/sentry/external/crashpad/minidump/BUILD.gn b/shared/sentry/src/external/crashpad/minidump/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/minidump/BUILD.gn rename to shared/sentry/src/external/crashpad/minidump/BUILD.gn diff --git a/shared/sentry/external/crashpad/minidump/CMakeLists.txt b/shared/sentry/src/external/crashpad/minidump/CMakeLists.txt similarity index 100% rename from shared/sentry/external/crashpad/minidump/CMakeLists.txt rename to shared/sentry/src/external/crashpad/minidump/CMakeLists.txt diff --git a/shared/sentry/external/crashpad/minidump/minidump_annotation_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_annotation_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_annotation_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_annotation_writer.cc index 1d6a49288..751dd013b 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_annotation_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_annotation_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "util/file/file_writer.h" #include "util/numeric/safe_assignment.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_annotation_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_annotation_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_annotation_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_annotation_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_annotation_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_annotation_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_annotation_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_annotation_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_byte_array_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_byte_array_writer.cc similarity index 98% rename from shared/sentry/external/crashpad/minidump/minidump_byte_array_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_byte_array_writer.cc index 38ce1c7ef..b3c8aa9d1 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_byte_array_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_byte_array_writer.cc @@ -14,6 +14,7 @@ #include "minidump/minidump_byte_array_writer.h" +#include "base/check_op.h" #include "base/logging.h" #include "util/file/file_writer.h" #include "util/numeric/safe_assignment.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_byte_array_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_byte_array_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_byte_array_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_byte_array_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_byte_array_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_byte_array_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_byte_array_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_byte_array_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_context.h b/shared/sentry/src/external/crashpad/minidump/minidump_context.h similarity index 93% rename from shared/sentry/external/crashpad/minidump/minidump_context.h rename to shared/sentry/src/external/crashpad/minidump/minidump_context.h index 30988d8cb..12413de02 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_context.h +++ b/shared/sentry/src/external/crashpad/minidump/minidump_context.h @@ -637,6 +637,56 @@ struct MinidumpContextMIPS64 { uint64_t fir; }; +//! \brief 64-bit RISCV-specific flags for +//! MinidumpContextRISCV64::context_flags. +enum MinidumpContextRISCV64Flags : uint32_t { + //! \brief Identifies the context structure as RISCV64. + kMinidumpContextRISCV64 = 0x08000000, + + //! \brief Indicates the validity of integer registers. + //! + //! Registers 'pc' and `x1`-`x31` are valid. + kMinidumpContextRISCV64Integer = kMinidumpContextRISCV64 | 0x00000001, + + //! \brief Indicates the validity of floating point registers. + //! + //! Floating point registers `f0`-`f31` are valid. + kMinidumpContextRISCV64FloatingPoint = kMinidumpContextRISCV64 | 0x00000002, + + //! \brief Indicates the validity of all registers. + kMinidumpContextRISCV64All = kMinidumpContextRISCV64Integer | + kMinidumpContextRISCV64FloatingPoint, +}; + +//! \brief A 64-bit RISC-V CPU context (register state) carried in a minidump +//! file. +//! +//! This structure is versioned. Increment |kVersion| when changing this +//! structure. +struct MinidumpContextRISCV64 { + + //! \brief The structure’s currently-defined version number. + static constexpr uint32_t kVersion = 1; + + //! \brief Indicates the validity of fields in this structure. + uint32_t context_flags; + + //! \brief The structure’s version number. + uint32_t version; + + //! \brief The program counter register. + uint64_t pc; + + //! \brief The integer registers, x1 through x31. + uint64_t regs[31]; + + //! \brief The floating point registers. + uint64_t fpregs[32]; + + //! \brief The floating point control and status register. + uint32_t fcsr; +}; + } // namespace crashpad #endif // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ diff --git a/shared/sentry/external/crashpad/minidump/minidump_context_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_context_writer.cc similarity index 85% rename from shared/sentry/external/crashpad/minidump/minidump_context_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_context_writer.cc index 5f741ed74..12942c184 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_context_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_context_writer.cc @@ -19,6 +19,7 @@ #include #include +#include "base/check_op.h" #include "base/compiler_specific.h" #include "base/logging.h" #include "build/build_config.h" @@ -102,6 +103,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) { break; } + case kCPUArchitectureRISCV64: { + context = std::make_unique(); + reinterpret_cast(context.get()) + ->InitializeFromSnapshot(context_snapshot->riscv64); + break; + } + default: { LOG(ERROR) << "unknown context architecture " << context_snapshot->architecture; @@ -359,7 +367,36 @@ size_t MinidumpContextAMD64Writer::ContextSize() const { bool MinidumpXSaveAMD64CetU::InitializeFromSnapshot( const CPUContextX86_64* context_snapshot) { +#ifdef SENTRY_DISABLED DCHECK_EQ(context_snapshot->xstate.cet_u.cetmsr, 1ull); +#else + // TODO(supervacuus): this DCHECK led to multiple user inquiries because it + // ends up killing the crashpad_handler (when using a DEBUG build) which in + // turn keeps the crashpad client waiting indefinitely. + // + // It seems that crashpad devs put a DCHECK here because they already check + // at the call-site that the CET_U flag is enabled in the XSAVE feature set. + // However, that this flag is set, only means that the CET_U registers in + // XSAVE are valid, not necessarily that the SH_STK_EN bit is set. + // + // I couldn't find anything in the Intel (SDM 13.1) or AMD (PR 11.5.2, + // 18.11/12/13) CET/SS spec that would signal that SH_STK_EN(=cetmsr[0]) + // cannot be 0 at this point. Ideally, if SH_STK_EN is not set, then SSP + // should be set to 0 too (which means both are in their initial state). But + // even that should not lead to fatally exit the crashpad_handler (even in + // DEBUG), but rather produce a log and result in something that can be + // analysed in the backend. + // + // Any validation based on these register contents must check SH_STK_EN + // anyway or check SSP for !NULL and as a valid base like it is done here: + // https://chromium.googlesource.com/crashpad/crashpad/+/6278690abe6ef0dda047e67dc1d0c49ce7af3811/snapshot/win/thread_snapshot_win.cc#130 + if (!(context_snapshot->xstate.cet_u.cetmsr & 1ull)) { + LOG(WARNING) << "CET MSR enabled flag is not set (" + << context_snapshot->xstate.cet_u.cetmsr + << "); SSP = " + << context_snapshot->xstate.cet_u.ssp; + } +#endif cet_u_.cetmsr = context_snapshot->xstate.cet_u.cetmsr; cet_u_.ssp = context_snapshot->xstate.cet_u.ssp; return true; @@ -556,4 +593,42 @@ size_t MinidumpContextMIPS64Writer::ContextSize() const { return sizeof(context_); } +MinidumpContextRISCV64Writer::MinidumpContextRISCV64Writer() + : MinidumpContextWriter(), context_() { + context_.context_flags = kMinidumpContextRISCV64; + context_.version = MinidumpContextRISCV64::kVersion; +} + +MinidumpContextRISCV64Writer::~MinidumpContextRISCV64Writer() = default; + +void MinidumpContextRISCV64Writer::InitializeFromSnapshot( + const CPUContextRISCV64* context_snapshot) { + DCHECK_EQ(state(), kStateMutable); + DCHECK_EQ(context_.context_flags, kMinidumpContextRISCV64); + + context_.context_flags = kMinidumpContextRISCV64All; + context_.version = MinidumpContextRISCV64::kVersion; + context_.pc = context_snapshot->pc; + + static_assert(sizeof(context_.regs) == sizeof(context_snapshot->regs), + "GPRs size mismatch"); + memcpy(context_.regs, context_snapshot->regs, sizeof(context_.regs)); + + static_assert(sizeof(context_.fpregs) == sizeof(context_snapshot->fpregs), + "FPRs size mismatch"); + memcpy(context_.fpregs, context_snapshot->fpregs, sizeof(context_.fpregs)); + context_.fcsr = context_snapshot->fcsr; +} + +bool MinidumpContextRISCV64Writer::WriteObject( + FileWriterInterface* file_writer) { + DCHECK_EQ(state(), kStateWritable); + return file_writer->Write(&context_, sizeof(context_)); +} + +size_t MinidumpContextRISCV64Writer::ContextSize() const { + DCHECK_GE(state(), kStateFrozen); + return sizeof(context_); +} + } // namespace crashpad diff --git a/shared/sentry/external/crashpad/minidump/minidump_context_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_context_writer.h similarity index 89% rename from shared/sentry/external/crashpad/minidump/minidump_context_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_context_writer.h index 6660be437..8e39c6692 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_context_writer.h +++ b/shared/sentry/src/external/crashpad/minidump/minidump_context_writer.h @@ -369,6 +369,50 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter { MinidumpContextMIPS64 context_; }; +//! \brief The writer for a MinidumpContextRISCV64 structure in a minidump file. +class MinidumpContextRISCV64Writer final : public MinidumpContextWriter { + public: + MinidumpContextRISCV64Writer(); + + MinidumpContextRISCV64Writer(const MinidumpContextRISCV64Writer&) = delete; + MinidumpContextRISCV64Writer& operator=(const MinidumpContextRISCV64Writer&) = + delete; + + ~MinidumpContextRISCV64Writer() override; + + //! \brief Initializes the MinidumpContextRISCV64 based on \a + //! context_snapshot. + //! + //! \param[in] context_snapshot The context snapshot to use as source data. + //! + //! \note Valid in #kStateMutable. No mutation of context() may be done before + //! calling this method, and it is not normally necessary to alter + //! context() after calling this method. + void InitializeFromSnapshot(const CPUContextRISCV64* context_snapshot); + + //! \brief Returns a pointer to the context structure that this object will + //! write. + //! + //! \attention This returns a non-`const` pointer to this object’s private + //! data so that a caller can populate the context structure directly. + //! This is done because providing setter interfaces to each field in the + //! context structure would be unwieldy and cumbersome. Care must be taken + //! to populate the context structure correctly. The context structure + //! must only be modified while this object is in the #kStateMutable + //! state. + MinidumpContextRISCV64* context() { return &context_; } + + protected: + // MinidumpWritable: + bool WriteObject(FileWriterInterface* file_writer) override; + + // MinidumpContextWriter: + size_t ContextSize() const override; + + private: + MinidumpContextRISCV64 context_; +}; + } // namespace crashpad #endif // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_ diff --git a/shared/sentry/external/crashpad/minidump/minidump_context_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_context_writer_test.cc similarity index 81% rename from shared/sentry/external/crashpad/minidump/minidump_context_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_context_writer_test.cc index e2a04d1dc..9eebe81b2 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_context_writer_test.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_context_writer_test.cc @@ -143,6 +143,49 @@ TYPED_TEST(MinidumpContextWriter, MinidumpContextAMD64Writer) { } } +TYPED_TEST(MinidumpContextWriter, MinidumpContextRISCV64Writer) { + { + // Make sure that a heap-allocated context writer has the proper alignment, + // because it may be nonstandard. + auto context_writer = std::make_unique(); + EXPECT_EQ(reinterpret_cast(context_writer.get()) & + (alignof(MinidumpContextRISCV64Writer) - 1), + 0u); + } + + StringFile string_file; + + { + // Make sure that a context writer that’s untouched writes a zeroed-out + // context. + SCOPED_TRACE("zero"); + + EmptyContextTest(ExpectMinidumpContextRISCV64); + } + + { + SCOPED_TRACE("nonzero"); + + string_file.Reset(); + constexpr uint32_t kSeed = 0x808664; + + MinidumpContextRISCV64Writer context_writer; + InitializeMinidumpContextRISCV64(context_writer.context(), kSeed); + + EXPECT_TRUE(context_writer.WriteEverything(&string_file)); + ASSERT_EQ(string_file.string().size(), sizeof(MinidumpContextRISCV64)); + + const MinidumpContextRISCV64* observed = + MinidumpWritableAtRVA(string_file.string(), + TypeParam(0)); + ASSERT_TRUE(observed); + + ExpectMinidumpContextRISCV64(kSeed, observed, false); + } +} + template void FromSnapshotTest(const CPUContext& snapshot_context, void (*expect_context)(uint32_t, const Context*, bool), @@ -268,6 +311,23 @@ TYPED_TEST(MinidumpContextWriter, MIPS64_FromSnapshot) { TypeParam>(context, ExpectMinidumpContextMIPS64, kSeed); } +TYPED_TEST(MinidumpContextWriter, RISCV64_Zeros) { + EmptyContextTest(ExpectMinidumpContextRISCV64); +} + +TYPED_TEST(MinidumpContextWriter, RISCV64_FromSnapshot) { + constexpr uint32_t kSeed = 64; + CPUContextRISCV64 context_riscv64; + CPUContext context; + context.riscv64 = &context_riscv64; + InitializeCPUContextRISCV64(&context, kSeed); + FromSnapshotTest(context, ExpectMinidumpContextRISCV64, kSeed); +} + } // namespace } // namespace test } // namespace crashpad diff --git a/shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer.cc similarity index 93% rename from shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer.cc index 63e64453a..76206a812 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer.cc @@ -20,6 +20,7 @@ #include "minidump/minidump_module_crashpad_info_writer.h" #include "minidump/minidump_simple_string_dictionary_writer.h" #include "snapshot/process_snapshot.h" +#include "snapshot/system_snapshot.h" #include "util/file/file_writer.h" namespace crashpad { @@ -30,6 +31,7 @@ MinidumpCrashpadInfoWriter::MinidumpCrashpadInfoWriter() simple_annotations_(nullptr), module_list_(nullptr) { crashpad_info_.version = MinidumpCrashpadInfo::kVersion; + crashpad_info_.reserved = 0; } MinidumpCrashpadInfoWriter::~MinidumpCrashpadInfoWriter() { @@ -56,6 +58,10 @@ void MinidumpCrashpadInfoWriter::InitializeFromSnapshot( SetSimpleAnnotations(std::move(simple_annotations)); } + if (process_snapshot->System()) { + SetAddressMask(process_snapshot->System()->AddressMask()); + } + auto modules = std::make_unique(); modules->InitializeFromSnapshot(process_snapshot->Modules()); @@ -90,6 +96,10 @@ void MinidumpCrashpadInfoWriter::SetModuleList( module_list_ = std::move(module_list); } +void MinidumpCrashpadInfoWriter::SetAddressMask(uint64_t mask) { + crashpad_info_.address_mask = mask; +} + bool MinidumpCrashpadInfoWriter::Freeze() { DCHECK_EQ(state(), kStateMutable); diff --git a/shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer.h similarity index 97% rename from shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer.h index ac69e4544..02907cc84 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer.h +++ b/shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer.h @@ -86,6 +86,9 @@ class MinidumpCrashpadInfoWriter final : public internal::MinidumpStreamWriter { void SetModuleList( std::unique_ptr module_list); + //! \brief Sets MinidumpCrashpadInfo::address_mask. + void SetAddressMask(uint64_t mask); + //! \brief Determines whether the object is useful. //! //! A useful object is one that carries data that makes a meaningful diff --git a/shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer_test.cc similarity index 82% rename from shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer_test.cc index d784deaf5..d01655d84 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_crashpad_info_writer_test.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_crashpad_info_writer_test.cc @@ -122,6 +122,77 @@ TEST(MinidumpCrashpadInfoWriter, ReportAndClientID) { EXPECT_FALSE(module_list); } +TEST(MinidumpCrashpadInfoWriter, AddressMask) { + MinidumpFileWriter minidump_file_writer; + auto crashpad_info_writer = std::make_unique(); + + constexpr uint64_t mask = 0xFFFFFF8000000000; + crashpad_info_writer->SetAddressMask(mask); + + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(crashpad_info_writer))); + + StringFile string_file; + ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); + + const MinidumpCrashpadInfo* crashpad_info = nullptr; + const MinidumpSimpleStringDictionary* simple_annotations = nullptr; + const MinidumpModuleCrashpadInfoList* module_list = nullptr; + + ASSERT_NO_FATAL_FAILURE(GetCrashpadInfoStream( + string_file.string(), &crashpad_info, &simple_annotations, &module_list)); + + UUID empty_report_id; + ASSERT_TRUE(empty_report_id.InitializeFromString( + "00000000-0000-0000-0000-000000000000")); + UUID empty_client_id; + ASSERT_TRUE(empty_client_id.InitializeFromString( + "00000000-0000-0000-0000-000000000000")); + + // Copy address_mask into a local variable because + // |MinidumpCrashpadInfo::address_mask| requires 8-byte alignment but the + // struct itself is 4-byte aligned. + const auto address_mask = [&crashpad_info] { + uint64_t data = 0; + memcpy(&data, &crashpad_info->address_mask, sizeof(data)); + return data; + }(); + + EXPECT_EQ(crashpad_info->version, MinidumpCrashpadInfo::kVersion); + EXPECT_EQ(address_mask, mask); + EXPECT_EQ(crashpad_info->report_id, empty_report_id); + EXPECT_EQ(crashpad_info->client_id, empty_client_id); + EXPECT_FALSE(simple_annotations); + EXPECT_FALSE(module_list); +} + +TEST(MinidumpCrashpadInfoWriter, EmptyAddressMask) { + MinidumpFileWriter minidump_file_writer; + auto crashpad_info_writer = std::make_unique(); + + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(crashpad_info_writer))); + + StringFile string_file; + ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); + + const MinidumpCrashpadInfo* crashpad_info = nullptr; + const MinidumpSimpleStringDictionary* simple_annotations = nullptr; + const MinidumpModuleCrashpadInfoList* module_list = nullptr; + + ASSERT_NO_FATAL_FAILURE(GetCrashpadInfoStream( + string_file.string(), &crashpad_info, &simple_annotations, &module_list)); + + // Copy address_mask into a local variable because + // |MinidumpCrashpadInfo::address_mask| requires 8-byte alignment but the + // struct itself is 4-byte aligned. + const auto address_mask = [&crashpad_info] { + uint64_t data = 0; + memcpy(&data, &crashpad_info->address_mask, sizeof(data)); + return data; + }(); + + EXPECT_EQ(address_mask, 0UL); +} + TEST(MinidumpCrashpadInfoWriter, SimpleAnnotations) { MinidumpFileWriter minidump_file_writer; auto crashpad_info_writer = std::make_unique(); diff --git a/shared/sentry/external/crashpad/minidump/minidump_exception_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_exception_writer.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_exception_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_exception_writer.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_exception_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_exception_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_exception_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_exception_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_exception_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_exception_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_exception_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_exception_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_extensions.cc b/shared/sentry/src/external/crashpad/minidump/minidump_extensions.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_extensions.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_extensions.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_extensions.h b/shared/sentry/src/external/crashpad/minidump/minidump_extensions.h similarity index 93% rename from shared/sentry/external/crashpad/minidump/minidump_extensions.h rename to shared/sentry/src/external/crashpad/minidump/minidump_extensions.h index 588eb89d8..2ca262f32 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_extensions.h +++ b/shared/sentry/src/external/crashpad/minidump/minidump_extensions.h @@ -218,6 +218,9 @@ enum MinidumpCPUArchitecture : uint16_t { //! \deprecated Use #kMinidumpCPUArchitectureARM64 instead. kMinidumpCPUArchitectureARM64Breakpad = 0x8003, + //! \brief Used by Breakpad for 64-bit RISC-V. + kMinidumpCPUArchitectureRISCV64Breakpad = 0x8006, + //! \brief Unknown CPU architecture. kMinidumpCPUArchitectureUnknown = PROCESSOR_ARCHITECTURE_UNKNOWN, }; @@ -452,8 +455,9 @@ struct ALIGNAS(4) PACKED MinidumpCrashpadInfo { report_id(), client_id(), simple_annotations(), - module_list() { - } + module_list(), + reserved(), + address_mask() {} //! \brief The structure’s currently-defined version number. //! @@ -507,6 +511,28 @@ struct ALIGNAS(4) PACKED MinidumpCrashpadInfo { //! //! This field is present when #version is at least `1`. MINIDUMP_LOCATION_DESCRIPTOR module_list; + + //! \brief This field is always `0`. + uint32_t reserved; + + //! \brief A mask indicating the range of valid addresses for a pointer. + //! + //! ARM64 supports MTE, TBI and PAC masking, generally in the upper bits of + //! a pointer. This mask can be used by LLDB to mimic ptrauth_strip and strip + //! the pointer authentication codes. To recover `pointer` in userland on + //! Darwin, `pointer & (~mask)`. In the case of code running in high memory, + //! where bit 55 is set (indicating that all of the high bits should be set + //! to 1), `pointer | mask`. See ABIMacOSX_arm64::FixAddress for more details + //! here: + //! https://github.com/llvm/llvm-project/blob/001d18664f8bcf63af64f10688809f7681dfbf0b/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp#L817-L830 + //! + //! If the platform does not support pointer authentication, or the range of + //! valid addressees for a pointer was inaccessible, this field will be 0 and + //! should be ignored. + //! + //! This field is present when #version is at least `1`, if the size of the + //! structure is large enough to accommodate it. + uint64_t address_mask; }; #if defined(COMPILER_MSVC) diff --git a/shared/sentry/external/crashpad/minidump/minidump_file_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_file_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_file_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_file_writer.cc index a9f360a18..29a9e5f0e 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_file_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_file_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "minidump/minidump_crashpad_info_writer.h" #include "minidump/minidump_exception_writer.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_file_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_file_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_file_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_file_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_file_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_file_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_file_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_file_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_handle_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_handle_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_handle_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_handle_writer.cc index bed4f1008..72f1b1965 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_handle_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_handle_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "minidump/minidump_extensions.h" #include "util/file/file_writer.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_handle_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_handle_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_handle_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_handle_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_handle_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_handle_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_handle_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_handle_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_memory_info_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_memory_info_writer.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_memory_info_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_memory_info_writer.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_memory_info_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_memory_info_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_memory_info_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_memory_info_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_memory_info_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_memory_info_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_memory_info_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_memory_info_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_memory_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_memory_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_memory_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_memory_writer.cc index f52e6a4cb..dd6c91aef 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_memory_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_memory_writer.cc @@ -19,6 +19,7 @@ #include #include "base/auto_reset.h" +#include "base/check_op.h" #include "base/logging.h" #include "util/file/file_writer.h" #include "util/numeric/safe_assignment.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_memory_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_memory_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_memory_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_memory_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_memory_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_memory_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_memory_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_memory_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_misc_info_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_misc_info_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer.cc index 133ae3086..1abb46c31 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_misc_info_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer.cc @@ -175,6 +175,8 @@ std::string MinidumpMiscInfoDebugBuildString() { static constexpr char kCPU[] = "mips"; #elif defined(ARCH_CPU_MIPS64EL) static constexpr char kCPU[] = "mips64"; +#elif defined(ARCH_CPU_RISCV64) + static constexpr char kCPU[] = "riscv64"; #else #error define kCPU for this CPU #endif diff --git a/shared/sentry/external/crashpad/minidump/minidump_misc_info_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer.h similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_misc_info_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer.h index d355433d3..6e3bb45a1 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_misc_info_writer.h +++ b/shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer.h @@ -145,7 +145,7 @@ class MinidumpMiscInfoWriter final : public internal::MinidumpStreamWriter { //! \brief Conversion functions from a native UTF16 C-string to a char16_t //! C-string. No-op where the native UTF16 string is std::u16string. -#if defined(WCHAR_T_IS_UTF16) || DOXYGEN +#if defined(WCHAR_T_IS_16_BIT) || DOXYGEN inline const char16_t* AsU16CStr(const wchar_t* str) { return reinterpret_cast(str); } diff --git a/shared/sentry/external/crashpad/minidump/minidump_misc_info_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer_test.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_misc_info_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer_test.cc index 970c33382..ff132b901 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_misc_info_writer_test.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_misc_info_writer_test.cc @@ -178,8 +178,11 @@ void ExpectMiscInfoEqual( expected_misc_info.XStateData.SizeOfInfo); EXPECT_EQ(observed_misc_info.XStateData.ContextSize, expected_misc_info.XStateData.ContextSize); - EXPECT_EQ(observed_misc_info.XStateData.EnabledFeatures, - expected_misc_info.XStateData.EnabledFeatures); + // `EnabledFeatures` is underaligned and `EXPECT_EQ` internally takes + // arguments by reference. Copy it into a temporary before comparing to avoid + // undefined behavior. + EXPECT_EQ(uint64_t{observed_misc_info.XStateData.EnabledFeatures}, + uint64_t{expected_misc_info.XStateData.EnabledFeatures}); for (size_t feature_index = 0; feature_index < std::size(observed_misc_info.XStateData.Features); ++feature_index) { diff --git a/shared/sentry/external/crashpad/minidump/minidump_module_crashpad_info_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_module_crashpad_info_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_module_crashpad_info_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_module_crashpad_info_writer.cc index 456f4bd4a..7f3dcda90 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_module_crashpad_info_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_module_crashpad_info_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "minidump/minidump_annotation_writer.h" #include "minidump/minidump_simple_string_dictionary_writer.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_module_crashpad_info_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_module_crashpad_info_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_module_crashpad_info_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_module_crashpad_info_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_module_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_module_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_module_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_module_writer.cc index 237fee0db..1287a6de6 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_module_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_module_writer.cc @@ -19,6 +19,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "minidump/minidump_string_writer.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_module_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_module_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_module_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_module_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_module_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_module_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_module_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_module_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_rva_list_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_rva_list_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_rva_list_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_rva_list_writer.cc index 77e10d47b..3a1ee8e8d 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_rva_list_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_rva_list_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "util/file/file_writer.h" #include "util/numeric/safe_assignment.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_rva_list_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_rva_list_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_rva_list_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_rva_list_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_rva_list_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_rva_list_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_rva_list_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_rva_list_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_simple_string_dictionary_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_simple_string_dictionary_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_simple_string_dictionary_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_simple_string_dictionary_writer.cc index f4c9011c0..cb25098b8 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_simple_string_dictionary_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_simple_string_dictionary_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "util/file/file_writer.h" #include "util/numeric/safe_assignment.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_simple_string_dictionary_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_simple_string_dictionary_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_simple_string_dictionary_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_simple_string_dictionary_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_simple_string_dictionary_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_simple_string_dictionary_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_simple_string_dictionary_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_simple_string_dictionary_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_stacktrace_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_stacktrace_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_stacktrace_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_stacktrace_writer.cc index 74724ca77..10388c320 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_stacktrace_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_stacktrace_writer.cc @@ -6,6 +6,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "snapshot/exception_snapshot.h" #include "snapshot/thread_snapshot.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_stacktrace_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_stacktrace_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_stacktrace_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_stacktrace_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_stream_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_stream_writer.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_stream_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_stream_writer.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_stream_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_stream_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_stream_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_stream_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_string_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_string_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_string_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_string_writer.cc index ea7856abd..0b0a3e86e 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_string_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_string_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "minidump/minidump_writer_util.h" #include "util/file/file_writer.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_string_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_string_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_string_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_string_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_string_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_string_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_string_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_string_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_system_info_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_system_info_writer.cc similarity index 98% rename from shared/sentry/external/crashpad/minidump/minidump_system_info_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_system_info_writer.cc index 4468c41af..e2ab775ae 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_system_info_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_system_info_writer.cc @@ -132,6 +132,9 @@ void MinidumpSystemInfoWriter::InitializeFromSnapshot( case kCPUArchitectureARM64: cpu_architecture = kMinidumpCPUArchitectureARM64; break; + case kCPUArchitectureRISCV64: + cpu_architecture = kMinidumpCPUArchitectureRISCV64Breakpad; + break; default: NOTREACHED(); cpu_architecture = kMinidumpCPUArchitectureUnknown; diff --git a/shared/sentry/external/crashpad/minidump/minidump_system_info_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_system_info_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_system_info_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_system_info_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_system_info_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_system_info_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_system_info_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_system_info_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_id_map.cc b/shared/sentry/src/external/crashpad/minidump/minidump_thread_id_map.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_thread_id_map.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_id_map.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_id_map.h b/shared/sentry/src/external/crashpad/minidump/minidump_thread_id_map.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_thread_id_map.h rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_id_map.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_id_map_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_thread_id_map_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_thread_id_map_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_id_map_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_name_list_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_thread_name_list_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_thread_name_list_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_name_list_writer.cc index 5679b8112..aba496a5b 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_thread_name_list_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_thread_name_list_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "minidump/minidump_thread_id_map.h" #include "snapshot/thread_snapshot.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_name_list_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_thread_name_list_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_thread_name_list_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_name_list_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_name_list_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_thread_name_list_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_thread_name_list_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_name_list_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_thread_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_thread_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_writer.cc index 02870f6e1..b7aa889a6 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_thread_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_thread_writer.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "minidump/minidump_context_writer.h" #include "minidump/minidump_memory_writer.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_thread_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_thread_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_thread_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_thread_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_thread_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_thread_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_unloaded_module_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_unloaded_module_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_unloaded_module_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_unloaded_module_writer.cc index 3f1c8e5db..c7bf3452b 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_unloaded_module_writer.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_unloaded_module_writer.cc @@ -17,6 +17,7 @@ #include #include +#include "base/check_op.h" #include "minidump/minidump_writer_util.h" #include "util/file/file_writer.h" #include "util/numeric/in_range_cast.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_unloaded_module_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_unloaded_module_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_unloaded_module_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_unloaded_module_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_unloaded_module_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_unloaded_module_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_unloaded_module_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_unloaded_module_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_user_extension_stream_data_source.cc b/shared/sentry/src/external/crashpad/minidump/minidump_user_extension_stream_data_source.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_user_extension_stream_data_source.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_user_extension_stream_data_source.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_user_extension_stream_data_source.h b/shared/sentry/src/external/crashpad/minidump/minidump_user_extension_stream_data_source.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_user_extension_stream_data_source.h rename to shared/sentry/src/external/crashpad/minidump/minidump_user_extension_stream_data_source.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_user_stream_writer.cc b/shared/sentry/src/external/crashpad/minidump/minidump_user_stream_writer.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_user_stream_writer.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_user_stream_writer.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_user_stream_writer.h b/shared/sentry/src/external/crashpad/minidump/minidump_user_stream_writer.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_user_stream_writer.h rename to shared/sentry/src/external/crashpad/minidump/minidump_user_stream_writer.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_user_stream_writer_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_user_stream_writer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_user_stream_writer_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_user_stream_writer_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_writable.cc b/shared/sentry/src/external/crashpad/minidump/minidump_writable.cc similarity index 99% rename from shared/sentry/external/crashpad/minidump/minidump_writable.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_writable.cc index cb23b3ff1..c0badd72e 100644 --- a/shared/sentry/external/crashpad/minidump/minidump_writable.cc +++ b/shared/sentry/src/external/crashpad/minidump/minidump_writable.cc @@ -18,6 +18,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "util/file/file_writer.h" #include "util/numeric/safe_assignment.h" diff --git a/shared/sentry/external/crashpad/minidump/minidump_writable.h b/shared/sentry/src/external/crashpad/minidump/minidump_writable.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_writable.h rename to shared/sentry/src/external/crashpad/minidump/minidump_writable.h diff --git a/shared/sentry/external/crashpad/minidump/minidump_writable_test.cc b/shared/sentry/src/external/crashpad/minidump/minidump_writable_test.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_writable_test.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_writable_test.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_writer_util.cc b/shared/sentry/src/external/crashpad/minidump/minidump_writer_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_writer_util.cc rename to shared/sentry/src/external/crashpad/minidump/minidump_writer_util.cc diff --git a/shared/sentry/external/crashpad/minidump/minidump_writer_util.h b/shared/sentry/src/external/crashpad/minidump/minidump_writer_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/minidump_writer_util.h rename to shared/sentry/src/external/crashpad/minidump/minidump_writer_util.h diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.cc diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_byte_array_writer_test_util.h diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_context_test_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_context_test_util.cc similarity index 93% rename from shared/sentry/external/crashpad/minidump/test/minidump_context_test_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_context_test_util.cc index 5746e4c30..b40558cf2 100644 --- a/shared/sentry/external/crashpad/minidump/test/minidump_context_test_util.cc +++ b/shared/sentry/src/external/crashpad/minidump/test/minidump_context_test_util.cc @@ -272,6 +272,31 @@ void InitializeMinidumpContextMIPS64(MinidumpContextMIPS64* context, context->dsp_control = value++; } +void InitializeMinidumpContextRISCV64(MinidumpContextRISCV64* context, + uint32_t seed) { + if (seed == 0) { + memset(context, 0, sizeof(*context)); + context->context_flags = kMinidumpContextRISCV64; + context->version = MinidumpContextRISCV64::kVersion; + return; + } + + context->context_flags = kMinidumpContextRISCV64All; + context->version = MinidumpContextRISCV64::kVersion; + + uint32_t value = seed; + + context->pc = value++; + for (size_t index = 0; index < std::size(context->regs); ++index) { + context->regs[index] = value++; + } + + for (size_t index = 0; index < std::size(context->fpregs); ++index) { + context->fpregs[index] = value++; + } + context->fcsr = value++; +} + namespace { // Using Google Test assertions, compares |expected| to |observed|. This is @@ -601,5 +626,24 @@ void ExpectMinidumpContextMIPS64(uint32_t expect_seed, EXPECT_EQ(observed->dsp_control, expected.dsp_control); } +void ExpectMinidumpContextRISCV64(uint32_t expect_seed, + const MinidumpContextRISCV64* observed, + bool snapshot) { + MinidumpContextRISCV64 expected; + InitializeMinidumpContextRISCV64(&expected, expect_seed); + + EXPECT_EQ(observed->context_flags, expected.context_flags); + EXPECT_EQ(observed->version, expected.version); + + for (size_t index = 0; index < std::size(expected.regs); ++index) { + EXPECT_EQ(observed->regs[index], expected.regs[index]); + } + + for (size_t index = 0; index < std::size(expected.fpregs); ++index) { + EXPECT_EQ(observed->fpregs[index], expected.fpregs[index]); + } + EXPECT_EQ(observed->fcsr, expected.fcsr); +} + } // namespace test } // namespace crashpad diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_context_test_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_context_test_util.h similarity index 93% rename from shared/sentry/external/crashpad/minidump/test/minidump_context_test_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_context_test_util.h index 793e2c39c..4ce5c1e1c 100644 --- a/shared/sentry/external/crashpad/minidump/test/minidump_context_test_util.h +++ b/shared/sentry/src/external/crashpad/minidump/test/minidump_context_test_util.h @@ -47,6 +47,8 @@ void InitializeMinidumpContextARM64(MinidumpContextARM64* context, void InitializeMinidumpContextMIPS(MinidumpContextMIPS* context, uint32_t seed); void InitializeMinidumpContextMIPS64(MinidumpContextMIPS* context, uint32_t seed); +void InitializeMinidumpContextRISCV64(MinidumpContextRISCV64* context, + uint32_t seed); //! \} //! \brief Verifies, via Google Test assertions, that a context structure @@ -85,6 +87,9 @@ void ExpectMinidumpContextMIPS(uint32_t expect_seed, void ExpectMinidumpContextMIPS64(uint32_t expect_seed, const MinidumpContextMIPS64* observed, bool snapshot); +void ExpectMinidumpContextRISCV64(uint32_t expect_seed, + const MinidumpContextRISCV64* observed, + bool snapshot); //! \} } // namespace test diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_file_writer_test_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_file_writer_test_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_file_writer_test_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_file_writer_test_util.cc diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_file_writer_test_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_file_writer_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_file_writer_test_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_file_writer_test_util.h diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_memory_writer_test_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_memory_writer_test_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_memory_writer_test_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_memory_writer_test_util.cc diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_memory_writer_test_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_memory_writer_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_memory_writer_test_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_memory_writer_test_util.h diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_rva_list_test_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_rva_list_test_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_rva_list_test_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_rva_list_test_util.cc diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_rva_list_test_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_rva_list_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_rva_list_test_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_rva_list_test_util.h diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_string_writer_test_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_string_writer_test_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_string_writer_test_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_string_writer_test_util.cc diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_string_writer_test_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_string_writer_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_string_writer_test_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_string_writer_test_util.h diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_user_extension_stream_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_user_extension_stream_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_user_extension_stream_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_user_extension_stream_util.cc diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_user_extension_stream_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_user_extension_stream_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_user_extension_stream_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_user_extension_stream_util.h diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_writable_test_util.cc b/shared/sentry/src/external/crashpad/minidump/test/minidump_writable_test_util.cc similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_writable_test_util.cc rename to shared/sentry/src/external/crashpad/minidump/test/minidump_writable_test_util.cc diff --git a/shared/sentry/external/crashpad/minidump/test/minidump_writable_test_util.h b/shared/sentry/src/external/crashpad/minidump/test/minidump_writable_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/minidump/test/minidump_writable_test_util.h rename to shared/sentry/src/external/crashpad/minidump/test/minidump_writable_test_util.h diff --git a/shared/sentry/external/crashpad/navbar.md b/shared/sentry/src/external/crashpad/navbar.md similarity index 100% rename from shared/sentry/external/crashpad/navbar.md rename to shared/sentry/src/external/crashpad/navbar.md diff --git a/shared/sentry/external/crashpad/package.h b/shared/sentry/src/external/crashpad/package.h similarity index 100% rename from shared/sentry/external/crashpad/package.h rename to shared/sentry/src/external/crashpad/package.h diff --git a/shared/sentry/external/crashpad/snapshot/BUILD.gn b/shared/sentry/src/external/crashpad/snapshot/BUILD.gn similarity index 96% rename from shared/sentry/external/crashpad/snapshot/BUILD.gn rename to shared/sentry/src/external/crashpad/snapshot/BUILD.gn index 09a3f78a4..a364f9561 100644 --- a/shared/sentry/external/crashpad/snapshot/BUILD.gn +++ b/shared/sentry/src/external/crashpad/snapshot/BUILD.gn @@ -493,6 +493,7 @@ bundle_data("snapshot_test_ios_data") { "ios/testdata/crash-1fa088dda0adb41459d063078a0f384a0bb8eefa", "ios/testdata/crash-5726011582644224", "ios/testdata/crash-6605504629637120", + "ios/testdata/crash-c44acfcbccd8c7a8", ] outputs = [ "{{bundle_resources_dir}}/crashpad_test_data/" + @@ -505,6 +506,10 @@ crashpad_loadable_module("crashpad_snapshot_test_module") { "$mini_chromium_source_parent:base", "../client", ] + if (crashpad_is_in_fuchsia) { + # TODO(fxbug.dev/108368): Remove this once the underlying issue is addressed. + exclude_toolchain_tags = [ "hwasan" ] + } } crashpad_loadable_module("crashpad_snapshot_test_module_large") { @@ -519,6 +524,11 @@ crashpad_loadable_module("crashpad_snapshot_test_module_large") { defines = [ "CRASHPAD_INFO_SIZE_TEST_MODULE_LARGE" ] deps += [ "$mini_chromium_source_parent:base" ] + + if (crashpad_is_in_fuchsia) { + # TODO(fxbug.dev/108368): Remove this once the underlying issue is addressed. + exclude_toolchain_tags = [ "hwasan" ] + } } crashpad_loadable_module("crashpad_snapshot_test_module_small") { @@ -533,6 +543,11 @@ crashpad_loadable_module("crashpad_snapshot_test_module_small") { defines = [ "CRASHPAD_INFO_SIZE_TEST_MODULE_SMALL" ] deps += [ "$mini_chromium_source_parent:base" ] + + if (crashpad_is_in_fuchsia) { + # TODO(fxbug.dev/108368): Remove this once the underlying issue is addressed. + exclude_toolchain_tags = [ "hwasan" ] + } } if ((crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) && @@ -543,10 +558,15 @@ if ((crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) && # This makes `ld` emit both .hash and .gnu.hash sections. ldflags = [ "-Wl,--hash-style=both" ] + + if (crashpad_is_in_fuchsia) { + # TODO(fxbug.dev/108368): Remove this once the underlying issue is addressed. + exclude_toolchain_tags = [ "hwasan" ] + } } } -if (crashpad_is_mac || crashpad_is_ios) { +if (crashpad_is_apple) { crashpad_loadable_module("crashpad_snapshot_test_module_crashy_initializer") { testonly = true sources = [ diff --git a/shared/sentry/external/crashpad/snapshot/CMakeLists.txt b/shared/sentry/src/external/crashpad/snapshot/CMakeLists.txt similarity index 94% rename from shared/sentry/external/crashpad/snapshot/CMakeLists.txt rename to shared/sentry/src/external/crashpad/snapshot/CMakeLists.txt index f83f4b417..ccaaef67c 100644 --- a/shared/sentry/external/crashpad/snapshot/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/snapshot/CMakeLists.txt @@ -223,6 +223,17 @@ if(WIN32) "-Wno-unknown-attributes" ) endif() + + if (MINGW OR ("${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" STREQUAL "") OR (CMAKE_SYSTEM_VERSION LESS 10)) + # Define NTDDI_VERSION >= NTDDI_WIN10_RS5 - so InitializeContext2 definition is always available in process_reader_win.cc + # NTDDI_WIN10_RS5 = 0x0A000006 /* ABRACADABRA_WIN10_RS5 */ + set_property( + SOURCE "win/process_reader_win.cc" + APPEND + PROPERTY COMPILE_DEFINITIONS + WINVER=0x0A00 _WIN32_WINNT=0x0A00 NTDDI_VERSION=0x0A000006 + ) + endif() endif() if(APPLE AND NOT IOS AND CRASHPAD_ENABLE_STACKTRACE) diff --git a/shared/sentry/external/crashpad/snapshot/annotation_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/annotation_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/annotation_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/annotation_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/annotation_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/annotation_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/annotation_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/annotation_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/capture_memory.cc b/shared/sentry/src/external/crashpad/snapshot/capture_memory.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/capture_memory.cc rename to shared/sentry/src/external/crashpad/snapshot/capture_memory.cc index 0a465d22f..c1c6fba58 100644 --- a/shared/sentry/external/crashpad/snapshot/capture_memory.cc +++ b/shared/sentry/src/external/crashpad/snapshot/capture_memory.cc @@ -117,6 +117,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context, for (size_t i = 0; i < std::size(context.mipsel->regs); ++i) { MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]); } +#elif defined(ARCH_CPU_RISCV64) + MaybeCaptureMemoryAround(delegate, context.riscv64->pc); + for (size_t i = 0; i < std::size(context.riscv64->regs); ++i) { + MaybeCaptureMemoryAround(delegate, context.riscv64->regs[i]); + } #else #error Port. #endif diff --git a/shared/sentry/external/crashpad/snapshot/capture_memory.h b/shared/sentry/src/external/crashpad/snapshot/capture_memory.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/capture_memory.h rename to shared/sentry/src/external/crashpad/snapshot/capture_memory.h diff --git a/shared/sentry/external/crashpad/snapshot/cpu_architecture.h b/shared/sentry/src/external/crashpad/snapshot/cpu_architecture.h similarity index 94% rename from shared/sentry/external/crashpad/snapshot/cpu_architecture.h rename to shared/sentry/src/external/crashpad/snapshot/cpu_architecture.h index 4003a9290..26d45f841 100644 --- a/shared/sentry/external/crashpad/snapshot/cpu_architecture.h +++ b/shared/sentry/src/external/crashpad/snapshot/cpu_architecture.h @@ -43,7 +43,10 @@ enum CPUArchitecture { kCPUArchitectureMIPSEL, //! \brief 64-bit MIPSEL. - kCPUArchitectureMIPS64EL + kCPUArchitectureMIPS64EL, + + //! \brief 64-bit RISC-V. + kCPUArchitectureRISCV64, }; } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/cpu_context.cc b/shared/sentry/src/external/crashpad/snapshot/cpu_context.cc similarity index 97% rename from shared/sentry/external/crashpad/snapshot/cpu_context.cc rename to shared/sentry/src/external/crashpad/snapshot/cpu_context.cc index 6eaa853fd..492a0f7f9 100644 --- a/shared/sentry/external/crashpad/snapshot/cpu_context.cc +++ b/shared/sentry/src/external/crashpad/snapshot/cpu_context.cc @@ -20,6 +20,7 @@ #include #include "base/notreached.h" +#include "cpu_architecture.h" #include "util/misc/arraysize.h" #include "util/misc/implicit_cast.h" @@ -170,6 +171,8 @@ uint64_t CPUContext::InstructionPointer() const { return arm->pc; case kCPUArchitectureARM64: return arm64->pc; + case kCPUArchitectureRISCV64: + return riscv64->pc; default: NOTREACHED(); return ~0ull; @@ -186,6 +189,8 @@ uint64_t CPUContext::StackPointer() const { return arm->sp; case kCPUArchitectureARM64: return arm64->sp; + case kCPUArchitectureRISCV64: + return riscv64->regs[1]; default: NOTREACHED(); return ~0ull; @@ -226,6 +231,7 @@ bool CPUContext::Is64Bit() const { case kCPUArchitectureX86_64: case kCPUArchitectureARM64: case kCPUArchitectureMIPS64EL: + case kCPUArchitectureRISCV64: return true; case kCPUArchitectureX86: case kCPUArchitectureARM: diff --git a/shared/sentry/external/crashpad/snapshot/cpu_context.h b/shared/sentry/src/external/crashpad/snapshot/cpu_context.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/cpu_context.h rename to shared/sentry/src/external/crashpad/snapshot/cpu_context.h index 7bc252be1..c3640c328 100644 --- a/shared/sentry/external/crashpad/snapshot/cpu_context.h +++ b/shared/sentry/src/external/crashpad/snapshot/cpu_context.h @@ -362,6 +362,15 @@ struct CPUContextMIPS64 { uint64_t fir; }; +//! \brief A context structure carrying RISCV64 CPU state. +struct CPUContextRISCV64 { + uint64_t pc; + uint64_t regs[31]; + + uint64_t fpregs[32]; + uint32_t fcsr; +}; + //! \brief A context structure capable of carrying the context of any supported //! CPU architecture. struct CPUContext { @@ -402,6 +411,7 @@ struct CPUContext { CPUContextARM64* arm64; CPUContextMIPS* mipsel; CPUContextMIPS64* mips64; + CPUContextRISCV64* riscv64; }; }; diff --git a/shared/sentry/external/crashpad/snapshot/cpu_context_test.cc b/shared/sentry/src/external/crashpad/snapshot/cpu_context_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/cpu_context_test.cc rename to shared/sentry/src/external/crashpad/snapshot/cpu_context_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_info_client_options.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_info_client_options.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options.cc diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_info_client_options.h b/shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_info_client_options.h rename to shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options.h diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_info_client_options_test.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options_test.cc similarity index 94% rename from shared/sentry/external/crashpad/snapshot/crashpad_info_client_options_test.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options_test.cc index bc0979028..005dfd590 100644 --- a/shared/sentry/external/crashpad/snapshot/crashpad_info_client_options_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options_test.cc @@ -241,6 +241,22 @@ TEST(CrashpadInfoClientOptions, TwoModules) { class CrashpadInfoSizes_ClientOptions : public testing::TestWithParam {}; +// UBSan detects a function type mismatch when calling +// TestModule_GetCrashpadInfo since the expected function signature should +// return a CrashpadInfo* but the actual TestModule_GetCrashpadInfo defined for +// the test returns a TestCrashpadInfo*. CrashpadInfo is a struct with its +// members set as private and TestCrashpadInfo is a POD meant to replicate the +// layout of CrashpadInfo byte-for-byte. Note this is intentional since the +// whole point of the test is to exercise the snapshot reader’s ability to +// handle CrashpadInfo. +#if defined(__clang__) +[[clang::no_sanitize("function")]] +#endif +inline CrashpadInfo* +CallGetCrashpadInfo(CrashpadInfo* (*func)()) { + return func(); +} + TEST_P(CrashpadInfoSizes_ClientOptions, DifferentlySizedStruct) { base::FilePath::StringType artifact(FILE_PATH_LITERAL("module_")); artifact += GetParam(); @@ -279,7 +295,8 @@ TEST_P(CrashpadInfoSizes_ClientOptions, DifferentlySizedStruct) { EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset); // Get the remote CrashpadInfo structure. - CrashpadInfo* remote_crashpad_info = TestModule_GetCrashpadInfo(); + CrashpadInfo* remote_crashpad_info = + CallGetCrashpadInfo(TestModule_GetCrashpadInfo); ASSERT_TRUE(remote_crashpad_info); { diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_info_client_options_test_module.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options_test_module.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_info_client_options_test_module.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_info_client_options_test_module.cc diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_info_size_test_module.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_info_size_test_module.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_info_size_test_module.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_info_size_test_module.cc diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_info_size_test_note.S b/shared/sentry/src/external/crashpad/snapshot/crashpad_info_size_test_note.S similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_info_size_test_note.S rename to shared/sentry/src/external/crashpad/snapshot/crashpad_info_size_test_note.S diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.h b/shared/sentry/src/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.h rename to shared/sentry/src/external/crashpad/snapshot/crashpad_types/crashpad_info_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_types/image_annotation_reader.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_types/image_annotation_reader.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/crashpad_types/image_annotation_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_types/image_annotation_reader.cc index fd90fbd77..b95a8a8b3 100644 --- a/shared/sentry/external/crashpad/snapshot/crashpad_types/image_annotation_reader.cc +++ b/shared/sentry/src/external/crashpad/snapshot/crashpad_types/image_annotation_reader.cc @@ -26,7 +26,11 @@ #include "client/annotation_list.h" #include "client/simple_string_dictionary.h" #include "snapshot/snapshot_constants.h" +#if BUILDFLAG(IS_FUCHSIA) +#include "util/fuchsia/traits.h" +#else #include "util/linux/traits.h" +#endif namespace crashpad { @@ -39,6 +43,8 @@ struct Annotation { typename Traits::Address value; uint32_t size; uint16_t type; + crashpad::Annotation::ConcurrentAccessGuardMode concurrent_access_guard_mode; + bool spin_guard_state; }; template diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_types/image_annotation_reader.h b/shared/sentry/src/external/crashpad/snapshot/crashpad_types/image_annotation_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_types/image_annotation_reader.h rename to shared/sentry/src/external/crashpad/snapshot/crashpad_types/image_annotation_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc b/shared/sentry/src/external/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc rename to shared/sentry/src/external/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_dynamic_array_reader.cc b/shared/sentry/src/external/crashpad/snapshot/elf/elf_dynamic_array_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_dynamic_array_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_dynamic_array_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_dynamic_array_reader.h b/shared/sentry/src/external/crashpad/snapshot/elf/elf_dynamic_array_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_dynamic_array_reader.h rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_dynamic_array_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader.cc b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader.cc index 30e8b987c..b0340e5fb 100644 --- a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader.cc +++ b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader.cc @@ -21,6 +21,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_math.h" #include "build/build_config.h" @@ -733,8 +734,11 @@ bool ElfImageReader::GetAddressFromDynamicArray(uint64_t tag, if (!dynamic_array_->GetValue(tag, log, address)) { return false; } -#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) - // The GNU loader updates the dynamic array according to the load bias. + +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || \ + (defined(__GLIBC__) && defined(ARCH_CPU_RISCV64)) + // The GNU loader updates the dynamic array according to the load bias (except + // for RISC-V: https://sourceware.org/bugzilla/show_bug.cgi?id=24484). // The Android and Fuchsia loaders only update the debug address. if (tag != DT_DEBUG) { *address += GetLoadBias(); diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader.h b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader.h rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer.cc b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer.cc rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer.cc diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/.gitattributes b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/.gitattributes similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/.gitattributes rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/.gitattributes diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/crashpad_snapshot_test_both_dt_hash_styles.so b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/crashpad_snapshot_test_both_dt_hash_styles.so similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/crashpad_snapshot_test_both_dt_hash_styles.so rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/crashpad_snapshot_test_both_dt_hash_styles.so diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/ret42 b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/ret42 similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/ret42 rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_fuzzer_corpus/ret42 diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_test.cc b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_test.cc rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_test_note.S b/shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_test_note.S similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_image_reader_test_note.S rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_image_reader_test_note.S diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_symbol_table_reader.cc b/shared/sentry/src/external/crashpad/snapshot/elf/elf_symbol_table_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_symbol_table_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_symbol_table_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/elf/elf_symbol_table_reader.h b/shared/sentry/src/external/crashpad/snapshot/elf/elf_symbol_table_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/elf_symbol_table_reader.h rename to shared/sentry/src/external/crashpad/snapshot/elf/elf_symbol_table_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/elf/module_snapshot_elf.cc b/shared/sentry/src/external/crashpad/snapshot/elf/module_snapshot_elf.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/module_snapshot_elf.cc rename to shared/sentry/src/external/crashpad/snapshot/elf/module_snapshot_elf.cc diff --git a/shared/sentry/external/crashpad/snapshot/elf/module_snapshot_elf.h b/shared/sentry/src/external/crashpad/snapshot/elf/module_snapshot_elf.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/module_snapshot_elf.h rename to shared/sentry/src/external/crashpad/snapshot/elf/module_snapshot_elf.h diff --git a/shared/sentry/external/crashpad/snapshot/elf/test_exported_symbols.sym b/shared/sentry/src/external/crashpad/snapshot/elf/test_exported_symbols.sym similarity index 100% rename from shared/sentry/external/crashpad/snapshot/elf/test_exported_symbols.sym rename to shared/sentry/src/external/crashpad/snapshot/elf/test_exported_symbols.sym diff --git a/shared/sentry/external/crashpad/snapshot/exception_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/exception_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/exception_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/exception_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.cc similarity index 62% rename from shared/sentry/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.cc index 8c907cb9e..989bc463b 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.cc +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.cc @@ -21,8 +21,9 @@ namespace internal { #if defined(ARCH_CPU_X86_64) -void InitializeCPUContextX86_64_NoFloatingPoint( +void InitializeCPUContextX86_64( const zx_thread_state_general_regs_t& thread_context, + const zx_thread_state_fp_regs_t& float_context, CPUContextX86_64* context) { memset(context, 0, sizeof(*context)); context->rax = thread_context.rax; @@ -43,6 +44,19 @@ void InitializeCPUContextX86_64_NoFloatingPoint( context->r15 = thread_context.r15; context->rip = thread_context.rip; context->rflags = thread_context.rflags; + + context->fxsave.fcw = float_context.fcw; + context->fxsave.fsw = float_context.fsw; + context->fxsave.ftw = float_context.ftw; + context->fxsave.fop = float_context.fop; + context->fxsave.fpu_ip_64 = float_context.fip; + context->fxsave.fpu_dp_64 = float_context.fdp; + + for (size_t i = 0; i < std::size(float_context.st); ++i) { + memcpy(&context->fxsave.st_mm[i], + &float_context.st[i], + sizeof(float_context.st[i])); + } } #elif defined(ARCH_CPU_ARM64) @@ -89,6 +103,52 @@ void InitializeCPUContextARM64( memcpy(&context->fpsimd, &vector_context.v, sizeof(vector_context.v)); } +#elif defined(ARCH_CPU_RISCV64) + +void InitializeCPUContextRISCV64( + const zx_thread_state_general_regs_t& thread_context, + const zx_thread_state_fp_regs_t& float_context, + CPUContextRISCV64* context) { + context->pc = thread_context.pc; + context->regs[0] = thread_context.ra; + context->regs[1] = thread_context.sp; + context->regs[2] = thread_context.gp; + context->regs[3] = thread_context.tp; + context->regs[4] = thread_context.t0; + context->regs[5] = thread_context.t1; + context->regs[6] = thread_context.t2; + context->regs[7] = thread_context.s0; + context->regs[8] = thread_context.s1; + context->regs[9] = thread_context.a0; + context->regs[10] = thread_context.a1; + context->regs[11] = thread_context.a2; + context->regs[12] = thread_context.a3; + context->regs[13] = thread_context.a4; + context->regs[14] = thread_context.a5; + context->regs[15] = thread_context.a6; + context->regs[16] = thread_context.a7; + context->regs[17] = thread_context.s2; + context->regs[18] = thread_context.s3; + context->regs[19] = thread_context.s4; + context->regs[20] = thread_context.s5; + context->regs[21] = thread_context.s6; + context->regs[22] = thread_context.s7; + context->regs[23] = thread_context.s8; + context->regs[24] = thread_context.s9; + context->regs[25] = thread_context.s10; + context->regs[26] = thread_context.s11; + context->regs[27] = thread_context.t3; + context->regs[28] = thread_context.t4; + context->regs[29] = thread_context.t5; + context->regs[30] = thread_context.t6; + + for (size_t i = 0; i < std::size(context->fpregs); ++i) { + context->fpregs[i] = float_context.q[i].low; + } + + context->fcsr = float_context.fcsr; +} + #endif // ARCH_CPU_X86_64 } // namespace internal diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.h similarity index 74% rename from shared/sentry/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.h index 3cce60ed2..5d4cd8e84 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.h +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/cpu_context_fuchsia.h @@ -29,13 +29,14 @@ namespace internal { //! \brief Initializes a CPUContextX86_64 structure from native context //! structures on Fuchsia. //! -//! Floating point registers are currently initialized to zero. //! Segment registers are currently initialized to zero. //! //! \param[in] thread_context The native thread context. +//! \param[in] float_context The native floating point context. //! \param[out] context The CPUContextX86_64 structure to initialize. -void InitializeCPUContextX86_64_NoFloatingPoint( +void InitializeCPUContextX86_64( const zx_thread_state_general_regs_t& thread_context, + const zx_thread_state_fp_regs_t& float_context, CPUContextX86_64* context); #endif // ARCH_CPU_X86_64 || DOXYGEN @@ -56,6 +57,21 @@ void InitializeCPUContextARM64( #endif // ARCH_CPU_ARM64 || DOXYGEN +#if defined(ARCH_CPU_RISCV64) || DOXYGEN + +//! \brief Initializes a CPUContextRISCV64 structure from native context +//! structures on Fuchsia. +//! +//! \param[in] thread_context The native thread context. +//! \param[in] float_context The native floating point context. +//! \param[out] context The CPUContextRISCV64 structure to initialize. +void InitializeCPUContextRISCV64( + const zx_thread_state_general_regs_t& thread_context, + const zx_thread_state_fp_regs_t& float_context, + CPUContextRISCV64* context); + +#endif // ARCH_CPU_RISCV64 || DOXYGEN + } // namespace internal } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.cc similarity index 87% rename from shared/sentry/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.cc index 50ea6fff9..be71ca22a 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.cc +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.cc @@ -42,6 +42,8 @@ bool ExceptionSnapshotFuchsia::Initialize( exception_info_ = exception_report.context.arch.u.x86_64.err_code; #elif defined(ARCH_CPU_ARM64) exception_info_ = exception_report.context.arch.u.arm_64.esr; +#elif defined(ARCH_CPU_RISCV64) + exception_info_ = exception_report.context.arch.u.riscv_64.cause; #endif codes_.push_back(exception_); @@ -52,6 +54,8 @@ bool ExceptionSnapshotFuchsia::Initialize( codes_.push_back(exception_report.context.arch.u.x86_64.cr2); #elif defined(ARCH_CPU_ARM64) codes_.push_back(exception_report.context.arch.u.arm_64.far); +#elif defined(ARCH_CPU_RISCV64) + codes_.push_back(exception_report.context.arch.u.riscv_64.tval); #endif const auto threads = process_reader->Threads(); @@ -70,14 +74,19 @@ bool ExceptionSnapshotFuchsia::Initialize( #if defined(ARCH_CPU_X86_64) context_.architecture = kCPUArchitectureX86_64; context_.x86_64 = &context_arch_; - // TODO(fxbug.dev/5496): Add float context once saved in |t|. - InitializeCPUContextX86_64_NoFloatingPoint(t->general_registers, - context_.x86_64); + // TODO(fxbug.dev/5496): Add vector context. + InitializeCPUContextX86_64( + t->general_registers, t->fp_registers, context_.x86_64); #elif defined(ARCH_CPU_ARM64) context_.architecture = kCPUArchitectureARM64; context_.arm64 = &context_arch_; InitializeCPUContextARM64( t->general_registers, t->vector_registers, context_.arm64); +#elif defined(ARCH_CPU_RISCV64) + context_.architecture = kCPUArchitectureRISCV64; + context_.riscv64 = &context_arch_; + InitializeCPUContextRISCV64( + t->general_registers, t->fp_registers, context_.riscv64); #else #error Port. #endif @@ -92,6 +101,8 @@ bool ExceptionSnapshotFuchsia::Initialize( exception_address_ = exception_report.context.arch.u.x86_64.cr2; #elif defined(ARCH_CPU_ARM64) exception_address_ = exception_report.context.arch.u.arm_64.far; +#elif defined(ARCH_CPU_RISCV64) + exception_address_ = exception_report.context.arch.u.riscv_64.tval; #else #error Port. #endif diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.h similarity index 97% rename from shared/sentry/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.h index 59f4d42bc..2d9701f98 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.h +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/exception_snapshot_fuchsia.h @@ -69,6 +69,8 @@ class ExceptionSnapshotFuchsia final : public ExceptionSnapshot { CPUContextX86_64 context_arch_; #elif defined(ARCH_CPU_ARM64) CPUContextARM64 context_arch_; +#elif defined(ARCH_CPU_RISCV64) + CPUContextRISCV64 context_arch_; #endif CPUContext context_; std::vector codes_; diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.cc diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_fuchsia.h diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.h diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.cc similarity index 95% rename from shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.cc index 02be7c296..5bf2acf7d 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.cc +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.cc @@ -18,6 +18,7 @@ #include #include +#include "base/check_op.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/logging.h" #include "util/fuchsia/koid_utilities.h" @@ -40,7 +41,7 @@ void GetStackRegions( uint64_t sp; #if defined(ARCH_CPU_X86_64) sp = regs.rsp; -#elif defined(ARCH_CPU_ARM64) +#elif defined(ARCH_CPU_ARM64) || defined(ARCH_CPU_RISCV64) sp = regs.sp; #else #error Port @@ -234,7 +235,7 @@ void ProcessReaderFuchsia::InitializeModules() { // Crashpad needs to use the same module name at run time for symbol // resolution to work properly. // - // TODO(fuchsia/DX-1234): once Crashpad switches to elf-search, the + // TODO: https://fxbug.dev/6057 - once Crashpad switches to elf-search, the // following overwrites won't be necessary as only shared libraries will // have a soname at runtime, just like at build time. // @@ -265,7 +266,6 @@ void ProcessReaderFuchsia::InitializeModules() { if (dsoname.empty()) { // This value must be kept in sync with what is used at build time to // index symbols for executables and loadable modules. - // See fuchsia/DX-1193 for more details. module.name = "<_>"; module.type = ModuleSnapshot::kModuleTypeExecutable; } else { @@ -346,6 +346,19 @@ void ProcessReaderFuchsia::InitializeThreads() { } } +// Floating point registers are in the vector context for ARM. +#if !defined(ARCH_CPU_ARM64) + zx_thread_state_fp_regs_t fp_regs; + status = thread_handles[i].read_state( + ZX_THREAD_STATE_FP_REGS, &fp_regs, sizeof(fp_regs)); + if (status != ZX_OK) { + ZX_LOG(WARNING, status) + << "zx_thread_read_state(ZX_THREAD_STATE_FP_REGS)"; + } else { + thread.fp_registers = fp_regs; + } +#endif + zx_thread_state_vector_regs_t vector_regs; status = thread_handles[i].read_state( ZX_THREAD_STATE_VECTOR_REGS, &vector_regs, sizeof(vector_regs)); diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.h similarity index 96% rename from shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.h index cfeb67814..31e788698 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.h +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia.h @@ -76,6 +76,10 @@ class ProcessReaderFuchsia { //! returned by `zx_thread_read_state()`. zx_thread_state_general_regs_t general_registers = {}; + //! \brief The raw architecture-specific `zx_thread_state_fp_regs_t` as + //! returned by `zx_thread_read_state()`. + zx_thread_state_fp_regs_t fp_registers = {}; + //! \brief The raw architecture-specific `zx_thread_state_vector_regs_t` as //! returned by `zx_thread_read_state()`. zx_thread_state_vector_regs_t vector_registers = {}; diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.cc diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia.h diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc index 7fcbb53ca..af245d3ed 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc @@ -200,7 +200,7 @@ class InvalidStackPointerTest : public MultiprocessExec { constexpr uint64_t kOffsetIntoMapping = 1024; #if defined(ARCH_CPU_X86_64) regs.rsp = address_of_large_mapping + kOffsetIntoMapping; -#elif defined(ARCH_CPU_ARM64) +#elif defined(ARCH_CPU_ARM64) || defined(ARCH_CPU_RISCV64) regs.sp = address_of_large_mapping + kOffsetIntoMapping; #else #error diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.cc similarity index 94% rename from shared/sentry/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.cc index b820ed96b..81a9d3018 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.cc +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.cc @@ -45,6 +45,8 @@ void SystemSnapshotFuchsia::Initialize(const timeval* snapshot_time) { static constexpr const char kArch[] = "x86_64"; #elif defined(ARCH_CPU_ARM64) static constexpr const char kArch[] = "aarch64"; +#elif defined(ARCH_CPU_RISCV64) + static constexpr const char kArch[] = "riscv64"; #else static constexpr const char kArch[] = "unknown"; #endif @@ -61,6 +63,8 @@ CPUArchitecture SystemSnapshotFuchsia::GetCPUArchitecture() const { return kCPUArchitectureX86_64; #elif defined(ARCH_CPU_ARM64) return kCPUArchitectureARM64; +#elif defined(ARCH_CPU_RISCV64) + return kCPUArchitectureRISCV64; #else #error Port #endif @@ -71,7 +75,7 @@ uint32_t SystemSnapshotFuchsia::CPURevision() const { #if defined(ARCH_CPU_X86_64) return cpuid_.Revision(); #else - // TODO(fuchsia/DX-712): Read actual revision. + // TODO: https://fxbug.dev/5561 - Read actual revision. return 0; #endif } @@ -86,7 +90,7 @@ std::string SystemSnapshotFuchsia::CPUVendor() const { #if defined(ARCH_CPU_X86_64) return cpuid_.Vendor(); #else - // TODO(fuchsia/DX-712): Read actual vendor. + // TODO: https://fxbug.dev/5561 - Read actual vendor. return std::string(); #endif } @@ -189,7 +193,7 @@ bool SystemSnapshotFuchsia::NXEnabled() const { #if defined(ARCH_CPU_X86_64) return cpuid_.NXEnabled(); #else - // TODO(fuchsia/DX-712): Read actual NX bit value. + // TODO: https://fxbug.dev/5561 - Read actual NX bit value. return false; #endif } diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.h index efbe19bdb..3d545bb4b 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.h +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/system_snapshot_fuchsia.h @@ -73,6 +73,8 @@ class SystemSnapshotFuchsia final : public SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + uint64_t AddressMask() const override { return 0; } + private: std::string os_version_full_; const timeval* snapshot_time_; // weak diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.cc b/shared/sentry/src/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.cc similarity index 89% rename from shared/sentry/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.cc rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.cc index 20b85dde8..759895254 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.cc +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.cc @@ -40,14 +40,19 @@ bool ThreadSnapshotFuchsia::Initialize( #if defined(ARCH_CPU_X86_64) context_.architecture = kCPUArchitectureX86_64; context_.x86_64 = &context_arch_; - // TODO(fuchsia/DX-642): Add float context once saved in |thread|. - InitializeCPUContextX86_64_NoFloatingPoint(thread.general_registers, - context_.x86_64); + // TODO(fxbug.dev/5496): Add vector context. + InitializeCPUContextX86_64( + thread.general_registers, thread.fp_registers, context_.x86_64); #elif defined(ARCH_CPU_ARM64) context_.architecture = kCPUArchitectureARM64; context_.arm64 = &context_arch_; InitializeCPUContextARM64( thread.general_registers, thread.vector_registers, context_.arm64); +#elif defined(ARCH_CPU_RISCV64) + context_.architecture = kCPUArchitectureRISCV64; + context_.riscv64 = &context_arch_; + InitializeCPUContextRISCV64( + thread.general_registers, thread.fp_registers, context_.riscv64); #else #error Port. #endif diff --git a/shared/sentry/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.h b/shared/sentry/src/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.h similarity index 97% rename from shared/sentry/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.h rename to shared/sentry/src/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.h index 8f5ebc72a..84cac3df6 100644 --- a/shared/sentry/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.h +++ b/shared/sentry/src/external/crashpad/snapshot/fuchsia/thread_snapshot_fuchsia.h @@ -69,6 +69,8 @@ class ThreadSnapshotFuchsia final : public ThreadSnapshot { CPUContextX86_64 context_arch_; #elif defined(ARCH_CPU_ARM64) CPUContextARM64 context_arch_; +#elif defined(ARCH_CPU_RISCV64) + CPUContextRISCV64 context_arch_; #else #error Port. #endif diff --git a/shared/sentry/external/crashpad/snapshot/handle_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/handle_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/handle_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/handle_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/handle_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/handle_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/handle_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/handle_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/hash_types_test.cc b/shared/sentry/src/external/crashpad/snapshot/hash_types_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/hash_types_test.cc rename to shared/sentry/src/external/crashpad/snapshot/hash_types_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc b/shared/sentry/src/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc similarity index 98% rename from shared/sentry/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc index dd41687d9..e34784540 100644 --- a/shared/sentry/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc @@ -14,8 +14,9 @@ #include "snapshot/ios/exception_snapshot_ios_intermediate_dump.h" +#include "base/apple/mach_logging.h" +#include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "snapshot/cpu_context.h" #include "snapshot/ios/intermediate_dump_reader_util.h" #include "snapshot/mac/cpu_context_mac.h" @@ -175,18 +176,21 @@ bool ExceptionSnapshotIOSIntermediateDump::InitializeFromMachException( const std::vector& bytes = code_dump->bytes(); const mach_exception_data_type_t* code = reinterpret_cast(bytes.data()); - if (bytes.size() == 0 || !code) { + if (bytes.size() == 0 || + bytes.size() % sizeof(mach_exception_data_type_t) != 0 || !code) { LOG(ERROR) << "Invalid mach exception code."; } else { - // TODO: rationalize with the macOS implementation. mach_msg_type_number_t code_count = bytes.size() / sizeof(mach_exception_data_type_t); for (mach_msg_type_number_t code_index = 0; code_index < code_count; ++code_index) { codes_.push_back(code[code_index]); } + DCHECK_GE(code_count, 1u); exception_info_ = code[0]; - exception_address_ = code[1]; + if (code_count >= 2) { + exception_address_ = code[1]; + } } } diff --git a/shared/sentry/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h b/shared/sentry/src/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h rename to shared/sentry/src/external/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h diff --git a/shared/sentry/external/crashpad/snapshot/ios/intermediate_dump_reader_util.cc b/shared/sentry/src/external/crashpad/snapshot/ios/intermediate_dump_reader_util.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/intermediate_dump_reader_util.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/intermediate_dump_reader_util.cc diff --git a/shared/sentry/external/crashpad/snapshot/ios/intermediate_dump_reader_util.h b/shared/sentry/src/external/crashpad/snapshot/ios/intermediate_dump_reader_util.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/intermediate_dump_reader_util.h rename to shared/sentry/src/external/crashpad/snapshot/ios/intermediate_dump_reader_util.h diff --git a/shared/sentry/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc b/shared/sentry/src/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc index a3c7a1377..b272eb65f 100644 --- a/shared/sentry/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc @@ -14,6 +14,8 @@ #include "snapshot/ios/memory_snapshot_ios_intermediate_dump.h" +#include "base/check_op.h" + namespace crashpad { namespace internal { diff --git a/shared/sentry/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h b/shared/sentry/src/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h rename to shared/sentry/src/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h diff --git a/shared/sentry/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump_test.cc b/shared/sentry/src/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump_test.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc b/shared/sentry/src/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc similarity index 97% rename from shared/sentry/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc index 39d3bab7e..09498f148 100644 --- a/shared/sentry/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc @@ -17,8 +17,8 @@ #include #include +#include "base/apple/mach_logging.h" #include "base/files/file_path.h" -#include "base/mac/mach_logging.h" #include "client/annotation.h" #include "snapshot/ios/intermediate_dump_reader_util.h" #include "util/ios/ios_intermediate_dump_data.h" @@ -51,10 +51,13 @@ bool ModuleSnapshotIOSIntermediateDump::Initialize( GetDataStringFromMap(image_data, Key::kName, &name_); GetDataValueFromMap(image_data, Key::kAddress, &address_); GetDataValueFromMap(image_data, Key::kSize, &size_); - GetDataValueFromMap(image_data, Key::kSourceVersion, &source_version_); GetDataValueFromMap(image_data, Key::kFileType, &filetype_); // These keys are often missing. + GetDataValueFromMap(image_data, + Key::kSourceVersion, + &source_version_, + LogMissingDataValueFromMap::kDontLogIfMissing); GetDataValueFromMap(image_data, Key::kTimestamp, ×tamp_, diff --git a/shared/sentry/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h b/shared/sentry/src/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h rename to shared/sentry/src/external/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h diff --git a/shared/sentry/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc b/shared/sentry/src/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc diff --git a/shared/sentry/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h b/shared/sentry/src/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h rename to shared/sentry/src/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h diff --git a/shared/sentry/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc b/shared/sentry/src/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc index 58f10bf39..6d64b1d07 100644 --- a/shared/sentry/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc @@ -16,7 +16,8 @@ #include -#include "base/cxx17_backports.h" +#include + #include "base/files/scoped_file.h" #include "base/posix/eintr_wrapper.h" #include "build/build_config.h" @@ -760,6 +761,11 @@ TEST_F(ProcessSnapshotIOSIntermediateDumpTest, FuzzTestCases) { FILE_PATH_LITERAL("snapshot/ios/testdata/crash-6605504629637120")); crashpad::internal::ProcessSnapshotIOSIntermediateDump process_snapshot3; EXPECT_FALSE(process_snapshot3.InitializeWithFilePath(fuzz_path, {})); + + fuzz_path = TestPaths::TestDataRoot().Append( + FILE_PATH_LITERAL("snapshot/ios/testdata/crash-c44acfcbccd8c7a8")); + crashpad::internal::ProcessSnapshotIOSIntermediateDump process_snapshot4; + EXPECT_TRUE(process_snapshot4.InitializeWithFilePath(fuzz_path, {})); } } // namespace diff --git a/shared/sentry/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc b/shared/sentry/src/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc index 324ec65e4..15f66992b 100644 --- a/shared/sentry/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc @@ -22,8 +22,8 @@ #include +#include "base/apple/mach_logging.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "snapshot/cpu_context.h" @@ -57,6 +57,7 @@ SystemSnapshotIOSIntermediateDump::SystemSnapshotIOSIntermediateDump() daylight_offset_seconds_(0), standard_name_(), daylight_name_(), + address_mask_(0), initialized_() {} SystemSnapshotIOSIntermediateDump::~SystemSnapshotIOSIntermediateDump() {} @@ -97,6 +98,8 @@ void SystemSnapshotIOSIntermediateDump::Initialize( dst_status_ = SystemSnapshot::kDoesNotObserveDaylightSavingTime; } + GetDataValueFromMap(system_data, Key::kAddressMask, &address_mask_); + vm_size_t page_size; if (GetDataValueFromMap(system_data, Key::kPageSize, &page_size)) { const IOSIntermediateDumpMap* vm_stat = @@ -241,5 +244,10 @@ void SystemSnapshotIOSIntermediateDump::TimeZone( daylight_name->assign(daylight_name_); } +uint64_t SystemSnapshotIOSIntermediateDump::AddressMask() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return address_mask_; +} + } // namespace internal } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h b/shared/sentry/src/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h rename to shared/sentry/src/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h index 4c9ef1189..6cc09ac78 100644 --- a/shared/sentry/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h +++ b/shared/sentry/src/external/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h @@ -73,6 +73,7 @@ class SystemSnapshotIOSIntermediateDump final : public SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + uint64_t AddressMask() const override; private: std::string os_version_build_; @@ -91,6 +92,7 @@ class SystemSnapshotIOSIntermediateDump final : public SystemSnapshot { int daylight_offset_seconds_; std::string standard_name_; std::string daylight_name_; + uint64_t address_mask_; InitializationStateDcheck initialized_; }; diff --git a/shared/sentry/external/crashpad/snapshot/ios/testdata/crash-1fa088dda0adb41459d063078a0f384a0bb8eefa b/shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-1fa088dda0adb41459d063078a0f384a0bb8eefa similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/testdata/crash-1fa088dda0adb41459d063078a0f384a0bb8eefa rename to shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-1fa088dda0adb41459d063078a0f384a0bb8eefa diff --git a/shared/sentry/external/crashpad/snapshot/ios/testdata/crash-5726011582644224 b/shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-5726011582644224 similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/testdata/crash-5726011582644224 rename to shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-5726011582644224 diff --git a/shared/sentry/external/crashpad/snapshot/ios/testdata/crash-6605504629637120 b/shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-6605504629637120 similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/testdata/crash-6605504629637120 rename to shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-6605504629637120 diff --git a/shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-c44acfcbccd8c7a8 b/shared/sentry/src/external/crashpad/snapshot/ios/testdata/crash-c44acfcbccd8c7a8 new file mode 100644 index 0000000000000000000000000000000000000000..5e7eb83f33ee5a8d239aad283c6e7b2ffccdbb00 GIT binary patch literal 972 zcmZWoO=uHA7@gV8q%|QVkV>kT^q?LpWJG9BRvVItU~57Wu|lD4HxqVEvb*eVOmZ>@ zBZ7sZBDQ+*Uk@HaJ@^M2FN#+|5D(sjRumKuo@AZb?5-hxFwDH~d+*IR!;Bw606{+> zyctG!!x0DSvmJpg(@g*rv6Vr$!#=0prtAv=VjO?7gM%YLs_KnL-g= z{D;y-G7Da2G!H3{}fUbK`U)TrG4G->lvmKyy4+chkv@c$ZLDY!3EwHVT zIS6A2G~Hc8i&LDF( z7xY$NrBaoF^Tbf=x=84%u9$L-APJ~iQB4UN;iBgNEC(gO3}`^K{)XWkpmaqTq(ASForHhNKDY#@gz~&h7wu8T4+2 zo$?Vscq=0`!};JQkG}HmO*NHV3T^T33udChpe2{d)aV=Eb;>L~NylTbIrZL(e~ujN z0C392(+u;@AJJySSHI5!@Z;EP``fe+Iru<-J~sv|%lZT2jxS~Y+Ms+lW$`0Ga`v+TV6Q72no-kxFmQ1?#H!rLUwlur@Bjb+ literal 0 HcmV?d00001 diff --git a/shared/sentry/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc b/shared/sentry/src/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc rename to shared/sentry/src/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc index 901e1f119..d37ccef3b 100644 --- a/shared/sentry/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc @@ -14,7 +14,7 @@ #include "snapshot/ios/thread_snapshot_ios_intermediate_dump.h" -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" #include "snapshot/ios/intermediate_dump_reader_util.h" #include "snapshot/mac/cpu_context_mac.h" #include "util/ios/ios_intermediate_dump_data.h" diff --git a/shared/sentry/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h b/shared/sentry/src/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h rename to shared/sentry/src/external/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h diff --git a/shared/sentry/external/crashpad/snapshot/linux/capture_memory_delegate_linux.cc b/shared/sentry/src/external/crashpad/snapshot/linux/capture_memory_delegate_linux.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/capture_memory_delegate_linux.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/capture_memory_delegate_linux.cc diff --git a/shared/sentry/external/crashpad/snapshot/linux/capture_memory_delegate_linux.h b/shared/sentry/src/external/crashpad/snapshot/linux/capture_memory_delegate_linux.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/capture_memory_delegate_linux.h rename to shared/sentry/src/external/crashpad/snapshot/linux/capture_memory_delegate_linux.h diff --git a/shared/sentry/external/crashpad/snapshot/linux/cpu_context_linux.cc b/shared/sentry/src/external/crashpad/snapshot/linux/cpu_context_linux.cc similarity index 93% rename from shared/sentry/external/crashpad/snapshot/linux/cpu_context_linux.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/cpu_context_linux.cc index 21db23432..6c4cb3ebc 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/cpu_context_linux.cc +++ b/shared/sentry/src/external/crashpad/snapshot/linux/cpu_context_linux.cc @@ -266,6 +266,21 @@ void InitializeCPUContextARM64_OnlyFPSIMD( context->fpcr = float_context.fpcr; } +#elif defined(ARCH_CPU_RISCV64) + +void InitializeCPUContextRISCV64(const ThreadContext::t64_t& thread_context, + const FloatContext::f64_t& float_context, + CPUContextRISCV64* context) { + context->pc = thread_context.pc; + + static_assert(sizeof(context->regs) == sizeof(thread_context.regs)); + memcpy(context->regs, thread_context.regs, sizeof(context->regs)); + + static_assert(sizeof(context->fpregs) == sizeof(float_context.fpregs)); + memcpy(context->fpregs, float_context.fpregs, sizeof(context->fpregs)); + context->fcsr = float_context.fcsr; +} + #endif // ARCH_CPU_X86_FAMILY } // namespace internal diff --git a/shared/sentry/external/crashpad/snapshot/linux/cpu_context_linux.h b/shared/sentry/src/external/crashpad/snapshot/linux/cpu_context_linux.h similarity index 92% rename from shared/sentry/external/crashpad/snapshot/linux/cpu_context_linux.h rename to shared/sentry/src/external/crashpad/snapshot/linux/cpu_context_linux.h index 1ea5eecda..507d1b44d 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/cpu_context_linux.h +++ b/shared/sentry/src/external/crashpad/snapshot/linux/cpu_context_linux.h @@ -174,6 +174,20 @@ void InitializeCPUContextMIPS( #endif // ARCH_CPU_MIPS_FAMILY || DOXYGEN +#if defined(ARCH_CPU_RISCV64) || DOXYGEN + +//! \brief Initializes a CPUContextRISCV64 structure from native context +//! structures on Linux. +//! +//! \param[in] thread_context The native thread context. +//! \param[in] float_context The native float context. +//! \param[out] context The CPUContextRISCV64 structure to initialize. +void InitializeCPUContextRISCV64(const ThreadContext::t64_t& thread_context, + const FloatContext::f64_t& float_context, + CPUContextRISCV64* context); + +#endif // ARCH_CPU_RISCV64 || DOXYGEN + } // namespace internal } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/linux/debug_rendezvous.cc b/shared/sentry/src/external/crashpad/snapshot/linux/debug_rendezvous.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/debug_rendezvous.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/debug_rendezvous.cc diff --git a/shared/sentry/external/crashpad/snapshot/linux/debug_rendezvous.h b/shared/sentry/src/external/crashpad/snapshot/linux/debug_rendezvous.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/debug_rendezvous.h rename to shared/sentry/src/external/crashpad/snapshot/linux/debug_rendezvous.h diff --git a/shared/sentry/external/crashpad/snapshot/linux/debug_rendezvous_test.cc b/shared/sentry/src/external/crashpad/snapshot/linux/debug_rendezvous_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/debug_rendezvous_test.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/debug_rendezvous_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux.cc b/shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux.cc similarity index 91% rename from shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux.cc index 4e6ec11f8..677afdaa7 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux.cc +++ b/shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux.cc @@ -325,6 +325,48 @@ bool ExceptionSnapshotLinux::ReadContext( reader, context_address, context_.mips64); } +#elif defined(ARCH_CPU_RISCV64) + +static bool ReadContext(ProcessReaderLinux* reader, + LinuxVMAddress context_address, + typename ContextTraits64::CPUContext* dest_context) { + const ProcessMemory* memory = reader->Memory(); + + LinuxVMAddress gregs_address = context_address + + offsetof(UContext, mcontext) + + offsetof(MContext64, regs); + + typename ContextTraits64::SignalThreadContext thread_context; + if (!memory->Read(gregs_address, sizeof(thread_context), &thread_context)) { + LOG(ERROR) << "Couldn't read gregs"; + return false; + } + + LinuxVMAddress fpregs_address = + context_address + offsetof(UContext, mcontext) + + offsetof(MContext64, fpregs); + + typename ContextTraits64::SignalFloatContext fp_context; + if (!memory->Read(fpregs_address, sizeof(fp_context), &fp_context)) { + LOG(ERROR) << "Couldn't read fpregs"; + return false; + } + + InitializeCPUContextRISCV64(thread_context, fp_context, dest_context); + + return true; +} + +template <> +bool ExceptionSnapshotLinux::ReadContext( + ProcessReaderLinux* reader, + LinuxVMAddress context_address) { + context_.architecture = kCPUArchitectureRISCV64; + context_.riscv64 = &context_union_.riscv64; + + return internal::ReadContext(reader, context_address, context_.riscv64); +} + #endif // ARCH_CPU_X86_FAMILY bool ExceptionSnapshotLinux::Initialize( @@ -355,10 +397,12 @@ bool ExceptionSnapshotLinux::Initialize( return false; } } else { +#if !defined(ARCH_CPU_RISCV64) if (!ReadContext(process_reader, context_address) || !ReadSiginfo(process_reader, siginfo_address)) { return false; } +#endif } CaptureMemoryDelegateLinux capture_memory_delegate( diff --git a/shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux.h b/shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux.h rename to shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux.h index 3ea3d931f..f931d3300 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux.h +++ b/shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux.h @@ -89,6 +89,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot { #elif defined(ARCH_CPU_MIPS_FAMILY) CPUContextMIPS mipsel; CPUContextMIPS64 mips64; +#elif defined(ARCH_CPU_RISCV64) + CPUContextRISCV64 riscv64; #endif } context_union_; CPUContext context_; diff --git a/shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux_test.cc b/shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux_test.cc similarity index 94% rename from shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux_test.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux_test.cc index 0f5e21af6..94f45f1eb 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/exception_snapshot_linux_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/linux/exception_snapshot_linux_test.cc @@ -297,6 +297,34 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) { #undef CPU_ARCH_NAME } +#elif defined(ARCH_CPU_RISCV64) +using NativeCPUContext = ucontext_t; + +void InitializeContext(NativeCPUContext* context) { + for (size_t reg = 0; reg < std::size(context->uc_mcontext.__gregs); ++reg) { + context->uc_mcontext.__gregs[reg] = reg; + } + + memset(&context->uc_mcontext.__fpregs, + 44, + sizeof(context->uc_mcontext.__fpregs)); +} + +void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) { + EXPECT_EQ(actual.architecture, kCPUArchitectureRISCV64); + + EXPECT_EQ(actual.riscv64->pc, expected.uc_mcontext.__gregs[0]); + + for (size_t reg = 0; reg < std::size(actual.riscv64->regs); ++reg) { + EXPECT_EQ(actual.riscv64->regs[reg], expected.uc_mcontext.__gregs[reg + 1]); + } + + EXPECT_EQ(memcmp(&actual.riscv64->fpregs, + &expected.uc_mcontext.__fpregs, + sizeof(actual.riscv64->fpregs)), + 0); +} + #else #error Port. #endif diff --git a/shared/sentry/external/crashpad/snapshot/linux/process_reader_linux.cc b/shared/sentry/src/external/crashpad/snapshot/linux/process_reader_linux.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/linux/process_reader_linux.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/process_reader_linux.cc index 8ec0edc6d..45713386d 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/process_reader_linux.cc +++ b/shared/sentry/src/external/crashpad/snapshot/linux/process_reader_linux.cc @@ -127,6 +127,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) { #elif defined(ARCH_CPU_MIPS_FAMILY) stack_pointer = reader->Is64Bit() ? thread_info.thread_context.t64.regs[29] : thread_info.thread_context.t32.regs[29]; +#elif defined(ARCH_CPU_RISCV64) + stack_pointer = thread_info.thread_context.t64.regs[1]; #else #error Port. #endif diff --git a/shared/sentry/external/crashpad/snapshot/linux/process_reader_linux.h b/shared/sentry/src/external/crashpad/snapshot/linux/process_reader_linux.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/process_reader_linux.h rename to shared/sentry/src/external/crashpad/snapshot/linux/process_reader_linux.h diff --git a/shared/sentry/external/crashpad/snapshot/linux/process_reader_linux_test.cc b/shared/sentry/src/external/crashpad/snapshot/linux/process_reader_linux_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/process_reader_linux_test.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/process_reader_linux_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/linux/process_snapshot_linux.cc b/shared/sentry/src/external/crashpad/snapshot/linux/process_snapshot_linux.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/process_snapshot_linux.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/process_snapshot_linux.cc diff --git a/shared/sentry/external/crashpad/snapshot/linux/process_snapshot_linux.h b/shared/sentry/src/external/crashpad/snapshot/linux/process_snapshot_linux.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/process_snapshot_linux.h rename to shared/sentry/src/external/crashpad/snapshot/linux/process_snapshot_linux.h diff --git a/shared/sentry/external/crashpad/snapshot/linux/signal_context.h b/shared/sentry/src/external/crashpad/snapshot/linux/signal_context.h similarity index 90% rename from shared/sentry/external/crashpad/snapshot/linux/signal_context.h rename to shared/sentry/src/external/crashpad/snapshot/linux/signal_context.h index 6ac7adea4..89e697a08 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/signal_context.h +++ b/shared/sentry/src/external/crashpad/snapshot/linux/signal_context.h @@ -422,6 +422,40 @@ static_assert(offsetof(UContext, mcontext.fpregs) == "context offset mismatch"); #endif +#elif defined(ARCH_CPU_RISCV64) + +struct ContextTraits64 : public Traits64 { + using SignalThreadContext = ThreadContext::t64_t; + using SignalFloatContext = FloatContext::f64_t; + using CPUContext = CPUContextRISCV64; +}; + +struct MContext64 { + ThreadContext::t64_t regs; + FloatContext::f64_t fpregs; +}; + +template +struct UContext { + typename Traits::ULong flags; + typename Traits::Address link; + SignalStack stack; + Sigset sigmask; + char alignment_padding_[8]; + char padding[128 - sizeof(Sigset)]; + MContext64 mcontext; +}; + +static_assert(offsetof(UContext, mcontext) == + offsetof(ucontext_t, uc_mcontext), + "context offset mismatch"); +static_assert(offsetof(UContext, mcontext.regs) == + offsetof(ucontext_t, uc_mcontext.__gregs), + "context offset mismatch"); +static_assert(offsetof(UContext, mcontext.fpregs) == + offsetof(ucontext_t, uc_mcontext.__fpregs), + "context offset mismatch"); + #else #error Port. #endif // ARCH_CPU_X86_FAMILY diff --git a/shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux.cc b/shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux.cc similarity index 93% rename from shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux.cc index 9d199ff56..b32f22d78 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux.cc +++ b/shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux.cc @@ -20,6 +20,7 @@ #include +#include "base/check_op.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/notreached.h" @@ -62,8 +63,8 @@ bool ReadCPUsOnline(uint32_t* first_cpu, uint8_t* cpu_count) { std::string left, right; if (SplitStringFirst(range, '-', &left, &right)) { unsigned int start, end; - if (!StringToUint(base::StringPiece(left), &start) || - !StringToUint(base::StringPiece(right), &end) || end <= start) { + if (!base::StringToUint(base::StringPiece(left), &start) || + !base::StringToUint(base::StringPiece(right), &end) || end <= start) { LOG(ERROR) << "format error: " << range; return false; } @@ -78,7 +79,7 @@ bool ReadCPUsOnline(uint32_t* first_cpu, uint8_t* cpu_count) { } } else { unsigned int cpuno; - if (!StringToUint(base::StringPiece(range), &cpuno)) { + if (!base::StringToUint(base::StringPiece(range), &cpuno)) { LOG(ERROR) << "format error"; return false; } @@ -205,6 +206,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const { #elif defined(ARCH_CPU_MIPS_FAMILY) return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL : kCPUArchitectureMIPSEL; +#elif defined(ARCH_CPU_RISCV64) + return kCPUArchitectureRISCV64; #else #error port to your architecture #endif @@ -220,6 +223,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const { #elif defined(ARCH_CPU_MIPS_FAMILY) // Not implementable on MIPS return 0; +#elif defined(ARCH_CPU_RISCV64) + // Not implemented + return 0; #else #error port to your architecture #endif @@ -240,6 +246,9 @@ std::string SystemSnapshotLinux::CPUVendor() const { #elif defined(ARCH_CPU_MIPS_FAMILY) // Not implementable on MIPS return std::string(); +#elif defined(ARCH_CPU_RISCV64) + // Not implemented + return std::string(); #else #error port to your architecture #endif @@ -373,6 +382,9 @@ bool SystemSnapshotLinux::NXEnabled() const { #elif defined(ARCH_CPU_MIPS_FAMILY) // Not implementable on MIPS return false; +#elif defined(ARCH_CPU_RISCV64) + // Not implemented + return false; #else #error Port. #endif // ARCH_CPU_X86_FAMILY @@ -399,13 +411,13 @@ void SystemSnapshotLinux::ReadKernelVersion(const std::string& version_string) { return; } - if (!StringToInt(base::StringPiece(versions[0]), &os_version_major_)) { + if (!base::StringToInt(base::StringPiece(versions[0]), &os_version_major_)) { LOG(WARNING) << "no kernel version"; return; } DCHECK_GE(os_version_major_, 3); - if (!StringToInt(base::StringPiece(versions[1]), &os_version_minor_)) { + if (!base::StringToInt(base::StringPiece(versions[1]), &os_version_minor_)) { LOG(WARNING) << "no major revision"; return; } @@ -415,8 +427,8 @@ void SystemSnapshotLinux::ReadKernelVersion(const std::string& version_string) { if (minor_rev_end == std::string::npos) { minor_rev_end = versions[2].size(); } - if (!StringToInt(base::StringPiece(versions[2].c_str(), minor_rev_end), - &os_version_bugfix_)) { + if (!base::StringToInt(base::StringPiece(versions[2].c_str(), minor_rev_end), + &os_version_bugfix_)) { LOG(WARNING) << "no minor revision"; return; } diff --git a/shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux.h b/shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux.h rename to shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux.h index 4b45a451c..75dea39e0 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux.h +++ b/shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux.h @@ -89,6 +89,7 @@ class SystemSnapshotLinux final : public SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + uint64_t AddressMask() const override { return 0; } private: void ReadKernelVersion(const std::string& version_string); diff --git a/shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux_test.cc b/shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/system_snapshot_linux_test.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/system_snapshot_linux_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/linux/test_modules.cc b/shared/sentry/src/external/crashpad/snapshot/linux/test_modules.cc similarity index 97% rename from shared/sentry/external/crashpad/snapshot/linux/test_modules.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/test_modules.cc index 7d9d08d2e..c03cbaae5 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/test_modules.cc +++ b/shared/sentry/src/external/crashpad/snapshot/linux/test_modules.cc @@ -110,6 +110,13 @@ bool WriteTestModule(const base::FilePath& module_path, module.ehdr.e_machine = EM_AARCH64; #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL) module.ehdr.e_machine = EM_MIPS; +#elif defined(ARCH_CPU_RISCV64) + module.ehdr.e_machine = EM_RISCV; +#endif + +#if defined(ARCH_CPU_RISCV64) + // Crashpad supports RV64GC + module.ehdr.e_flags = EF_RISCV_RVC | EF_RISCV_FLOAT_ABI_DOUBLE; #endif module.ehdr.e_version = EV_CURRENT; diff --git a/shared/sentry/external/crashpad/snapshot/linux/test_modules.h b/shared/sentry/src/external/crashpad/snapshot/linux/test_modules.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/linux/test_modules.h rename to shared/sentry/src/external/crashpad/snapshot/linux/test_modules.h diff --git a/shared/sentry/external/crashpad/snapshot/linux/thread_snapshot_linux.cc b/shared/sentry/src/external/crashpad/snapshot/linux/thread_snapshot_linux.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/linux/thread_snapshot_linux.cc rename to shared/sentry/src/external/crashpad/snapshot/linux/thread_snapshot_linux.cc index 94945e926..6489387f2 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/thread_snapshot_linux.cc +++ b/shared/sentry/src/external/crashpad/snapshot/linux/thread_snapshot_linux.cc @@ -196,6 +196,12 @@ bool ThreadSnapshotLinux::Initialize( thread.thread_info.float_context.f32, context_.mipsel); } +#elif defined(ARCH_CPU_RISCV64) + context_.architecture = kCPUArchitectureRISCV64; + context_.riscv64 = &context_union_.riscv64; + InitializeCPUContextRISCV64(thread.thread_info.thread_context.t64, + thread.thread_info.float_context.f64, + context_.riscv64); #else #error Port. #endif diff --git a/shared/sentry/external/crashpad/snapshot/linux/thread_snapshot_linux.h b/shared/sentry/src/external/crashpad/snapshot/linux/thread_snapshot_linux.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/linux/thread_snapshot_linux.h rename to shared/sentry/src/external/crashpad/snapshot/linux/thread_snapshot_linux.h index 643ea5843..2229f7a9a 100644 --- a/shared/sentry/external/crashpad/snapshot/linux/thread_snapshot_linux.h +++ b/shared/sentry/src/external/crashpad/snapshot/linux/thread_snapshot_linux.h @@ -78,6 +78,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot { #elif defined(ARCH_CPU_MIPS_FAMILY) CPUContextMIPS mipsel; CPUContextMIPS64 mips64; +#elif defined(ARCH_CPU_RISCV64) + CPUContextRISCV64 riscv64; #else #error Port. #endif // ARCH_CPU_X86_FAMILY diff --git a/shared/sentry/external/crashpad/snapshot/mac/cpu_context_mac.cc b/shared/sentry/src/external/crashpad/snapshot/mac/cpu_context_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/cpu_context_mac.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/cpu_context_mac.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/cpu_context_mac.h b/shared/sentry/src/external/crashpad/snapshot/mac/cpu_context_mac.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/cpu_context_mac.h rename to shared/sentry/src/external/crashpad/snapshot/mac/cpu_context_mac.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/cpu_context_mac_test.cc b/shared/sentry/src/external/crashpad/snapshot/mac/cpu_context_mac_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/cpu_context_mac_test.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/cpu_context_mac_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/exception_snapshot_mac.cc b/shared/sentry/src/external/crashpad/snapshot/mac/exception_snapshot_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/exception_snapshot_mac.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/exception_snapshot_mac.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/exception_snapshot_mac.h b/shared/sentry/src/external/crashpad/snapshot/mac/exception_snapshot_mac.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/exception_snapshot_mac.h rename to shared/sentry/src/external/crashpad/snapshot/mac/exception_snapshot_mac.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.cc index 199772410..ec33779b9 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.cc +++ b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.cc @@ -71,6 +71,13 @@ void MachOImageAnnotationsReader::ReadCrashReporterClientAnnotations( const process_types::section* crash_info_section = image_reader_->GetSectionByName( SEG_DATA, "__crash_info", &crash_info_address); + + if (!crash_info_section) { + // On macOS 13, under some circumstances, `__crash_info` ends up in the + // `__DATA_DIRTY` segment. This is known to happen for `dyld`. + crash_info_section = image_reader_->GetSectionByName( + "__DATA_DIRTY", "__crash_info", &crash_info_address); + } if (!crash_info_section) { return; } diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.h b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.h rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_no_op.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_no_op.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_no_op.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_annotations_reader_test_no_op.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_reader.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_reader.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_reader.cc index 728255216..b648f7f25 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_reader.cc +++ b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_reader.cc @@ -22,6 +22,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/strings/stringprintf.h" #include "client/crashpad_info.h" diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_reader.h b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_reader.h rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_reader_test.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_reader_test.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_reader_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader.cc similarity index 93% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader.cc index 6e328f9aa..17b7bd331 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader.cc +++ b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader.cc @@ -20,6 +20,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" @@ -39,38 +40,26 @@ std::string SizeLimitedCString(const char* c_string, size_t max_length) { } // namespace bool IsMalformedCLKernelsModule(uint32_t mach_o_file_type, - const std::string& module_name, - bool* has_timestamp) { + const std::string& module_name) { #if defined(ARCH_CPU_X86_FAMILY) if (mach_o_file_type != MH_BUNDLE) { return false; } if (module_name == "cl_kernels") { - if (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 || - MacOSVersionNumber() >= 10'10'00) { - if (has_timestamp) { - *has_timestamp = false; - } - return true; - } - return false; + return __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 || + MacOSVersionNumber() >= 10'10'00; } static const char kCvmsObjectPathPrefix[] = "/private/var/db/CVMS/cvmsCodeSignObj"; - if (module_name.compare( - 0, strlen(kCvmsObjectPathPrefix), kCvmsObjectPathPrefix) == 0 && - (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 || - MacOSVersionNumber() >= 10'14'00)) { - if (has_timestamp) { - *has_timestamp = true; - } - return true; - } -#endif // ARCH_CPU_X86_FAMILY - + return module_name.compare( + 0, strlen(kCvmsObjectPathPrefix), kCvmsObjectPathPrefix) == 0 && + (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14 || + MacOSVersionNumber() >= 10'14'00); +#else return false; +#endif // ARCH_CPU_X86_FAMILY } MachOImageSegmentReader::MachOImageSegmentReader() @@ -165,9 +154,8 @@ bool MachOImageSegmentReader::Initialize(ProcessReaderMac* process_reader, // // https://openradar.appspot.com/20239912 if (section_segment_name != segment_name && - !(IsMalformedCLKernelsModule(file_type, module_name, nullptr) && - segment_name == SEG_TEXT && - section_segment_name == "__LD" && + !(IsMalformedCLKernelsModule(file_type, module_name) && + segment_name == SEG_TEXT && section_segment_name == "__LD" && section_name == "__compact_unwind" && (section.flags & S_ATTR_DEBUG))) { LOG(WARNING) << "section.segname incorrect in segment " << segment_name diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader.h b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader.h similarity index 95% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader.h rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader.h index a56652922..a4f17274f 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader.h +++ b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader.h @@ -53,18 +53,11 @@ namespace crashpad { //! \param[in] mach_o_file_type The Mach-O type of the module being examined. //! \param[in] module_name The pathname that `dyld` reported having loaded the //! module from. -//! \param[out] has_timestamp Optional, may be `nullptr`. If provided, and the -//! module is a maformed `cl_kernels` module, this will be set to `true` if -//! the module was loaded from the filesystem (as is the case when loaded -//! from the CVMS directory) and is expected to have a timestamp, and -//! `false` otherwise. Note that even when loaded from the filesystem, these -//! modules are unlinked from the filesystem after loading. //! //! \return `true` if the module appears to be a malformed `cl_kernels` module //! based on the provided information, `false` otherwise. bool IsMalformedCLKernelsModule(uint32_t mach_o_file_type, - const std::string& module_name, - bool* has_timestamp); + const std::string& module_name); //! \brief A reader for `LC_SEGMENT` or `LC_SEGMENT_64` load commands in Mach-O //! images mapped into another process. diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.cc b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.h b/shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.h rename to shared/sentry/src/external/crashpad/snapshot/mac/mach_o_image_symbol_table_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/module_snapshot_mac.cc b/shared/sentry/src/external/crashpad/snapshot/mac/module_snapshot_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/module_snapshot_mac.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/module_snapshot_mac.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/module_snapshot_mac.h b/shared/sentry/src/external/crashpad/snapshot/mac/module_snapshot_mac.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/module_snapshot_mac.h rename to shared/sentry/src/external/crashpad/snapshot/mac/module_snapshot_mac.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_reader_mac.cc b/shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac.cc similarity index 95% rename from shared/sentry/external/crashpad/snapshot/mac/process_reader_mac.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac.cc index c694eb0e7..c77c0d39e 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/process_reader_mac.cc +++ b/shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac.cc @@ -21,10 +21,11 @@ #include #include +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" +#include "base/apple/scoped_mach_vm.h" +#include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" -#include "base/mac/scoped_mach_vm.h" #include "base/strings/stringprintf.h" #include "snapshot/mac/mach_o_image_reader.h" #include "snapshot/mac/process_types.h" @@ -265,7 +266,7 @@ void ProcessReaderMac::InitializeThreads() { // loop below will leak thread port send rights. ScopedForbidReturn threads_need_owners; - base::mac::ScopedMachVM threads_vm( + base::apple::ScopedMachVM threads_vm( reinterpret_cast(threads), mach_vm_round_page(thread_count * sizeof(*threads))); @@ -509,26 +510,27 @@ void ProcessReaderMac::InitializeModules() { } if (file_type == MH_EXECUTE) { - // On Mac OS X 10.6, the main executable does not normally show up at - // index 0. This is because of how 10.6.8 dyld-132.13/src/dyld.cpp - // notifyGDB(), the function resposible for causing - // dyld_all_image_infos::infoArray to be updated, is called. It is - // registered to be called when all dependents of an image have been - // mapped (dyld_image_state_dependents_mapped), meaning that the main - // executable won’t be added to the list until all of the libraries it - // depends on are, even though dyld begins looking at the main executable - // first. This changed in later versions of dyld, including those present - // in 10.7. 10.9.4 dyld-239.4/src/dyld.cpp updateAllImages() (renamed from - // notifyGDB()) is registered to be called when an image itself has been - // mapped (dyld_image_state_mapped), regardless of the libraries that it - // depends on. + // On macOS 14, the main executable does not normally show up at + // index 0. In previous versions of dyld, each loaded image was + // appended to the all image info vector as it was loaded. + // (For example, see RuntimeState::notifyDebuggerLoad in dyld-1066.8). + // Starting from dyld-1122.1, notifyDebuggerLoad calls + // ExternallyViewableState::addImages for all but the main executable + // (which has already been added). ExternallyViewableState::addImages + // inserts all new image infos at the front of the vector, leaving the + // main executable as the last item. // // The interface requires that the main executable be first in the list, // so swap it into the right position. size_t index = modules_.size() - 1; - if (main_executable_count == 0) { - std::swap(modules_[0], modules_[index]); - } else { + if (index > 0) { + CHECK_EQ(index, image_info_vector.size() - 1); + if (main_executable_count == 0) { + std::rotate( + modules_.rbegin(), modules_.rbegin() + 1, modules_.rend()); + } + } + if (main_executable_count > 0) { LOG(WARNING) << base::StringPrintf( "multiple MH_EXECUTE modules (%s, %s)", modules_[0].name.c_str(), diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_reader_mac.h b/shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_reader_mac.h rename to shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_reader_mac_test.cc b/shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac_test.cc similarity index 89% rename from shared/sentry/external/crashpad/snapshot/mac/process_reader_mac_test.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac_test.cc index 14cf33d37..ed6992376 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/process_reader_mac_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/mac/process_reader_mac_test.cc @@ -28,11 +28,12 @@ #include #include +#include #include +#include "base/apple/mach_logging.h" #include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "base/posix/eintr_wrapper.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" @@ -54,6 +55,15 @@ namespace crashpad { namespace test { namespace { +using ModulePathAndAddress = std::pair; +struct PathAndAddressHash { + std::size_t operator()(const ModulePathAndAddress& pair) const { + return std::hash()(pair.first) ^ + std::hash()(pair.second); + } +}; +using ModuleSet = std::unordered_set; + constexpr char kDyldPath[] = "/usr/lib/dyld"; TEST(ProcessReaderMac, SelfBasic) { @@ -361,7 +371,7 @@ void ExpectSeveralThreads(ThreadMap* thread_map, // Non-main threads use the stack region to store thread data. See // macOS 12 libpthread-486.100.11 src/pthread.c _pthread_allocate(). #if defined(ARCH_CPU_ARM64) - // arm64 has an additional offset for alignment. See macOS 12 + // arm64 has an additional offset for alignment. See macOS 12 // libpthread-486.100.11 src/pthread.c _pthread_allocate() and // PTHREAD_T_OFFSET (defined in src/types_internal.h). expected_stack_region_end += sizeof(_opaque_pthread_t) + 0x3000; @@ -654,9 +664,8 @@ T GetDyldFunction(const char* symbol) { return reinterpret_cast(dlsym(dl_handle, symbol)); } -void VerifyImageExistenceAndTimestamp(const char* path, time_t timestamp) { +void VerifyImageExistence(const char* path) { const char* stat_path; - bool timestamp_may_be_0; #if __MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_16 static auto _dyld_shared_cache_contains_path = @@ -666,7 +675,7 @@ void VerifyImageExistenceAndTimestamp(const char* path, time_t timestamp) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunguarded-availability" - if (_dyld_shared_cache_contains_path && + if (&_dyld_shared_cache_contains_path && _dyld_shared_cache_contains_path(path)) { #pragma clang diagnostic pop // The timestamp will either match the timestamp of the dyld_shared_cache @@ -686,18 +695,13 @@ void VerifyImageExistenceAndTimestamp(const char* path, time_t timestamp) { }(); stat_path = dyld_shared_cache_file_path; - timestamp_may_be_0 = true; } else { stat_path = path; - timestamp_may_be_0 = false; } struct stat stat_buf; int rv = stat(stat_path, &stat_buf); EXPECT_EQ(rv, 0) << ErrnoMessage("stat"); - if (rv == 0 && (!timestamp_may_be_0 || timestamp != 0)) { - EXPECT_EQ(timestamp, stat_buf.st_mtime); - } } // cl_kernels images (OpenCL kernels) are weird. They’re not ld output and don’t @@ -839,67 +843,57 @@ TEST(ProcessReaderMac, SelfModules) { ASSERT_TRUE(process_reader.Initialize(mach_task_self())); uint32_t dyld_image_count = _dyld_image_count(); - const std::vector& modules = - process_reader.Modules(); - - // There needs to be at least an entry for the main executable, for a dylib, - // and for dyld. - ASSERT_GE(modules.size(), 3u); - - // dyld_image_count doesn’t include an entry for dyld itself, but |modules| - // does. - ASSERT_EQ(modules.size(), dyld_image_count + 1); - - bool found_cl_kernels = false; - for (uint32_t index = 0; index < dyld_image_count; ++index) { - SCOPED_TRACE(base::StringPrintf( - "index %u, name %s", index, modules[index].name.c_str())); - const char* dyld_image_name = _dyld_get_image_name(index); - EXPECT_EQ(modules[index].name, dyld_image_name); - ASSERT_TRUE(modules[index].reader); - EXPECT_EQ( - modules[index].reader->Address(), - FromPointerCast(_dyld_get_image_header(index))); - - bool expect_timestamp; - if (index == 0 && MacOSVersionNumber() < 12'00'00) { - // Pre-dyld4, dyld didn’t set the main executable's timestamp, and it was - // reported as 0. - EXPECT_EQ(modules[index].timestamp, 0); - } else if (IsMalformedCLKernelsModule(modules[index].reader->FileType(), - modules[index].name, - &expect_timestamp)) { - // cl_kernels doesn’t exist as a file, but may still have a timestamp. - if (!expect_timestamp) { - EXPECT_EQ(modules[index].timestamp, 0); - } else { - EXPECT_NE(modules[index].timestamp, 0); + std::set cl_kernel_names; + auto modules = process_reader.Modules(); + ModuleSet actual_modules; + for (size_t i = 0; i < modules.size(); ++i) { + auto& module = modules[i]; + ASSERT_TRUE(module.reader); + if (i == modules.size() - 1) { + EXPECT_EQ(module.name, kDyldPath); + const dyld_all_image_infos* dyld_image_infos = DyldGetAllImageInfos(); + if (dyld_image_infos->version >= 2) { + EXPECT_EQ(module.reader->Address(), + FromPointerCast( + dyld_image_infos->dyldImageLoadAddress)); } - found_cl_kernels = true; + // Don't include dyld, since dyld image APIs will not have an entry for + // dyld itself. + continue; + } + // Ensure executable is first, and that there's only one. + uint32_t file_type = module.reader->FileType(); + if (i == 0) { + EXPECT_EQ(file_type, static_cast(MH_EXECUTE)); } else { - // Hope that the module didn’t change on disk. - VerifyImageExistenceAndTimestamp(dyld_image_name, - modules[index].timestamp); + EXPECT_NE(file_type, static_cast(MH_EXECUTE)); } + if (IsMalformedCLKernelsModule(module.reader->FileType(), module.name)) { + cl_kernel_names.insert(module.name); + } + actual_modules.insert( + std::make_pair(module.name, module.reader->Address())); } + EXPECT_EQ(cl_kernel_names.size() > 0, + ExpectCLKernels() && ensure_cl_kernels.success()); - EXPECT_EQ(found_cl_kernels, ExpectCLKernels() && ensure_cl_kernels.success()); - - size_t index = modules.size() - 1; - EXPECT_EQ(modules[index].name, kDyldPath); - - // dyld didn’t load itself either, so it couldn’t record its timestamp, and it - // is also reported as 0. - EXPECT_EQ(modules[index].timestamp, 0); + // There needs to be at least an entry for the main executable and a dylib. + ASSERT_GE(actual_modules.size(), 2u); + ASSERT_EQ(actual_modules.size(), dyld_image_count); - const dyld_all_image_infos* dyld_image_infos = DyldGetAllImageInfos(); - if (dyld_image_infos->version >= 2) { - ASSERT_TRUE(modules[index].reader); - EXPECT_EQ(modules[index].reader->Address(), - FromPointerCast( - dyld_image_infos->dyldImageLoadAddress)); + ModuleSet expect_modules; + for (uint32_t index = 0; index < dyld_image_count; ++index) { + const char* dyld_image_name = _dyld_get_image_name(index); + mach_vm_address_t dyld_image_address = + FromPointerCast(_dyld_get_image_header(index)); + expect_modules.insert( + std::make_pair(std::string(dyld_image_name), dyld_image_address)); + if (cl_kernel_names.find(dyld_image_name) == cl_kernel_names.end()) { + VerifyImageExistence(dyld_image_name); + } } + EXPECT_EQ(actual_modules, expect_modules); } class ProcessReaderModulesChild final : public MachMultiprocess { @@ -918,27 +912,45 @@ class ProcessReaderModulesChild final : public MachMultiprocess { void MachMultiprocessParent() override { ProcessReaderMac process_reader; ASSERT_TRUE(process_reader.Initialize(ChildTask())); - const std::vector& modules = process_reader.Modules(); + ModuleSet actual_modules; + std::set cl_kernel_names; + for (size_t i = 0; i < modules.size(); ++i) { + auto& module = modules[i]; + ASSERT_TRUE(module.reader); + uint32_t file_type = module.reader->FileType(); + if (i == 0) { + EXPECT_EQ(file_type, static_cast(MH_EXECUTE)); + } else if (i == modules.size() - 1) { + EXPECT_EQ(file_type, static_cast(MH_DYLINKER)); + + } else { + EXPECT_NE(file_type, static_cast(MH_EXECUTE)); + EXPECT_NE(file_type, static_cast(MH_DYLINKER)); + } + if (IsMalformedCLKernelsModule(module.reader->FileType(), module.name)) { + cl_kernel_names.insert(module.name); + } + actual_modules.insert( + std::make_pair(module.name, module.reader->Address())); + } + // There needs to be at least an entry for the main executable, for a dylib, // and for dyld. - ASSERT_GE(modules.size(), 3u); + ASSERT_GE(actual_modules.size(), 3u); FileHandle read_handle = ReadPipeHandle(); - uint32_t expect_modules; + uint32_t expect_modules_size; CheckedReadFileExactly( - read_handle, &expect_modules, sizeof(expect_modules)); - - ASSERT_EQ(modules.size(), expect_modules); + read_handle, &expect_modules_size, sizeof(expect_modules_size)); - bool found_cl_kernels = false; - for (size_t index = 0; index < modules.size(); ++index) { - SCOPED_TRACE(base::StringPrintf( - "index %zu, name %s", index, modules[index].name.c_str())); + ASSERT_EQ(actual_modules.size(), expect_modules_size); + ModuleSet expect_modules; + for (size_t index = 0; index < expect_modules_size; ++index) { uint32_t expect_name_length; CheckedReadFileExactly( read_handle, &expect_name_length, sizeof(expect_name_length)); @@ -946,40 +958,18 @@ class ProcessReaderModulesChild final : public MachMultiprocess { // The NUL terminator is not read. std::string expect_name(expect_name_length, '\0'); CheckedReadFileExactly(read_handle, &expect_name[0], expect_name_length); - EXPECT_EQ(modules[index].name, expect_name); mach_vm_address_t expect_address; CheckedReadFileExactly( read_handle, &expect_address, sizeof(expect_address)); - ASSERT_TRUE(modules[index].reader); - EXPECT_EQ(modules[index].reader->Address(), expect_address); - - bool expect_timestamp; - if ((index == 0 && MacOSVersionNumber() < 12'00'00) || - index == modules.size() - 1) { - // Pre-dyld4, dyld didn’t set the main executable's timestamp, and it - // was reported as 0. - // The last module is dyld. - EXPECT_EQ(modules[index].timestamp, 0); - } else if (IsMalformedCLKernelsModule(modules[index].reader->FileType(), - modules[index].name, - &expect_timestamp)) { - // cl_kernels doesn’t exist as a file, but may still have a timestamp. - if (!expect_timestamp) { - EXPECT_EQ(modules[index].timestamp, 0); - } else { - EXPECT_NE(modules[index].timestamp, 0); - } - found_cl_kernels = true; - } else { - // Hope that the module didn’t change on disk. - VerifyImageExistenceAndTimestamp(expect_name.c_str(), - modules[index].timestamp); + expect_modules.insert(std::make_pair(expect_name, expect_address)); + if (cl_kernel_names.find(expect_name) == cl_kernel_names.end()) { + VerifyImageExistence(expect_name.c_str()); } } - - EXPECT_EQ(found_cl_kernels, + EXPECT_EQ(cl_kernel_names.size() > 0, ExpectCLKernels() && ensure_cl_kernels_success_); + EXPECT_EQ(expect_modules, actual_modules); } void MachMultiprocessChild() override { diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_snapshot_mac.cc b/shared/sentry/src/external/crashpad/snapshot/mac/process_snapshot_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_snapshot_mac.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/process_snapshot_mac.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_snapshot_mac.h b/shared/sentry/src/external/crashpad/snapshot/mac/process_snapshot_mac.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_snapshot_mac.h rename to shared/sentry/src/external/crashpad/snapshot/mac/process_snapshot_mac.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types.cc b/shared/sentry/src/external/crashpad/snapshot/mac/process_types.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types.h b/shared/sentry/src/external/crashpad/snapshot/mac/process_types.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types.h rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/all.proctype b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/all.proctype similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/all.proctype rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/all.proctype diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/annotation.proctype b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/annotation.proctype similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/annotation.proctype rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/annotation.proctype diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/crashpad_info.proctype b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/crashpad_info.proctype similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/crashpad_info.proctype rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/crashpad_info.proctype diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/crashreporterclient.proctype b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/crashreporterclient.proctype similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/crashreporterclient.proctype rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/crashreporterclient.proctype diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/custom.cc b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/custom.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/custom.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/custom.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/dyld_images.proctype b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/dyld_images.proctype similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/dyld_images.proctype rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/dyld_images.proctype diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/flavors.h b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/flavors.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/flavors.h rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/flavors.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/internal.h b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/internal.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/internal.h rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/internal.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/loader.proctype b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/loader.proctype similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/loader.proctype rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/loader.proctype diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/nlist.proctype b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/nlist.proctype similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/nlist.proctype rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/nlist.proctype diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types/traits.h b/shared/sentry/src/external/crashpad/snapshot/mac/process_types/traits.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types/traits.h rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types/traits.h diff --git a/shared/sentry/external/crashpad/snapshot/mac/process_types_test.cc b/shared/sentry/src/external/crashpad/snapshot/mac/process_types_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/process_types_test.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/process_types_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac.cc b/shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac.cc index 00d777e48..334627ffe 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac.cc +++ b/shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac.cc @@ -86,7 +86,6 @@ SystemSnapshotMac::SystemSnapshotMac() os_version_major_(0), os_version_minor_(0), os_version_bugfix_(0), - os_server_(false), initialized_() { } @@ -107,7 +106,6 @@ void SystemSnapshotMac::Initialize(ProcessReaderMac* process_reader, &os_version_minor_, &os_version_bugfix_, &os_version_build_, - &os_server_, &os_version_string); std::string uname_string; @@ -304,7 +302,7 @@ SystemSnapshot::OperatingSystem SystemSnapshotMac::GetOperatingSystem() const { bool SystemSnapshotMac::OSServer() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return os_server_; + return false; } void SystemSnapshotMac::OSVersion(int* major, @@ -390,5 +388,19 @@ void SystemSnapshotMac::TimeZone(DaylightSavingTimeStatus* dst_status, daylight_name); } +uint64_t SystemSnapshotMac::AddressMask() const { + uint64_t mask = 0; +#if defined(ARCH_CPU_ARM64) + // `machdep.virtual_address_size` is the number of addressable bits in + // userspace virtual addresses + uint8_t addressable_bits = + CastIntSysctlByName("machdep.virtual_address_size", 0); + if (addressable_bits) { + mask = ~((1UL << addressable_bits) - 1); + } +#endif + return mask; +} + } // namespace internal } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac.h b/shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac.h rename to shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac.h index 047ad2b7d..275ae5fec 100644 --- a/shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac.h +++ b/shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac.h @@ -83,6 +83,7 @@ class SystemSnapshotMac final : public SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + uint64_t AddressMask() const override; private: std::string os_version_full_; @@ -92,7 +93,6 @@ class SystemSnapshotMac final : public SystemSnapshot { int os_version_major_; int os_version_minor_; int os_version_bugfix_; - bool os_server_; InitializationStateDcheck initialized_; }; diff --git a/shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac_test.cc b/shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/system_snapshot_mac_test.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/system_snapshot_mac_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/thread_snapshot_mac.cc b/shared/sentry/src/external/crashpad/snapshot/mac/thread_snapshot_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/thread_snapshot_mac.cc rename to shared/sentry/src/external/crashpad/snapshot/mac/thread_snapshot_mac.cc diff --git a/shared/sentry/external/crashpad/snapshot/mac/thread_snapshot_mac.h b/shared/sentry/src/external/crashpad/snapshot/mac/thread_snapshot_mac.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/mac/thread_snapshot_mac.h rename to shared/sentry/src/external/crashpad/snapshot/mac/thread_snapshot_mac.h diff --git a/shared/sentry/external/crashpad/snapshot/memory_map_region_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/memory_map_region_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/memory_map_region_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/memory_map_region_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/memory_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/memory_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/memory_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/memory_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/memory_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/memory_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/memory_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/memory_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/memory_snapshot_generic.h b/shared/sentry/src/external/crashpad/snapshot/memory_snapshot_generic.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/memory_snapshot_generic.h rename to shared/sentry/src/external/crashpad/snapshot/memory_snapshot_generic.h diff --git a/shared/sentry/external/crashpad/snapshot/memory_snapshot_test.cc b/shared/sentry/src/external/crashpad/snapshot/memory_snapshot_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/memory_snapshot_test.cc rename to shared/sentry/src/external/crashpad/snapshot/memory_snapshot_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/minidump/exception_snapshot_minidump.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/exception_snapshot_minidump.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/exception_snapshot_minidump.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/exception_snapshot_minidump.cc diff --git a/shared/sentry/external/crashpad/snapshot/minidump/exception_snapshot_minidump.h b/shared/sentry/src/external/crashpad/snapshot/minidump/exception_snapshot_minidump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/exception_snapshot_minidump.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/exception_snapshot_minidump.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/memory_snapshot_minidump.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/memory_snapshot_minidump.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/memory_snapshot_minidump.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/memory_snapshot_minidump.cc diff --git a/shared/sentry/external/crashpad/snapshot/minidump/memory_snapshot_minidump.h b/shared/sentry/src/external/crashpad/snapshot/minidump/memory_snapshot_minidump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/memory_snapshot_minidump.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/memory_snapshot_minidump.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_annotation_reader.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_annotation_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_annotation_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_annotation_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_annotation_reader.h b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_annotation_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_annotation_reader.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_annotation_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_context_converter.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_context_converter.cc similarity index 90% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_context_converter.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_context_converter.cc index f2fa2ab37..ec02dff12 100644 --- a/shared/sentry/external/crashpad/snapshot/minidump/minidump_context_converter.cc +++ b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_context_converter.cc @@ -266,6 +266,33 @@ bool MinidumpContextConverter::Initialize( context_.mips64->fir = src->fir; memcpy(&context_.mips64->fpregs, &src->fpregs, sizeof(src->fpregs)); + } else if (context_.architecture == + CPUArchitecture::kCPUArchitectureRISCV64) { + context_memory_.resize(sizeof(CPUContextRISCV64)); + context_.riscv64 = + reinterpret_cast(context_memory_.data()); + const MinidumpContextRISCV64* src = + reinterpret_cast( + minidump_context.data()); + if (minidump_context.size() < sizeof(MinidumpContextRISCV64)) { + return false; + } + + if (!(src->context_flags & kMinidumpContextRISCV64)) { + return false; + } + + context_.riscv64->pc = src->pc; + + static_assert(sizeof(context_.riscv64->regs) == sizeof(src->regs), + "GPR size mismatch"); + memcpy(&context_.riscv64->regs, &src->regs, sizeof(src->regs)); + + static_assert(sizeof(context_.riscv64->fpregs) == sizeof(src->fpregs), + "FPR size mismatch"); + memcpy(&context_.riscv64->fpregs, &src->fpregs, sizeof(src->fpregs)); + + context_.riscv64->fcsr = src->fcsr; } else { // Architecture is listed as "unknown". DLOG(ERROR) << "Unknown architecture"; diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_context_converter.h b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_context_converter.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_context_converter.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_context_converter.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.h b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_simple_string_dictionary_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_stream.h b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_stream.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_stream.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_stream.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_string_list_reader.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_list_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_string_list_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_list_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_string_list_reader.h b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_list_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_string_list_reader.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_list_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_string_reader.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_string_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/minidump/minidump_string_reader.h b/shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/minidump_string_reader.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/minidump_string_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/module_snapshot_minidump.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/module_snapshot_minidump.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/minidump/module_snapshot_minidump.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/module_snapshot_minidump.cc index 43229e7aa..50e5ea859 100644 --- a/shared/sentry/external/crashpad/snapshot/minidump/module_snapshot_minidump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/minidump/module_snapshot_minidump.cc @@ -17,6 +17,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/notreached.h" #include "minidump/minidump_extensions.h" diff --git a/shared/sentry/external/crashpad/snapshot/minidump/module_snapshot_minidump.h b/shared/sentry/src/external/crashpad/snapshot/minidump/module_snapshot_minidump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/module_snapshot_minidump.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/module_snapshot_minidump.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump.cc similarity index 94% rename from shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump.cc index 04fc27118..03f321719 100644 --- a/shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump.cc @@ -266,7 +266,10 @@ bool ProcessSnapshotMinidump::InitializeCrashpadInfo() { return true; } - if (stream_it->second->DataSize < sizeof(crashpad_info_)) { + constexpr size_t crashpad_info_min_size = + offsetof(decltype(crashpad_info_), reserved); + size_t remaining_data_size = stream_it->second->DataSize; + if (remaining_data_size < crashpad_info_min_size) { LOG(ERROR) << "crashpad_info size mismatch"; return false; } @@ -275,9 +278,34 @@ bool ProcessSnapshotMinidump::InitializeCrashpadInfo() { return false; } - if (!file_reader_->ReadExactly(&crashpad_info_, sizeof(crashpad_info_))) { + if (!file_reader_->ReadExactly(&crashpad_info_, crashpad_info_min_size)) { return false; } + remaining_data_size -= crashpad_info_min_size; + + // Read `reserved` if available. + size_t crashpad_reserved_size = sizeof(crashpad_info_.reserved); + if (remaining_data_size >= crashpad_reserved_size) { + if (!file_reader_->ReadExactly(&crashpad_info_.reserved, + crashpad_reserved_size)) { + return false; + } + remaining_data_size -= crashpad_reserved_size; + } else { + crashpad_info_.reserved = 0; + } + + // Read `address_mask` if available. + size_t crashpad_address_mask_size = sizeof(crashpad_info_.address_mask); + if (remaining_data_size >= crashpad_address_mask_size) { + if (!file_reader_->ReadExactly(&crashpad_info_.address_mask, + crashpad_address_mask_size)) { + return false; + } + remaining_data_size -= crashpad_address_mask_size; + } else { + crashpad_info_.address_mask = 0; + } if (crashpad_info_.version != MinidumpCrashpadInfo::kVersion) { LOG(ERROR) << "crashpad_info version mismatch"; @@ -318,7 +346,7 @@ bool ProcessSnapshotMinidump::InitializeMiscInfo() { switch (stream_it->second->DataSize) { case sizeof(MINIDUMP_MISC_INFO_5): case sizeof(MINIDUMP_MISC_INFO_4): -#if defined(WCHAR_T_IS_UTF16) +#if defined(WCHAR_T_IS_16_BIT) full_version_ = base::WideToUTF8(info.BuildString); #else full_version_ = base::UTF16ToUTF8(info.BuildString); diff --git a/shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump.h b/shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump.h diff --git a/shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc similarity index 97% rename from shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc index 406936415..31e304c2b 100644 --- a/shared/sentry/external/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc @@ -270,6 +270,47 @@ TEST(ProcessSnapshotMinidump, ClientID) { EXPECT_TRUE(process_snapshot.AnnotationsSimpleMap().empty()); } +TEST(ProcessSnapshotMinidump, ReadOldCrashpadInfo) { + StringFile string_file; + + MINIDUMP_HEADER header = {}; + EXPECT_TRUE(string_file.Write(&header, sizeof(header))); + + UUID client_id; + ASSERT_TRUE( + client_id.InitializeFromString("0001f4a9-d00d-5155-0a55-c0ffeec0ffee")); + + MinidumpCrashpadInfo crashpad_info = {}; + crashpad_info.version = MinidumpCrashpadInfo::kVersion; + crashpad_info.client_id = client_id; + + MINIDUMP_DIRECTORY crashpad_info_directory = {}; + crashpad_info_directory.StreamType = kMinidumpStreamTypeCrashpadInfo; + crashpad_info_directory.Location.Rva = + static_cast(string_file.SeekGet()); + EXPECT_TRUE(string_file.Write(&crashpad_info, sizeof(crashpad_info) - 8)); + crashpad_info_directory.Location.DataSize = sizeof(crashpad_info) - 8; + + header.StreamDirectoryRva = static_cast(string_file.SeekGet()); + EXPECT_TRUE(string_file.Write(&crashpad_info_directory, + sizeof(crashpad_info_directory))); + + header.Signature = MINIDUMP_SIGNATURE; + header.Version = MINIDUMP_VERSION; + header.NumberOfStreams = 1; + EXPECT_TRUE(string_file.SeekSet(0)); + EXPECT_TRUE(string_file.Write(&header, sizeof(header))); + + ProcessSnapshotMinidump process_snapshot; + EXPECT_TRUE(process_snapshot.Initialize(&string_file)); + + UUID actual_client_id; + process_snapshot.ClientID(&actual_client_id); + EXPECT_EQ(actual_client_id, client_id); + + EXPECT_TRUE(process_snapshot.AnnotationsSimpleMap().empty()); +} + TEST(ProcessSnapshotMinidump, AnnotationsSimpleMap) { StringFile string_file; @@ -827,8 +868,9 @@ TEST(ProcessSnapshotMinidump, ThreadsWithNames) { } TEST(ProcessSnapshotMinidump, System) { - const char* cpu_info = "GenuineIntel"; - const uint32_t* cpu_info_bytes = reinterpret_cast(cpu_info); + const char cpu_info[] = "GenuineIntel"; + uint32_t cpu_info_bytes[3]; + memcpy(cpu_info_bytes, cpu_info, sizeof(cpu_info_bytes)); StringFile string_file; MINIDUMP_HEADER header = {}; diff --git a/shared/sentry/external/crashpad/snapshot/minidump/system_snapshot_minidump.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/system_snapshot_minidump.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/minidump/system_snapshot_minidump.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/system_snapshot_minidump.cc index e6007b1e9..58bd7b364 100644 --- a/shared/sentry/external/crashpad/snapshot/minidump/system_snapshot_minidump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/minidump/system_snapshot_minidump.cc @@ -68,6 +68,8 @@ CPUArchitecture SystemSnapshotMinidump::GetCPUArchitecture() const { case kMinidumpCPUArchitectureMIPS: return kCPUArchitectureMIPSEL; // No word on how MIPS64 is signalled + case kMinidumpCPUArchitectureRISCV64Breakpad: + return kCPUArchitectureRISCV64; default: return CPUArchitecture::kCPUArchitectureUnknown; @@ -195,5 +197,11 @@ void SystemSnapshotMinidump::TimeZone(DaylightSavingTimeStatus* dst_status, NOTREACHED(); // https://crashpad.chromium.org/bug/10 } +uint64_t SystemSnapshotMinidump::AddressMask() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + NOTREACHED(); // https://crashpad.chromium.org/bug/10 + return 0; +} + } // namespace internal } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/minidump/system_snapshot_minidump.h b/shared/sentry/src/external/crashpad/snapshot/minidump/system_snapshot_minidump.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/minidump/system_snapshot_minidump.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/system_snapshot_minidump.h index 6b12ab990..aff425821 100644 --- a/shared/sentry/external/crashpad/snapshot/minidump/system_snapshot_minidump.h +++ b/shared/sentry/src/external/crashpad/snapshot/minidump/system_snapshot_minidump.h @@ -74,6 +74,7 @@ class SystemSnapshotMinidump : public SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + uint64_t AddressMask() const override; private: MINIDUMP_SYSTEM_INFO minidump_system_info_; diff --git a/shared/sentry/external/crashpad/snapshot/minidump/thread_snapshot_minidump.cc b/shared/sentry/src/external/crashpad/snapshot/minidump/thread_snapshot_minidump.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/minidump/thread_snapshot_minidump.cc rename to shared/sentry/src/external/crashpad/snapshot/minidump/thread_snapshot_minidump.cc index babf4c631..10e8f485a 100644 --- a/shared/sentry/external/crashpad/snapshot/minidump/thread_snapshot_minidump.cc +++ b/shared/sentry/src/external/crashpad/snapshot/minidump/thread_snapshot_minidump.cc @@ -17,7 +17,8 @@ #include #include -#include "base/cxx17_backports.h" +#include + #include "minidump/minidump_context.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/snapshot/minidump/thread_snapshot_minidump.h b/shared/sentry/src/external/crashpad/snapshot/minidump/thread_snapshot_minidump.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/minidump/thread_snapshot_minidump.h rename to shared/sentry/src/external/crashpad/snapshot/minidump/thread_snapshot_minidump.h diff --git a/shared/sentry/external/crashpad/snapshot/module_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/module_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/module_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/module_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/posix/timezone.cc b/shared/sentry/src/external/crashpad/snapshot/posix/timezone.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/posix/timezone.cc rename to shared/sentry/src/external/crashpad/snapshot/posix/timezone.cc diff --git a/shared/sentry/external/crashpad/snapshot/posix/timezone.h b/shared/sentry/src/external/crashpad/snapshot/posix/timezone.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/posix/timezone.h rename to shared/sentry/src/external/crashpad/snapshot/posix/timezone.h diff --git a/shared/sentry/external/crashpad/snapshot/posix/timezone_test.cc b/shared/sentry/src/external/crashpad/snapshot/posix/timezone_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/posix/timezone_test.cc rename to shared/sentry/src/external/crashpad/snapshot/posix/timezone_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/process_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/process_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/process_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/process_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.cc b/shared/sentry/src/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.cc similarity index 94% rename from shared/sentry/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.cc rename to shared/sentry/src/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.cc index b4f9ba42b..58bcdde42 100644 --- a/shared/sentry/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.cc +++ b/shared/sentry/src/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.cc @@ -16,6 +16,8 @@ #include +#include "util/linux/pac_helper.h" + namespace crashpad { namespace internal { @@ -62,8 +64,9 @@ class MemorySanitizer : public MemorySnapshot::Delegate { auto words = reinterpret_cast(static_cast(data) + aligned_offset); for (size_t index = 0; index < word_count; ++index) { - if (words[index] > MemorySnapshotSanitized::kSmallWordMax && - !ranges_->Contains(words[index])) { + auto word = StripPACBits(words[index]); + if (word > MemorySnapshotSanitized::kSmallWordMax && + !ranges_->Contains(word)) { words[index] = defaced; } } diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.h b/shared/sentry/src/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.h rename to shared/sentry/src/external/crashpad/snapshot/sanitized/memory_snapshot_sanitized.h diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc b/shared/sentry/src/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc similarity index 98% rename from shared/sentry/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc rename to shared/sentry/src/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc index 192b4cb10..0ad2ee975 100644 --- a/shared/sentry/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc +++ b/shared/sentry/src/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.cc @@ -14,6 +14,8 @@ #include "snapshot/sanitized/module_snapshot_sanitized.h" +#include "base/strings/pattern.h" + namespace crashpad { namespace internal { @@ -22,7 +24,7 @@ namespace { bool KeyIsAllowed(const std::string& name, const std::vector& allowed_keys) { for (const auto& key : allowed_keys) { - if (name == key) { + if (base::MatchPattern(name, key)) { return true; } } diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.h b/shared/sentry/src/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.h rename to shared/sentry/src/external/crashpad/snapshot/sanitized/module_snapshot_sanitized.h diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.cc b/shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.cc similarity index 98% rename from shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.cc rename to shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.cc index 1e0037064..afa1c9f84 100644 --- a/shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.cc +++ b/shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.cc @@ -17,6 +17,7 @@ #include #include "snapshot/cpu_context.h" +#include "util/linux/pac_helper.h" #include "util/numeric/safe_assignment.h" namespace crashpad { @@ -61,7 +62,8 @@ class StackReferencesAddressRange : public MemorySnapshot::Delegate { aligned_sp_offset); size_t word_count = (size - aligned_sp_offset) / sizeof(Pointer); for (size_t index = 0; index < word_count; ++index) { - if (words[index] >= low_ && words[index] < high_) { + auto word = StripPACBits(words[index]); + if (word >= low_ && word < high_) { return true; } } diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.h b/shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.h rename to shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.h index c5dfa4a0a..af65fb680 100644 --- a/shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.h +++ b/shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized.h @@ -53,6 +53,7 @@ class ProcessSnapshotSanitized final : public ProcessSnapshot { //! \param[in] allowed_annotations A list of annotations names to allow to //! be returned by AnnotationsSimpleMap() or from this object's module //! snapshots. If `nullptr`, all annotations will be returned. + // These annotation names support pattern matching, eg: "switch-*" //! \param[in] allowed_memory_ranges A list of memory ranges to allow to be //! accessible via Memory(), or `nullptr` to allow all ranges. //! \param[in] target_module_address An address in the target process' diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc b/shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc similarity index 94% rename from shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc rename to shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc index ba1272b5c..329c3c760 100644 --- a/shared/sentry/external/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc @@ -79,6 +79,8 @@ class ExceptionGenerator { }; constexpr char kAllowedAnnotationName[] = "name_of_allowed_anno"; +constexpr char kAllowedAnnotationNamePattern[] = "name_of_another_*"; +constexpr char kAllowedAnnotationNamePatternActual[] = "name_of_another_anno"; constexpr char kAllowedAnnotationValue[] = "some_value"; constexpr char kNonAllowedAnnotationName[] = "non_allowed_anno"; constexpr char kNonAllowedAnnotationValue[] = "private_annotation"; @@ -99,6 +101,10 @@ void ChildTestFunction() { static StringAnnotation<32> allowed_annotation(kAllowedAnnotationName); allowed_annotation.Set(kAllowedAnnotationValue); + static StringAnnotation<32> allowed_matched_annotation( + kAllowedAnnotationNamePatternActual); + allowed_matched_annotation.Set(kAllowedAnnotationValue); + static StringAnnotation<32> non_allowed_annotation(kNonAllowedAnnotationName); non_allowed_annotation.Set(kNonAllowedAnnotationValue); @@ -129,11 +135,15 @@ CRASHPAD_CHILD_TEST_MAIN(ChildToBeSanitized) { void ExpectAnnotations(ProcessSnapshot* snapshot, bool sanitized) { bool found_allowed = false; + bool found_matched_allowed = false; bool found_non_allowed = false; for (auto module : snapshot->Modules()) { for (const auto& anno : module->AnnotationObjects()) { if (anno.name == kAllowedAnnotationName) { found_allowed = true; + } + if (anno.name == kAllowedAnnotationNamePatternActual) { + found_matched_allowed = true; } else if (anno.name == kNonAllowedAnnotationName) { found_non_allowed = true; } @@ -141,6 +151,7 @@ void ExpectAnnotations(ProcessSnapshot* snapshot, bool sanitized) { } EXPECT_TRUE(found_allowed); + EXPECT_TRUE(found_matched_allowed); if (sanitized) { EXPECT_FALSE(found_non_allowed); } else { @@ -279,6 +290,7 @@ class SanitizeTest : public MultiprocessExec { auto allowed_annotations = std::make_unique>(); allowed_annotations->push_back(kAllowedAnnotationName); + allowed_annotations->push_back(kAllowedAnnotationNamePattern); auto allowed_memory_ranges = std::make_unique>>(); diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/sanitization_information.cc b/shared/sentry/src/external/crashpad/snapshot/sanitized/sanitization_information.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/sanitized/sanitization_information.cc rename to shared/sentry/src/external/crashpad/snapshot/sanitized/sanitization_information.cc diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/sanitization_information.h b/shared/sentry/src/external/crashpad/snapshot/sanitized/sanitization_information.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/sanitized/sanitization_information.h rename to shared/sentry/src/external/crashpad/snapshot/sanitized/sanitization_information.h diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/sanitization_information_test.cc b/shared/sentry/src/external/crashpad/snapshot/sanitized/sanitization_information_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/sanitized/sanitization_information_test.cc rename to shared/sentry/src/external/crashpad/snapshot/sanitized/sanitization_information_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.cc b/shared/sentry/src/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.cc rename to shared/sentry/src/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.cc diff --git a/shared/sentry/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.h b/shared/sentry/src/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.h rename to shared/sentry/src/external/crashpad/snapshot/sanitized/thread_snapshot_sanitized.h diff --git a/shared/sentry/external/crashpad/snapshot/snapshot_constants.h b/shared/sentry/src/external/crashpad/snapshot/snapshot_constants.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/snapshot_constants.h rename to shared/sentry/src/external/crashpad/snapshot/snapshot_constants.h diff --git a/shared/sentry/external/crashpad/snapshot/system_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/system_snapshot.h similarity index 94% rename from shared/sentry/external/crashpad/snapshot/system_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/system_snapshot.h index bec638cd1..a1186edb4 100644 --- a/shared/sentry/external/crashpad/snapshot/system_snapshot.h +++ b/shared/sentry/src/external/crashpad/snapshot/system_snapshot.h @@ -275,6 +275,20 @@ class SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const = 0; + + //! \brief Returns a mask indicating the range of valid addresses for a + //! pointer. + //! + //! ARM64 supports storing pointer authentication codes in the upper bits of + //! a pointer. This mask is generated based on the number of bits in a pointer + //! reserved for the authentication codes. To recover an address from pointer + //! with an authentication code, `AND` this mask with the pointer. If the pac + //! sign extension bit is set, instead `~` and `OR` this mask with the + //! pointer. + //! + //! If the platform does not support pointer authentication, or the range of + //! valid addressees for a pointer was inaccessible, this field will be 0. + virtual uint64_t AddressMask() const = 0; }; } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/test/test_cpu_context.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_cpu_context.cc similarity index 94% rename from shared/sentry/external/crashpad/snapshot/test/test_cpu_context.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_cpu_context.cc index 7efbf5af8..998229466 100644 --- a/shared/sentry/external/crashpad/snapshot/test/test_cpu_context.cc +++ b/shared/sentry/src/external/crashpad/snapshot/test/test_cpu_context.cc @@ -295,5 +295,27 @@ void InitializeCPUContextMIPS64(CPUContext* context, uint32_t seed) { mips64->dsp_control = value++; } +void InitializeCPUContextRISCV64(CPUContext* context, uint32_t seed) { + context->architecture = kCPUArchitectureRISCV64; + CPUContextRISCV64* riscv64 = context->riscv64; + + if (seed == 0) { + memset(riscv64, 0, sizeof(*riscv64)); + return; + } + + uint32_t value = seed; + + riscv64->pc = value++; + for (size_t index = 0; index < std::size(riscv64->regs); ++index) { + riscv64->regs[index] = value++; + } + + for (size_t index = 0; index < std::size(riscv64->fpregs); ++index) { + riscv64->fpregs[index] = value++; + } + riscv64->fcsr = value++; +} + } // namespace test } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/test/test_cpu_context.h b/shared/sentry/src/external/crashpad/snapshot/test/test_cpu_context.h similarity index 97% rename from shared/sentry/external/crashpad/snapshot/test/test_cpu_context.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_cpu_context.h index e4372ceed..053dec28b 100644 --- a/shared/sentry/external/crashpad/snapshot/test/test_cpu_context.h +++ b/shared/sentry/src/external/crashpad/snapshot/test/test_cpu_context.h @@ -63,6 +63,7 @@ void InitializeCPUContextARM(CPUContext* context, uint32_t seed); void InitializeCPUContextARM64(CPUContext* context, uint32_t seed); void InitializeCPUContextMIPS(CPUContext* context, uint32_t seed); void InitializeCPUContextMIPS64(CPUContext* context, uint32_t seed); +void InitializeCPUContextRISCV64(CPUContext* context, uint32_t seed); //! \} } // namespace test diff --git a/shared/sentry/external/crashpad/snapshot/test/test_exception_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_exception_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_exception_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_exception_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/test/test_exception_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/test/test_exception_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_exception_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_exception_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/test/test_memory_map_region_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_memory_map_region_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_memory_map_region_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_memory_map_region_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/test/test_memory_map_region_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/test/test_memory_map_region_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_memory_map_region_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_memory_map_region_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/test/test_memory_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_memory_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_memory_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_memory_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/test/test_memory_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/test/test_memory_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_memory_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_memory_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/test/test_module_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_module_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_module_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_module_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/test/test_module_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/test/test_module_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_module_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_module_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/test/test_process_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_process_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_process_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_process_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/test/test_process_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/test/test_process_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_process_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_process_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/test/test_system_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_system_snapshot.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/test/test_system_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_system_snapshot.cc index 604375993..a46bce12c 100644 --- a/shared/sentry/external/crashpad/snapshot/test/test_system_snapshot.cc +++ b/shared/sentry/src/external/crashpad/snapshot/test/test_system_snapshot.cc @@ -36,14 +36,14 @@ TestSystemSnapshot::TestSystemSnapshot() os_version_bugfix_(0), os_version_build_(), os_version_full_(), + address_mask_(0), nx_enabled_(false), machine_description_(), time_zone_dst_status_(kDoesNotObserveDaylightSavingTime), time_zone_standard_offset_seconds_(0), time_zone_daylight_offset_seconds_(0), time_zone_standard_name_(), - time_zone_daylight_name_() { -} + time_zone_daylight_name_() {} TestSystemSnapshot::~TestSystemSnapshot() { } @@ -130,5 +130,9 @@ void TestSystemSnapshot::TimeZone(DaylightSavingTimeStatus* dst_status, *daylight_name = time_zone_daylight_name_; } +uint64_t TestSystemSnapshot::AddressMask() const { + return address_mask_; +} + } // namespace test } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/test/test_system_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/test/test_system_snapshot.h similarity index 97% rename from shared/sentry/external/crashpad/snapshot/test/test_system_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_system_snapshot.h index fefe61fa9..89cd8413f 100644 --- a/shared/sentry/external/crashpad/snapshot/test/test_system_snapshot.h +++ b/shared/sentry/src/external/crashpad/snapshot/test/test_system_snapshot.h @@ -90,6 +90,8 @@ class TestSystemSnapshot final : public SystemSnapshot { time_zone_daylight_name_ = daylight_name; } + void SetAddressMask(uint64_t mask) { address_mask_ = mask; } + // SystemSnapshot: CPUArchitecture GetCPUArchitecture() const override; @@ -114,6 +116,7 @@ class TestSystemSnapshot final : public SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + uint64_t AddressMask() const override; private: CPUArchitecture cpu_architecture_; @@ -134,6 +137,7 @@ class TestSystemSnapshot final : public SystemSnapshot { int os_version_bugfix_; std::string os_version_build_; std::string os_version_full_; + uint64_t address_mask_; bool nx_enabled_; std::string machine_description_; DaylightSavingTimeStatus time_zone_dst_status_; diff --git a/shared/sentry/external/crashpad/snapshot/test/test_thread_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/test/test_thread_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_thread_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/test/test_thread_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/test/test_thread_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/test/test_thread_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/test/test_thread_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/test/test_thread_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/thread_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/thread_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/thread_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/thread_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/unloaded_module_snapshot.cc b/shared/sentry/src/external/crashpad/snapshot/unloaded_module_snapshot.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/unloaded_module_snapshot.cc rename to shared/sentry/src/external/crashpad/snapshot/unloaded_module_snapshot.cc diff --git a/shared/sentry/external/crashpad/snapshot/unloaded_module_snapshot.h b/shared/sentry/src/external/crashpad/snapshot/unloaded_module_snapshot.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/unloaded_module_snapshot.h rename to shared/sentry/src/external/crashpad/snapshot/unloaded_module_snapshot.h diff --git a/shared/sentry/external/crashpad/snapshot/win/capture_memory_delegate_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/capture_memory_delegate_win.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/capture_memory_delegate_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/capture_memory_delegate_win.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/capture_memory_delegate_win.h b/shared/sentry/src/external/crashpad/snapshot/win/capture_memory_delegate_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/capture_memory_delegate_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/capture_memory_delegate_win.h diff --git a/shared/sentry/external/crashpad/snapshot/win/cpu_context_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/cpu_context_win.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/cpu_context_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/cpu_context_win.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/cpu_context_win.h b/shared/sentry/src/external/crashpad/snapshot/win/cpu_context_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/cpu_context_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/cpu_context_win.h diff --git a/shared/sentry/external/crashpad/snapshot/win/cpu_context_win_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/cpu_context_win_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/cpu_context_win_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/cpu_context_win_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_annotations.cc b/shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_annotations.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_annotations.cc rename to shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_annotations.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_crashing_child.cc b/shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_crashing_child.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_crashing_child.cc rename to shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_crashing_child.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_dump_without_crashing.cc b/shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_dump_without_crashing.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_dump_without_crashing.cc rename to shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_dump_without_crashing.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc b/shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc rename to shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc b/shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader_module.cc b/shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader_module.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader_module.cc rename to shared/sentry/src/external/crashpad/snapshot/win/crashpad_snapshot_test_image_reader_module.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/end_to_end_test.py b/shared/sentry/src/external/crashpad/snapshot/win/end_to_end_test.py similarity index 96% rename from shared/sentry/external/crashpad/snapshot/win/end_to_end_test.py rename to shared/sentry/src/external/crashpad/snapshot/win/end_to_end_test.py index 136d5b9ab..25f661c1a 100755 --- a/shared/sentry/external/crashpad/snapshot/win/end_to_end_test.py +++ b/shared/sentry/src/external/crashpad/snapshot/win/end_to_end_test.py @@ -212,6 +212,12 @@ def GetDumpFromZ7Program(out_dir, pipe_name): win32con.EXCEPTION_ACCESS_VIOLATION) +def GetDumpFromHeapCorruptingProgram(out_dir, pipe_name): + STATUS_HEAP_CORRUPTION = 0xC0000374 + return GetDumpFromProgram(out_dir, pipe_name, 'heap_corrupting_program.exe', + STATUS_HEAP_CORRUPTION) + + def GetDumpFromFastFailProgram(out_dir, pipe_name, *args): STATUS_STACK_BUFFER_OVERRUN = 0xc0000409 return GetDumpFromProgram(out_dir, pipe_name, 'fastfail_program.exe', @@ -444,6 +450,14 @@ def RunSigAbrtTest(cdb_path, sigabrt_main_path, sigabrt_background_path): out.Check('code 40000015', 'got sigabrt signal from background thread') +def RunHeapCorruptionTest(cdb_path, heap_path): + """Runs tests on heap corruption caught using the vectored handler.""" + out = CdbRun(cdb_path, heap_path, '.ecxr;k') + out.Check('code c0000374', 'captured exception from heap corruption crash') + out.Check('::HeapCorruptionCrash', 'See expected throwing function') + out = CdbRun(cdb_path, heap_path, '.ecxr;k') + + def RunFastFailDumpTest(cdb_path, fastfail_path): """Runs tests on __fastfail() caught using the runtime exception helper.""" out = CdbRun(cdb_path, fastfail_path, '.ecxr;k') @@ -541,8 +555,14 @@ def main(args): return 1 Run7zDumpTest(cdb_path, z7_dump_path) + heap_path = GetDumpFromHeapCorruptingProgram(args[0], pipe_name) + if not heap_path: + return 1 + RunHeapCorruptionTest(cdb_path, heap_path) + # __fastfail() & CFG crash caught by WerRuntimeExceptionHelperModule. - if (Win32_20H1()): + # TODO(crashpad:458) These are not working when launched from python. + if (False and Win32_20H1()): cfg_path = GetDumpFromFastFailProgram(args[0], pipe_name, "cf") if not cfg_path: return 1 diff --git a/shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win.cc similarity index 97% rename from shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win.cc index 2a70c5c0c..b8931444a 100644 --- a/shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win.cc +++ b/shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win.cc @@ -14,6 +14,8 @@ #include "snapshot/win/exception_snapshot_win.h" +#include + #include "base/logging.h" #include "snapshot/capture_memory.h" #include "snapshot/memory_snapshot.h" @@ -261,8 +263,12 @@ bool ExceptionSnapshotWin::InitializeFromExceptionPointers( exception_code_ = first_record.ExceptionCode; exception_flags_ = first_record.ExceptionFlags; exception_address_ = first_record.ExceptionAddress; - for (DWORD i = 0; i < first_record.NumberParameters; ++i) + + const DWORD number_parameters = std::min( + first_record.NumberParameters, EXCEPTION_MAXIMUM_PARAMETERS); + for (DWORD i = 0; i < number_parameters; ++i) { codes_.push_back(first_record.ExceptionInformation[i]); + } if (first_record.ExceptionRecord) { // https://crashpad.chromium.org/bug/43 LOG(WARNING) << "dropping chained ExceptionRecord"; diff --git a/shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win.h b/shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win.h diff --git a/shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win_test.cc similarity index 86% rename from shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win_test.cc index dcdc3cf4d..aa78e5579 100644 --- a/shared/sentry/external/crashpad/snapshot/win/exception_snapshot_win_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/win/exception_snapshot_win_test.cc @@ -14,11 +14,14 @@ #include "snapshot/win/exception_snapshot_win.h" +#include + #include #include "base/files/file_path.h" #include "base/strings/utf_string_conversions.h" #include "gtest/gtest.h" +#include "snapshot/win/exception_snapshot_win.h" #include "snapshot/win/process_snapshot_win.h" #include "test/errors.h" #include "test/test_paths.h" @@ -315,6 +318,48 @@ TEST(SimulateCrash, ChildDumpWithoutCrashingWOW64) { } #endif // ARCH_CPU_64_BITS +TEST(ExceptionSnapshot, TooManyExceptionParameters) { + ProcessReaderWin process_reader; + ASSERT_TRUE(process_reader.Initialize(GetCurrentProcess(), + ProcessSuspensionState::kRunning)); + + // Construct a fake exception record and CPU context. + auto exception_record = std::make_unique(); + exception_record->ExceptionCode = STATUS_FATAL_APP_EXIT; + exception_record->ExceptionFlags = EXCEPTION_NONCONTINUABLE; + exception_record->ExceptionAddress = reinterpret_cast(0xFA15E); + // One more than is permitted in the struct. + exception_record->NumberParameters = EXCEPTION_MAXIMUM_PARAMETERS + 1; + for (int i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; ++i) { + exception_record->ExceptionInformation[i] = 1000 + i; + } + + auto cpu_context = std::make_unique(); + + auto exception_pointers = std::make_unique(); + exception_pointers->ExceptionRecord = + reinterpret_cast(exception_record.get()); + exception_pointers->ContextRecord = + reinterpret_cast(cpu_context.get()); + + internal::ExceptionSnapshotWin snapshot; + ASSERT_TRUE(snapshot.Initialize( + &process_reader, + GetCurrentThreadId(), + reinterpret_cast(exception_pointers.get()), + nullptr)); + + EXPECT_EQ(STATUS_FATAL_APP_EXIT, snapshot.Exception()); + EXPECT_EQ(static_cast(EXCEPTION_NONCONTINUABLE), + snapshot.ExceptionInfo()); + EXPECT_EQ(0xFA15Eu, snapshot.ExceptionAddress()); + EXPECT_EQ(static_cast(EXCEPTION_MAXIMUM_PARAMETERS), + snapshot.Codes().size()); + for (size_t i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; ++i) { + EXPECT_EQ(1000 + i, snapshot.Codes()[i]); + } +} + } // namespace } // namespace test } // namespace crashpad diff --git a/shared/sentry/external/crashpad/snapshot/win/extra_memory_ranges_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/extra_memory_ranges_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/extra_memory_ranges_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/extra_memory_ranges_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/memory_map_region_snapshot_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/memory_map_region_snapshot_win.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/memory_map_region_snapshot_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/memory_map_region_snapshot_win.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/memory_map_region_snapshot_win.h b/shared/sentry/src/external/crashpad/snapshot/win/memory_map_region_snapshot_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/memory_map_region_snapshot_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/memory_map_region_snapshot_win.h diff --git a/shared/sentry/external/crashpad/snapshot/win/module_snapshot_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/module_snapshot_win.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/module_snapshot_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/module_snapshot_win.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/module_snapshot_win.h b/shared/sentry/src/external/crashpad/snapshot/win/module_snapshot_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/module_snapshot_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/module_snapshot_win.h diff --git a/shared/sentry/external/crashpad/snapshot/win/module_snapshot_win_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/module_snapshot_win_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/module_snapshot_win_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/module_snapshot_win_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/pe_image_annotations_reader.cc b/shared/sentry/src/external/crashpad/snapshot/win/pe_image_annotations_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/pe_image_annotations_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/win/pe_image_annotations_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/pe_image_annotations_reader.h b/shared/sentry/src/external/crashpad/snapshot/win/pe_image_annotations_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/pe_image_annotations_reader.h rename to shared/sentry/src/external/crashpad/snapshot/win/pe_image_annotations_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/win/pe_image_reader.cc b/shared/sentry/src/external/crashpad/snapshot/win/pe_image_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/pe_image_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/win/pe_image_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/pe_image_reader.h b/shared/sentry/src/external/crashpad/snapshot/win/pe_image_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/pe_image_reader.h rename to shared/sentry/src/external/crashpad/snapshot/win/pe_image_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/win/pe_image_reader_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/pe_image_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/pe_image_reader_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/pe_image_reader_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/pe_image_resource_reader.cc b/shared/sentry/src/external/crashpad/snapshot/win/pe_image_resource_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/pe_image_resource_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/win/pe_image_resource_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/pe_image_resource_reader.h b/shared/sentry/src/external/crashpad/snapshot/win/pe_image_resource_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/pe_image_resource_reader.h rename to shared/sentry/src/external/crashpad/snapshot/win/pe_image_resource_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/win/process_reader_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.cc similarity index 96% rename from shared/sentry/external/crashpad/snapshot/win/process_reader_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.cc index b9718beb8..8c3bb160d 100644 --- a/shared/sentry/external/crashpad/snapshot/win/process_reader_win.cc +++ b/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.cc @@ -22,6 +22,7 @@ #include +#include "base/check_op.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -151,22 +152,20 @@ void DoStackWalk(ProcessReaderWin::Thread* thread, stack_frame.AddrStack.Mode = AddrModeFlat; int machine_type = IMAGE_FILE_MACHINE_I386; - LPVOID ctx = NULL; + CONTEXT ctx; #if defined(ARCH_CPU_X86) - const CONTEXT* ctx_ = thread->context.context(); - stack_frame.AddrPC.Offset = ctx_->Eip; - stack_frame.AddrFrame.Offset = ctx_->Ebp; - stack_frame.AddrStack.Offset = ctx_->Esp; - ctx = (LPVOID)ctx_; + ctx = *thread->context.context(); + stack_frame.AddrPC.Offset = ctx.Eip; + stack_frame.AddrFrame.Offset = ctx.Ebp; + stack_frame.AddrStack.Offset = ctx.Esp; #elif defined(ARCH_CPU_X86_64) // if (!is_64_reading_32) { machine_type = IMAGE_FILE_MACHINE_AMD64; - const CONTEXT* ctx_ = thread->context.context(); - stack_frame.AddrPC.Offset = ctx_->Rip; - stack_frame.AddrFrame.Offset = ctx_->Rbp; - stack_frame.AddrStack.Offset = ctx_->Rsp; - ctx = (LPVOID)ctx_; + ctx = *thread->context.context(); + stack_frame.AddrPC.Offset = ctx.Rip; + stack_frame.AddrFrame.Offset = ctx.Rbp; + stack_frame.AddrStack.Offset = ctx.Rsp; // } else { // const WOW64_CONTEXT* ctx_ = &thread->context.wow64; // stack_frame.AddrPC.Offset = ctx_->Eip; @@ -175,9 +174,12 @@ void DoStackWalk(ProcessReaderWin::Thread* thread, // ctx = (LPVOID)ctx_; // } -// TODO: we dont support this right away, maybe in the future -//#elif defined(ARCH_CPU_ARM64) -// machine_type = IMAGE_FILE_MACHINE_ARM64; +#elif defined(ARCH_CPU_ARM64) + machine_type = IMAGE_FILE_MACHINE_ARM64; + ctx = *thread->context.context(); + stack_frame.AddrPC.Offset = ctx.Pc; + stack_frame.AddrFrame.Offset = ctx.Fp; + stack_frame.AddrStack.Offset = ctx.Sp; #else #error Unsupported Windows Arch #endif // ARCH_CPU_X86 @@ -192,7 +194,7 @@ void DoStackWalk(ProcessReaderWin::Thread* thread, process, thread_handle, &stack_frame, - ctx, + &ctx, NULL, SymFunctionTableAccess64, SymGetModuleBase64, diff --git a/shared/sentry/external/crashpad/snapshot/win/process_reader_win.h b/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/process_reader_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.h diff --git a/shared/sentry/external/crashpad/snapshot/win/process_reader_win_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/process_reader_win_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/process_reader_win_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/process_snapshot_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win.cc similarity index 99% rename from shared/sentry/external/crashpad/snapshot/win/process_snapshot_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win.cc index 9d5990148..6c06165f6 100644 --- a/shared/sentry/external/crashpad/snapshot/win/process_snapshot_win.cc +++ b/shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win.cc @@ -19,6 +19,7 @@ #include #include +#include #include #include "base/logging.h" @@ -329,7 +330,7 @@ void ProcessSnapshotWin::InitializeUnloadedModules() { uet.SizeOfImage, uet.CheckSum, uet.TimeDateStamp, - base::WideToUTF8(base::WStringPiece( + base::WideToUTF8(std::wstring_view( uet.ImageName, wcsnlen(uet.ImageName, std::size(uet.ImageName)))))); } diff --git a/shared/sentry/external/crashpad/snapshot/win/process_snapshot_win.h b/shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/process_snapshot_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win.h diff --git a/shared/sentry/external/crashpad/snapshot/win/process_snapshot_win_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win_test.cc similarity index 97% rename from shared/sentry/external/crashpad/snapshot/win/process_snapshot_win_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win_test.cc index 5e2249856..1bc56ed37 100644 --- a/shared/sentry/external/crashpad/snapshot/win/process_snapshot_win_test.cc +++ b/shared/sentry/src/external/crashpad/snapshot/win/process_snapshot_win_test.cc @@ -100,10 +100,10 @@ void TestImageReaderChild(const TestPaths::Architecture architecture) { } } - // Confirm that less than 1M of extra data was gathered. The cap is set to + // Confirm that less than 1.2M of extra data was gathered. The cap is set to // only 100K, but there are other "extra memory" regions that aren't // included in the cap. (Completely uncapped it would be > 10M.) - EXPECT_LT(extra_memory_total, 1000000u); + EXPECT_LT(extra_memory_total, 1200000u); } // Tell the child it can terminate. diff --git a/shared/sentry/external/crashpad/snapshot/win/process_subrange_reader.cc b/shared/sentry/src/external/crashpad/snapshot/win/process_subrange_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/process_subrange_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/win/process_subrange_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/process_subrange_reader.h b/shared/sentry/src/external/crashpad/snapshot/win/process_subrange_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/process_subrange_reader.h rename to shared/sentry/src/external/crashpad/snapshot/win/process_subrange_reader.h diff --git a/shared/sentry/external/crashpad/snapshot/win/system_snapshot_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/system_snapshot_win.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/system_snapshot_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/system_snapshot_win.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/system_snapshot_win.h b/shared/sentry/src/external/crashpad/snapshot/win/system_snapshot_win.h similarity index 98% rename from shared/sentry/external/crashpad/snapshot/win/system_snapshot_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/system_snapshot_win.h index 6fbcd5737..fbe2faec2 100644 --- a/shared/sentry/external/crashpad/snapshot/win/system_snapshot_win.h +++ b/shared/sentry/src/external/crashpad/snapshot/win/system_snapshot_win.h @@ -79,6 +79,7 @@ class SystemSnapshotWin final : public SystemSnapshot { int* daylight_offset_seconds, std::string* standard_name, std::string* daylight_name) const override; + uint64_t AddressMask() const override { return 0; } private: std::string os_version_full_; diff --git a/shared/sentry/external/crashpad/snapshot/win/system_snapshot_win_test.cc b/shared/sentry/src/external/crashpad/snapshot/win/system_snapshot_win_test.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/system_snapshot_win_test.cc rename to shared/sentry/src/external/crashpad/snapshot/win/system_snapshot_win_test.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/thread_snapshot_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/thread_snapshot_win.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/thread_snapshot_win.cc rename to shared/sentry/src/external/crashpad/snapshot/win/thread_snapshot_win.cc diff --git a/shared/sentry/external/crashpad/snapshot/win/thread_snapshot_win.h b/shared/sentry/src/external/crashpad/snapshot/win/thread_snapshot_win.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/win/thread_snapshot_win.h rename to shared/sentry/src/external/crashpad/snapshot/win/thread_snapshot_win.h diff --git a/shared/sentry/external/crashpad/snapshot/x86/cpuid_reader.cc b/shared/sentry/src/external/crashpad/snapshot/x86/cpuid_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/snapshot/x86/cpuid_reader.cc rename to shared/sentry/src/external/crashpad/snapshot/x86/cpuid_reader.cc diff --git a/shared/sentry/external/crashpad/snapshot/x86/cpuid_reader.h b/shared/sentry/src/external/crashpad/snapshot/x86/cpuid_reader.h similarity index 100% rename from shared/sentry/external/crashpad/snapshot/x86/cpuid_reader.h rename to shared/sentry/src/external/crashpad/snapshot/x86/cpuid_reader.h diff --git a/shared/sentry/external/crashpad/test/BUILD.gn b/shared/sentry/src/external/crashpad/test/BUILD.gn similarity index 98% rename from shared/sentry/external/crashpad/test/BUILD.gn rename to shared/sentry/src/external/crashpad/test/BUILD.gn index bf21bfeeb..f20c66f29 100644 --- a/shared/sentry/external/crashpad/test/BUILD.gn +++ b/shared/sentry/src/external/crashpad/test/BUILD.gn @@ -61,12 +61,10 @@ static_library("test") { # TODO(crbug.com/812974): Remove !crashpad_is_fuchsia when Fuchsia is no # longer treated as a posix platform. if (crashpad_is_posix && !crashpad_is_fuchsia) { - sources += [ - "scoped_set_thread_name_posix.cc", - ] + sources += [ "scoped_set_thread_name_posix.cc" ] } - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { sources += [ "mac/mach_errors.cc", "mac/mach_errors.h", @@ -135,9 +133,9 @@ static_library("test") { data = [ "test_paths_test_data_root.txt" ] deps = [ + "$mini_chromium_source_parent:base", "../compat", "../third_party/googletest:googletest", - "$mini_chromium_source_parent:base", "../util", ] @@ -214,10 +212,10 @@ source_set("test_test") { deps = [ ":test", + "$mini_chromium_source_parent:base", "../compat", "../third_party/googletest:googlemock", "../third_party/googletest:googletest", - "$mini_chromium_source_parent:base", "../util", ] @@ -243,10 +241,10 @@ static_library("googlemock_main") { defines = [ "CRASHPAD_TEST_LAUNCHER_GOOGLEMOCK" ] deps = [ ":test", - "../third_party/googletest:googlemock", - "../third_party/googletest:googletest", "$mini_chromium_source_parent:base", "$mini_chromium_source_parent:base_test_support", + "../third_party/googletest:googlemock", + "../third_party/googletest:googletest", ] if (crashpad_is_android) { deps += [ "../util" ] @@ -263,9 +261,9 @@ static_library("googletest_main") { defines = [ "CRASHPAD_TEST_LAUNCHER_GOOGLETEST" ] deps = [ ":test", - "../third_party/googletest:googletest", "$mini_chromium_source_parent:base", "$mini_chromium_source_parent:base_test_support", + "../third_party/googletest:googletest", ] if (crashpad_is_android) { deps += [ "../util" ] diff --git a/shared/sentry/external/crashpad/test/errors.cc b/shared/sentry/src/external/crashpad/test/errors.cc similarity index 100% rename from shared/sentry/external/crashpad/test/errors.cc rename to shared/sentry/src/external/crashpad/test/errors.cc diff --git a/shared/sentry/external/crashpad/test/errors.h b/shared/sentry/src/external/crashpad/test/errors.h similarity index 100% rename from shared/sentry/external/crashpad/test/errors.h rename to shared/sentry/src/external/crashpad/test/errors.h diff --git a/shared/sentry/external/crashpad/test/file.cc b/shared/sentry/src/external/crashpad/test/file.cc similarity index 100% rename from shared/sentry/external/crashpad/test/file.cc rename to shared/sentry/src/external/crashpad/test/file.cc diff --git a/shared/sentry/external/crashpad/test/file.h b/shared/sentry/src/external/crashpad/test/file.h similarity index 100% rename from shared/sentry/external/crashpad/test/file.h rename to shared/sentry/src/external/crashpad/test/file.h diff --git a/shared/sentry/external/crashpad/test/filesystem.cc b/shared/sentry/src/external/crashpad/test/filesystem.cc similarity index 100% rename from shared/sentry/external/crashpad/test/filesystem.cc rename to shared/sentry/src/external/crashpad/test/filesystem.cc diff --git a/shared/sentry/external/crashpad/test/filesystem.h b/shared/sentry/src/external/crashpad/test/filesystem.h similarity index 100% rename from shared/sentry/external/crashpad/test/filesystem.h rename to shared/sentry/src/external/crashpad/test/filesystem.h diff --git a/shared/sentry/external/crashpad/test/fuchsia_crashpad_tests.cml b/shared/sentry/src/external/crashpad/test/fuchsia_crashpad_tests.cml similarity index 98% rename from shared/sentry/external/crashpad/test/fuchsia_crashpad_tests.cml rename to shared/sentry/src/external/crashpad/test/fuchsia_crashpad_tests.cml index b5c0c8a00..63ec2e20d 100644 --- a/shared/sentry/external/crashpad/test/fuchsia_crashpad_tests.cml +++ b/shared/sentry/src/external/crashpad/test/fuchsia_crashpad_tests.cml @@ -4,6 +4,7 @@ { include: [ "//src/sys/test_runners/elf/ambient_exec.shard.cml", + "inspect/offer.shard.cml", "syslog/client.shard.cml", ], program: { diff --git a/shared/sentry/external/crashpad/test/gtest_death.h b/shared/sentry/src/external/crashpad/test/gtest_death.h similarity index 100% rename from shared/sentry/external/crashpad/test/gtest_death.h rename to shared/sentry/src/external/crashpad/test/gtest_death.h diff --git a/shared/sentry/external/crashpad/test/gtest_main.cc b/shared/sentry/src/external/crashpad/test/gtest_main.cc similarity index 99% rename from shared/sentry/external/crashpad/test/gtest_main.cc rename to shared/sentry/src/external/crashpad/test/gtest_main.cc index 605c6acca..63f13c547 100644 --- a/shared/sentry/external/crashpad/test/gtest_main.cc +++ b/shared/sentry/src/external/crashpad/test/gtest_main.cc @@ -35,7 +35,7 @@ #endif // BUILDFLAG(IS_WIN) #if defined(CRASHPAD_IS_IN_CHROMIUM) -#include "base/bind.h" +#include "base/functional/bind.h" #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_suite.h" #endif // CRASHPAD_IS_IN_CHROMIUM diff --git a/shared/sentry/external/crashpad/test/hex_string.cc b/shared/sentry/src/external/crashpad/test/hex_string.cc similarity index 100% rename from shared/sentry/external/crashpad/test/hex_string.cc rename to shared/sentry/src/external/crashpad/test/hex_string.cc diff --git a/shared/sentry/external/crashpad/test/hex_string.h b/shared/sentry/src/external/crashpad/test/hex_string.h similarity index 100% rename from shared/sentry/external/crashpad/test/hex_string.h rename to shared/sentry/src/external/crashpad/test/hex_string.h diff --git a/shared/sentry/external/crashpad/test/hex_string_test.cc b/shared/sentry/src/external/crashpad/test/hex_string_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/hex_string_test.cc rename to shared/sentry/src/external/crashpad/test/hex_string_test.cc diff --git a/shared/sentry/external/crashpad/test/ios/BUILD.gn b/shared/sentry/src/external/crashpad/test/ios/BUILD.gn similarity index 90% rename from shared/sentry/external/crashpad/test/ios/BUILD.gn rename to shared/sentry/src/external/crashpad/test/ios/BUILD.gn index 1987b7824..6b1deca85 100644 --- a/shared/sentry/external/crashpad/test/ios/BUILD.gn +++ b/shared/sentry/src/external/crashpad/test/ios/BUILD.gn @@ -40,7 +40,7 @@ source_set("google_test_runner") { configs += [ "../..:crashpad_config" ] deps = [ "../$mini_chromium_source_parent:base", - "../../build:ios_enable_arc", + "../../build:apple_enable_arc", "../../build:ios_xctest", "../../test/ios:google_test_runner_shared_headers", ] @@ -57,7 +57,7 @@ source_set("google_test_setup") { deps = [ ":google_test_runner_shared_headers", "../$mini_chromium_source_parent:base", - "../../build:ios_enable_arc", + "../../build:apple_enable_arc", "../../third_party/googletest:googletest", ] frameworks = [ "UIKit.framework" ] @@ -66,10 +66,15 @@ source_set("google_test_setup") { source_set("xcuitests") { testonly = true sources = [ "crash_type_xctest.mm" ] - configs += [ "../..:crashpad_config" ] + configs += [ + "../..:crashpad_config", + "../../build:crashpad_is_in_chromium", + ] + deps = [ - "../../build:ios_enable_arc", + "../../build:apple_enable_arc", "../../build:ios_xctest", + "../../client:common", "../../test/ios/host:app_shared_sources", "../../third_party/edo", "../../util", diff --git a/shared/sentry/external/crashpad/test/ios/cptest_google_test_runner.mm b/shared/sentry/src/external/crashpad/test/ios/cptest_google_test_runner.mm similarity index 92% rename from shared/sentry/external/crashpad/test/ios/cptest_google_test_runner.mm rename to shared/sentry/src/external/crashpad/test/ios/cptest_google_test_runner.mm index 9e950393e..3958f8c1a 100644 --- a/shared/sentry/external/crashpad/test/ios/cptest_google_test_runner.mm +++ b/shared/sentry/src/external/crashpad/test/ios/cptest_google_test_runner.mm @@ -18,10 +18,6 @@ #include "base/check.h" #import "test/ios/cptest_google_test_runner_delegate.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @interface CPTestGoogleTestRunner : XCTestCase @end diff --git a/shared/sentry/external/crashpad/test/ios/cptest_google_test_runner_delegate.h b/shared/sentry/src/external/crashpad/test/ios/cptest_google_test_runner_delegate.h similarity index 100% rename from shared/sentry/external/crashpad/test/ios/cptest_google_test_runner_delegate.h rename to shared/sentry/src/external/crashpad/test/ios/cptest_google_test_runner_delegate.h diff --git a/shared/sentry/external/crashpad/test/ios/crash_type_xctest.mm b/shared/sentry/src/external/crashpad/test/ios/crash_type_xctest.mm similarity index 86% rename from shared/sentry/external/crashpad/test/ios/crash_type_xctest.mm rename to shared/sentry/src/external/crashpad/test/ios/crash_type_xctest.mm index e95760c72..8d4038db0 100644 --- a/shared/sentry/external/crashpad/test/ios/crash_type_xctest.mm +++ b/shared/sentry/src/external/crashpad/test/ios/crash_type_xctest.mm @@ -15,16 +15,15 @@ #import #include +#include + #import "Service/Sources/EDOClientService.h" #include "build/build_config.h" +#include "client/length_delimited_ring_buffer.h" #import "test/ios/host/cptest_shared_object.h" #include "util/mach/exception_types.h" #include "util/mach/mach_extensions.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @interface CPTestTestCase : XCTestCase { XCUIApplication* app_; CPTestSharedObject* rootObject_; @@ -147,10 +146,16 @@ - (void)testBadAccess { - (void)testException { [rootObject_ crashException]; + // After https://reviews.llvm.org/D141222 exceptions call + // __libcpp_verbose_abort, which Chromium sets to `brk 0` in release. +#if defined(CRASHPAD_IS_IN_CHROMIUM) && defined(NDEBUG) + [self verifyCrashReportException:SIGABRT]; +#else [self verifyCrashReportException:EXC_SOFT_SIGNAL]; NSNumber* report_exception; XCTAssertTrue([rootObject_ pendingReportExceptionInfo:&report_exception]); XCTAssertEqual(report_exception.intValue, SIGABRT); +#endif } - (void)testNSException { @@ -166,6 +171,16 @@ - (void)testNSException { isEqualToString:@"NSInternalInconsistencyException"]); } +- (void)testNotAnNSException { + [rootObject_ crashNotAnNSException]; + // When @throwing something other than an NSException the + // UncaughtExceptionHandler is not called, so the application SIGABRTs. + [self verifyCrashReportException:EXC_SOFT_SIGNAL]; + NSNumber* report_exception; + XCTAssertTrue([rootObject_ pendingReportExceptionInfo:&report_exception]); + XCTAssertEqual(report_exception.intValue, SIGABRT); +} + - (void)testUnhandledNSException { [rootObject_ crashUnhandledNSException]; [self verifyCrashReportException:crashpad::kMachExceptionFromNSException]; @@ -322,6 +337,31 @@ - (void)testCrashWithAnnotations { isEqualToString:@"same-name 3"]); XCTAssertTrue([[dict[@"objects"][2] valueForKeyPath:@"#TEST# one"] isEqualToString:@"moocow"]); + // Ensure `ring_buffer` is present but not `busy_ring_buffer`. + XCTAssertEqual(1u, [dict[@"ringbuffers"] count]); + NSData* ringBufferNSData = + [dict[@"ringbuffers"][0] valueForKeyPath:@"#TEST# ring_buffer"]; + crashpad::RingBufferData ringBufferData; + XCTAssertTrue(ringBufferData.DeserializeFromBuffer(ringBufferNSData.bytes, + ringBufferNSData.length)); + crashpad::LengthDelimitedRingBufferReader reader(ringBufferData); + + std::vector ringBufferEntry; + XCTAssertTrue(reader.Pop(ringBufferEntry)); + NSString* firstEntry = [[NSString alloc] initWithBytes:ringBufferEntry.data() + length:ringBufferEntry.size() + encoding:NSUTF8StringEncoding]; + XCTAssertEqualObjects(firstEntry, @"hello"); + ringBufferEntry.clear(); + + XCTAssertTrue(reader.Pop(ringBufferEntry)); + NSString* secondEntry = [[NSString alloc] initWithBytes:ringBufferEntry.data() + length:ringBufferEntry.size() + encoding:NSUTF8StringEncoding]; + XCTAssertEqualObjects(secondEntry, @"goodbye"); + ringBufferEntry.clear(); + + XCTAssertFalse(reader.Pop(ringBufferEntry)); } - (void)testDumpWithoutCrash { @@ -346,6 +386,17 @@ - (void)testSimultaneousCrash { XCTAssertEqual([rootObject_ pendingReportCount], 1); } +- (void)testSimultaneousNSException { + [rootObject_ catchConcurrentNSException]; + + // The app should not crash + XCTAssertTrue(app_.state == XCUIApplicationStateRunningForeground); + + // No report should be generated. + [rootObject_ processIntermediateDumps]; + XCTAssertEqual([rootObject_ pendingReportCount], 0); +} + - (void)testCrashInHandlerReentrant { XCTAssertTrue(app_.state == XCUIApplicationStateRunningForeground); rootObject_ = [EDOClientService rootObjectWithPort:12345]; diff --git a/shared/sentry/external/crashpad/test/ios/google_test_setup.h b/shared/sentry/src/external/crashpad/test/ios/google_test_setup.h similarity index 100% rename from shared/sentry/external/crashpad/test/ios/google_test_setup.h rename to shared/sentry/src/external/crashpad/test/ios/google_test_setup.h diff --git a/shared/sentry/external/crashpad/test/ios/google_test_setup.mm b/shared/sentry/src/external/crashpad/test/ios/google_test_setup.mm similarity index 97% rename from shared/sentry/external/crashpad/test/ios/google_test_setup.mm rename to shared/sentry/src/external/crashpad/test/ios/google_test_setup.mm index dc71c672c..e68f4d011 100644 --- a/shared/sentry/external/crashpad/test/ios/google_test_setup.mm +++ b/shared/sentry/src/external/crashpad/test/ios/google_test_setup.mm @@ -20,10 +20,6 @@ #include "gtest/gtest.h" #include "test/ios/cptest_google_test_runner_delegate.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @interface UIApplication (Testing) - (void)_terminateWithStatus:(int)status; @end diff --git a/shared/sentry/external/crashpad/test/ios/host/BUILD.gn b/shared/sentry/src/external/crashpad/test/ios/host/BUILD.gn similarity index 92% rename from shared/sentry/external/crashpad/test/ios/host/BUILD.gn rename to shared/sentry/src/external/crashpad/test/ios/host/BUILD.gn index 77f145d0e..7a735f34d 100644 --- a/shared/sentry/external/crashpad/test/ios/host/BUILD.gn +++ b/shared/sentry/src/external/crashpad/test/ios/host/BUILD.gn @@ -24,7 +24,7 @@ source_set("app_shared_sources") { testonly = true sources = [ "cptest_shared_object.h" ] configs += [ "../../..:crashpad_config" ] - deps = [ "../../../build:ios_enable_arc" ] + deps = [ "../../../build:apple_enable_arc" ] frameworks = [ "UIKit.framework" ] } @@ -42,7 +42,7 @@ static_library("app_host_sources") { configs += [ "../../..:crashpad_config" ] deps = [ ":app_shared_sources", - "../../../build:ios_enable_arc", + "../../../build:apple_enable_arc", "../../../client", "../../../snapshot", "../../../test", @@ -65,8 +65,11 @@ bundle_data("crashy_module_bundle") { } ios_app_bundle("ios_crash_xcuitests") { - info_plist = "Info.plist" testonly = true + info_plist = "Info.plist" + if (crashpad_is_in_chromium) { + bundle_identifier = shared_bundle_id_for_test_apps + } deps = [ ":app_host_sources", ":crashy_module_bundle", diff --git a/shared/sentry/external/crashpad/test/ios/host/Info.plist b/shared/sentry/src/external/crashpad/test/ios/host/Info.plist similarity index 97% rename from shared/sentry/external/crashpad/test/ios/host/Info.plist rename to shared/sentry/src/external/crashpad/test/ios/host/Info.plist index 4c62e9695..16716116f 100644 --- a/shared/sentry/external/crashpad/test/ios/host/Info.plist +++ b/shared/sentry/src/external/crashpad/test/ios/host/Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - ${IOS_BUNDLE_ID_PREFIX}.googletest.${EXECUTABLE_NAME:rfc1034identifier} + ${BUNDLE_IDENTIFIER} CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/shared/sentry/external/crashpad/test/ios/host/cptest_application_delegate.h b/shared/sentry/src/external/crashpad/test/ios/host/cptest_application_delegate.h similarity index 100% rename from shared/sentry/external/crashpad/test/ios/host/cptest_application_delegate.h rename to shared/sentry/src/external/crashpad/test/ios/host/cptest_application_delegate.h diff --git a/shared/sentry/external/crashpad/test/ios/host/cptest_application_delegate.mm b/shared/sentry/src/external/crashpad/test/ios/host/cptest_application_delegate.mm similarity index 86% rename from shared/sentry/external/crashpad/test/ios/host/cptest_application_delegate.mm rename to shared/sentry/src/external/crashpad/test/ios/host/cptest_application_delegate.mm index 0af106e74..531a4cde1 100644 --- a/shared/sentry/external/crashpad/test/ios/host/cptest_application_delegate.mm +++ b/shared/sentry/src/external/crashpad/test/ios/host/cptest_application_delegate.mm @@ -38,6 +38,7 @@ #include "client/crash_report_database.h" #include "client/crashpad_client.h" #include "client/crashpad_info.h" +#include "client/ring_buffer_annotation.h" #include "client/simple_string_dictionary.h" #include "client/simulate_crash.h" #include "snapshot/minidump/process_snapshot_minidump.h" @@ -49,15 +50,14 @@ #include "util/ios/raw_logging.h" #include "util/thread/thread.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - using OperationStatus = crashpad::CrashReportDatabase::OperationStatus; using Report = crashpad::CrashReportDatabase::Report; namespace { +constexpr crashpad::Annotation::Type kRingBufferType = + crashpad::Annotation::UserDefinedType(42); + base::FilePath GetDatabaseDir() { base::FilePath database_dir([NSFileManager.defaultManager URLsForDirectory:NSDocumentDirectory @@ -106,13 +106,17 @@ OperationStatus GetPendingReports(std::vector* pending_reports) { UIWindow* GetAnyWindow() { #if defined(__IPHONE_15_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0 + UIWindowScene* scene = reinterpret_cast( + [UIApplication sharedApplication].connectedScenes.anyObject); if (@available(iOS 15.0, *)) { - UIWindowScene* scene = reinterpret_cast( - [UIApplication sharedApplication].connectedScenes.anyObject); return scene.keyWindow; + } else { + return [scene.windows firstObject]; } -#endif + +#else return [UIApplication sharedApplication].windows[0]; +#endif } [[clang::optnone]] void recurse(int counter) { @@ -251,7 +255,8 @@ - (NSDictionary*)getAnnotations { NSDictionary* dict = @{ @"simplemap" : [@{} mutableCopy], @"vector" : [@[] mutableCopy], - @"objects" : [@[] mutableCopy] + @"objects" : [@[] mutableCopy], + @"ringbuffers" : [@[] mutableCopy], }; for (const auto* module : process_snapshot->Modules()) { for (const auto& kv : module->AnnotationsSimpleMap()) { @@ -262,14 +267,18 @@ - (NSDictionary*)getAnnotations { [dict[@"vector"] addObject:@(annotation.c_str())]; } for (const auto& annotation : module->AnnotationObjects()) { - if (annotation.type != + if (annotation.type == static_cast(crashpad::Annotation::Type::kString)) { - continue; + std::string value( + reinterpret_cast(annotation.value.data()), + annotation.value.size()); + [dict[@"objects"] + addObject:@{@(annotation.name.c_str()) : @(value.c_str())}]; + } else if (annotation.type == static_cast(kRingBufferType)) { + NSData* data = [NSData dataWithBytes:annotation.value.data() + length:annotation.value.size()]; + [dict[@"ringbuffers"] addObject:@{@(annotation.name.c_str()) : data}]; } - std::string value(reinterpret_cast(annotation.value.data()), - annotation.value.size()); - [dict[@"objects"] - addObject:@{@(annotation.name.c_str()) : @(value.c_str())}]; } } return [dict passByValue]; @@ -328,6 +337,10 @@ - (void)crashNSException { }); } +- (void)crashNotAnNSException { + @throw @"Boom"; +} + - (void)crashUnhandledNSException { std::thread t([self]() { @autoreleasepool { @@ -418,12 +431,23 @@ - (void)crashWithAnnotations { "#TEST# same-name"}; static crashpad::StringAnnotation<32> test_annotation_four{ "#TEST# same-name"}; + static crashpad::RingBufferAnnotation<32> test_ring_buffer_annotation( + kRingBufferType, "#TEST# ring_buffer"); + static crashpad::RingBufferAnnotation<32> test_busy_ring_buffer_annotation( + kRingBufferType, "#TEST# busy_ring_buffer"); test_annotation_one.Set("moocow"); test_annotation_two.Set("this will be cleared"); test_annotation_three.Set("same-name 3"); test_annotation_four.Set("same-name 4"); test_annotation_two.Clear(); + test_ring_buffer_annotation.Push("hello", 5); + test_ring_buffer_annotation.Push("goodbye", 7); + test_busy_ring_buffer_annotation.Push("busy", 4); + // Take the scoped spin guard on `test_busy_ring_buffer_annotation` to mimic + // an in-flight `Push()` so its contents are not included in the dump. + auto guard = test_busy_ring_buffer_annotation.TryCreateScopedSpinGuard( + /*timeout_nanos=*/0); abort(); } @@ -480,6 +504,34 @@ - (void)crashConcurrentSignalAndMach { mach_thread.Join(); } +class ThrowNSExceptionThread : public crashpad::Thread { + public: + explicit ThrowNSExceptionThread() : Thread() {} + + private: + void ThreadMain() override { + for (int i = 0; i < 300; ++i) { + @try { + NSArray* empty_array = @[]; + [empty_array objectAtIndex:42]; + } @catch (NSException* exception) { + } @finally { + } + } + } +}; + +- (void)catchConcurrentNSException { + std::vector race_threads(30); + for (ThrowNSExceptionThread& race_thread : race_threads) { + race_thread.Start(); + } + + for (ThrowNSExceptionThread& race_thread : race_threads) { + race_thread.Join(); + } +} + - (void)crashInHandlerReentrant { crashpad::CrashpadClient client_; client_.SetMachExceptionCallbackForTesting(abort); diff --git a/shared/sentry/external/crashpad/test/ios/host/cptest_crash_view_controller.h b/shared/sentry/src/external/crashpad/test/ios/host/cptest_crash_view_controller.h similarity index 100% rename from shared/sentry/external/crashpad/test/ios/host/cptest_crash_view_controller.h rename to shared/sentry/src/external/crashpad/test/ios/host/cptest_crash_view_controller.h diff --git a/shared/sentry/external/crashpad/test/ios/host/cptest_crash_view_controller.mm b/shared/sentry/src/external/crashpad/test/ios/host/cptest_crash_view_controller.mm similarity index 95% rename from shared/sentry/external/crashpad/test/ios/host/cptest_crash_view_controller.mm rename to shared/sentry/src/external/crashpad/test/ios/host/cptest_crash_view_controller.mm index 8e4076e3b..c866388c1 100644 --- a/shared/sentry/external/crashpad/test/ios/host/cptest_crash_view_controller.mm +++ b/shared/sentry/src/external/crashpad/test/ios/host/cptest_crash_view_controller.mm @@ -14,10 +14,6 @@ #import "test/ios/host/cptest_crash_view_controller.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @implementation CPTestCrashViewController - (void)loadView { diff --git a/shared/sentry/external/crashpad/test/ios/host/cptest_shared_object.h b/shared/sentry/src/external/crashpad/test/ios/host/cptest_shared_object.h similarity index 95% rename from shared/sentry/external/crashpad/test/ios/host/cptest_shared_object.h rename to shared/sentry/src/external/crashpad/test/ios/host/cptest_shared_object.h index d992458b2..21011ce42 100644 --- a/shared/sentry/external/crashpad/test/ios/host/cptest_shared_object.h +++ b/shared/sentry/src/external/crashpad/test/ios/host/cptest_shared_object.h @@ -73,6 +73,9 @@ // Trigger a crash with an uncaught NSException. - (void)crashNSException; +// Trigger a crash throwing something that isn't an NSException (an NSString). +- (void)crashNotAnNSException; + // Trigger a crash with an uncaught and unhandled NSException. - (void)crashUnhandledNSException; @@ -103,6 +106,9 @@ // Triggers a simulataneous Mach exception and signal in different threads. - (void)crashConcurrentSignalAndMach; +// Triggers simultaneous caught NSExceptions +- (void)catchConcurrentNSException; + // Triggers a SIGABRT signal while handling an NSException to test reentrant // exceptions. - (void)crashInHandlerReentrant; diff --git a/shared/sentry/external/crashpad/test/ios/host/handler_forbidden_allocators.cc b/shared/sentry/src/external/crashpad/test/ios/host/handler_forbidden_allocators.cc similarity index 74% rename from shared/sentry/external/crashpad/test/ios/host/handler_forbidden_allocators.cc rename to shared/sentry/src/external/crashpad/test/ios/host/handler_forbidden_allocators.cc index 34e93e3a6..65e0a136b 100644 --- a/shared/sentry/external/crashpad/test/ios/host/handler_forbidden_allocators.cc +++ b/shared/sentry/src/external/crashpad/test/ios/host/handler_forbidden_allocators.cc @@ -17,9 +17,11 @@ #include #include #include + #include -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" +#include "base/check_op.h" #include "client/crashpad_client.h" #include "util/ios/raw_logging.h" @@ -30,7 +32,25 @@ namespace { uint64_t g_main_thread = 0; uint64_t g_mach_exception_thread = 0; -malloc_zone_t g_old_zone; + +// Somewhat simplified logic copied from Chromium's +// base/allocator/partition_allocator/shim/malloc_zone_functions_apple.h. The +// arrays g_original_zones and g_original_zones_ptr stores all information about +// malloc zones before they are shimmed. This information needs to be accessed +// during dispatch back into the zone. +constexpr int kMaxZoneCount = 30; +malloc_zone_t g_original_zones[kMaxZoneCount]; +malloc_zone_t* g_original_zones_ptr[kMaxZoneCount]; +unsigned int g_zone_count = 0; + +struct _malloc_zone_t original_zone_for_zone(struct _malloc_zone_t* zone) { + for (unsigned int i = 0; i < g_zone_count; ++i) { + if (g_original_zones_ptr[i] == zone) { + return g_original_zones[i]; + } + } + return g_original_zones[0]; +} bool is_handler_thread() { uint64_t thread_self; @@ -44,7 +64,7 @@ void* handler_forbidden_malloc(struct _malloc_zone_t* zone, size_t size) { CRASHPAD_RAW_LOG("handler_forbidden_malloc allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.malloc(zone, size); + return original_zone_for_zone(zone).malloc(zone, size); } void* handler_forbidden_calloc(struct _malloc_zone_t* zone, @@ -54,7 +74,7 @@ void* handler_forbidden_calloc(struct _malloc_zone_t* zone, CRASHPAD_RAW_LOG("handler_forbidden_calloc allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.calloc(zone, num_items, size); + return original_zone_for_zone(zone).calloc(zone, num_items, size); } void* handler_forbidden_valloc(struct _malloc_zone_t* zone, size_t size) { @@ -62,7 +82,7 @@ void* handler_forbidden_valloc(struct _malloc_zone_t* zone, size_t size) { CRASHPAD_RAW_LOG("handler_forbidden_valloc allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.valloc(zone, size); + return original_zone_for_zone(zone).valloc(zone, size); } void handler_forbidden_free(struct _malloc_zone_t* zone, void* ptr) { @@ -70,7 +90,7 @@ void handler_forbidden_free(struct _malloc_zone_t* zone, void* ptr) { CRASHPAD_RAW_LOG("handler_forbidden_free allocator used in handler."); exit(EXIT_FAILURE); } - g_old_zone.free(zone, ptr); + original_zone_for_zone(zone).free(zone, ptr); } void* handler_forbidden_realloc(struct _malloc_zone_t* zone, @@ -80,7 +100,7 @@ void* handler_forbidden_realloc(struct _malloc_zone_t* zone, CRASHPAD_RAW_LOG("handler_forbidden_realloc allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.realloc(zone, ptr, size); + return original_zone_for_zone(zone).realloc(zone, ptr, size); } void handler_forbidden_destroy(struct _malloc_zone_t* zone) { @@ -88,7 +108,7 @@ void handler_forbidden_destroy(struct _malloc_zone_t* zone) { CRASHPAD_RAW_LOG("handler_forbidden_destroy allocator used in handler."); exit(EXIT_FAILURE); } - g_old_zone.destroy(zone); + original_zone_for_zone(zone).destroy(zone); } void* handler_forbidden_memalign(struct _malloc_zone_t* zone, @@ -98,7 +118,7 @@ void* handler_forbidden_memalign(struct _malloc_zone_t* zone, CRASHPAD_RAW_LOG("handler_forbidden_memalign allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.memalign(zone, alignment, size); + return original_zone_for_zone(zone).memalign(zone, alignment, size); } unsigned handler_forbidden_batch_malloc(struct _malloc_zone_t* zone, @@ -110,7 +130,8 @@ unsigned handler_forbidden_batch_malloc(struct _malloc_zone_t* zone, "handler_forbidden_batch_malloc allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.batch_malloc(zone, size, results, num_requested); + return original_zone_for_zone(zone).batch_malloc( + zone, size, results, num_requested); } void handler_forbidden_batch_free(struct _malloc_zone_t* zone, @@ -120,7 +141,7 @@ void handler_forbidden_batch_free(struct _malloc_zone_t* zone, CRASHPAD_RAW_LOG("handler_forbidden_batch_free allocator used in handler."); exit(EXIT_FAILURE); } - g_old_zone.batch_free(zone, to_be_freed, num_to_be_freed); + original_zone_for_zone(zone).batch_free(zone, to_be_freed, num_to_be_freed); } void handler_forbidden_free_definite_size(struct _malloc_zone_t* zone, @@ -131,7 +152,7 @@ void handler_forbidden_free_definite_size(struct _malloc_zone_t* zone, "handler_forbidden_free_definite_size allocator used in handler."); exit(EXIT_FAILURE); } - g_old_zone.free_definite_size(zone, ptr, size); + original_zone_for_zone(zone).free_definite_size(zone, ptr, size); } size_t handler_forbidden_pressure_relief(struct _malloc_zone_t* zone, @@ -141,7 +162,7 @@ size_t handler_forbidden_pressure_relief(struct _malloc_zone_t* zone, "handler_forbidden_pressure_relief allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.pressure_relief(zone, goal); + return original_zone_for_zone(zone).pressure_relief(zone, goal); } boolean_t handler_forbidden_claimed_address(struct _malloc_zone_t* zone, @@ -151,10 +172,46 @@ boolean_t handler_forbidden_claimed_address(struct _malloc_zone_t* zone, "handler_forbidden_claimed_address allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.claimed_address(zone, ptr); + + if (original_zone_for_zone(zone).claimed_address) { + return original_zone_for_zone(zone).claimed_address(zone, ptr); + } + + // If the fast API 'claimed_address' is not implemented in the specified zone, + // fall back to 'size' function, which also tells whether the given address + // belongs to the zone or not although it'd be slow. + return original_zone_for_zone(zone).size(zone, ptr); } #if defined(__IPHONE_16_1) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_1 +// The fallback function to be called when try_free_default_function receives a +// pointer which doesn't belong to the allocator. +void TryFreeDefaultFallbackToFindZoneAndFree(void* ptr) { + unsigned int zone_count = 0; + vm_address_t* zones = nullptr; + kern_return_t result = + malloc_get_all_zones(mach_task_self(), nullptr, &zones, &zone_count); + MACH_CHECK(result == KERN_SUCCESS, result) << "malloc_get_all_zones"; + + // "find_zone_and_free" expected by try_free_default. + // + // libmalloc's zones call find_registered_zone() in case the default one + // doesn't handle the allocation. We can't, so we try to emulate it. See the + // implementation in libmalloc/src/malloc.c for details. + // https://github.com/apple-oss-distributions/libmalloc/blob/main/src/malloc.c + for (unsigned int i = 0; i < zone_count; ++i) { + malloc_zone_t* zone = reinterpret_cast(zones[i]); + if (size_t size = zone->size(zone, ptr)) { + if (zone->version >= 6 && zone->free_definite_size) { + zone->free_definite_size(zone, ptr, size); + } else { + zone->free(zone, ptr); + } + return; + } + } +} + void handler_forbidden_try_free_default(struct _malloc_zone_t* zone, void* ptr) { if (is_handler_thread()) { @@ -162,7 +219,11 @@ void handler_forbidden_try_free_default(struct _malloc_zone_t* zone, "handler_forbidden_try_free_default allocator used in handler."); exit(EXIT_FAILURE); } - g_old_zone.try_free_default(zone, ptr); + + if (original_zone_for_zone(zone).try_free_default) { + return original_zone_for_zone(zone).try_free_default(zone, ptr); + } + TryFreeDefaultFallbackToFindZoneAndFree(ptr); } #endif @@ -171,7 +232,7 @@ size_t handler_forbidden_size(struct _malloc_zone_t* zone, const void* ptr) { CRASHPAD_RAW_LOG("handler_forbidden_size allocator used in handler."); exit(EXIT_FAILURE); } - return g_old_zone.size(zone, ptr); + return original_zone_for_zone(zone).size(zone, ptr); } bool DeprotectMallocZone(malloc_zone_t* default_zone, @@ -253,7 +314,6 @@ void ReplaceZoneFunctions(malloc_zone_t* zone, const malloc_zone_t* functions) { zone->destroy = functions->destroy; zone->batch_malloc = functions->batch_malloc; zone->batch_free = functions->batch_free; - zone->introspect = functions->introspect; zone->memalign = functions->memalign; zone->free_definite_size = functions->free_definite_size; zone->pressure_relief = functions->pressure_relief; @@ -286,8 +346,6 @@ void ReplaceAllocatorsWithHandlerForbidden() { CrashpadClient crashpad_client; g_mach_exception_thread = crashpad_client.GetThreadIdForTesting(); - malloc_zone_t* default_zone = malloc_default_zone(); - memcpy(&g_old_zone, default_zone, sizeof(g_old_zone)); malloc_zone_t new_functions = {}; new_functions.size = handler_forbidden_size; new_functions.malloc = handler_forbidden_malloc; @@ -305,8 +363,16 @@ void ReplaceAllocatorsWithHandlerForbidden() { #if defined(__IPHONE_16_1) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_1 new_functions.try_free_default = handler_forbidden_try_free_default; #endif + malloc_zone_t* default_zone = malloc_default_zone(); + g_original_zones_ptr[g_zone_count] = default_zone; + ReplaceZoneFunctions(&g_original_zones[g_zone_count++], default_zone); ReplaceZoneFunctions(default_zone, &new_functions); + malloc_zone_t* purgeable_zone = malloc_default_purgeable_zone(); + g_original_zones_ptr[g_zone_count] = purgeable_zone; + ReplaceZoneFunctions(&g_original_zones[g_zone_count++], purgeable_zone); + ReplaceZoneFunctions(purgeable_zone, &new_functions); + vm_address_t* zones; unsigned int count; kern_return_t kr = @@ -315,11 +381,13 @@ void ReplaceAllocatorsWithHandlerForbidden() { return; for (unsigned int i = 0; i < count; ++i) { malloc_zone_t* zone = reinterpret_cast(zones[i]); + g_original_zones_ptr[g_zone_count] = zone; + ReplaceZoneFunctions(&g_original_zones[g_zone_count++], zone); ReplaceZoneFunctions(zone, &new_functions); - } - malloc_zone_t* purgeable_zone = malloc_default_purgeable_zone(); - ReplaceZoneFunctions(purgeable_zone, &new_functions); + if (g_zone_count >= kMaxZoneCount) + break; + } } } // namespace test diff --git a/shared/sentry/external/crashpad/test/ios/host/handler_forbidden_allocators.h b/shared/sentry/src/external/crashpad/test/ios/host/handler_forbidden_allocators.h similarity index 100% rename from shared/sentry/external/crashpad/test/ios/host/handler_forbidden_allocators.h rename to shared/sentry/src/external/crashpad/test/ios/host/handler_forbidden_allocators.h diff --git a/shared/sentry/external/crashpad/test/ios/host/main.mm b/shared/sentry/src/external/crashpad/test/ios/host/main.mm similarity index 90% rename from shared/sentry/external/crashpad/test/ios/host/main.mm rename to shared/sentry/src/external/crashpad/test/ios/host/main.mm index d1d6b00f5..cf06f30db 100644 --- a/shared/sentry/external/crashpad/test/ios/host/main.mm +++ b/shared/sentry/src/external/crashpad/test/ios/host/main.mm @@ -16,10 +16,6 @@ #import "test/ios/host/cptest_application_delegate.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - int main(int argc, char* argv[]) { NSString* appDelegateClassName; @autoreleasepool { diff --git a/shared/sentry/external/crashpad/test/linux/fake_ptrace_connection.cc b/shared/sentry/src/external/crashpad/test/linux/fake_ptrace_connection.cc similarity index 100% rename from shared/sentry/external/crashpad/test/linux/fake_ptrace_connection.cc rename to shared/sentry/src/external/crashpad/test/linux/fake_ptrace_connection.cc diff --git a/shared/sentry/external/crashpad/test/linux/fake_ptrace_connection.h b/shared/sentry/src/external/crashpad/test/linux/fake_ptrace_connection.h similarity index 100% rename from shared/sentry/external/crashpad/test/linux/fake_ptrace_connection.h rename to shared/sentry/src/external/crashpad/test/linux/fake_ptrace_connection.h diff --git a/shared/sentry/external/crashpad/test/linux/get_tls.cc b/shared/sentry/src/external/crashpad/test/linux/get_tls.cc similarity index 96% rename from shared/sentry/external/crashpad/test/linux/get_tls.cc rename to shared/sentry/src/external/crashpad/test/linux/get_tls.cc index c8147f0df..405976eaa 100644 --- a/shared/sentry/external/crashpad/test/linux/get_tls.cc +++ b/shared/sentry/src/external/crashpad/test/linux/get_tls.cc @@ -49,6 +49,8 @@ LinuxVMAddress GetTLS() { : "=r"(tls) : : "$3"); +#elif defined(ARCH_CPU_RISCV64) + asm("mv %0, tp" : "=r"(tls)); #else #error Port. #endif // ARCH_CPU_ARMEL diff --git a/shared/sentry/external/crashpad/test/linux/get_tls.h b/shared/sentry/src/external/crashpad/test/linux/get_tls.h similarity index 100% rename from shared/sentry/external/crashpad/test/linux/get_tls.h rename to shared/sentry/src/external/crashpad/test/linux/get_tls.h diff --git a/shared/sentry/external/crashpad/test/mac/dyld.cc b/shared/sentry/src/external/crashpad/test/mac/dyld.cc similarity index 100% rename from shared/sentry/external/crashpad/test/mac/dyld.cc rename to shared/sentry/src/external/crashpad/test/mac/dyld.cc diff --git a/shared/sentry/external/crashpad/test/mac/dyld.h b/shared/sentry/src/external/crashpad/test/mac/dyld.h similarity index 100% rename from shared/sentry/external/crashpad/test/mac/dyld.h rename to shared/sentry/src/external/crashpad/test/mac/dyld.h diff --git a/shared/sentry/external/crashpad/test/mac/exception_swallower.cc b/shared/sentry/src/external/crashpad/test/mac/exception_swallower.cc similarity index 97% rename from shared/sentry/external/crashpad/test/mac/exception_swallower.cc rename to shared/sentry/src/external/crashpad/test/mac/exception_swallower.cc index 52c2a2d63..132fb428a 100644 --- a/shared/sentry/external/crashpad/test/mac/exception_swallower.cc +++ b/shared/sentry/src/external/crashpad/test/mac/exception_swallower.cc @@ -20,8 +20,8 @@ #include +#include "base/apple/scoped_mach_port.h" #include "base/check_op.h" -#include "base/mac/scoped_mach_port.h" #include "base/strings/stringprintf.h" #include "handler/mac/exception_handler_server.h" #include "util/mach/bootstrap.h" @@ -58,7 +58,7 @@ class ExceptionSwallower::ExceptionSwallowerThread public UniversalMachExcServer::Interface { public: explicit ExceptionSwallowerThread( - base::mac::ScopedMachReceiveRight receive_right) + base::apple::ScopedMachReceiveRight receive_right) : Thread(), UniversalMachExcServer::Interface(), exception_handler_server_(std::move(receive_right), true), @@ -129,7 +129,7 @@ ExceptionSwallower::ExceptionSwallower() : exception_swallower_thread_() { base::StringPrintf("org.chromium.crashpad.test.exception_swallower.%d.%s", getpid(), RandomString().c_str()); - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( BootstrapCheckIn(service_name)); CHECK(receive_right.is_valid()); @@ -164,7 +164,7 @@ void ExceptionSwallower::SwallowExceptions() { const char* service_name = CheckedGetenv(kServiceEnvironmentVariable); CHECK(service_name); - base::mac::ScopedMachSendRight exception_swallower_port( + base::apple::ScopedMachSendRight exception_swallower_port( BootstrapLookUp(service_name)); CHECK(exception_swallower_port.is_valid()); diff --git a/shared/sentry/external/crashpad/test/mac/exception_swallower.h b/shared/sentry/src/external/crashpad/test/mac/exception_swallower.h similarity index 100% rename from shared/sentry/external/crashpad/test/mac/exception_swallower.h rename to shared/sentry/src/external/crashpad/test/mac/exception_swallower.h diff --git a/shared/sentry/external/crashpad/test/mac/mach_errors.cc b/shared/sentry/src/external/crashpad/test/mac/mach_errors.cc similarity index 100% rename from shared/sentry/external/crashpad/test/mac/mach_errors.cc rename to shared/sentry/src/external/crashpad/test/mac/mach_errors.cc diff --git a/shared/sentry/external/crashpad/test/mac/mach_errors.h b/shared/sentry/src/external/crashpad/test/mac/mach_errors.h similarity index 91% rename from shared/sentry/external/crashpad/test/mac/mach_errors.h rename to shared/sentry/src/external/crashpad/test/mac/mach_errors.h index ba3191b07..862d717cb 100644 --- a/shared/sentry/external/crashpad/test/mac/mach_errors.h +++ b/shared/sentry/src/external/crashpad/test/mac/mach_errors.h @@ -23,8 +23,9 @@ namespace crashpad { namespace test { // This function formats messages in a similar way to the Mach error logging -// macros in base/mac/mach_logging.h. It exists to interoperate with Google Test -// assertions, which don’t interoperate with logging but can be streamed to. +// macros in base/apple/mach_logging.h. It exists to interoperate with Google +// Test assertions, which don’t interoperate with logging but can be streamed +// to. // // Where non-test code could do: // MACH_CHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate"; diff --git a/shared/sentry/external/crashpad/test/mac/mach_multiprocess.cc b/shared/sentry/src/external/crashpad/test/mac/mach_multiprocess.cc similarity index 97% rename from shared/sentry/external/crashpad/test/mac/mach_multiprocess.cc rename to shared/sentry/src/external/crashpad/test/mac/mach_multiprocess.cc index 6af870e81..d317055f0 100644 --- a/shared/sentry/external/crashpad/test/mac/mach_multiprocess.cc +++ b/shared/sentry/src/external/crashpad/test/mac/mach_multiprocess.cc @@ -21,8 +21,8 @@ #include #include +#include "base/apple/scoped_mach_port.h" #include "base/auto_reset.h" -#include "base/mac/scoped_mach_port.h" #include "gtest/gtest.h" #include "test/errors.h" #include "test/mac/mach_errors.h" @@ -64,9 +64,9 @@ struct MachMultiprocessInfo { } std::string service_name; - base::mac::ScopedMachReceiveRight local_port; - base::mac::ScopedMachSendRight remote_port; - base::mac::ScopedMachSendRight child_task; // valid only in parent + base::apple::ScopedMachReceiveRight local_port; + base::apple::ScopedMachSendRight remote_port; + base::apple::ScopedMachSendRight child_task; // valid only in parent }; } // namespace internal diff --git a/shared/sentry/external/crashpad/test/mac/mach_multiprocess.h b/shared/sentry/src/external/crashpad/test/mac/mach_multiprocess.h similarity index 100% rename from shared/sentry/external/crashpad/test/mac/mach_multiprocess.h rename to shared/sentry/src/external/crashpad/test/mac/mach_multiprocess.h diff --git a/shared/sentry/external/crashpad/test/mac/mach_multiprocess_test.cc b/shared/sentry/src/external/crashpad/test/mac/mach_multiprocess_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/mac/mach_multiprocess_test.cc rename to shared/sentry/src/external/crashpad/test/mac/mach_multiprocess_test.cc diff --git a/shared/sentry/external/crashpad/test/main_arguments.cc b/shared/sentry/src/external/crashpad/test/main_arguments.cc similarity index 100% rename from shared/sentry/external/crashpad/test/main_arguments.cc rename to shared/sentry/src/external/crashpad/test/main_arguments.cc diff --git a/shared/sentry/external/crashpad/test/main_arguments.h b/shared/sentry/src/external/crashpad/test/main_arguments.h similarity index 100% rename from shared/sentry/external/crashpad/test/main_arguments.h rename to shared/sentry/src/external/crashpad/test/main_arguments.h diff --git a/shared/sentry/external/crashpad/test/main_arguments_test.cc b/shared/sentry/src/external/crashpad/test/main_arguments_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/main_arguments_test.cc rename to shared/sentry/src/external/crashpad/test/main_arguments_test.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess.h b/shared/sentry/src/external/crashpad/test/multiprocess.h similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess.h rename to shared/sentry/src/external/crashpad/test/multiprocess.h diff --git a/shared/sentry/external/crashpad/test/multiprocess_exec.cc b/shared/sentry/src/external/crashpad/test/multiprocess_exec.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_exec.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_exec.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess_exec.h b/shared/sentry/src/external/crashpad/test/multiprocess_exec.h similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_exec.h rename to shared/sentry/src/external/crashpad/test/multiprocess_exec.h diff --git a/shared/sentry/external/crashpad/test/multiprocess_exec_fuchsia.cc b/shared/sentry/src/external/crashpad/test/multiprocess_exec_fuchsia.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_exec_fuchsia.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_exec_fuchsia.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess_exec_posix.cc b/shared/sentry/src/external/crashpad/test/multiprocess_exec_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_exec_posix.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_exec_posix.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess_exec_test.cc b/shared/sentry/src/external/crashpad/test/multiprocess_exec_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_exec_test.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_exec_test.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess_exec_test_child.cc b/shared/sentry/src/external/crashpad/test/multiprocess_exec_test_child.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_exec_test_child.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_exec_test_child.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess_exec_win.cc b/shared/sentry/src/external/crashpad/test/multiprocess_exec_win.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_exec_win.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_exec_win.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess_posix.cc b/shared/sentry/src/external/crashpad/test/multiprocess_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_posix.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_posix.cc diff --git a/shared/sentry/external/crashpad/test/multiprocess_posix_test.cc b/shared/sentry/src/external/crashpad/test/multiprocess_posix_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/multiprocess_posix_test.cc rename to shared/sentry/src/external/crashpad/test/multiprocess_posix_test.cc diff --git a/shared/sentry/external/crashpad/test/process_type.cc b/shared/sentry/src/external/crashpad/test/process_type.cc similarity index 100% rename from shared/sentry/external/crashpad/test/process_type.cc rename to shared/sentry/src/external/crashpad/test/process_type.cc diff --git a/shared/sentry/external/crashpad/test/process_type.h b/shared/sentry/src/external/crashpad/test/process_type.h similarity index 100% rename from shared/sentry/external/crashpad/test/process_type.h rename to shared/sentry/src/external/crashpad/test/process_type.h diff --git a/shared/sentry/external/crashpad/test/scoped_guarded_page.h b/shared/sentry/src/external/crashpad/test/scoped_guarded_page.h similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_guarded_page.h rename to shared/sentry/src/external/crashpad/test/scoped_guarded_page.h diff --git a/shared/sentry/external/crashpad/test/scoped_guarded_page_posix.cc b/shared/sentry/src/external/crashpad/test/scoped_guarded_page_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_guarded_page_posix.cc rename to shared/sentry/src/external/crashpad/test/scoped_guarded_page_posix.cc diff --git a/shared/sentry/external/crashpad/test/scoped_guarded_page_test.cc b/shared/sentry/src/external/crashpad/test/scoped_guarded_page_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_guarded_page_test.cc rename to shared/sentry/src/external/crashpad/test/scoped_guarded_page_test.cc diff --git a/shared/sentry/external/crashpad/test/scoped_guarded_page_win.cc b/shared/sentry/src/external/crashpad/test/scoped_guarded_page_win.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_guarded_page_win.cc rename to shared/sentry/src/external/crashpad/test/scoped_guarded_page_win.cc diff --git a/shared/sentry/external/crashpad/test/scoped_module_handle.cc b/shared/sentry/src/external/crashpad/test/scoped_module_handle.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_module_handle.cc rename to shared/sentry/src/external/crashpad/test/scoped_module_handle.cc diff --git a/shared/sentry/external/crashpad/test/scoped_module_handle.h b/shared/sentry/src/external/crashpad/test/scoped_module_handle.h similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_module_handle.h rename to shared/sentry/src/external/crashpad/test/scoped_module_handle.h diff --git a/shared/sentry/external/crashpad/test/scoped_set_thread_name.h b/shared/sentry/src/external/crashpad/test/scoped_set_thread_name.h similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_set_thread_name.h rename to shared/sentry/src/external/crashpad/test/scoped_set_thread_name.h diff --git a/shared/sentry/external/crashpad/test/scoped_set_thread_name_fuchsia.cc b/shared/sentry/src/external/crashpad/test/scoped_set_thread_name_fuchsia.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_set_thread_name_fuchsia.cc rename to shared/sentry/src/external/crashpad/test/scoped_set_thread_name_fuchsia.cc diff --git a/shared/sentry/external/crashpad/test/scoped_set_thread_name_posix.cc b/shared/sentry/src/external/crashpad/test/scoped_set_thread_name_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_set_thread_name_posix.cc rename to shared/sentry/src/external/crashpad/test/scoped_set_thread_name_posix.cc diff --git a/shared/sentry/external/crashpad/test/scoped_set_thread_name_win.cc b/shared/sentry/src/external/crashpad/test/scoped_set_thread_name_win.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_set_thread_name_win.cc rename to shared/sentry/src/external/crashpad/test/scoped_set_thread_name_win.cc diff --git a/shared/sentry/external/crashpad/test/scoped_temp_dir.cc b/shared/sentry/src/external/crashpad/test/scoped_temp_dir.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_temp_dir.cc rename to shared/sentry/src/external/crashpad/test/scoped_temp_dir.cc diff --git a/shared/sentry/external/crashpad/test/scoped_temp_dir.h b/shared/sentry/src/external/crashpad/test/scoped_temp_dir.h similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_temp_dir.h rename to shared/sentry/src/external/crashpad/test/scoped_temp_dir.h diff --git a/shared/sentry/external/crashpad/test/scoped_temp_dir_posix.cc b/shared/sentry/src/external/crashpad/test/scoped_temp_dir_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_temp_dir_posix.cc rename to shared/sentry/src/external/crashpad/test/scoped_temp_dir_posix.cc diff --git a/shared/sentry/external/crashpad/test/scoped_temp_dir_test.cc b/shared/sentry/src/external/crashpad/test/scoped_temp_dir_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_temp_dir_test.cc rename to shared/sentry/src/external/crashpad/test/scoped_temp_dir_test.cc diff --git a/shared/sentry/external/crashpad/test/scoped_temp_dir_win.cc b/shared/sentry/src/external/crashpad/test/scoped_temp_dir_win.cc similarity index 100% rename from shared/sentry/external/crashpad/test/scoped_temp_dir_win.cc rename to shared/sentry/src/external/crashpad/test/scoped_temp_dir_win.cc diff --git a/shared/sentry/external/crashpad/test/test_paths.cc b/shared/sentry/src/external/crashpad/test/test_paths.cc similarity index 99% rename from shared/sentry/external/crashpad/test/test_paths.cc rename to shared/sentry/src/external/crashpad/test/test_paths.cc index 1e1c250a3..75399ac82 100644 --- a/shared/sentry/external/crashpad/test/test_paths.cc +++ b/shared/sentry/src/external/crashpad/test/test_paths.cc @@ -17,6 +17,7 @@ #include #include +#include "base/check.h" #include "base/logging.h" #include "build/build_config.h" #include "util/misc/paths.h" diff --git a/shared/sentry/external/crashpad/test/test_paths.h b/shared/sentry/src/external/crashpad/test/test_paths.h similarity index 100% rename from shared/sentry/external/crashpad/test/test_paths.h rename to shared/sentry/src/external/crashpad/test/test_paths.h diff --git a/shared/sentry/external/crashpad/test/test_paths_test.cc b/shared/sentry/src/external/crashpad/test/test_paths_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/test_paths_test.cc rename to shared/sentry/src/external/crashpad/test/test_paths_test.cc diff --git a/shared/sentry/external/crashpad/test/test_paths_test_data_root.txt b/shared/sentry/src/external/crashpad/test/test_paths_test_data_root.txt similarity index 100% rename from shared/sentry/external/crashpad/test/test_paths_test_data_root.txt rename to shared/sentry/src/external/crashpad/test/test_paths_test_data_root.txt diff --git a/shared/sentry/external/crashpad/test/win/child_launcher.cc b/shared/sentry/src/external/crashpad/test/win/child_launcher.cc similarity index 100% rename from shared/sentry/external/crashpad/test/win/child_launcher.cc rename to shared/sentry/src/external/crashpad/test/win/child_launcher.cc diff --git a/shared/sentry/external/crashpad/test/win/child_launcher.h b/shared/sentry/src/external/crashpad/test/win/child_launcher.h similarity index 100% rename from shared/sentry/external/crashpad/test/win/child_launcher.h rename to shared/sentry/src/external/crashpad/test/win/child_launcher.h diff --git a/shared/sentry/external/crashpad/test/win/win_child_process.cc b/shared/sentry/src/external/crashpad/test/win/win_child_process.cc similarity index 99% rename from shared/sentry/external/crashpad/test/win/win_child_process.cc rename to shared/sentry/src/external/crashpad/test/win/win_child_process.cc index 72b55087a..d4d9a462a 100644 --- a/shared/sentry/external/crashpad/test/win/win_child_process.cc +++ b/shared/sentry/src/external/crashpad/test/win/win_child_process.cc @@ -20,6 +20,7 @@ #include #include +#include "base/check.h" #include "base/logging.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -191,7 +192,7 @@ std::unique_ptr WinChildProcess::Launch() { TestPaths::Executable().value() + base::UTF8ToWide(base::StringPrintf( " --gtest_filter=%s.%s %s=0x%x|0x%x --gtest_also_run_disabled_tests", - test_info->test_case_name(), + test_info->test_suite_name(), test_info->name(), kIsMultiprocessChild, HandleToInt(write_for_child.get()), diff --git a/shared/sentry/external/crashpad/test/win/win_child_process.h b/shared/sentry/src/external/crashpad/test/win/win_child_process.h similarity index 100% rename from shared/sentry/external/crashpad/test/win/win_child_process.h rename to shared/sentry/src/external/crashpad/test/win/win_child_process.h diff --git a/shared/sentry/external/crashpad/test/win/win_child_process_test.cc b/shared/sentry/src/external/crashpad/test/win/win_child_process_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/win/win_child_process_test.cc rename to shared/sentry/src/external/crashpad/test/win/win_child_process_test.cc diff --git a/shared/sentry/external/crashpad/test/win/win_multiprocess.cc b/shared/sentry/src/external/crashpad/test/win/win_multiprocess.cc similarity index 100% rename from shared/sentry/external/crashpad/test/win/win_multiprocess.cc rename to shared/sentry/src/external/crashpad/test/win/win_multiprocess.cc diff --git a/shared/sentry/external/crashpad/test/win/win_multiprocess.h b/shared/sentry/src/external/crashpad/test/win/win_multiprocess.h similarity index 100% rename from shared/sentry/external/crashpad/test/win/win_multiprocess.h rename to shared/sentry/src/external/crashpad/test/win/win_multiprocess.h diff --git a/shared/sentry/external/crashpad/test/win/win_multiprocess_test.cc b/shared/sentry/src/external/crashpad/test/win/win_multiprocess_test.cc similarity index 100% rename from shared/sentry/external/crashpad/test/win/win_multiprocess_test.cc rename to shared/sentry/src/external/crashpad/test/win/win_multiprocess_test.cc diff --git a/shared/sentry/external/crashpad/test/win/win_multiprocess_with_temp_dir.cc b/shared/sentry/src/external/crashpad/test/win/win_multiprocess_with_temp_dir.cc similarity index 100% rename from shared/sentry/external/crashpad/test/win/win_multiprocess_with_temp_dir.cc rename to shared/sentry/src/external/crashpad/test/win/win_multiprocess_with_temp_dir.cc diff --git a/shared/sentry/external/crashpad/test/win/win_multiprocess_with_temp_dir.h b/shared/sentry/src/external/crashpad/test/win/win_multiprocess_with_temp_dir.h similarity index 100% rename from shared/sentry/external/crashpad/test/win/win_multiprocess_with_temp_dir.h rename to shared/sentry/src/external/crashpad/test/win/win_multiprocess_with_temp_dir.h diff --git a/shared/sentry/external/crashpad/third_party/cpp-httplib/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/cpp-httplib/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/third_party/cpp-httplib/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/cpp-httplib/BUILD.gn diff --git a/shared/sentry/external/crashpad/third_party/cpp-httplib/README.crashpad b/shared/sentry/src/external/crashpad/third_party/cpp-httplib/README.crashpad similarity index 97% rename from shared/sentry/external/crashpad/third_party/cpp-httplib/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/cpp-httplib/README.crashpad index cfb476e0a..a1ba93aaa 100644 --- a/shared/sentry/external/crashpad/third_party/cpp-httplib/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/cpp-httplib/README.crashpad @@ -5,6 +5,7 @@ Revision: 5b3187e2f9e77c672063d49a1167bbb563da023e License: MIT License File: cpp-httplib/LICENSE Security Critical: no (test only) +Shipped: no Description: A C++11 header-only HTTP library. diff --git a/shared/sentry/external/crashpad/third_party/cpp-httplib/cpp-httplib/LICENSE b/shared/sentry/src/external/crashpad/third_party/cpp-httplib/cpp-httplib/LICENSE similarity index 100% rename from shared/sentry/external/crashpad/third_party/cpp-httplib/cpp-httplib/LICENSE rename to shared/sentry/src/external/crashpad/third_party/cpp-httplib/cpp-httplib/LICENSE diff --git a/shared/sentry/external/crashpad/third_party/cpp-httplib/cpp-httplib/README.md b/shared/sentry/src/external/crashpad/third_party/cpp-httplib/cpp-httplib/README.md similarity index 100% rename from shared/sentry/external/crashpad/third_party/cpp-httplib/cpp-httplib/README.md rename to shared/sentry/src/external/crashpad/third_party/cpp-httplib/cpp-httplib/README.md diff --git a/shared/sentry/external/crashpad/third_party/cpp-httplib/cpp-httplib/httplib.h b/shared/sentry/src/external/crashpad/third_party/cpp-httplib/cpp-httplib/httplib.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/cpp-httplib/cpp-httplib/httplib.h rename to shared/sentry/src/external/crashpad/third_party/cpp-httplib/cpp-httplib/httplib.h diff --git a/shared/sentry/external/crashpad/third_party/edo/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/edo/BUILD.gn similarity index 98% rename from shared/sentry/external/crashpad/third_party/edo/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/edo/BUILD.gn index 00a486cbb..1bd98e17a 100644 --- a/shared/sentry/external/crashpad/third_party/edo/BUILD.gn +++ b/shared/sentry/src/external/crashpad/third_party/edo/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. +# Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -139,6 +139,6 @@ if (crashpad_is_in_chromium) { ] public_configs = [ ":config" ] - deps = [ "../../build:ios_enable_arc" ] + deps = [ "../../build:apple_enable_arc" ] } } diff --git a/shared/sentry/external/crashpad/third_party/edo/README.crashpad b/shared/sentry/src/external/crashpad/third_party/edo/README.crashpad similarity index 95% rename from shared/sentry/external/crashpad/third_party/edo/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/edo/README.crashpad index fb8315825..770026aae 100644 --- a/shared/sentry/external/crashpad/third_party/edo/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/edo/README.crashpad @@ -5,6 +5,7 @@ Revision: See DEPS License: Apache 2.0 License File: edo/LICENSE Security Critical: no +Shipped: no Description: iOS remote method invocations (distant object) over Inter-process communication layer. diff --git a/shared/sentry/external/crashpad/third_party/fuchsia/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/fuchsia/BUILD.gn similarity index 97% rename from shared/sentry/external/crashpad/third_party/fuchsia/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/fuchsia/BUILD.gn index 7594c1c9f..51aa43ba6 100644 --- a/shared/sentry/external/crashpad/third_party/fuchsia/BUILD.gn +++ b/shared/sentry/src/external/crashpad/third_party/fuchsia/BUILD.gn @@ -18,7 +18,7 @@ if (crashpad_is_in_fuchsia) { group("fuchsia") { public_deps = [ "//sdk/lib/fdio", - "//zircon/public/lib/zx", + "//zircon/system/ulib/zx", ] } } else if (crashpad_is_in_chromium) { diff --git a/shared/sentry/external/crashpad/third_party/fuchsia/README.crashpad b/shared/sentry/src/external/crashpad/third_party/fuchsia/README.crashpad similarity index 100% rename from shared/sentry/external/crashpad/third_party/fuchsia/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/fuchsia/README.crashpad diff --git a/shared/sentry/external/crashpad/third_party/fuchsia/runner.py b/shared/sentry/src/external/crashpad/third_party/fuchsia/runner.py similarity index 100% rename from shared/sentry/external/crashpad/third_party/fuchsia/runner.py rename to shared/sentry/src/external/crashpad/third_party/fuchsia/runner.py diff --git a/shared/sentry/external/crashpad/third_party/getopt/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/getopt/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/third_party/getopt/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/getopt/BUILD.gn diff --git a/shared/sentry/external/crashpad/third_party/getopt/CMakeLists.txt b/shared/sentry/src/external/crashpad/third_party/getopt/CMakeLists.txt similarity index 100% rename from shared/sentry/external/crashpad/third_party/getopt/CMakeLists.txt rename to shared/sentry/src/external/crashpad/third_party/getopt/CMakeLists.txt diff --git a/shared/sentry/external/crashpad/third_party/getopt/LICENSE b/shared/sentry/src/external/crashpad/third_party/getopt/LICENSE similarity index 100% rename from shared/sentry/external/crashpad/third_party/getopt/LICENSE rename to shared/sentry/src/external/crashpad/third_party/getopt/LICENSE diff --git a/shared/sentry/external/crashpad/third_party/getopt/README.crashpad b/shared/sentry/src/external/crashpad/third_party/getopt/README.crashpad similarity index 98% rename from shared/sentry/external/crashpad/third_party/getopt/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/getopt/README.crashpad index b7ff95436..ac3201a61 100644 --- a/shared/sentry/external/crashpad/third_party/getopt/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/getopt/README.crashpad @@ -4,6 +4,7 @@ URL: https://sourceware.org/ml/newlib/2005/msg00758.html License: Public domain License File: LICENSE Security Critical: no +Shipped: yes Description: A public domain implementation of getopt. diff --git a/shared/sentry/external/crashpad/third_party/getopt/getopt.cc b/shared/sentry/src/external/crashpad/third_party/getopt/getopt.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/getopt/getopt.cc rename to shared/sentry/src/external/crashpad/third_party/getopt/getopt.cc diff --git a/shared/sentry/external/crashpad/third_party/getopt/getopt.h b/shared/sentry/src/external/crashpad/third_party/getopt/getopt.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/getopt/getopt.h rename to shared/sentry/src/external/crashpad/third_party/getopt/getopt.h diff --git a/shared/sentry/external/crashpad/third_party/googletest/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/googletest/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/third_party/googletest/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/googletest/BUILD.gn diff --git a/shared/sentry/external/crashpad/third_party/googletest/README.crashpad b/shared/sentry/src/external/crashpad/third_party/googletest/README.crashpad similarity index 97% rename from shared/sentry/external/crashpad/third_party/googletest/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/googletest/README.crashpad index 9a6ca6c6b..ecdce8871 100644 --- a/shared/sentry/external/crashpad/third_party/googletest/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/googletest/README.crashpad @@ -5,6 +5,7 @@ Revision: See DEPS License: BSD 3-clause License File: googletest/googletest/LICENSE Security Critical: no +Shipped: no Description: Google Test (Google C++ Testing Framework) is Google’s framework for writing C++ diff --git a/shared/sentry/external/crashpad/third_party/gyp/README.crashpad b/shared/sentry/src/external/crashpad/third_party/gyp/README.crashpad similarity index 95% rename from shared/sentry/external/crashpad/third_party/gyp/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/gyp/README.crashpad index 18eb16491..ea5a342bf 100644 --- a/shared/sentry/external/crashpad/third_party/gyp/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/gyp/README.crashpad @@ -5,6 +5,7 @@ Revision: See DEPS License: BSD 3-clause License File: gyp/LICENSE Security Critical: no +Shipped: no Description: GYP is used to generate build files. diff --git a/shared/sentry/external/crashpad/third_party/linux/README.crashpad b/shared/sentry/src/external/crashpad/third_party/linux/README.crashpad similarity index 100% rename from shared/sentry/external/crashpad/third_party/linux/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/linux/README.crashpad diff --git a/shared/sentry/external/crashpad/third_party/lss/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/lss/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/third_party/lss/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/lss/BUILD.gn diff --git a/shared/sentry/external/crashpad/third_party/lss/README.crashpad b/shared/sentry/src/external/crashpad/third_party/lss/README.crashpad similarity index 97% rename from shared/sentry/external/crashpad/third_party/lss/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/lss/README.crashpad index d1ac9913e..9a12c1c82 100644 --- a/shared/sentry/external/crashpad/third_party/lss/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/lss/README.crashpad @@ -5,6 +5,7 @@ Revision: See DEPS License: BSD 3-clause License File: lss/linux_syscall_support.h Security Critical: yes +Shipped: yes Description: Every so often, projects need to directly embed Linux system calls instead of diff --git a/shared/sentry/external/crashpad/third_party/lss/lss.h b/shared/sentry/src/external/crashpad/third_party/lss/lss.h similarity index 91% rename from shared/sentry/external/crashpad/third_party/lss/lss.h rename to shared/sentry/src/external/crashpad/third_party/lss/lss.h index f768a7859..90cb9bcfe 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss.h +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss.h @@ -20,7 +20,7 @@ #elif defined(CRASHPAD_LSS_SOURCE_EMBEDDED) #include "third_party/lss/lss/linux_syscall_support.h" #elif defined(CRASHPAD_LSS_SOURCE_FUCHSIA) -#include "../../../../third_party/linux-syscall-support/linux_syscall_support.h" +#include "../../../../../third_party/linux-syscall-support/src/linux_syscall_support.h" #else #error Unknown lss source #endif diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/.gitignore b/shared/sentry/src/external/crashpad/third_party/lss/lss/.gitignore similarity index 100% rename from shared/sentry/external/crashpad/third_party/lss/lss/.gitignore rename to shared/sentry/src/external/crashpad/third_party/lss/lss/.gitignore diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/DIR_METADATA b/shared/sentry/src/external/crashpad/third_party/lss/lss/DIR_METADATA similarity index 100% rename from shared/sentry/external/crashpad/third_party/lss/lss/DIR_METADATA rename to shared/sentry/src/external/crashpad/third_party/lss/lss/DIR_METADATA diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/LICENSE b/shared/sentry/src/external/crashpad/third_party/lss/lss/LICENSE similarity index 92% rename from shared/sentry/external/crashpad/third_party/lss/lss/LICENSE rename to shared/sentry/src/external/crashpad/third_party/lss/lss/LICENSE index 58ab3fba9..b66a6b273 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/LICENSE +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/LICENSE @@ -1,5 +1,4 @@ -Copyright (c) 2005-2011, Google Inc. -All rights reserved. +Copyright 2005-2011 Google LLC Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -11,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Google Inc. nor the names of its + Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/OWNERS b/shared/sentry/src/external/crashpad/third_party/lss/lss/OWNERS similarity index 100% rename from shared/sentry/external/crashpad/third_party/lss/lss/OWNERS rename to shared/sentry/src/external/crashpad/third_party/lss/lss/OWNERS diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/README.md b/shared/sentry/src/external/crashpad/third_party/lss/lss/README.md similarity index 99% rename from shared/sentry/external/crashpad/third_party/lss/lss/README.md rename to shared/sentry/src/external/crashpad/third_party/lss/lss/README.md index b0cd12977..e25abdd21 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/README.md +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/README.md @@ -39,6 +39,7 @@ the header itself as this list might be out of date. * MIPS 32-bit o32 ABI * MIPS 32-bit n32 ABI * MIPS 64-bit n64 ABI +* LOONGARCH 64-bit ABI ## API diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/codereview.settings b/shared/sentry/src/external/crashpad/third_party/lss/lss/codereview.settings similarity index 100% rename from shared/sentry/external/crashpad/third_party/lss/lss/codereview.settings rename to shared/sentry/src/external/crashpad/third_party/lss/lss/codereview.settings diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/linux_syscall_support.h b/shared/sentry/src/external/crashpad/third_party/lss/lss/linux_syscall_support.h similarity index 87% rename from shared/sentry/external/crashpad/third_party/lss/lss/linux_syscall_support.h rename to shared/sentry/src/external/crashpad/third_party/lss/lss/linux_syscall_support.h index d3791cd4e..aab95e698 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/linux_syscall_support.h +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/linux_syscall_support.h @@ -1,5 +1,4 @@ -/* Copyright (c) 2005-2011, Google Inc. - * All rights reserved. +/* Copyright 2005-2011 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -11,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * @@ -47,7 +46,7 @@ * the necessary definitions. * * SYS_ERRNO: - * All system calls will update "errno" unless overriden by setting the + * All system calls will update "errno" unless overridden by setting the * SYS_ERRNO macro prior to including this file. SYS_ERRNO should be * an l-value. * @@ -88,7 +87,8 @@ */ #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ defined(__mips__) || defined(__PPC__) || defined(__ARM_EABI__) || \ - defined(__aarch64__) || defined(__s390__) || defined(__e2k__)) \ + defined(__aarch64__) || defined(__s390__) || defined(__e2k__) || \ + (defined(__riscv) && __riscv_xlen == 64) || defined(__loongarch_lp64)) \ && (defined(__linux) || defined(__ANDROID__)) #ifndef SYS_CPLUSPLUS @@ -266,6 +266,12 @@ struct kernel_timeval { long tv_usec; }; +/* include/linux/time.h */ +struct kernel_itimerval { + struct kernel_timeval it_interval; + struct kernel_timeval it_value; +}; + /* include/linux/resource.h */ struct kernel_rusage { struct kernel_timeval ru_utime; @@ -302,8 +308,8 @@ struct kernel_old_sigaction { } __attribute__((packed,aligned(4))); #elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) #define kernel_old_sigaction kernel_sigaction -#elif defined(__aarch64__) - // No kernel_old_sigaction defined for arm64. +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) + // No kernel_old_sigaction defined for arm64 riscv and loongarch64. #endif /* Some kernel functions (e.g. sigaction() in 2.6.23) require that the @@ -342,7 +348,9 @@ struct kernel_sigaction { void (*sa_sigaction_)(int, siginfo_t *, void *); }; unsigned long sa_flags; +#if !defined(__riscv) && !defined(__loongarch_lp64) void (*sa_restorer)(void); +#endif struct kernel_sigset_t sa_mask; #endif }; @@ -356,6 +364,16 @@ struct kernel_sockaddr { /* include/asm-{arm,aarch64,i386,mips,ppc,s390}/stat.h */ #ifdef __mips__ #if _MIPS_SIM == _MIPS_SIM_ABI64 +typedef unsigned long long kernel_blkcnt_t; +typedef unsigned kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned long long kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef unsigned kernel_nlink_t; +typedef long long kernel_off_t; +typedef unsigned kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { #else struct kernel_stat64 { @@ -450,182 +468,262 @@ struct kernel_stat64 { /* include/asm-{arm,aarch64,i386,mips,x86_64,ppc,s390}/stat.h */ #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) +typedef unsigned kernel_blkcnt_t; +typedef unsigned kernel_blksize_t; +typedef unsigned short kernel_dev_t; +typedef unsigned short kernel_gid_t; +typedef unsigned kernel_ino_t; +typedef unsigned short kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef unsigned kernel_off_t; +typedef unsigned kernel_time_t; +typedef unsigned short kernel_uid_t; struct kernel_stat { /* The kernel headers suggest that st_dev and st_rdev should be 32bit * quantities encoding 12bit major and 20bit minor numbers in an interleaved * format. In reality, we do not see useful data in the top bits. So, * we'll leave the padding in here, until we find a better solution. */ - unsigned short st_dev; + kernel_dev_t st_dev; short pad1; - unsigned st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; short pad2; - unsigned st_size; - unsigned st_blksize; - unsigned st_blocks; - unsigned st_atime_; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned st_atime_nsec_; - unsigned st_mtime_; + kernel_time_t st_mtime_; unsigned st_mtime_nsec_; - unsigned st_ctime_; + kernel_time_t st_ctime_; unsigned st_ctime_nsec_; unsigned __unused4; unsigned __unused5; }; #elif defined(__x86_64__) +typedef int64_t kernel_blkcnt_t; +typedef int64_t kernel_blksize_t; +typedef uint64_t kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef uint64_t kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef uint64_t kernel_nlink_t; +typedef int64_t kernel_off_t; +typedef uint64_t kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { - uint64_t st_dev; - uint64_t st_ino; - uint64_t st_nlink; - unsigned st_mode; - unsigned st_uid; - unsigned st_gid; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_nlink_t st_nlink; + kernel_mode_t st_mode; + kernel_uid_t st_uid; + kernel_gid_t st_gid; unsigned __pad0; - uint64_t st_rdev; - int64_t st_size; - int64_t st_blksize; - int64_t st_blocks; - uint64_t st_atime_; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; uint64_t st_atime_nsec_; - uint64_t st_mtime_; + kernel_time_t st_mtime_; uint64_t st_mtime_nsec_; - uint64_t st_ctime_; + kernel_time_t st_ctime_; uint64_t st_ctime_nsec_; int64_t __unused4[3]; }; #elif defined(__PPC__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned long kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { - unsigned st_dev; - unsigned long st_ino; // ino_t - unsigned long st_mode; // mode_t - unsigned short st_nlink; // nlink_t - unsigned st_uid; // uid_t - unsigned st_gid; // gid_t - unsigned st_rdev; - long st_size; // off_t - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime_; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_gid_t st_uid; + kernel_uid_t st_gid; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - unsigned long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - unsigned long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; unsigned long __unused4; unsigned long __unused5; }; #elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) +typedef int kernel_blkcnt_t; +typedef int kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef unsigned kernel_nlink_t; +typedef long kernel_off_t; +typedef long kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { - unsigned st_dev; + kernel_dev_t st_dev; int st_pad1[3]; - unsigned st_ino; - unsigned st_mode; - unsigned st_nlink; - unsigned st_uid; - unsigned st_gid; - unsigned st_rdev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; int st_pad2[2]; - long st_size; + kernel_off_t st_size; int st_pad3; - long st_atime_; + kernel_time_t st_atime_; long st_atime_nsec_; - long st_mtime_; + kernel_time_t st_mtime_; long st_mtime_nsec_; - long st_ctime_; + kernel_time_t st_ctime_; long st_ctime_nsec_; - int st_blksize; - int st_blocks; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; int st_pad4[14]; }; -#elif defined(__aarch64__) +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) +typedef long kernel_blkcnt_t; +typedef int kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned int kernel_nlink_t; +typedef long kernel_off_t; +typedef long kernel_time_t; +typedef unsigned int kernel_uid_t; struct kernel_stat { - unsigned long st_dev; - unsigned long st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - unsigned long st_rdev; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; unsigned long __pad1; - long st_size; - int st_blksize; + kernel_off_t st_size; + kernel_blksize_t st_blksize; int __pad2; - long st_blocks; - long st_atime_; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; unsigned int __unused4; unsigned int __unused5; }; #elif defined(__s390x__) +typedef long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned long kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned int kernel_uid_t; struct kernel_stat { - unsigned long st_dev; - unsigned long st_ino; - unsigned long st_nlink; - unsigned int st_mode; - unsigned int st_uid; - unsigned int st_gid; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_nlink_t st_nlink; + kernel_mode_t st_mode; + kernel_uid_t st_uid; + kernel_gid_t st_gid; unsigned int __pad1; - unsigned long st_rdev; - unsigned long st_size; - unsigned long st_atime_; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - unsigned long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - unsigned long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; - unsigned long st_blksize; - long st_blocks; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; unsigned long __unused[3]; }; #elif defined(__s390__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned short kernel_dev_t; +typedef unsigned short kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned short kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned short kernel_uid_t; struct kernel_stat { - unsigned short st_dev; + kernel_dev_t st_dev; unsigned short __pad1; - unsigned long st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; unsigned short __pad2; - unsigned long st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime_; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - unsigned long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - unsigned long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; unsigned long __unused4; unsigned long __unused5; }; #elif defined(__e2k__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned long kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned int kernel_uid_t; struct kernel_stat { - unsigned long st_dev; - unsigned long st_ino; - unsigned int st_mode; - unsigned long st_nlink; - unsigned int st_uid; - unsigned int st_gid; - unsigned long st_rdev; - unsigned long st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime_; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - unsigned long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - unsigned long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; }; #endif @@ -743,6 +841,37 @@ struct kernel_statfs { }; #endif +struct kernel_statx_timestamp { + int64_t tv_sec; + uint32_t tv_nsec; + int32_t __reserved; +}; + +struct kernel_statx { + uint32_t stx_mask; + uint32_t stx_blksize; + uint64_t stx_attributes; + uint32_t stx_nlink; + uint32_t stx_uid; + uint32_t stx_gid; + uint16_t stx_mode; + uint16_t __spare0[1]; + uint64_t stx_ino; + uint64_t stx_size; + uint64_t stx_blocks; + uint64_t stx_attributes_mask; + struct kernel_statx_timestamp stx_atime; + struct kernel_statx_timestamp stx_btime; + struct kernel_statx_timestamp stx_ctime; + struct kernel_statx_timestamp stx_mtime; + uint32_t stx_rdev_major; + uint32_t stx_rdev_minor; + uint32_t stx_dev_major; + uint32_t stx_dev_minor; + uint64_t stx_mnt_id; + uint64_t __spare2; + uint64_t __spare3[12]; +}; /* Definitions missing from the standard header files */ #ifndef O_DIRECTORY @@ -779,6 +908,18 @@ struct kernel_statfs { #ifndef AT_REMOVEDIR #define AT_REMOVEDIR 0x200 #endif +#ifndef AT_NO_AUTOMOUNT +#define AT_NO_AUTOMOUNT 0x800 +#endif +#ifndef AT_EMPTY_PATH +#define AT_EMPTY_PATH 0x1000 +#endif +#ifndef STATX_BASIC_STATS +#define STATX_BASIC_STATS 0x000007ffU +#endif +#ifndef AT_STATX_SYNC_AS_STAT +#define AT_STATX_SYNC_AS_STAT 0x0000 +#endif #ifndef MREMAP_FIXED #define MREMAP_FIXED 2 #endif @@ -1110,7 +1251,7 @@ struct kernel_statfs { #define __NR_getrandom (__NR_SYSCALL_BASE + 384) #endif /* End of ARM 3/EABI definitions */ -#elif defined(__aarch64__) +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) #ifndef __NR_setxattr #define __NR_setxattr 5 #endif @@ -1166,9 +1307,11 @@ struct kernel_statfs { #ifndef __NR_readlinkat #define __NR_readlinkat 78 #endif +#if !defined(__loongarch_lp64) #ifndef __NR_newfstatat #define __NR_newfstatat 79 #endif +#endif #ifndef __NR_set_tid_address #define __NR_set_tid_address 96 #endif @@ -1209,7 +1352,9 @@ struct kernel_statfs { #ifndef __NR_getrandom #define __NR_getrandom 278 #endif -/* End of aarch64 definitions */ +#ifndef __NR_statx +#define __NR_statx 291 +#endif #elif defined(__x86_64__) #ifndef __NR_pread64 #define __NR_pread64 17 @@ -1678,7 +1823,7 @@ struct kernel_statfs { #ifndef __NR_getcpu #define __NR_getcpu 302 #endif -/* End of powerpc defininitions */ +/* End of powerpc definitions */ #elif defined(__s390__) #ifndef __NR_quotactl #define __NR_quotactl 131 @@ -1926,14 +2071,14 @@ struct kernel_statfs { #undef LSS_RETURN #if defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \ || defined(__ARM_EABI__) || defined(__aarch64__) || defined(__s390__) \ - || defined(__e2k__) + || defined(__e2k__) || defined(__riscv) || defined(__loongarch_lp64) /* Failing system calls return a negative result in the range of * -1..-4095. These are "errno" values with the sign inverted. */ #define LSS_RETURN(type, res) \ do { \ if ((unsigned long)(res) >= (unsigned long)(-4095)) { \ - LSS_ERRNO = -(res); \ + LSS_ERRNO = (int)(-(res)); \ res = -1; \ } \ return (type) (res); \ @@ -2287,7 +2432,7 @@ struct kernel_statfs { #define _LSS_RETURN(type, res, cast) \ do { \ if ((uint64_t)(res) >= (uint64_t)(-4095)) { \ - LSS_ERRNO = -(res); \ + LSS_ERRNO = (int)(-(res)); \ res = -1; \ } \ return (type)(cast)(res); \ @@ -2836,7 +2981,7 @@ struct kernel_statfs { void *newtls, int *child_tidptr) { int64_t __res; { - register uint64_t __flags __asm__("x0") = flags; + register uint64_t __flags __asm__("x0") = (uint64_t)flags; register void *__stack __asm__("x1") = child_stack; register void *__ptid __asm__("x2") = parent_tidptr; register void *__tls __asm__("x3") = newtls; @@ -3419,6 +3564,122 @@ struct kernel_statfs { } LSS_RETURN(int, __ret); } + #elif defined(__riscv) && __riscv_xlen == 64 + #undef LSS_REG + #define LSS_REG(r,a) register int64_t __r##r __asm__("a"#r) = (int64_t)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register int64_t __res_a0 __asm__("a0"); \ + register int64_t __a7 __asm__("a7") = __NR_##name; \ + int64_t __res; \ + __asm__ __volatile__ ("scall\n" \ + : "=r"(__res_a0) \ + : "r"(__a7) , ## args \ + : "memory"); \ + __res = __res_a0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + int64_t __res; + { + register int64_t __res_a0 __asm__("a0"); + register uint64_t __flags __asm__("a0") = flags; + register void *__stack __asm__("a1") = child_stack; + register void *__ptid __asm__("a2") = parent_tidptr; + register void *__tls __asm__("a3") = newtls; + register int *__ctid __asm__("a4") = child_tidptr; + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "addi %2,%2,-16\n" + "sd %1, 0(%2)\n" + "sd %4, 8(%2)\n" + + /* %a0 = syscall(%a0 = flags, + * %a1 = child_stack, + * %a2 = parent_tidptr, + * %a3 = newtls, + * %a4 = child_tidptr) + */ + "li a7, %8\n" + "scall\n" + + /* if (%a0 != 0) + * return %a0; + */ + "bnez %0, 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ld a1, 0(sp)\n" + "ld a0, 8(sp)\n" + "jalr a1\n" + + /* Call _exit(%a0). + */ + "li a7, %9\n" + "scall\n" + "1:\n" + : "=r" (__res_a0) + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "cc", "memory"); + __res = __res_a0; + } + LSS_RETURN(int, __res); + } #elif defined(__e2k__) #undef _LSS_BODY @@ -3671,6 +3932,134 @@ struct kernel_statfs { "b[4]", "b[5]", "pred0"); LSS_RETURN(int, __res); } + #elif defined(__loongarch_lp64) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(ar,a) register int64_t __r##ar __asm__("a"#ar) = (int64_t)a + /* syscall is like subroutine calls, all caller-saved registers may be + * clobbered, we should add them to the |Clobbers| list. + * a0 is not included because it's in the output list. + */ + #define LSS_SYSCALL_CLOBBERS "t0", "t1", "t2", "t3", "t4", "t5", "t6", \ + "t7", "t8", "memory" + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register int64_t __res_a0 __asm__("a0"); \ + register int64_t __a7 __asm__("a7") = __NR_##name; \ + int64_t __res; \ + __asm__ __volatile__ ("syscall 0x0\n" \ + : "=r"(__res_a0) \ + : "r"(__a7), ## args \ + : LSS_SYSCALL_CLOBBERS); \ + __res = __res_a0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + int64_t __res; + { + register int64_t __res_a0 __asm__("a0"); + register uint64_t __flags __asm__("a0") = flags; + register void *__stack __asm__("a1") = child_stack; + register void *__ptid __asm__("a2") = parent_tidptr; + register void *__tls __asm__("a3") = newtls; + register int *__ctid __asm__("a4") = child_tidptr; + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "addi.d %2, %2, -16\n" + "st.d %1, %2, 8\n" + "st.d %4, %2, 0\n" + + /* %a0 = syscall(%a0 = flags, + * %a1 = child_stack, + * %a2 = parent_tidptr, + * %a3 = newtls, + * %a4 = child_tidptr) + */ + "li.d $a7, %8\n" + "syscall 0x0\n" + + /* if (%a0 != 0) + * return %a0; + */ + "bnez $a0, 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ld.d $a0, $sp, 0\n" + "ld.d $a1, $sp, 8\n" + "addi.d $sp, $sp, 16\n" + "jirl $ra, $a1, 0\n" + + /* Call _exit(%a0). + */ + "li.d $a7, %9\n" + "syscall 0x0\n" + "1:\n" + : "=r" (__res_a0) + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "a7", LSS_SYSCALL_CLOBBERS); + __res = __res_a0; + } + LSS_RETURN(int, __res); + } #endif #define __NR__exit __NR_exit @@ -3702,8 +4091,10 @@ struct kernel_statfs { // fork is polyfilled below when not available. LSS_INLINE _syscall0(pid_t, fork) #endif + #if defined(__NR_fstat) LSS_INLINE _syscall2(int, fstat, int, f, struct kernel_stat*, b) + #endif LSS_INLINE _syscall2(int, fstatfs, int, f, struct kernel_statfs*, b) #if defined(__x86_64__) @@ -3725,6 +4116,8 @@ struct kernel_statfs { struct kernel_dirent64*, d, int, c) LSS_INLINE _syscall0(gid_t, getegid) LSS_INLINE _syscall0(uid_t, geteuid) + LSS_INLINE _syscall2(int, getitimer, int, w, + struct kernel_itimerval*, c) #if defined(__NR_getpgrp) LSS_INLINE _syscall0(pid_t, getpgrp) #endif @@ -3736,10 +4129,10 @@ struct kernel_statfs { gid_t *, e, gid_t *, s) LSS_INLINE _syscall3(int, getresuid, uid_t *, r, uid_t *, e, uid_t *, s) -#if !defined(__ARM_EABI__) + #if defined(__NR_getrlimit) LSS_INLINE _syscall2(int, getrlimit, int, r, struct kernel_rlimit*, l) -#endif + #endif LSS_INLINE _syscall1(pid_t, getsid, pid_t, p) LSS_INLINE _syscall0(pid_t, _gettid) LSS_INLINE _syscall2(pid_t, gettimeofday, struct kernel_timeval*, t, @@ -3846,6 +4239,9 @@ struct kernel_statfs { LSS_INLINE _syscall1(int, setfsuid, uid_t, u) LSS_INLINE _syscall1(int, setuid, uid_t, u) LSS_INLINE _syscall1(int, setgid, gid_t, g) + LSS_INLINE _syscall3(int, setitimer, int, w, + const struct kernel_itimerval*, n, + struct kernel_itimerval*, o) LSS_INLINE _syscall2(int, setpgid, pid_t, p, pid_t, g) LSS_INLINE _syscall3(int, setpriority, int, a, @@ -3854,8 +4250,10 @@ struct kernel_statfs { gid_t, e, gid_t, s) LSS_INLINE _syscall3(int, setresuid, uid_t, r, uid_t, e, uid_t, s) + #if defined(__NR_setrlimit) LSS_INLINE _syscall2(int, setrlimit, int, r, const struct kernel_rlimit*, l) + #endif LSS_INLINE _syscall0(pid_t, setsid) LSS_INLINE _syscall2(int, sigaltstack, const stack_t*, s, const stack_t*, o) @@ -3889,23 +4287,6 @@ struct kernel_statfs { LSS_INLINE _syscall3(long, getcpu, unsigned *, cpu, unsigned *, node, void *, unused) #endif - #if defined(__x86_64__) || defined(__e2k__) || \ - (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) - LSS_INLINE _syscall3(int, recvmsg, int, s, - struct kernel_msghdr*, m, int, f) - LSS_INLINE _syscall3(int, sendmsg, int, s, - const struct kernel_msghdr*, m, int, f) - LSS_INLINE _syscall6(int, sendto, int, s, - const void*, m, size_t, l, - int, f, - const struct kernel_sockaddr*, a, int, t) - LSS_INLINE _syscall2(int, shutdown, int, s, - int, h) - LSS_INLINE _syscall3(int, socket, int, d, - int, t, int, p) - LSS_INLINE _syscall4(int, socketpair, int, d, - int, t, int, p, int*, s) - #endif #if defined(__NR_fadvise64) #if defined(__x86_64__) /* Need to make sure loff_t isn't truncated to 32-bits under x32. */ @@ -3988,6 +4369,12 @@ struct kernel_statfs { const char *, p, struct kernel_stat*, b, int, f) #endif + #if defined(__NR_statx) + LSS_INLINE _syscall5(int, statx, int, d, + const char *, p, + int, f, int, m, + struct kernel_statx*, b) + #endif #if defined(__x86_64__) || defined(__s390x__) LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid, gid_t *egid, @@ -4194,36 +4581,36 @@ struct kernel_statfs { LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set, int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { LSS_ERRNO = EINVAL; return -1; } else { - set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] - |= 1UL << ((signum - 1) % (8*sizeof(set->sig[0]))); + set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] + |= 1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0]))); return 0; } } LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set, int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { LSS_ERRNO = EINVAL; return -1; } else { - set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] - &= ~(1UL << ((signum - 1) % (8*sizeof(set->sig[0])))); + set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] + &= ~(1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0])))); return 0; } } LSS_INLINE int LSS_NAME(sigismember)(struct kernel_sigset_t *set, int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { LSS_ERRNO = EINVAL; return -1; } else { - return !!(set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] & - (1UL << ((signum - 1) % (8*sizeof(set->sig[0]))))); + return !!(set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] & + (1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0]))))); } } #if defined(__i386__) || \ @@ -4484,23 +4871,31 @@ struct kernel_statfs { LSS_SC_BODY(4, int, 8, d, type, protocol, sv); } #endif - #if defined(__ARM_EABI__) || defined (__aarch64__) + #if defined(__NR_recvmsg) LSS_INLINE _syscall3(ssize_t, recvmsg, int, s, struct kernel_msghdr*, msg, int, flags) + #endif + #if defined(__NR_sendmsg) LSS_INLINE _syscall3(ssize_t, sendmsg, int, s, const struct kernel_msghdr*, msg, int, flags) + #endif + #if defined(__NR_sendto) LSS_INLINE _syscall6(ssize_t, sendto, int, s, const void*, buf, size_t,len, int, flags, const struct kernel_sockaddr*, to, unsigned int, tolen) + #endif + #if defined(__NR_shutdown) LSS_INLINE _syscall2(int, shutdown, int, s, int, how) + #endif + #if defined(__NR_socket) LSS_INLINE _syscall3(int, socket, int, domain, int, type, int, protocol) + #endif + #if defined(__NR_socketpair) LSS_INLINE _syscall4(int, socketpair, int, d, int, type, int, protocol, int*, sv) #endif - #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ - (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ - defined(__s390__) - #define __NR__socketcall __NR_socketcall + + #if defined(__NR_socketcall) LSS_INLINE _syscall2(int, _socketcall, int, c, va_list, a) LSS_INLINE int LSS_NAME(socketcall)(int op, ...) { @@ -4512,36 +4907,43 @@ struct kernel_statfs { return rc; } + # if !defined(__NR_recvmsg) LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, int flags){ return (ssize_t)LSS_NAME(socketcall)(17, s, msg, flags); } - + # endif + # if !defined(__NR_sendmsg) LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, const struct kernel_msghdr *msg, int flags) { return (ssize_t)LSS_NAME(socketcall)(16, s, msg, flags); } - + # endif + # if !defined(__NR_sendto) LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, int flags, const struct kernel_sockaddr *to, unsigned int tolen) { return (ssize_t)LSS_NAME(socketcall)(11, s, buf, len, flags, to, tolen); } - + # endif + # if !defined(__NR_shutdown) LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { return LSS_NAME(socketcall)(13, s, how); } - + # endif + # if !defined(__NR_socket) LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { return LSS_NAME(socketcall)(1, domain, type, protocol); } - + # endif + # if !defined(__NR_socketpair) LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, int sv[2]) { return LSS_NAME(socketcall)(8, d, type, protocol, sv); } + # endif #endif #if defined(__NR_fstatat64) LSS_INLINE _syscall4(int, fstatat64, int, d, @@ -4623,12 +5025,12 @@ struct kernel_statfs { va_start(ap, flags); new_address = va_arg(ap, void *); rc = LSS_NAME(_mremap)(old_address, old_size, new_size, - flags, new_address); + (unsigned long)flags, new_address); va_end(ap); return rc; } - LSS_INLINE int LSS_NAME(ptrace_detach)(pid_t pid) { + LSS_INLINE long LSS_NAME(ptrace_detach)(pid_t pid) { /* PTRACE_DETACH can sometimes forget to wake up the tracee and it * then sends job control signals to the real parent, rather than to * the tracer. We reduce the risk of this happening by starting a @@ -4639,7 +5041,8 @@ struct kernel_statfs { * detached. Large multi threaded apps can take a long time in the kernel * processing SIGCONT. */ - int rc, err; + long rc; + int err; LSS_NAME(sched_yield)(); rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0); err = LSS_ERRNO; @@ -4672,7 +5075,7 @@ struct kernel_statfs { LSS_SYSCALL_ARG(c), (uint64_t)(o)); } - LSS_INLINE int LSS_NAME(readahead)(int f, loff_t o, unsigned c) { + LSS_INLINE int LSS_NAME(readahead)(int f, loff_t o, size_t c) { LSS_BODY(3, int, readahead, LSS_SYSCALL_ARG(f), (uint64_t)(o), LSS_SYSCALL_ARG(c)); } @@ -4711,7 +5114,7 @@ struct kernel_statfs { unsigned, o2) LSS_INLINE _syscall5(ssize_t, _pwrite64, int, f, const void *, b, size_t, c, unsigned, o1, - long, o2) + unsigned, o2) LSS_INLINE _syscall4(int, _readahead, int, f, unsigned, o1, unsigned, o2, size_t, c) #endif @@ -4732,9 +5135,9 @@ struct kernel_statfs { return LSS_NAME(_pwrite64)(fd, buf, count, LSS_LLARG_PAD o.arg[0], o.arg[1]); } - LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, int len) { + LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, size_t count) { union { loff_t off; unsigned arg[2]; } o = { off }; - return LSS_NAME(_readahead)(fd, LSS_LLARG_PAD o.arg[0], o.arg[1], len); + return LSS_NAME(_readahead)(fd, LSS_LLARG_PAD o.arg[0], o.arg[1], count); } #endif #endif @@ -4789,16 +5192,79 @@ struct kernel_statfs { } #endif +#if defined(__NR_statx) + /* copy the contents of kernel_statx to the kernel_stat structure. */ + LSS_INLINE void LSS_NAME(cp_stat_statx)(struct kernel_stat *to, + struct kernel_statx *from) { + memset(to, 0, sizeof(struct kernel_stat)); + to->st_dev = (kernel_dev_t)((from->stx_dev_minor & 0xff) | + ((from->stx_dev_major & 0xfff) << 8) | + ((from->stx_dev_minor & ~0xffu) << 12)); + to->st_rdev = (kernel_dev_t)((from->stx_rdev_minor & 0xff) | + ((from->stx_rdev_major & 0xfff) << 8) | + ((from->stx_rdev_minor & ~0xffu) << 12)); + to->st_ino = (kernel_ino_t)from->stx_ino; + to->st_mode = (kernel_mode_t)from->stx_mode; + to->st_nlink = (kernel_nlink_t)from->stx_nlink; + to->st_uid = (kernel_uid_t)from->stx_uid; + to->st_gid = (kernel_gid_t)from->stx_gid; + to->st_atime_ = (kernel_time_t)(from->stx_atime.tv_sec); + to->st_atime_nsec_ = from->stx_atime.tv_nsec; + to->st_mtime_ = (kernel_time_t)(from->stx_mtime.tv_sec); + to->st_mtime_nsec_ = from->stx_mtime.tv_nsec; + to->st_ctime_ = (kernel_time_t)(from->stx_ctime.tv_sec); + to->st_ctime_nsec_ = from->stx_ctime.tv_nsec; + to->st_size = (kernel_off_t)(from->stx_size); + to->st_blocks = (kernel_blkcnt_t)(from->stx_blocks); + to->st_blksize = (kernel_blksize_t)from->stx_blksize; + } +#endif + +#if !defined(__NR_fstat) + LSS_INLINE int LSS_NAME(fstat)(int fd, + struct kernel_stat *buf) { + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(fd, "", buf, AT_EMPTY_PATH); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_EMPTY_PATH; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(fd, "", flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif + } +#endif + #if !defined(__NR_stat) LSS_INLINE int LSS_NAME(stat)(const char *pathname, struct kernel_stat *buf) { - return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, 0); + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, 0); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_STATX_SYNC_AS_STAT; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(AT_FDCWD, pathname, flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif } #endif + #if !defined(__NR_lstat) LSS_INLINE int LSS_NAME(lstat)(const char *pathname, struct kernel_stat *buf) { - return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, AT_SYMLINK_NOFOLLOW); + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, AT_SYMLINK_NOFOLLOW); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(AT_FDCWD, pathname, flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif } #endif @@ -4812,7 +5278,7 @@ struct kernel_statfs { // TODO: define this in an arch-independant way instead of inlining the clone // syscall body. -# if defined(__aarch64__) +# if defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) LSS_INLINE pid_t LSS_NAME(fork)(void) { // No fork syscall on aarch64 - implement by means of the clone syscall. // Note that this does not reset glibc's cached view of the PID/TID, so diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/.gitignore b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/.gitignore similarity index 100% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/.gitignore rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/.gitignore diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/Makefile b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/Makefile similarity index 91% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/Makefile rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/Makefile index a6f1ec6a5..a4e2f3873 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/Makefile +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/Makefile @@ -1,4 +1,4 @@ -# Copyright 2018, Google Inc. All rights reserved. +# Copyright 2018 Google LLC # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. -# * Neither the name of Google Inc. nor the names of its +# * Neither the name of Google LLC nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # @@ -41,8 +41,10 @@ LDFLAGS += -static TESTS = \ fallocate \ + getitimer \ getrandom \ lstat \ + setitimer \ sigaction \ sigtimedwait \ stat \ @@ -53,6 +55,10 @@ all: check %_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< +# Force building C as C++ code to improve compile-time coverage. +%_cc_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + %_test: %.cc test_skel.h $(top_srcdir)/linux_syscall_support.h $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< @@ -70,10 +76,10 @@ all: check exit 1; \ fi -ALL_TEST_TARGETS = $(TESTS:=_test) +ALL_TEST_TARGETS = $(TESTS:=_test) $(TESTS:=_cc_test) compile_tests: $(ALL_TEST_TARGETS) -ALL_RUN_TARGETS = $(TESTS:=_run) +ALL_RUN_TARGETS = $(TESTS:=_run) $(TESTS:=_cc_run) check: $(ALL_RUN_TARGETS) # The "tempfile" targets are the names we use with temp files. @@ -114,6 +120,7 @@ cross: "mips64-unknown-linux-gnu-gcc -mabi=n32" \ "s390-ibm-linux-gnu-gcc" \ "s390x-ibm-linux-gnu-gcc" \ + "loongarch64-unknown-linux-gnu-gcc" \ ; do \ cxx=`echo "$$cc" | sed 's:-gcc:-g++:'`; \ $(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \ diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/README.md b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/README.md similarity index 100% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/README.md rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/README.md diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/fallocate.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/fallocate.c similarity index 95% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/fallocate.c rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/fallocate.c index f6589070f..1a26fed55 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/fallocate.c +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/fallocate.c @@ -1,4 +1,4 @@ -/* Copyright 2019, Google Inc. All rights reserved. +/* Copyright 2019 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/getitimer.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/getitimer.c new file mode 100644 index 000000000..860538a0f --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/getitimer.c @@ -0,0 +1,84 @@ +/* Copyright 2022 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // We need an invalid timer value. The assert()'s below should + // be static asserts but it is not available in older C versions. +#define kInvalidTimer 9999 + assert(kInvalidTimer != ITIMER_REAL); + assert(kInvalidTimer != ITIMER_VIRTUAL); + assert(kInvalidTimer != ITIMER_PROF); + + // This should fail with EINVAL. + struct kernel_itimerval curr_itimer; + assert(sys_getitimer(kInvalidTimer, &curr_itimer) == -1); + assert(errno == EINVAL); + + // Create a read-only page. + size_t page_size = getpagesize(); + void* read_only_page = sys_mmap(NULL, page_size, PROT_READ, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(read_only_page != MAP_FAILED); + + // This should fail with EFAULT. + assert(sys_getitimer(ITIMER_REAL, + (struct kernel_itimerval*) read_only_page) == -1); + assert(errno == EFAULT); + + // This should complete without an error. + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + + // Set up a real time timer with very long interval and value so that + // we do not need to handle SIGALARM in test. + struct kernel_itimerval new_itimer; + const time_t kIntervalSec = 60 * 60 * 24 * 365; // One year. + const long kIntervalUSec = 123; + new_itimer.it_interval.tv_sec = kIntervalSec; + new_itimer.it_interval.tv_usec = kIntervalUSec; + new_itimer.it_value = new_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0); + + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + assert(kernel_timeval_eq(&curr_itimer.it_interval, &new_itimer.it_interval)); + + // Disable timer. + struct kernel_itimerval empty_itimer; + empty_itimer.it_interval.tv_sec = 0; + empty_itimer.it_interval.tv_usec = 0; + empty_itimer.it_value = empty_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &empty_itimer, NULL) == 0); + + // We should read back an empty itimer. + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + assert(kernel_itimerval_eq(&curr_itimer, &empty_itimer)); + + return 0; +} diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/getrandom.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/getrandom.c similarity index 95% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/getrandom.c rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/getrandom.c index eb1f16228..0ec38b3c9 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/getrandom.c +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/getrandom.c @@ -1,4 +1,4 @@ -/* Copyright 2020, Google Inc. All rights reserved. +/* Copyright 2020 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/lstat.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/lstat.c similarity index 96% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/lstat.c rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/lstat.c index 33848a981..816ba9faa 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/lstat.c +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/lstat.c @@ -1,4 +1,4 @@ -/* Copyright 2021, Google Inc. All rights reserved. +/* Copyright 2021 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/setitimer.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/setitimer.c new file mode 100644 index 000000000..dd2ccfe5c --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/setitimer.c @@ -0,0 +1,90 @@ +/* Copyright 2022 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // We need an invalid timer value. The assert()'s below should + // be static asserts but it is not avalible in older C versions. +#define kInvalidTimer 9999 + assert(kInvalidTimer != ITIMER_REAL); + assert(kInvalidTimer != ITIMER_VIRTUAL); + assert(kInvalidTimer != ITIMER_PROF); + + // Invalid timer returns EINVAL. + assert(sys_setitimer(kInvalidTimer, NULL, NULL) == -1); + assert(errno == EINVAL); + + const int kSignal = SIGALRM; + const size_t kSigsetSize = sizeof(struct kernel_sigset_t); + + // Block SIGALRM. + struct kernel_sigset_t sigalarm_only; + struct kernel_sigset_t old_sigset; + assert(sys_sigemptyset(&sigalarm_only) == 0); + assert(sys_sigaddset(&sigalarm_only, kSignal) == 0); + assert(sys_rt_sigprocmask(SIG_BLOCK, &sigalarm_only, &old_sigset, + kSigsetSize) == 0); + + // Set up a real time timer. + struct kernel_itimerval new_itimer = {}; + const long kIntervalUSec = 123; + new_itimer.it_interval.tv_sec = 0; + new_itimer.it_interval.tv_usec = kIntervalUSec; + new_itimer.it_value = new_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0); + + // Wait for alarm. + struct timespec timeout; + const unsigned long kNanoSecsPerSec = 1000000000; + const unsigned long kNanoSecsPerMicroSec = 1000; + + // Use a timeout 3 times of the timer interval. + unsigned long duration_ns = kIntervalUSec * kNanoSecsPerMicroSec * 3; + timeout.tv_sec = duration_ns / kNanoSecsPerSec ; + timeout.tv_nsec = duration_ns % kNanoSecsPerSec; + + int sig; + do { + sig = sys_sigtimedwait(&sigalarm_only, NULL, &timeout); + } while (sig == -1 && errno == EINTR); + assert(sig == kSignal); + + // Disable timer, check saving of old timer value. + struct kernel_itimerval empty_itimer = {}; + struct kernel_itimerval old_itimer; + empty_itimer.it_interval.tv_sec = 0; + empty_itimer.it_interval.tv_usec = 0; + empty_itimer.it_value = empty_itimer.it_interval; + + assert(sys_setitimer(ITIMER_REAL, &empty_itimer, &old_itimer) == 0); + assert(kernel_timeval_eq(&old_itimer.it_interval, &new_itimer.it_interval)); + + return 0; +} diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/sigaction.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/sigaction.c similarity index 95% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/sigaction.c rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/sigaction.c index f247aca7c..db3658f40 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/sigaction.c +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/sigaction.c @@ -1,4 +1,4 @@ -/* Copyright 2020, Google Inc. All rights reserved. +/* Copyright 2020 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/sigtimedwait.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/sigtimedwait.c similarity index 95% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/sigtimedwait.c rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/sigtimedwait.c index ee2f740fe..d56d30460 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/sigtimedwait.c +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/sigtimedwait.c @@ -1,4 +1,4 @@ -/* Copyright 2019, Google Inc. All rights reserved. +/* Copyright 2019 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/stat.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/stat.c similarity index 95% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/stat.c rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/stat.c index 48cac620c..5ae66852d 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/stat.c +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/stat.c @@ -1,4 +1,4 @@ -/* Copyright 2021, Google Inc. All rights reserved. +/* Copyright 2021 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/test_skel.h b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/test_skel.h similarity index 77% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/test_skel.h rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/test_skel.h index 238c48d1d..89077c95d 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/test_skel.h +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/test_skel.h @@ -1,4 +1,4 @@ -/* Copyright 2018, Google Inc. All rights reserved. +/* Copyright 2018 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * @@ -54,6 +54,7 @@ #include #include #include +#include #include @@ -72,3 +73,17 @@ void assert_buffers_eq_len(const void *buf1, const void *buf2, size_t len) { } } #define assert_buffers_eq(obj1, obj2) assert_buffers_eq_len(obj1, obj2, sizeof(*obj1)) + +// Returns true iff pointed timevals are equal. +static inline bool kernel_timeval_eq(const struct kernel_timeval* lhs, + const struct kernel_timeval* rhs) { + return (lhs->tv_sec == rhs->tv_sec) && (lhs->tv_usec == rhs->tv_usec); +} + +// Returns true iff pointed itimervals are equal. +static inline bool kernel_itimerval_eq(const struct kernel_itimerval* lhs, + const struct kernel_itimerval* rhs) { + return kernel_timeval_eq(&lhs->it_interval, &rhs->it_interval) && + kernel_timeval_eq(&lhs->it_value, &rhs->it_value); +} + diff --git a/shared/sentry/external/crashpad/third_party/lss/lss/tests/unlink.c b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/unlink.c similarity index 94% rename from shared/sentry/external/crashpad/third_party/lss/lss/tests/unlink.c rename to shared/sentry/src/external/crashpad/third_party/lss/lss/tests/unlink.c index 70c8bc9a5..191e36792 100644 --- a/shared/sentry/external/crashpad/third_party/lss/lss/tests/unlink.c +++ b/shared/sentry/src/external/crashpad/third_party/lss/lss/tests/unlink.c @@ -1,4 +1,4 @@ -/* Copyright 2018, Google Inc. All rights reserved. +/* Copyright 2018 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/mini_chromium/BUILD.gn similarity index 91% rename from shared/sentry/external/crashpad/third_party/mini_chromium/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/BUILD.gn index cc97cc197..9d4ff01c0 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/BUILD.gn +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/BUILD.gn @@ -20,7 +20,7 @@ group("base") { } else if (crashpad_is_standalone) { public_deps = [ "mini_chromium/base" ] } else if (crashpad_is_in_fuchsia) { - public_deps = [ "//third_party/mini_chromium/base" ] + public_deps = [ mini_chromium_import_root + "/base" ] } else if (crashpad_is_external) { public_deps = [ "../../../../mini_chromium/mini_chromium/base" ] } else if (crashpad_is_in_dart) { @@ -42,7 +42,7 @@ group("build") { } else if (crashpad_is_standalone) { public_deps = [ "mini_chromium/build" ] } else if (crashpad_is_in_fuchsia) { - public_deps = [ "//third_party/mini_chromium/build" ] + public_deps = [ mini_chromium_import_root + "/build" ] } else if (crashpad_is_external) { public_deps = [ "../../../../mini_chromium/mini_chromium/build" ] } else if (crashpad_is_in_dart) { @@ -56,11 +56,10 @@ group("chromeos_buildflags") { } else if (crashpad_is_standalone) { public_deps = [ "mini_chromium/build:chromeos_buildflags" ] } else if (crashpad_is_in_fuchsia) { - public_deps = [ "//third_party/mini_chromium/build:chromeos_buildflags" ] + public_deps = [ mini_chromium_import_root + "/build:chromeos_buildflags" ] } else if (crashpad_is_external) { public_deps = [ "../../../../mini_chromium/mini_chromium/build:chromeos_buildflags" ] } else if (crashpad_is_in_dart) { public_deps = [ "//third_party/mini_chromium/mini_chromium/build:chromeos_buildflags" ] } } - diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/CMakeLists.txt b/shared/sentry/src/external/crashpad/third_party/mini_chromium/CMakeLists.txt similarity index 79% rename from shared/sentry/external/crashpad/third_party/mini_chromium/CMakeLists.txt rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/CMakeLists.txt index 4577c1d12..48bfbe8df 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/CMakeLists.txt @@ -15,7 +15,7 @@ mc_append_sources( check.h check_op.h compiler_specific.h - cxx17_backports.h + containers/span.h debug/alias.cc debug/alias.h files/file_path.cc @@ -50,6 +50,11 @@ mc_append_sources( rand_util.h scoped_clear_last_error.h scoped_generic.h + strings/pattern.cc + strings/pattern.h + strings/strcat.cc + strings/strcat.h + strings/strcat_internal.h strings/string_number_conversions.cc strings/string_number_conversions.h strings/string_piece.h @@ -70,6 +75,7 @@ mc_append_sources( third_party/icu/icu_utf.h threading/thread_local_storage.cc threading/thread_local_storage.h + types/cxx23_to_underlying.h ) if(NOT MINGW) @@ -82,43 +88,30 @@ else() ) endif() -if(APPLE AND NOT IOS) - mc_append_sources( - mac/close_nocancel.cc - mac/foundation_util.h - mac/foundation_util.mm - mac/mach_logging.cc - mac/mach_logging.h - mac/scoped_cftyperef.h - mac/scoped_ioobject.h - mac/scoped_launch_data.h - mac/scoped_mach_port.cc - mac/scoped_mach_port.h - mac/scoped_mach_vm.cc - mac/scoped_mach_vm.h - mac/scoped_nsautorelease_pool.h - mac/scoped_nsautorelease_pool.mm - mac/scoped_nsobject.h - mac/scoped_typeref.h - strings/sys_string_conversions_mac.mm - ) -elseif(IOS) +if(APPLE) mc_append_sources( - mac/foundation_util.h - mac/foundation_util.mm - mac/mach_logging.cc - mac/mach_logging.h - mac/scoped_cftyperef.h - mac/scoped_mach_port.cc - mac/scoped_mach_port.h - mac/scoped_mach_vm.cc - mac/scoped_mach_vm.h - mac/scoped_nsautorelease_pool.h - mac/scoped_nsautorelease_pool.mm - mac/scoped_nsobject.h - mac/scoped_typeref.h + apple/bridging.h + apple/foundation_util.h + apple/foundation_util.mm + apple/mach_logging.cc + apple/mach_logging.h + apple/scoped_cftyperef.h + apple/scoped_mach_port.cc + apple/scoped_mach_port.h + apple/scoped_mach_vm.cc + apple/scoped_mach_vm.h + apple/scoped_nsautorelease_pool.h + apple/scoped_nsautorelease_pool.mm + apple/scoped_typeref.h strings/sys_string_conversions_mac.mm ) + if (NOT IOS) + mc_append_sources( + mac/close_nocancel.cc + mac/scoped_ioobject.h + mac/scoped_launch_data.h + ) + endif() endif() if(WIN32) @@ -144,6 +137,9 @@ else() ) endif() +if(APPLE) + target_compile_options(mini_chromium PUBLIC -fobjc-arc -fno-objc-arc-exceptions) +endif() if(APPLE AND NOT IOS) target_link_libraries(mini_chromium PUBLIC "-framework ApplicationServices" @@ -181,7 +177,11 @@ target_link_libraries(mini_chromium if(WIN32) target_link_libraries(mini_chromium PRIVATE advapi32 kernel32) if(MSVC) - target_compile_options(mini_chromium PRIVATE "/wd4201" "/wd4996") + target_compile_options(mini_chromium PRIVATE + $<$:/wd4201> # nonstandard extension used : nameless struct/union. + $<$:/wd4244> # conversion from '__int64' to 'int32_t', possible loss of data. + $<$:/wd4996> # 'X' was declared deprecated. + ) target_compile_definitions(mini_chromium PRIVATE NOMINMAX UNICODE diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/README.crashpad b/shared/sentry/src/external/crashpad/third_party/mini_chromium/README.crashpad similarity index 96% rename from shared/sentry/external/crashpad/third_party/mini_chromium/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/README.crashpad index 37d507bf2..2ebdfffea 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/README.crashpad @@ -5,6 +5,7 @@ Revision: See DEPS License: BSD 3-clause License File: mini_chromium/LICENSE Security Critical: yes +Shipped in Chromium: no Description: mini_chromium is a small collection of useful low-level (“base”) routines from diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/.gitattributes b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/.gitattributes similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/.gitattributes rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/.gitattributes diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/.gitignore b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/.gitignore similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/.gitignore rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/.gitignore diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/.style.yapf b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/.style.yapf similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/.style.yapf rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/.style.yapf diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/AUTHORS b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/AUTHORS similarity index 65% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/AUTHORS rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/AUTHORS index 3c022c096..8bd1039f9 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/AUTHORS +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/AUTHORS @@ -2,4 +2,4 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# See https://chromium.googlesource.com/chromium/chromium/+/trunk/AUTHORS +# See https://chromium.googlesource.com/chromium/src/+/main/AUTHORS diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/BUILD.gn diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/LICENSE b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/LICENSE similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/LICENSE rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/LICENSE diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/README.md b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/README.md similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/README.md rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/README.md diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/BUILD.gn similarity index 79% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/BUILD.gn index 2a22b0c14..690d70b08 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/BUILD.gn +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/BUILD.gn @@ -14,7 +14,7 @@ static_library("base") { "check.h", "check_op.h", "compiler_specific.h", - "cxx17_backports.h", + "containers/span.h", "debug/alias.cc", "debug/alias.h", "files/file_path.cc", @@ -49,6 +49,11 @@ static_library("base") { "rand_util.h", "scoped_clear_last_error.h", "scoped_generic.h", + "strings/pattern.cc", + "strings/pattern.h", + "strings/strcat.cc", + "strings/strcat.h", + "strings/strcat_internal.h", "strings/string_number_conversions.cc", "strings/string_number_conversions.h", "strings/string_piece.h", @@ -70,6 +75,7 @@ static_library("base") { "third_party/icu/icu_utf.h", "threading/thread_local_storage.cc", "threading/thread_local_storage.h", + "types/cxx23_to_underlying.h", ] if (mini_chromium_is_posix || mini_chromium_is_fuchsia) { @@ -86,56 +92,43 @@ static_library("base") { ] } - if (mini_chromium_is_mac) { + if (mini_chromium_is_apple) { sources += [ - "mac/close_nocancel.cc", - "mac/foundation_util.h", - "mac/foundation_util.mm", - "mac/mach_logging.cc", - "mac/mach_logging.h", - "mac/scoped_cftyperef.h", - "mac/scoped_ioobject.h", - "mac/scoped_launch_data.h", - "mac/scoped_mach_port.cc", - "mac/scoped_mach_port.h", - "mac/scoped_mach_vm.cc", - "mac/scoped_mach_vm.h", - "mac/scoped_nsautorelease_pool.h", - "mac/scoped_nsautorelease_pool.mm", - "mac/scoped_nsobject.h", - "mac/scoped_typeref.h", + "apple/bridging.h", + "apple/foundation_util.h", + "apple/foundation_util.mm", + "apple/mach_logging.cc", + "apple/mach_logging.h", + "apple/scoped_cftyperef.h", + "apple/scoped_mach_port.cc", + "apple/scoped_mach_port.h", + "apple/scoped_mach_vm.cc", + "apple/scoped_mach_vm.h", + "apple/scoped_nsautorelease_pool.h", + "apple/scoped_nsautorelease_pool.mm", + "apple/scoped_typeref.h", "strings/sys_string_conversions_mac.mm", ] frameworks = [ - "ApplicationServices.framework", "CoreFoundation.framework", "Foundation.framework", - "IOKit.framework", "Security.framework", ] - } else if (mini_chromium_is_ios) { + } + if (mini_chromium_is_mac) { sources += [ - "mac/foundation_util.h", - "mac/foundation_util.mm", - "mac/mach_logging.cc", - "mac/mach_logging.h", - "mac/scoped_cftyperef.h", - "mac/scoped_mach_port.cc", - "mac/scoped_mach_port.h", - "mac/scoped_mach_vm.cc", - "mac/scoped_mach_vm.h", - "mac/scoped_nsautorelease_pool.h", - "mac/scoped_nsautorelease_pool.mm", - "mac/scoped_nsobject.h", - "mac/scoped_typeref.h", - "strings/sys_string_conversions_mac.mm", + "mac/close_nocancel.cc", + "mac/scoped_ioobject.h", + "mac/scoped_launch_data.h", ] - frameworks = [ - "CoreFoundation.framework", + frameworks += [ + "ApplicationServices.framework", + "IOKit.framework", + ] + } else if (mini_chromium_is_ios) { + frameworks += [ "CoreGraphics.framework", "CoreText.framework", - "Foundation.framework", - "Security.framework", ] } else if (mini_chromium_is_win) { sources += [ @@ -164,6 +157,10 @@ static_library("base") { public_deps = [ "../build" ] + if (mini_chromium_is_apple) { + public_configs += [ "../build/config:apple_enable_arc" ] + } + if (mini_chromium_is_android) { libs = [ "log" ] } diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/bridging.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/bridging.h new file mode 100644 index 000000000..d5dde2d99 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/bridging.h @@ -0,0 +1,140 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_APPLE_BRIDGING_H_ +#define BASE_APPLE_BRIDGING_H_ + +#include +#import + +#include "base/apple/scoped_cftyperef.h" +#include "base/check.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_IOS) +#import +#endif + +#if BUILDFLAG(IS_MAC) +#import +#endif + +// These functions convert pointers of bridged CFTypes to NSTypes and +// vice-versa. They come in two flavors: those that transfer ownership +// (`OwnershipCast`) and those that just convert the pointer (`PtrCast`). +// +// Examples: +// +// Ownership transference (as in `CFBridgingRetain`/`Release`): +// CFStringRef cf_string = CFStringCreateWithCString(...); +// NSString* ns_string = CFToNSOwnershipCast(cf_string); +// // At this point, `cf_string` does not need releasing. +// +// NSString* ns_string = [[NSString alloc] initWithString:...]; +// CFStringRef cf_string = NSToCFOwnershipCast(ns_string); +// // At this point, `cf_string` must be released. +// +// Pointer conversion (as in `__bridge`): +// // `cf_data` is some `CFDataRef` from somewhere. +// NSImage* ns_image = [[NSImage alloc] initWithData:CFToNSPtrCast(cf_data)]; +// +// // `ns_data` is some `NSData *` from somewhere. +// SecKeyRef sec_key = SecKeyCreateFromData(..., NSToCFPtrCast(ns_data), ...); +// +// The reason to use these functions (rather than using `__bridge` and +// `CFBridgingRetain`/`Release`) is because they are type-safe. The OS-provided +// bridging calls do not type check, while these calls do the appropriate type +// checking via the magic of macros. +// +// Implementation note: Why not templates? Type checking in Core Foundation +// involves functions named in a specific pattern, and only macro token pasting +// works for this purpose. + +#define CF_TO_NS_CAST_IMPL(TypeCF, TypeNS) \ + namespace base::apple { \ + inline TypeNS* _Nullable CFToNSOwnershipCast( \ + TypeCF##Ref CF_CONSUMED _Nullable cf_val) { \ + DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ + return (__bridge_transfer TypeNS*)cf_val; \ + } \ + inline CF_RETURNS_RETAINED TypeCF##Ref _Nullable NSToCFOwnershipCast( \ + TypeNS* _Nullable ns_val) { \ + TypeCF##Ref cf_val = (__bridge_retained TypeCF##Ref)ns_val; \ + DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ + return cf_val; \ + } \ + inline TypeNS* _Nullable CFToNSPtrCast(TypeCF##Ref _Nullable cf_val) { \ + DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ + return (__bridge TypeNS*)cf_val; \ + } \ + inline TypeCF##Ref _Nullable NSToCFPtrCast(TypeNS* _Nullable ns_val) { \ + TypeCF##Ref cf_val = (__bridge TypeCF##Ref)ns_val; \ + DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ + return cf_val; \ + } \ + } + +#define CF_TO_NS_MUTABLE_CAST_IMPL(name) \ + CF_TO_NS_CAST_IMPL(CF##name, NS##name) \ + namespace base::apple { \ + inline NSMutable##name* _Nullable CFToNSOwnershipCast( \ + CFMutable##name##Ref CF_CONSUMED _Nullable cf_val) { \ + DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ + return (__bridge_transfer NSMutable##name*)cf_val; \ + } \ + inline CF_RETURNS_RETAINED \ + CFMutable##name##Ref _Nullable NSToCFOwnershipCast( \ + NSMutable##name* _Nullable ns_val) { \ + CFMutable##name##Ref cf_val = \ + (__bridge_retained CFMutable##name##Ref)ns_val; \ + DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ + return cf_val; \ + } \ + inline NSMutable##name* _Nullable CFToNSPtrCast( \ + CFMutable##name##Ref _Nullable cf_val) { \ + DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ + return (__bridge NSMutable##name*)cf_val; \ + } \ + inline CFMutable##name##Ref _Nullable NSToCFPtrCast( \ + NSMutable##name* _Nullable ns_val) { \ + CFMutable##name##Ref cf_val = (__bridge CFMutable##name##Ref)ns_val; \ + DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ + return cf_val; \ + } \ + } + +// List of toll-free bridged types taken from: +// https://web.archive.org/web/20111124025525/http://www.cocoadev.com/index.pl?TollFreeBridged +// https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html#//apple_ref/doc/uid/TP40010677-SW4 + +// Foundation +CF_TO_NS_MUTABLE_CAST_IMPL(Array) +CF_TO_NS_MUTABLE_CAST_IMPL(AttributedString) +CF_TO_NS_CAST_IMPL(CFCalendar, NSCalendar) +CF_TO_NS_MUTABLE_CAST_IMPL(CharacterSet) +CF_TO_NS_MUTABLE_CAST_IMPL(Data) +CF_TO_NS_CAST_IMPL(CFDate, NSDate) +CF_TO_NS_MUTABLE_CAST_IMPL(Dictionary) +CF_TO_NS_CAST_IMPL(CFError, NSError) +CF_TO_NS_CAST_IMPL(CFLocale, NSLocale) +CF_TO_NS_CAST_IMPL(CFNumber, NSNumber) +CF_TO_NS_CAST_IMPL(CFRunLoopTimer, NSTimer) +CF_TO_NS_CAST_IMPL(CFTimeZone, NSTimeZone) +CF_TO_NS_MUTABLE_CAST_IMPL(Set) +CF_TO_NS_CAST_IMPL(CFReadStream, NSInputStream) +CF_TO_NS_CAST_IMPL(CFWriteStream, NSOutputStream) +CF_TO_NS_MUTABLE_CAST_IMPL(String) +CF_TO_NS_CAST_IMPL(CFURL, NSURL) + +// AppKit / UIKit +#if BUILDFLAG(IS_IOS) +CF_TO_NS_CAST_IMPL(CTFont, UIFont) +#else +CF_TO_NS_CAST_IMPL(CTFont, NSFont) +#endif // BUILDFLAG(IS_IOS) + +#undef CF_TO_NS_CAST_IMPL +#undef CF_TO_NS_MUTABLE_CAST_IMPL + +#endif // BASE_APPLE_BRIDGING_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.h new file mode 100644 index 000000000..1654c8a1e --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.h @@ -0,0 +1,124 @@ +// Copyright 2008 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MINI_CHROMIUM_BASE_APPLE_FOUNDATION_UTIL_H_ +#define MINI_CHROMIUM_BASE_APPLE_FOUNDATION_UTIL_H_ + +#include "base/logging.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_IOS) +#include +#else +#include +#endif + +#if defined(__OBJC__) +#import +#else // defined(__OBJC__) +#include +#endif // defined(__OBJC__) + +namespace base { +namespace apple { + +// CFCast<>() and CFCastStrict<>() cast a basic CFTypeRef to a more +// specific CoreFoundation type. The compatibility of the passed +// object is found by comparing its opaque type against the +// requested type identifier. If the supplied object is not +// compatible with the requested return type, CFCast<>() returns +// NULL and CFCastStrict<>() will DCHECK. Providing a NULL pointer +// to either variant results in NULL being returned without +// triggering any DCHECK. +// +// Example usage: +// CFNumberRef some_number = base::apple::CFCast( +// CFArrayGetValueAtIndex(array, index)); +// +// CFTypeRef hello = CFSTR("hello world"); +// CFStringRef some_string = base::apple::CFCastStrict(hello); + +template +T CFCast(const CFTypeRef& cf_val); + +template +T CFCastStrict(const CFTypeRef& cf_val); + +#define CF_CAST_DECL(TypeCF) \ + template <> \ + TypeCF##Ref CFCast(const CFTypeRef& cf_val); \ + \ + template <> \ + TypeCF##Ref CFCastStrict(const CFTypeRef& cf_val) + +CF_CAST_DECL(CFArray); +CF_CAST_DECL(CFBag); +CF_CAST_DECL(CFBoolean); +CF_CAST_DECL(CFData); +CF_CAST_DECL(CFDate); +CF_CAST_DECL(CFDictionary); +CF_CAST_DECL(CFNull); +CF_CAST_DECL(CFNumber); +CF_CAST_DECL(CFSet); +CF_CAST_DECL(CFString); +CF_CAST_DECL(CFURL); +CF_CAST_DECL(CFUUID); + +CF_CAST_DECL(CGColor); + +CF_CAST_DECL(CTFont); +CF_CAST_DECL(CTRun); + +#if !BUILDFLAG(IS_IOS) +CF_CAST_DECL(SecACL); +CF_CAST_DECL(SecTrustedApplication); +#endif + +#undef CF_CAST_DECL + +#if defined(__OBJC__) + +// ObjCCast<>() and ObjCCastStrict<>() cast a basic id to a more +// specific (NSObject-derived) type. The compatibility of the passed +// object is found by checking if it's a kind of the requested type +// identifier. If the supplied object is not compatible with the +// requested return type, ObjCCast<>() returns nil and +// ObjCCastStrict<>() will DCHECK. Providing a nil pointer to either +// variant results in nil being returned without triggering any DCHECK. +// +// The strict variant is useful when retrieving a value from a +// collection which only has values of a specific type, e.g. an +// NSArray of NSStrings. The non-strict variant is useful when +// retrieving values from data that you can't fully control. For +// example, a plist read from disk may be beyond your exclusive +// control, so you'd only want to check that the values you retrieve +// from it are of the expected types, but not crash if they're not. +// +// Example usage: +// NSString* version = base::apple::ObjCCast( +// [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]); +// +// NSString* str = base::apple::ObjCCastStrict( +// [ns_arr_of_ns_strs objectAtIndex:0]); +template +T* ObjCCast(id objc_val) { + if ([objc_val isKindOfClass:[T class]]) { + return reinterpret_cast(objc_val); + } + return nil; +} + +template +T* ObjCCastStrict(id objc_val) { + T* rv = ObjCCast(objc_val); + DCHECK(objc_val == nil || rv); + return rv; +} + +#endif // defined(__OBJC__) + +} // namespace apple +} // namespace base + +#endif // MINI_CHROMIUM_BASE_APPLE_FOUNDATION_UTIL_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.mm b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.mm new file mode 100644 index 000000000..2c63ac991 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/foundation_util.mm @@ -0,0 +1,64 @@ +// Copyright 2008 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/apple/foundation_util.h" + +#include "base/check.h" + +#if !BUILDFLAG(IS_IOS) +extern "C" { +CFTypeID SecACLGetTypeID(); +CFTypeID SecTrustedApplicationGetTypeID(); +} // extern "C" +#endif + +namespace base { +namespace apple { + +#define CF_CAST_DEFN(TypeCF) \ + template <> \ + TypeCF##Ref CFCast(const CFTypeRef& cf_val) { \ + if (cf_val == NULL) { \ + return NULL; \ + } \ + if (CFGetTypeID(cf_val) == TypeCF##GetTypeID()) { \ + return (TypeCF##Ref)(cf_val); \ + } \ + return NULL; \ + } \ + \ + template <> \ + TypeCF##Ref CFCastStrict(const CFTypeRef& cf_val) { \ + TypeCF##Ref rv = CFCast(cf_val); \ + DCHECK(cf_val == NULL || rv); \ + return rv; \ + } + +CF_CAST_DEFN(CFArray) +CF_CAST_DEFN(CFBag) +CF_CAST_DEFN(CFBoolean) +CF_CAST_DEFN(CFData) +CF_CAST_DEFN(CFDate) +CF_CAST_DEFN(CFDictionary) +CF_CAST_DEFN(CFNull) +CF_CAST_DEFN(CFNumber) +CF_CAST_DEFN(CFSet) +CF_CAST_DEFN(CFString) +CF_CAST_DEFN(CFURL) +CF_CAST_DEFN(CFUUID) + +CF_CAST_DEFN(CGColor) + +CF_CAST_DEFN(CTFont) +CF_CAST_DEFN(CTRun) + +#if !BUILDFLAG(IS_IOS) +CF_CAST_DEFN(SecACL) +CF_CAST_DEFN(SecTrustedApplication) +#endif + +#undef CF_CAST_DEFN + +} // namespace apple +} // namespace base diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/mach_logging.cc similarity index 89% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/mach_logging.cc index a0041cc50..d5d519802 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/mach_logging.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" #include #include @@ -34,13 +34,10 @@ MachLogMessage::MachLogMessage(const char* function, int line, LogSeverity severity, mach_error_t mach_err) - : LogMessage(function, file_path, line, severity), - mach_err_(mach_err) { -} + : LogMessage(function, file_path, line, severity), mach_err_(mach_err) {} MachLogMessage::~MachLogMessage() { - stream() << ": " - << mach_error_string(mach_err_) + stream() << ": " << mach_error_string(mach_err_) << FormatMachErrorNumber(mach_err_); } @@ -52,12 +49,10 @@ BootstrapLogMessage::BootstrapLogMessage(const char* function, LogSeverity severity, kern_return_t bootstrap_err) : LogMessage(function, file_path, line, severity), - bootstrap_err_(bootstrap_err) { -} + bootstrap_err_(bootstrap_err) {} BootstrapLogMessage::~BootstrapLogMessage() { - stream() << ": " - << bootstrap_strerror(bootstrap_err_); + stream() << ": " << bootstrap_strerror(bootstrap_err_); switch (bootstrap_err_) { case BOOTSTRAP_SUCCESS: diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/mach_logging.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/mach_logging.h new file mode 100644 index 000000000..9ba89b490 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/mach_logging.h @@ -0,0 +1,163 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MINI_CHROMIUM_BASE_APPLE_MACH_LOGGING_H_ +#define MINI_CHROMIUM_BASE_APPLE_MACH_LOGGING_H_ + +#include + +#include "base/logging.h" +#include "build/build_config.h" + +// Use the MACH_LOG family of macros along with a mach_error_t (kern_return_t) +// containing a Mach error. The error value will be decoded so that logged +// messages explain the error. +// +// Use the BOOTSTRAP_LOG family of macros specifically for errors that occur +// while interoperating with the bootstrap subsystem. These errors will first +// be looked up as bootstrap error messages. If no match is found, they will +// be treated as generic Mach errors, as in MACH_LOG. +// +// Examples: +// +// kern_return_t kr = mach_timebase_info(&info); +// if (kr != KERN_SUCCESS) { +// MACH_LOG(ERROR, kr) << "mach_timebase_info"; +// } +// +// kr = vm_deallocate(task, address, size); +// MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate"; + +namespace logging { + +class MachLogMessage : public logging::LogMessage { + public: + MachLogMessage(const char* function, + const char* file_path, + int line, + LogSeverity severity, + mach_error_t mach_err); + + MachLogMessage(const MachLogMessage&) = delete; + MachLogMessage& operator=(const MachLogMessage&) = delete; + + ~MachLogMessage(); + + private: + mach_error_t mach_err_; +}; + +} // namespace logging + +#define MACH_LOG_STREAM(severity, mach_err) \ + COMPACT_GOOGLE_LOG_EX_##severity(MachLogMessage, mach_err).stream() +#define MACH_VLOG_STREAM(verbose_level, mach_err) \ + logging::MachLogMessage( \ + __PRETTY_FUNCTION__, __FILE__, __LINE__, -verbose_level, mach_err) \ + .stream() + +#define MACH_LOG(severity, mach_err) \ + LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), LOG_IS_ON(severity)) +#define MACH_LOG_IF(severity, condition, mach_err) \ + LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ + LOG_IS_ON(severity) && (condition)) + +#define MACH_VLOG(verbose_level, mach_err) \ + LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ + VLOG_IS_ON(verbose_level)) +#define MACH_VLOG_IF(verbose_level, condition, mach_err) \ + LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ + VLOG_IS_ON(verbose_level) && (condition)) + +#define MACH_CHECK(condition, mach_err) \ + LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), !(condition)) \ + << "Check failed: " #condition << ". " + +#define MACH_DLOG(severity, mach_err) \ + LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), DLOG_IS_ON(severity)) +#define MACH_DLOG_IF(severity, condition, mach_err) \ + LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ + DLOG_IS_ON(severity) && (condition)) + +#define MACH_DVLOG(verbose_level, mach_err) \ + LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ + DVLOG_IS_ON(verbose_level)) +#define MACH_DVLOG_IF(verbose_level, condition, mach_err) \ + LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ + DVLOG_IS_ON(verbose_level) && (condition)) + +#define MACH_DCHECK(condition, mach_err) \ + LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), DCHECK_IS_ON && !(condition)) \ + << "Check failed: " #condition << ". " + +#if !BUILDFLAG(IS_IOS) + +namespace logging { + +class BootstrapLogMessage : public logging::LogMessage { + public: + BootstrapLogMessage(const char* function, + const char* file_path, + int line, + LogSeverity severity, + kern_return_t bootstrap_err); + + BootstrapLogMessage(const BootstrapLogMessage&) = delete; + BootstrapLogMessage& operator=(const BootstrapLogMessage&) = delete; + + ~BootstrapLogMessage(); + + private: + kern_return_t bootstrap_err_; +}; + +} // namespace logging + +#define BOOTSTRAP_LOG_STREAM(severity, bootstrap_err) \ + COMPACT_GOOGLE_LOG_EX_##severity(BootstrapLogMessage, bootstrap_err).stream() +#define BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err) \ + logging::BootstrapLogMessage( \ + __PRETTY_FUNCTION__, __FILE__, __LINE__, -verbose_level, bootstrap_err) \ + .stream() + +#define BOOTSTRAP_LOG(severity, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ + LOG_IS_ON(severity)) +#define BOOTSTRAP_LOG_IF(severity, condition, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ + LOG_IS_ON(severity) && (condition)) + +#define BOOTSTRAP_VLOG(verbose_level, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ + VLOG_IS_ON(verbose_level)) +#define BOOTSTRAP_VLOG_IF(verbose_level, condition, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ + VLOG_IS_ON(verbose_level) && (condition)) + +#define BOOTSTRAP_CHECK(condition, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), !(condition)) \ + << "Check failed: " #condition << ". " + +#define BOOTSTRAP_DLOG(severity, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ + DLOG_IS_ON(severity)) +#define BOOTSTRAP_DLOG_IF(severity, condition, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ + DLOG_IS_ON(severity) && (condition)) + +#define BOOTSTRAP_DVLOG(verbose_level, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ + DVLOG_IS_ON(verbose_level)) +#define BOOTSTRAP_DVLOG_IF(verbose_level, condition, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ + DVLOG_IS_ON(verbose_level) && (condition)) + +#define BOOTSTRAP_DCHECK(condition, bootstrap_err) \ + LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), \ + DCHECK_IS_ON && !(condition)) \ + << "Check failed: " #condition << ". " + +#endif // !BUILDFLAG(IS_IOS) + +#endif // MINI_CHROMIUM_BASE_APPLE_MACH_LOGGING_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_cftyperef.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_cftyperef.h similarity index 72% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_cftyperef.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_cftyperef.h index ad7b06895..856f40950 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_cftyperef.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_cftyperef.h @@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_CFTYPEREF_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_CFTYPEREF_H_ +#ifndef MINI_CHROMIUM_BASE_APPLE_SCOPED_CFTYPEREF_H_ +#define MINI_CHROMIUM_BASE_APPLE_SCOPED_CFTYPEREF_H_ #include -#include "base/mac/scoped_typeref.h" +#include "base/apple/scoped_typeref.h" namespace base { +namespace apple { namespace internal { @@ -29,6 +30,7 @@ template using ScopedCFTypeRef = ScopedTypeRef>; +} // namespace apple } // namespace base -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_CFTYPEREF_H_ +#endif // MINI_CHROMIUM_BASE_APPLE_SCOPED_CFTYPEREF_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_port.cc similarity index 87% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_port.cc index d89ae61a8..6f657f834 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_port.cc @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" namespace base { -namespace mac { +namespace apple { namespace internal { void SendRightTraits::Free(mach_port_t port) { @@ -28,5 +28,5 @@ void PortSetTraits::Free(mach_port_t port) { } } // namespace internal -} // namespace mac +} // namespace apple } // namespace base diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_port.h similarity index 65% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_port.h index 741c0a8b5..dd574a44a 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_port.h @@ -2,36 +2,30 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_PORT_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_PORT_H_ +#ifndef MINI_CHROMIUM_BASE_APPLE_SCOPED_MACH_PORT_H_ +#define MINI_CHROMIUM_BASE_APPLE_SCOPED_MACH_PORT_H_ #include #include "base/scoped_generic.h" namespace base { -namespace mac { +namespace apple { namespace internal { struct SendRightTraits { - static mach_port_t InvalidValue() { - return MACH_PORT_NULL; - } + static mach_port_t InvalidValue() { return MACH_PORT_NULL; } static void Free(mach_port_t port); }; struct ReceiveRightTraits { - static mach_port_t InvalidValue() { - return MACH_PORT_NULL; - } + static mach_port_t InvalidValue() { return MACH_PORT_NULL; } static void Free(mach_port_t port); }; struct PortSetTraits { - static mach_port_t InvalidValue() { - return MACH_PORT_NULL; - } + static mach_port_t InvalidValue() { return MACH_PORT_NULL; } static void Free(mach_port_t port); }; @@ -43,7 +37,7 @@ using ScopedMachReceiveRight = ScopedGeneric; using ScopedMachPortSet = ScopedGeneric; -} // namespace mac +} // namespace apple } // namespace base -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_PORT_H_ +#endif // MINI_CHROMIUM_BASE_APPLE_SCOPED_MACH_PORT_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_vm.cc similarity index 77% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_vm.cc index e7d718ea1..f13057441 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_vm.cc @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/mac/scoped_mach_vm.h" +#include "base/apple/scoped_mach_vm.h" namespace base { -namespace mac { +namespace apple { void ScopedMachVM::reset(vm_address_t address, vm_size_t size) { DCHECK(address % PAGE_SIZE == 0); @@ -13,9 +13,8 @@ void ScopedMachVM::reset(vm_address_t address, vm_size_t size) { if (size_) { if (address_ < address) { - vm_deallocate(mach_task_self(), - address_, - std::min(size_, address - address_)); + vm_deallocate( + mach_task_self(), address_, std::min(size_, address - address_)); } if (address_ + size_ > address + size) { vm_address_t deallocate_start = std::max(address_, address + size); @@ -29,5 +28,5 @@ void ScopedMachVM::reset(vm_address_t address, vm_size_t size) { size_ = size; } -} // namespace mac +} // namespace apple } // namespace base diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_vm.h similarity index 86% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_vm.h index ecc18aaed..2f9994c4c 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_mach_vm.h @@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_VM_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_VM_H_ +#ifndef MINI_CHROMIUM_BASE_APPLE_SCOPED_MACH_VM_H_ +#define MINI_CHROMIUM_BASE_APPLE_SCOPED_MACH_VM_H_ #include #include -#include "base/logging.h" +#include "base/check.h" // Use ScopedMachVM to supervise ownership of pages in the current process // through the Mach VM subsystem. Pages allocated with vm_allocate can be @@ -41,13 +41,12 @@ // ScopedMachVM vm_owner(address, mach_vm_round_page(size)); namespace base { -namespace mac { +namespace apple { class ScopedMachVM { public: explicit ScopedMachVM(vm_address_t address = 0, vm_size_t size = 0) - : address_(address), - size_(size) { + : address_(address), size_(size) { DCHECK(address % PAGE_SIZE == 0); DCHECK(size % PAGE_SIZE == 0); } @@ -63,13 +62,9 @@ class ScopedMachVM { void reset(vm_address_t address = 0, vm_size_t size = 0); - vm_address_t address() const { - return address_; - } + vm_address_t address() const { return address_; } - vm_size_t size() const { - return size_; - } + vm_size_t size() const { return size_; } void swap(ScopedMachVM& that) { std::swap(address_, that.address_); @@ -86,7 +81,7 @@ class ScopedMachVM { vm_size_t size_; }; -} // namespace mac +} // namespace apple } // namespace base -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_VM_H_ +#endif // MINI_CHROMIUM_BASE_APPLE_SCOPED_MACH_VM_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_nsautorelease_pool.h similarity index 59% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_nsautorelease_pool.h index ad471ff18..58fdcbc88 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_nsautorelease_pool.h @@ -2,26 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ +#ifndef MINI_CHROMIUM_BASE_APPLE_SCOPED_NSAUTORELEASE_POOL_H_ +#define MINI_CHROMIUM_BASE_APPLE_SCOPED_NSAUTORELEASE_POOL_H_ #include "build/build_config.h" -#if BUILDFLAG(IS_APPLE) -#if defined(__OBJC__) -@class NSAutoreleasePool; -#else // __OBJC__ -class NSAutoreleasePool; -#endif // __OBJC__ -#endif // BUILDFLAG(IS_APPLE) - namespace base { -namespace mac { +namespace apple { -// On the Mac, ScopedNSAutoreleasePool allocates an NSAutoreleasePool when -// instantiated and sends it a -drain message when destroyed. This allows an -// autorelease pool to be maintained in ordinary C++ code without bringing in -// any direct Objective-C dependency. +// On the Mac, ScopedNSAutoreleasePool creates an autorelease pool when +// instantiated and pops it when destroyed. This allows an autorelease pool to +// be maintained in ordinary C++ code without bringing in any direct Objective-C +// dependency. // // On other platforms, ScopedNSAutoreleasePool is an empty object with no // effects. This allows it to be used directly in cross-platform code without @@ -30,7 +22,7 @@ class ScopedNSAutoreleasePool { public: #if !BUILDFLAG(IS_APPLE) ScopedNSAutoreleasePool() {} - void Recycle() { } + void Recycle() {} #else // BUILDFLAG(IS_APPLE) ScopedNSAutoreleasePool(); @@ -44,12 +36,13 @@ class ScopedNSAutoreleasePool { // Only use then when you're certain the items currently in the pool are // no longer needed. void Recycle(); + private: - NSAutoreleasePool* autorelease_pool_; + void* autorelease_pool_; #endif // BUILDFLAG(IS_APPLE) }; -} // namespace mac +} // namespace apple } // namespace base -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ +#endif // MINI_CHROMIUM_BASE_APPLE_SCOPED_NSAUTORELEASE_POOL_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_nsautorelease_pool.mm b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_nsautorelease_pool.mm new file mode 100644 index 000000000..4251484b2 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_nsautorelease_pool.mm @@ -0,0 +1,36 @@ +// Copyright 2008 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/apple/scoped_nsautorelease_pool.h" + +#include "base/logging.h" + +// Note that this uses the direct runtime interface to the autorelease pool. +// https://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime-support +// This is so this can work when compiled for ARC. + +extern "C" { +void* objc_autoreleasePoolPush(void); +void objc_autoreleasePoolPop(void* pool); +} + +namespace base { +namespace apple { + +ScopedNSAutoreleasePool::ScopedNSAutoreleasePool() + : autorelease_pool_(objc_autoreleasePoolPush()) {} + +ScopedNSAutoreleasePool::~ScopedNSAutoreleasePool() { + objc_autoreleasePoolPop(autorelease_pool_); +} + +// Cycle the internal pool, allowing everything there to get cleaned up and +// start anew. +void ScopedNSAutoreleasePool::Recycle() { + objc_autoreleasePoolPop(autorelease_pool_); + autorelease_pool_ = objc_autoreleasePoolPush(); +} + +} // namespace apple +} // namespace base diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_typeref.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_typeref.h new file mode 100644 index 000000000..5d195aa57 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/apple/scoped_typeref.h @@ -0,0 +1,144 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MINI_CHROMIUM_BASE_APPLE_SCOPED_TYPEREF_H_ +#define MINI_CHROMIUM_BASE_APPLE_SCOPED_TYPEREF_H_ + +#include "base/check.h" +#include "base/memory/scoped_policy.h" + +namespace base { +namespace apple { + +template +struct ScopedTypeRefTraits; + +template > +class ScopedTypeRef { + public: + using element_type = T; + + // Construction from underlying type + + explicit constexpr ScopedTypeRef( + element_type object = Traits::InvalidValue(), + base::scoped_policy::OwnershipPolicy policy = base::scoped_policy::ASSUME) + : object_(object) { + if (object_ != Traits::InvalidValue() && + policy == base::scoped_policy::RETAIN) { + object_ = Traits::Retain(object_); + } + } + + // Copy construction + + ScopedTypeRef(const ScopedTypeRef& that) : object_(that.get()) { + if (object_ != Traits::InvalidValue()) { + object_ = Traits::Retain(object_); + } + } + + template + ScopedTypeRef(const ScopedTypeRef& that) : object_(that.get()) { + if (object_ != Traits::InvalidValue()) { + object_ = Traits::Retain(object_); + } + } + + // Copy assignment + + ScopedTypeRef& operator=(const ScopedTypeRef& that) { + reset(that.get(), base::scoped_policy::RETAIN); + return *this; + } + + template + ScopedTypeRef& operator=(const ScopedTypeRef& that) { + reset(that.get(), base::scoped_policy::RETAIN); + return *this; + } + + // Move construction + + ScopedTypeRef(ScopedTypeRef&& that) : object_(that.release()) {} + + template + ScopedTypeRef(ScopedTypeRef&& that) : object_(that.release()) {} + + // Move assignment + + ScopedTypeRef& operator=(ScopedTypeRef&& that) { + reset(that.release(), base::scoped_policy::ASSUME); + return *this; + } + + template + ScopedTypeRef& operator=(ScopedTypeRef&& that) { + reset(that.release(), base::scoped_policy::ASSUME); + return *this; + } + + // Resetting + + template + void reset(const ScopedTypeRef& that) { + reset(that.get(), base::scoped_policy::RETAIN); + } + + void reset(element_type object = Traits::InvalidValue(), + base::scoped_policy::OwnershipPolicy policy = + base::scoped_policy::ASSUME) { + if (object != Traits::InvalidValue() && + policy == base::scoped_policy::RETAIN) { + object = Traits::Retain(object); + } + if (object_ != Traits::InvalidValue()) { + Traits::Release(object_); + } + object_ = object; + } + + // Destruction + + ~ScopedTypeRef() { + if (object_ != Traits::InvalidValue()) { + Traits::Release(object_); + } + } + + [[nodiscard]] element_type* InitializeInto() { + CHECK_EQ(object_, Traits::InvalidValue()); + return &object_; + } + + bool operator==(const ScopedTypeRef& that) const { + return object_ == that.object_; + } + bool operator!=(const ScopedTypeRef& that) const { + return object_ != that.object_; + } + explicit operator bool() const { return object_ != Traits::InvalidValue(); } + + element_type get() const { return object_; } + + void swap(ScopedTypeRef& that) { + element_type temp = that.object_; + that.object_ = object_; + object_ = temp; + } + + [[nodiscard]] element_type release() { + element_type temp = object_; + object_ = Traits::InvalidValue(); + return temp; + } + + private: + element_type object_; +}; + +} // namespace apple +} // namespace base + +#endif // MINI_CHROMIUM_BASE_APPLE_SCOPED_TYPEREF_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/auto_reset.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/auto_reset.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/auto_reset.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/auto_reset.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/bit_cast.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/bit_cast.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/bit_cast.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/bit_cast.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/check.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/check.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/check.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/check.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/check_op.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/check_op.h similarity index 99% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/check_op.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/check_op.h index b38ee90f4..29757e893 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/check_op.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/check_op.h @@ -5,6 +5,7 @@ #ifndef MINI_CHROMIUM_BASE_CHECK_OP_H_ #define MINI_CHROMIUM_BASE_CHECK_OP_H_ +#include "base/check.h" #include "base/logging.h" namespace logging { diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/compiler_specific.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/compiler_specific.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/compiler_specific.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/compiler_specific.h diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/containers/span.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/containers/span.h new file mode 100644 index 000000000..7b6074c2a --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/containers/span.h @@ -0,0 +1,516 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_SPAN_H_ +#define BASE_CONTAINERS_SPAN_H_ + +#include +#include + +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/compiler_specific.h" +#include "base/numerics/safe_conversions.h" +#include "base/template_util.h" + +namespace base { + +// [views.constants] +constexpr size_t dynamic_extent = std::numeric_limits::max(); + +template +class span; + +namespace internal { + +template +using size_constant = std::integral_constant; + +template +struct ExtentImpl : size_constant {}; + +template +struct ExtentImpl : size_constant {}; + +template +struct ExtentImpl> : size_constant {}; + +template +struct ExtentImpl> : size_constant {}; + +template +using Extent = ExtentImpl>; + +template +struct IsSpanImpl : std::false_type {}; + +template +struct IsSpanImpl> : std::true_type {}; + +template +using IsNotSpan = std::negation>>; + +template +struct IsStdArrayImpl : std::false_type {}; + +template +struct IsStdArrayImpl> : std::true_type {}; + +template +using IsNotStdArray = std::negation>>; + +template +using IsNotCArray = std::negation>>; + +template +using IsLegalDataConversion = std::is_convertible; + +template +using ContainerHasConvertibleData = IsLegalDataConversion< + std::remove_pointer_t()))>, + T>; + +template +using ContainerHasIntegralSize = + std::is_integral()))>; + +template +using EnableIfLegalSpanConversion = + std::enable_if_t<(ToExtent == dynamic_extent || ToExtent == FromExtent) && + IsLegalDataConversion::value>; + +// SFINAE check if Array can be converted to a span. +template +using EnableIfSpanCompatibleArray = + std::enable_if_t<(Extent == dynamic_extent || + Extent == internal::Extent::value) && + ContainerHasConvertibleData::value>; + +// SFINAE check if Container can be converted to a span. +template +using IsSpanCompatibleContainer = + std::conjunction, + IsNotStdArray, + IsNotCArray, + ContainerHasConvertibleData, + ContainerHasIntegralSize>; + +template +using EnableIfSpanCompatibleContainer = + std::enable_if_t::value>; + +template +using EnableIfSpanCompatibleContainerAndSpanIsDynamic = + std::enable_if_t::value && + Extent == dynamic_extent>; + +// A helper template for storing the size of a span. Spans with static extents +// don't require additional storage, since the extent itself is specified in the +// template parameter. +template +class ExtentStorage { + public: + constexpr explicit ExtentStorage(size_t size) noexcept {} + constexpr size_t size() const noexcept { return Extent; } +}; + +// Specialization of ExtentStorage for dynamic extents, which do require +// explicit storage for the size. +template <> +struct ExtentStorage { + constexpr explicit ExtentStorage(size_t size) noexcept : size_(size) {} + constexpr size_t size() const noexcept { return size_; } + + private: + size_t size_; +}; + +// must_not_be_dynamic_extent prevents |dynamic_extent| from being returned in a +// constexpr context. +template +constexpr size_t must_not_be_dynamic_extent() { + static_assert( + kExtent != dynamic_extent, + "EXTENT should only be used for containers with a static extent."); + return kExtent; +} + +} // namespace internal + +// A span is a value type that represents an array of elements of type T. Since +// it only consists of a pointer to memory with an associated size, it is very +// light-weight. It is cheap to construct, copy, move and use spans, so that +// users are encouraged to use it as a pass-by-value parameter. A span does not +// own the underlying memory, so care must be taken to ensure that a span does +// not outlive the backing store. +// +// span is somewhat analogous to StringPiece, but with arbitrary element types, +// allowing mutation if T is non-const. +// +// span is implicitly convertible from C++ arrays, as well as most [1] +// container-like types that provide a data() and size() method (such as +// std::vector). A mutable span can also be implicitly converted to an +// immutable span. +// +// Consider using a span for functions that take a data pointer and size +// parameter: it allows the function to still act on an array-like type, while +// allowing the caller code to be a bit more concise. +// +// For read-only data access pass a span: the caller can supply either +// a span or a span, while the callee will have a read-only view. +// For read-write access a mutable span is required. +// +// Without span: +// Read-Only: +// // std::string HexEncode(const uint8_t* data, size_t size); +// std::vector data_buffer = GenerateData(); +// std::string r = HexEncode(data_buffer.data(), data_buffer.size()); +// +// Mutable: +// // ssize_t SafeSNPrintf(char* buf, size_t N, const char* fmt, Args...); +// char str_buffer[100]; +// SafeSNPrintf(str_buffer, sizeof(str_buffer), "Pi ~= %lf", 3.14); +// +// With span: +// Read-Only: +// // std::string HexEncode(base::span data); +// std::vector data_buffer = GenerateData(); +// std::string r = HexEncode(data_buffer); +// +// Mutable: +// // ssize_t SafeSNPrintf(base::span, const char* fmt, Args...); +// char str_buffer[100]; +// SafeSNPrintf(str_buffer, "Pi ~= %lf", 3.14); +// +// Spans with "const" and pointers +// ------------------------------- +// +// Const and pointers can get confusing. Here are vectors of pointers and their +// corresponding spans: +// +// const std::vector => base::span +// std::vector => base::span +// const std::vector => base::span +// +// Differences from the C++20 draft +// -------------------------------- +// +// http://eel.is/c++draft/views contains the latest C++20 draft of std::span. +// Chromium tries to follow the draft as close as possible. Differences between +// the draft and the implementation are documented in subsections below. +// +// Differences from [span.objectrep]: +// - as_bytes() and as_writable_bytes() return spans of uint8_t instead of +// std::byte (std::byte is a C++17 feature) +// +// Differences from [span.cons]: +// - Constructing a static span (i.e. Extent != dynamic_extent) from a dynamic +// sized container (e.g. std::vector) requires an explicit conversion (in the +// C++20 draft this is simply UB) +// +// Furthermore, all constructors and methods are marked noexcept due to the lack +// of exceptions in Chromium. +// +// Due to the lack of class template argument deduction guides in C++14 +// appropriate make_span() utility functions are provided. + +// [span], class template span +template +class span : public internal::ExtentStorage { + private: + using ExtentStorage = internal::ExtentStorage; + + public: + using element_type = T; + using value_type = std::remove_cv_t; + using size_type = size_t; + using difference_type = ptrdiff_t; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using iterator = T*; + using reverse_iterator = std::reverse_iterator; + static constexpr size_t extent = Extent; + + // [span.cons], span constructors, copy, assignment, and destructor + constexpr span() noexcept : ExtentStorage(0), data_(nullptr) { + static_assert(Extent == dynamic_extent || Extent == 0, "Invalid Extent"); + } + + constexpr span(T* data, size_t size) noexcept + : ExtentStorage(size), data_(data) { + CHECK(Extent == dynamic_extent || Extent == size); + } + + // Artificially templatized to break ambiguity for span(ptr, 0). + template + constexpr span(T* begin, T* end) noexcept : span(begin, end - begin) { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(begin <= end); + } + + template < + size_t N, + typename = internal::EnableIfSpanCompatibleArray> + constexpr span(T (&array)[N]) noexcept : span(std::data(array), N) {} + + template < + typename U, + size_t N, + typename = + internal::EnableIfSpanCompatibleArray&, T, Extent>> + constexpr span(std::array& array) noexcept + : span(std::data(array), N) {} + + template &, T, Extent>> + constexpr span(const std::array& array) noexcept + : span(std::data(array), N) {} + + // Conversion from a container that has compatible std::data() and integral + // std::size(). + template < + typename Container, + typename = + internal::EnableIfSpanCompatibleContainerAndSpanIsDynamic> + constexpr span(Container& container) noexcept + : span(std::data(container), std::size(container)) {} + + template < + typename Container, + typename = internal::EnableIfSpanCompatibleContainerAndSpanIsDynamic< + const Container&, + T, + Extent>> + constexpr span(const Container& container) noexcept + : span(std::data(container), std::size(container)) {} + + constexpr span(const span& other) noexcept = default; + + // Conversions from spans of compatible types and extents: this allows a + // span to be seamlessly used as a span, but not the other way + // around. If extent is not dynamic, OtherExtent has to be equal to Extent. + template < + typename U, + size_t OtherExtent, + typename = + internal::EnableIfLegalSpanConversion> + constexpr span(const span& other) + : span(other.data(), other.size()) {} + + constexpr span& operator=(const span& other) noexcept = default; + ~span() noexcept = default; + + // [span.sub], span subviews + template + constexpr span first() const noexcept { + static_assert(Count <= Extent, "Count must not exceed Extent"); + CHECK(Extent != dynamic_extent || Count <= size()); + return {data(), Count}; + } + + template + constexpr span last() const noexcept { + static_assert(Count <= Extent, "Count must not exceed Extent"); + CHECK(Extent != dynamic_extent || Count <= size()); + return {data() + (size() - Count), Count}; + } + + template + constexpr span + subspan() const noexcept { + static_assert(Offset <= Extent, "Offset must not exceed Extent"); + static_assert(Count == dynamic_extent || Count <= Extent - Offset, + "Count must not exceed Extent - Offset"); + CHECK(Extent != dynamic_extent || Offset <= size()); + CHECK(Extent != dynamic_extent || Count == dynamic_extent || + Count <= size() - Offset); + return {data() + Offset, Count != dynamic_extent ? Count : size() - Offset}; + } + + constexpr span first(size_t count) const noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(count <= size()); + return {data(), count}; + } + + constexpr span last(size_t count) const noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(count <= size()); + return {data() + (size() - count), count}; + } + + constexpr span subspan(size_t offset, + size_t count = dynamic_extent) const + noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(offset <= size()); + CHECK(count == dynamic_extent || count <= size() - offset); + return {data() + offset, count != dynamic_extent ? count : size() - offset}; + } + + // [span.obs], span observers + constexpr size_t size() const noexcept { return ExtentStorage::size(); } + constexpr size_t size_bytes() const noexcept { return size() * sizeof(T); } + [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; } + + // [span.elem], span element access + constexpr T& operator[](size_t idx) const noexcept { + // Note: CHECK_LT is not constexpr, hence regular CHECK must be used. + CHECK(idx < size()); + return *(data() + idx); + } + + constexpr T& front() const noexcept { + static_assert(Extent == dynamic_extent || Extent > 0, + "Extent must not be 0"); + CHECK(Extent != dynamic_extent || !empty()); + return *data(); + } + + constexpr T& back() const noexcept { + static_assert(Extent == dynamic_extent || Extent > 0, + "Extent must not be 0"); + CHECK(Extent != dynamic_extent || !empty()); + return *(data() + size() - 1); + } + + constexpr T* data() const noexcept { return data_; } + + // [span.iter], span iterator support + constexpr iterator begin() const noexcept { + return data(); + } + + constexpr iterator end() const noexcept { + return data() + size(); + } + + constexpr reverse_iterator rbegin() const noexcept { + return reverse_iterator(end()); + } + + constexpr reverse_iterator rend() const noexcept { + return reverse_iterator(begin()); + } + + private: + // This field is not a raw_ptr<> because it was filtered by the rewriter + // for: #constexpr-ctor-field-initializer, #global-scope, #union + InternalPtrType data_; +}; + +// span::extent can not be declared inline prior to C++17, hence this +// definition is required. +template +constexpr size_t span::extent; + +template >> +span(It, StrictNumeric) -> span; + +template >, + typename T = std::remove_reference_t>> +span(It, End) -> span; + +template +span(T (&)[N]) -> span; + +template +span(std::array&) -> span; + +template +span(const std::array&) -> span; + +template ()))>, + size_t X = internal::Extent::value> +span(Container&&) -> span; + +// [span.objectrep], views of object representation +template +span +as_bytes(span s) noexcept { + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +template >> +span +as_writable_bytes(span s) noexcept { + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +// Type-deducing helpers for constructing a span. +template +constexpr span make_span(T* data, size_t size) noexcept { + return {data, size}; +} + +template +constexpr span make_span(T* begin, T* end) noexcept { + return {begin, end}; +} + +// make_span utility function that deduces both the span's value_type and extent +// from the passed in argument. +// +// Usage: auto span = base::make_span(...); +template +constexpr auto make_span(Container&& container) noexcept { + using T = + std::remove_pointer_t()))>; + using Extent = internal::Extent; + return span(std::forward(container)); +} + +// make_span utility functions that allow callers to explicit specify the span's +// extent, the value_type is deduced automatically. This is useful when passing +// a dynamically sized container to a method expecting static spans, when the +// container is known to have the correct size. +// +// Note: This will CHECK that N indeed matches size(container). +// +// Usage: auto static_span = base::make_span(...); +template +constexpr auto make_span(Container&& container) noexcept { + using T = + std::remove_pointer_t()))>; + return span(std::data(container), std::size(container)); +} + +} // namespace base + +// EXTENT returns the size of any type that can be converted to a |base::span| +// with definite extent, i.e. everything that is a contiguous storage of some +// sort with static size. Specifically, this works for std::array in a constexpr +// context. Note: +// * |std::size| should be preferred for plain arrays. +// * In run-time contexts, functions such as |std::array::size| should be +// preferred. +#define EXTENT(x) \ + ::base::internal::must_not_be_dynamic_extent() + +#endif // BASE_CONTAINERS_SPAN_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/cxx17_backports.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/cxx17_backports.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/cxx17_backports.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/cxx17_backports.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/debug/alias.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.cc similarity index 92% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.cc index 37c4b208a..0b1efff79 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.cc @@ -6,9 +6,15 @@ #include -#include "base/cxx17_backports.h" +#include + +#include "base/check.h" #include "base/logging.h" +#if defined(FILE_PATH_USES_WIDE_CHARACTERS) +#include "base/strings/utf_string_conversions.h" +#endif // FILE_PATH_USES_WIDE_CHARACTERS + namespace base { #if defined(FILE_PATH_USES_WIN_SEPARATORS) @@ -120,7 +126,7 @@ bool FilePath::operator!=(const FilePath& that) const { // static bool FilePath::IsSeparator(CharType character) { - for (size_t i = 0; i < size(FilePath::kSeparators) - 1; ++i) { + for (size_t i = 0; i < std::size(FilePath::kSeparators) - 1; ++i) { if (character == kSeparators[i]) { return true; } @@ -143,9 +149,8 @@ FilePath FilePath::DirName() const { // resizes below using letter will still be valid. StringType::size_type letter = FindDriveLetter(new_path.path_); - StringType::size_type last_separator = - new_path.path_.find_last_of(kSeparators, StringType::npos, - size(kSeparators) - 1); + StringType::size_type last_separator = new_path.path_.find_last_of( + kSeparators, StringType::npos, std::size(kSeparators) - 1); if (last_separator == StringType::npos) { // path_ is in the current directory. new_path.path_.resize(letter + 1); @@ -181,9 +186,8 @@ FilePath FilePath::BaseName() const { // Keep everything after the final separator, but if the pathname is only // one character and it's a separator, leave it alone. - StringType::size_type last_separator = - new_path.path_.find_last_of(kSeparators, StringType::npos, - size(kSeparators) - 1); + StringType::size_type last_separator = new_path.path_.find_last_of( + kSeparators, StringType::npos, std::size(kSeparators) - 1); if (last_separator != StringType::npos && last_separator < new_path.path_.length() - 1) { new_path.path_.erase(0, last_separator + 1); @@ -287,6 +291,10 @@ void FilePath::StripTrailingSeparatorsInternal() { } // namespace base -void PrintTo(const base::FilePath& path, std::ostream* out) { - *out << path.value().c_str(); +std::ostream& operator<<(std::ostream& os, const base::FilePath& file_path) { +#ifdef FILE_PATH_USES_WIDE_CHARACTERS + return os << base::WideToUTF8(file_path.value()); +#else + return os << file_path.value(); +#endif } diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.h similarity index 97% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.h index 186a1be85..795558374 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_path.h @@ -116,6 +116,7 @@ #if BUILDFLAG(IS_WIN) #define FILE_PATH_USES_DRIVE_LETTERS #define FILE_PATH_USES_WIN_SEPARATORS +#define FILE_PATH_USES_WIDE_CHARACTERS #endif // BUILDFLAG(IS_WIN) namespace base { @@ -225,8 +226,11 @@ class FilePath { } // namespace base -// This is required by googletest to print a readable output on test failures. -extern void PrintTo(const base::FilePath& path, std::ostream* out); +// Streams `file_path`'s value to a byte stream, converting from wide +// characters if called for. (also lets googletest print a readable output on +// test failures) +extern std::ostream& operator<<(std::ostream& os, + const base::FilePath& file_path); // Macros for string literal initialization of FilePath::CharType[], and for // using a FilePath::CharType[] in a printf-style format string. diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util_posix.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util_posix.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/file_util_posix.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.cc similarity index 96% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.cc index cdf66fc3c..f106e5985 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.cc @@ -10,6 +10,8 @@ #if BUILDFLAG(IS_POSIX) #include + +#include "base/check.h" #include "base/posix/eintr_wrapper.h" #endif diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/format_macros.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/format_macros.h similarity index 73% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/format_macros.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/format_macros.h index 0cf2f00d1..b273a2eca 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/format_macros.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/format_macros.h @@ -23,25 +23,18 @@ #include "build/build_config.h" -#if BUILDFLAG(IS_POSIX) - -#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64) +#if BUILDFLAG(IS_POSIX) && \ + (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64) #error "inttypes.h has already been included before this header file, but " #error "without __STDC_FORMAT_MACROS defined." #endif -#if !defined(__STDC_FORMAT_MACROS) +#if BUILDFLAG(IS_POSIX) && !defined(__STDC_FORMAT_MACROS) #define __STDC_FORMAT_MACROS #endif #include -// GCC will concatenate wide and narrow strings correctly, so nothing needs to -// be done here. -#define WidePRId64 PRId64 -#define WidePRIu64 PRIu64 -#define WidePRIx64 PRIx64 - #if !defined(PRIuS) #define PRIuS "zu" #endif @@ -74,28 +67,4 @@ #endif #endif // BUILDFLAG(IS_APPLE) -#else // BUILDFLAG(IS_WIN) - -#if !defined(PRId64) -#define PRId64 "I64d" -#endif - -#if !defined(PRIu64) -#define PRIu64 "I64u" -#endif - -#if !defined(PRIx64) -#define PRIx64 "I64x" -#endif - -#define WidePRId64 L"I64d" -#define WidePRIu64 L"I64u" -#define WidePRIx64 L"I64x" - -#if !defined(PRIuS) -#define PRIuS "Iu" -#endif - -#endif - #endif // BASE_FORMAT_MACROS_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/fuchsia/fuchsia_logging.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.cc similarity index 98% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.cc index 4abec6699..f9eaa8bd7 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.cc @@ -54,7 +54,7 @@ #include #endif -#include "base/cxx17_backports.h" +#include "base/check_op.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -102,7 +102,7 @@ std::string SystemErrorCodeToString(unsigned long error_code) { error_code, 0, msgbuf, - static_cast(base::size(msgbuf)), + static_cast(std::size(msgbuf)), nullptr); if (len) { // Most system messages end in a period and a space. Remove the space if @@ -244,7 +244,7 @@ LogMessage::~LogMessage() { // By default, messages are only readable by the admin group. Explicitly // make them readable by the user generating the messages. char euid_string[12]; - snprintf(euid_string, base::size(euid_string), "%d", geteuid()); + snprintf(euid_string, std::size(euid_string), "%d", geteuid()); asl_set(asl_message.get(), ASL_KEY_READ_UID, euid_string); // Map Chrome log severities to ASL log levels. diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.h similarity index 98% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.h index 712a59805..fedb1dbdf 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/logging.h @@ -5,16 +5,13 @@ #ifndef MINI_CHROMIUM_BASE_LOGGING_H_ #define MINI_CHROMIUM_BASE_LOGGING_H_ -#include #include +#include #include #include #include -#include "base/check.h" -#include "base/check_op.h" -#include "base/notreached.h" #include "build/build_config.h" namespace logging { @@ -307,9 +304,6 @@ const LogSeverity LOG_0 = LOG_ERROR; LAZY_STREAM(VPLOG_STREAM(verbose_level), \ DVLOG_IS_ON(verbose_level) && (condition)) -#undef assert -#define assert(condition) DLOG_ASSERT(condition) - namespace std { ostream& operator<<(ostream& out, const u16string& str); } // namespace std diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/close_nocancel.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/close_nocancel.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/close_nocancel.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/close_nocancel.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h similarity index 84% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h index 4a790ca6a..71f4b354a 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h @@ -7,7 +7,7 @@ #include -#include "base/mac/scoped_typeref.h" +#include "base/apple/scoped_typeref.h" namespace base { namespace mac { @@ -27,7 +27,8 @@ struct ScopedIOObjectTraits { } // namespce internal template -using ScopedIOObject = ScopedTypeRef>; +using ScopedIOObject = + apple::ScopedTypeRef>; } // namespace mac } // namespace base diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/free_deleter.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/free_deleter.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/free_deleter.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/free_deleter.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_posix.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_posix.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_posix.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_win.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_win.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_win.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/page_size_win.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/scoped_policy.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/scoped_policy.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/scoped_policy.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/memory/scoped_policy.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_functions.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_functions.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_functions.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_functions.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_macros.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_macros.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_macros.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/histogram_macros.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/persistent_histogram_allocator.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/persistent_histogram_allocator.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/persistent_histogram_allocator.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/metrics/persistent_histogram_allocator.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/notreached.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/notreached.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/notreached.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/notreached.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/checked_math_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/clamped_math_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_arm_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_arm_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_arm_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_arm_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_arm_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_arm_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_arm_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_arm_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_clang_gcc_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_clang_gcc_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_clang_gcc_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_clang_gcc_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_shared_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_shared_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_shared_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_shared_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/eintr_wrapper.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/eintr_wrapper.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/eintr_wrapper.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/eintr_wrapper.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.cc similarity index 92% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.cc index a67fa2855..fe4eca69e 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.cc @@ -8,7 +8,6 @@ #include #include -#include "base/cxx17_backports.h" #include "build/build_config.h" #if BUILDFLAG(IS_ANDROID) @@ -38,7 +37,7 @@ void safe_strerror_r(int err, char* buf, size_t len) { std::string safe_strerror(int err) { char buf[256]; - safe_strerror_r(err, buf, size(buf)); + safe_strerror_r(err, buf, std::size(buf)); return std::string(buf); } diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/posix/safe_strerror.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/process/memory.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.cc similarity index 99% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.cc index 93ed79803..f5e0d31a5 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.cc @@ -11,8 +11,8 @@ #include #include +#include "base/check_op.h" #include "base/files/file_util.h" -#include "base/logging.h" #include "build/build_config.h" #if BUILDFLAG(IS_FUCHSIA) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/rand_util.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error_win.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error_win.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error_win.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_clear_last_error_win.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_generic.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_generic.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_generic.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/scoped_generic.h diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.cc new file mode 100644 index 000000000..cc747aab6 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.cc @@ -0,0 +1,155 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/strings/pattern.h" + +#include "base/third_party/icu/icu_utf.h" + +namespace base { + +namespace { + +constexpr bool IsWildcard(base_icu::UChar32 character) { + return character == '*' || character == '?'; +} + +// Searches for the next subpattern of |pattern| in |string|, up to the given +// |maximum_distance|. The subpattern extends from the start of |pattern| up to +// the first wildcard character (or the end of the string). If the value of +// |maximum_distance| is negative, the maximum distance is considered infinite. +template +constexpr bool SearchForChars(const CHAR** pattern, + const CHAR* pattern_end, + const CHAR** string, + const CHAR* string_end, + int maximum_distance, + NEXT next) { + const CHAR* pattern_start = *pattern; + const CHAR* string_start = *string; + bool escape = false; + while (true) { + if (*pattern == pattern_end) { + // If this is the end of the pattern, only accept the end of the string; + // anything else falls through to the mismatch case. + if (*string == string_end) + return true; + } else { + // If we have found a wildcard, we're done. + if (!escape && IsWildcard(**pattern)) + return true; + + // Check if the escape character is found. If so, skip it and move to the + // next character. + if (!escape && **pattern == '\\') { + escape = true; + next(pattern, pattern_end); + continue; + } + + escape = false; + + if (*string == string_end) + return false; + + // Check if the chars match, if so, increment the ptrs. + const CHAR* pattern_next = *pattern; + const CHAR* string_next = *string; + base_icu::UChar32 pattern_char = next(&pattern_next, pattern_end); + if (pattern_char == next(&string_next, string_end) && + pattern_char != CBU_SENTINEL) { + *pattern = pattern_next; + *string = string_next; + continue; + } + } + + // Mismatch. If we have reached the maximum distance, return false, + // otherwise restart at the beginning of the pattern with the next character + // in the string. + // TODO(bauerb): This is a naive implementation of substring search, which + // could be implemented with a more efficient algorithm, e.g. + // Knuth-Morris-Pratt (at the expense of requiring preprocessing). + if (maximum_distance == 0) + return false; + + // Because unlimited distance is represented as -1, this will never reach 0 + // and therefore fail the match above. + maximum_distance--; + *pattern = pattern_start; + next(&string_start, string_end); + *string = string_start; + } +} + +// Consumes consecutive wildcard characters (? or *). Returns the maximum number +// of characters matched by the sequence of wildcards, or -1 if the wildcards +// match an arbitrary number of characters (which is the case if it contains at +// least one *). +template +constexpr int EatWildcards(const CHAR** pattern, const CHAR* end, NEXT next) { + int num_question_marks = 0; + bool has_asterisk = false; + while (*pattern != end) { + if (**pattern == '?') { + num_question_marks++; + } else if (**pattern == '*') { + has_asterisk = true; + } else { + break; + } + + next(pattern, end); + } + return has_asterisk ? -1 : num_question_marks; +} + +template +constexpr bool MatchPatternT(const CHAR* eval, + const CHAR* eval_end, + const CHAR* pattern, + const CHAR* pattern_end, + NEXT next) { + do { + int maximum_wildcard_length = EatWildcards(&pattern, pattern_end, next); + if (!SearchForChars(&pattern, pattern_end, &eval, eval_end, + maximum_wildcard_length, next)) { + return false; + } + } while (pattern != pattern_end); + return true; +} + +struct NextCharUTF8 { + base_icu::UChar32 operator()(const char** p, const char* end) { + base_icu::UChar32 c; + int offset = 0; + CBU8_NEXT(reinterpret_cast(*p), offset, end - *p, c); + *p += offset; + return c; + } +}; + +struct NextCharUTF16 { + base_icu::UChar32 operator()(const char16_t** p, const char16_t* end) { + base_icu::UChar32 c; + int offset = 0; + CBU16_NEXT(*p, offset, end - *p, c); + *p += offset; + return c; + } +}; + +} // namespace + +bool MatchPattern(StringPiece eval, StringPiece pattern) { + return MatchPatternT(eval.data(), eval.data() + eval.size(), pattern.data(), + pattern.data() + pattern.size(), NextCharUTF8()); +} + +bool MatchPattern(StringPiece16 eval, StringPiece16 pattern) { + return MatchPatternT(eval.data(), eval.data() + eval.size(), pattern.data(), + pattern.data() + pattern.size(), NextCharUTF16()); +} + +} // namespace base diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.h new file mode 100644 index 000000000..20c13c76d --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/pattern.h @@ -0,0 +1,22 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_STRINGS_PATTERN_H_ +#define BASE_STRINGS_PATTERN_H_ + +#include "base/strings/string_piece.h" + +namespace base { + +// Returns true if the |string| passed in matches the |pattern|. The pattern +// string can contain wildcards like * and ?. +// +// The backslash character (\) is an escape character for * and ?. +// ? matches 0 or 1 character, while * matches 0 or more characters. +bool MatchPattern(StringPiece string, StringPiece pattern); +bool MatchPattern(StringPiece16 string, StringPiece16 pattern); + +} // namespace base + +#endif // BASE_STRINGS_PATTERN_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.cc new file mode 100644 index 000000000..f322fc332 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.cc @@ -0,0 +1,17 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/strings/strcat.h" + +#include + +#include "base/strings/strcat_internal.h" + +namespace base { + +std::string StrCat(span pieces) { + return internal::StrCatT(pieces); +} + +} // namespace base diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.h new file mode 100644 index 000000000..d26c2fc0c --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat.h @@ -0,0 +1,66 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_STRINGS_STRCAT_H_ +#define BASE_STRINGS_STRCAT_H_ + +#include + +#include "base/containers/span.h" +#include "base/strings/string_piece.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +// Guard against conflict with Win32 API StrCat macro: +// check StrCat wasn't and will not be redefined. +#define StrCat StrCat +#endif + +namespace base { + +// StrCat ---------------------------------------------------------------------- +// +// StrCat is a function to perform concatenation on a sequence of strings. +// It is preferrable to a sequence of "a + b + c" because it is both faster and +// generates less code. +// +// std::string result = base::StrCat({"foo ", result, "\nfoo ", bar}); +// +// MORE INFO +// +// StrCat can see all arguments at once, so it can allocate one return buffer +// of exactly the right size and copy once, as opposed to a sequence of +// operator+ which generates a series of temporary strings, copying as it goes. +// And by using StringPiece arguments, StrCat can avoid creating temporary +// string objects for char* constants. +// +// ALTERNATIVES +// +// Internal Google / Abseil has a similar StrCat function. That version takes +// an overloaded number of arguments instead of initializer list (overflowing +// to initializer list for many arguments). We don't have any legacy +// requirements and using only initializer_list is simpler and generates +// roughly the same amount of code at the call sites. +// +// Abseil's StrCat also allows numbers by using an intermediate class that can +// be implicitly constructed from either a string or various number types. This +// class formats the numbers into a static buffer for increased performance, +// and the call sites look nice. +// +// As-written Abseil's helper class for numbers generates slightly more code +// than the raw StringPiece version. We can de-inline the helper class' +// constructors which will cause the StringPiece constructors to be de-inlined +// for this call and generate slightly less code. This is something we can +// explore more in the future. + +[[nodiscard]] std::string StrCat(span pieces); + +// Initializer list forwards to the array version. +inline std::string StrCat(std::initializer_list pieces) { + return StrCat(make_span(pieces)); +} + +} // namespace base + +#endif // BASE_STRINGS_STRCAT_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat_internal.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat_internal.h new file mode 100644 index 000000000..f54b06956 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/strcat_internal.h @@ -0,0 +1,76 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_STRINGS_STRCAT_INTERNAL_H_ +#define BASE_STRINGS_STRCAT_INTERNAL_H_ + +#include + +#include "base/containers/span.h" +#include "base/template_util.h" + +namespace base { + +namespace internal { + +// Optimized version of `std::basic_string::resize()` that skips zero +// initialization of appended characters. Reading from the newly allocated +// characters results in undefined behavior if they are not explicitly +// initialized afterwards. Currently proposed for standardization as +// std::basic_string::resize_and_overwrite: https://wg21.link/P1072R6 +template +auto Resize(std::basic_string& str, size_t total_size, priority_tag<1>) + -> decltype(str.__resize_default_init(total_size)) { + str.__resize_default_init(total_size); +} + +// Fallback to regular std::basic_string::resize() if invoking +// __resize_default_init is ill-formed. +template +void Resize(std::basic_string& str, size_t total_size, priority_tag<0>) { + str.resize(total_size); +} + +// Appends `pieces` to `dest`. Instead of simply calling `dest.append()` +// `pieces.size()` times, this method first resizes `dest` to be of the desired +// size, and then appends each piece via `std::char_traits::copy`. This achieves +// two goals: +// 1) Allocating the desired size all at once avoids other allocations that +// could happen if intermediate allocations did not reserve enough capacity. +// 2) Invoking std::char_traits::copy instead of std::basic_string::append +// avoids having to write the terminating '\0' character n times. +template +void StrAppendT(std::basic_string& dest, span pieces) { + const size_t initial_size = dest.size(); + size_t total_size = initial_size; + for (const auto& cur : pieces) + total_size += cur.size(); + + // Note: As opposed to `reserve()` calling `resize()` with an argument smaller + // than the current `capacity()` does not result in the string releasing spare + // capacity. Furthermore, common std::string implementations apply a geometric + // growth strategy if the current capacity is not sufficient for the newly + // added characters. Since this codepath is also triggered by `resize()`, we + // don't have to manage the std::string's capacity ourselves here to avoid + // performance hits in case `StrAppend()` gets called in a loop. + Resize(dest, total_size, priority_tag<1>()); + CharT* dest_char = &dest[initial_size]; + for (const auto& cur : pieces) { + std::char_traits::copy(dest_char, cur.data(), cur.size()); + dest_char += cur.size(); + } +} + +template +auto StrCatT(span pieces) { + std::basic_string result; + StrAppendT(result, pieces); + return result; +} + +} // namespace internal + +} // namespace base + +#endif // BASE_STRINGS_STRCAT_INTERNAL_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h similarity index 99% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h index d2fe0dc48..a6a448bc7 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h @@ -160,7 +160,6 @@ std::ostream& operator<<(std::ostream& ostream, typedef BasicStringPiece StringPiece; typedef BasicStringPiece StringPiece16; -typedef BasicStringPiece WStringPiece; inline bool operator==(const StringPiece& x, const StringPiece& y) { if (x.size() != y.size()) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.h similarity index 76% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.h index 2d8b13dfc..55cc8e466 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util.h @@ -5,8 +5,8 @@ #ifndef MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_H_ #define MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_H_ +#include "base/check_op.h" #include "base/compiler_specific.h" -#include "base/logging.h" #include "build/build_config.h" namespace base { @@ -17,13 +17,16 @@ int vsnprintf(char* buffer, size_t size, const char* format, va_list arguments) size_t strlcpy(char* dst, const char* src, size_t dst_size); size_t wcslcpy(wchar_t* dst, const wchar_t* src, size_t dst_size); -} // namespace base - -#if BUILDFLAG(IS_WIN) -#include "base/strings/string_util_win.h" -#elif BUILDFLAG(IS_POSIX) -#include "base/strings/string_util_posix.h" -#endif +// Determines the type of ASCII character, independent of locale (the C +// library versions will change based on locale). +template +inline bool IsAsciiWhitespace(Char c) { + return c == ' ' || (c >= 0x09 && c <= 0x0d); +} +template +inline bool IsAsciiDigit(Char c) { + return c >= '0' && c <= '9'; +} template inline typename string_type::value_type* WriteInto(string_type* str, @@ -38,4 +41,12 @@ inline typename string_type::value_type* WriteInto(string_type* str, return &((*str)[0]); } +} // namespace base + +#if BUILDFLAG(IS_WIN) +#include "base/strings/string_util_win.h" +#elif BUILDFLAG(IS_POSIX) +#include "base/strings/string_util_posix.h" +#endif + #endif // MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h similarity index 95% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h index fc7d2141a..5daba8a52 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h @@ -5,8 +5,6 @@ #ifndef MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_POSIX_H_ #define MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_POSIX_H_ -#include "base/strings/string_util.h" - #include #include diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.cc similarity index 93% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.cc index 905c019b2..fa3c5c5ae 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.cc @@ -8,7 +8,6 @@ #include -#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/scoped_clear_last_error.h" #include "base/strings/string_util.h" @@ -35,16 +34,16 @@ static void StringAppendVT(StringType* dst, va_copy(ap_copy, ap); ScopedClearLastError clear_errno; - int result = vsnprintfT(stack_buf, size(stack_buf), format, ap_copy); + int result = vsnprintfT(stack_buf, std::size(stack_buf), format, ap_copy); va_end(ap_copy); - if (result >= 0 && result < static_cast(size(stack_buf))) { + if (result >= 0 && result < static_cast(std::size(stack_buf))) { dst->append(stack_buf, result); return; } // Repeatedly increase buffer size until it fits. - size_t mem_length = size(stack_buf); + size_t mem_length = std::size(stack_buf); while (true) { if (result < 0) { #if !BUILDFLAG(IS_WIN) diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions_mac.mm b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions_mac.mm similarity index 93% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions_mac.mm rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions_mac.mm index 9b9befdfb..87f872593 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions_mac.mm +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions_mac.mm @@ -4,8 +4,8 @@ #include "base/strings/sys_string_conversions.h" -#include "base/logging.h" -#include "base/mac/foundation_util.h" +#include "base/apple/bridging.h" +#include "base/check_op.h" namespace base { @@ -83,7 +83,7 @@ static CFStringRef STLStringToCFStringWithEncodingsT( if (!nsstring) { return std::string(); } - return SysCFStringRefToUTF8(base::mac::NSToCFCast(nsstring)); + return SysCFStringRefToUTF8(apple::NSToCFPtrCast(nsstring)); } CFStringRef SysUTF8ToCFStringRef(const std::string& utf8) { @@ -91,7 +91,7 @@ CFStringRef SysUTF8ToCFStringRef(const std::string& utf8) { } NSString* SysUTF8ToNSString(const std::string& utf8) { - return [base::mac::CFToNSCast(SysUTF8ToCFStringRef(utf8)) autorelease]; + return base::apple::CFToNSOwnershipCast(SysUTF8ToCFStringRef(utf8)); } } // namespace base diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.cc similarity index 92% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.cc index 0f9f3d2cb..ba51598b4 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.cc @@ -32,10 +32,13 @@ bool ReadUnicodeCharacter(const char* src, int32_t src_len, int32_t* char_index, uint32_t* code_point_out) { - int32_t code_point; - CBU8_NEXT(src, *char_index, src_len, code_point); - *code_point_out = static_cast(code_point); + base_icu::UChar32 code_point; + CBU8_NEXT(reinterpret_cast(src), *char_index, src_len, + code_point); + *code_point_out = code_point; + // The ICU macro above moves to the next char, we want to point to the last + // char consumed. (*char_index)--; return IsValidCodepoint(code_point); diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h similarity index 98% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h index 15fe3008e..99873ee7b 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h @@ -5,6 +5,8 @@ #ifndef MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSION_UTILS_H_ #define MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSION_UTILS_H_ +#include + #include namespace base { diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.cc similarity index 93% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.cc index 0d752602d..a1c243c7f 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.cc @@ -7,6 +7,7 @@ #include #include +#include #include "base/strings/utf_string_conversion_utils.h" #include "build/build_config.h" @@ -58,8 +59,8 @@ std::string UTF16ToUTF8(const StringPiece16& utf16) { return ret; } -#if defined(WCHAR_T_IS_UTF16) -std::string WideToUTF8(WStringPiece wide) { +#if defined(WCHAR_T_IS_16_BIT) +std::string WideToUTF8(std::wstring_view wide) { std::string ret; UTF16ToUTF8( reinterpret_cast(wide.data()), wide.size(), &ret); @@ -71,6 +72,6 @@ std::wstring UTF8ToWide(StringPiece utf8) { return std::wstring(reinterpret_cast(utf16.data()), utf16.size()); } -#endif // defined(WCHAR_T_IS_UTF16) +#endif // defined(WCHAR_T_IS_16_BIT) } // namespace diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h similarity index 84% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h index 1b404aff4..64c79c2bc 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h @@ -6,6 +6,7 @@ #define MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSIONS_H_ #include +#include #include "base/strings/string_piece.h" #include "build/build_config.h" @@ -17,10 +18,10 @@ std::u16string UTF8ToUTF16(const StringPiece& utf8); bool UTF16ToUTF8(const char16_t* src, size_t src_len, std::string* output); std::string UTF16ToUTF8(const StringPiece16& utf16); -#if defined(WCHAR_T_IS_UTF16) -std::string WideToUTF8(WStringPiece wide); +#if defined(WCHAR_T_IS_16_BIT) +std::string WideToUTF8(std::wstring_view wide); std::wstring UTF8ToWide(StringPiece utf8); -#endif // defined(WCHAR_T_IS_UTF16) +#endif // defined(WCHAR_T_IS_16_BIT) } // namespace diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable_posix.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable_posix.cc similarity index 97% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable_posix.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable_posix.cc index 51b659bed..755e8b629 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable_posix.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/condition_variable_posix.cc @@ -4,7 +4,7 @@ #include "base/synchronization/condition_variable.h" -#include "base/logging.h" +#include "base/check_op.h" namespace base { diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.cc similarity index 97% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.cc index 9e8e00bc9..24830328b 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.cc @@ -8,7 +8,7 @@ #include "base/synchronization/lock.h" -#include "base/logging.h" +#include "base/check_op.h" #ifndef NDEBUG diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_posix.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_posix.cc similarity index 97% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_posix.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_posix.cc index 073dde1be..a8486f2c9 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_posix.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_posix.cc @@ -6,7 +6,7 @@ #include -#include "base/logging.h" +#include "base/check_op.h" namespace base { namespace internal { diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_win.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_win.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_win.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/synchronization/lock_impl_win.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h new file mode 100644 index 000000000..7fce811e4 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/template_util.h @@ -0,0 +1,53 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ +#define MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ + +#include + +namespace base { + +namespace internal { + +// Helper to express preferences in an overload set. If more than one overload +// are available for a given set of parameters the overload with the higher +// priority will be chosen. +template +struct priority_tag : priority_tag {}; + +template <> +struct priority_tag<0> {}; + +} // namespace internal + +// Implementation of C++20's std::remove_cvref. +// +// References: +// - https://en.cppreference.com/w/cpp/types/remove_cvref +// - https://wg21.link/meta.trans.other#lib:remove_cvref +template +struct remove_cvref { + using type = std::remove_cv_t>; +}; + +// Implementation of C++20's std::remove_cvref_t. +// +// References: +// - https://en.cppreference.com/w/cpp/types/remove_cvref +// - https://wg21.link/meta.type.synop#lib:remove_cvref_t +template +using remove_cvref_t = typename remove_cvref::type; + +// Simplified implementation of C++20's std::iter_reference_t. +// As opposed to std::iter_reference_t, this implementation does not restrict +// the type of `Iter`. +// +// Reference: https://wg21.link/iterator.synopsis#:~:text=iter_reference_t +template +using iter_reference_t = decltype(*std::declval()); + +} // namespace base + +#endif // MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/LICENSE b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/LICENSE similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/LICENSE rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/LICENSE diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/README.chromium b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/README.chromium similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/README.chromium rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/README.chromium diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.cc diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.h similarity index 89% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.h index 79242c6f9..45ce85d12 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/third_party/icu/icu_utf.h @@ -72,6 +72,25 @@ typedef int32_t UChar32; ((c)>=0xfdd0 && \ ((c)<=0xfdef || ((c)&0xfffe)==0xfffe) && (c)<=0x10ffff) +/** + * \def UPRV_BLOCK_MACRO_BEGIN + * Defined as the "do" keyword by default. + * @internal + */ +#ifndef CBUPRV_BLOCK_MACRO_BEGIN +#define CBUPRV_BLOCK_MACRO_BEGIN do +#endif + +/** + * \def UPRV_BLOCK_MACRO_END + * Defined as "while (FALSE)" by default. + * @internal + */ +#ifndef CBUPRV_BLOCK_MACRO_END +#define CBUPRV_BLOCK_MACRO_END while (0) +#endif + + /** * Is c a Unicode code point value (0..U+10ffff) * that can be assigned a character? @@ -230,29 +249,36 @@ utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, ::base_icu: * @see U8_NEXT_UNSAFE * @stable ICU 2.4 */ -#define CBU8_NEXT(s, i, length, c) { \ +#define CBU8_NEXT(s, i, length, c) CBU8_INTERNAL_NEXT_OR_SUB(s, i, length, c, CBU_SENTINEL) + +/** @internal */ +#define CBU8_INTERNAL_NEXT_OR_SUB(s, i, length, c, sub) CBUPRV_BLOCK_MACRO_BEGIN { \ (c)=(uint8_t)(s)[(i)++]; \ if(!CBU8_IS_SINGLE(c)) { \ - uint8_t __t1, __t2; \ - if( /* handle U+0800..U+FFFF inline */ \ - (0xe0<=(c) && (c)<0xf0) && \ - (((i)+1)<(length) || (length)<0) && \ - CBU8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \ - (__t2=(uint8_t)((s)[(i)+1]-0x80))<=0x3f) { \ - (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<6)|__t2; \ - (i)+=2; \ - } else if( /* handle U+0080..U+07FF inline */ \ - ((c)<0xe0 && (c)>=0xc2) && \ - ((i)!=(length)) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f) { \ - (c)=(((c)&0x1f)<<6)|__t1; \ - ++(i); \ + uint8_t __t = 0; \ + if((i)!=(length) && \ + /* fetch/validate/assemble all but last trail byte */ \ + ((c)>=0xe0 ? \ + ((c)<0xf0 ? /* U+0800..U+FFFF except surrogates */ \ + CBU8_LEAD3_T1_BITS[(c)&=0xf]&(1<<((__t=(s)[i])>>5)) && \ + (__t&=0x3f, 1) \ + : /* U+10000..U+10FFFF */ \ + ((c)-=0xf0)<=4 && \ + CBU8_LEAD4_T1_BITS[(__t=(s)[i])>>4]&(1<<(c)) && \ + ((c)=((c)<<6)|(__t&0x3f), ++(i)!=(length)) && \ + (__t=(s)[i]-0x80)<=0x3f) && \ + /* valid second-to-last trail byte */ \ + ((c)=((c)<<6)|__t, ++(i)!=(length)) \ + : /* U+0080..U+07FF */ \ + (c)>=0xc2 && ((c)&=0x1f, 1)) && \ + /* last trail byte */ \ + (__t=(s)[i]-0x80)<=0x3f && \ + ((c)=((c)<<6)|__t, ++(i), 1)) { \ } else { \ - /* function call for "complicated" and error cases */ \ - (c)=::base_icu::utf8_nextCharSafeBody((const uint8_t *)s, &(i), (length), c, -1); \ + (c)=(sub); /* ill-formed*/ \ } \ } \ -} +} CBUPRV_BLOCK_MACRO_END /** * Append a code point to a string, overwriting 1 to 4 bytes. diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.cc similarity index 99% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.cc index e52787b76..047f2fc88 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.cc @@ -6,8 +6,9 @@ #include +#include "base/check_op.h" +#include "base/notreached.h" #include "base/atomicops.h" -#include "base/logging.h" using base::internal::PlatformThreadLocalStorage; diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage.h diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_posix.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_posix.cc similarity index 96% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_posix.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_posix.cc index 6e1e44365..caf1531d4 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_posix.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_posix.cc @@ -4,7 +4,7 @@ #include "base/threading/thread_local_storage.h" -#include "base/logging.h" +#include "base/check_op.h" namespace base { namespace internal { diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_win.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_win.cc similarity index 99% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_win.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_win.cc index a7ef3e704..f1d16eb02 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_win.cc +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/threading/thread_local_storage_win.cc @@ -4,7 +4,7 @@ #include "base/threading/thread_local_storage.h" -#include "base/logging.h" +#include "base/check.h" namespace base { namespace internal { diff --git a/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/types/cxx23_to_underlying.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/types/cxx23_to_underlying.h new file mode 100644 index 000000000..12f106366 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/base/types/cxx23_to_underlying.h @@ -0,0 +1,25 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MINI_CHROMIUM_BASE_TYPES_CXX23_TO_UNDERLYING_H_ +#define MINI_CHROMIUM_BASE_TYPES_CXX23_TO_UNDERLYING_H_ + +#include + +namespace base { + +// Implementation of C++23's std::to_underlying. +// +// Note: This has an additional `std::is_enum` requirement to be SFINAE +// friendly prior to C++20. +// +// Reference: https://en.cppreference.com/w/cpp/utility/to_underlying +template {}>> +constexpr std::underlying_type_t to_underlying(EnumT e) noexcept { + return static_cast>(e); +} + +} // namespace base + +#endif // MINI_CHROMIUM_BASE_TYPES_CXX23_TO_UNDERLYING_H_ diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/codereview.settings b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/codereview.settings similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/codereview.settings rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/codereview.settings diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/testing/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/testing/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/testing/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/testing/BUILD.gn diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/testing/platform_test.h b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/testing/platform_test.h similarity index 63% rename from shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/testing/platform_test.h rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/testing/platform_test.h index c7c9c14ae..213fdeff1 100644 --- a/shared/sentry/external/crashpad/third_party/mini_chromium/mini_chromium/testing/platform_test.h +++ b/shared/sentry/src/external/crashpad/third_party/mini_chromium/mini_chromium/testing/platform_test.h @@ -9,7 +9,15 @@ #include "gtest/gtest.h" #if BUILDFLAG(IS_APPLE) -#import + +// Note that this uses the direct runtime interface to the autorelease pool. +// https://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime-support +// This is so this can work when compiled for ARC. + +extern "C" { +void* objc_autoreleasePoolPush(void); +void objc_autoreleasePoolPop(void* pool); +} // The implementation is in this header because mini_chromium does not directly // depend on googletest. Consumers are free to use this interface if they do @@ -19,18 +27,13 @@ class PlatformTest : public testing::Test { PlatformTest(const PlatformTest&) = delete; PlatformTest& operator=(const PlatformTest&) = delete; - ~PlatformTest() override { [pool_ release]; } + ~PlatformTest() override { objc_autoreleasePoolPop(autorelease_pool_); } protected: - PlatformTest() : pool_([[NSAutoreleasePool alloc] init]) {} + PlatformTest() : autorelease_pool_(objc_autoreleasePoolPush()) {} private: -#if !defined(__has_feature) || !__has_feature(objc_arc) - using PoolType = NSAutoreleasePool*; -#else - using PoolType = id; -#endif - PoolType pool_; + void* autorelease_pool_; }; #else using PlatformTest = testing::Test; diff --git a/shared/sentry/external/crashpad/third_party/mini_chromium/utf_string_conversion_utils.mingw.cc b/shared/sentry/src/external/crashpad/third_party/mini_chromium/utf_string_conversion_utils.mingw.cc similarity index 100% rename from shared/sentry/external/crashpad/third_party/mini_chromium/utf_string_conversion_utils.mingw.cc rename to shared/sentry/src/external/crashpad/third_party/mini_chromium/utf_string_conversion_utils.mingw.cc diff --git a/shared/sentry/src/external/crashpad/third_party/ninja/README.crashpad b/shared/sentry/src/external/crashpad/third_party/ninja/README.crashpad new file mode 100644 index 000000000..8a5f1eeba --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/ninja/README.crashpad @@ -0,0 +1,18 @@ +Name: ninja +Short Name: ninja +URL: https://github.com/ninja-build/ninja +Revision: See the CIPD version in DEPS +License: Apache License 2.0 +License File: https://github.com/ninja-build/ninja/blob/master/COPYING +Security Critical: no +Shipped: no + +Description: +Ninja is a small build system with a focus on speed, and is used to build +this project. + +The CIPD packages are built using the 3pp pipeline. +https://chromium.googlesource.com/infra/infra/+/refs/heads/main/3pp/ninja/ + +Local Modifications: +None diff --git a/shared/sentry/src/external/crashpad/third_party/ninja/ninja b/shared/sentry/src/external/crashpad/third_party/ninja/ninja new file mode 100755 index 000000000..402ab2a19 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/ninja/ninja @@ -0,0 +1,43 @@ +#!/bin/sh + +# Copyright 2022 Google Inc. All rights reserved +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +set -eu + +OS="$(uname -s)" +THIS_DIR="$(dirname "${0}")" + +print_help() { +cat <&2 +No ninja binary is available for this system. +Try building your own binary by doing: + cd ~ + git clone https://github.com/ninja-build/ninja.git + cd ninja && ./configure.py --bootstrap +Then add ~/ninja/ to your PATH. +EOF +} + +case "${OS}" in + Linux) + exec "${THIS_DIR}/linux/ninja" "$@";; + Darwin) + ARCH="$(uname -m)" + case "${ARCH}" in + x86_64) + exec "${THIS_DIR}/mac-amd64/ninja" "$@";; + arm64) + exec "${THIS_DIR}/mac-arm64/ninja" "$@";; + *) + echo "Unsupported architecture ${ARCH}" >&2 + print_help + exit 1;; + esac + ;; + *) + echo "Unsupported OS ${OS}" >&2 + print_help + exit 1;; +esac diff --git a/shared/sentry/external/crashpad/third_party/xnu/APPLE_LICENSE b/shared/sentry/src/external/crashpad/third_party/xnu/APPLE_LICENSE similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/APPLE_LICENSE rename to shared/sentry/src/external/crashpad/third_party/xnu/APPLE_LICENSE diff --git a/shared/sentry/external/crashpad/third_party/xnu/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/xnu/BUILD.gn similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/xnu/BUILD.gn diff --git a/shared/sentry/external/crashpad/third_party/xnu/EXTERNAL_HEADERS/mach-o/loader.h b/shared/sentry/src/external/crashpad/third_party/xnu/EXTERNAL_HEADERS/mach-o/loader.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/EXTERNAL_HEADERS/mach-o/loader.h rename to shared/sentry/src/external/crashpad/third_party/xnu/EXTERNAL_HEADERS/mach-o/loader.h diff --git a/shared/sentry/external/crashpad/third_party/xnu/README.crashpad b/shared/sentry/src/external/crashpad/third_party/xnu/README.crashpad similarity index 98% rename from shared/sentry/external/crashpad/third_party/xnu/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/xnu/README.crashpad index f8471d384..dbcf74087 100644 --- a/shared/sentry/external/crashpad/third_party/xnu/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/xnu/README.crashpad @@ -6,6 +6,7 @@ Version: 6153.11.26 (from macOS 10.15.0) License: APSL 2.0 License File: APPLE_LICENSE Security Critical: no +Shipped: yes Description: XNU is the operating system kernel used on macOS and other Apple systems. diff --git a/shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/exc.defs b/shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/exc.defs similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/exc.defs rename to shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/exc.defs diff --git a/shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/mach_exc.defs b/shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/mach_exc.defs similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/mach_exc.defs rename to shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/mach_exc.defs diff --git a/shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/mach_types.defs b/shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/mach_types.defs similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/mach_types.defs rename to shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/mach_types.defs diff --git a/shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/machine/machine_types.defs b/shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/machine/machine_types.defs similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/machine/machine_types.defs rename to shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/machine/machine_types.defs diff --git a/shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/std_types.defs b/shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/std_types.defs similarity index 100% rename from shared/sentry/external/crashpad/third_party/xnu/osfmk/mach/std_types.defs rename to shared/sentry/src/external/crashpad/third_party/xnu/osfmk/mach/std_types.defs diff --git a/shared/sentry/external/crashpad/third_party/zlib/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/zlib/BUILD.gn similarity index 94% rename from shared/sentry/external/crashpad/third_party/zlib/BUILD.gn rename to shared/sentry/src/external/crashpad/third_party/zlib/BUILD.gn index 986a057b9..92069a575 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/BUILD.gn +++ b/shared/sentry/src/external/crashpad/third_party/zlib/BUILD.gn @@ -38,6 +38,10 @@ config("zlib_config") { } } +config("Wno-sign-compare") { + cflags = [ "-Wno-sign-compare" ] +} + if (zlib_source == "external") { group("zlib") { public_configs = [ ":zlib_config" ] @@ -112,6 +116,11 @@ if (zlib_source == "external") { ] } + if (crashpad_is_fuchsia) { + # Fuchsia build's default warnings include -Wsign-compare (indirectly) + configs += [ ":Wno-sign-compare" ] + } + if (crashpad_is_standalone) { configs -= [ "//third_party/mini_chromium/mini_chromium/build/config:Wimplicit_fallthrough" ] } else if (crashpad_is_external) { @@ -119,14 +128,11 @@ if (zlib_source == "external") { } if (zlib_source == "embedded") { - sources += [ "$zlib_dir/names.h" ] + sources += [ "$zlib_dir/chromeconf.h" ] if (current_cpu == "x86" || current_cpu == "x64") { sources += [ "$zlib_dir/crc_folding.c", - "$zlib_dir/fill_window_sse.c", - "$zlib_dir/x86.c", - "$zlib_dir/x86.h", ] if (!crashpad_is_win || crashpad_is_clang) { cflags += [ @@ -137,8 +143,6 @@ if (zlib_source == "external") { if (crashpad_is_clang) { cflags += [ "-Wno-incompatible-pointer-types" ] } - } else { - sources += [ "$zlib_dir/simd_stub.c" ] } } } diff --git a/shared/sentry/external/crashpad/third_party/zlib/CMakeLists.txt b/shared/sentry/src/external/crashpad/third_party/zlib/CMakeLists.txt similarity index 84% rename from shared/sentry/external/crashpad/third_party/zlib/CMakeLists.txt rename to shared/sentry/src/external/crashpad/third_party/zlib/CMakeLists.txt index eeb449ff3..6d8a6eda1 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/third_party/zlib/CMakeLists.txt @@ -1,15 +1,11 @@ if(CRASHPAD_ZLIB_SYSTEM) add_library(crashpad_zlib INTERFACE) - string(REPLACE ";" "$" GENEX_ZLIB_LIBRARIES "${ZLIB_LIBRARIES}") - target_include_directories(crashpad_zlib INTERFACE - $ - ) target_compile_definitions(crashpad_zlib INTERFACE ZLIB_CONST CRASHPAD_ZLIB_SOURCE_SYSTEM $ ) - target_link_libraries(crashpad_zlib INTERFACE $) + target_link_libraries(crashpad_zlib INTERFACE ZLIB::ZLIB) else() add_library(crashpad_zlib STATIC zlib/adler32.c @@ -31,11 +27,9 @@ else() zlib/inflate.h zlib/inftrees.c zlib/inftrees.h - zlib/names.h zlib/trees.c zlib/trees.h zlib/uncompr.c - zlib/x86.h zlib/zconf.h zlib/zlib.h zlib/zutil.c @@ -51,15 +45,11 @@ else() if(archs MATCHES "(x86_64)|(x86)|(i[3-7]86)|(AMD64)") target_sources(crashpad_zlib PRIVATE zlib/crc_folding.c - zlib/fill_window_sse.c - zlib/x86.c ) if(NOT MSVC) target_compile_options(crashpad_zlib PRIVATE -msse4.2 -mpclmul) endif() - else() - target_sources(crashpad_zlib PRIVATE zlib/simd_stub.c) endif() target_compile_definitions(crashpad_zlib PUBLIC CRASHPAD_ZLIB_SOURCE_EMBEDDED diff --git a/shared/sentry/external/crashpad/third_party/zlib/README.crashpad b/shared/sentry/src/external/crashpad/third_party/zlib/README.crashpad similarity index 97% rename from shared/sentry/external/crashpad/third_party/zlib/README.crashpad rename to shared/sentry/src/external/crashpad/third_party/zlib/README.crashpad index 8a9533d35..bf3af780a 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/README.crashpad +++ b/shared/sentry/src/external/crashpad/third_party/zlib/README.crashpad @@ -5,6 +5,7 @@ Revision: See zlib/README.chromium License: zlib License File: zlib/LICENSE Security Critical: yes +Shipped: yes Description: “A massively spiffy yet delicately unobtrusive compression library.” diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/BUILD.gn new file mode 100644 index 000000000..8ed0807a9 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/BUILD.gn @@ -0,0 +1,532 @@ +# Copyright 2013 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/compiler/compiler.gni") + +declare_args() { + # Expose zlib's symbols, used by Node.js to provide zlib APIs for its native + # modules. + zlib_symbols_visible = false +} + +if (build_with_chromium) { + import("//testing/test.gni") +} + +if (current_cpu == "arm" || current_cpu == "arm64") { + import("//build/config/arm.gni") +} + +config("zlib_config") { + include_dirs = [ "." ] + + if (zlib_symbols_visible) { + defines = [ "ZLIB_DLL" ] + } +} + +config("zlib_internal_config") { + defines = [ "ZLIB_IMPLEMENTATION" ] + + if (!is_debug) { + # Build code using -O3, see: crbug.com/1084371. + configs = [ "//build/config/compiler:optimize_speed" ] + } + if (is_debug || use_fuzzing_engine) { + # Enable zlib's asserts in debug and fuzzer builds. + defines += [ "ZLIB_DEBUG" ] + } + + if (is_win && !is_clang) { + # V8 supports building with msvc, these silence some warnings that + # causes compilation to fail (https://crbug.com/1255096). + cflags = [ + "/wd4244", + "/wd4100", + "/wd4702", + "/wd4127", + ] + } +} + +source_set("zlib_common_headers") { + visibility = [ ":*" ] + + sources = [ + "chromeconf.h", + "deflate.h", + "inffast.h", + "inffixed.h", + "inflate.h", + "inftrees.h", + "zconf.h", + "zlib.h", + "zutil.h", + ] +} + +use_arm_neon_optimizations = false +if ((current_cpu == "arm" || current_cpu == "arm64") && + !(is_win && !is_clang)) { + # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for + # Windows on Arm MSVC builds, see http://crbug.com/v8/10012. + if (arm_use_neon) { + use_arm_neon_optimizations = true + } +} + +use_x86_x64_optimizations = + (current_cpu == "x86" || current_cpu == "x64") && !is_ios + +config("zlib_adler32_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "ADLER32_SIMD_SSSE3" ] + if (is_win) { + defines += [ "X86_WINDOWS" ] + } else { + defines += [ "X86_NOT_WINDOWS" ] + } + } + + if (use_arm_neon_optimizations) { + defines = [ "ADLER32_SIMD_NEON" ] + } +} + +source_set("zlib_adler32_simd") { + visibility = [ ":*" ] + + if (use_x86_x64_optimizations) { + sources = [ + "adler32_simd.c", + "adler32_simd.h", + ] + + if (!is_win || is_clang) { + cflags = [ "-mssse3" ] + } + } + + if (use_arm_neon_optimizations) { + sources = [ + "adler32_simd.c", + "adler32_simd.h", + ] + } + + configs += [ ":zlib_internal_config" ] + + public_configs = [ ":zlib_adler32_simd_config" ] + + public_deps = [ ":zlib_common_headers" ] +} + +if (use_arm_neon_optimizations) { + config("zlib_arm_crc32_config") { + defines = [ "CRC32_ARMV8_CRC32" ] + if (is_android) { + defines += [ "ARMV8_OS_ANDROID" ] + } else if (is_linux || is_chromeos) { + defines += [ "ARMV8_OS_LINUX" ] + } else if (is_mac) { + defines += [ "ARMV8_OS_MACOS" ] + } else if (is_ios) { + defines += [ "ARMV8_OS_IOS" ] + } else if (is_fuchsia) { + defines += [ "ARMV8_OS_FUCHSIA" ] + } else if (is_win) { + defines += [ "ARMV8_OS_WINDOWS" ] + } else { + assert(false, "Unsupported ARM OS") + } + } + + source_set("zlib_arm_crc32") { + visibility = [ ":*" ] + + include_dirs = [ "." ] + + if (!is_win && !is_clang) { + assert(!use_thin_lto, + "ThinLTO fails mixing different module-level targets") + cflags_c = [ "-march=armv8-a+aes+crc" ] + } + + sources = [ + "crc32_simd.c", + "crc32_simd.h", + ] + + configs += [ ":zlib_internal_config" ] + + public_configs = [ ":zlib_arm_crc32_config" ] + + public_deps = [ ":zlib_common_headers" ] + } +} + +config("zlib_inflate_chunk_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "INFLATE_CHUNK_SIMD_SSE2" ] + + if (current_cpu == "x64") { + defines += [ "INFLATE_CHUNK_READ_64LE" ] + } + } + + if (use_arm_neon_optimizations) { + defines = [ "INFLATE_CHUNK_SIMD_NEON" ] + + if (current_cpu == "arm64") { + defines += [ "INFLATE_CHUNK_READ_64LE" ] + } + } +} + +source_set("zlib_inflate_chunk_simd") { + visibility = [ ":*" ] + + if (use_x86_x64_optimizations || use_arm_neon_optimizations) { + include_dirs = [ "." ] + + sources = [ + "contrib/optimizations/chunkcopy.h", + "contrib/optimizations/inffast_chunk.c", + "contrib/optimizations/inffast_chunk.h", + "contrib/optimizations/inflate.c", + ] + } + + configs += [ ":zlib_internal_config" ] + + # Needed for MSVC, which is still supported by V8 and PDFium. zlib uses K&R C + # style function declarations, which triggers warning C4131. + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":zlib_warnings" ] + + public_configs = [ ":zlib_inflate_chunk_simd_config" ] + + public_deps = [ ":zlib_common_headers" ] +} + +config("zlib_crc32_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "CRC32_SIMD_SSE42_PCLMUL" ] + } +} + +source_set("zlib_crc32_simd") { + visibility = [ ":*" ] + + if (use_x86_x64_optimizations) { + sources = [ + "crc32_simd.c", + "crc32_simd.h", + "crc_folding.c", + ] + + if (!is_win || is_clang) { + cflags = [ + "-msse4.2", + "-mpclmul", + ] + } + } + + configs += [ ":zlib_internal_config" ] + + public_configs = [ ":zlib_crc32_simd_config" ] + + public_deps = [ ":zlib_common_headers" ] +} + +config("zlib_slide_hash_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "DEFLATE_SLIDE_HASH_SSE2" ] + } + + if (use_arm_neon_optimizations) { + defines = [ "DEFLATE_SLIDE_HASH_NEON" ] + } +} + +source_set("zlib_slide_hash_simd") { + visibility = [ ":*" ] + + if (use_x86_x64_optimizations) { + sources = [ "slide_hash_simd.h" ] + } + + if (use_arm_neon_optimizations) { + sources = [ "slide_hash_simd.h" ] + } + + configs += [ ":zlib_internal_config" ] + + public_configs = [ ":zlib_slide_hash_simd_config" ] + + public_deps = [ ":zlib_common_headers" ] +} + +config("zlib_warnings") { + if (is_clang) { + cflags = [ + "-Wno-deprecated-non-prototype", + "-Wno-incompatible-pointer-types", + "-Wunused-variable", + ] + } +} + +component("zlib") { + if (!is_win) { + # Don't stomp on "libzlib" on other platforms. + output_name = "chrome_zlib" + } + + sources = [ + "adler32.c", + "chromeconf.h", + "compress.c", + "contrib/optimizations/insert_string.h", + "cpu_features.c", + "cpu_features.h", + "crc32.c", + "crc32.h", + "deflate.c", + "deflate.h", + "gzclose.c", + "gzguts.h", + "gzlib.c", + "gzread.c", + "gzwrite.c", + "infback.c", + "inffast.c", + "inffast.h", + "inffixed.h", + "inflate.h", + "inftrees.c", + "inftrees.h", + "trees.c", + "trees.h", + "uncompr.c", + "zconf.h", + "zlib.h", + "zutil.c", + "zutil.h", + ] + + defines = [] + deps = [] + + if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { + # Apparently android_cronet bot builds with NEON disabled and + # we also should disable optimizations for iOS@x86 (a.k.a. simulator). + defines += [ "CPU_NO_SIMD" ] + } + + if (use_x86_x64_optimizations || use_arm_neon_optimizations) { + deps += [ + ":zlib_adler32_simd", + ":zlib_inflate_chunk_simd", + ":zlib_slide_hash_simd", + ] + + if (use_x86_x64_optimizations) { + deps += [ ":zlib_crc32_simd" ] + } else if (use_arm_neon_optimizations) { + deps += [ ":zlib_arm_crc32" ] + } + } else { + sources += [ "inflate.c" ] + } + + if (is_android) { + import("//build/config/android/config.gni") + if (defined(android_ndk_root) && android_ndk_root != "") { + deps += [ "//third_party/cpu_features:ndk_compat" ] + } else { + assert(false, "CPU detection requires the Android NDK") + } + } + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + + if (zlib_symbols_visible) { + configs -= [ "//build/config/gcc:symbol_visibility_hidden" ] + configs += [ "//build/config/gcc:symbol_visibility_default" ] + } + + public_configs = [ ":zlib_config" ] + + configs += [ + ":zlib_internal_config", + + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":zlib_warnings", + ] + + allow_circular_includes_from = deps +} + +config("minizip_warnings") { + visibility = [ ":*" ] + + if (is_clang) { + cflags = [ + # zlib uses `if ((a == b))` for some reason. + "-Wno-parentheses-equality", + "-Wno-deprecated-non-prototype", + ] + } +} + +static_library("minizip") { + include_dirs = [ + ".", + "//third_party/zlib", + ] + + sources = [ + "contrib/minizip/ioapi.c", + "contrib/minizip/ioapi.h", + "contrib/minizip/iowin32.c", + "contrib/minizip/iowin32.h", + "contrib/minizip/unzip.c", + "contrib/minizip/unzip.h", + "contrib/minizip/zip.c", + "contrib/minizip/zip.h", + ] + + if (!is_win) { + sources -= [ + "contrib/minizip/iowin32.c", + "contrib/minizip/iowin32.h", + ] + } + + if (is_apple || is_android || is_nacl) { + # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We + # use fopen, ftell, and fseek instead on these systems. + defines = [ "USE_FILE32API" ] + } + + deps = [ ":zlib" ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + + public_configs = [ ":zlib_config" ] + + configs += [ + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":minizip_warnings", + ] +} + +executable("zlib_bench") { + include_dirs = [ "." ] + + sources = [ "contrib/bench/zlib_bench.cc" ] + if (!is_debug) { + configs -= [ "//build/config/compiler:default_optimization" ] + configs += [ "//build/config/compiler:optimize_speed" ] + } + + deps = [ ":zlib" ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] +} + +if (!is_win || target_os != "winuwp") { + executable("minizip_bin") { + include_dirs = [ "." ] + + sources = [ "contrib/minizip/minizip.c" ] + + if (is_clang) { + cflags = [ + "-Wno-incompatible-pointer-types-discards-qualifiers", + + "-Wno-deprecated-non-prototype", + ] + } + + if (!is_debug) { + configs -= [ "//build/config/compiler:default_optimization" ] + configs += [ "//build/config/compiler:optimize_speed" ] + } + + deps = [ ":minizip" ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + } + + executable("miniunz_bin") { + include_dirs = [ "." ] + + sources = [ "contrib/minizip/miniunz.c" ] + + if (is_clang) { + cflags = [ + "-Wno-incompatible-pointer-types-discards-qualifiers", + "-Wno-deprecated-non-prototype", + ] + } + + if (!is_debug) { + configs -= [ "//build/config/compiler:default_optimization" ] + configs += [ "//build/config/compiler:optimize_speed" ] + } + + deps = [ ":minizip" ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + } +} + +if (build_with_chromium) { + test("zlib_unittests") { + testonly = true + + sources = [ + "contrib/tests/infcover.cc", + "contrib/tests/infcover.h", + "contrib/tests/run_all_unittests.cc", + "contrib/tests/utils_unittest.cc", + "google/compression_utils_unittest.cc", + "google/zip_reader_unittest.cc", + "google/zip_unittest.cc", + ] + + data = [ "google/test/data/" ] + + if (is_ios) { + bundle_deps = [ "google:zlib_pak_bundle_data" ] + } + + deps = [ + ":minizip", + ":zlib", + "google:compression_utils", + "google:zip", + "//base/test:test_support", + "//testing/gtest", + ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + + include_dirs = [ + "//third_party/googletest/src/googletest/include/gtest", + ".", + "google", + ] + } +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/CMakeLists.txt b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/CMakeLists.txt new file mode 100644 index 000000000..234eab8db --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/CMakeLists.txt @@ -0,0 +1,307 @@ +cmake_minimum_required(VERSION 3.0) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) + +project(zlib C) + +set(VERSION "1.2.13.1") + +set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") +set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") +set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") +set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages") +set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files") + +include(CheckTypeSize) +include(CheckFunctionExists) +include(CheckIncludeFile) +include(CheckCSourceCompiles) +enable_testing() + +check_include_file(sys/types.h HAVE_SYS_TYPES_H) +check_include_file(stdint.h HAVE_STDINT_H) +check_include_file(stddef.h HAVE_STDDEF_H) + +option(ENABLE_SIMD_OPTIMIZATIONS "Enable all SIMD optimizations" OFF) +option(ENABLE_SIMD_AVX512 "Enable SIMD AXV512 optimizations" OFF) +option(USE_ZLIB_RABIN_KARP_HASH "Enable bitstream compatibility with canonical zlib" OFF) +option(BUILD_UNITTESTS "Enable standalone unit tests build" OFF) + +if (USE_ZLIB_RABIN_KARP_HASH) + add_definitions(-DUSE_ZLIB_RABIN_KARP_ROLLING_HASH) +endif() + +# TODO(cavalcantii): add support for other OSes (e.g. Android, fuchsia, osx) +# and architectures (e.g. Arm). +if (ENABLE_SIMD_OPTIMIZATIONS) + add_definitions(-DINFLATE_CHUNK_SIMD_SSE2) + add_definitions(-DADLER32_SIMD_SSSE3) + add_definitions(-DINFLATE_CHUNK_READ_64LE) + add_definitions(-DCRC32_SIMD_SSE42_PCLMUL) + if (ENABLE_SIMD_AVX512) + add_definitions(-DCRC32_SIMD_AVX512_PCLMUL) + add_compile_options(-mvpclmulqdq -msse2 -mavx512f -mpclmul) + else() + add_compile_options(-msse4.2 -mpclmul) + endif() + add_definitions(-DDEFLATE_SLIDE_HASH_SSE2) + # Required by CPU features detection code. + add_definitions(-DX86_NOT_WINDOWS) + # Apparently some environments (e.g. CentOS) require to explicitly link + # with pthread and that is required by the CPU features detection code. + find_package (Threads REQUIRED) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") +endif() + +# +# Check to see if we have large file support +# +set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1) +# We add these other definitions here because CheckTypeSize.cmake +# in CMake 2.4.x does not automatically do so and we want +# compatibility with CMake 2.4.x. +if(HAVE_SYS_TYPES_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H) +endif() +if(HAVE_STDINT_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H) +endif() +if(HAVE_STDDEF_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H) +endif() +check_type_size(off64_t OFF64_T) +if(HAVE_OFF64_T) + add_definitions(-D_LARGEFILE64_SOURCE=1) +endif() +set(CMAKE_REQUIRED_DEFINITIONS) # clear variable + +# +# Check for fseeko +# +check_function_exists(fseeko HAVE_FSEEKO) +if(NOT HAVE_FSEEKO) + add_definitions(-DNO_FSEEKO) +endif() + +# +# Check for unistd.h +# +check_include_file(unistd.h Z_HAVE_UNISTD_H) + +if(MSVC) + set(CMAKE_DEBUG_POSTFIX "d") + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) + add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +endif() + +if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) + # If we're doing an out of source build and the user has a zconf.h + # in their source tree... + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h) + message(STATUS "Renaming") + message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h") + message(STATUS "to 'zconf.h.included' because this file is included with zlib") + message(STATUS "but CMake generates it automatically in the build directory.") + file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included) + endif() +endif() + +set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein + ${ZLIB_PC} @ONLY) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein + ${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY) +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}) + + +#============================================================================ +# zlib +#============================================================================ + +set(ZLIB_PUBLIC_HDRS + ${CMAKE_CURRENT_BINARY_DIR}/zconf.h + zlib.h +) +set(ZLIB_PRIVATE_HDRS + crc32.h + deflate.h + gzguts.h + inffast.h + inffixed.h + inflate.h + inftrees.h + trees.h + zutil.h +) +set(ZLIB_SRCS + adler32.c + compress.c + crc32.c + deflate.c + gzclose.c + gzlib.c + gzread.c + gzwrite.c + inflate.c + infback.c + inftrees.c + inffast.c + trees.c + uncompr.c + zutil.c +) + + +#============================================================================ +# Update list of source files if optimizations were enabled +#============================================================================ +if (ENABLE_SIMD_OPTIMIZATIONS) + list(REMOVE_ITEM ZLIB_SRCS inflate.c) + + list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.h) + list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/chunkcopy.h) + list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inffast_chunk.h) + list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.h) + list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/crc32_simd.h) + + list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.c) + list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inffast_chunk.c) + list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inflate.c) + list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.c) + list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crc32_simd.c) + list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crc_folding.c) +endif() + +# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents) +string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*" + "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents}) + +if(MINGW) + # This gets us DLL resource information when compiling on MinGW. + if(NOT CMAKE_RC_COMPILER) + set(CMAKE_RC_COMPILER windres.exe) + endif() + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj + COMMAND ${CMAKE_RC_COMPILER} + -D GCC_WINDRES + -I ${CMAKE_CURRENT_SOURCE_DIR} + -I ${CMAKE_CURRENT_BINARY_DIR} + -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj + -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc) + set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) +endif(MINGW) + +add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) +set_target_properties(zlib PROPERTIES SOVERSION 1) + +if(NOT CYGWIN) + # This property causes shared libraries on Linux to have the full version + # encoded into their final filename. We disable this on Cygwin because + # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll + # seems to be the default. + # + # This has no effect with MSVC, on that platform the version info for + # the DLL comes from the resource file win32/zlib1.rc + set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION}) +endif() + +if(UNIX) + # On unix-like platforms the library is almost always called libz + set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z) + if(NOT APPLE) + set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"") + endif() +elseif(BUILD_SHARED_LIBS AND WIN32) + # Creates zlib1.dll when building shared library version + set_target_properties(zlib PROPERTIES SUFFIX "1.dll") +endif() + +if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) + install(TARGETS zlib zlibstatic + RUNTIME DESTINATION "${INSTALL_BIN_DIR}" + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) +endif() +if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL ) + install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}") +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3") +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}") +endif() + +#============================================================================ +# Benchmarker +#============================================================================ +enable_language(CXX) +set(CMAKE_CXX_STANDARD 14) # workaround for older compilers (e.g. g++ 5.4). +add_executable(zlib_bench contrib/bench/zlib_bench.cc) +target_link_libraries(zlib_bench zlib) + +#============================================================================ +# Unit Tests +#============================================================================ +if (BUILD_UNITTESTS) + include (ExternalProject) + set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/third_party) + ExternalProject_add( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG d1467f5813f4d363cfd11aba99c4e9fe47a85e99 + UPDATE_COMMAND "" + INSTALL_COMMAND "" + LOG_DOWNLOAD ON + LOG_CONFIGURE ON + LOG_BUILD ON + ) + + # gtest includedir + ExternalProject_Get_Property(googletest source_dir) + set(GTEST_INCLUDE_DIRS + ${source_dir}/googletest/include + ${source_dir}/googletest/include/gtest + ) + + # gtest library + ExternalProject_Get_Property(googletest binary_dir) + set(GTEST_LIBRARY_PATH ${binary_dir}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gtest.a) + set(GTEST_LIBRARY gtest) + add_library(${GTEST_LIBRARY} UNKNOWN IMPORTED) + set_property(TARGET ${GTEST_LIBRARY} PROPERTY IMPORTED_LOCATION ${GTEST_LIBRARY_PATH}) + add_dependencies(${GTEST_LIBRARY} googletest) + + set(UTEST_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/infcover.cc + ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/infcover.h + ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/utils_unittest.cc + ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/standalone_test_runner.cc + ${CMAKE_CURRENT_SOURCE_DIR}/google/compression_utils_portable.cc + ) + + add_compile_definitions(CMAKE_STANDALONE_UNITTESTS) + + add_executable(zlib_unittests ${UTEST_SRC}) + target_include_directories(zlib_unittests PUBLIC ${GTEST_INCLUDE_DIRS}) + target_include_directories(zlib_unittests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/google) + + target_link_libraries(zlib_unittests ${GTEST_LIBRARY}) + target_link_libraries(zlib_unittests zlib) + # Needed by gtest + target_link_libraries(zlib_unittests pthread) +endif() + +#============================================================================ +# Minigzip tool +#============================================================================ +add_executable(minizip_bin contrib/minizip/minizip.c contrib/minizip/ioapi.c +contrib/minizip/ioapi.h contrib/minizip/unzip.c +contrib/minizip/unzip.h contrib/minizip/zip.c contrib/minizip/zip.h +) +target_link_libraries(minizip_bin zlib) diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/DIR_METADATA b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/DIR_METADATA new file mode 100644 index 000000000..d366dc732 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/DIR_METADATA @@ -0,0 +1,3 @@ +monorail: { + component: "Internals" +} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/LICENSE b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/LICENSE similarity index 90% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/LICENSE rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/LICENSE index 9f056865b..8aca25d8c 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/LICENSE +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/LICENSE @@ -1,6 +1,6 @@ -version 1.2.11, January 15th, 2017 +version 1.2.12, March 27th, 2022 -Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/OWNERS b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/OWNERS new file mode 100644 index 000000000..3a821578a --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/OWNERS @@ -0,0 +1,4 @@ +agl@chromium.org +cavalcantii@chromium.org +cblume@chromium.org +scroggo@google.com diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/README.chromium b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/README.chromium similarity index 67% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/README.chromium rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/README.chromium index fe6bc105d..1dfb99666 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/README.chromium +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/README.chromium @@ -1,9 +1,11 @@ Name: zlib Short Name: zlib URL: http://zlib.net/ -Version: 1.2.11 +Version: 1.2.13 +CPEPrefix: cpe:/a:zlib:zlib:1.2.13 Security Critical: yes -License: Custom license +Shipped: yes +License: Zlib License File: LICENSE License Android Compatible: yes @@ -22,7 +24,10 @@ Local Modifications: imported. - The contents of the google directory are original Chromium-specific additions. - - google.patch contains changes from the upstream version, mostly related to - the build. - - Intel SIMD optimisations from https://github.com/jtkukunas/zlib/ have been - integrated. These changes are reflected in simd.patch. + - Added chromeconf.h + - Plus the changes in 'patches' folder. + - Code in contrib/ other than contrib/minizip was added to match zlib's + contributor layout. + - In sync with 1.2.13 official release + - ZIP reader modified to allow for progress callbacks during extraction. + - ZIP reader modified to add detection of AES encrypted content. diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/adler32.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32.c similarity index 77% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/adler32.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32.c index d0be4380a..99a294496 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/adler32.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32.c @@ -7,8 +7,6 @@ #include "zutil.h" -local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); - #define BASE 65521U /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -59,15 +57,24 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); # define MOD63(a) a %= BASE #endif +#include "cpu_features.h" +#if defined(ADLER32_SIMD_SSSE3) || defined(ADLER32_SIMD_NEON) +#include "adler32_simd.h" +#endif + /* ========================================================================= */ -uLong ZEXPORT adler32_z(adler, buf, len) - uLong adler; - const Bytef *buf; - z_size_t len; -{ +uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) { unsigned long sum2; unsigned n; +#if defined(ADLER32_SIMD_SSSE3) + if (buf != Z_NULL && len >= 64 && x86_cpu_enable_ssse3) + return adler32_simd_(adler, buf, len); +#elif defined(ADLER32_SIMD_NEON) + if (buf != Z_NULL && len >= 64) + return adler32_simd_(adler, buf, len); +#endif + /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; @@ -83,9 +90,24 @@ uLong ZEXPORT adler32_z(adler, buf, len) return adler | (sum2 << 16); } +#if defined(ADLER32_SIMD_SSSE3) || defined(ADLER32_SIMD_NEON) + /* + * Use SIMD to compute the adler32. Since this function can be + * freely used, check CPU features here. zlib convention is to + * call adler32(0, NULL, 0), before making calls to adler32(). + * So this is a good early (and infrequent) place to cache CPU + * features for those later, more interesting adler32() calls. + */ + if (buf == Z_NULL) { + if (!len) /* Assume user is calling adler32(0, NULL, 0); */ + cpu_check_features(); + return 1L; + } +#else /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; +#endif /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { @@ -131,20 +153,12 @@ uLong ZEXPORT adler32_z(adler, buf, len) } /* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ +uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) { return adler32_z(adler, buf, len); } /* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) { unsigned long sum1; unsigned long sum2; unsigned rem; @@ -169,18 +183,10 @@ local uLong adler32_combine_(adler1, adler2, len2) } /* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ +uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) { return adler32_combine_(adler1, adler2, len2); } -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) { return adler32_combine_(adler1, adler2, len2); } diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.c new file mode 100644 index 000000000..58966eecf --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.c @@ -0,0 +1,366 @@ +/* adler32_simd.c + * + * Copyright 2017 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + * + * Per http://en.wikipedia.org/wiki/Adler-32 the adler32 A value (aka s1) is + * the sum of N input data bytes D1 ... DN, + * + * A = A0 + D1 + D2 + ... + DN + * + * where A0 is the initial value. + * + * SSE2 _mm_sad_epu8() can be used for byte sums (see http://bit.ly/2wpUOeD, + * for example) and accumulating the byte sums can use SSE shuffle-adds (see + * the "Integer" section of http://bit.ly/2erPT8t for details). Arm NEON has + * similar instructions. + * + * The adler32 B value (aka s2) sums the A values from each step: + * + * B0 + (A0 + D1) + (A0 + D1 + D2) + ... + (A0 + D1 + D2 + ... + DN) or + * + * B0 + N.A0 + N.D1 + (N-1).D2 + (N-2).D3 + ... + (N-(N-1)).DN + * + * B0 being the initial value. For 32 bytes (ideal for garden-variety SIMD): + * + * B = B0 + 32.A0 + [D1 D2 D3 ... D32] x [32 31 30 ... 1]. + * + * Adjacent blocks of 32 input bytes can be iterated with the expressions to + * compute the adler32 s1 s2 of M >> 32 input bytes [1]. + * + * As M grows, the s1 s2 sums grow. If left unchecked, they would eventually + * overflow the precision of their integer representation (bad). However, s1 + * and s2 also need to be computed modulo the adler BASE value (reduced). If + * at most NMAX bytes are processed before a reduce, s1 s2 _cannot_ overflow + * a uint32_t type (the NMAX constraint) [2]. + * + * [1] the iterative equations for s2 contain constant factors; these can be + * hoisted from the n-blocks do loop of the SIMD code. + * + * [2] zlib adler32_z() uses this fact to implement NMAX-block-based updates + * of the adler s1 s2 of uint32_t type (see adler32.c). + */ + +#include "adler32_simd.h" + +/* Definitions from adler32.c: largest prime smaller than 65536 */ +#define BASE 65521U +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ +#define NMAX 5552 + +#if defined(ADLER32_SIMD_SSSE3) + +#include + +uint32_t ZLIB_INTERNAL adler32_simd_( /* SSSE3 */ + uint32_t adler, + const unsigned char *buf, + z_size_t len) +{ + /* + * Split Adler-32 into component sums. + */ + uint32_t s1 = adler & 0xffff; + uint32_t s2 = adler >> 16; + + /* + * Process the data in blocks. + */ + const unsigned BLOCK_SIZE = 1 << 5; + + z_size_t blocks = len / BLOCK_SIZE; + len -= blocks * BLOCK_SIZE; + + while (blocks) + { + unsigned n = NMAX / BLOCK_SIZE; /* The NMAX constraint. */ + if (n > blocks) + n = (unsigned) blocks; + blocks -= n; + + const __m128i tap1 = + _mm_setr_epi8(32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17); + const __m128i tap2 = + _mm_setr_epi8(16,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1); + const __m128i zero = + _mm_setr_epi8( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + const __m128i ones = + _mm_set_epi16( 1, 1, 1, 1, 1, 1, 1, 1); + + /* + * Process n blocks of data. At most NMAX data bytes can be + * processed before s2 must be reduced modulo BASE. + */ + __m128i v_ps = _mm_set_epi32(0, 0, 0, s1 * n); + __m128i v_s2 = _mm_set_epi32(0, 0, 0, s2); + __m128i v_s1 = _mm_set_epi32(0, 0, 0, 0); + + do { + /* + * Load 32 input bytes. + */ + const __m128i bytes1 = _mm_loadu_si128((__m128i*)(buf)); + const __m128i bytes2 = _mm_loadu_si128((__m128i*)(buf + 16)); + + /* + * Add previous block byte sum to v_ps. + */ + v_ps = _mm_add_epi32(v_ps, v_s1); + + /* + * Horizontally add the bytes for s1, multiply-adds the + * bytes by [ 32, 31, 30, ... ] for s2. + */ + v_s1 = _mm_add_epi32(v_s1, _mm_sad_epu8(bytes1, zero)); + const __m128i mad1 = _mm_maddubs_epi16(bytes1, tap1); + v_s2 = _mm_add_epi32(v_s2, _mm_madd_epi16(mad1, ones)); + + v_s1 = _mm_add_epi32(v_s1, _mm_sad_epu8(bytes2, zero)); + const __m128i mad2 = _mm_maddubs_epi16(bytes2, tap2); + v_s2 = _mm_add_epi32(v_s2, _mm_madd_epi16(mad2, ones)); + + buf += BLOCK_SIZE; + + } while (--n); + + v_s2 = _mm_add_epi32(v_s2, _mm_slli_epi32(v_ps, 5)); + + /* + * Sum epi32 ints v_s1(s2) and accumulate in s1(s2). + */ + +#define S23O1 _MM_SHUFFLE(2,3,0,1) /* A B C D -> B A D C */ +#define S1O32 _MM_SHUFFLE(1,0,3,2) /* A B C D -> C D A B */ + + v_s1 = _mm_add_epi32(v_s1, _mm_shuffle_epi32(v_s1, S23O1)); + v_s1 = _mm_add_epi32(v_s1, _mm_shuffle_epi32(v_s1, S1O32)); + + s1 += _mm_cvtsi128_si32(v_s1); + + v_s2 = _mm_add_epi32(v_s2, _mm_shuffle_epi32(v_s2, S23O1)); + v_s2 = _mm_add_epi32(v_s2, _mm_shuffle_epi32(v_s2, S1O32)); + + s2 = _mm_cvtsi128_si32(v_s2); + +#undef S23O1 +#undef S1O32 + + /* + * Reduce. + */ + s1 %= BASE; + s2 %= BASE; + } + + /* + * Handle leftover data. + */ + if (len) { + if (len >= 16) { + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + len -= 16; + } + + while (len--) { + s2 += (s1 += *buf++); + } + + if (s1 >= BASE) + s1 -= BASE; + s2 %= BASE; + } + + /* + * Return the recombined sums. + */ + return s1 | (s2 << 16); +} + +#elif defined(ADLER32_SIMD_NEON) + +#include + +uint32_t ZLIB_INTERNAL adler32_simd_( /* NEON */ + uint32_t adler, + const unsigned char *buf, + z_size_t len) +{ + /* + * Split Adler-32 into component sums. + */ + uint32_t s1 = adler & 0xffff; + uint32_t s2 = adler >> 16; + + /* + * Serially compute s1 & s2, until the data is 16-byte aligned. + */ + if ((uintptr_t)buf & 15) { + while ((uintptr_t)buf & 15) { + s2 += (s1 += *buf++); + --len; + } + + if (s1 >= BASE) + s1 -= BASE; + s2 %= BASE; + } + + /* + * Process the data in blocks. + */ + const unsigned BLOCK_SIZE = 1 << 5; + + z_size_t blocks = len / BLOCK_SIZE; + len -= blocks * BLOCK_SIZE; + + while (blocks) + { + unsigned n = NMAX / BLOCK_SIZE; /* The NMAX constraint. */ + if (n > blocks) + n = (unsigned) blocks; + blocks -= n; + + /* + * Process n blocks of data. At most NMAX data bytes can be + * processed before s2 must be reduced modulo BASE. + */ + uint32x4_t v_s2 = (uint32x4_t) { 0, 0, 0, s1 * n }; + uint32x4_t v_s1 = (uint32x4_t) { 0, 0, 0, 0 }; + + uint16x8_t v_column_sum_1 = vdupq_n_u16(0); + uint16x8_t v_column_sum_2 = vdupq_n_u16(0); + uint16x8_t v_column_sum_3 = vdupq_n_u16(0); + uint16x8_t v_column_sum_4 = vdupq_n_u16(0); + + do { + /* + * Load 32 input bytes. + */ + const uint8x16_t bytes1 = vld1q_u8((uint8_t*)(buf)); + const uint8x16_t bytes2 = vld1q_u8((uint8_t*)(buf + 16)); + + /* + * Add previous block byte sum to v_s2. + */ + v_s2 = vaddq_u32(v_s2, v_s1); + + /* + * Horizontally add the bytes for s1. + */ + v_s1 = vpadalq_u16(v_s1, vpadalq_u8(vpaddlq_u8(bytes1), bytes2)); + + /* + * Vertically add the bytes for s2. + */ + v_column_sum_1 = vaddw_u8(v_column_sum_1, vget_low_u8 (bytes1)); + v_column_sum_2 = vaddw_u8(v_column_sum_2, vget_high_u8(bytes1)); + v_column_sum_3 = vaddw_u8(v_column_sum_3, vget_low_u8 (bytes2)); + v_column_sum_4 = vaddw_u8(v_column_sum_4, vget_high_u8(bytes2)); + + buf += BLOCK_SIZE; + + } while (--n); + + v_s2 = vshlq_n_u32(v_s2, 5); + + /* + * Multiply-add bytes by [ 32, 31, 30, ... ] for s2. + */ + v_s2 = vmlal_u16(v_s2, vget_low_u16 (v_column_sum_1), + (uint16x4_t) { 32, 31, 30, 29 }); + v_s2 = vmlal_u16(v_s2, vget_high_u16(v_column_sum_1), + (uint16x4_t) { 28, 27, 26, 25 }); + v_s2 = vmlal_u16(v_s2, vget_low_u16 (v_column_sum_2), + (uint16x4_t) { 24, 23, 22, 21 }); + v_s2 = vmlal_u16(v_s2, vget_high_u16(v_column_sum_2), + (uint16x4_t) { 20, 19, 18, 17 }); + v_s2 = vmlal_u16(v_s2, vget_low_u16 (v_column_sum_3), + (uint16x4_t) { 16, 15, 14, 13 }); + v_s2 = vmlal_u16(v_s2, vget_high_u16(v_column_sum_3), + (uint16x4_t) { 12, 11, 10, 9 }); + v_s2 = vmlal_u16(v_s2, vget_low_u16 (v_column_sum_4), + (uint16x4_t) { 8, 7, 6, 5 }); + v_s2 = vmlal_u16(v_s2, vget_high_u16(v_column_sum_4), + (uint16x4_t) { 4, 3, 2, 1 }); + + /* + * Sum epi32 ints v_s1(s2) and accumulate in s1(s2). + */ + uint32x2_t sum1 = vpadd_u32(vget_low_u32(v_s1), vget_high_u32(v_s1)); + uint32x2_t sum2 = vpadd_u32(vget_low_u32(v_s2), vget_high_u32(v_s2)); + uint32x2_t s1s2 = vpadd_u32(sum1, sum2); + + s1 += vget_lane_u32(s1s2, 0); + s2 += vget_lane_u32(s1s2, 1); + + /* + * Reduce. + */ + s1 %= BASE; + s2 %= BASE; + } + + /* + * Handle leftover data. + */ + if (len) { + if (len >= 16) { + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + s2 += (s1 += *buf++); + + len -= 16; + } + + while (len--) { + s2 += (s1 += *buf++); + } + + if (s1 >= BASE) + s1 -= BASE; + s2 %= BASE; + } + + /* + * Return the recombined sums. + */ + return s1 | (s2 << 16); +} + +#endif /* ADLER32_SIMD_SSSE3 */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.h new file mode 100644 index 000000000..0b2361a51 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/adler32_simd.h @@ -0,0 +1,16 @@ +/* adler32_simd.h + * + * Copyright 2017 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#include + +#include "zconf.h" +#include "zutil.h" + +uint32_t ZLIB_INTERNAL adler32_simd_( + uint32_t adler, + const unsigned char *buf, + z_size_t len); diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/names.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/chromeconf.h similarity index 79% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/names.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/chromeconf.h index 3436baa4e..5b91c8644 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/names.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/chromeconf.h @@ -1,9 +1,21 @@ -/* Copyright 2017 The Chromium Authors. All rights reserved. +/* Copyright 2017 The Chromium Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#ifndef THIRD_PARTY_ZLIB_NAMES_H_ -#define THIRD_PARTY_ZLIB_NAMES_H_ +#ifndef THIRD_PARTY_ZLIB_CHROMECONF_H_ +#define THIRD_PARTY_ZLIB_CHROMECONF_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) +#if defined(ZLIB_IMPLEMENTATION) +#define ZEXTERN __declspec(dllexport) +#else +#define ZEXTERN __declspec(dllimport) +#endif +#elif defined(ZLIB_IMPLEMENTATION) +#define ZEXTERN __attribute__((visibility("default"))) +#endif +#endif /* Rename all zlib names with a Cr_z_ prefix. This is based on the Z_PREFIX * option from zconf.h, but with a custom prefix. Where zconf.h would rename @@ -37,6 +49,9 @@ #define crc32 Cr_z_crc32 #define crc32_combine Cr_z_crc32_combine #define crc32_combine64 Cr_z_crc32_combine64 +#define crc32_combine_gen64 Cr_z_crc32_combine_gen64 +#define crc32_combine_gen Cr_z_crc32_combine_gen +#define crc32_combine_op Cr_z_crc32_combine_op #define crc32_z Cr_z_crc32_z #define deflate Cr_z_deflate #define deflateBound Cr_z_deflateBound @@ -146,7 +161,7 @@ #define voidpc Cr_z_voidpc #define voidpf Cr_z_voidpf #define gz_header_s Cr_z_gz_header_s -#define internal_state Cr_z_internal_state +/* #undef internal_state */ /* #undef z_off64_t */ /* An exported symbol that isn't handled by Z_PREFIX in zconf.h */ @@ -160,8 +175,29 @@ #define crc_fold_init Cr_z_crc_fold_init #define crc_reset Cr_z_crc_reset #define fill_window_sse Cr_z_fill_window_sse -#define read_buf Cr_z_read_buf +#define deflate_read_buf Cr_z_deflate_read_buf #define x86_check_features Cr_z_x86_check_features #define x86_cpu_enable_simd Cr_z_x86_cpu_enable_simd -#endif /* THIRD_PARTY_ZLIB_NAMES_H_ */ +/* Symbols added by adler_simd.c */ +#define adler32_simd_ Cr_z_adler32_simd_ +#define x86_cpu_enable_ssse3 Cr_z_x86_cpu_enable_ssse3 + +/* Symbols added by contrib/optimizations/inffast_chunk */ +#define inflate_fast_chunk_ Cr_z_inflate_fast_chunk_ + +/* Symbols added by crc32_simd.c */ +#define crc32_sse42_simd_ Cr_z_crc32_sse42_simd_ + +/* Symbols added by armv8_crc32 */ +#define arm_cpu_enable_crc32 Cr_z_arm_cpu_enable_crc32 +#define arm_cpu_enable_pmull Cr_z_arm_cpu_enable_pmull +#define arm_check_features Cr_z_arm_check_features +#define armv8_crc32_little Cr_z_armv8_crc32_little +#define armv8_crc32_pmull_little Cr_z_armv8_crc32_pmull_little + +/* Symbols added by cpu_features.c */ +#define cpu_check_features Cr_z_cpu_check_features +#define x86_cpu_enable_sse2 Cr_z_x86_cpu_enable_sse2 + +#endif /* THIRD_PARTY_ZLIB_CHROMECONF_H_ */ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/compress.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/compress.c similarity index 70% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/compress.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/compress.c index e2db404ab..0f11a27c2 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/compress.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/compress.c @@ -19,13 +19,8 @@ memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ -int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ +int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen, int level) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -65,12 +60,8 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) /* =========================================================================== */ -int ZEXPORT compress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } @@ -78,9 +69,17 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ -uLong ZEXPORT compressBound (sourceLen) - uLong sourceLen; -{ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13; +uLong ZEXPORT compressBound(uLong sourceLen) { + sourceLen = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; + /* FIXME(cavalcantii): usage of CRC32 Castagnoli as a hash function + * for the hash table of symbols used for compression has a side effect + * where for compression level [4, 5] it will increase the output buffer size + * by 0.1% (i.e. less than 1%) for a high entropy input (i.e. random data). + * To avoid a scenario where client code would fail, for safety we increase + * the expected output size by 0.8% (i.e. 8x more than the worst scenario). + * See: http://crbug.com/990489 + */ + sourceLen += sourceLen >> 7; // Equivalent to 1.0078125 + return sourceLen; } diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/check.sh b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/check.sh new file mode 100755 index 000000000..e6934605a --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/check.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the chromium source repository LICENSE file. +# +# Given a zlib_bench executable and some data files, run zlib_bench --check +# over those data files, for all zlib types (gzip|zlib|raw) and compression +# levels 1..9 for each type. Example: +# +# check.sh ./out/Release/zlib_bench [--check-binary] ~/snappy/testdata/* +# +# The --check-binary option modifies --check output: the compressed data is +# also written to the program output. + +ZLIB_BENCH="$1" && shift + +CHECK_TYPE="--check" +if [[ "${1}" == "--check-binary" ]]; then + CHECK_TYPE="$1" && shift # output compressed data too +fi + +DATA_FILES="$*" + +echo ${ZLIB_BENCH} | grep -E "/(zlib_bench|a.out)$" > /dev/null +if [[ $? != 0 ]] || [[ -z "${DATA_FILES}" ]]; then + echo "usage: check.sh zlib_bench [--check-binary] files ..." >&2 + exit 1; +fi + +for type in gzip zlib raw; do + for level in $(seq 1 9); do + ${ZLIB_BENCH} $type --compression $level ${CHECK_TYPE} ${DATA_FILES} + done +done diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/zlib_bench.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/zlib_bench.cc new file mode 100644 index 000000000..b65f9291b --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/bench/zlib_bench.cc @@ -0,0 +1,438 @@ +/* + * Copyright 2018 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + * + * A benchmark test harness for measuring decoding performance of gzip or zlib + * (deflate) encoded compressed data. Given a file containing any data, encode + * (compress) it into gzip or zlib format and then decode (uncompress). Output + * the median and maximum encoding and decoding rates in MB/s. + * + * Raw deflate (no gzip or zlib stream wrapper) mode is also supported. Select + * it with the [raw] argument. Use the [gzip] [zlib] arguments to select those + * stream wrappers. + * + * Note this code can be compiled outside of the Chromium build system against + * the system zlib (-lz) with g++ or clang++ as follows: + * + * g++|clang++ -O3 -Wall -std=c++11 zlib_bench.cc -lstdc++ -lz + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "zlib.h" + +void error_exit(const char* error, int code) { + fprintf(stderr, "%s (%d)\n", error, code); + exit(code); +} + +inline char* string_data(std::string* s) { + return s->empty() ? nullptr : &*s->begin(); +} + +struct Data { + Data(size_t s) { data.reset(new (std::nothrow) char[size = s]); } + std::unique_ptr data; + size_t size; + std::string name; +}; + +Data read_file_data_or_exit(const char* name) { + std::ifstream file(name, std::ios::in | std::ios::binary); + if (!file) { + perror(name); + exit(1); + } + + file.seekg(0, std::ios::end); + Data data(file.tellg()); + file.seekg(0, std::ios::beg); + + if (file && data.data) + file.read(data.data.get(), data.size); + + if (!file || !data.data || !data.size) { + perror((std::string("failed: reading ") + name).c_str()); + exit(1); + } + + data.name = std::string(name); + return data; +} + +size_t zlib_estimate_compressed_size(size_t input_size) { + return compressBound(input_size); +} + +enum zlib_wrapper { + kWrapperNONE, + kWrapperZLIB, + kWrapperGZIP, + kWrapperZRAW, +}; + +inline int zlib_stream_wrapper_type(zlib_wrapper type) { + if (type == kWrapperZLIB) // zlib DEFLATE stream wrapper + return MAX_WBITS; + if (type == kWrapperGZIP) // gzip DEFLATE stream wrapper + return MAX_WBITS + 16; + if (type == kWrapperZRAW) // no wrapper, use raw DEFLATE + return -MAX_WBITS; + error_exit("bad wrapper type", int(type)); + return 0; +} + +const char* zlib_wrapper_name(zlib_wrapper type) { + if (type == kWrapperZLIB) + return "ZLIB"; + if (type == kWrapperGZIP) + return "GZIP"; + if (type == kWrapperZRAW) + return "RAW"; + error_exit("bad wrapper type", int(type)); + return nullptr; +} + +static int zlib_strategy = Z_DEFAULT_STRATEGY; + +const char* zlib_level_strategy_name(int compression_level) { + if (compression_level == 0) + return ""; // strategy is meaningless at level 0 + if (zlib_strategy == Z_HUFFMAN_ONLY) + return "huffman "; + if (zlib_strategy == Z_RLE) + return "rle "; + if (zlib_strategy == Z_DEFAULT_STRATEGY) + return ""; + error_exit("bad strategy", zlib_strategy); + return nullptr; +} + +static int zlib_compression_level = Z_DEFAULT_COMPRESSION; + +void zlib_compress( + const zlib_wrapper type, + const char* input, + const size_t input_size, + std::string* output, + bool resize_output = false) +{ + if (resize_output) + output->resize(zlib_estimate_compressed_size(input_size)); + size_t output_size = output->size(); + + z_stream stream; + memset(&stream, 0, sizeof(stream)); + + int result = deflateInit2(&stream, zlib_compression_level, Z_DEFLATED, + zlib_stream_wrapper_type(type), MAX_MEM_LEVEL, zlib_strategy); + if (result != Z_OK) + error_exit("deflateInit2 failed", result); + + stream.next_out = (Bytef*)string_data(output); + stream.avail_out = (uInt)output_size; + stream.next_in = (z_const Bytef*)input; + stream.avail_in = (uInt)input_size; + + result = deflate(&stream, Z_FINISH); + if (stream.avail_in > 0) + error_exit("compress: input was not consumed", Z_DATA_ERROR); + if (result == Z_STREAM_END) + output_size = stream.total_out; + result |= deflateEnd(&stream); + if (result != Z_STREAM_END) + error_exit("compress failed", result); + + if (resize_output) + output->resize(output_size); +} + +void zlib_uncompress( + const zlib_wrapper type, + const std::string& input, + const size_t output_size, + std::string* output) +{ + z_stream stream; + memset(&stream, 0, sizeof(stream)); + + int result = inflateInit2(&stream, zlib_stream_wrapper_type(type)); + if (result != Z_OK) + error_exit("inflateInit2 failed", result); + + stream.next_out = (Bytef*)string_data(output); + stream.avail_out = (uInt)output->size(); + stream.next_in = (z_const Bytef*)input.data(); + stream.avail_in = (uInt)input.size(); + + result = inflate(&stream, Z_FINISH); + if (stream.total_out != output_size) + result = Z_DATA_ERROR; + result |= inflateEnd(&stream); + if (result == Z_STREAM_END) + return; + + std::string error("uncompress failed: "); + if (stream.msg) + error.append(stream.msg); + error_exit(error.c_str(), result); +} + +void verify_equal(const char* input, size_t size, std::string* output) { + const char* data = string_data(output); + if (output->size() == size && !memcmp(data, input, size)) + return; + fprintf(stderr, "uncompressed data does not match the input data\n"); + exit(3); +} + +void check_file(const Data& file, zlib_wrapper type, int mode) { + printf("%s %d %s%s\n", zlib_wrapper_name(type), zlib_compression_level, + zlib_level_strategy_name(zlib_compression_level), file.name.c_str()); + + // Compress the file data. + std::string compressed; + zlib_compress(type, file.data.get(), file.size, &compressed, true); + + // Output compressed data integrity check: the data crc32. + unsigned long check = crc32_z(0, Z_NULL, 0); + const Bytef* data = (const Bytef*)compressed.data(); + static_assert(sizeof(z_size_t) == sizeof(size_t), "z_size_t size"); + check = crc32_z(check, data, (z_size_t)compressed.size()); + + const size_t compressed_length = compressed.size(); + printf("data crc32 %.8lx length %zu\n", check, compressed_length); + + // Output gzip or zlib DEFLATE stream internal check data. + if (type == kWrapperGZIP) { + uint32_t prev_word, last_word; + data += compressed_length - 8; + prev_word = data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0]; + data += 4; // last compressed data word + last_word = data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0]; + printf("gzip crc32 %.8x length %u\n", prev_word, last_word); + } else if (type == kWrapperZLIB) { + uint32_t last_word; + data += compressed_length - 4; + last_word = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + printf("zlib adler %.8x\n", last_word); + } + + if (mode == 2) // --check-binary: output compressed data. + fwrite(compressed.data(), compressed_length, 1, stdout); + + if (fflush(stdout), ferror(stdout)) + error_exit("check file: error writing output", 3); +} + +void zlib_file(const char* name, + zlib_wrapper type, + int width, + int check, + bool output_csv_format) { + /* + * Read the file data. + */ + struct Data file = read_file_data_or_exit(name); + const int length = static_cast(file.size); + const char* data = file.data.get(); + + /* + * Compress file: report output data checks and return. + */ + if (check) { + file.name = file.name.substr(file.name.find_last_of("/\\") + 1); + check_file(file, type, check); + return; + } + + /* + * Report compression strategy and file name. + */ + const char* strategy = zlib_level_strategy_name(zlib_compression_level); + if (!output_csv_format) { + printf("%s%-40s :\n", strategy, name); + } + + /* + * Chop the data into blocks. + */ + const int block_size = 1 << 20; + const int blocks = (length + block_size - 1) / block_size; + + std::vector input(blocks); + std::vector input_length(blocks); + std::vector compressed(blocks); + std::vector output(blocks); + + for (int b = 0; b < blocks; ++b) { + int input_start = b * block_size; + int input_limit = std::min((b + 1) * block_size, length); + input[b] = data + input_start; + input_length[b] = input_limit - input_start; + } + + /* + * Run the zlib compress/uncompress loop a few times with |repeats| to + * process about 10MB of data if the length is small relative to 10MB. + * If length is large relative to 10MB, process the data once. + */ + const int mega_byte = 1024 * 1024; + const int repeats = (10 * mega_byte + length) / (length + 1); + const int runs = 5; + double ctime[runs]; + double utime[runs]; + + for (int run = 0; run < runs; ++run) { + const auto now = [] { return std::chrono::steady_clock::now(); }; + + // Pre-grow the output buffer so we don't measure string resize time. + for (int b = 0; b < blocks; ++b) + compressed[b].resize(zlib_estimate_compressed_size(block_size)); + + auto start = now(); + for (int b = 0; b < blocks; ++b) + for (int r = 0; r < repeats; ++r) + zlib_compress(type, input[b], input_length[b], &compressed[b]); + ctime[run] = std::chrono::duration(now() - start).count(); + + // Compress again, resizing compressed, so we don't leave junk at the + // end of the compressed string that could confuse zlib_uncompress(). + for (int b = 0; b < blocks; ++b) + zlib_compress(type, input[b], input_length[b], &compressed[b], true); + + for (int b = 0; b < blocks; ++b) + output[b].resize(input_length[b]); + + start = now(); + for (int r = 0; r < repeats; ++r) + for (int b = 0; b < blocks; ++b) + zlib_uncompress(type, compressed[b], input_length[b], &output[b]); + utime[run] = std::chrono::duration(now() - start).count(); + + for (int b = 0; b < blocks; ++b) + verify_equal(input[b], input_length[b], &output[b]); + } + + /* + * Output the median/maximum compress/uncompress rates in MB/s. + */ + size_t output_length = 0; + for (size_t i = 0; i < compressed.size(); ++i) + output_length += compressed[i].size(); + + std::sort(ctime, ctime + runs); + std::sort(utime, utime + runs); + + double deflate_rate_med, inflate_rate_med, deflate_rate_max, inflate_rate_max; + deflate_rate_med = length * repeats / mega_byte / ctime[runs / 2]; + inflate_rate_med = length * repeats / mega_byte / utime[runs / 2]; + deflate_rate_max = length * repeats / mega_byte / ctime[0]; + inflate_rate_max = length * repeats / mega_byte / utime[0]; + double compress_ratio = output_length * 100.0 / length; + + if (!output_csv_format) { + // type, block size, compression ratio, etc + printf("%s: [b %dM] bytes %*d -> %*u %4.2f%%", zlib_wrapper_name(type), + block_size / (1 << 20), width, length, width, + unsigned(output_length), compress_ratio); + + // compress / uncompress median (max) rates + printf(" comp %5.1f (%5.1f) MB/s uncomp %5.1f (%5.1f) MB/s\n", + deflate_rate_med, deflate_rate_max, inflate_rate_med, + inflate_rate_max); + } else { + printf("%s\t%.5lf\t%.5lf\t%.5lf\t%.5lf\t%.5lf\n", name, deflate_rate_med, + inflate_rate_med, deflate_rate_max, inflate_rate_max, + compress_ratio); + } +} + +static int argn = 1; + +char* get_option(int argc, char* argv[], const char* option) { + if (argn < argc) + return !strcmp(argv[argn], option) ? argv[argn++] : nullptr; + return nullptr; +} + +bool get_compression(int argc, char* argv[], int& value) { + if (argn < argc) + value = isdigit(argv[argn][0]) ? atoi(argv[argn++]) : -1; + return value >= 0 && value <= 9; +} + +void get_field_width(int argc, char* argv[], int& value) { + value = atoi(argv[argn++]); +} + +void usage_exit(const char* program) { + static auto* options = + "gzip|zlib|raw" + " [--compression 0:9] [--huffman|--rle] [--field width] [--check]" + " [--csv]"; + printf("usage: %s %s files ...\n", program, options); + printf("zlib version: %s\n", ZLIB_VERSION); + exit(1); +} + +int main(int argc, char* argv[]) { + zlib_wrapper type; + if (get_option(argc, argv, "zlib")) + type = kWrapperZLIB; + else if (get_option(argc, argv, "gzip")) + type = kWrapperGZIP; + else if (get_option(argc, argv, "raw")) + type = kWrapperZRAW; + else + usage_exit(argv[0]); + + int size_field_width = 0; + int file_check = 0; + bool output_csv = false; + while (argn < argc && argv[argn][0] == '-') { + if (get_option(argc, argv, "--compression")) { + if (!get_compression(argc, argv, zlib_compression_level)) + usage_exit(argv[0]); + } else if (get_option(argc, argv, "--huffman")) { + zlib_strategy = Z_HUFFMAN_ONLY; + } else if (get_option(argc, argv, "--rle")) { + zlib_strategy = Z_RLE; + } else if (get_option(argc, argv, "--check")) { + file_check = 1; + } else if (get_option(argc, argv, "--check-binary")) { + file_check = 2; + } else if (get_option(argc, argv, "--field")) { + get_field_width(argc, argv, size_field_width); + } else if (get_option(argc, argv, "--csv")) { + output_csv = true; + printf( + "filename\tcompression\tdecompression\tcomp_max\t" + "decomp_max\tcompress_ratio\n"); + } else { + usage_exit(argv[0]); + } + } + + if (argn >= argc) + usage_exit(argv[0]); + + if (size_field_width < 6) + size_field_width = 6; + while (argn < argc) { + zlib_file(argv[argn++], type, size_field_width, file_check, output_csv); + } + + return 0; +} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ChangeLogUnzip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ChangeLogUnzip similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ChangeLogUnzip rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ChangeLogUnzip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/Makefile b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/Makefile similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/Makefile rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/Makefile diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/README.chromium b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/README.chromium new file mode 100644 index 000000000..9c780f946 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/README.chromium @@ -0,0 +1,20 @@ +Name: ZIP file API for reading file entries in a ZIP archive +Short Name: minizip +URL: https://github.com/madler/zlib/tree/master/contrib/minizip +Version: 1.2.12 +License: Zlib +License File: //third_party/zlib/LICENSE +Security Critical: yes +Shipped: yes + +Description: +Minizip provides API on top of zlib that can enumerate and extract ZIP archive +files. See minizip.md for chromium build instructions. + +Local Modifications: +- Add parsing of the 'Info-ZIP Unicode Path Extra Field' as described in + https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT section 4.6.9. + (see crrev.com/1002476) + +- Check for overly long filename, comment, or extra field in + zipOpenNewFileInZip4_64 (crbug.com/1470539). diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/crypt.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/crypt.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/crypt.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/crypt.h diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.c similarity index 99% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.c index 7f5c191b2..543910b5e 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.c @@ -14,7 +14,7 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#if defined(__APPLE__) || defined(IOAPI_NO_64) +#if defined(__APPLE__) || defined(__Fuchsia__) || defined(IOAPI_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.h similarity index 99% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.h index c1b7a5484..8dcbdb06e 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/ioapi.h @@ -43,7 +43,7 @@ #include #include -#include "third_party/zlib/zlib.h" +#include "zlib.h" #if defined(USE_FILE32API) #define fopen64 fopen diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.c similarity index 98% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.c index 246ceb91a..c6bc314b3 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.c @@ -31,14 +31,12 @@ #define _WIN32_WINNT 0x601 #endif -#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 -// see Include/shared/winapifamily.h in the Windows Kit -#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) -#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) +#if !defined(IOWIN32_USING_WINRT_API) +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) +// Windows Store or Universal Windows Platform #define IOWIN32_USING_WINRT_API 1 #endif #endif -#endif voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/iowin32.h diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/miniunz.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/miniunz.c similarity index 98% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/miniunz.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/miniunz.c index 3d65401be..08737f689 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/miniunz.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/miniunz.c @@ -12,7 +12,7 @@ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) */ -#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__)) #ifndef __USE_FILE_OFFSET64 #define __USE_FILE_OFFSET64 #endif @@ -27,7 +27,7 @@ #endif #endif -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -45,6 +45,7 @@ #include #include #include +#include #ifdef _WIN32 # include @@ -97,7 +98,7 @@ void change_file_date(filename,dosdate,tmu_date) SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); CloseHandle(hFile); #else -#ifdef unix || __APPLE__ +#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) struct utimbuf ut; struct tm newdate; newdate.tm_sec = tmu_date.tm_sec; @@ -125,11 +126,9 @@ int mymkdir(dirname) const char* dirname; { int ret=0; -#ifdef _WIN32 +#if defined(_WIN32) ret = _mkdir(dirname); -#elif unix - ret = mkdir (dirname,0775); -#elif __APPLE__ +#elif defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) ret = mkdir (dirname,0775); #endif return ret; diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.c similarity index 98% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.c index 4288962ec..b794953c5 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.c @@ -12,8 +12,7 @@ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) */ - -#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__)) #ifndef __USE_FILE_OFFSET64 #define __USE_FILE_OFFSET64 #endif @@ -28,7 +27,7 @@ #endif #endif -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -94,7 +93,7 @@ uLong filetime(f, tmzip, dt) return ret; } #else -#ifdef unix || __APPLE__ +#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) uLong filetime(f, tmzip, dt) char *f; /* name of file to get info on */ tm_zip *tmzip; /* return value: access, modific. and creation times */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.md b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.md new file mode 100644 index 000000000..9f15dd23d --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/minizip.md @@ -0,0 +1,9 @@ +Minizip is a library provided by //third_party/zlib [1]. Its zip and unzip +tools can be built in a developer checkout for testing purposes with: + +```shell + autoninja -C out/Release minizip_bin + autoninja -C out/Release miniunz_bin +``` + +[1] Upstream is https://github.com/madler/zlib/tree/master/contrib/minizip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.c similarity index 99% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.c index 8bf9cca32..96891c2e0 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.c @@ -8,7 +8,7 @@ #include #include #include -#include "third_party/zlib/zlib.h" +#include "zlib.h" #include "unzip.h" #define READ_8(adr) ((unsigned char)*(adr)) diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.h similarity index 95% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.h index f295ffeda..a49a426ec 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/mztools.h @@ -12,7 +12,7 @@ extern "C" { #endif #ifndef _ZLIB_H -#include "third_party/zlib/zlib.h" +#include "zlib.h" #endif #include "unzip.h" diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.c similarity index 95% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.c index 199b4723f..4973a4eea 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.c @@ -68,11 +68,7 @@ #include #include -#ifndef NOUNCRYPT - #define NOUNCRYPT -#endif - -#include "third_party/zlib/zlib.h" +#include "zlib.h" #include "unzip.h" #ifdef STDC @@ -1027,46 +1023,102 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, while(acc < file_info.size_file_extra) { uLong headerId; - uLong dataSize; + uLong dataSize; if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) err=UNZ_ERRNO; - + /* ZIP64 extra fields */ if (headerId == 0x0001) { - uLong uL; - - if(file_info.uncompressed_size == MAXU32) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info.compressed_size == MAXU32) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info_internal.offset_curfile == MAXU32) - { - /* Relative Header offset */ - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info.disk_num_start == MAXU32) - { - /* Disk Start Number */ - if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) - err=UNZ_ERRNO; - } + uLong uL; + + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == MAXU32) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } } + else if (headerId == 0x7075) /* Info-ZIP Unicode Path Extra Field */ + { + int version = 0; + + if (unz64local_getByte(&s->z_filefunc, s->filestream, &version) != UNZ_OK) + { + err = UNZ_ERRNO; + } + if (version != 1) + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize - 1, ZLIB_FILEFUNC_SEEK_CUR) != 0) + { + err = UNZ_ERRNO; + } + } + else + { + uLong uCrc, uHeaderCrc, fileNameSize; + + if (unz64local_getLong(&s->z_filefunc, s->filestream, &uCrc) != UNZ_OK) + { + err = UNZ_ERRNO; + } + uHeaderCrc = crc32(0, (const unsigned char *)szFileName, file_info.size_filename); + fileNameSize = dataSize - (2 * sizeof (short) + 1); + /* Check CRC against file name in the header. */ + if (uHeaderCrc != uCrc) + { + if (ZSEEK64(s->z_filefunc, s->filestream, fileNameSize, ZLIB_FILEFUNC_SEEK_CUR) != 0) + { + err = UNZ_ERRNO; + } + } + else + { + uLong uSizeRead; + + if (fileNameSize < fileNameBufferSize) + { + *(szFileName + fileNameSize) = '\0'; + uSizeRead = fileNameSize; + } + else + { + uSizeRead = fileNameBufferSize; + } + if ((fileNameSize > 0) && (fileNameBufferSize > 0)) + { + if (ZREAD64(s->z_filefunc, s->filestream, szFileName, uSizeRead) != uSizeRead) + { + err = UNZ_ERRNO; + } + } + } + } + } else { if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) @@ -1630,6 +1682,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, zdecode(s->keys,s->pcrc_32_tab,source[i]); s->pfile_in_zip_read->pos_in_zipfile+=12; + s->pfile_in_zip_read->rest_read_compressed-=12; s->encrypted=1; } # endif diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.h similarity index 99% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.h index 3c0143529..2104e3915 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/unzip.h @@ -48,7 +48,7 @@ extern "C" { #endif #ifndef _ZLIB_H -#include "third_party/zlib/zlib.h" +#include "zlib.h" #endif #ifndef _ZLIBIOAPI_H diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.c similarity index 99% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.c index 65c0c7251..f21d49542 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.c @@ -26,7 +26,7 @@ #include #include #include -#include "third_party/zlib/zlib.h" +#include "zlib.h" #include "zip.h" #ifdef STDC @@ -1083,6 +1083,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, return ZIP_PARAMERROR; #endif + // The filename and comment length must fit in 16 bits. + if ((filename!=NULL) && (strlen(filename)>0xffff)) + return ZIP_PARAMERROR; + if ((comment!=NULL) && (strlen(comment)>0xffff)) + return ZIP_PARAMERROR; + // The extra field length must fit in 16 bits. If the member also requires + // a Zip64 extra block, that will also need to fit within that 16-bit + // length, but that will be checked for later. + if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; if (zi->in_opened_file_inzip == 1) diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.h similarity index 99% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.h index 8c06c0aa7..8aaebb623 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/minizip/zip.h @@ -47,7 +47,7 @@ extern "C" { //#define HAVE_BZIP2 #ifndef _ZLIB_H -#include "third_party/zlib/zlib.h" +#include "zlib.h" #endif #ifndef _ZLIBIOAPI_H diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/chunkcopy.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/chunkcopy.h new file mode 100644 index 000000000..f40546d54 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/chunkcopy.h @@ -0,0 +1,489 @@ +/* chunkcopy.h -- fast chunk copy and set operations + * Copyright (C) 2017 ARM, Inc. + * Copyright 2017 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#ifndef CHUNKCOPY_H +#define CHUNKCOPY_H + +#include +#include "zutil.h" + +#define Z_STATIC_ASSERT(name, assert) typedef char name[(assert) ? 1 : -1] + +#if __STDC_VERSION__ >= 199901L +#define Z_RESTRICT restrict +#else +#define Z_RESTRICT +#endif + +#if defined(__clang__) || defined(__GNUC__) || defined(__llvm__) +#define Z_BUILTIN_MEMCPY __builtin_memcpy +#else +#define Z_BUILTIN_MEMCPY zmemcpy +#endif + +#if defined(INFLATE_CHUNK_SIMD_NEON) +#include +typedef uint8x16_t z_vec128i_t; +#elif defined(INFLATE_CHUNK_SIMD_SSE2) +#include +typedef __m128i z_vec128i_t; +#else +#error chunkcopy.h inflate chunk SIMD is not defined for your build target +#endif + +/* + * Suppress MSan errors about copying uninitialized bytes (crbug.com/1376033). + */ +#define Z_DISABLE_MSAN +#if defined(__has_feature) + #if __has_feature(memory_sanitizer) + #undef Z_DISABLE_MSAN + #define Z_DISABLE_MSAN __attribute__((no_sanitize("memory"))) + #endif +#endif + +/* + * chunk copy type: the z_vec128i_t type size should be exactly 128-bits + * and equal to CHUNKCOPY_CHUNK_SIZE. + */ +#define CHUNKCOPY_CHUNK_SIZE sizeof(z_vec128i_t) + +Z_STATIC_ASSERT(vector_128_bits_wide, + CHUNKCOPY_CHUNK_SIZE == sizeof(int8_t) * 16); + +/* + * Ask the compiler to perform a wide, unaligned load with a machine + * instruction appropriate for the z_vec128i_t type. + */ +static inline z_vec128i_t loadchunk( + const unsigned char FAR* s) Z_DISABLE_MSAN { + z_vec128i_t v; + Z_BUILTIN_MEMCPY(&v, s, sizeof(v)); + return v; +} + +/* + * Ask the compiler to perform a wide, unaligned store with a machine + * instruction appropriate for the z_vec128i_t type. + */ +static inline void storechunk( + unsigned char FAR* d, + const z_vec128i_t v) { + Z_BUILTIN_MEMCPY(d, &v, sizeof(v)); +} + +/* + * Perform a memcpy-like operation, assuming that length is non-zero and that + * it's OK to overwrite at least CHUNKCOPY_CHUNK_SIZE bytes of output even if + * the length is shorter than this. + * + * It also guarantees that it will properly unroll the data if the distance + * between `out` and `from` is at least CHUNKCOPY_CHUNK_SIZE, which we rely on + * in chunkcopy_relaxed(). + * + * Aside from better memory bus utilisation, this means that short copies + * (CHUNKCOPY_CHUNK_SIZE bytes or fewer) will fall straight through the loop + * without iteration, which will hopefully make the branch prediction more + * reliable. + */ +static inline unsigned char FAR* chunkcopy_core( + unsigned char FAR* out, + const unsigned char FAR* from, + unsigned len) Z_DISABLE_MSAN { + const int bump = (--len % CHUNKCOPY_CHUNK_SIZE) + 1; + storechunk(out, loadchunk(from)); + out += bump; + from += bump; + len /= CHUNKCOPY_CHUNK_SIZE; + while (len-- > 0) { + storechunk(out, loadchunk(from)); + out += CHUNKCOPY_CHUNK_SIZE; + from += CHUNKCOPY_CHUNK_SIZE; + } + return out; +} + +/* + * Like chunkcopy_core(), but avoid writing beyond of legal output. + * + * Accepts an additional pointer to the end of safe output. A generic safe + * copy would use (out + len), but it's normally the case that the end of the + * output buffer is beyond the end of the current copy, and this can still be + * exploited. + */ +static inline unsigned char FAR* chunkcopy_core_safe( + unsigned char FAR* out, + const unsigned char FAR* from, + unsigned len, + unsigned char FAR* limit) { + Assert(out + len <= limit, "chunk copy exceeds safety limit"); + if ((limit - out) < (ptrdiff_t)CHUNKCOPY_CHUNK_SIZE) { + const unsigned char FAR* Z_RESTRICT rfrom = from; + Assert((uintptr_t)out - (uintptr_t)from >= len, + "invalid restrict in chunkcopy_core_safe"); + Assert((uintptr_t)from - (uintptr_t)out >= len, + "invalid restrict in chunkcopy_core_safe"); + if (len & 8) { + Z_BUILTIN_MEMCPY(out, rfrom, 8); + out += 8; + rfrom += 8; + } + if (len & 4) { + Z_BUILTIN_MEMCPY(out, rfrom, 4); + out += 4; + rfrom += 4; + } + if (len & 2) { + Z_BUILTIN_MEMCPY(out, rfrom, 2); + out += 2; + rfrom += 2; + } + if (len & 1) { + *out++ = *rfrom++; + } + return out; + } + return chunkcopy_core(out, from, len); +} + +/* + * Perform short copies until distance can be rewritten as being at least + * CHUNKCOPY_CHUNK_SIZE. + * + * Assumes it's OK to overwrite at least the first 2*CHUNKCOPY_CHUNK_SIZE + * bytes of output even if the copy is shorter than this. This assumption + * holds within zlib inflate_fast(), which starts every iteration with at + * least 258 bytes of output space available (258 being the maximum length + * output from a single token; see inffast.c). + */ +static inline unsigned char FAR* chunkunroll_relaxed( + unsigned char FAR* out, + unsigned FAR* dist, + unsigned FAR* len) Z_DISABLE_MSAN { + const unsigned char FAR* from = out - *dist; + while (*dist < *len && *dist < CHUNKCOPY_CHUNK_SIZE) { + storechunk(out, loadchunk(from)); + out += *dist; + *len -= *dist; + *dist += *dist; + } + return out; +} + +#if defined(INFLATE_CHUNK_SIMD_NEON) +/* + * v_load64_dup(): load *src as an unaligned 64-bit int and duplicate it in + * every 64-bit component of the 128-bit result (64-bit int splat). + */ +static inline z_vec128i_t v_load64_dup(const void* src) { + return vcombine_u8(vld1_u8(src), vld1_u8(src)); +} + +/* + * v_load32_dup(): load *src as an unaligned 32-bit int and duplicate it in + * every 32-bit component of the 128-bit result (32-bit int splat). + */ +static inline z_vec128i_t v_load32_dup(const void* src) { + int32_t i32; + Z_BUILTIN_MEMCPY(&i32, src, sizeof(i32)); + return vreinterpretq_u8_s32(vdupq_n_s32(i32)); +} + +/* + * v_load16_dup(): load *src as an unaligned 16-bit int and duplicate it in + * every 16-bit component of the 128-bit result (16-bit int splat). + */ +static inline z_vec128i_t v_load16_dup(const void* src) { + int16_t i16; + Z_BUILTIN_MEMCPY(&i16, src, sizeof(i16)); + return vreinterpretq_u8_s16(vdupq_n_s16(i16)); +} + +/* + * v_load8_dup(): load the 8-bit int *src and duplicate it in every 8-bit + * component of the 128-bit result (8-bit int splat). + */ +static inline z_vec128i_t v_load8_dup(const void* src) { + return vld1q_dup_u8((const uint8_t*)src); +} + +/* + * v_store_128(): store the 128-bit vec in a memory destination (that might + * not be 16-byte aligned) void* out. + */ +static inline void v_store_128(void* out, const z_vec128i_t vec) { + vst1q_u8(out, vec); +} + +#elif defined(INFLATE_CHUNK_SIMD_SSE2) +/* + * v_load64_dup(): load *src as an unaligned 64-bit int and duplicate it in + * every 64-bit component of the 128-bit result (64-bit int splat). + */ +static inline z_vec128i_t v_load64_dup(const void* src) { + int64_t i64; + Z_BUILTIN_MEMCPY(&i64, src, sizeof(i64)); + return _mm_set1_epi64x(i64); +} + +/* + * v_load32_dup(): load *src as an unaligned 32-bit int and duplicate it in + * every 32-bit component of the 128-bit result (32-bit int splat). + */ +static inline z_vec128i_t v_load32_dup(const void* src) { + int32_t i32; + Z_BUILTIN_MEMCPY(&i32, src, sizeof(i32)); + return _mm_set1_epi32(i32); +} + +/* + * v_load16_dup(): load *src as an unaligned 16-bit int and duplicate it in + * every 16-bit component of the 128-bit result (16-bit int splat). + */ +static inline z_vec128i_t v_load16_dup(const void* src) { + int16_t i16; + Z_BUILTIN_MEMCPY(&i16, src, sizeof(i16)); + return _mm_set1_epi16(i16); +} + +/* + * v_load8_dup(): load the 8-bit int *src and duplicate it in every 8-bit + * component of the 128-bit result (8-bit int splat). + */ +static inline z_vec128i_t v_load8_dup(const void* src) { + return _mm_set1_epi8(*(const char*)src); +} + +/* + * v_store_128(): store the 128-bit vec in a memory destination (that might + * not be 16-byte aligned) void* out. + */ +static inline void v_store_128(void* out, const z_vec128i_t vec) { + _mm_storeu_si128((__m128i*)out, vec); +} +#endif + +/* + * Perform an overlapping copy which behaves as a memset() operation, but + * supporting periods other than one, and assume that length is non-zero and + * that it's OK to overwrite at least CHUNKCOPY_CHUNK_SIZE*3 bytes of output + * even if the length is shorter than this. + */ +static inline unsigned char FAR* chunkset_core( + unsigned char FAR* out, + unsigned period, + unsigned len) { + z_vec128i_t v; + const int bump = ((len - 1) % sizeof(v)) + 1; + + switch (period) { + case 1: + v = v_load8_dup(out - 1); + v_store_128(out, v); + out += bump; + len -= bump; + while (len > 0) { + v_store_128(out, v); + out += sizeof(v); + len -= sizeof(v); + } + return out; + case 2: + v = v_load16_dup(out - 2); + v_store_128(out, v); + out += bump; + len -= bump; + if (len > 0) { + v = v_load16_dup(out - 2); + do { + v_store_128(out, v); + out += sizeof(v); + len -= sizeof(v); + } while (len > 0); + } + return out; + case 4: + v = v_load32_dup(out - 4); + v_store_128(out, v); + out += bump; + len -= bump; + if (len > 0) { + v = v_load32_dup(out - 4); + do { + v_store_128(out, v); + out += sizeof(v); + len -= sizeof(v); + } while (len > 0); + } + return out; + case 8: + v = v_load64_dup(out - 8); + v_store_128(out, v); + out += bump; + len -= bump; + if (len > 0) { + v = v_load64_dup(out - 8); + do { + v_store_128(out, v); + out += sizeof(v); + len -= sizeof(v); + } while (len > 0); + } + return out; + } + out = chunkunroll_relaxed(out, &period, &len); + return chunkcopy_core(out, out - period, len); +} + +/* + * Perform a memcpy-like operation, but assume that length is non-zero and that + * it's OK to overwrite at least CHUNKCOPY_CHUNK_SIZE bytes of output even if + * the length is shorter than this. + * + * Unlike chunkcopy_core() above, no guarantee is made regarding the behaviour + * of overlapping buffers, regardless of the distance between the pointers. + * This is reflected in the `restrict`-qualified pointers, allowing the + * compiler to re-order loads and stores. + */ +static inline unsigned char FAR* chunkcopy_relaxed( + unsigned char FAR* Z_RESTRICT out, + const unsigned char FAR* Z_RESTRICT from, + unsigned len) { + Assert((uintptr_t)out - (uintptr_t)from >= len, + "invalid restrict in chunkcopy_relaxed"); + Assert((uintptr_t)from - (uintptr_t)out >= len, + "invalid restrict in chunkcopy_relaxed"); + return chunkcopy_core(out, from, len); +} + +/* + * Like chunkcopy_relaxed(), but avoid writing beyond of legal output. + * + * Unlike chunkcopy_core_safe() above, no guarantee is made regarding the + * behaviour of overlapping buffers, regardless of the distance between the + * pointers. This is reflected in the `restrict`-qualified pointers, allowing + * the compiler to re-order loads and stores. + * + * Accepts an additional pointer to the end of safe output. A generic safe + * copy would use (out + len), but it's normally the case that the end of the + * output buffer is beyond the end of the current copy, and this can still be + * exploited. + */ +static inline unsigned char FAR* chunkcopy_safe( + unsigned char FAR* out, + const unsigned char FAR* Z_RESTRICT from, + unsigned len, + unsigned char FAR* limit) { + Assert(out + len <= limit, "chunk copy exceeds safety limit"); + Assert((uintptr_t)out - (uintptr_t)from >= len, + "invalid restrict in chunkcopy_safe"); + Assert((uintptr_t)from - (uintptr_t)out >= len, + "invalid restrict in chunkcopy_safe"); + + return chunkcopy_core_safe(out, from, len, limit); +} + +/* + * Perform chunky copy within the same buffer, where the source and destination + * may potentially overlap. + * + * Assumes that len > 0 on entry, and that it's safe to write at least + * CHUNKCOPY_CHUNK_SIZE*3 bytes to the output. + */ +static inline unsigned char FAR* chunkcopy_lapped_relaxed( + unsigned char FAR* out, + unsigned dist, + unsigned len) { + if (dist < len && dist < CHUNKCOPY_CHUNK_SIZE) { + return chunkset_core(out, dist, len); + } + return chunkcopy_core(out, out - dist, len); +} + +/* + * Behave like chunkcopy_lapped_relaxed(), but avoid writing beyond of legal + * output. + * + * Accepts an additional pointer to the end of safe output. A generic safe + * copy would use (out + len), but it's normally the case that the end of the + * output buffer is beyond the end of the current copy, and this can still be + * exploited. + */ +static inline unsigned char FAR* chunkcopy_lapped_safe( + unsigned char FAR* out, + unsigned dist, + unsigned len, + unsigned char FAR* limit) { + Assert(out + len <= limit, "chunk copy exceeds safety limit"); + if ((limit - out) < (ptrdiff_t)(3 * CHUNKCOPY_CHUNK_SIZE)) { + /* TODO(cavalcantii): try harder to optimise this */ + while (len-- > 0) { + *out = *(out - dist); + out++; + } + return out; + } + return chunkcopy_lapped_relaxed(out, dist, len); +} + +/* TODO(cavalcanti): see crbug.com/1110083. */ +static inline unsigned char FAR* chunkcopy_safe_ugly(unsigned char FAR* out, + unsigned dist, + unsigned len, + unsigned char FAR* limit) { +#if defined(__GNUC__) && !defined(__clang__) + /* Speed is the same as using chunkcopy_safe + w/ GCC on ARM (tested gcc 6.3 and 7.5) and avoids + undefined behavior. + */ + return chunkcopy_core_safe(out, out - dist, len, limit); +#elif defined(__clang__) && defined(ARMV8_OS_ANDROID) && !defined(__aarch64__) + /* Seems to perform better on 32bit (i.e. Android). */ + return chunkcopy_core_safe(out, out - dist, len, limit); +#else + /* Seems to perform better on 64bit. */ + return chunkcopy_lapped_safe(out, dist, len, limit); +#endif +} + +/* + * The chunk-copy code above deals with writing the decoded DEFLATE data to + * the output with SIMD methods to increase decode speed. Reading the input + * to the DEFLATE decoder with a wide, SIMD method can also increase decode + * speed. This option is supported on little endian machines, and reads the + * input data in 64-bit (8 byte) chunks. + */ + +#ifdef INFLATE_CHUNK_READ_64LE +/* + * Buffer the input in a uint64_t (8 bytes) in the wide input reading case. + */ +typedef uint64_t inflate_holder_t; + +/* + * Ask the compiler to perform a wide, unaligned load of a uint64_t using a + * machine instruction appropriate for the uint64_t type. + */ +static inline inflate_holder_t read64le(const unsigned char FAR *in) { + inflate_holder_t input; + Z_BUILTIN_MEMCPY(&input, in, sizeof(input)); + return input; +} +#else +/* + * Otherwise, buffer the input bits using zlib's default input buffer type. + */ +typedef unsigned long inflate_holder_t; + +#endif /* INFLATE_CHUNK_READ_64LE */ + +#undef Z_STATIC_ASSERT +#undef Z_RESTRICT +#undef Z_BUILTIN_MEMCPY +#undef Z_DISABLE_MSAN + +#endif /* CHUNKCOPY_H */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.c new file mode 100644 index 000000000..b1db452c2 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.c @@ -0,0 +1,376 @@ +/* inffast_chunk.c -- fast decoding + * Copyright (C) 1995-2017 Mark Adler + * Copyright 2023 The Chromium Authors + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "contrib/optimizations/inffast_chunk.h" +#include "contrib/optimizations/chunkcopy.h" + +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") +#else + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate() execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= INFLATE_FAST_MIN_INPUT (6 or 8 bytes + 7 bytes) + strm->avail_out >= INFLATE_FAST_MIN_OUTPUT (258 bytes + 2 bytes) + start >= strm->avail_out + state->bits < 8 + (state->hold >> state->bits) == 0 + strm->next_out[0..strm->avail_out] does not overlap with + strm->next_in[0..strm->avail_in] + strm->state->window is allocated with an additional + CHUNKCOPY_CHUNK_SIZE-1 bytes of padding beyond strm->state->wsize + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + INFLATE_FAST_MIN_INPUT: 6 or 8 bytes + 7 bytes + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The wide input data reading option reads 64 input bits at a time. Thus, + if strm->avail_in >= 8, then there is enough input to avoid checking for + available input while decoding. Reading consumes the input with: + + hold |= read64le(in) << bits; + in += 6; + bits += 48; + + reporting 6 bytes of new input because |bits| is 0..15 (2 bytes rounded + up, worst case) and 6 bytes is enough to decode as noted above. At exit, + hold &= (1U << bits) - 1 drops excess input to keep the invariant: + + (state->hold >> state->bits) == 0 + + INFLATE_FAST_MIN_OUTPUT: 258 bytes + 2 bytes for literals = 260 bytes + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 260 for each loop to avoid checking for + available output space while decoding. + */ +void ZLIB_INTERNAL inflate_fast_chunk_(z_streamp strm, unsigned start) { + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ + unsigned char FAR *limit; /* safety limit for chunky copies */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + inflate_holder_t hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code const *here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in; + last = in + (strm->avail_in - (INFLATE_FAST_MIN_INPUT - 1)); + out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - (INFLATE_FAST_MIN_OUTPUT - 1)); + limit = out + strm->avail_out; +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = (state->wnext == 0 && whave >= wsize) ? wsize : state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + +#ifdef INFLATE_CHUNK_READ_64LE +#define REFILL() do { \ + Assert(bits < 64, "### Too many bits in inflate_fast."); \ + hold |= read64le(in) << bits; \ + in += 7; \ + in -= bits >> 3; \ + bits |= 56; \ + } while (0) +#endif + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { +#ifdef INFLATE_CHUNK_READ_64LE + REFILL(); +#else + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } +#endif + here = lcode + (hold & lmask); +#ifdef INFLATE_CHUNK_READ_64LE + if (here->op == 0) { /* literal */ + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); + hold >>= here->bits; + bits -= here->bits; + here = lcode + (hold & lmask); + if (here->op == 0) { /* literal */ + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? + "inflate: 2nd literal '%c'\n" : + "inflate: 2nd literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); + hold >>= here->bits; + bits -= here->bits; + here = lcode + (hold & lmask); + } + } +#endif + dolen: + op = (unsigned)(here->bits); + hold >>= op; + bits -= op; + op = (unsigned)(here->op); + if (op == 0) { /* literal */ + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here->val); + op &= 15; /* number of extra bits */ + if (op) { +#ifndef INFLATE_CHUNK_READ_64LE + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } +#endif + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); +#ifndef INFLATE_CHUNK_READ_64LE + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } +#endif + here = dcode + (hold & dmask); + dodist: + op = (unsigned)(here->bits); + hold >>= op; + bits -= op; + op = (unsigned)(here->op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here->val); + op &= 15; /* number of extra bits */ + /* we have two fast-path loads: 10+10 + 15+5 + 15 = 55, + but we may need to refill here in the worst case */ + if (bits < op) { +#ifdef INFLATE_CHUNK_READ_64LE + REFILL(); +#else + hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } +#endif + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + *out++ = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + *out++ = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + *out++ = *from++; + } while (--len); + continue; + } +#endif + } + from = window; + if (wnext >= op) { /* contiguous in window */ + from += wnext - op; + } + else { /* wrap around window */ + op -= wnext; + from += wsize - op; + if (op < len) { /* some from end of window */ + len -= op; + out = chunkcopy_safe(out, from, op, limit); + from = window; /* more from start of window */ + op = wnext; + /* This (rare) case can create a situation where + the first chunkcopy below must be checked. + */ + } + } + if (op < len) { /* still need some from output */ + out = chunkcopy_safe(out, from, op, limit); + len -= op; + /* When dist is small the amount of data that can be + copied from the window is also small, and progress + towards the dangerous end of the output buffer is + also small. This means that for trivial memsets and + for chunkunroll_relaxed() a safety check is + unnecessary. However, these conditions may not be + entered at all, and in that case it's possible that + the main copy is near the end. + */ + out = chunkunroll_relaxed(out, &dist, &len); + out = chunkcopy_safe_ugly(out, dist, len, limit); + } else { + /* from points to window, so there is no risk of + overlapping pointers requiring memset-like behaviour + */ + out = chunkcopy_safe(out, from, len, limit); + } + } + else { + /* Whole reference is in range of current output. No + range checks are necessary because we start with room + for at least 258 bytes of output, so unroll and roundoff + operations can write beyond `out+len` so long as they + stay within 258 bytes of `out`. + */ + out = chunkcopy_lapped_relaxed(out, dist, len); + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode + here->val + (hold & ((1U << op) - 1)); + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode + here->val + (hold & ((1U << op) - 1)); + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in; + strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? + (INFLATE_FAST_MIN_INPUT - 1) + (last - in) : + (INFLATE_FAST_MIN_INPUT - 1) - (in - last)); + strm->avail_out = (unsigned)(out < end ? + (INFLATE_FAST_MIN_OUTPUT - 1) + (end - out) : + (INFLATE_FAST_MIN_OUTPUT - 1) - (out - end)); + state->hold = hold; + state->bits = bits; + + Assert((state->hold >> state->bits) == 0, "invalid input data state"); +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.h new file mode 100644 index 000000000..e75ee5e91 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inffast_chunk.h @@ -0,0 +1,42 @@ +/* inffast_chunk.h -- header to use inffast_chunk.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * Copyright (C) 2017 ARM, Inc. + * Copyright 2023 The Chromium Authors + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#include "inffast.h" + +/* INFLATE_FAST_MIN_INPUT: + The minimum number of input bytes needed so that we can safely call + inflate_fast() with only one up-front bounds check. One + length/distance code pair (15 bits for the length code, 5 bits for length + extra, 15 bits for the distance code, 13 bits for distance extra) requires + reading up to 48 input bits. Additionally, in the same iteraction, we may + decode two literals from the root-table (requiring MIN_OUTPUT = 258 + 2). + + Each root-table entry is up to 10 bits, for a total of 68 input bits each + iteraction. + + The refill variant reads 8 bytes from the buffer at a time, and advances + the input pointer by up to 7 bytes, ensuring there are at least 56-bits + available in the bit-buffer. The technique was documented by Fabian Giesen + on his blog as variant 4 in the article 'Reading bits in far too many ways': + https://fgiesen.wordpress.com/2018/02/20/ + + In the worst case, we may refill twice in the same iteraction, requiring + MIN_INPUT = 8 + 7. +*/ +#ifdef INFLATE_CHUNK_READ_64LE +#undef INFLATE_FAST_MIN_INPUT +#define INFLATE_FAST_MIN_INPUT 15 +#undef INFLATE_FAST_MIN_OUTPUT +#define INFLATE_FAST_MIN_OUTPUT 260 +#endif + +void ZLIB_INTERNAL inflate_fast_chunk_(z_streamp strm, unsigned start); diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inflate.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inflate.c new file mode 100644 index 000000000..2a8e0ef76 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/inflate.c @@ -0,0 +1,1562 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2022 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "contrib/optimizations/inffast_chunk.h" +#include "contrib/optimizations/chunkcopy.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +local int inflateStateCheck(z_streamp strm) { + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + +int ZEXPORT inflateResetKeep(z_streamp strm) { + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->flags = -1; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(z_streamp strm) { + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(z_streamp strm, int windowBits) { + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + if (windowBits < -15) + return Z_STREAM_ERROR; + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size) { + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ + state->check = 1L; /* 1L is the result of adler32() zero length data */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(z_streamp strm, const char *version, + int stream_size) { + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) { + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + if (bits == 0) + return Z_OK; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(struct inflate_state FAR *state) { +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed(void) +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) { + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + unsigned wsize = 1U << state->wbits; + state->window = (unsigned char FAR *) + ZALLOC(strm, wsize + CHUNKCOPY_CHUNK_SIZE, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; +#ifdef INFLATE_CLEAR_UNUSED_UNDEFINED + /* Copies from the overflow portion of this buffer are undefined and + may cause analysis tools to raise a warning if we don't initialize + it. However, this undefined data overwrites other undefined data + and is subsequently either overwritten or left deliberately + undefined at the end of decode; so there's really no point. + */ + zmemzero(state->window + wsize, CHUNKCOPY_CHUNK_SIZE); +#endif + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE_CHECK(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(z_streamp strm, int flush) { + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + if (len > 15 || len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + state->flags = 0; /* indicate zlib header */ + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + /* fallthrough */ + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + /* fallthrough */ + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + /* fallthrough */ + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + /* fallthrough */ + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL && + (len = state->head->extra_len - state->length) < + state->head->extra_max) { + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + /* fallthrough */ + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + /* fallthrough */ + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + /* fallthrough */ + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + /* fallthrough */ + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + /* fallthrough */ + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + /* fallthrough */ + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ + case COPY_: + state->mode = COPY; + /* fallthrough */ + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + /* fallthrough */ + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + /* fallthrough */ + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (10 and 9) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 10; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 9; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ + case LEN_: + state->mode = LEN; + /* fallthrough */ + case LEN: + if (have >= INFLATE_FAST_MIN_INPUT && + left >= INFLATE_FAST_MIN_OUTPUT) { + RESTORE(); + inflate_fast_chunk_(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + /* fallthrough */ + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + /* fallthrough */ + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + /* fallthrough */ + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + /* fallthrough */ + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + put = chunkcopy_safe(put, from, copy, put + left); + } + else { /* copy from output */ + copy = state->length; + if (copy > left) copy = left; + put = chunkcopy_lapped_safe(put, state->offset, copy, put + left); + } + left -= copy; + state->length -= copy; + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE_CHECK(state->check, put - out, out); + out = left; + if ((state->wrap & 4) && ( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + /* fallthrough */ + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + /* fallthrough */ + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + /* fallthrough */ + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: +#if defined(ZLIB_DEBUG) + /* XXX(cavalcantii): I put this in place back in 2017 to help debug faulty + * client code relying on undefined behavior when chunk_copy first landed. + * + * It is save to say after all these years that Chromium code is well + * behaved and works fine with the optimization, therefore we can enable + * this only for DEBUG builds. + * + * We write a defined value in the unused space to help mark + * where the stream has ended. We don't use zeros as that can + * mislead clients relying on undefined behavior (i.e. assuming + * that the data is over when the buffer has a zero/null value). + * + * The basic idea is that if client code is not relying on the zlib context + * to inform the amount of decompressed data, but instead reads the output + * buffer until a zero/null is found, it will fail faster and harder + * when the remaining of the buffer is marked with a symbol (e.g. 0x55). + */ + if (left >= CHUNKCOPY_CHUNK_SIZE) + memset(put, 0x55, CHUNKCOPY_CHUNK_SIZE); + else + memset(put, 0x55, left); +#endif + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE_CHECK(state->check, strm->next_out - out, out); + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(z_streamp strm) { + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) { + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf, + unsigned len) { + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(z_streamp strm) { + unsigned len; /* number of bytes to look at or looked at */ + int flags; /* temporary to save header status */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + if (state->flags == -1) + state->wrap = 0; /* if no header yet, treat as raw */ + else + state->wrap &= ~4; /* no point in computing a check value now */ + flags = state->flags; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->flags = flags; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(z_streamp strm) { + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) { + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (inflateStateCheck(source) || dest == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *)ZALLOC( + source, (1U << state->wbits) + CHUNKCOPY_CHUNK_SIZE, + sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(z_streamp strm, int subvert) { + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; + return Z_OK; +#else + (void)subvert; + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +int ZEXPORT inflateValidate(z_streamp strm, int check) { + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check && state->wrap) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + +long ZEXPORT inflateMark(z_streamp strm) { + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) + return -(1L << 16); + state = (struct inflate_state FAR *)strm->state; + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} + +unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) { + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/insert_string.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/insert_string.h new file mode 100644 index 000000000..260b82680 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/optimizations/insert_string.h @@ -0,0 +1,80 @@ +/* insert_string.h + * + * Copyright 2019 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#ifndef INSERT_STRING_H +#define INSERT_STRING_H + +#ifndef INLINE +#if defined(_MSC_VER) && !defined(__clang__) +#define INLINE __inline +#else +#define INLINE inline +#endif +#endif + +#include + +/** + * Some applications need to match zlib DEFLATE output exactly [3]. Use the + * canonical zlib Rabin-Karp rolling hash [1,2] in that case. + * + * [1] For a description of the Rabin and Karp algorithm, see "Algorithms" + * book by R. Sedgewick, Addison-Wesley, p252. + * [2] https://www.euccas.me/zlib/#zlib_rabin_karp and also "rolling hash" + * https://en.wikipedia.org/wiki/Rolling_hash + * [3] crbug.com/1316541 AOSP incremental client APK package OTA upgrades. + */ +#ifdef CHROMIUM_ZLIB_NO_CASTAGNOLI +#define USE_ZLIB_RABIN_KARP_ROLLING_HASH +#endif + +/* =========================================================================== + * Update a hash value with the given input byte (Rabin-Karp rolling hash). + * IN assertion: all calls to UPDATE_HASH are made with consecutive input + * characters, so that a running hash key can be computed from the previous + * key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s, h, c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask) + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). + */ +local INLINE Pos insert_string(deflate_state* const s, const Pos str) { + Pos ret; +/* insert_string dictionary insertion: ANZAC++ hasher + * significantly improves data compression speed. + * + * Note: the generated compressed output is a valid DEFLATE stream, but will + * differ from canonical zlib output. + */ +#if defined(USE_ZLIB_RABIN_KARP_ROLLING_HASH) + UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH - 1)]); +#else + uint32_t value; + // Validated for little endian archs (i.e. x86, Arm). YMMV for big endian. + zmemcpy(&value, &s->window[str], sizeof(value)); + s->ins_h = ((value * 66521 + 66521) >> 16) & s->hash_mask; +#endif + +#ifdef FASTEST + ret = s->head[s->ins_h]; +#else + ret = s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = str; + + return ret; +} + +#endif /* INSERT_STRING_H */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/DEPS b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/DEPS new file mode 100644 index 000000000..67973613c --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/DEPS @@ -0,0 +1,5 @@ +include_rules = [ + "+testing/gtest", + "+third_party/zlib/contrib/minizip", + "+base", +] diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/OWNERS b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/OWNERS new file mode 100644 index 000000000..aa6a2d1bb --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/OWNERS @@ -0,0 +1,2 @@ +cblume@chromium.org +cavalcantii@chromium.org diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/BUILD.gn new file mode 100644 index 000000000..16e918a72 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/BUILD.gn @@ -0,0 +1,40 @@ +# Copyright 2017 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//testing/libfuzzer/fuzzer_test.gni") + +# root BUILD depends on this target. Needed for package discovery +group("fuzzers") { +} + +fuzzer_test("zlib_uncompress_fuzzer") { + sources = [ "uncompress_fuzzer.cc" ] + deps = [ "../../../:zlib" ] +} + +fuzzer_test("zlib_inflate_fuzzer") { + sources = [ "inflate_fuzzer.cc" ] + deps = [ "../../../:zlib" ] +} + +fuzzer_test("zlib_inflate_with_header_fuzzer") { + sources = [ "inflate_with_header_fuzzer.cc" ] + deps = [ "../../../:zlib" ] +} + +fuzzer_test("zlib_streaming_inflate_fuzzer") { + sources = [ "streaming_inflate_fuzzer.cc" ] + deps = [ "../../../:zlib" ] + libfuzzer_options = [ "max_len=256000" ] +} + +fuzzer_test("zlib_deflate_set_dictionary_fuzzer") { + sources = [ "deflate_set_dictionary_fuzzer.cc" ] + deps = [ "../../../:zlib" ] +} + +fuzzer_test("zlib_deflate_fuzzer") { + sources = [ "deflate_fuzzer.cc" ] + deps = [ "../../../:zlib" ] +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/OWNERS b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/OWNERS new file mode 100644 index 000000000..ff3256199 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/OWNERS @@ -0,0 +1,2 @@ +cblume@chromium.org +hans@chromium.org diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc new file mode 100644 index 000000000..64892bc55 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc @@ -0,0 +1,80 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include + +#include "zlib.h" + +// Fuzzer builds often have NDEBUG set, so roll our own assert macro. +#define ASSERT(cond) \ + do { \ + if (!(cond)) { \ + fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \ + exit(1); \ + } \ + } while (0) + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + FuzzedDataProvider fdp(data, size); + int level = fdp.PickValueInArray({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); + int windowBits = fdp.PickValueInArray({9, 10, 11, 12, 13, 14, 15}); + int memLevel = fdp.PickValueInArray({1, 2, 3, 4, 5, 6, 7, 8, 9}); + int strategy = fdp.PickValueInArray( + {Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED}); + std::vector src = fdp.ConsumeRemainingBytes(); + + z_stream stream; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + + // Compress the data one byte at a time to exercise the streaming code. + int ret = + deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + ASSERT(ret == Z_OK); + + size_t deflate_bound = deflateBound(&stream, src.size()); + + std::vector compressed(src.size() * 2 + 1000); + stream.next_out = compressed.data(); + stream.avail_out = compressed.size(); + for (uint8_t b : src) { + stream.next_in = &b; + stream.avail_in = 1; + ret = deflate(&stream, Z_NO_FLUSH); + ASSERT(ret == Z_OK); + } + stream.next_in = Z_NULL; + stream.avail_in = 0; + ret = deflate(&stream, Z_FINISH); + ASSERT(ret == Z_STREAM_END); + compressed.resize(compressed.size() - stream.avail_out); + deflateEnd(&stream); + + // Check that the bound was correct. + ASSERT(compressed.size() <= deflate_bound); + + // Verify that the data decompresses correctly. + ret = inflateInit2(&stream, windowBits); + ASSERT(ret == Z_OK); + // Make room for at least one byte so it's never empty. + std::vector decompressed(src.size() + 1); + stream.next_in = compressed.data(); + stream.avail_in = compressed.size(); + stream.next_out = decompressed.data(); + stream.avail_out = decompressed.size(); + ret = inflate(&stream, Z_FINISH); + ASSERT(ret == Z_STREAM_END); + decompressed.resize(decompressed.size() - stream.avail_out); + inflateEnd(&stream); + + ASSERT(decompressed == src); + + return 0; +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc new file mode 100644 index 000000000..96778209f --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc @@ -0,0 +1,43 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include +#include + +#include "zlib.h" + +static Bytef buffer[256 * 1024] = {0}; + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + // We need to strip the 'const' for zlib. + std::vector input_buffer{data, data + size}; + + uLongf buffer_length = static_cast(sizeof(buffer)); + + z_stream stream; + stream.next_in = input_buffer.data(); + stream.avail_in = size; + stream.total_in = size; + stream.next_out = buffer; + stream.avail_out = buffer_length; + stream.total_out = buffer_length; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + + if (Z_OK != deflateInit(&stream, Z_DEFAULT_COMPRESSION)) { + deflateEnd(&stream); + assert(false); + } + + auto deflate_set_dictionary_result = + deflateSetDictionary(&stream, data, size); + deflateEnd(&stream); + if (Z_OK != deflate_set_dictionary_result) + assert(false); + + return 0; +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc new file mode 100644 index 000000000..d9d62026e --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc @@ -0,0 +1,41 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include +#include +#include + +#include "zlib.h" + +static Bytef buffer[256 * 1024] = {0}; + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + // We need to strip the 'const' for zlib + std::vector input_buffer{data, data+size}; + + uLongf buffer_length = static_cast(sizeof(buffer)); + + z_stream stream; + stream.next_in = input_buffer.data(); + stream.avail_in = size; + stream.total_in = size; + stream.next_out = buffer; + stream.avail_out = buffer_length; + stream.total_out = buffer_length; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + + if (Z_OK != inflateInit(&stream)) { + inflateEnd(&stream); + assert(false); + } + + inflate(&stream, Z_NO_FLUSH); + inflateEnd(&stream); + + return 0; +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_with_header_fuzzer.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_with_header_fuzzer.cc new file mode 100644 index 000000000..dfb5b39a7 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/inflate_with_header_fuzzer.cc @@ -0,0 +1,95 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include +#include +#include +#include + +#include + +#include "zlib.h" + +// Fuzzer builds often have NDEBUG set, so roll our own assert macro. +#define ASSERT(cond) \ + do { \ + if (!(cond)) { \ + fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \ + exit(1); \ + } \ + } while (0) + +static void chunked_inflate(gz_header* header, + uint8_t* data, + size_t size, + size_t in_chunk_size, + size_t out_chunk_size) { + z_stream stream; + stream.next_in = data; + stream.avail_in = 0; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + + static const int kDefaultWindowBits = MAX_WBITS; + static const int kGzipOrZlibHeader = 32; + ASSERT(inflateInit2(&stream, kDefaultWindowBits + kGzipOrZlibHeader) == Z_OK); + ASSERT(inflateGetHeader(&stream, header) == Z_OK); + + auto out_buffer = std::make_unique(out_chunk_size); + while (true) { + stream.next_in = &data[stream.total_in]; + stream.avail_in = + std::min(in_chunk_size, size - static_cast(stream.total_in)); + stream.next_out = out_buffer.get(); + stream.avail_out = out_chunk_size; + + if (inflate(&stream, stream.avail_in == 0 ? Z_SYNC_FLUSH : Z_NO_FLUSH) != + Z_OK) { + break; + } + } + + inflateEnd(&stream); +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + if (size > 250 * 1024) { + // Cap the input size so the fuzzer doesn't time out. For example, + // crbug.com/1362206 saw timeouts with 450 KB input, so use a limit that's + // well below that but still large enough to hit most code. + return 0; + } + + FuzzedDataProvider fdp(data, size); + + // Fuzz zlib's inflate() with inflateGetHeader() enabled, various sizes for + // the gz_header field sizes, and various-sized chunks for input/output. This + // would have found CVE-2022-37434 which was a heap buffer read overflow when + // filling in gz_header's extra field. + + gz_header header; + header.extra_max = fdp.ConsumeIntegralInRange(0, 100000); + header.name_max = fdp.ConsumeIntegralInRange(0, 100000); + header.comm_max = fdp.ConsumeIntegralInRange(0, 100000); + + auto extra_buf = std::make_unique(header.extra_max); + auto name_buf = std::make_unique(header.name_max); + auto comment_buf = std::make_unique(header.comm_max); + + header.extra = extra_buf.get(); + header.name = name_buf.get(); + header.comment = comment_buf.get(); + + size_t in_chunk_size = fdp.ConsumeIntegralInRange(1, 4097); + size_t out_chunk_size = fdp.ConsumeIntegralInRange(1, 4097); + std::vector remaining_data = fdp.ConsumeRemainingBytes(); + + chunked_inflate(&header, remaining_data.data(), remaining_data.size(), + in_chunk_size, out_chunk_size); + + return 0; +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc new file mode 100644 index 000000000..dac170a0f --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc @@ -0,0 +1,74 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include +#include + +#include "zlib.h" + +// Fuzzer builds often have NDEBUG set, so roll our own assert macro. +#define ASSERT(cond) \ + do { \ + if (!(cond)) { \ + fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \ + exit(1); \ + } \ + } while (0) + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + // Deflate data. + z_stream comp_strm; + comp_strm.zalloc = Z_NULL; + comp_strm.zfree = Z_NULL; + comp_strm.opaque = Z_NULL; + int ret = deflateInit(&comp_strm, Z_DEFAULT_COMPRESSION); + ASSERT(ret == Z_OK); + + size_t comp_buf_cap = deflateBound(&comp_strm, size); + uint8_t* comp_buf = (uint8_t*)malloc(comp_buf_cap); + ASSERT(comp_buf != nullptr); + comp_strm.next_out = comp_buf; + comp_strm.avail_out = comp_buf_cap; + comp_strm.next_in = (unsigned char*)data; + comp_strm.avail_in = size; + ret = deflate(&comp_strm, Z_FINISH); + ASSERT(ret == Z_STREAM_END); + size_t comp_sz = comp_buf_cap - comp_strm.avail_out; + + // Inflate comp_buf one chunk at a time. + z_stream decomp_strm; + decomp_strm.zalloc = Z_NULL; + decomp_strm.zfree = Z_NULL; + decomp_strm.opaque = Z_NULL; + ret = inflateInit(&decomp_strm); + ASSERT(ret == Z_OK); + decomp_strm.next_in = comp_buf; + decomp_strm.avail_in = comp_sz; + + while (decomp_strm.avail_in > 0) { + uint8_t decomp_buf[1024]; + decomp_strm.next_out = decomp_buf; + decomp_strm.avail_out = sizeof(decomp_buf); + ret = inflate(&decomp_strm, Z_FINISH); + ASSERT(ret == Z_OK || ret == Z_STREAM_END || ret == Z_BUF_ERROR); + + // Verify the output bytes. + size_t num_out = sizeof(decomp_buf) - decomp_strm.avail_out; + for (size_t i = 0; i < num_out; i++) { + ASSERT(decomp_buf[i] == data[decomp_strm.total_out - num_out + i]); + } + } + + ret = deflateEnd(&comp_strm); + ASSERT(ret == Z_OK); + free(comp_buf); + + inflateEnd(&decomp_strm); + ASSERT(ret == Z_OK); + + return 0; +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc new file mode 100644 index 000000000..e63a8c058 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc @@ -0,0 +1,21 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include + +#include "zlib.h" + +static Bytef buffer[256 * 1024] = {0}; + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + uLongf buffer_length = static_cast(sizeof(buffer)); + if (Z_OK != + uncompress(buffer, &buffer_length, data, static_cast(size))) { + return 0; + } + return 0; +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.cc new file mode 100644 index 000000000..4c55d5d7d --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.cc @@ -0,0 +1,745 @@ +/* infcover.c -- test zlib's inflate routines with full code coverage + * Copyright (C) 2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* to use, do: ./configure --cover && make cover */ +// clang-format off +#include "infcover.h" +#include +#include +#include + +#include "zlib.h" + +/* get definition of internal structure so we can mess with it (see pull()), + and so we can call inflate_trees() (see cover5()) */ +#define ZLIB_INTERNAL +#include "inftrees.h" +#include "inflate.h" + +/* XXX: use C++ streams instead of printf/fputs/etc due to portability + * as type sizes can vary between platforms. + */ +#include +#define local static + +/* XXX: hacking C assert and plugging into GTest. */ +#include "gtest.h" +#if defined(assert) +#undef assert +#define assert EXPECT_TRUE +#endif + +/* XXX: handle what is a reserved word in C++. */ +#define try try_f + +/* -- memory tracking routines -- */ + +/* + These memory tracking routines are provided to zlib and track all of zlib's + allocations and deallocations, check for LIFO operations, keep a current + and high water mark of total bytes requested, optionally set a limit on the + total memory that can be allocated, and when done check for memory leaks. + + They are used as follows: + + z_stream strm; + mem_setup(&strm) initializes the memory tracking and sets the + zalloc, zfree, and opaque members of strm to use + memory tracking for all zlib operations on strm + mem_limit(&strm, limit) sets a limit on the total bytes requested -- a + request that exceeds this limit will result in an + allocation failure (returns NULL) -- setting the + limit to zero means no limit, which is the default + after mem_setup() + mem_used(&strm, "msg") prints to stderr "msg" and the total bytes used + mem_high(&strm, "msg") prints to stderr "msg" and the high water mark + mem_done(&strm, "msg") ends memory tracking, releases all allocations + for the tracking as well as leaked zlib blocks, if + any. If there was anything unusual, such as leaked + blocks, non-FIFO frees, or frees of addresses not + allocated, then "msg" and information about the + problem is printed to stderr. If everything is + normal, nothing is printed. mem_done resets the + strm members to Z_NULL to use the default memory + allocation routines on the next zlib initialization + using strm. + */ + +/* these items are strung together in a linked list, one for each allocation */ +struct mem_item { + void *ptr; /* pointer to allocated memory */ + size_t size; /* requested size of allocation */ + struct mem_item *next; /* pointer to next item in list, or NULL */ +}; + +/* this structure is at the root of the linked list, and tracks statistics */ +struct mem_zone { + struct mem_item *first; /* pointer to first item in list, or NULL */ + size_t total, highwater; /* total allocations, and largest total */ + size_t limit; /* memory allocation limit, or 0 if no limit */ + int notlifo, rogue; /* counts of non-LIFO frees and rogue frees */ +}; + +/* memory allocation routine to pass to zlib */ +local void *mem_alloc(void *mem, unsigned count, unsigned size) +{ + void *ptr; + struct mem_item *item; + struct mem_zone *zone = static_cast(mem); + size_t len = count * (size_t)size; + + /* induced allocation failure */ + if (zone == NULL || (zone->limit && zone->total + len > zone->limit)) + return NULL; + + /* perform allocation using the standard library, fill memory with a + non-zero value to make sure that the code isn't depending on zeros */ + ptr = malloc(len); + if (ptr == NULL) + return NULL; + memset(ptr, 0xa5, len); + + /* create a new item for the list */ + item = static_cast(malloc(sizeof(struct mem_item))); + if (item == NULL) { + free(ptr); + return NULL; + } + item->ptr = ptr; + item->size = len; + + /* insert item at the beginning of the list */ + item->next = zone->first; + zone->first = item; + + /* update the statistics */ + zone->total += item->size; + if (zone->total > zone->highwater) + zone->highwater = zone->total; + + /* return the allocated memory */ + return ptr; +} + +/* memory free routine to pass to zlib */ +local void mem_free(void *mem, void *ptr) +{ + struct mem_item *item, *next; + struct mem_zone *zone = static_cast(mem); + + /* if no zone, just do a free */ + if (zone == NULL) { + free(ptr); + return; + } + + /* point next to the item that matches ptr, or NULL if not found -- remove + the item from the linked list if found */ + next = zone->first; + if (next) { + if (next->ptr == ptr) + zone->first = next->next; /* first one is it, remove from list */ + else { + do { /* search the linked list */ + item = next; + next = item->next; + } while (next != NULL && next->ptr != ptr); + if (next) { /* if found, remove from linked list */ + item->next = next->next; + zone->notlifo++; /* not a LIFO free */ + } + + } + } + + /* if found, update the statistics and free the item */ + if (next) { + zone->total -= next->size; + free(next); + } + + /* if not found, update the rogue count */ + else + zone->rogue++; + + /* in any case, do the requested free with the standard library function */ + free(ptr); +} + +/* set up a controlled memory allocation space for monitoring, set the stream + parameters to the controlled routines, with opaque pointing to the space */ +local void mem_setup(z_stream *strm) +{ + struct mem_zone *zone; + + zone = static_cast(malloc(sizeof(struct mem_zone))); + assert(zone != NULL); + zone->first = NULL; + zone->total = 0; + zone->highwater = 0; + zone->limit = 0; + zone->notlifo = 0; + zone->rogue = 0; + strm->opaque = zone; + strm->zalloc = mem_alloc; + strm->zfree = mem_free; +} + +/* set a limit on the total memory allocation, or 0 to remove the limit */ +local void mem_limit(z_stream *strm, size_t limit) +{ + struct mem_zone *zone = static_cast(strm->opaque); + + zone->limit = limit; +} + +/* show the current total requested allocations in bytes */ +local void mem_used(z_stream *strm, const char *prefix) +{ + struct mem_zone *zone = static_cast(strm->opaque); + + std::cout << prefix << ": " << zone->total << " allocated" << std::endl; +} + +/* show the high water allocation in bytes */ +local void mem_high(z_stream *strm, const char *prefix) +{ + struct mem_zone *zone = static_cast(strm->opaque); + + std::cout << prefix << ": " << zone->highwater << " high water mark" << std::endl; +} + +/* release the memory allocation zone -- if there are any surprises, notify */ +local void mem_done(z_stream *strm, const char *prefix) +{ + int count = 0; + struct mem_item *item, *next; + struct mem_zone *zone = static_cast(strm->opaque); + + /* show high water mark */ + mem_high(strm, prefix); + + /* free leftover allocations and item structures, if any */ + item = zone->first; + while (item != NULL) { + free(item->ptr); + next = item->next; + free(item); + item = next; + count++; + } + + /* issue alerts about anything unexpected */ + if (count || zone->total) + std::cout << "** " << prefix << ": " + << zone->total << " bytes in " + << count << " blocks not freed" + << std::endl; + + if (zone->notlifo) + std::cout << "** " << prefix << ": " + << zone->notlifo << " frees not LIFO" + << std::endl; + + if (zone->rogue) + std::cout << "** " << prefix << ": " + << zone->rogue << " frees not recognized" + << std::endl; + + /* free the zone and delete from the stream */ + free(zone); + strm->opaque = Z_NULL; + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; +} + +/* -- inflate test routines -- */ + +/* Decode a hexadecimal string, set *len to length, in[] to the bytes. This + decodes liberally, in that hex digits can be adjacent, in which case two in + a row writes a byte. Or they can be delimited by any non-hex character, + where the delimiters are ignored except when a single hex digit is followed + by a delimiter, where that single digit writes a byte. The returned data is + allocated and must eventually be freed. NULL is returned if out of memory. + If the length is not needed, then len can be NULL. */ +local unsigned char *h2b(const char *hex, unsigned *len) +{ + unsigned char *in, *re; + unsigned next, val; + + in = static_cast(malloc((strlen(hex) + 1) >> 1)); + if (in == NULL) + return NULL; + next = 0; + val = 1; + do { + if (*hex >= '0' && *hex <= '9') + val = (val << 4) + *hex - '0'; + else if (*hex >= 'A' && *hex <= 'F') + val = (val << 4) + *hex - 'A' + 10; + else if (*hex >= 'a' && *hex <= 'f') + val = (val << 4) + *hex - 'a' + 10; + else if (val != 1 && val < 32) /* one digit followed by delimiter */ + val += 240; /* make it look like two digits */ + if (val > 255) { /* have two digits */ + in[next++] = val & 0xff; /* save the decoded byte */ + val = 1; /* start over */ + } + } while (*hex++); /* go through the loop with the terminating null */ + if (len != NULL) + *len = next; + re = static_cast(realloc(in, next)); + return re == NULL ? in : re; +} + +/* generic inflate() run, where hex is the hexadecimal input data, what is the + text to include in an error message, step is how much input data to feed + inflate() on each call, or zero to feed it all, win is the window bits + parameter to inflateInit2(), len is the size of the output buffer, and err + is the error code expected from the first inflate() call (the second + inflate() call is expected to return Z_STREAM_END). If win is 47, then + header information is collected with inflateGetHeader(). If a zlib stream + is looking for a dictionary, then an empty dictionary is provided. + inflate() is run until all of the input data is consumed. */ +local void inf(const char *hex, const char *what, unsigned step, int win, unsigned len, + int err) +{ + int ret; + unsigned have; + unsigned char *in, *out; + z_stream strm, copy; + gz_header head; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, win); + if (ret != Z_OK) { + mem_done(&strm, what); + return; + } + out = static_cast(malloc(len)); assert(out != NULL); + if (win == 47) { + head.extra = out; + head.extra_max = len; + head.name = out; + head.name_max = len; + head.comment = out; + head.comm_max = len; + ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK); + } + in = h2b(hex, &have); assert(in != NULL); + if (step == 0 || step > have) + step = have; + strm.avail_in = step; + have -= step; + strm.next_in = in; + do { + strm.avail_out = len; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); assert(err == 9 || ret == err); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT) + break; + if (ret == Z_NEED_DICT) { + ret = inflateSetDictionary(&strm, in, 1); + assert(ret == Z_DATA_ERROR); + mem_limit(&strm, 1); + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ((struct inflate_state *)strm.state)->mode = DICT; + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_OK); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_BUF_ERROR); + } + ret = inflateCopy(©, &strm); assert(ret == Z_OK); + ret = inflateEnd(©); assert(ret == Z_OK); + err = 9; /* don't care next time around */ + have += strm.avail_in; + strm.avail_in = step > have ? have : step; + have -= strm.avail_in; + } while (strm.avail_in); + free(in); + free(out); + ret = inflateReset2(&strm, -8); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, what); +} + +/* cover all of the lines in inflate.c up to inflate() */ +void cover_support(void) +{ + int ret; + z_stream strm; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + mem_used(&strm, "inflate init"); + ret = inflatePrime(&strm, 5, 31); assert(ret == Z_OK); + ret = inflatePrime(&strm, -1, 0); assert(ret == Z_OK); + ret = inflateSetDictionary(&strm, Z_NULL, 0); + assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "prime"); + + inf("63 0", "force window allocation", 0, -15, 1, Z_OK); + inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK); + inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK); + inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END); + inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit_(&strm, "!", (int)sizeof(z_stream)); + assert(ret == Z_VERSION_ERROR); + mem_done(&strm, "wrong version"); + + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + std::cout << "inflate built-in memory routines" << std::endl;; +} + +/* cover all inflate() header and trailer cases and code after inflate() */ +void cover_wrap(void) +{ + int ret; + z_stream strm, copy; + unsigned char dict[257]; + + ret = inflate(Z_NULL, 0); assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + ret = inflateCopy(Z_NULL, Z_NULL); assert(ret == Z_STREAM_ERROR); + std::cout << "inflate bad parameters" << std::endl; + + inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR); + inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR); + inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR); + inf("8 99", "set window size from header", 0, 0, 0, Z_OK); + inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR); + inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END); + inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1, + Z_DATA_ERROR); + inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length", + 0, 47, 0, Z_STREAM_END); + inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR); + inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT); + inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -8); + strm.avail_in = 2; + strm.next_in = (Bytef *)"\x63"; + strm.avail_out = 1; + strm.next_out = (Bytef *)&ret; + mem_limit(&strm, 1); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + memset(dict, 0, 257); + ret = inflateSetDictionary(&strm, dict, 257); + assert(ret == Z_OK); + mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256); + ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (Bytef *)"\x80"; + ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); + strm.avail_in = 4; + strm.next_in = (Bytef *)"\0\0\xff\xff"; + ret = inflateSync(&strm); assert(ret == Z_OK); + (void)inflateSyncPoint(&strm); + ret = inflateCopy(©, &strm); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ret = inflateUndermine(&strm, 1); assert(ret == Z_DATA_ERROR); + (void)inflateMark(&strm); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "miscellaneous, force memory errors"); +} + +/* input and output functions for inflateBack() */ +local unsigned pull(void *desc, unsigned char **buf) +{ + static unsigned int next = 0; + static unsigned char dat[] = {0x63, 0, 2, 0}; + struct inflate_state *state; + + if (desc == Z_NULL) { + next = 0; + return 0; /* no input (already provided at next_in) */ + } + state = reinterpret_cast(((z_stream *)desc)->state); + if (state != Z_NULL) + state->mode = SYNC; /* force an otherwise impossible situation */ + return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0; +} + +local int push(void *desc, unsigned char *buf, unsigned len) +{ + (void)buf; + (void)len; + return desc != Z_NULL; /* force error if desc not null */ +} + +/* cover inflateBack() up to common deflate data cases and after those */ +void cover_back(void) +{ + int ret; + z_stream strm; + unsigned char win[32768]; + + ret = inflateBackInit_(Z_NULL, 0, win, 0, 0); + assert(ret == Z_VERSION_ERROR); + ret = inflateBackInit(Z_NULL, 0, win); assert(ret == Z_STREAM_ERROR); + ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + std::cout << "inflateBack bad parameters" << std::endl;; + + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (Bytef *)"\x03"; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret == Z_STREAM_END); + /* force output error */ + strm.avail_in = 3; + strm.next_in = (Bytef *)"\x63\x00"; + ret = inflateBack(&strm, pull, Z_NULL, push, &strm); + assert(ret == Z_BUF_ERROR); + /* force mode error by mucking with state */ + ret = inflateBack(&strm, pull, &strm, push, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "inflateBack bad state"); + + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + std::cout << "inflateBack built-in memory routines" << std::endl;; +} + +/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */ +local int try(const char *hex, const char *id, int err) +{ + int ret; + unsigned len, size; + unsigned char *in, *out, *win; + char *prefix; + z_stream strm; + + /* convert to hex */ + in = h2b(hex, &len); + assert(in != NULL); + + /* allocate work areas */ + size = len << 3; + out = static_cast(malloc(size)); + assert(out != NULL); + win = static_cast(malloc(32768)); + assert(win != NULL); + prefix = static_cast(malloc(strlen(id) + 6)); + assert(prefix != NULL); + + /* first with inflate */ + strcpy(prefix, id); + strcat(prefix, "-late"); + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, err < 0 ? 47 : -15); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + do { + strm.avail_out = size; + strm.next_out = out; + ret = inflate(&strm, Z_TREES); + assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR); + if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT) + break; + } while (strm.avail_in || strm.avail_out == 0); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateEnd(&strm); + mem_done(&strm, prefix); + + /* then with inflateBack */ + if (err >= 0) { + strcpy(prefix, id); + strcat(prefix, "-back"); + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret != Z_STREAM_ERROR); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateBackEnd(&strm); + mem_done(&strm, prefix); + } + + /* clean up */ + free(prefix); + free(win); + free(out); + free(in); + return ret; +} + +/* cover deflate data cases in both inflate() and inflateBack() */ +void cover_inflate(void) +{ + try("0 0 0 0 0", "invalid stored block lengths", 1); + try("3 0", "fixed", 0); + try("6", "invalid block type", 1); + try("1 1 0 fe ff 0", "stored", 0); + try("fc 0 0", "too many length or distance symbols", 1); + try("4 0 fe ff", "invalid code lengths set", 1); + try("4 0 24 49 0", "invalid bit length repeat", 1); + try("4 0 24 e9 ff ff", "invalid bit length repeat", 1); + try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1); + try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0", + "invalid literal/lengths set", 1); + try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1); + try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1); + try("2 7e ff ff", "invalid distance code", 1); + try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1); + + /* also trailer mismatch just in inflate() */ + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1); + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1", + "incorrect length check", -1); + try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0); + try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f", + "long code", 0); + try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0); + try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c", + "long distance and extra", 0); + try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0); + inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258, + Z_STREAM_END); + inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK); +} + +/* XXX(cavalcantii): fix linking error due inflate_table. */ +/* cover remaining lines in inftrees.c */ +/* void cover_trees(void) */ +/* { */ +/* int ret; */ +/* unsigned bits; */ +/* unsigned short lens[16], work[16]; */ +/* code *next, table[ENOUGH_DISTS]; */ + +/* /\* we need to call inflate_table() directly in order to manifest not- */ +/* enough errors, since zlib insures that enough is always enough *\/ */ +/* for (bits = 0; bits < 15; bits++) */ +/* lens[bits] = (unsigned short)(bits + 1); */ +/* lens[15] = 15; */ +/* next = table; */ +/* bits = 15; */ +/* ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */ +/* assert(ret == 1); */ +/* next = table; */ +/* bits = 1; */ +/* ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */ +/* assert(ret == 1); */ +/* fputs("inflate_table not enough errors\n", stderr); */ +/* } */ + +/* cover remaining inffast.c decoding and window copying */ +void cover_fast(void) +{ + inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68" + " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR); + inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49" + " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258, + Z_DATA_ERROR); + inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258, + Z_DATA_ERROR); + inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258, + Z_DATA_ERROR); + inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0", + "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR); + inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK); + inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0", + "contiguous and wrap around window", 6, -8, 259, Z_OK); + inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259, + Z_STREAM_END); +} + +/* Adapted from Evgeny Legerov PoC (https://github.com/ivd38/zlib_overflow) + * this test case crashes in ASAN builds with the correct payload. + */ +local void inf_cve_2022_37434(char *hex, char *what, unsigned step, int win, unsigned len, + int err) +{ + int ret; + unsigned have; + unsigned char *in, *out; + z_stream strm, copy; + gz_header head; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, win); + if (ret != Z_OK) { + mem_done(&strm, what); + return; + } + out = static_cast(malloc(len)); assert(out != NULL); + if (win == 47) { + head.extra = out; + head.extra_max = len; + head.name = out; + head.name_max = len; + head.comment = out; + head.comm_max = len; + ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK); + } + in = h2b(hex, &have); assert(in != NULL); + if (step == 0 || step > have) + step = have; + strm.avail_in = step; + have -= step; + strm.next_in = in; + do { + strm.avail_out = len; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT) + break; + have += strm.avail_in; + strm.avail_in = step > have ? have : step; + have -= strm.avail_in; + } while (strm.avail_in); + free(in); + free(out); + ret = inflateReset2(&strm, -8); + ret = inflateEnd(&strm); + mem_done(&strm, what); +} + +void cover_CVE_2022_37434(void) +{ + char payload[] = "1f 8b 08 04 61 62 63 64 61 62 52 51 1f 8b 08 04 61 62 63 64 61 62 52 51 1f 8b 08 04 61 62 63 64 61 62 52 51 1f 8b 08 04 61 62 63 64 61 62 52 51"; + char cve[] = "wtf"; + inf_cve_2022_37434(payload, cve, 13, 47, 12, Z_OK); +} + +// clang-format on diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.h new file mode 100644 index 000000000..dbf67d7b4 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/infcover.h @@ -0,0 +1,12 @@ +#ifndef __INF_COVER_H__ +#define __INF_COVER_H__ + +void cover_support(void); +void cover_wrap(void); +void cover_back(void); +void cover_inflate(void); +void cover_trees(void); +void cover_fast(void); + +void cover_CVE_2022_37434(void); +#endif diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/run_all_unittests.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/run_all_unittests.cc new file mode 100644 index 000000000..4b6115b07 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/run_all_unittests.cc @@ -0,0 +1,14 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/functional/bind.h" +#include "base/test/launcher/unit_test_launcher.h" +#include "base/test/test_suite.h" + +int main(int argc, char** argv) { + base::TestSuite test_suite(argc, argv); + return base::LaunchUnitTests( + argc, argv, + base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite))); +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/standalone_test_runner.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/standalone_test_runner.cc new file mode 100644 index 000000000..1ec9c30ba --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/standalone_test_runner.cc @@ -0,0 +1,9 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the Chromium source repository LICENSE file. +#include + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/utils_unittest.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/utils_unittest.cc new file mode 100644 index 000000000..d06dbc981 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/contrib/tests/utils_unittest.cc @@ -0,0 +1,1150 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the Chromium source repository LICENSE file. + +#include "infcover.h" + +#include +#include + +#include "compression_utils_portable.h" +#include "gtest.h" + +#if !defined(CMAKE_STANDALONE_UNITTESTS) +#include "base/files/file_path.h" +#include "base/files/scoped_temp_dir.h" + +#include "third_party/zlib/contrib/minizip/unzip.h" +#include "third_party/zlib/contrib/minizip/zip.h" +#endif + +#include "zlib.h" + +void TestPayloads(size_t input_size, zlib_internal::WrapperType type) { + std::vector input; + input.reserve(input_size); + for (size_t i = 1; i <= input_size; ++i) + input.push_back(i & 0xff); + + // If it is big enough for GZIP, will work for other wrappers. + std::vector compressed( + zlib_internal::GzipExpectedCompressedSize(input.size())); + std::vector decompressed(input.size()); + + // Libcores's java/util/zip/Deflater default settings: ZLIB, + // DEFAULT_COMPRESSION and DEFAULT_STRATEGY. + unsigned long compressed_size = static_cast(compressed.size()); + int result = zlib_internal::CompressHelper( + type, compressed.data(), &compressed_size, input.data(), input.size(), + Z_DEFAULT_COMPRESSION, nullptr, nullptr); + ASSERT_EQ(result, Z_OK); + + unsigned long decompressed_size = + static_cast(decompressed.size()); + result = zlib_internal::UncompressHelper(type, decompressed.data(), + &decompressed_size, + compressed.data(), compressed_size); + ASSERT_EQ(result, Z_OK); + EXPECT_EQ(input, decompressed); +} + +TEST(ZlibTest, ZlibWrapper) { + // Minimal ZLIB wrapped short stream size is about 8 bytes. + for (size_t i = 1; i < 1024; ++i) + TestPayloads(i, zlib_internal::WrapperType::ZLIB); +} + +TEST(ZlibTest, GzipWrapper) { + // GZIP should be 12 bytes bigger than ZLIB wrapper. + for (size_t i = 1; i < 1024; ++i) + TestPayloads(i, zlib_internal::WrapperType::GZIP); +} + +TEST(ZlibTest, RawWrapper) { + // RAW has no wrapper (V8 Blobs is a known user), size + // should be payload_size + 2 for short payloads. + for (size_t i = 1; i < 1024; ++i) + TestPayloads(i, zlib_internal::WrapperType::ZRAW); +} + +TEST(ZlibTest, InflateCover) { + cover_support(); + cover_wrap(); + cover_back(); + cover_inflate(); + // TODO(cavalcantii): enable this last test. + // cover_trees(); + cover_fast(); +} + +TEST(ZlibTest, InflateCVE) { + cover_CVE_2022_37434(); +} + +TEST(ZlibTest, DeflateStored) { + const int no_compression = 0; + const zlib_internal::WrapperType type = zlib_internal::WrapperType::GZIP; + std::vector input(1 << 10, 42); + std::vector compressed( + zlib_internal::GzipExpectedCompressedSize(input.size())); + std::vector decompressed(input.size()); + unsigned long compressed_size = static_cast(compressed.size()); + int result = zlib_internal::CompressHelper( + type, compressed.data(), &compressed_size, input.data(), input.size(), + no_compression, nullptr, nullptr); + ASSERT_EQ(result, Z_OK); + + unsigned long decompressed_size = + static_cast(decompressed.size()); + result = zlib_internal::UncompressHelper(type, decompressed.data(), + &decompressed_size, + compressed.data(), compressed_size); + ASSERT_EQ(result, Z_OK); + EXPECT_EQ(input, decompressed); +} + +TEST(ZlibTest, StreamingInflate) { + uint8_t comp_buf[4096], decomp_buf[4096]; + z_stream comp_strm, decomp_strm; + int ret; + + std::vector src; + for (size_t i = 0; i < 1000; i++) { + for (size_t j = 0; j < 40; j++) { + src.push_back(j); + } + } + + // Deflate src into comp_buf. + comp_strm.zalloc = Z_NULL; + comp_strm.zfree = Z_NULL; + comp_strm.opaque = Z_NULL; + ret = deflateInit(&comp_strm, Z_BEST_COMPRESSION); + ASSERT_EQ(ret, Z_OK); + comp_strm.next_out = comp_buf; + comp_strm.avail_out = sizeof(comp_buf); + comp_strm.next_in = src.data(); + comp_strm.avail_in = src.size(); + ret = deflate(&comp_strm, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + size_t comp_sz = sizeof(comp_buf) - comp_strm.avail_out; + + // Inflate comp_buf one 4096-byte buffer at a time. + decomp_strm.zalloc = Z_NULL; + decomp_strm.zfree = Z_NULL; + decomp_strm.opaque = Z_NULL; + ret = inflateInit(&decomp_strm); + ASSERT_EQ(ret, Z_OK); + decomp_strm.next_in = comp_buf; + decomp_strm.avail_in = comp_sz; + + while (decomp_strm.avail_in > 0) { + decomp_strm.next_out = decomp_buf; + decomp_strm.avail_out = sizeof(decomp_buf); + ret = inflate(&decomp_strm, Z_FINISH); + ASSERT_TRUE(ret == Z_OK || ret == Z_STREAM_END || ret == Z_BUF_ERROR); + + // Verify the output bytes. + size_t num_out = sizeof(decomp_buf) - decomp_strm.avail_out; + for (size_t i = 0; i < num_out; i++) { + EXPECT_EQ(decomp_buf[i], src[decomp_strm.total_out - num_out + i]); + } + } + + // Cleanup memory (i.e. makes ASAN bot happy). + ret = deflateEnd(&comp_strm); + EXPECT_EQ(ret, Z_OK); + ret = inflateEnd(&decomp_strm); + EXPECT_EQ(ret, Z_OK); +} + +TEST(ZlibTest, CRCHashBitsCollision) { + // The CRC32c of the hex sequences 2a,14,14,14 and 2a,14,db,14 have the same + // lower 9 bits. Since longest_match doesn't check match[2], a bad match could + // be chosen when the number of hash bits is <= 9. For this reason, the number + // of hash bits must be set higher, regardless of the memlevel parameter, when + // using CRC32c hashing for string matching. See https://crbug.com/1113596 + + std::vector src = { + // Random byte; zlib doesn't match at offset 0. + 123, + + // This will look like 5-byte match. + 0x2a, + 0x14, + 0xdb, + 0x14, + 0x15, + + // Offer a 4-byte match to bump the next expected match length to 5. + 0x2a, + 0x14, + 0x14, + 0x14, + + 0x2a, + 0x14, + 0x14, + 0x14, + 0x15, + }; + + z_stream stream; + stream.zalloc = nullptr; + stream.zfree = nullptr; + + // Using a low memlevel to try to reduce the number of hash bits. Negative + // windowbits means raw deflate, i.e. without the zlib header. + int ret = deflateInit2(&stream, /*comp level*/ 2, /*method*/ Z_DEFLATED, + /*windowbits*/ -15, /*memlevel*/ 2, + /*strategy*/ Z_DEFAULT_STRATEGY); + ASSERT_EQ(ret, Z_OK); + std::vector compressed(100, '\0'); + stream.next_out = compressed.data(); + stream.avail_out = compressed.size(); + stream.next_in = src.data(); + stream.avail_in = src.size(); + ret = deflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + compressed.resize(compressed.size() - stream.avail_out); + deflateEnd(&stream); + + ret = inflateInit2(&stream, /*windowbits*/ -15); + ASSERT_EQ(ret, Z_OK); + std::vector decompressed(src.size(), '\0'); + stream.next_in = compressed.data(); + stream.avail_in = compressed.size(); + stream.next_out = decompressed.data(); + stream.avail_out = decompressed.size(); + ret = inflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + EXPECT_EQ(0U, stream.avail_out); + inflateEnd(&stream); + + EXPECT_EQ(src, decompressed); +} + +TEST(ZlibTest, CRCHashAssert) { + // The CRC32c of the hex sequences ff,ff,5e,6f and ff,ff,13,ff have the same + // lower 15 bits. This means longest_match's assert that match[2] == scan[2] + // won't hold. However, such hash collisions are only possible when one of the + // other four bytes also mismatch. This tests that zlib's assert handles this + // case. + + std::vector src = { + // Random byte; zlib doesn't match at offset 0. + 123, + + // This has the same hash as the last byte sequence, and the first two and + // last two bytes match; though the third and the fourth don't. + 0xff, + 0xff, + 0x5e, + 0x6f, + 0x12, + 0x34, + + // Offer a 5-byte match to bump the next expected match length to 6 + // (because the two first and two last bytes need to match). + 0xff, + 0xff, + 0x13, + 0xff, + 0x12, + + 0xff, + 0xff, + 0x13, + 0xff, + 0x12, + 0x34, + }; + + z_stream stream; + stream.zalloc = nullptr; + stream.zfree = nullptr; + + int ret = deflateInit2(&stream, /*comp level*/ 5, /*method*/ Z_DEFLATED, + /*windowbits*/ -15, /*memlevel*/ 8, + /*strategy*/ Z_DEFAULT_STRATEGY); + ASSERT_EQ(ret, Z_OK); + std::vector compressed(100, '\0'); + stream.next_out = compressed.data(); + stream.avail_out = compressed.size(); + stream.next_in = src.data(); + stream.avail_in = src.size(); + ret = deflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + compressed.resize(compressed.size() - stream.avail_out); + deflateEnd(&stream); + + ret = inflateInit2(&stream, /*windowbits*/ -15); + ASSERT_EQ(ret, Z_OK); + std::vector decompressed(src.size(), '\0'); + stream.next_in = compressed.data(); + stream.avail_in = compressed.size(); + stream.next_out = decompressed.data(); + stream.avail_out = decompressed.size(); + ret = inflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + EXPECT_EQ(0U, stream.avail_out); + inflateEnd(&stream); + + EXPECT_EQ(src, decompressed); +} + +// Fuzzer generated. +static const uint8_t checkMatchCrashData[] = { + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, + 0x6e, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x01, 0x39, 0x6e, 0x6e, + 0x00, 0x00, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e, + 0x00, 0x00, 0x0a, 0x9a, 0x00, 0x00, 0x6e, 0x6e, 0x6e, 0x2a, 0x00, 0x00, + 0x00, 0xd5, 0xf0, 0x00, 0x81, 0x02, 0xf3, 0xfd, 0xff, 0xab, 0xf3, 0x6e, + 0x7e, 0x04, 0x5b, 0xf6, 0x2a, 0x2c, 0xf8, 0x00, 0x54, 0xf3, 0xa5, 0x0e, + 0xfd, 0x6e, 0xff, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x0b, 0xa5, 0x2a, 0x0d, 0x10, 0x01, 0x26, 0xf6, 0x04, 0x0e, + 0xff, 0x6e, 0x6e, 0x6e, 0x76, 0x00, 0x00, 0x87, 0x01, 0xfe, 0x0d, 0xb6, + 0x6e, 0x6e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfd, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x9b, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x6e, 0xff, 0xff, 0x00, + 0x00, 0xd5, 0xf0, 0x00, 0xff, 0x40, 0x7e, 0x0b, 0xa5, 0x10, 0x67, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x40, 0x7e, 0x0b, 0xa5, 0x10, 0x67, + 0x7e, 0x32, 0x6e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x40, 0x0b, 0xa5, + 0x10, 0x67, 0x01, 0xfe, 0x0d, 0xb6, 0x2a, 0x00, 0x00, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3d, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x2d, 0x2d, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x66, 0x8a, 0x8a, 0x8a, 0xee, 0x1d, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0x00, 0x54, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x23, 0x7e, 0x00, 0x1e, + 0x00, 0x00, 0xd5, 0xf0, 0x00, 0xff, 0x40, 0x0b, 0xa5, 0x10, 0x67, 0x01, + 0xfe, 0x0d, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x2d, 0x6e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0e, + 0xfb, 0x00, 0x10, 0x24, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xff, 0x1f, + 0xb3, 0x00, 0x04, 0x3d, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x01, 0x45, 0x3d, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x11, 0x21, 0x00, 0x1e, + 0x00, 0x0c, 0xb3, 0xfe, 0x0e, 0xee, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6e, 0x00, + 0x00, 0x87, 0x00, 0x33, 0x38, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x3f, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x31, 0x13, 0x13, 0x13, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x30, 0x83, 0x33, + 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xff, 0x00, 0x01, + 0x10, 0x0d, 0x2a, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x11, + 0x21, 0x00, 0xa5, 0x00, 0x68, 0x68, 0x68, 0x67, 0x00, 0x00, 0xff, 0xff, + 0x02, 0x00, 0x00, 0x68, 0x68, 0x68, 0x68, 0x00, 0x00, 0xfa, 0xff, 0xff, + 0x03, 0x01, 0xff, 0x02, 0x00, 0x00, 0x68, 0x68, 0x68, 0x68, 0x0a, 0x10, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x06, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfa, 0xff, 0xff, 0x08, 0xff, 0xff, 0xff, 0x00, 0x06, 0x04, + 0x00, 0xf8, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0x06, 0x04, 0x6e, + 0x7e, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, + 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x6e, 0x6e, 0x6e, + 0x00, 0x01, 0x38, 0xd5, 0xf0, 0x00, 0x00, 0x2a, 0xfe, 0x04, 0x5b, 0x0d, + 0xfd, 0x6e, 0x92, 0x28, 0xf9, 0xfb, 0xff, 0x07, 0xd2, 0xd6, 0x2d, 0x2d, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0xc2, 0x91, 0x00, 0x5b, 0xef, 0xde, 0xf2, 0x6e, 0x6e, 0xfd, + 0x0c, 0x02, 0x91, 0x62, 0x91, 0xfd, 0x6e, 0x6e, 0xd3, 0x06, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, + 0xd5, 0xf0, 0x00, 0xff, 0x00, 0x00, 0x31, 0x13, 0x13, 0x13, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x04, 0x00, 0x13, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x09, 0x00, 0x6a, 0x24, 0x26, 0x30, 0x01, 0x2e, 0x2a, 0xfe, + 0x04, 0x5b, 0x0d, 0xfd, 0x6e, 0x6e, 0xd7, 0x06, 0x6e, 0x6e, 0x6e, 0x00, + 0x00, 0xb1, 0xb1, 0xb1, 0xb1, 0x00, 0x00, 0x00, 0x6e, 0x5b, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x24, 0x2a, 0x6e, 0x5c, 0x24, + 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x00, 0x00, 0x00, 0x5d, 0x10, 0x6e, 0x6e, 0xa5, 0x2f, 0x00, 0x00, + 0x95, 0x87, 0x00, 0x6e}; + +TEST(ZlibTest, CheckMatchCrash) { + // See https://crbug.com/1113142. + z_stream stream; + stream.zalloc = nullptr; + stream.zfree = nullptr; + + // Low windowbits to hit window sliding also with a relatively small input. + int ret = deflateInit2(&stream, /*comp level*/ 5, /*method*/ Z_DEFLATED, + /*windowbits*/ -9, /*memlevel*/ 8, + /*strategy*/ Z_DEFAULT_STRATEGY); + ASSERT_EQ(ret, Z_OK); + + uint8_t compressed[sizeof(checkMatchCrashData) * 2]; + stream.next_out = compressed; + stream.avail_out = sizeof(compressed); + + for (size_t i = 0; i < sizeof(checkMatchCrashData); i++) { + ASSERT_GT(stream.avail_out, 0U); + stream.next_in = (uint8_t*)&checkMatchCrashData[i]; + stream.avail_in = 1; + ret = deflate(&stream, Z_NO_FLUSH); + ASSERT_EQ(ret, Z_OK); + } + + stream.next_in = nullptr; + stream.avail_in = 0; + ASSERT_GT(stream.avail_out, 0U); + ret = deflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + size_t compressed_sz = sizeof(compressed) - stream.avail_out; + deflateEnd(&stream); + + uint8_t decompressed[sizeof(checkMatchCrashData)]; + ret = inflateInit2(&stream, -15); + ASSERT_EQ(ret, Z_OK); + stream.next_in = compressed; + stream.avail_in = compressed_sz; + stream.next_out = decompressed; + stream.avail_out = sizeof(decompressed); + ret = inflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + inflateEnd(&stream); + ASSERT_EQ( + memcmp(checkMatchCrashData, decompressed, sizeof(checkMatchCrashData)), + 0); +} + +TEST(ZlibTest, DeflateRLEUninitUse) { + // MSan would complain about use of uninitialized values in deflate_rle if the + // window isn't zero-initialized. See crbug.com/1137613. Similar problems + // exist in other places in zlib, e.g. longest_match (crbug.com/1144420) but + // we don't have as nice test cases. + + int level = 9; + int windowBits = 9; + int memLevel = 8; + int strategy = Z_RLE; + const std::vector src{ + 0x31, 0x64, 0x38, 0x32, 0x30, 0x32, 0x30, 0x36, 0x65, 0x35, 0x38, 0x35, + 0x32, 0x61, 0x30, 0x36, 0x65, 0x35, 0x32, 0x66, 0x30, 0x34, 0x38, 0x37, + 0x61, 0x31, 0x38, 0x36, 0x37, 0x37, 0x31, 0x39, 0x0a, 0x65, 0x62, 0x00, + 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, + 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, + 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0x95, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0e, 0x0a, 0x54, 0x52, + 0x58, 0x56, 0xab, 0x26, 0x13, 0x53, 0x5a, 0xb5, 0x30, 0xbb, 0x96, 0x44, + 0x80, 0xe6, 0xc5, 0x0a, 0xd0, 0x47, 0x7a, 0xa0, 0x4e, 0xbe, 0x30, 0xdc, + 0xa1, 0x08, 0x54, 0xe1, 0x51, 0xd1, 0xea, 0xef, 0xdb, 0xa1, 0x2d, 0xb4, + 0xb9, 0x58, 0xb1, 0x2f, 0xf0, 0xae, 0xbc, 0x07, 0xd1, 0xba, 0x7f, 0x14, + 0xa4, 0xde, 0x99, 0x7f, 0x4d, 0x3e, 0x25, 0xd9, 0xef, 0xee, 0x4f, 0x38, + 0x7b, 0xaf, 0x3f, 0x6b, 0x53, 0x5a, 0xcb, 0x1f, 0x97, 0xb5, 0x43, 0xa3, + 0xe8, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, + 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, + 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, + 0x9f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3c, + 0x73, 0x70, 0x23, 0x87, 0xec, 0xf8, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc1, 0x00, 0x00, 0x9f, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, + 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + }; + + z_stream stream; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + + // Compress the data one byte at a time to exercise the streaming code. + int ret = + deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + ASSERT_EQ(ret, Z_OK); + std::vector compressed(src.size() * 2 + 1000); + stream.next_out = compressed.data(); + stream.avail_out = compressed.size(); + for (uint8_t b : src) { + stream.next_in = &b; + stream.avail_in = 1; + ret = deflate(&stream, Z_NO_FLUSH); + ASSERT_EQ(ret, Z_OK); + } + stream.next_in = Z_NULL; + stream.avail_in = 0; + ret = deflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + deflateEnd(&stream); +} + +static const char zFixedCorruptionData[] = + "AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVAAWAAXAAYA" + "AZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABSABTABUABVABWABXABY" + "ABZACBACCACDACEACFACGACHACIACJACKACLACMACNACOACPACQACRACSACTACUACVACWACXAC" + "YACZADBADCADDADEADFADGADHADIADJADKADLADMADNADOADPADQADRADSADTADUADVADWADXA" + "DYADZAEBAECAEDAEEAEFAEGAEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEX" + "AEYAEZAFBAFCAFDAFEAFFAFGAFHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAF" + "XAFYAFZAGBAGCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWA" + "GXAGYAGZAHBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAHSAHTAHUAHVAHW" + "AHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQAIRAISAITAIUAIVAI" + "WAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMAJNAJOAJPAJQAJRAJSAJTAJUAJVA" + "JWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJAKKAKLAKMAKNAKOAKPAKQAKRAKSAKTAKUAKV" + "AKWAKXAKYAKZALBALCALDALEALFALGALHALIALJALKALLALMALNALOALPALQALRALSALTALUAL" + "VALWALXALYALZAMBAMCAMDAMEAMFAMGAMHAMIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUA" + "MVAMWAMXAMYAMZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANU" + "ANVANWANXANYANZAOBAOCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQAORAOSAOTAO" + "UAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAPPAPQAPRAPSAPTA" + "PUAPVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQLAQMAQNAQOAQPAQQAQRAQSAQT" + "AQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHARIARJARKARLARMARNAROARPARQARRARSAR" + "TARUARVARWARXARYARZASBASCASDASEASFASGASHASIASJASKASLASMASNASOASPASQASRASSA" + "STASUASVASWASXASYASZATBATCATDATEATFATGATHATIATJATKATLATMATNATOATPATQATRATS" + "ATTATUATVATWATXATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAU" + "SAUTAUUAUVAUWAUXAUYAUZAVBAVCAVDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOAVPAVQAVRA" + "VSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMAWNAWOAWPAWQAWR" + "AWSAWTAWUAWVAWWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJAXKAXLAXMAXNAXOAXPAXQAX" + "RAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAYGAYHAYIAYJAYKAYLAYMAYNAYOAYPAYQA" + "YRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZDAZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQ" + "AZRAZSAZTAZUAZVAZWAZXAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBBLBBMBBNBBOBBPBBQB" + "BRBBSBBTBBUBBVBBWBBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCR" + "BCSBCTBCUBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBDHBDIBDJBDKBDLBDMBDNBDOBDPBDQBDRBD" + "SBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBEOBEPBEQBERBESB" + "ETBEUBEVBEWBEXBEYBEZBFCBFDBFEBFFBFGBFHBFIBFJBFKBFLBFMBFNBFOBFPBFQBFRBFSBFT" + "BFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBGKBGLBGMBGNBGOBGPBGQBGRBGSBGTBG" + "UBGVBGWBGXBGYBGZBHCBHDBHEBHFBHGBHHBHIBHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUB" + "HVBHWBHXBHYBHZBICBIDBIEBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBITBIUBIV" + "BIWBIXBIYBIZBJCBJDBJEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJ" + "WBJXBJYBJZBKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBKPBKQBKRBKSBKTBKUBKVBKWB" + "KXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSBLTBLUBLVBLWBLX" + "BLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBMLBMMBMNBMOBMPBMQBMRBMSBMTBMUBMVBMWBMXBM" + "YBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNPBNQBNRBNSBNTBNUBNVBNWBNXBNYB" + "NZBOCBODBOEBOFBOGBOHBOIBOJBOKBOLBOMBONBOOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZ" + "BPCBPDBPEBPFBPGBPHBPIBPJBPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQ" + "CBQDBQEBQFBQGBQHBQIBQJBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCB" + "RDBREBRFBRGBRHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBRXBRYBRZBSCBSD" + "BSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBSYBSZBTCBTDBT" + "EBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBTTBTUBTVBTWBTXBTYBTZBUCBUDBUEB" + "UFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUBUVBUWBUXBUYBUZBVCBVDBVEBVF" + "BVGBVHBVIBVJBVKBVLBVMBVNBVOBVPBVQBVRBVSBVTBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBW" + "GBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGB" + "XHBXIBXJBXKBXLBXMBXNBXOBXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYH" + "BYIBYJBYKBYLBYMBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBZHBZ" + "IBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCCGCCHCCICCJ" + "CCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECDFCDGCDHCDICDJCDKCD" + "LCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEECEFCEGCEHCEICEJCEKCELCEMC" + "ENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZCFDCFECFFCFGCFHCFICFJCFKCFLCFMCFNCFO" + "CFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZCGDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCG" + "QCGRCGSCGTCGUCGVCGWCGXCGYCGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRC" + "HSCHTCHUCHVCHWCHXCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCIT" + "CIUCIVCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJSCJTCJUCJ" + "VCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCKSCKTCKUCKVCKWC" + "KXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCLRCLSCLTCLUCLVCLWCLXCLY" + "CLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPCMQCMRCMSCMTCMUCMVCMWCMXCMYCMZCN" + "DCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCNPCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOEC" + "OFCOGCOHCOICOJCOKCOLCOMCONCOOCOPCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPG" + "CPHCPICPJCPKCPLCPMCPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQ" + "ICQJCQKCQLCQMCQNCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHCRICRJC" + "RKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGCSHCSICSJCSKCSL" + "CSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTGCTHCTICTJCTKCTLCTMCT" + "NCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECUFCUGCUHCUICUJCUKCULCUMCUNCUOC" + "UPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVECVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQ" + "CVRCVSCVTCVUCVVCVWCVXCVYCVZCWDCWECWFCWGCWHCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCW" + "SCWTCWUCWVCWWCWXCWYCWZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTC" + "XUCXVCXWCXXCXYCXZCYDCYECYFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCYUCYV" + "CYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSCZTCZUCZVCZWCZ" + "XCZYCZZDDDEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDTDDUDDVDDWDDXDDYDDZ" + "DEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDETDEUDEVDEWDEXDEYDEZDFEDFFDF" + "GDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFTDFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGID" + "GJDGKDGLDGMDGNDGODGPDGQDGRDGSDGTDGUDGVDGWDGXDGYDGZDHEDHFDHGDHHDHIDHJDHKDHL" + "DHMDHNDHODHPDHQDHRDHSDHTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDI" + "ODIPDIQDIRDISDITDIUDIVDIWDIXDIYDIZDJEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJQD" + "JRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPDKQDKRDKSDKT" + "DKUDKVDKWDKXDKYDKZDLEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQDLRDLSDLTDLUDLVDL" + "WDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQDMRDMSDMTDMUDMVDMWDMXDMYD" + "MZDNEDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQDNRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOF" + "DOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZDPEDPFDPGDPHDP" + "IDPJDPKDPLDPMDPNDPODPPDPQDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKD" + "QLDQMDQNDQODQPDQQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDRFDRGDRHDRIDRJDRKDRLDRMDRN" + "DRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDSNDSODSPDS" + "QDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTODTPDTQDTRDTSD" + "TTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUNDUODUPDUQDURDUSDUTDUUDUV" + "DUWDUXDUYDUZDVEDVFDVGDVHDVIDVJDVKDVLDVMDVNDVODVPDVQDVRDVSDVTDVUDVVDVWDVXDV" + "YDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWNDWODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXED" + "XFDXGDXHDXIDXJDXKDXLDXMDXNDXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYH" + "DYIDYJDYKDYLDYMDYNDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDZFDZGDZHDZIDZJDZ" + "KDZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEELEEMEEN" + "EEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEFGEFHEFIEFJEFKEFLEFMEFNEFOEFPEFQEF" + "REFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNEGOEGPEGQEGREGSEGTEGUE" + "GVEGWEGXEGYEGZEHFEHGEHHEHIEHJEHKEHLEHMEHNEHOEHPEHQEHREHSEHTEHUEHVEHWEHXEHY" + "EHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPEIQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJ" + "HEJIEJJEJKEJLEJMEJNEJOEJPEJQEJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKE" + "KLEKMEKNEKOEKPEKQEKREKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLELMELNELO" + "ELPELQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQEMREM" + "SEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNENOENPENQENRENSENTENUENVE" + "NWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEOTEOUEOVEOWEOXEOYEOZ" + "EPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPEPQEPREPSEPTEPUEPVEPWEPXEPYEPZEQFEQGEQHEQ" + "IEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQVEQWEQXEQYEQZERFERGERHERIERJERKERLE" + "RMERNEROERPERQERRERSERTERUERVERWERXERYERZESFESGESHESIESJESKESLESMESNESOESP" + "ESQESRESSESTESUESVESWESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSET" + "TETUETVETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVEUWE" + "UXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEVWEVXEVYEVZEWF" + "EWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWYEWZEXFEXGEXHEXIEX" + "JEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXEXYEXZEYFEYGEYHEYIEYJEYKEYLEYME" + "YNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZFEZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQ" + "EZREZSEZTEZUEZVEZWEZXEZYEZZFFFGFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUF" + "FVFFWFFXFFYFFZFGGFGHFGIFGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZ" + "FHGFHHFHIFHJFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJFI" + "KFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJLFJMFJNFJOF" + "JPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFKPFKQFKRFKSFKT" + "FKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFLQFLRFLSFLTFLUFLVFLWFLXFL" + "YFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMSFMTFMUFMVFMWFMXFMYFMZFNGFNHFNIF" + "NJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFNUFNVFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFON" + "FOOFOPFOQFORFOSFOTFOUFOVFOWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFP" + "SFPTFPUFPVFPWFPXFPYFPZFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWF" + "QXFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYFRZFSGFSH" + "FSIFSJFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTIFTJFTKFTLFT" + "MFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJFUKFULFUMFUNFUOFUPFUQF" + "URFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLFVMFVNFVOFVPFVQFVRFVSFVTFVUFVV" + "FVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWNFWOFWPFWQFWRFWSFWTFWUFWVFWWFWXFWYFWZFX" + "GFXHFXIFXJFXKFXLFXMFXNFXOFXPFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKF" + "YLFYMFYNFYOFYPFYQFYRFYSFYTFYUFYVFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZP" + "FZQFZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSGGTGGUG" + "GVGGWGGXGGYGGZGHHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHXGHYGHZGIH" + "GIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZGJHGJIGJJGJKGJLGJMGJ" + "NGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJGKKGKLGKMGKNGKOGKPGKQGKRGKSG" + "KTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLMGLNGLOGLPGLQGLRGLSGLTGLUGLVGLWGLXGLY" + "GLZGMHGMIGMJGMKGMLGMMGMNGMOGMPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGN" + "LGNMGNNGNOGNPGNQGNRGNSGNTGNUGNVGNWGNXGNYGNZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQG" + "ORGOSGOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGPVGPW" + "GPXGPYGPZGQHGQIGQJGQKGQLGQMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZGRHGRIGR" + "JGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIGSJGSKGSLGSMGSNGSOG" + "SPGSQGSRGSSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGTMGTNGTOGTPGTQGTRGTSGTTGTU" + "GTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOGUPGUQGURGUSGUTGUUGUVGUWGUXGUYGUZGV" + "HGVIGVJGVKGVLGVMGVNGVOGVPGVQGVRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMG" + "WNGWOGWPGWQGWRGWSGWTGWUGWVGWWGWXGWYGWZGXHGXIGXJGXKGXLGXMGXNGXOGXPGXQGXRGXS" + "GXTGXUGXVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYXGY" + "YGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZRGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJHHKHHL" + "HHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMHINHIOHIPHIQHIRHI" + "SHITHIUHIVHIWHIXHIYHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJRHJSHJTHJUHJVHJWHJXHJYH" + "JZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUHKVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLN" + "HLOHLPHLQHLRHLSHLTHLUHLVHLWHLXHLYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHM" + "UHMVHMWHMXHMYHMZHNIHNJHNKHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHNXHNYHNZHOIH" + "OJHOKHOLHOMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPP" + "HPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHQNHQOHQPHQQHQRHQSHQTHQUHQVHQ" + "WHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYHRZHSIHSJHSKH" + "SLHSMHSNHSOHSPHSQHSRHSSHSTHSUHSVHSWHSXHSYHSZHTIHTJHTKHTLHTMHTNHTOHTPHTQHTR" + "HTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHUOHUPHUQHURHUSHUTHUUHUVHUWHUXHU" + "YHUZHVIHVJHVKHVLHVMHVNHVOHVPHVQHVRHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMH" + "WNHWOHWPHWQHWRHWSHWTHWUHWVHWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHXT" + "HXUHXVHXWHXXHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZ" + "IHZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJIIKIILIIMIINIIOIIP" + "IIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTIJUIJVIJWIJ" + "XIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTIKUIKVIKWIKXIKYIKZILJILKILLILMILNI" + "LOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIMMIMNIMOIMPIMQIMRIMSIMTIMUIMV" + "IMWIMXIMYIMZINJINKINLINMINNINOINPINQINRINSINTINUINVINWINXINYINZIOJIOKIOLIO" + "MIONIOOIOPIOQIORIOSIOTIOUIOVIOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTI" + "PUIPVIPWIPXIPYIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRK" + "IRLIRMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPISQISRIS" + "SISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITWITXITYITZI" + "UJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIVJIVKIVLIVMIVNIVOIVPIVQ" + "IVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWPIWQIWRIWSIWTIWUIWVIWWIWXIW" + "YIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSIXTIXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOI" + "YPIYQIYRIYSIYTIYUIYVIYWIYXIYYIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZW" + "IZXIZYIZZJJJKJJLJJMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJ" + "KPJKQJKRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLWJLX" + "JLYJLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJNOJNPJN" + "QJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJOTJOUJOVJOWJOXJOYJ" + "OZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZJQKJQLJQMJQNJQOJQPJQQJQR" + "JQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJRPJRQJRRJRSJRTJRUJRVJRWJRXJRYJRZJS" + "KJSLJSMJSNJSOJSPJSQJSRJSSJSTJSUJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJ" + "TTJTUJTVJTWJTXJTYJTZJUKJULJUMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVL" + "JVMJVNJVOJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJW" + "UJWVJWWJWXJWYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYLJYMJ" + "YNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZRJZSJZTJZUJZV" + "JZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKXKKYKKZKLLKLMKLNKLOKLPK" + "LQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKMPKMQKMRKMSKMTKMUKMVKMWKMXKMYKMZ" + "KNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKNVKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKO" + "UKOVKOWKOXKOYKOZKPLKPMKPNKPOKPPKPQKPRKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOK" + "QPKQQKQRKQSKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRY" + "KRZKSLKSMKSNKSOKSPKSQKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTSKT" + "TKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKUZKVLKVMKVNK" + "VOKVPKVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQKWRKWSKWTKWUKWVKWWKWX" + "KWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXXKXYKXZKYLKYMKYNKYOKYPKYQKYRKY" + "SKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZOKZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLN" + "LLOLLPLLQLLRLLSLLTLLULLVLLWLLXLLYLLZLMMLMNLMOLMPLMQLMRLMSLMTLMULMVLMWLMXLM" + "YLMZLNMLNNLNOLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOUL" + "OVLOWLOXLOYLOZLPMLPNLPOLPPLPQLPRLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQR" + "LQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLRZLSMLSNLS" + "OLSPLSQLSRLSSLSTLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSLTTLTULTVLTWLTXLTYL" + "TZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVMLVNLVOLVPLVQLVRLVSLVTLVULVV" + "LVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWTLWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLX" + "SLXTLXULXVLXWLXXLXYLXZLYMLYNLYOLYPLYQLYRLYSLYTLYULYVLYWLYXLYYLYZLZMLZNLZOL" + "ZPLZQLZRLZSLZTLZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMN" + "NMNOMNPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYM" + "OZMPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQVMQWMQX" + "MQYMQZMRNMROMRPMRQMRRMRSMRTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQMSRMSSMSTMSUMSVMS" + "WMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTXMTYMTZMUNMUOMUPMUQMURMUSMUTMUUM" + "UVMUWMUXMUYMUZMVNMVOMVPMVQMVRMVSMVTMVUMVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWT" + "MWUMWVMWWMWXMWYMWZMXNMXOMXPMXQMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYQMYRMY" + "SMYTMYUMYVMYWMYXMYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNR" + "NNSNNTNNUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNOXNOYNOZNPONPPNPQNPRNP" + "SNPTNPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNRRNRSN" + "RTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNSTNSUNSVNSWNSXNSYNSZNTONTPNTQNTRNTSNTT" + "NTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUYNUZNVONVPNVQNVRNVSNVTNV" + "UNVVNVWNVXNVYNVZNWONWPNWQNWRNWSNWTNWUNWVNWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUN" + "XVNXWNXXNXYNXZNYONYPNYQNYRNYSNYTNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZV" + "NZWNZXNZYNZZOOOPOOQOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXO" + "PYOPZOQPOQQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWORXORYORZOSP" + "OSQOSROSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOUROU" + "SOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWOVXOVYOVZOWPOWQOWROWSOWTOWUO" + "WVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQOYROYSOYTOYUOYVOYWOYX" + "OYYOYZOZPOZQOZROZSOZTOZUOZVOZWOZXOZYOZZPPPQPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQP" + "QRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRPRSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSV" + "PSWPSXPSYPSZPTQPTRPTSPTTPTUPTVTABUABVABWABXABYABZACBACCACDACEACFACGACHACIA" + "CJACKACLACMACNACOACPACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADI" + "ADJADKADLADMADAAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAA" + "UAAVAAWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABSABHA" + "FIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAGBAGCAGDAGEAGFAGGAGH" + "AGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWAGXAGYAGZAHNADOADPADQADRADSAD" + "TADUADVADWADXADYADZAEBAECAEDAEEAEFAEGAEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESA" + "ETAEUAEVAEWAEXAEYAEZAFBAFCAFDAFEAFFAFGAFUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJG" + "AJHAJIAJJAJKAJLAJMAJNAJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAK" + "GAKHAKIAKJAKKAKLAKMAKNAKBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRA" + "HSAHTAHUAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQAIR" + "AISAITAIIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAMXAMYAMZANBANCANDANEAN" + "FANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUANVANWANXANYANZAOBAOOAKPAKQA" + "KRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEALFALGALHALIALJALKALLALMALNALOALPALQ" + "ALRALSALTALUALVALWALXALYALZAMBAMCAMDAMEAMFAMGAMHAMVAPWAPXAPYAPZAQBAQCAQDAQ" + "EAQFAQGAQHAQIAQJAQKAQLAQMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDA" + "REARFARGARHARIARJARKARLARMARNAROARCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOP" + "AOQAORAOSAOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAP" + "PAPQAPRAPSAPTAPUAPJATKATLATMATNATOATPATQATRATSATTATUATVATWATXATYATZAUBAUCA" + "UDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUTAUUAUVAUWAUXAUYAUZAVBAVC" + "AVPARQARRARSARTARUARVARWARXARYARZASBASCASDASEASFASGASHASIASJASKASLASMASNAS" + "OASPASQASRASSASTASUASVASWASXASYASZATBATCATDATEATFATGATHATIATWAWXAWYAWZAXBA" + "XCAXDAXEAXFAXGAXHAXIAXJAXKAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYB" + "AYCAYDAYEAYFAYGAYHAYIAYJAYKAYLAYMAYNAYOAYPAYDAVEAVFAVGAVHAVIAVJAVKAVLAVMAV" + "NAVOAVPAVQAVRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMA" + "WNAWOAWPAWQAWRAWSAWTAWUAWVAWBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVBBWBBXBBYBBZBC" + "CBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCTBCUBCVBCWBCXBCYBCZBDCB" + "DDBDEBDFBDGBQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZDAZEAZFAZGAZHAZIAZJAZKAZLA" + "ZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZXAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBFDBF" + "EBFFBFGBFHBFIBFJBFKBFLBFMBFNBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEB" + "GFBGGBGHBGIBGJBGKBGLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBDHBDIBDJBDKBDLBDMBDN" + "BDOBDPBDQBDRBDSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBE" + "OBEPBEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBITBIUBIVBIWBIXBIYBIZBJCBJDBJEBJFBJGB" + "JHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYBJZBKCBKDBKEBKFBKGBKH" + "BKIBKJBKKBKLBKMBKNBKOBGXBGYBGZBHCBHDBHEBHFBHGBHHBHIBHJBHKBHLBHMBHNBHOBHPBH" + "QBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBIEBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQB" + "IRBISBMLBMMBMNBMOBMPBMQBMRBMSBMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJ" + "BNKBNLBNMBNNBNOBNPBNQBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBKPBKQBKRBK" + "SBKTBKUBKVBKWBKXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSB" + "LTBLUBLVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBQDBQEBQFBQGBQHBQIBQJBQKBQL" + "BQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBRGBRHBRIBRJBRKBRLBR" + "MBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBOHBOIBOJBOKBOLBOMBONBOOBOPBOQBORBOSBOTBOUB" + "OVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJBPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPV" + "BPWBPXBPYBPZBQCBTTBTUBTVBTWBTXBTYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBU" + "OBUPBUQBURBUSBUTBUUBUVBUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOB" + "RXBRYBRZBSCBSDBSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSX" + "BSYBSZBTCBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBXLBXMBXNBXOBXPBX" + "QBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYLBYMBYNBYOBYPBYQB" + "YRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBVPBVQBVRBVSBVTBVUBVVBVWBVXBVYBVZ" + "BWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBX" + "CBXDBXEBXFBXGBXHBXIBXJBXKBCDFCDGCDHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDU" + "CDVCDWCDXCDYCDZCEDCEECEFCEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCE" + "WCEXCEYCEZZHBZIBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCEC" + "CFCCGCCHCCICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECGYCGZ" + "CHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHWCHXCHYCHZCIDCI" + "ECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCIVCFDCFECFFCFGCFHCFICFJC" + "FKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZCGDCGECGFCGGCGHCGICGJCGKCGL" + "CGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGWCGXCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICL" + "JCLKCLLCLMCLNCLOCLPCLQCLRCLSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKC" + "MLCMMCMNCMOCMPCMQCMRCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQ" + "CJRCJSCJTCJUCJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCK" + "SCKTCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLCPMCPNCPOCPPC" + "PQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQKCQLCQMCQNCMSCMTCMUCMV" + "CMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCNPCNQCNRCNSCNTCNUCNVCNWCN" + "XCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLCOMCONCOOCOPCSMCSNCSOCSPCSQCSRCSSCSTCSUC" + "SVCSWCSXCSYCSZCTDCTECTFCTGCTHCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTW" + "CTXCTYCTZCUDCUECUFCUGCUHCUICUJCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECR" + "FCRGCRHCRICRJCRKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGC" + "SHCSICSJCSKCSLCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCWYCWZCXDCXE" + "CXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWCXXCXYCXZCYDCYECYFCU" + "KCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVECVFCVGCVHCVICVJCVKCVLC" + "VMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCVYCVZCWDCWECWFCWGCWHEDDFDDGDDHDDIDDJDD" + "KDDLDDMDDNDDODDPDDQDDRDDSDDTDDUDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMD" + "ENDEODEPDEQDERDESDETDEUDEVDEWDEXDEYDEZDFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQC" + "YRCYSCYTCYUCYVCYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZS" + "CZTCZUCZVCZWCZXCZYCZZDDDEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDHSDHTDHUD" + "HVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRDISDITDIUDIVDIWDIX" + "DIYDIZDJEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFTDFUDFVDFWDFXDFYDFZDG" + "EDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDGRDGSDGTDGUDGVDGWDGXDGYDGZDHEDLFDLGD" + "LHDLIDLJDLKDLLDLMDLNDLODLPDLQDLRDLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJ" + "DMKDMLDMMDMNDMODMPDMQDMRDMSDMTDMUDMVDMWDMXDMYDMZDNEDJFDJGDJHDJIDJJDJKDJLDJ" + "MDJNDJODJPDJQDJRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKOD" + "KPDKQDKRDKSDKTDKUDKVDKWDKXDKYDKZDLEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPPDPQDPR" + "DPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQPDQQDQRDQSDQTDQ" + "UDQVDQWDQXDQYDQZDREDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQDNRDNSDNTDNUDNVDNWD" + "NXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZ" + "DPEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTODTPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDU" + "GDUHDUIDUJDUKDULDUMDUNDUODUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDRFDRGDRHDRID" + "RJDRKDRLDRMDRNDRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSL" + "DSMDSNDSODSPDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDXFDXGDXHDXIDXJDXKDXLDXMDXNDX" + "ODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYMDYNDYODYPDYQD" + "YRDYSDYTDYUDYVDYWDYXDYYDYZDZEDVFDVGDVHDVIDVJDVKDVLDVMDVNDVODVPDVQDVRDVSDVT" + "DVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWNDWODWPDWQDWRDWSDWTDWUDWVDW" + "WDWXDWYDWZDXFGEFHEFIEFJEFKEFLEFMEFNEFOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGF" + "EGGEGHEGIEGJEGKEGLEGMEGNEGOEGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEEDZF" + "DZGDZHDZIDZJDZKDZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIE" + "EJEEKEELEEMEENEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEJKEJLEJMEJNEJOEJPEJQ" + "EJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQEKREKSEKTEK" + "UEKVEKWEKXEKYEKZELFELGELHELIELJELKELLEHIEHJEHKEHLEHMEHNEHOEHPEHQEHREHSEHTE" + "HUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPEIQEIREISEITEIUEIVEIWEIX" + "EIYEIZEJFEJGEJHEJIEJJENOENPENQENRENSENTENUENVENWENXENYENZEOFEOGEOHEOIEOJEO" + "KEOLEOMEONEOOEOPEOQEOREOSEOTEOUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNE" + "POEPPELMELNELOELPELQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMN" + "EMOEMPEMQEMREMSEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNERSERTERUER" + "VERWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVESWESXESYE" + "SZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTEPQEPREPSEPTEPUEPVEPWEPXEPY" + "EPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQVEQWEQXEQYEQZERFERGER" + "HERIERJERKERLERMERNEROERPERQERREVWEVXEVYEVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOE" + "WPEWQEWREWSEWTEWUEWVEWWEWXEWYEWZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXS" + "EXTEXUEXVEXWEXXETUETVETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREU" + "SEUTEUUEUVEUWEUXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVE" + "FFGFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHFGIFGJFG" + "KFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJXYEXZEYFEYGEYHEY" + "IEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZFEZGEZHEZIEZJEZKEZLE" + "ZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZZFFJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJ" + "YFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFKPFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIF" + "LJFLKFLLFLMFLNFLOFLPFLQFLRFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZ" + "FIGFIHFIIFIJFIKFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJ" + "KFJLFJMFJNFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFOVFOWF" + "OXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWFPXFPYFPZFLSFLT" + "FLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMSFMTFMUFMVFMWFMXFM" + "YFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFNUFNVFSKFSLFSMFSNFSOFSPFSQF" + "SRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTIFTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTV" + "FTWFTXFTYFTZFUGFUHFUIFUJFUKFULFUMFUNFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQ" + "SFQTFQUFQVFQWFQXFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWF" + "RXFRYFRZFSGFSHFSIFSJFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXOFXP" + "FXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFYQFYRFYSFYTFY" + "UFYVFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLFVMFVNFVOFVPFVQF" + "VRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWNFWOFWPFWQFWRHGHIGHJGHKGH" + "LGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHXGHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQG" + "IRGISGITGIUGIVGIWGIXGIYGIZGJHGJIGJJGJKGJLGJMGJFYWFYXFYYFYZFZGFZHFZIFZJFZKF" + "ZLFZMFZNFZOFZPFZQFZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGG" + "QGGRGGSGGTGGUGGVGGWGGXGGYGGZGHTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMOG" + "MPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGNRGNSGNTGNU" + "GNVGNWGNXGNYGNNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJGKKGKLGKMGKNGK" + "OGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLMGLNGLOGLPGLQGLRGLSGLMG" + "QNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZGRHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRS" + "GRTGRUGRVGRWGRXGRYGRZGSHGSIGSJGSKGSLGSMGSNGSOGSPGSQGSRGSZGOHGOIGOJGOKGOLGO" + "MGONGOOGOPGOQGORGOSGOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRG" + "PSGPTGPUGPVGPWGPXGPYGPZGQHGQIGQJGQKGQLGQYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQ" + "GVRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWTGWUGWVGW" + "WGWXGWYGWZGXHGXIGXJGXKGXSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGTMGTNGTOGTPG" + "TQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOGUPGUQGURGUSGUTGUUGUV" + "GUWGUXGURGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJHHKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUH" + "HVHHWHHXHHYHHZHIIHIJHIKHILHIMHINHIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHLGXMGXNG" + "XOGXPGXQGXRGXSGXTGXUGXVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYT" + "GYUGYVGYWGYXGYYGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZLPHLQHLRHLSHLTHLUHLVHLWH" + "LXHLYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJHNKHNL" + "HNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJRHJSHJTHJ" + "UHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUHKVHKWHKXHKYHKZHLIH" + "LJHLKHLLHLMHLNHLOHQNHQOHQPHQQHQRHQSHQTHQUHQVHQWHQXHQYHQZHRIHRJHRKHRLHRMHRN" + "HROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYHRZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHS" + "UHNXHNYHNZHOIHOJHOKHOLHOMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKH" + "PLHPMHPNHPOHPPHPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHVLHVMHVNHVOHVP" + "HVQHVRHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUHWVHW" + "WHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHSVHSWHSXHSYHSZHTIHTJHTKHTLHTMH" + "TNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHUOHUPHUQHURHUSHUT" + "HUUHUVHUWHUXHUYHUZHVIHVJHVKHIIKIILIIMIINIIOIIPIIQIIRIISIITIIUIIVIIWIIXIIYI" + "IZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTIJUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKP" + "IKQIKRIKSIKTXTHXUHXVHXWHXXHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYV" + "HYWHYXHYYHYZHZIHZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJINNI" + "NOINPINQINRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUIOV" + "IOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIKUIKVIKWIKXIKYIKZIL" + "JILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIMMIMNIMOIMPIMQI" + "MRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMISQISRISSISTISUISVISWISXISYISZITJITK" + "ITLITMITNITOITPITQITRITSITTITUITVITWITXITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIU" + "SIUTIUUIUVIUWIUXIUYIUZIPXIPYIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWI" + "QXIQYIQZIRJIRKIRLIRMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISN" + "ISOISPIXTIXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIY" + "YIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJIVJIVKIVLI" + "VMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWPIWQIWRIWSIWT" + "IWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSYJLZJMKJMLJMMJMNJMOJMPJMQJ" + "MRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJNOJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZ" + "JOKJOLJOMJONJOOJOPJOQJORJOSJOTJOMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJK" + "KJKLJKMJKNJKOJKPJKQJKRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJ" + "LTJLUJLVJLWJLXJLQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJST" + "JSUJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJUKJULJU" + "UJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZJQKJQLJQMJ" + "QNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJRPJRYJWZJXKJXLJXMJXN" + "JXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYLJYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJY" + "WJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZRJZSJZTJZMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJ" + "UXJUYJUZJVKJVLJVMJVNJVOJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWP" + "JWQJWRJWSJWTJWUJWVJWWJWXJWMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTK" + "NUKNVKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMKPNKPO" + "KPPKPQKPRKUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKXKKYKKZKL" + "LKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKMPKMQKMRKMSKSRKSSK" + "STKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTSKTTKTUKTVKTWKTXKTYKTZKULKUMKUN" + "KUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKUZKVLKVMKVNKVOKVPKPSKPTKPUKPVKPWKPXKPYKP" + "ZKQLKQMKQNKQOKQPKQQKQRKQSKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTK" + "RUKRVKRWKRXKRYKRZKSLKSMKSNKSOKSPKSQKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZM" + "KZNKZOKZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVLLWL" + "LXLLYLLZLMMLMNLMOLMPVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQKWRKWSK" + "WTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXXKXYKXZKYLKYMKYN" + "KYOKLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQRLQSLQTLQULQVLQWLQXLQYLQZLRML" + "RNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLRZLSMLSNLSOLSPLSQLSRLSSLSTLMQLMRLMSLMT" + "LMULMVLMWLMXLMYLMZLNMLNNLNOLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLO" + "QLORLOSLOTLOULOVLOWLOXLOYLOZLPMLPNLPOLPPLPQLPRLVWLVXLVYLVZLWMLWNLWOLWPLWQL" + "WRLWSLWTLWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLYN" + "LYOLYPLYQLYRLYSLYTLYULYVLYWLYXLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSLTTLT" + "ULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVMLVNLVOLVPLVQL" + "VRLVSLVTLVULVVOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYMOZMPNMPOMPPMPQMPRMPSMPTMPUMP" + "VMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQVMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRLY" + "YLYZLZMLZNLZOLZPLZQLZRLZSLZTLZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMV" + "MMWMMXMMYMMZMNNMNOMNPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOYMUZMVNMVOMVPMVQMV" + "RMVSMVTMVUMVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPM" + "XQMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQMSR" + "MSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTXMTYMTZMUNMUOMUPMU" + "QMURMUSMUTMUUMUVMUWMUXMUOXNOYNOZNPONPPNPQNPRNPSNPTNPUNPVNPWNPXNPYNPZNQONQP" + "NQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNRRNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNS" + "QNSRNSSNQMYRMYSMYTMYUMYVMYWMYXMYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZ" + "ZNNNONNPNNQNNRNNSNNTNNUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNWPNWQNWR" + "NWSNWTNWUNWVNWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNY" + "SNYTNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNSTNSUNSVNSWNSXNSYNSZNTON" + "TPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUYNUZNVONVP" + "NVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONORXORYORZOSPOSQOSROSSOSTOSUOSVOSWOSXOSYO" + "SZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOUROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQ" + "OVROVSOVTOVUOVVOVWZXNZYNZZOOOPOOQOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOP" + "TOPUOPVOPWOPXOPYOPZOQPOQQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVO" + "RWOZXOZYOZZPPPQPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPR" + "QPRRPRSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTOVXOVYOVZOWPOW" + "QOWROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQOYROYSO" + "YTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWQPTRPTSPTTPTUPTV"; + +TEST(ZlibTest, DeflateZFixedCorruption) { + // Tavis's test case from + // https://www.openwall.com/lists/oss-security/2022/03/26/1 + // The upstream fix, + // https://github.com/madler/zlib/commit/5c44459c3b28a9bd3283aaceab7c615f8020c531, + // was merged in Chromium in #583975. + + z_stream stream; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + + int level = Z_DEFAULT_COMPRESSION; + int windowBits = 15; + int memLevel = 1; + int strategy = Z_FIXED; + + int ret = + deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + ASSERT_EQ(ret, Z_OK); + std::vector compressed( + deflateBound(&stream, strlen(zFixedCorruptionData))); + stream.next_out = compressed.data(); + stream.avail_out = compressed.size(); + stream.next_in = (uint8_t*)zFixedCorruptionData; + stream.avail_in = strlen(zFixedCorruptionData); + ret = deflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + size_t compressed_sz = compressed.size() - stream.avail_out; + deflateEnd(&stream); + + std::vector decompressed(strlen(zFixedCorruptionData)); + ret = inflateInit2(&stream, windowBits); + ASSERT_EQ(ret, Z_OK); + stream.next_in = compressed.data(); + stream.avail_in = compressed_sz; + stream.next_out = decompressed.data(); + stream.avail_out = decompressed.size(); + ret = inflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + inflateEnd(&stream); + + EXPECT_EQ(decompressed.size(), strlen(zFixedCorruptionData)); + EXPECT_EQ( + memcmp(zFixedCorruptionData, decompressed.data(), decompressed.size()), + 0); +} + +// TODO(gustavoa): make these tests run standalone. +#ifndef CMAKE_STANDALONE_UNITTESTS + +TEST(ZlibTest, ZipFilenameCommentSize) { + // Check that minizip rejects zip member filenames or comments longer than + // the zip format can represent. + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("crbug1470539.zip"); + + zipFile zf = zipOpen(zip_file.AsUTF8Unsafe().c_str(), APPEND_STATUS_CREATE); + ASSERT_NE(zf, nullptr); + + // Adding a member with 2^16 byte filename is okay. + std::string long_filename(UINT16_MAX, 'a'); + EXPECT_EQ(zipOpenNewFileInZip(zf, long_filename.c_str(), nullptr, nullptr, 0, + nullptr, 0, nullptr, Z_DEFLATED, + Z_DEFAULT_COMPRESSION), + ZIP_OK); + EXPECT_EQ(zipWriteInFileInZip(zf, "1", 1), ZIP_OK); + EXPECT_EQ(zipCloseFileInZip(zf), ZIP_OK); + + // Adding a member with 2^16+1 byte filename is NOT okay. + std::string too_long_filename = long_filename + 'a'; + EXPECT_EQ(zipOpenNewFileInZip(zf, too_long_filename.c_str(), nullptr, nullptr, + 0, nullptr, 0, nullptr, Z_DEFLATED, + Z_DEFAULT_COMPRESSION), + ZIP_PARAMERROR); + + // Adding a member with 2^16 byte comment is okay. + std::string long_comment(UINT16_MAX, 'x'); + EXPECT_EQ(zipOpenNewFileInZip(zf, "x", nullptr, nullptr, 0, nullptr, 0, + long_comment.c_str(), Z_DEFLATED, + Z_DEFAULT_COMPRESSION), + ZIP_OK); + EXPECT_EQ(zipCloseFileInZip(zf), ZIP_OK); + + // Adding a member with 2^16+1 byte comment is NOT okay. + std::string too_long_comment = long_comment + 'x'; + EXPECT_EQ(zipOpenNewFileInZip(zf, "x", nullptr, nullptr, 0, nullptr, 0, + too_long_comment.c_str(), Z_DEFLATED, + Z_DEFAULT_COMPRESSION), + ZIP_PARAMERROR); + + EXPECT_EQ(zipClose(zf, nullptr), ZIP_OK); + + // Check that the long filename and comment members were successfully added. + unzFile uzf = unzOpen(zip_file.AsUTF8Unsafe().c_str()); + ASSERT_NE(uzf, nullptr); + char buf[UINT16_MAX + 2]; + + ASSERT_EQ(unzGoToFirstFile(uzf), UNZ_OK); + ASSERT_EQ(unzGetCurrentFileInfo(uzf, nullptr, buf, sizeof(buf), nullptr, 0, + nullptr, 0), + UNZ_OK); + EXPECT_EQ(std::string(buf), long_filename); + + ASSERT_EQ(unzGoToNextFile(uzf), UNZ_OK); + ASSERT_EQ(unzGetCurrentFileInfo(uzf, nullptr, nullptr, 0, nullptr, 0, buf, + sizeof(buf)), + UNZ_OK); + EXPECT_EQ(std::string(buf), long_comment); + + EXPECT_EQ(unzGoToNextFile(uzf), UNZ_END_OF_LIST_OF_FILE); + EXPECT_EQ(unzClose(uzf), UNZ_OK); +} + +TEST(ZlibTest, ZipExtraFieldSize) { + // Check that minizip rejects zip members with too large extra fields. + + std::string extra_field; + extra_field.append("\x12\x34"); // Header ID. + extra_field.append("\xfb\xff"); // Data size (not including the header). + extra_field.append(UINT16_MAX - 4, 'a'); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("extrafield.zip"); + + zipFile zf = zipOpen(zip_file.AsUTF8Unsafe().c_str(), APPEND_STATUS_CREATE); + ASSERT_NE(zf, nullptr); + + // Adding a member with 2^16 byte extra field should work. + EXPECT_EQ(zipOpenNewFileInZip(zf, "a", nullptr, extra_field.data(), + extra_field.size(), extra_field.data(), + extra_field.size(), nullptr, Z_DEFLATED, + Z_DEFAULT_COMPRESSION), + ZIP_OK); + EXPECT_EQ(zipWriteInFileInZip(zf, "1", 1), ZIP_OK); + EXPECT_EQ(zipCloseFileInZip(zf), ZIP_OK); + + // More then 2^16 bytes doesn't work. Neither for size_extrafield_local, nor + // size_extrafield_global. + std::string extra_field_long = extra_field + 'x'; + EXPECT_EQ( + zipOpenNewFileInZip(zf, "b", nullptr, nullptr, 0, extra_field_long.data(), + extra_field_long.size(), nullptr, Z_DEFLATED, + Z_DEFAULT_COMPRESSION), + ZIP_PARAMERROR); + EXPECT_EQ(zipOpenNewFileInZip(zf, "b", nullptr, extra_field_long.data(), + extra_field_long.size(), nullptr, 0, nullptr, + Z_DEFLATED, Z_DEFAULT_COMPRESSION), + ZIP_PARAMERROR); + + EXPECT_EQ(zipClose(zf, nullptr), ZIP_OK); + + // Check that the data can be read back. + unzFile uzf = unzOpen(zip_file.AsUTF8Unsafe().c_str()); + ASSERT_NE(uzf, nullptr); + char buf[UINT16_MAX + 1] = {0}; + + ASSERT_EQ(unzGoToFirstFile(uzf), UNZ_OK); + ASSERT_EQ(unzGetCurrentFileInfo(uzf, nullptr, nullptr, 0, buf, + sizeof(buf) - 1, nullptr, 0), + UNZ_OK); + EXPECT_EQ(std::string(buf), extra_field); + + EXPECT_EQ(unzGoToNextFile(uzf), UNZ_END_OF_LIST_OF_FILE); + EXPECT_EQ(unzClose(uzf), UNZ_OK); +} + +#endif diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.c new file mode 100644 index 000000000..64e0428cd --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.c @@ -0,0 +1,189 @@ +/* cpu_features.c -- Processor features detection. + * + * Copyright 2018 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#include "cpu_features.h" +#include "zutil.h" + +#include +#if defined(_MSC_VER) +#include +#elif defined(ADLER32_SIMD_SSSE3) +#include +#endif + +/* TODO(cavalcantii): remove checks for x86_flags on deflate. + */ +#if defined(ARMV8_OS_MACOS) +/* Crypto extensions (crc32/pmull) are a baseline feature in ARMv8.1-A, and + * OSX running on arm64 is new enough that these can be assumed without + * runtime detection. + */ +int ZLIB_INTERNAL arm_cpu_enable_crc32 = 1; +int ZLIB_INTERNAL arm_cpu_enable_pmull = 1; +#else +int ZLIB_INTERNAL arm_cpu_enable_crc32 = 0; +int ZLIB_INTERNAL arm_cpu_enable_pmull = 0; +#endif +int ZLIB_INTERNAL x86_cpu_enable_sse2 = 0; +int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0; +int ZLIB_INTERNAL x86_cpu_enable_simd = 0; +int ZLIB_INTERNAL x86_cpu_enable_avx512 = 0; + +#ifndef CPU_NO_SIMD + +#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) || defined(ARMV8_OS_IOS) +#include +#endif + +#if defined(ARMV8_OS_ANDROID) +#include +#elif defined(ARMV8_OS_LINUX) +#include +#include +#elif defined(ARMV8_OS_FUCHSIA) +#include +#include +#include +#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS) +#include +#elif defined(ARMV8_OS_IOS) +#include +#elif !defined(_MSC_VER) +#include +#else +#error cpu_features.c CPU feature detection in not defined for your platform +#endif + +#if !defined(CPU_NO_SIMD) && !defined(ARMV8_OS_MACOS) +static void _cpu_check_features(void); +#endif + +#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_MACOS) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS) || defined(ARMV8_OS_IOS) +#if !defined(ARMV8_OS_MACOS) +// _cpu_check_features() doesn't need to do anything on mac/arm since all +// features are known at build time, so don't call it. +// Do provide cpu_check_features() (with a no-op implementation) so that we +// don't have to make all callers of it check for mac/arm. +static pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT; +#endif +void ZLIB_INTERNAL cpu_check_features(void) +{ +#if !defined(ARMV8_OS_MACOS) + pthread_once(&cpu_check_inited_once, _cpu_check_features); +#endif +} +#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS) +static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT; +static BOOL CALLBACK _cpu_check_features_forwarder(PINIT_ONCE once, PVOID param, PVOID* context) +{ + _cpu_check_features(); + return TRUE; +} +void ZLIB_INTERNAL cpu_check_features(void) +{ + InitOnceExecuteOnce(&cpu_check_inited_once, _cpu_check_features_forwarder, + NULL, NULL); +} +#endif + +#if (defined(__ARM_NEON__) || defined(__ARM_NEON)) +#if !defined(ARMV8_OS_MACOS) +/* + * See http://bit.ly/2CcoEsr for run-time detection of ARM features and also + * crbug.com/931275 for android_getCpuFeatures() use in the Android sandbox. + */ +static void _cpu_check_features(void) +{ +#if defined(ARMV8_OS_ANDROID) && defined(__aarch64__) + uint64_t features = android_getCpuFeatures(); + arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM64_FEATURE_CRC32); + arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM64_FEATURE_PMULL); +#elif defined(ARMV8_OS_ANDROID) /* aarch32 */ + uint64_t features = android_getCpuFeatures(); + arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM_FEATURE_CRC32); + arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM_FEATURE_PMULL); +#elif defined(ARMV8_OS_LINUX) && defined(__aarch64__) + unsigned long features = getauxval(AT_HWCAP); + arm_cpu_enable_crc32 = !!(features & HWCAP_CRC32); + arm_cpu_enable_pmull = !!(features & HWCAP_PMULL); +#elif defined(ARMV8_OS_LINUX) && (defined(__ARM_NEON) || defined(__ARM_NEON__)) + /* Query HWCAP2 for ARMV8-A SoCs running in aarch32 mode */ + unsigned long features = getauxval(AT_HWCAP2); + arm_cpu_enable_crc32 = !!(features & HWCAP2_CRC32); + arm_cpu_enable_pmull = !!(features & HWCAP2_PMULL); +#elif defined(ARMV8_OS_FUCHSIA) + uint32_t features; + zx_status_t rc = zx_system_get_features(ZX_FEATURE_KIND_CPU, &features); + if (rc != ZX_OK || (features & ZX_ARM64_FEATURE_ISA_ASIMD) == 0) + return; /* Report nothing if ASIMD(NEON) is missing */ + arm_cpu_enable_crc32 = !!(features & ZX_ARM64_FEATURE_ISA_CRC32); + arm_cpu_enable_pmull = !!(features & ZX_ARM64_FEATURE_ISA_PMULL); +#elif defined(ARMV8_OS_WINDOWS) + arm_cpu_enable_crc32 = IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE); + arm_cpu_enable_pmull = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE); +#elif defined(ARMV8_OS_IOS) + // Determine what features are supported dynamically. This code is applicable to macOS + // as well if we wish to do that dynamically on that platform in the future. + // See https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics + int val = 0; + size_t len = sizeof(val); + arm_cpu_enable_crc32 = sysctlbyname("hw.optional.armv8_crc32", &val, &len, 0, 0) == 0 + && val != 0; + val = 0; + len = sizeof(val); + arm_cpu_enable_pmull = sysctlbyname("hw.optional.arm.FEAT_PMULL", &val, &len, 0, 0) == 0 + && val != 0; +#endif +} +#endif +#elif defined(X86_NOT_WINDOWS) || defined(X86_WINDOWS) +/* + * iOS@x86 (i.e. emulator) is another special case where we disable + * SIMD optimizations. + */ +#ifndef CPU_NO_SIMD +/* On x86 we simply use a instruction to check the CPU features. + * (i.e. CPUID). + */ +#ifdef CRC32_SIMD_AVX512_PCLMUL +#include +#include +#endif +static void _cpu_check_features(void) +{ + int x86_cpu_has_sse2; + int x86_cpu_has_ssse3; + int x86_cpu_has_sse42; + int x86_cpu_has_pclmulqdq; + int abcd[4]; + +#ifdef _MSC_VER + __cpuid(abcd, 1); +#else + __cpuid(1, abcd[0], abcd[1], abcd[2], abcd[3]); +#endif + + x86_cpu_has_sse2 = abcd[3] & 0x4000000; + x86_cpu_has_ssse3 = abcd[2] & 0x000200; + x86_cpu_has_sse42 = abcd[2] & 0x100000; + x86_cpu_has_pclmulqdq = abcd[2] & 0x2; + + x86_cpu_enable_sse2 = x86_cpu_has_sse2; + + x86_cpu_enable_ssse3 = x86_cpu_has_ssse3; + + x86_cpu_enable_simd = x86_cpu_has_sse2 && + x86_cpu_has_sse42 && + x86_cpu_has_pclmulqdq; + +#ifdef CRC32_SIMD_AVX512_PCLMUL + x86_cpu_enable_avx512 = _xgetbv(0) & 0x00000040; +#endif +} +#endif +#endif +#endif diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.h new file mode 100644 index 000000000..aed3e834c --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/cpu_features.h @@ -0,0 +1,19 @@ +/* cpu_features.h -- Processor features detection. + * + * Copyright 2018 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#include "zlib.h" + +/* TODO(cavalcantii): remove checks for x86_flags on deflate. + */ +extern int arm_cpu_enable_crc32; +extern int arm_cpu_enable_pmull; +extern int x86_cpu_enable_sse2; +extern int x86_cpu_enable_ssse3; +extern int x86_cpu_enable_simd; +extern int x86_cpu_enable_avx512; + +void cpu_check_features(void); diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.c new file mode 100644 index 000000000..1e1a57519 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.c @@ -0,0 +1,1182 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2022 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * This interleaved implementation of a CRC makes use of pipelined multiple + * arithmetic-logic units, commonly found in modern CPU cores. It is due to + * Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + MAKECRCH can be #defined to write out crc32.h. A main() routine is also + produced, so that this one source file can be compiled to an executable. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "deflate.h" +#include "cpu_features.h" +#include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */ + +#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32) +#include "crc32_simd.h" +#endif + + /* + A CRC of a message is computed on N braids of words in the message, where + each word consists of W bytes (4 or 8). If N is 3, for example, then three + running sparse CRCs are calculated respectively on each braid, at these + indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ... + This is done starting at a word boundary, and continues until as many blocks + of N * W bytes as are available have been processed. The results are combined + into a single CRC at the end. For this code, N must be in the range 1..6 and + W must be 4 or 8. The upper limit on N can be increased if desired by adding + more #if blocks, extending the patterns apparent in the code. In addition, + crc32.h would need to be regenerated, if the maximum N value is increased. + + N and W are chosen empirically by benchmarking the execution time on a given + processor. The choices for N and W below were based on testing on Intel Kaby + Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64 + Octeon II processors. The Intel, AMD, and ARM processors were all fastest + with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4. + They were all tested with either gcc or clang, all using the -O3 optimization + level. Your mileage may vary. + */ + +/* Define N */ +#ifdef Z_TESTN +# define N Z_TESTN +#else +# define N 5 +#endif +#if N < 1 || N > 6 +# error N must be in 1..6 +#endif + +/* + z_crc_t must be at least 32 bits. z_word_t must be at least as long as + z_crc_t. It is assumed here that z_word_t is either 32 bits or 64 bits, and + that bytes are eight bits. + */ + +/* + Define W and the associated z_word_t type. If W is not defined, then a + braided calculation is not used, and the associated tables and code are not + compiled. + */ +#ifdef Z_TESTW +# if Z_TESTW-1 != -1 +# define W Z_TESTW +# endif +#else +# ifdef MAKECRCH +# define W 8 /* required for MAKECRCH */ +# else +# if defined(__x86_64__) || defined(__aarch64__) +# define W 8 +# else +# define W 4 +# endif +# endif +#endif +#ifdef W +# if W == 8 && defined(Z_U8) + typedef Z_U8 z_word_t; +# elif defined(Z_U4) +# undef W +# define W 4 + typedef Z_U4 z_word_t; +# else +# undef W +# endif +#endif + +/* If available, use the ARM processor CRC32 instruction. */ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 \ + && defined(USE_CANONICAL_ARMV8_CRC32) +# define ARMCRC32_CANONICAL_ZLIB +#endif + +#if defined(W) && (!defined(ARMCRC32_CANONICAL_ZLIB) || defined(DYNAMIC_CRC_TABLE)) +/* + Swap the bytes in a z_word_t to convert between little and big endian. Any + self-respecting compiler will optimize this to a single machine byte-swap + instruction, if one is available. This assumes that word_t is either 32 bits + or 64 bits. + */ +local z_word_t byte_swap(z_word_t word) { +# if W == 8 + return + (word & 0xff00000000000000) >> 56 | + (word & 0xff000000000000) >> 40 | + (word & 0xff0000000000) >> 24 | + (word & 0xff00000000) >> 8 | + (word & 0xff000000) << 8 | + (word & 0xff0000) << 24 | + (word & 0xff00) << 40 | + (word & 0xff) << 56; +# else /* W == 4 */ + return + (word & 0xff000000) >> 24 | + (word & 0xff0000) >> 8 | + (word & 0xff00) << 8 | + (word & 0xff) << 24; +# endif +} +#endif + +#ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Table of powers of x for combining CRC-32s, filled in by make_crc_table() + * below. + */ + local z_crc_t FAR x2n_table[32]; +#else +/* ========================================================================= + * Tables for byte-wise and braided CRC-32 calculations, and a table of powers + * of x for combining CRC-32s, all made by make_crc_table(). + */ +# include "crc32.h" +#endif + +/* CRC polynomial. */ +#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ + +/* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. + */ +local z_crc_t multmodp(z_crc_t a, z_crc_t b) { + z_crc_t m, p; + + m = (z_crc_t)1 << 31; + p = 0; + for (;;) { + if (a & m) { + p ^= b; + if ((a & (m - 1)) == 0) + break; + } + m >>= 1; + b = b & 1 ? (b >> 1) ^ POLY : b >> 1; + } + return p; +} + +/* + Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been + initialized. + */ +local z_crc_t x2nmodp(z_off64_t n, unsigned k) { + z_crc_t p; + + p = (z_crc_t)1 << 31; /* x^0 == 1 */ + while (n) { + if (n & 1) + p = multmodp(x2n_table[k & 31], p); + n >>= 1; + k++; + } + return p; +} + +#ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Build the tables for byte-wise and braided CRC-32 calculations, and a table + * of powers of x for combining CRC-32s. + */ +local z_crc_t FAR crc_table[256]; +#ifdef W + local z_word_t FAR crc_big_table[256]; + local z_crc_t FAR crc_braid_table[W][256]; + local z_word_t FAR crc_braid_big_table[W][256]; + local void braid(z_crc_t [][256], z_word_t [][256], int, int); +#endif +#ifdef MAKECRCH + local void write_table(FILE *, const z_crc_t FAR *, int); + local void write_table32hi(FILE *, const z_word_t FAR *, int); + local void write_table64(FILE *, const z_word_t FAR *, int); +#endif /* MAKECRCH */ + +/* + Define a once() function depending on the availability of atomics. If this is + compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in + multiple threads, and if atomics are not available, then get_crc_table() must + be called to initialize the tables and must return before any threads are + allowed to compute or combine CRCs. + */ + +/* Definition of once functionality. */ +typedef struct once_s once_t; + +/* Check for the availability of atomics. */ +#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \ + !defined(__STDC_NO_ATOMICS__) + +#include + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + atomic_flag begun; + atomic_int done; +}; +#define ONCE_INIT {ATOMIC_FLAG_INIT, 0} + +/* + Run the provided init() function exactly once, even if multiple threads + invoke once() at the same time. The state must be a once_t initialized with + ONCE_INIT. + */ +local void once(once_t *state, void (*init)(void)) { + if (!atomic_load(&state->done)) { + if (atomic_flag_test_and_set(&state->begun)) + while (!atomic_load(&state->done)) + ; + else { + init(); + atomic_store(&state->done, 1); + } + } +} + +#else /* no atomics */ + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + volatile int begun; + volatile int done; +}; +#define ONCE_INIT {0, 0} + +/* Test and set. Alas, not atomic, but tries to minimize the period of + vulnerability. */ +local int test_and_set(int volatile *flag) { + int was; + + was = *flag; + *flag = 1; + return was; +} + +/* Run the provided init() function once. This is not thread-safe. */ +local void once(once_t *state, void (*init)(void)) { + if (!state->done) { + if (test_and_set(&state->begun)) + while (!state->done) + ; + else { + init(); + state->done = 1; + } + } +} + +#endif + +/* State for once(). */ +local once_t made = ONCE_INIT; + +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x^2+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x + (which is shifting right by one and adding x^32 mod p if the bit shifted out + is a one). We start with the highest power (least significant bit) of q and + repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all the + information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. + */ +local void make_crc_table(void) +{ + unsigned i, j, n; + z_crc_t p; + + /* initialize the CRC of bytes tables */ + for (i = 0; i < 256; i++) { + p = i; + for (j = 0; j < 8; j++) + p = p & 1 ? (p >> 1) ^ POLY : p >> 1; + crc_table[i] = p; +#ifdef W + crc_big_table[i] = byte_swap(p); +#endif + } + + /* initialize the x^2^n mod p(x) table */ + p = (z_crc_t)1 << 30; /* x^1 */ + x2n_table[0] = p; + for (n = 1; n < 32; n++) + x2n_table[n] = p = multmodp(p, p); + +#ifdef W + /* initialize the braiding tables -- needs x2n_table[] */ + braid(crc_braid_table, crc_braid_big_table, N, W); +#endif + +#ifdef MAKECRCH + { + /* + The crc32.h header file contains tables for both 32-bit and 64-bit + z_word_t's, and so requires a 64-bit type be available. In that case, + z_word_t must be defined to be 64-bits. This code then also generates + and writes out the tables for the case that z_word_t is 32 bits. + */ +#if !defined(W) || W != 8 +# error Need a 64-bit integer type in order to generate crc32.h. +#endif + FILE *out; + int k, n; + z_crc_t ltl[8][256]; + z_word_t big[8][256]; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + + /* write out little-endian CRC table to crc32.h */ + fprintf(out, + "/* crc32.h -- tables for rapid CRC calculation\n" + " * Generated automatically by crc32.c\n */\n" + "\n" + "local const z_crc_t FAR crc_table[] = {\n" + " "); + write_table(out, crc_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#ifdef W\n" + "\n" + "#if W == 8\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table64(out, crc_big_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table32hi(out, crc_big_table, 256); + fprintf(out, + "};\n" + "\n" + "#endif\n"); + + /* write out braid tables for each value of N */ + for (n = 1; n <= 6; n++) { + fprintf(out, + "\n" + "#if N == %d\n", n); + + /* compute braid tables for this N and 64-bit word_t */ + braid(ltl, big, n, 8); + + /* write out braid tables for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#if W == 8\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table64(out, big[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n"); + + /* compute braid tables for this N and 32-bit word_t */ + braid(ltl, big, n, 4); + + /* write out braid tables for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table32hi(out, big[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "#endif\n" + "\n" + "#endif\n"); + } + fprintf(out, + "\n" + "#endif\n"); + + /* write out zeros operator table to crc32.h */ + fprintf(out, + "\n" + "local const z_crc_t FAR x2n_table[] = {\n" + " "); + write_table(out, x2n_table, 32); + fprintf(out, + "};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH + +/* + Write the 32-bit values in table[0..k-1] to out, five per line in + hexadecimal separated by commas. + */ +local void write_table(FILE *out, const z_crc_t FAR *table, int k) { + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the high 32-bits of each value in table[0..k-1] to out, five per line + in hexadecimal separated by commas. + */ +local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) { + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n] >> 32), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the 64-bit values in table[0..k-1] to out, three per line in + hexadecimal separated by commas. This assumes that if there is a 64-bit + type, then there is also a long long integer type, and it is at least 64 + bits. If not, then the type cast and format string can be adjusted + accordingly. + */ +local void write_table64(FILE *out, const z_word_t FAR *table, int k) { + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%016llx%s", n == 0 || n % 3 ? "" : " ", + (unsigned long long)(table[n]), + n == k - 1 ? "" : (n % 3 == 2 ? ",\n" : ", ")); +} + +/* Actually do the deed. */ +int main(void) { + make_crc_table(); + return 0; +} + +#endif /* MAKECRCH */ + +#ifdef W +/* + Generate the little and big-endian braid tables for the given n and z_word_t + size w. Each array must have room for w blocks of 256 elements. + */ +local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) { + int k; + z_crc_t i, p, q; + for (k = 0; k < w; k++) { + p = x2nmodp((n * w + 3 - k) << 3, 0); + ltl[k][0] = 0; + big[w - 1 - k][0] = 0; + for (i = 1; i < 256; i++) { + ltl[k][i] = q = multmodp(i << 24, p); + big[w - 1 - k][i] = byte_swap(q); + } + } +} +#endif + +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32(), and to force the + * generation of the CRC tables in a threaded application. + */ +const z_crc_t FAR * ZEXPORT get_crc_table(void) { +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= + * Use ARM machine instructions if available. This will compute the CRC about + * ten times faster than the braided calculation. This code does not check for + * the presence of the CRC instruction at run time. __ARM_FEATURE_CRC32 will + * only be defined if the compilation specifies an ARM processor architecture + * that has the instructions. For example, compiling with -march=armv8.1-a or + * -march=armv8-a+crc, or -march=native if the compile machine has the crc32 + * instructions. + */ +#if ARMCRC32_CANONICAL_ZLIB + +/* + Constants empirically determined to maximize speed. These values are from + measurements on a Cortex-A57. Your mileage may vary. + */ +#define Z_BATCH 3990 /* number of words in a batch */ +#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ +#define Z_BATCH_MIN 800 /* fewest words in a final batch */ + +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { + z_crc_t val; + z_word_t crc1, crc2; + const z_word_t *word; + z_word_t val0, val1, val2; + z_size_t last, last2, i; + z_size_t num; + + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; + +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; + + /* Compute the CRC up to a word boundary. */ + while (len && ((z_size_t)buf & 7) != 0) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Prepare to compute the CRC on full 64-bit words word[0..num-1]. */ + word = (z_word_t const *)buf; + num = len >> 3; + len &= 7; + + /* Do three interleaved CRCs to realize the throughput of one crc32x + instruction per cycle. Each CRC is calculated on Z_BATCH words. The + three CRCs are combined into a single CRC after each set of batches. */ + while (num >= 3 * Z_BATCH) { + crc1 = 0; + crc2 = 0; + for (i = 0; i < Z_BATCH; i++) { + val0 = word[i]; + val1 = word[i + Z_BATCH]; + val2 = word[i + 2 * Z_BATCH]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * Z_BATCH; + num -= 3 * Z_BATCH; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc1; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc2; + } + + /* Do one last smaller batch with the remaining words, if there are enough + to pay for the combination of CRCs. */ + last = num / 3; + if (last >= Z_BATCH_MIN) { + last2 = last << 1; + crc1 = 0; + crc2 = 0; + for (i = 0; i < last; i++) { + val0 = word[i]; + val1 = word[i + last]; + val2 = word[i + last2]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * last; + num -= 3 * last; + val = x2nmodp(last, 6); + crc = multmodp(val, crc) ^ crc1; + crc = multmodp(val, crc) ^ crc2; + } + + /* Compute the CRC on any remaining words. */ + for (i = 0; i < num; i++) { + val0 = word[i]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + } + word += num; + + /* Complete the CRC on any remaining bytes. */ + buf = (const unsigned char FAR *)word; + while (len) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; +} + +#else + +#ifdef W + +/* + Return the CRC of the W bytes in the word_t data, taking the + least-significant byte of the word as the first byte of data, without any pre + or post conditioning. This is used to combine the CRCs of each braid. + */ +local z_crc_t crc_word(z_word_t data) { + int k; + for (k = 0; k < W; k++) + data = (data >> 8) ^ crc_table[data & 0xff]; + return (z_crc_t)data; +} + +local z_word_t crc_word_big(z_word_t data) { + int k; + for (k = 0; k < W; k++) + data = (data << 8) ^ + crc_big_table[(data >> ((W - 1) << 3)) & 0xff]; + return data; +} + +#endif + +/* ========================================================================= */ +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { + /* + * zlib convention is to call crc32(0, NULL, 0); before making + * calls to crc32(). So this is a good, early (and infrequent) + * place to cache CPU features if needed for those later, more + * interesting crc32() calls. + */ +#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32) + /* + * Since this routine can be freely used, check CPU features here. + */ + if (buf == Z_NULL) { + if (!len) /* Assume user is calling crc32(0, NULL, 0); */ + cpu_check_features(); + return 0UL; + } + +#endif +#if defined(CRC32_SIMD_AVX512_PCLMUL) + if (x86_cpu_enable_avx512 && len >= Z_CRC32_AVX512_MINIMUM_LENGTH) { + /* crc32 64-byte chunks */ + z_size_t chunk_size = len & ~Z_CRC32_AVX512_CHUNKSIZE_MASK; + crc = ~crc32_avx512_simd_(buf, chunk_size, ~(uint32_t)crc); + /* check remaining data */ + len -= chunk_size; + if (!len) + return crc; + /* Fall into the default crc32 for the remaining data. */ + buf += chunk_size; + } +#elif defined(CRC32_SIMD_SSE42_PCLMUL) + if (x86_cpu_enable_simd && len >= Z_CRC32_SSE42_MINIMUM_LENGTH) { + /* crc32 16-byte chunks */ + z_size_t chunk_size = len & ~Z_CRC32_SSE42_CHUNKSIZE_MASK; + crc = ~crc32_sse42_simd_(buf, chunk_size, ~(uint32_t)crc); + /* check remaining data */ + len -= chunk_size; + if (!len) + return crc; + /* Fall into the default crc32 for the remaining data. */ + buf += chunk_size; + } +#elif defined(CRC32_ARMV8_CRC32) + if (arm_cpu_enable_crc32) { +#if defined(__aarch64__) + /* PMULL is 64bit only, plus code needs at least a 64 bytes buffer. */ + if (arm_cpu_enable_pmull && (len > Z_CRC32_PMULL_MINIMUM_LENGTH)) { + const size_t chunk_size = len & ~Z_CRC32_PMULL_CHUNKSIZE_MASK; + crc = ~armv8_crc32_pmull_little(buf, chunk_size, ~(uint32_t)crc); + /* Check remaining data. */ + len -= chunk_size; + if (!len) + return crc; + + /* Fall through for the remaining data. */ + buf += chunk_size; + } +#endif + return armv8_crc32_little(buf, len, crc); /* Armv8@32bit or tail. */ + } +#else + if (buf == Z_NULL) { + return 0UL; + } +#endif /* CRC32_SIMD */ + +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; + +#ifdef W + + /* If provided enough bytes, do a braided CRC calculation. */ + if (len >= N * W + W - 1) { + z_size_t blks; + z_word_t const *words; + unsigned endian; + int k; + + /* Compute the CRC up to a z_word_t boundary. */ + while (len && ((z_size_t)buf & (W - 1)) != 0) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + + /* Compute the CRC on as many N z_word_t blocks as are available. */ + blks = len / (N * W); + len -= blks * N * W; + words = (z_word_t const *)buf; + + /* Do endian check at execution time instead of compile time, since ARM + processors can change the endianess at execution time. If the + compiler knows what the endianess will be, it can optimize out the + check and the unused branch. */ + endian = 1; + if (*(unsigned char *)&endian) { + /* Little endian. */ + + z_crc_t crc0; + z_word_t word0; +#if N > 1 + z_crc_t crc1; + z_word_t word1; +#if N > 2 + z_crc_t crc2; + z_word_t word2; +#if N > 3 + z_crc_t crc3; + z_word_t word3; +#if N > 4 + z_crc_t crc4; + z_word_t word4; +#if N > 5 + z_crc_t crc5; + z_word_t word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = crc; +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + crc = crc_word(crc0 ^ words[0]); +#if N > 1 + crc = crc_word(crc1 ^ words[1] ^ crc); +#if N > 2 + crc = crc_word(crc2 ^ words[2] ^ crc); +#if N > 3 + crc = crc_word(crc3 ^ words[3] ^ crc); +#if N > 4 + crc = crc_word(crc4 ^ words[4] ^ crc); +#if N > 5 + crc = crc_word(crc5 ^ words[5] ^ crc); +#endif +#endif +#endif +#endif +#endif + words += N; + } + else { + /* Big endian. */ + + z_word_t crc0, word0, comb; +#if N > 1 + z_word_t crc1, word1; +#if N > 2 + z_word_t crc2, word2; +#if N > 3 + z_word_t crc3, word3; +#if N > 4 + z_word_t crc4, word4; +#if N > 5 + z_word_t crc5, word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = byte_swap(crc); +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_big_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_big_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_big_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_big_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_big_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_big_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_big_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_big_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_big_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_big_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_big_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_big_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + comb = crc_word_big(crc0 ^ words[0]); +#if N > 1 + comb = crc_word_big(crc1 ^ words[1] ^ comb); +#if N > 2 + comb = crc_word_big(crc2 ^ words[2] ^ comb); +#if N > 3 + comb = crc_word_big(crc3 ^ words[3] ^ comb); +#if N > 4 + comb = crc_word_big(crc4 ^ words[4] ^ comb); +#if N > 5 + comb = crc_word_big(crc5 ^ words[5] ^ comb); +#endif +#endif +#endif +#endif +#endif + words += N; + crc = byte_swap(comb); + } + + /* + Update the pointer to the remaining bytes to process. + */ + buf = (unsigned char const *)words; + } + +#endif /* W */ + + /* Complete the computation of the CRC on any remaining bytes. */ + while (len >= 8) { + len -= 8; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + while (len) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; +} + +#endif + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, + uInt len) { + /* Some bots compile with optimizations disabled, others will emulate + * ARM on x86 and other weird combinations. + */ +#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32) + /* We got to verify CPU features, so exploit the common usage pattern + * of calling this function with Z_NULL for an initial valid crc value. + * This allows to cache the result of the feature check and avoid extraneous + * function calls. + */ + if (buf == Z_NULL) { + if (!len) /* Assume user is calling crc32(0, NULL, 0); */ + cpu_check_features(); + return 0UL; + } +#endif + +#if defined(CRC32_ARMV8_CRC32) + if (arm_cpu_enable_crc32) { +#if defined(__aarch64__) + /* PMULL is 64bit only, plus code needs at least a 64 bytes buffer. */ + if (arm_cpu_enable_pmull && (len > Z_CRC32_PMULL_MINIMUM_LENGTH)) { + const size_t chunk_size = len & ~Z_CRC32_PMULL_CHUNKSIZE_MASK; + crc = ~armv8_crc32_pmull_little(buf, chunk_size, ~(uint32_t)crc); + /* Check remaining data. */ + len -= chunk_size; + if (!len) + return crc; + + /* Fall through for the remaining data. */ + buf += chunk_size; + } +#endif + return armv8_crc32_little(buf, len, crc); /* Armv8@32bit or tail. */ + } +#endif + return crc32_z(crc, buf, len); /* Armv7 or Armv8 w/o crypto extensions. */ +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) { +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) { + return crc32_combine64(crc1, crc2, (z_off64_t)len2); +} +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) { +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return x2nmodp(len2, 3); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen(z_off_t len2) { + return crc32_combine_gen64((z_off64_t)len2); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) { + return multmodp(op, crc1) ^ (crc2 & 0xffffffff); +} + +ZLIB_INTERNAL void crc_reset(deflate_state *const s) +{ +#ifdef CRC32_SIMD_SSE42_PCLMUL + if (x86_cpu_enable_simd) { + crc_fold_init(s); + return; + } +#endif + s->strm->adler = crc32(0L, Z_NULL, 0); +} + +ZLIB_INTERNAL void crc_finalize(deflate_state *const s) +{ +#ifdef CRC32_SIMD_SSE42_PCLMUL + if (x86_cpu_enable_simd) + s->strm->adler = crc_fold_512to32(s); +#endif +} + +ZLIB_INTERNAL void copy_with_crc(z_streamp strm, Bytef *dst, long size) +{ +#ifdef CRC32_SIMD_SSE42_PCLMUL + if (x86_cpu_enable_simd) { + crc_fold_copy(strm->state, dst, strm->next_in, size); + return; + } +#endif + zmemcpy(dst, strm->next_in, size); + strm->adler = crc32(strm->adler, dst, size); +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.h new file mode 100644 index 000000000..137df68d6 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32.h @@ -0,0 +1,9446 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}; + +#ifdef W + +#if W == 8 + +local const z_word_t FAR crc_big_table[] = { + 0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}; + +#else /* W == 4 */ + +local const z_word_t FAR crc_big_table[] = { + 0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}; + +#endif + +#if N == 1 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}, + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}, + {0x0000000000000000, 0x41311b1900000000, 0x8262363200000000, + 0xc3532d2b00000000, 0x04c56c6400000000, 0x45f4777d00000000, + 0x86a75a5600000000, 0xc796414f00000000, 0x088ad9c800000000, + 0x49bbc2d100000000, 0x8ae8effa00000000, 0xcbd9f4e300000000, + 0x0c4fb5ac00000000, 0x4d7eaeb500000000, 0x8e2d839e00000000, + 0xcf1c988700000000, 0x5112c24a00000000, 0x1023d95300000000, + 0xd370f47800000000, 0x9241ef6100000000, 0x55d7ae2e00000000, + 0x14e6b53700000000, 0xd7b5981c00000000, 0x9684830500000000, + 0x59981b8200000000, 0x18a9009b00000000, 0xdbfa2db000000000, + 0x9acb36a900000000, 0x5d5d77e600000000, 0x1c6c6cff00000000, + 0xdf3f41d400000000, 0x9e0e5acd00000000, 0xa224849500000000, + 0xe3159f8c00000000, 0x2046b2a700000000, 0x6177a9be00000000, + 0xa6e1e8f100000000, 0xe7d0f3e800000000, 0x2483dec300000000, + 0x65b2c5da00000000, 0xaaae5d5d00000000, 0xeb9f464400000000, + 0x28cc6b6f00000000, 0x69fd707600000000, 0xae6b313900000000, + 0xef5a2a2000000000, 0x2c09070b00000000, 0x6d381c1200000000, + 0xf33646df00000000, 0xb2075dc600000000, 0x715470ed00000000, + 0x30656bf400000000, 0xf7f32abb00000000, 0xb6c231a200000000, + 0x75911c8900000000, 0x34a0079000000000, 0xfbbc9f1700000000, + 0xba8d840e00000000, 0x79dea92500000000, 0x38efb23c00000000, + 0xff79f37300000000, 0xbe48e86a00000000, 0x7d1bc54100000000, + 0x3c2ade5800000000, 0x054f79f000000000, 0x447e62e900000000, + 0x872d4fc200000000, 0xc61c54db00000000, 0x018a159400000000, + 0x40bb0e8d00000000, 0x83e823a600000000, 0xc2d938bf00000000, + 0x0dc5a03800000000, 0x4cf4bb2100000000, 0x8fa7960a00000000, + 0xce968d1300000000, 0x0900cc5c00000000, 0x4831d74500000000, + 0x8b62fa6e00000000, 0xca53e17700000000, 0x545dbbba00000000, + 0x156ca0a300000000, 0xd63f8d8800000000, 0x970e969100000000, + 0x5098d7de00000000, 0x11a9ccc700000000, 0xd2fae1ec00000000, + 0x93cbfaf500000000, 0x5cd7627200000000, 0x1de6796b00000000, + 0xdeb5544000000000, 0x9f844f5900000000, 0x58120e1600000000, + 0x1923150f00000000, 0xda70382400000000, 0x9b41233d00000000, + 0xa76bfd6500000000, 0xe65ae67c00000000, 0x2509cb5700000000, + 0x6438d04e00000000, 0xa3ae910100000000, 0xe29f8a1800000000, + 0x21cca73300000000, 0x60fdbc2a00000000, 0xafe124ad00000000, + 0xeed03fb400000000, 0x2d83129f00000000, 0x6cb2098600000000, + 0xab2448c900000000, 0xea1553d000000000, 0x29467efb00000000, + 0x687765e200000000, 0xf6793f2f00000000, 0xb748243600000000, + 0x741b091d00000000, 0x352a120400000000, 0xf2bc534b00000000, + 0xb38d485200000000, 0x70de657900000000, 0x31ef7e6000000000, + 0xfef3e6e700000000, 0xbfc2fdfe00000000, 0x7c91d0d500000000, + 0x3da0cbcc00000000, 0xfa368a8300000000, 0xbb07919a00000000, + 0x7854bcb100000000, 0x3965a7a800000000, 0x4b98833b00000000, + 0x0aa9982200000000, 0xc9fab50900000000, 0x88cbae1000000000, + 0x4f5def5f00000000, 0x0e6cf44600000000, 0xcd3fd96d00000000, + 0x8c0ec27400000000, 0x43125af300000000, 0x022341ea00000000, + 0xc1706cc100000000, 0x804177d800000000, 0x47d7369700000000, + 0x06e62d8e00000000, 0xc5b500a500000000, 0x84841bbc00000000, + 0x1a8a417100000000, 0x5bbb5a6800000000, 0x98e8774300000000, + 0xd9d96c5a00000000, 0x1e4f2d1500000000, 0x5f7e360c00000000, + 0x9c2d1b2700000000, 0xdd1c003e00000000, 0x120098b900000000, + 0x533183a000000000, 0x9062ae8b00000000, 0xd153b59200000000, + 0x16c5f4dd00000000, 0x57f4efc400000000, 0x94a7c2ef00000000, + 0xd596d9f600000000, 0xe9bc07ae00000000, 0xa88d1cb700000000, + 0x6bde319c00000000, 0x2aef2a8500000000, 0xed796bca00000000, + 0xac4870d300000000, 0x6f1b5df800000000, 0x2e2a46e100000000, + 0xe136de6600000000, 0xa007c57f00000000, 0x6354e85400000000, + 0x2265f34d00000000, 0xe5f3b20200000000, 0xa4c2a91b00000000, + 0x6791843000000000, 0x26a09f2900000000, 0xb8aec5e400000000, + 0xf99fdefd00000000, 0x3accf3d600000000, 0x7bfde8cf00000000, + 0xbc6ba98000000000, 0xfd5ab29900000000, 0x3e099fb200000000, + 0x7f3884ab00000000, 0xb0241c2c00000000, 0xf115073500000000, + 0x32462a1e00000000, 0x7377310700000000, 0xb4e1704800000000, + 0xf5d06b5100000000, 0x3683467a00000000, 0x77b25d6300000000, + 0x4ed7facb00000000, 0x0fe6e1d200000000, 0xccb5ccf900000000, + 0x8d84d7e000000000, 0x4a1296af00000000, 0x0b238db600000000, + 0xc870a09d00000000, 0x8941bb8400000000, 0x465d230300000000, + 0x076c381a00000000, 0xc43f153100000000, 0x850e0e2800000000, + 0x42984f6700000000, 0x03a9547e00000000, 0xc0fa795500000000, + 0x81cb624c00000000, 0x1fc5388100000000, 0x5ef4239800000000, + 0x9da70eb300000000, 0xdc9615aa00000000, 0x1b0054e500000000, + 0x5a314ffc00000000, 0x996262d700000000, 0xd85379ce00000000, + 0x174fe14900000000, 0x567efa5000000000, 0x952dd77b00000000, + 0xd41ccc6200000000, 0x138a8d2d00000000, 0x52bb963400000000, + 0x91e8bb1f00000000, 0xd0d9a00600000000, 0xecf37e5e00000000, + 0xadc2654700000000, 0x6e91486c00000000, 0x2fa0537500000000, + 0xe836123a00000000, 0xa907092300000000, 0x6a54240800000000, + 0x2b653f1100000000, 0xe479a79600000000, 0xa548bc8f00000000, + 0x661b91a400000000, 0x272a8abd00000000, 0xe0bccbf200000000, + 0xa18dd0eb00000000, 0x62defdc000000000, 0x23efe6d900000000, + 0xbde1bc1400000000, 0xfcd0a70d00000000, 0x3f838a2600000000, + 0x7eb2913f00000000, 0xb924d07000000000, 0xf815cb6900000000, + 0x3b46e64200000000, 0x7a77fd5b00000000, 0xb56b65dc00000000, + 0xf45a7ec500000000, 0x370953ee00000000, 0x763848f700000000, + 0xb1ae09b800000000, 0xf09f12a100000000, 0x33cc3f8a00000000, + 0x72fd249300000000}, + {0x0000000000000000, 0x376ac20100000000, 0x6ed4840300000000, + 0x59be460200000000, 0xdca8090700000000, 0xebc2cb0600000000, + 0xb27c8d0400000000, 0x85164f0500000000, 0xb851130e00000000, + 0x8f3bd10f00000000, 0xd685970d00000000, 0xe1ef550c00000000, + 0x64f91a0900000000, 0x5393d80800000000, 0x0a2d9e0a00000000, + 0x3d475c0b00000000, 0x70a3261c00000000, 0x47c9e41d00000000, + 0x1e77a21f00000000, 0x291d601e00000000, 0xac0b2f1b00000000, + 0x9b61ed1a00000000, 0xc2dfab1800000000, 0xf5b5691900000000, + 0xc8f2351200000000, 0xff98f71300000000, 0xa626b11100000000, + 0x914c731000000000, 0x145a3c1500000000, 0x2330fe1400000000, + 0x7a8eb81600000000, 0x4de47a1700000000, 0xe0464d3800000000, + 0xd72c8f3900000000, 0x8e92c93b00000000, 0xb9f80b3a00000000, + 0x3cee443f00000000, 0x0b84863e00000000, 0x523ac03c00000000, + 0x6550023d00000000, 0x58175e3600000000, 0x6f7d9c3700000000, + 0x36c3da3500000000, 0x01a9183400000000, 0x84bf573100000000, + 0xb3d5953000000000, 0xea6bd33200000000, 0xdd01113300000000, + 0x90e56b2400000000, 0xa78fa92500000000, 0xfe31ef2700000000, + 0xc95b2d2600000000, 0x4c4d622300000000, 0x7b27a02200000000, + 0x2299e62000000000, 0x15f3242100000000, 0x28b4782a00000000, + 0x1fdeba2b00000000, 0x4660fc2900000000, 0x710a3e2800000000, + 0xf41c712d00000000, 0xc376b32c00000000, 0x9ac8f52e00000000, + 0xada2372f00000000, 0xc08d9a7000000000, 0xf7e7587100000000, + 0xae591e7300000000, 0x9933dc7200000000, 0x1c25937700000000, + 0x2b4f517600000000, 0x72f1177400000000, 0x459bd57500000000, + 0x78dc897e00000000, 0x4fb64b7f00000000, 0x16080d7d00000000, + 0x2162cf7c00000000, 0xa474807900000000, 0x931e427800000000, + 0xcaa0047a00000000, 0xfdcac67b00000000, 0xb02ebc6c00000000, + 0x87447e6d00000000, 0xdefa386f00000000, 0xe990fa6e00000000, + 0x6c86b56b00000000, 0x5bec776a00000000, 0x0252316800000000, + 0x3538f36900000000, 0x087faf6200000000, 0x3f156d6300000000, + 0x66ab2b6100000000, 0x51c1e96000000000, 0xd4d7a66500000000, + 0xe3bd646400000000, 0xba03226600000000, 0x8d69e06700000000, + 0x20cbd74800000000, 0x17a1154900000000, 0x4e1f534b00000000, + 0x7975914a00000000, 0xfc63de4f00000000, 0xcb091c4e00000000, + 0x92b75a4c00000000, 0xa5dd984d00000000, 0x989ac44600000000, + 0xaff0064700000000, 0xf64e404500000000, 0xc124824400000000, + 0x4432cd4100000000, 0x73580f4000000000, 0x2ae6494200000000, + 0x1d8c8b4300000000, 0x5068f15400000000, 0x6702335500000000, + 0x3ebc755700000000, 0x09d6b75600000000, 0x8cc0f85300000000, + 0xbbaa3a5200000000, 0xe2147c5000000000, 0xd57ebe5100000000, + 0xe839e25a00000000, 0xdf53205b00000000, 0x86ed665900000000, + 0xb187a45800000000, 0x3491eb5d00000000, 0x03fb295c00000000, + 0x5a456f5e00000000, 0x6d2fad5f00000000, 0x801b35e100000000, + 0xb771f7e000000000, 0xeecfb1e200000000, 0xd9a573e300000000, + 0x5cb33ce600000000, 0x6bd9fee700000000, 0x3267b8e500000000, + 0x050d7ae400000000, 0x384a26ef00000000, 0x0f20e4ee00000000, + 0x569ea2ec00000000, 0x61f460ed00000000, 0xe4e22fe800000000, + 0xd388ede900000000, 0x8a36abeb00000000, 0xbd5c69ea00000000, + 0xf0b813fd00000000, 0xc7d2d1fc00000000, 0x9e6c97fe00000000, + 0xa90655ff00000000, 0x2c101afa00000000, 0x1b7ad8fb00000000, + 0x42c49ef900000000, 0x75ae5cf800000000, 0x48e900f300000000, + 0x7f83c2f200000000, 0x263d84f000000000, 0x115746f100000000, + 0x944109f400000000, 0xa32bcbf500000000, 0xfa958df700000000, + 0xcdff4ff600000000, 0x605d78d900000000, 0x5737bad800000000, + 0x0e89fcda00000000, 0x39e33edb00000000, 0xbcf571de00000000, + 0x8b9fb3df00000000, 0xd221f5dd00000000, 0xe54b37dc00000000, + 0xd80c6bd700000000, 0xef66a9d600000000, 0xb6d8efd400000000, + 0x81b22dd500000000, 0x04a462d000000000, 0x33cea0d100000000, + 0x6a70e6d300000000, 0x5d1a24d200000000, 0x10fe5ec500000000, + 0x27949cc400000000, 0x7e2adac600000000, 0x494018c700000000, + 0xcc5657c200000000, 0xfb3c95c300000000, 0xa282d3c100000000, + 0x95e811c000000000, 0xa8af4dcb00000000, 0x9fc58fca00000000, + 0xc67bc9c800000000, 0xf1110bc900000000, 0x740744cc00000000, + 0x436d86cd00000000, 0x1ad3c0cf00000000, 0x2db902ce00000000, + 0x4096af9100000000, 0x77fc6d9000000000, 0x2e422b9200000000, + 0x1928e99300000000, 0x9c3ea69600000000, 0xab54649700000000, + 0xf2ea229500000000, 0xc580e09400000000, 0xf8c7bc9f00000000, + 0xcfad7e9e00000000, 0x9613389c00000000, 0xa179fa9d00000000, + 0x246fb59800000000, 0x1305779900000000, 0x4abb319b00000000, + 0x7dd1f39a00000000, 0x3035898d00000000, 0x075f4b8c00000000, + 0x5ee10d8e00000000, 0x698bcf8f00000000, 0xec9d808a00000000, + 0xdbf7428b00000000, 0x8249048900000000, 0xb523c68800000000, + 0x88649a8300000000, 0xbf0e588200000000, 0xe6b01e8000000000, + 0xd1dadc8100000000, 0x54cc938400000000, 0x63a6518500000000, + 0x3a18178700000000, 0x0d72d58600000000, 0xa0d0e2a900000000, + 0x97ba20a800000000, 0xce0466aa00000000, 0xf96ea4ab00000000, + 0x7c78ebae00000000, 0x4b1229af00000000, 0x12ac6fad00000000, + 0x25c6adac00000000, 0x1881f1a700000000, 0x2feb33a600000000, + 0x765575a400000000, 0x413fb7a500000000, 0xc429f8a000000000, + 0xf3433aa100000000, 0xaafd7ca300000000, 0x9d97bea200000000, + 0xd073c4b500000000, 0xe71906b400000000, 0xbea740b600000000, + 0x89cd82b700000000, 0x0cdbcdb200000000, 0x3bb10fb300000000, + 0x620f49b100000000, 0x55658bb000000000, 0x6822d7bb00000000, + 0x5f4815ba00000000, 0x06f653b800000000, 0x319c91b900000000, + 0xb48adebc00000000, 0x83e01cbd00000000, 0xda5e5abf00000000, + 0xed3498be00000000}, + {0x0000000000000000, 0x6567bcb800000000, 0x8bc809aa00000000, + 0xeeafb51200000000, 0x5797628f00000000, 0x32f0de3700000000, + 0xdc5f6b2500000000, 0xb938d79d00000000, 0xef28b4c500000000, + 0x8a4f087d00000000, 0x64e0bd6f00000000, 0x018701d700000000, + 0xb8bfd64a00000000, 0xddd86af200000000, 0x3377dfe000000000, + 0x5610635800000000, 0x9f57195000000000, 0xfa30a5e800000000, + 0x149f10fa00000000, 0x71f8ac4200000000, 0xc8c07bdf00000000, + 0xada7c76700000000, 0x4308727500000000, 0x266fcecd00000000, + 0x707fad9500000000, 0x1518112d00000000, 0xfbb7a43f00000000, + 0x9ed0188700000000, 0x27e8cf1a00000000, 0x428f73a200000000, + 0xac20c6b000000000, 0xc9477a0800000000, 0x3eaf32a000000000, + 0x5bc88e1800000000, 0xb5673b0a00000000, 0xd00087b200000000, + 0x6938502f00000000, 0x0c5fec9700000000, 0xe2f0598500000000, + 0x8797e53d00000000, 0xd187866500000000, 0xb4e03add00000000, + 0x5a4f8fcf00000000, 0x3f28337700000000, 0x8610e4ea00000000, + 0xe377585200000000, 0x0dd8ed4000000000, 0x68bf51f800000000, + 0xa1f82bf000000000, 0xc49f974800000000, 0x2a30225a00000000, + 0x4f579ee200000000, 0xf66f497f00000000, 0x9308f5c700000000, + 0x7da740d500000000, 0x18c0fc6d00000000, 0x4ed09f3500000000, + 0x2bb7238d00000000, 0xc518969f00000000, 0xa07f2a2700000000, + 0x1947fdba00000000, 0x7c20410200000000, 0x928ff41000000000, + 0xf7e848a800000000, 0x3d58149b00000000, 0x583fa82300000000, + 0xb6901d3100000000, 0xd3f7a18900000000, 0x6acf761400000000, + 0x0fa8caac00000000, 0xe1077fbe00000000, 0x8460c30600000000, + 0xd270a05e00000000, 0xb7171ce600000000, 0x59b8a9f400000000, + 0x3cdf154c00000000, 0x85e7c2d100000000, 0xe0807e6900000000, + 0x0e2fcb7b00000000, 0x6b4877c300000000, 0xa20f0dcb00000000, + 0xc768b17300000000, 0x29c7046100000000, 0x4ca0b8d900000000, + 0xf5986f4400000000, 0x90ffd3fc00000000, 0x7e5066ee00000000, + 0x1b37da5600000000, 0x4d27b90e00000000, 0x284005b600000000, + 0xc6efb0a400000000, 0xa3880c1c00000000, 0x1ab0db8100000000, + 0x7fd7673900000000, 0x9178d22b00000000, 0xf41f6e9300000000, + 0x03f7263b00000000, 0x66909a8300000000, 0x883f2f9100000000, + 0xed58932900000000, 0x546044b400000000, 0x3107f80c00000000, + 0xdfa84d1e00000000, 0xbacff1a600000000, 0xecdf92fe00000000, + 0x89b82e4600000000, 0x67179b5400000000, 0x027027ec00000000, + 0xbb48f07100000000, 0xde2f4cc900000000, 0x3080f9db00000000, + 0x55e7456300000000, 0x9ca03f6b00000000, 0xf9c783d300000000, + 0x176836c100000000, 0x720f8a7900000000, 0xcb375de400000000, + 0xae50e15c00000000, 0x40ff544e00000000, 0x2598e8f600000000, + 0x73888bae00000000, 0x16ef371600000000, 0xf840820400000000, + 0x9d273ebc00000000, 0x241fe92100000000, 0x4178559900000000, + 0xafd7e08b00000000, 0xcab05c3300000000, 0x3bb659ed00000000, + 0x5ed1e55500000000, 0xb07e504700000000, 0xd519ecff00000000, + 0x6c213b6200000000, 0x094687da00000000, 0xe7e932c800000000, + 0x828e8e7000000000, 0xd49eed2800000000, 0xb1f9519000000000, + 0x5f56e48200000000, 0x3a31583a00000000, 0x83098fa700000000, + 0xe66e331f00000000, 0x08c1860d00000000, 0x6da63ab500000000, + 0xa4e140bd00000000, 0xc186fc0500000000, 0x2f29491700000000, + 0x4a4ef5af00000000, 0xf376223200000000, 0x96119e8a00000000, + 0x78be2b9800000000, 0x1dd9972000000000, 0x4bc9f47800000000, + 0x2eae48c000000000, 0xc001fdd200000000, 0xa566416a00000000, + 0x1c5e96f700000000, 0x79392a4f00000000, 0x97969f5d00000000, + 0xf2f123e500000000, 0x05196b4d00000000, 0x607ed7f500000000, + 0x8ed162e700000000, 0xebb6de5f00000000, 0x528e09c200000000, + 0x37e9b57a00000000, 0xd946006800000000, 0xbc21bcd000000000, + 0xea31df8800000000, 0x8f56633000000000, 0x61f9d62200000000, + 0x049e6a9a00000000, 0xbda6bd0700000000, 0xd8c101bf00000000, + 0x366eb4ad00000000, 0x5309081500000000, 0x9a4e721d00000000, + 0xff29cea500000000, 0x11867bb700000000, 0x74e1c70f00000000, + 0xcdd9109200000000, 0xa8beac2a00000000, 0x4611193800000000, + 0x2376a58000000000, 0x7566c6d800000000, 0x10017a6000000000, + 0xfeaecf7200000000, 0x9bc973ca00000000, 0x22f1a45700000000, + 0x479618ef00000000, 0xa939adfd00000000, 0xcc5e114500000000, + 0x06ee4d7600000000, 0x6389f1ce00000000, 0x8d2644dc00000000, + 0xe841f86400000000, 0x51792ff900000000, 0x341e934100000000, + 0xdab1265300000000, 0xbfd69aeb00000000, 0xe9c6f9b300000000, + 0x8ca1450b00000000, 0x620ef01900000000, 0x07694ca100000000, + 0xbe519b3c00000000, 0xdb36278400000000, 0x3599929600000000, + 0x50fe2e2e00000000, 0x99b9542600000000, 0xfcdee89e00000000, + 0x12715d8c00000000, 0x7716e13400000000, 0xce2e36a900000000, + 0xab498a1100000000, 0x45e63f0300000000, 0x208183bb00000000, + 0x7691e0e300000000, 0x13f65c5b00000000, 0xfd59e94900000000, + 0x983e55f100000000, 0x2106826c00000000, 0x44613ed400000000, + 0xaace8bc600000000, 0xcfa9377e00000000, 0x38417fd600000000, + 0x5d26c36e00000000, 0xb389767c00000000, 0xd6eecac400000000, + 0x6fd61d5900000000, 0x0ab1a1e100000000, 0xe41e14f300000000, + 0x8179a84b00000000, 0xd769cb1300000000, 0xb20e77ab00000000, + 0x5ca1c2b900000000, 0x39c67e0100000000, 0x80fea99c00000000, + 0xe599152400000000, 0x0b36a03600000000, 0x6e511c8e00000000, + 0xa716668600000000, 0xc271da3e00000000, 0x2cde6f2c00000000, + 0x49b9d39400000000, 0xf081040900000000, 0x95e6b8b100000000, + 0x7b490da300000000, 0x1e2eb11b00000000, 0x483ed24300000000, + 0x2d596efb00000000, 0xc3f6dbe900000000, 0xa691675100000000, + 0x1fa9b0cc00000000, 0x7ace0c7400000000, 0x9461b96600000000, + 0xf10605de00000000}, + {0x0000000000000000, 0xb029603d00000000, 0x6053c07a00000000, + 0xd07aa04700000000, 0xc0a680f500000000, 0x708fe0c800000000, + 0xa0f5408f00000000, 0x10dc20b200000000, 0xc14b703000000000, + 0x7162100d00000000, 0xa118b04a00000000, 0x1131d07700000000, + 0x01edf0c500000000, 0xb1c490f800000000, 0x61be30bf00000000, + 0xd197508200000000, 0x8297e06000000000, 0x32be805d00000000, + 0xe2c4201a00000000, 0x52ed402700000000, 0x4231609500000000, + 0xf21800a800000000, 0x2262a0ef00000000, 0x924bc0d200000000, + 0x43dc905000000000, 0xf3f5f06d00000000, 0x238f502a00000000, + 0x93a6301700000000, 0x837a10a500000000, 0x3353709800000000, + 0xe329d0df00000000, 0x5300b0e200000000, 0x042fc1c100000000, + 0xb406a1fc00000000, 0x647c01bb00000000, 0xd455618600000000, + 0xc489413400000000, 0x74a0210900000000, 0xa4da814e00000000, + 0x14f3e17300000000, 0xc564b1f100000000, 0x754dd1cc00000000, + 0xa537718b00000000, 0x151e11b600000000, 0x05c2310400000000, + 0xb5eb513900000000, 0x6591f17e00000000, 0xd5b8914300000000, + 0x86b821a100000000, 0x3691419c00000000, 0xe6ebe1db00000000, + 0x56c281e600000000, 0x461ea15400000000, 0xf637c16900000000, + 0x264d612e00000000, 0x9664011300000000, 0x47f3519100000000, + 0xf7da31ac00000000, 0x27a091eb00000000, 0x9789f1d600000000, + 0x8755d16400000000, 0x377cb15900000000, 0xe706111e00000000, + 0x572f712300000000, 0x4958f35800000000, 0xf971936500000000, + 0x290b332200000000, 0x9922531f00000000, 0x89fe73ad00000000, + 0x39d7139000000000, 0xe9adb3d700000000, 0x5984d3ea00000000, + 0x8813836800000000, 0x383ae35500000000, 0xe840431200000000, + 0x5869232f00000000, 0x48b5039d00000000, 0xf89c63a000000000, + 0x28e6c3e700000000, 0x98cfa3da00000000, 0xcbcf133800000000, + 0x7be6730500000000, 0xab9cd34200000000, 0x1bb5b37f00000000, + 0x0b6993cd00000000, 0xbb40f3f000000000, 0x6b3a53b700000000, + 0xdb13338a00000000, 0x0a84630800000000, 0xbaad033500000000, + 0x6ad7a37200000000, 0xdafec34f00000000, 0xca22e3fd00000000, + 0x7a0b83c000000000, 0xaa71238700000000, 0x1a5843ba00000000, + 0x4d77329900000000, 0xfd5e52a400000000, 0x2d24f2e300000000, + 0x9d0d92de00000000, 0x8dd1b26c00000000, 0x3df8d25100000000, + 0xed82721600000000, 0x5dab122b00000000, 0x8c3c42a900000000, + 0x3c15229400000000, 0xec6f82d300000000, 0x5c46e2ee00000000, + 0x4c9ac25c00000000, 0xfcb3a26100000000, 0x2cc9022600000000, + 0x9ce0621b00000000, 0xcfe0d2f900000000, 0x7fc9b2c400000000, + 0xafb3128300000000, 0x1f9a72be00000000, 0x0f46520c00000000, + 0xbf6f323100000000, 0x6f15927600000000, 0xdf3cf24b00000000, + 0x0eaba2c900000000, 0xbe82c2f400000000, 0x6ef862b300000000, + 0xded1028e00000000, 0xce0d223c00000000, 0x7e24420100000000, + 0xae5ee24600000000, 0x1e77827b00000000, 0x92b0e6b100000000, + 0x2299868c00000000, 0xf2e326cb00000000, 0x42ca46f600000000, + 0x5216664400000000, 0xe23f067900000000, 0x3245a63e00000000, + 0x826cc60300000000, 0x53fb968100000000, 0xe3d2f6bc00000000, + 0x33a856fb00000000, 0x838136c600000000, 0x935d167400000000, + 0x2374764900000000, 0xf30ed60e00000000, 0x4327b63300000000, + 0x102706d100000000, 0xa00e66ec00000000, 0x7074c6ab00000000, + 0xc05da69600000000, 0xd081862400000000, 0x60a8e61900000000, + 0xb0d2465e00000000, 0x00fb266300000000, 0xd16c76e100000000, + 0x614516dc00000000, 0xb13fb69b00000000, 0x0116d6a600000000, + 0x11caf61400000000, 0xa1e3962900000000, 0x7199366e00000000, + 0xc1b0565300000000, 0x969f277000000000, 0x26b6474d00000000, + 0xf6cce70a00000000, 0x46e5873700000000, 0x5639a78500000000, + 0xe610c7b800000000, 0x366a67ff00000000, 0x864307c200000000, + 0x57d4574000000000, 0xe7fd377d00000000, 0x3787973a00000000, + 0x87aef70700000000, 0x9772d7b500000000, 0x275bb78800000000, + 0xf72117cf00000000, 0x470877f200000000, 0x1408c71000000000, + 0xa421a72d00000000, 0x745b076a00000000, 0xc472675700000000, + 0xd4ae47e500000000, 0x648727d800000000, 0xb4fd879f00000000, + 0x04d4e7a200000000, 0xd543b72000000000, 0x656ad71d00000000, + 0xb510775a00000000, 0x0539176700000000, 0x15e537d500000000, + 0xa5cc57e800000000, 0x75b6f7af00000000, 0xc59f979200000000, + 0xdbe815e900000000, 0x6bc175d400000000, 0xbbbbd59300000000, + 0x0b92b5ae00000000, 0x1b4e951c00000000, 0xab67f52100000000, + 0x7b1d556600000000, 0xcb34355b00000000, 0x1aa365d900000000, + 0xaa8a05e400000000, 0x7af0a5a300000000, 0xcad9c59e00000000, + 0xda05e52c00000000, 0x6a2c851100000000, 0xba56255600000000, + 0x0a7f456b00000000, 0x597ff58900000000, 0xe95695b400000000, + 0x392c35f300000000, 0x890555ce00000000, 0x99d9757c00000000, + 0x29f0154100000000, 0xf98ab50600000000, 0x49a3d53b00000000, + 0x983485b900000000, 0x281de58400000000, 0xf86745c300000000, + 0x484e25fe00000000, 0x5892054c00000000, 0xe8bb657100000000, + 0x38c1c53600000000, 0x88e8a50b00000000, 0xdfc7d42800000000, + 0x6feeb41500000000, 0xbf94145200000000, 0x0fbd746f00000000, + 0x1f6154dd00000000, 0xaf4834e000000000, 0x7f3294a700000000, + 0xcf1bf49a00000000, 0x1e8ca41800000000, 0xaea5c42500000000, + 0x7edf646200000000, 0xcef6045f00000000, 0xde2a24ed00000000, + 0x6e0344d000000000, 0xbe79e49700000000, 0x0e5084aa00000000, + 0x5d50344800000000, 0xed79547500000000, 0x3d03f43200000000, + 0x8d2a940f00000000, 0x9df6b4bd00000000, 0x2ddfd48000000000, + 0xfda574c700000000, 0x4d8c14fa00000000, 0x9c1b447800000000, + 0x2c32244500000000, 0xfc48840200000000, 0x4c61e43f00000000, + 0x5cbdc48d00000000, 0xec94a4b000000000, 0x3cee04f700000000, + 0x8cc764ca00000000}, + {0x0000000000000000, 0xa5d35ccb00000000, 0x0ba1c84d00000000, + 0xae72948600000000, 0x1642919b00000000, 0xb391cd5000000000, + 0x1de359d600000000, 0xb830051d00000000, 0x6d8253ec00000000, + 0xc8510f2700000000, 0x66239ba100000000, 0xc3f0c76a00000000, + 0x7bc0c27700000000, 0xde139ebc00000000, 0x70610a3a00000000, + 0xd5b256f100000000, 0x9b02d60300000000, 0x3ed18ac800000000, + 0x90a31e4e00000000, 0x3570428500000000, 0x8d40479800000000, + 0x28931b5300000000, 0x86e18fd500000000, 0x2332d31e00000000, + 0xf68085ef00000000, 0x5353d92400000000, 0xfd214da200000000, + 0x58f2116900000000, 0xe0c2147400000000, 0x451148bf00000000, + 0xeb63dc3900000000, 0x4eb080f200000000, 0x3605ac0700000000, + 0x93d6f0cc00000000, 0x3da4644a00000000, 0x9877388100000000, + 0x20473d9c00000000, 0x8594615700000000, 0x2be6f5d100000000, + 0x8e35a91a00000000, 0x5b87ffeb00000000, 0xfe54a32000000000, + 0x502637a600000000, 0xf5f56b6d00000000, 0x4dc56e7000000000, + 0xe81632bb00000000, 0x4664a63d00000000, 0xe3b7faf600000000, + 0xad077a0400000000, 0x08d426cf00000000, 0xa6a6b24900000000, + 0x0375ee8200000000, 0xbb45eb9f00000000, 0x1e96b75400000000, + 0xb0e423d200000000, 0x15377f1900000000, 0xc08529e800000000, + 0x6556752300000000, 0xcb24e1a500000000, 0x6ef7bd6e00000000, + 0xd6c7b87300000000, 0x7314e4b800000000, 0xdd66703e00000000, + 0x78b52cf500000000, 0x6c0a580f00000000, 0xc9d904c400000000, + 0x67ab904200000000, 0xc278cc8900000000, 0x7a48c99400000000, + 0xdf9b955f00000000, 0x71e901d900000000, 0xd43a5d1200000000, + 0x01880be300000000, 0xa45b572800000000, 0x0a29c3ae00000000, + 0xaffa9f6500000000, 0x17ca9a7800000000, 0xb219c6b300000000, + 0x1c6b523500000000, 0xb9b80efe00000000, 0xf7088e0c00000000, + 0x52dbd2c700000000, 0xfca9464100000000, 0x597a1a8a00000000, + 0xe14a1f9700000000, 0x4499435c00000000, 0xeaebd7da00000000, + 0x4f388b1100000000, 0x9a8adde000000000, 0x3f59812b00000000, + 0x912b15ad00000000, 0x34f8496600000000, 0x8cc84c7b00000000, + 0x291b10b000000000, 0x8769843600000000, 0x22bad8fd00000000, + 0x5a0ff40800000000, 0xffdca8c300000000, 0x51ae3c4500000000, + 0xf47d608e00000000, 0x4c4d659300000000, 0xe99e395800000000, + 0x47ecadde00000000, 0xe23ff11500000000, 0x378da7e400000000, + 0x925efb2f00000000, 0x3c2c6fa900000000, 0x99ff336200000000, + 0x21cf367f00000000, 0x841c6ab400000000, 0x2a6efe3200000000, + 0x8fbda2f900000000, 0xc10d220b00000000, 0x64de7ec000000000, + 0xcaacea4600000000, 0x6f7fb68d00000000, 0xd74fb39000000000, + 0x729cef5b00000000, 0xdcee7bdd00000000, 0x793d271600000000, + 0xac8f71e700000000, 0x095c2d2c00000000, 0xa72eb9aa00000000, + 0x02fde56100000000, 0xbacde07c00000000, 0x1f1ebcb700000000, + 0xb16c283100000000, 0x14bf74fa00000000, 0xd814b01e00000000, + 0x7dc7ecd500000000, 0xd3b5785300000000, 0x7666249800000000, + 0xce56218500000000, 0x6b857d4e00000000, 0xc5f7e9c800000000, + 0x6024b50300000000, 0xb596e3f200000000, 0x1045bf3900000000, + 0xbe372bbf00000000, 0x1be4777400000000, 0xa3d4726900000000, + 0x06072ea200000000, 0xa875ba2400000000, 0x0da6e6ef00000000, + 0x4316661d00000000, 0xe6c53ad600000000, 0x48b7ae5000000000, + 0xed64f29b00000000, 0x5554f78600000000, 0xf087ab4d00000000, + 0x5ef53fcb00000000, 0xfb26630000000000, 0x2e9435f100000000, + 0x8b47693a00000000, 0x2535fdbc00000000, 0x80e6a17700000000, + 0x38d6a46a00000000, 0x9d05f8a100000000, 0x33776c2700000000, + 0x96a430ec00000000, 0xee111c1900000000, 0x4bc240d200000000, + 0xe5b0d45400000000, 0x4063889f00000000, 0xf8538d8200000000, + 0x5d80d14900000000, 0xf3f245cf00000000, 0x5621190400000000, + 0x83934ff500000000, 0x2640133e00000000, 0x883287b800000000, + 0x2de1db7300000000, 0x95d1de6e00000000, 0x300282a500000000, + 0x9e70162300000000, 0x3ba34ae800000000, 0x7513ca1a00000000, + 0xd0c096d100000000, 0x7eb2025700000000, 0xdb615e9c00000000, + 0x63515b8100000000, 0xc682074a00000000, 0x68f093cc00000000, + 0xcd23cf0700000000, 0x189199f600000000, 0xbd42c53d00000000, + 0x133051bb00000000, 0xb6e30d7000000000, 0x0ed3086d00000000, + 0xab0054a600000000, 0x0572c02000000000, 0xa0a19ceb00000000, + 0xb41ee81100000000, 0x11cdb4da00000000, 0xbfbf205c00000000, + 0x1a6c7c9700000000, 0xa25c798a00000000, 0x078f254100000000, + 0xa9fdb1c700000000, 0x0c2eed0c00000000, 0xd99cbbfd00000000, + 0x7c4fe73600000000, 0xd23d73b000000000, 0x77ee2f7b00000000, + 0xcfde2a6600000000, 0x6a0d76ad00000000, 0xc47fe22b00000000, + 0x61acbee000000000, 0x2f1c3e1200000000, 0x8acf62d900000000, + 0x24bdf65f00000000, 0x816eaa9400000000, 0x395eaf8900000000, + 0x9c8df34200000000, 0x32ff67c400000000, 0x972c3b0f00000000, + 0x429e6dfe00000000, 0xe74d313500000000, 0x493fa5b300000000, + 0xececf97800000000, 0x54dcfc6500000000, 0xf10fa0ae00000000, + 0x5f7d342800000000, 0xfaae68e300000000, 0x821b441600000000, + 0x27c818dd00000000, 0x89ba8c5b00000000, 0x2c69d09000000000, + 0x9459d58d00000000, 0x318a894600000000, 0x9ff81dc000000000, + 0x3a2b410b00000000, 0xef9917fa00000000, 0x4a4a4b3100000000, + 0xe438dfb700000000, 0x41eb837c00000000, 0xf9db866100000000, + 0x5c08daaa00000000, 0xf27a4e2c00000000, 0x57a912e700000000, + 0x1919921500000000, 0xbccacede00000000, 0x12b85a5800000000, + 0xb76b069300000000, 0x0f5b038e00000000, 0xaa885f4500000000, + 0x04facbc300000000, 0xa129970800000000, 0x749bc1f900000000, + 0xd1489d3200000000, 0x7f3a09b400000000, 0xdae9557f00000000, + 0x62d9506200000000, 0xc70a0ca900000000, 0x6978982f00000000, + 0xccabc4e400000000}, + {0x0000000000000000, 0xb40b77a600000000, 0x29119f9700000000, + 0x9d1ae83100000000, 0x13244ff400000000, 0xa72f385200000000, + 0x3a35d06300000000, 0x8e3ea7c500000000, 0x674eef3300000000, + 0xd345989500000000, 0x4e5f70a400000000, 0xfa54070200000000, + 0x746aa0c700000000, 0xc061d76100000000, 0x5d7b3f5000000000, + 0xe97048f600000000, 0xce9cde6700000000, 0x7a97a9c100000000, + 0xe78d41f000000000, 0x5386365600000000, 0xddb8919300000000, + 0x69b3e63500000000, 0xf4a90e0400000000, 0x40a279a200000000, + 0xa9d2315400000000, 0x1dd946f200000000, 0x80c3aec300000000, + 0x34c8d96500000000, 0xbaf67ea000000000, 0x0efd090600000000, + 0x93e7e13700000000, 0x27ec969100000000, 0x9c39bdcf00000000, + 0x2832ca6900000000, 0xb528225800000000, 0x012355fe00000000, + 0x8f1df23b00000000, 0x3b16859d00000000, 0xa60c6dac00000000, + 0x12071a0a00000000, 0xfb7752fc00000000, 0x4f7c255a00000000, + 0xd266cd6b00000000, 0x666dbacd00000000, 0xe8531d0800000000, + 0x5c586aae00000000, 0xc142829f00000000, 0x7549f53900000000, + 0x52a563a800000000, 0xe6ae140e00000000, 0x7bb4fc3f00000000, + 0xcfbf8b9900000000, 0x41812c5c00000000, 0xf58a5bfa00000000, + 0x6890b3cb00000000, 0xdc9bc46d00000000, 0x35eb8c9b00000000, + 0x81e0fb3d00000000, 0x1cfa130c00000000, 0xa8f164aa00000000, + 0x26cfc36f00000000, 0x92c4b4c900000000, 0x0fde5cf800000000, + 0xbbd52b5e00000000, 0x79750b4400000000, 0xcd7e7ce200000000, + 0x506494d300000000, 0xe46fe37500000000, 0x6a5144b000000000, + 0xde5a331600000000, 0x4340db2700000000, 0xf74bac8100000000, + 0x1e3be47700000000, 0xaa3093d100000000, 0x372a7be000000000, + 0x83210c4600000000, 0x0d1fab8300000000, 0xb914dc2500000000, + 0x240e341400000000, 0x900543b200000000, 0xb7e9d52300000000, + 0x03e2a28500000000, 0x9ef84ab400000000, 0x2af33d1200000000, + 0xa4cd9ad700000000, 0x10c6ed7100000000, 0x8ddc054000000000, + 0x39d772e600000000, 0xd0a73a1000000000, 0x64ac4db600000000, + 0xf9b6a58700000000, 0x4dbdd22100000000, 0xc38375e400000000, + 0x7788024200000000, 0xea92ea7300000000, 0x5e999dd500000000, + 0xe54cb68b00000000, 0x5147c12d00000000, 0xcc5d291c00000000, + 0x78565eba00000000, 0xf668f97f00000000, 0x42638ed900000000, + 0xdf7966e800000000, 0x6b72114e00000000, 0x820259b800000000, + 0x36092e1e00000000, 0xab13c62f00000000, 0x1f18b18900000000, + 0x9126164c00000000, 0x252d61ea00000000, 0xb83789db00000000, + 0x0c3cfe7d00000000, 0x2bd068ec00000000, 0x9fdb1f4a00000000, + 0x02c1f77b00000000, 0xb6ca80dd00000000, 0x38f4271800000000, + 0x8cff50be00000000, 0x11e5b88f00000000, 0xa5eecf2900000000, + 0x4c9e87df00000000, 0xf895f07900000000, 0x658f184800000000, + 0xd1846fee00000000, 0x5fbac82b00000000, 0xebb1bf8d00000000, + 0x76ab57bc00000000, 0xc2a0201a00000000, 0xf2ea168800000000, + 0x46e1612e00000000, 0xdbfb891f00000000, 0x6ff0feb900000000, + 0xe1ce597c00000000, 0x55c52eda00000000, 0xc8dfc6eb00000000, + 0x7cd4b14d00000000, 0x95a4f9bb00000000, 0x21af8e1d00000000, + 0xbcb5662c00000000, 0x08be118a00000000, 0x8680b64f00000000, + 0x328bc1e900000000, 0xaf9129d800000000, 0x1b9a5e7e00000000, + 0x3c76c8ef00000000, 0x887dbf4900000000, 0x1567577800000000, + 0xa16c20de00000000, 0x2f52871b00000000, 0x9b59f0bd00000000, + 0x0643188c00000000, 0xb2486f2a00000000, 0x5b3827dc00000000, + 0xef33507a00000000, 0x7229b84b00000000, 0xc622cfed00000000, + 0x481c682800000000, 0xfc171f8e00000000, 0x610df7bf00000000, + 0xd506801900000000, 0x6ed3ab4700000000, 0xdad8dce100000000, + 0x47c234d000000000, 0xf3c9437600000000, 0x7df7e4b300000000, + 0xc9fc931500000000, 0x54e67b2400000000, 0xe0ed0c8200000000, + 0x099d447400000000, 0xbd9633d200000000, 0x208cdbe300000000, + 0x9487ac4500000000, 0x1ab90b8000000000, 0xaeb27c2600000000, + 0x33a8941700000000, 0x87a3e3b100000000, 0xa04f752000000000, + 0x1444028600000000, 0x895eeab700000000, 0x3d559d1100000000, + 0xb36b3ad400000000, 0x07604d7200000000, 0x9a7aa54300000000, + 0x2e71d2e500000000, 0xc7019a1300000000, 0x730aedb500000000, + 0xee10058400000000, 0x5a1b722200000000, 0xd425d5e700000000, + 0x602ea24100000000, 0xfd344a7000000000, 0x493f3dd600000000, + 0x8b9f1dcc00000000, 0x3f946a6a00000000, 0xa28e825b00000000, + 0x1685f5fd00000000, 0x98bb523800000000, 0x2cb0259e00000000, + 0xb1aacdaf00000000, 0x05a1ba0900000000, 0xecd1f2ff00000000, + 0x58da855900000000, 0xc5c06d6800000000, 0x71cb1ace00000000, + 0xfff5bd0b00000000, 0x4bfecaad00000000, 0xd6e4229c00000000, + 0x62ef553a00000000, 0x4503c3ab00000000, 0xf108b40d00000000, + 0x6c125c3c00000000, 0xd8192b9a00000000, 0x56278c5f00000000, + 0xe22cfbf900000000, 0x7f3613c800000000, 0xcb3d646e00000000, + 0x224d2c9800000000, 0x96465b3e00000000, 0x0b5cb30f00000000, + 0xbf57c4a900000000, 0x3169636c00000000, 0x856214ca00000000, + 0x1878fcfb00000000, 0xac738b5d00000000, 0x17a6a00300000000, + 0xa3add7a500000000, 0x3eb73f9400000000, 0x8abc483200000000, + 0x0482eff700000000, 0xb089985100000000, 0x2d93706000000000, + 0x999807c600000000, 0x70e84f3000000000, 0xc4e3389600000000, + 0x59f9d0a700000000, 0xedf2a70100000000, 0x63cc00c400000000, + 0xd7c7776200000000, 0x4add9f5300000000, 0xfed6e8f500000000, + 0xd93a7e6400000000, 0x6d3109c200000000, 0xf02be1f300000000, + 0x4420965500000000, 0xca1e319000000000, 0x7e15463600000000, + 0xe30fae0700000000, 0x5704d9a100000000, 0xbe74915700000000, + 0x0a7fe6f100000000, 0x97650ec000000000, 0x236e796600000000, + 0xad50dea300000000, 0x195ba90500000000, 0x8441413400000000, + 0x304a369200000000}, + {0x0000000000000000, 0x9e00aacc00000000, 0x7d07254200000000, + 0xe3078f8e00000000, 0xfa0e4a8400000000, 0x640ee04800000000, + 0x87096fc600000000, 0x1909c50a00000000, 0xb51be5d300000000, + 0x2b1b4f1f00000000, 0xc81cc09100000000, 0x561c6a5d00000000, + 0x4f15af5700000000, 0xd115059b00000000, 0x32128a1500000000, + 0xac1220d900000000, 0x2b31bb7c00000000, 0xb53111b000000000, + 0x56369e3e00000000, 0xc83634f200000000, 0xd13ff1f800000000, + 0x4f3f5b3400000000, 0xac38d4ba00000000, 0x32387e7600000000, + 0x9e2a5eaf00000000, 0x002af46300000000, 0xe32d7bed00000000, + 0x7d2dd12100000000, 0x6424142b00000000, 0xfa24bee700000000, + 0x1923316900000000, 0x87239ba500000000, 0x566276f900000000, + 0xc862dc3500000000, 0x2b6553bb00000000, 0xb565f97700000000, + 0xac6c3c7d00000000, 0x326c96b100000000, 0xd16b193f00000000, + 0x4f6bb3f300000000, 0xe379932a00000000, 0x7d7939e600000000, + 0x9e7eb66800000000, 0x007e1ca400000000, 0x1977d9ae00000000, + 0x8777736200000000, 0x6470fcec00000000, 0xfa70562000000000, + 0x7d53cd8500000000, 0xe353674900000000, 0x0054e8c700000000, + 0x9e54420b00000000, 0x875d870100000000, 0x195d2dcd00000000, + 0xfa5aa24300000000, 0x645a088f00000000, 0xc848285600000000, + 0x5648829a00000000, 0xb54f0d1400000000, 0x2b4fa7d800000000, + 0x324662d200000000, 0xac46c81e00000000, 0x4f41479000000000, + 0xd141ed5c00000000, 0xedc29d2900000000, 0x73c237e500000000, + 0x90c5b86b00000000, 0x0ec512a700000000, 0x17ccd7ad00000000, + 0x89cc7d6100000000, 0x6acbf2ef00000000, 0xf4cb582300000000, + 0x58d978fa00000000, 0xc6d9d23600000000, 0x25de5db800000000, + 0xbbdef77400000000, 0xa2d7327e00000000, 0x3cd798b200000000, + 0xdfd0173c00000000, 0x41d0bdf000000000, 0xc6f3265500000000, + 0x58f38c9900000000, 0xbbf4031700000000, 0x25f4a9db00000000, + 0x3cfd6cd100000000, 0xa2fdc61d00000000, 0x41fa499300000000, + 0xdffae35f00000000, 0x73e8c38600000000, 0xede8694a00000000, + 0x0eefe6c400000000, 0x90ef4c0800000000, 0x89e6890200000000, + 0x17e623ce00000000, 0xf4e1ac4000000000, 0x6ae1068c00000000, + 0xbba0ebd000000000, 0x25a0411c00000000, 0xc6a7ce9200000000, + 0x58a7645e00000000, 0x41aea15400000000, 0xdfae0b9800000000, + 0x3ca9841600000000, 0xa2a92eda00000000, 0x0ebb0e0300000000, + 0x90bba4cf00000000, 0x73bc2b4100000000, 0xedbc818d00000000, + 0xf4b5448700000000, 0x6ab5ee4b00000000, 0x89b261c500000000, + 0x17b2cb0900000000, 0x909150ac00000000, 0x0e91fa6000000000, + 0xed9675ee00000000, 0x7396df2200000000, 0x6a9f1a2800000000, + 0xf49fb0e400000000, 0x17983f6a00000000, 0x899895a600000000, + 0x258ab57f00000000, 0xbb8a1fb300000000, 0x588d903d00000000, + 0xc68d3af100000000, 0xdf84fffb00000000, 0x4184553700000000, + 0xa283dab900000000, 0x3c83707500000000, 0xda853b5300000000, + 0x4485919f00000000, 0xa7821e1100000000, 0x3982b4dd00000000, + 0x208b71d700000000, 0xbe8bdb1b00000000, 0x5d8c549500000000, + 0xc38cfe5900000000, 0x6f9ede8000000000, 0xf19e744c00000000, + 0x1299fbc200000000, 0x8c99510e00000000, 0x9590940400000000, + 0x0b903ec800000000, 0xe897b14600000000, 0x76971b8a00000000, + 0xf1b4802f00000000, 0x6fb42ae300000000, 0x8cb3a56d00000000, + 0x12b30fa100000000, 0x0bbacaab00000000, 0x95ba606700000000, + 0x76bdefe900000000, 0xe8bd452500000000, 0x44af65fc00000000, + 0xdaafcf3000000000, 0x39a840be00000000, 0xa7a8ea7200000000, + 0xbea12f7800000000, 0x20a185b400000000, 0xc3a60a3a00000000, + 0x5da6a0f600000000, 0x8ce74daa00000000, 0x12e7e76600000000, + 0xf1e068e800000000, 0x6fe0c22400000000, 0x76e9072e00000000, + 0xe8e9ade200000000, 0x0bee226c00000000, 0x95ee88a000000000, + 0x39fca87900000000, 0xa7fc02b500000000, 0x44fb8d3b00000000, + 0xdafb27f700000000, 0xc3f2e2fd00000000, 0x5df2483100000000, + 0xbef5c7bf00000000, 0x20f56d7300000000, 0xa7d6f6d600000000, + 0x39d65c1a00000000, 0xdad1d39400000000, 0x44d1795800000000, + 0x5dd8bc5200000000, 0xc3d8169e00000000, 0x20df991000000000, + 0xbedf33dc00000000, 0x12cd130500000000, 0x8ccdb9c900000000, + 0x6fca364700000000, 0xf1ca9c8b00000000, 0xe8c3598100000000, + 0x76c3f34d00000000, 0x95c47cc300000000, 0x0bc4d60f00000000, + 0x3747a67a00000000, 0xa9470cb600000000, 0x4a40833800000000, + 0xd44029f400000000, 0xcd49ecfe00000000, 0x5349463200000000, + 0xb04ec9bc00000000, 0x2e4e637000000000, 0x825c43a900000000, + 0x1c5ce96500000000, 0xff5b66eb00000000, 0x615bcc2700000000, + 0x7852092d00000000, 0xe652a3e100000000, 0x05552c6f00000000, + 0x9b5586a300000000, 0x1c761d0600000000, 0x8276b7ca00000000, + 0x6171384400000000, 0xff71928800000000, 0xe678578200000000, + 0x7878fd4e00000000, 0x9b7f72c000000000, 0x057fd80c00000000, + 0xa96df8d500000000, 0x376d521900000000, 0xd46add9700000000, + 0x4a6a775b00000000, 0x5363b25100000000, 0xcd63189d00000000, + 0x2e64971300000000, 0xb0643ddf00000000, 0x6125d08300000000, + 0xff257a4f00000000, 0x1c22f5c100000000, 0x82225f0d00000000, + 0x9b2b9a0700000000, 0x052b30cb00000000, 0xe62cbf4500000000, + 0x782c158900000000, 0xd43e355000000000, 0x4a3e9f9c00000000, + 0xa939101200000000, 0x3739bade00000000, 0x2e307fd400000000, + 0xb030d51800000000, 0x53375a9600000000, 0xcd37f05a00000000, + 0x4a146bff00000000, 0xd414c13300000000, 0x37134ebd00000000, + 0xa913e47100000000, 0xb01a217b00000000, 0x2e1a8bb700000000, + 0xcd1d043900000000, 0x531daef500000000, 0xff0f8e2c00000000, + 0x610f24e000000000, 0x8208ab6e00000000, 0x1c0801a200000000, + 0x0501c4a800000000, 0x9b016e6400000000, 0x7806e1ea00000000, + 0xe6064b2600000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}, + {0x00000000, 0x41311b19, 0x82623632, 0xc3532d2b, 0x04c56c64, + 0x45f4777d, 0x86a75a56, 0xc796414f, 0x088ad9c8, 0x49bbc2d1, + 0x8ae8effa, 0xcbd9f4e3, 0x0c4fb5ac, 0x4d7eaeb5, 0x8e2d839e, + 0xcf1c9887, 0x5112c24a, 0x1023d953, 0xd370f478, 0x9241ef61, + 0x55d7ae2e, 0x14e6b537, 0xd7b5981c, 0x96848305, 0x59981b82, + 0x18a9009b, 0xdbfa2db0, 0x9acb36a9, 0x5d5d77e6, 0x1c6c6cff, + 0xdf3f41d4, 0x9e0e5acd, 0xa2248495, 0xe3159f8c, 0x2046b2a7, + 0x6177a9be, 0xa6e1e8f1, 0xe7d0f3e8, 0x2483dec3, 0x65b2c5da, + 0xaaae5d5d, 0xeb9f4644, 0x28cc6b6f, 0x69fd7076, 0xae6b3139, + 0xef5a2a20, 0x2c09070b, 0x6d381c12, 0xf33646df, 0xb2075dc6, + 0x715470ed, 0x30656bf4, 0xf7f32abb, 0xb6c231a2, 0x75911c89, + 0x34a00790, 0xfbbc9f17, 0xba8d840e, 0x79dea925, 0x38efb23c, + 0xff79f373, 0xbe48e86a, 0x7d1bc541, 0x3c2ade58, 0x054f79f0, + 0x447e62e9, 0x872d4fc2, 0xc61c54db, 0x018a1594, 0x40bb0e8d, + 0x83e823a6, 0xc2d938bf, 0x0dc5a038, 0x4cf4bb21, 0x8fa7960a, + 0xce968d13, 0x0900cc5c, 0x4831d745, 0x8b62fa6e, 0xca53e177, + 0x545dbbba, 0x156ca0a3, 0xd63f8d88, 0x970e9691, 0x5098d7de, + 0x11a9ccc7, 0xd2fae1ec, 0x93cbfaf5, 0x5cd76272, 0x1de6796b, + 0xdeb55440, 0x9f844f59, 0x58120e16, 0x1923150f, 0xda703824, + 0x9b41233d, 0xa76bfd65, 0xe65ae67c, 0x2509cb57, 0x6438d04e, + 0xa3ae9101, 0xe29f8a18, 0x21cca733, 0x60fdbc2a, 0xafe124ad, + 0xeed03fb4, 0x2d83129f, 0x6cb20986, 0xab2448c9, 0xea1553d0, + 0x29467efb, 0x687765e2, 0xf6793f2f, 0xb7482436, 0x741b091d, + 0x352a1204, 0xf2bc534b, 0xb38d4852, 0x70de6579, 0x31ef7e60, + 0xfef3e6e7, 0xbfc2fdfe, 0x7c91d0d5, 0x3da0cbcc, 0xfa368a83, + 0xbb07919a, 0x7854bcb1, 0x3965a7a8, 0x4b98833b, 0x0aa99822, + 0xc9fab509, 0x88cbae10, 0x4f5def5f, 0x0e6cf446, 0xcd3fd96d, + 0x8c0ec274, 0x43125af3, 0x022341ea, 0xc1706cc1, 0x804177d8, + 0x47d73697, 0x06e62d8e, 0xc5b500a5, 0x84841bbc, 0x1a8a4171, + 0x5bbb5a68, 0x98e87743, 0xd9d96c5a, 0x1e4f2d15, 0x5f7e360c, + 0x9c2d1b27, 0xdd1c003e, 0x120098b9, 0x533183a0, 0x9062ae8b, + 0xd153b592, 0x16c5f4dd, 0x57f4efc4, 0x94a7c2ef, 0xd596d9f6, + 0xe9bc07ae, 0xa88d1cb7, 0x6bde319c, 0x2aef2a85, 0xed796bca, + 0xac4870d3, 0x6f1b5df8, 0x2e2a46e1, 0xe136de66, 0xa007c57f, + 0x6354e854, 0x2265f34d, 0xe5f3b202, 0xa4c2a91b, 0x67918430, + 0x26a09f29, 0xb8aec5e4, 0xf99fdefd, 0x3accf3d6, 0x7bfde8cf, + 0xbc6ba980, 0xfd5ab299, 0x3e099fb2, 0x7f3884ab, 0xb0241c2c, + 0xf1150735, 0x32462a1e, 0x73773107, 0xb4e17048, 0xf5d06b51, + 0x3683467a, 0x77b25d63, 0x4ed7facb, 0x0fe6e1d2, 0xccb5ccf9, + 0x8d84d7e0, 0x4a1296af, 0x0b238db6, 0xc870a09d, 0x8941bb84, + 0x465d2303, 0x076c381a, 0xc43f1531, 0x850e0e28, 0x42984f67, + 0x03a9547e, 0xc0fa7955, 0x81cb624c, 0x1fc53881, 0x5ef42398, + 0x9da70eb3, 0xdc9615aa, 0x1b0054e5, 0x5a314ffc, 0x996262d7, + 0xd85379ce, 0x174fe149, 0x567efa50, 0x952dd77b, 0xd41ccc62, + 0x138a8d2d, 0x52bb9634, 0x91e8bb1f, 0xd0d9a006, 0xecf37e5e, + 0xadc26547, 0x6e91486c, 0x2fa05375, 0xe836123a, 0xa9070923, + 0x6a542408, 0x2b653f11, 0xe479a796, 0xa548bc8f, 0x661b91a4, + 0x272a8abd, 0xe0bccbf2, 0xa18dd0eb, 0x62defdc0, 0x23efe6d9, + 0xbde1bc14, 0xfcd0a70d, 0x3f838a26, 0x7eb2913f, 0xb924d070, + 0xf815cb69, 0x3b46e642, 0x7a77fd5b, 0xb56b65dc, 0xf45a7ec5, + 0x370953ee, 0x763848f7, 0xb1ae09b8, 0xf09f12a1, 0x33cc3f8a, + 0x72fd2493}, + {0x00000000, 0x376ac201, 0x6ed48403, 0x59be4602, 0xdca80907, + 0xebc2cb06, 0xb27c8d04, 0x85164f05, 0xb851130e, 0x8f3bd10f, + 0xd685970d, 0xe1ef550c, 0x64f91a09, 0x5393d808, 0x0a2d9e0a, + 0x3d475c0b, 0x70a3261c, 0x47c9e41d, 0x1e77a21f, 0x291d601e, + 0xac0b2f1b, 0x9b61ed1a, 0xc2dfab18, 0xf5b56919, 0xc8f23512, + 0xff98f713, 0xa626b111, 0x914c7310, 0x145a3c15, 0x2330fe14, + 0x7a8eb816, 0x4de47a17, 0xe0464d38, 0xd72c8f39, 0x8e92c93b, + 0xb9f80b3a, 0x3cee443f, 0x0b84863e, 0x523ac03c, 0x6550023d, + 0x58175e36, 0x6f7d9c37, 0x36c3da35, 0x01a91834, 0x84bf5731, + 0xb3d59530, 0xea6bd332, 0xdd011133, 0x90e56b24, 0xa78fa925, + 0xfe31ef27, 0xc95b2d26, 0x4c4d6223, 0x7b27a022, 0x2299e620, + 0x15f32421, 0x28b4782a, 0x1fdeba2b, 0x4660fc29, 0x710a3e28, + 0xf41c712d, 0xc376b32c, 0x9ac8f52e, 0xada2372f, 0xc08d9a70, + 0xf7e75871, 0xae591e73, 0x9933dc72, 0x1c259377, 0x2b4f5176, + 0x72f11774, 0x459bd575, 0x78dc897e, 0x4fb64b7f, 0x16080d7d, + 0x2162cf7c, 0xa4748079, 0x931e4278, 0xcaa0047a, 0xfdcac67b, + 0xb02ebc6c, 0x87447e6d, 0xdefa386f, 0xe990fa6e, 0x6c86b56b, + 0x5bec776a, 0x02523168, 0x3538f369, 0x087faf62, 0x3f156d63, + 0x66ab2b61, 0x51c1e960, 0xd4d7a665, 0xe3bd6464, 0xba032266, + 0x8d69e067, 0x20cbd748, 0x17a11549, 0x4e1f534b, 0x7975914a, + 0xfc63de4f, 0xcb091c4e, 0x92b75a4c, 0xa5dd984d, 0x989ac446, + 0xaff00647, 0xf64e4045, 0xc1248244, 0x4432cd41, 0x73580f40, + 0x2ae64942, 0x1d8c8b43, 0x5068f154, 0x67023355, 0x3ebc7557, + 0x09d6b756, 0x8cc0f853, 0xbbaa3a52, 0xe2147c50, 0xd57ebe51, + 0xe839e25a, 0xdf53205b, 0x86ed6659, 0xb187a458, 0x3491eb5d, + 0x03fb295c, 0x5a456f5e, 0x6d2fad5f, 0x801b35e1, 0xb771f7e0, + 0xeecfb1e2, 0xd9a573e3, 0x5cb33ce6, 0x6bd9fee7, 0x3267b8e5, + 0x050d7ae4, 0x384a26ef, 0x0f20e4ee, 0x569ea2ec, 0x61f460ed, + 0xe4e22fe8, 0xd388ede9, 0x8a36abeb, 0xbd5c69ea, 0xf0b813fd, + 0xc7d2d1fc, 0x9e6c97fe, 0xa90655ff, 0x2c101afa, 0x1b7ad8fb, + 0x42c49ef9, 0x75ae5cf8, 0x48e900f3, 0x7f83c2f2, 0x263d84f0, + 0x115746f1, 0x944109f4, 0xa32bcbf5, 0xfa958df7, 0xcdff4ff6, + 0x605d78d9, 0x5737bad8, 0x0e89fcda, 0x39e33edb, 0xbcf571de, + 0x8b9fb3df, 0xd221f5dd, 0xe54b37dc, 0xd80c6bd7, 0xef66a9d6, + 0xb6d8efd4, 0x81b22dd5, 0x04a462d0, 0x33cea0d1, 0x6a70e6d3, + 0x5d1a24d2, 0x10fe5ec5, 0x27949cc4, 0x7e2adac6, 0x494018c7, + 0xcc5657c2, 0xfb3c95c3, 0xa282d3c1, 0x95e811c0, 0xa8af4dcb, + 0x9fc58fca, 0xc67bc9c8, 0xf1110bc9, 0x740744cc, 0x436d86cd, + 0x1ad3c0cf, 0x2db902ce, 0x4096af91, 0x77fc6d90, 0x2e422b92, + 0x1928e993, 0x9c3ea696, 0xab546497, 0xf2ea2295, 0xc580e094, + 0xf8c7bc9f, 0xcfad7e9e, 0x9613389c, 0xa179fa9d, 0x246fb598, + 0x13057799, 0x4abb319b, 0x7dd1f39a, 0x3035898d, 0x075f4b8c, + 0x5ee10d8e, 0x698bcf8f, 0xec9d808a, 0xdbf7428b, 0x82490489, + 0xb523c688, 0x88649a83, 0xbf0e5882, 0xe6b01e80, 0xd1dadc81, + 0x54cc9384, 0x63a65185, 0x3a181787, 0x0d72d586, 0xa0d0e2a9, + 0x97ba20a8, 0xce0466aa, 0xf96ea4ab, 0x7c78ebae, 0x4b1229af, + 0x12ac6fad, 0x25c6adac, 0x1881f1a7, 0x2feb33a6, 0x765575a4, + 0x413fb7a5, 0xc429f8a0, 0xf3433aa1, 0xaafd7ca3, 0x9d97bea2, + 0xd073c4b5, 0xe71906b4, 0xbea740b6, 0x89cd82b7, 0x0cdbcdb2, + 0x3bb10fb3, 0x620f49b1, 0x55658bb0, 0x6822d7bb, 0x5f4815ba, + 0x06f653b8, 0x319c91b9, 0xb48adebc, 0x83e01cbd, 0xda5e5abf, + 0xed3498be}, + {0x00000000, 0x6567bcb8, 0x8bc809aa, 0xeeafb512, 0x5797628f, + 0x32f0de37, 0xdc5f6b25, 0xb938d79d, 0xef28b4c5, 0x8a4f087d, + 0x64e0bd6f, 0x018701d7, 0xb8bfd64a, 0xddd86af2, 0x3377dfe0, + 0x56106358, 0x9f571950, 0xfa30a5e8, 0x149f10fa, 0x71f8ac42, + 0xc8c07bdf, 0xada7c767, 0x43087275, 0x266fcecd, 0x707fad95, + 0x1518112d, 0xfbb7a43f, 0x9ed01887, 0x27e8cf1a, 0x428f73a2, + 0xac20c6b0, 0xc9477a08, 0x3eaf32a0, 0x5bc88e18, 0xb5673b0a, + 0xd00087b2, 0x6938502f, 0x0c5fec97, 0xe2f05985, 0x8797e53d, + 0xd1878665, 0xb4e03add, 0x5a4f8fcf, 0x3f283377, 0x8610e4ea, + 0xe3775852, 0x0dd8ed40, 0x68bf51f8, 0xa1f82bf0, 0xc49f9748, + 0x2a30225a, 0x4f579ee2, 0xf66f497f, 0x9308f5c7, 0x7da740d5, + 0x18c0fc6d, 0x4ed09f35, 0x2bb7238d, 0xc518969f, 0xa07f2a27, + 0x1947fdba, 0x7c204102, 0x928ff410, 0xf7e848a8, 0x3d58149b, + 0x583fa823, 0xb6901d31, 0xd3f7a189, 0x6acf7614, 0x0fa8caac, + 0xe1077fbe, 0x8460c306, 0xd270a05e, 0xb7171ce6, 0x59b8a9f4, + 0x3cdf154c, 0x85e7c2d1, 0xe0807e69, 0x0e2fcb7b, 0x6b4877c3, + 0xa20f0dcb, 0xc768b173, 0x29c70461, 0x4ca0b8d9, 0xf5986f44, + 0x90ffd3fc, 0x7e5066ee, 0x1b37da56, 0x4d27b90e, 0x284005b6, + 0xc6efb0a4, 0xa3880c1c, 0x1ab0db81, 0x7fd76739, 0x9178d22b, + 0xf41f6e93, 0x03f7263b, 0x66909a83, 0x883f2f91, 0xed589329, + 0x546044b4, 0x3107f80c, 0xdfa84d1e, 0xbacff1a6, 0xecdf92fe, + 0x89b82e46, 0x67179b54, 0x027027ec, 0xbb48f071, 0xde2f4cc9, + 0x3080f9db, 0x55e74563, 0x9ca03f6b, 0xf9c783d3, 0x176836c1, + 0x720f8a79, 0xcb375de4, 0xae50e15c, 0x40ff544e, 0x2598e8f6, + 0x73888bae, 0x16ef3716, 0xf8408204, 0x9d273ebc, 0x241fe921, + 0x41785599, 0xafd7e08b, 0xcab05c33, 0x3bb659ed, 0x5ed1e555, + 0xb07e5047, 0xd519ecff, 0x6c213b62, 0x094687da, 0xe7e932c8, + 0x828e8e70, 0xd49eed28, 0xb1f95190, 0x5f56e482, 0x3a31583a, + 0x83098fa7, 0xe66e331f, 0x08c1860d, 0x6da63ab5, 0xa4e140bd, + 0xc186fc05, 0x2f294917, 0x4a4ef5af, 0xf3762232, 0x96119e8a, + 0x78be2b98, 0x1dd99720, 0x4bc9f478, 0x2eae48c0, 0xc001fdd2, + 0xa566416a, 0x1c5e96f7, 0x79392a4f, 0x97969f5d, 0xf2f123e5, + 0x05196b4d, 0x607ed7f5, 0x8ed162e7, 0xebb6de5f, 0x528e09c2, + 0x37e9b57a, 0xd9460068, 0xbc21bcd0, 0xea31df88, 0x8f566330, + 0x61f9d622, 0x049e6a9a, 0xbda6bd07, 0xd8c101bf, 0x366eb4ad, + 0x53090815, 0x9a4e721d, 0xff29cea5, 0x11867bb7, 0x74e1c70f, + 0xcdd91092, 0xa8beac2a, 0x46111938, 0x2376a580, 0x7566c6d8, + 0x10017a60, 0xfeaecf72, 0x9bc973ca, 0x22f1a457, 0x479618ef, + 0xa939adfd, 0xcc5e1145, 0x06ee4d76, 0x6389f1ce, 0x8d2644dc, + 0xe841f864, 0x51792ff9, 0x341e9341, 0xdab12653, 0xbfd69aeb, + 0xe9c6f9b3, 0x8ca1450b, 0x620ef019, 0x07694ca1, 0xbe519b3c, + 0xdb362784, 0x35999296, 0x50fe2e2e, 0x99b95426, 0xfcdee89e, + 0x12715d8c, 0x7716e134, 0xce2e36a9, 0xab498a11, 0x45e63f03, + 0x208183bb, 0x7691e0e3, 0x13f65c5b, 0xfd59e949, 0x983e55f1, + 0x2106826c, 0x44613ed4, 0xaace8bc6, 0xcfa9377e, 0x38417fd6, + 0x5d26c36e, 0xb389767c, 0xd6eecac4, 0x6fd61d59, 0x0ab1a1e1, + 0xe41e14f3, 0x8179a84b, 0xd769cb13, 0xb20e77ab, 0x5ca1c2b9, + 0x39c67e01, 0x80fea99c, 0xe5991524, 0x0b36a036, 0x6e511c8e, + 0xa7166686, 0xc271da3e, 0x2cde6f2c, 0x49b9d394, 0xf0810409, + 0x95e6b8b1, 0x7b490da3, 0x1e2eb11b, 0x483ed243, 0x2d596efb, + 0xc3f6dbe9, 0xa6916751, 0x1fa9b0cc, 0x7ace0c74, 0x9461b966, + 0xf10605de}}; + +#endif + +#endif + +#if N == 2 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}, + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43147b1700000000, 0x8628f62e00000000, + 0xc53c8d3900000000, 0x0c51ec5d00000000, 0x4f45974a00000000, + 0x8a791a7300000000, 0xc96d616400000000, 0x18a2d8bb00000000, + 0x5bb6a3ac00000000, 0x9e8a2e9500000000, 0xdd9e558200000000, + 0x14f334e600000000, 0x57e74ff100000000, 0x92dbc2c800000000, + 0xd1cfb9df00000000, 0x7142c0ac00000000, 0x3256bbbb00000000, + 0xf76a368200000000, 0xb47e4d9500000000, 0x7d132cf100000000, + 0x3e0757e600000000, 0xfb3bdadf00000000, 0xb82fa1c800000000, + 0x69e0181700000000, 0x2af4630000000000, 0xefc8ee3900000000, + 0xacdc952e00000000, 0x65b1f44a00000000, 0x26a58f5d00000000, + 0xe399026400000000, 0xa08d797300000000, 0xa382f18200000000, + 0xe0968a9500000000, 0x25aa07ac00000000, 0x66be7cbb00000000, + 0xafd31ddf00000000, 0xecc766c800000000, 0x29fbebf100000000, + 0x6aef90e600000000, 0xbb20293900000000, 0xf834522e00000000, + 0x3d08df1700000000, 0x7e1ca40000000000, 0xb771c56400000000, + 0xf465be7300000000, 0x3159334a00000000, 0x724d485d00000000, + 0xd2c0312e00000000, 0x91d44a3900000000, 0x54e8c70000000000, + 0x17fcbc1700000000, 0xde91dd7300000000, 0x9d85a66400000000, + 0x58b92b5d00000000, 0x1bad504a00000000, 0xca62e99500000000, + 0x8976928200000000, 0x4c4a1fbb00000000, 0x0f5e64ac00000000, + 0xc63305c800000000, 0x85277edf00000000, 0x401bf3e600000000, + 0x030f88f100000000, 0x070392de00000000, 0x4417e9c900000000, + 0x812b64f000000000, 0xc23f1fe700000000, 0x0b527e8300000000, + 0x4846059400000000, 0x8d7a88ad00000000, 0xce6ef3ba00000000, + 0x1fa14a6500000000, 0x5cb5317200000000, 0x9989bc4b00000000, + 0xda9dc75c00000000, 0x13f0a63800000000, 0x50e4dd2f00000000, + 0x95d8501600000000, 0xd6cc2b0100000000, 0x7641527200000000, + 0x3555296500000000, 0xf069a45c00000000, 0xb37ddf4b00000000, + 0x7a10be2f00000000, 0x3904c53800000000, 0xfc38480100000000, + 0xbf2c331600000000, 0x6ee38ac900000000, 0x2df7f1de00000000, + 0xe8cb7ce700000000, 0xabdf07f000000000, 0x62b2669400000000, + 0x21a61d8300000000, 0xe49a90ba00000000, 0xa78eebad00000000, + 0xa481635c00000000, 0xe795184b00000000, 0x22a9957200000000, + 0x61bdee6500000000, 0xa8d08f0100000000, 0xebc4f41600000000, + 0x2ef8792f00000000, 0x6dec023800000000, 0xbc23bbe700000000, + 0xff37c0f000000000, 0x3a0b4dc900000000, 0x791f36de00000000, + 0xb07257ba00000000, 0xf3662cad00000000, 0x365aa19400000000, + 0x754eda8300000000, 0xd5c3a3f000000000, 0x96d7d8e700000000, + 0x53eb55de00000000, 0x10ff2ec900000000, 0xd9924fad00000000, + 0x9a8634ba00000000, 0x5fbab98300000000, 0x1caec29400000000, + 0xcd617b4b00000000, 0x8e75005c00000000, 0x4b498d6500000000, + 0x085df67200000000, 0xc130971600000000, 0x8224ec0100000000, + 0x4718613800000000, 0x040c1a2f00000000, 0x4f00556600000000, + 0x0c142e7100000000, 0xc928a34800000000, 0x8a3cd85f00000000, + 0x4351b93b00000000, 0x0045c22c00000000, 0xc5794f1500000000, + 0x866d340200000000, 0x57a28ddd00000000, 0x14b6f6ca00000000, + 0xd18a7bf300000000, 0x929e00e400000000, 0x5bf3618000000000, + 0x18e71a9700000000, 0xdddb97ae00000000, 0x9ecfecb900000000, + 0x3e4295ca00000000, 0x7d56eedd00000000, 0xb86a63e400000000, + 0xfb7e18f300000000, 0x3213799700000000, 0x7107028000000000, + 0xb43b8fb900000000, 0xf72ff4ae00000000, 0x26e04d7100000000, + 0x65f4366600000000, 0xa0c8bb5f00000000, 0xe3dcc04800000000, + 0x2ab1a12c00000000, 0x69a5da3b00000000, 0xac99570200000000, + 0xef8d2c1500000000, 0xec82a4e400000000, 0xaf96dff300000000, + 0x6aaa52ca00000000, 0x29be29dd00000000, 0xe0d348b900000000, + 0xa3c733ae00000000, 0x66fbbe9700000000, 0x25efc58000000000, + 0xf4207c5f00000000, 0xb734074800000000, 0x72088a7100000000, + 0x311cf16600000000, 0xf871900200000000, 0xbb65eb1500000000, + 0x7e59662c00000000, 0x3d4d1d3b00000000, 0x9dc0644800000000, + 0xded41f5f00000000, 0x1be8926600000000, 0x58fce97100000000, + 0x9191881500000000, 0xd285f30200000000, 0x17b97e3b00000000, + 0x54ad052c00000000, 0x8562bcf300000000, 0xc676c7e400000000, + 0x034a4add00000000, 0x405e31ca00000000, 0x893350ae00000000, + 0xca272bb900000000, 0x0f1ba68000000000, 0x4c0fdd9700000000, + 0x4803c7b800000000, 0x0b17bcaf00000000, 0xce2b319600000000, + 0x8d3f4a8100000000, 0x44522be500000000, 0x074650f200000000, + 0xc27addcb00000000, 0x816ea6dc00000000, 0x50a11f0300000000, + 0x13b5641400000000, 0xd689e92d00000000, 0x959d923a00000000, + 0x5cf0f35e00000000, 0x1fe4884900000000, 0xdad8057000000000, + 0x99cc7e6700000000, 0x3941071400000000, 0x7a557c0300000000, + 0xbf69f13a00000000, 0xfc7d8a2d00000000, 0x3510eb4900000000, + 0x7604905e00000000, 0xb3381d6700000000, 0xf02c667000000000, + 0x21e3dfaf00000000, 0x62f7a4b800000000, 0xa7cb298100000000, + 0xe4df529600000000, 0x2db233f200000000, 0x6ea648e500000000, + 0xab9ac5dc00000000, 0xe88ebecb00000000, 0xeb81363a00000000, + 0xa8954d2d00000000, 0x6da9c01400000000, 0x2ebdbb0300000000, + 0xe7d0da6700000000, 0xa4c4a17000000000, 0x61f82c4900000000, + 0x22ec575e00000000, 0xf323ee8100000000, 0xb037959600000000, + 0x750b18af00000000, 0x361f63b800000000, 0xff7202dc00000000, + 0xbc6679cb00000000, 0x795af4f200000000, 0x3a4e8fe500000000, + 0x9ac3f69600000000, 0xd9d78d8100000000, 0x1ceb00b800000000, + 0x5fff7baf00000000, 0x96921acb00000000, 0xd58661dc00000000, + 0x10baece500000000, 0x53ae97f200000000, 0x82612e2d00000000, + 0xc175553a00000000, 0x0449d80300000000, 0x475da31400000000, + 0x8e30c27000000000, 0xcd24b96700000000, 0x0818345e00000000, + 0x4b0c4f4900000000}, + {0x0000000000000000, 0x3e6bc2ef00000000, 0x3dd0f50400000000, + 0x03bb37eb00000000, 0x7aa0eb0900000000, 0x44cb29e600000000, + 0x47701e0d00000000, 0x791bdce200000000, 0xf440d71300000000, + 0xca2b15fc00000000, 0xc990221700000000, 0xf7fbe0f800000000, + 0x8ee03c1a00000000, 0xb08bfef500000000, 0xb330c91e00000000, + 0x8d5b0bf100000000, 0xe881ae2700000000, 0xd6ea6cc800000000, + 0xd5515b2300000000, 0xeb3a99cc00000000, 0x9221452e00000000, + 0xac4a87c100000000, 0xaff1b02a00000000, 0x919a72c500000000, + 0x1cc1793400000000, 0x22aabbdb00000000, 0x21118c3000000000, + 0x1f7a4edf00000000, 0x6661923d00000000, 0x580a50d200000000, + 0x5bb1673900000000, 0x65daa5d600000000, 0xd0035d4f00000000, + 0xee689fa000000000, 0xedd3a84b00000000, 0xd3b86aa400000000, + 0xaaa3b64600000000, 0x94c874a900000000, 0x9773434200000000, + 0xa91881ad00000000, 0x24438a5c00000000, 0x1a2848b300000000, + 0x19937f5800000000, 0x27f8bdb700000000, 0x5ee3615500000000, + 0x6088a3ba00000000, 0x6333945100000000, 0x5d5856be00000000, + 0x3882f36800000000, 0x06e9318700000000, 0x0552066c00000000, + 0x3b39c48300000000, 0x4222186100000000, 0x7c49da8e00000000, + 0x7ff2ed6500000000, 0x41992f8a00000000, 0xccc2247b00000000, + 0xf2a9e69400000000, 0xf112d17f00000000, 0xcf79139000000000, + 0xb662cf7200000000, 0x88090d9d00000000, 0x8bb23a7600000000, + 0xb5d9f89900000000, 0xa007ba9e00000000, 0x9e6c787100000000, + 0x9dd74f9a00000000, 0xa3bc8d7500000000, 0xdaa7519700000000, + 0xe4cc937800000000, 0xe777a49300000000, 0xd91c667c00000000, + 0x54476d8d00000000, 0x6a2caf6200000000, 0x6997988900000000, + 0x57fc5a6600000000, 0x2ee7868400000000, 0x108c446b00000000, + 0x1337738000000000, 0x2d5cb16f00000000, 0x488614b900000000, + 0x76edd65600000000, 0x7556e1bd00000000, 0x4b3d235200000000, + 0x3226ffb000000000, 0x0c4d3d5f00000000, 0x0ff60ab400000000, + 0x319dc85b00000000, 0xbcc6c3aa00000000, 0x82ad014500000000, + 0x811636ae00000000, 0xbf7df44100000000, 0xc66628a300000000, + 0xf80dea4c00000000, 0xfbb6dda700000000, 0xc5dd1f4800000000, + 0x7004e7d100000000, 0x4e6f253e00000000, 0x4dd412d500000000, + 0x73bfd03a00000000, 0x0aa40cd800000000, 0x34cfce3700000000, + 0x3774f9dc00000000, 0x091f3b3300000000, 0x844430c200000000, + 0xba2ff22d00000000, 0xb994c5c600000000, 0x87ff072900000000, + 0xfee4dbcb00000000, 0xc08f192400000000, 0xc3342ecf00000000, + 0xfd5fec2000000000, 0x988549f600000000, 0xa6ee8b1900000000, + 0xa555bcf200000000, 0x9b3e7e1d00000000, 0xe225a2ff00000000, + 0xdc4e601000000000, 0xdff557fb00000000, 0xe19e951400000000, + 0x6cc59ee500000000, 0x52ae5c0a00000000, 0x51156be100000000, + 0x6f7ea90e00000000, 0x166575ec00000000, 0x280eb70300000000, + 0x2bb580e800000000, 0x15de420700000000, 0x010905e600000000, + 0x3f62c70900000000, 0x3cd9f0e200000000, 0x02b2320d00000000, + 0x7ba9eeef00000000, 0x45c22c0000000000, 0x46791beb00000000, + 0x7812d90400000000, 0xf549d2f500000000, 0xcb22101a00000000, + 0xc89927f100000000, 0xf6f2e51e00000000, 0x8fe939fc00000000, + 0xb182fb1300000000, 0xb239ccf800000000, 0x8c520e1700000000, + 0xe988abc100000000, 0xd7e3692e00000000, 0xd4585ec500000000, + 0xea339c2a00000000, 0x932840c800000000, 0xad43822700000000, + 0xaef8b5cc00000000, 0x9093772300000000, 0x1dc87cd200000000, + 0x23a3be3d00000000, 0x201889d600000000, 0x1e734b3900000000, + 0x676897db00000000, 0x5903553400000000, 0x5ab862df00000000, + 0x64d3a03000000000, 0xd10a58a900000000, 0xef619a4600000000, + 0xecdaadad00000000, 0xd2b16f4200000000, 0xabaab3a000000000, + 0x95c1714f00000000, 0x967a46a400000000, 0xa811844b00000000, + 0x254a8fba00000000, 0x1b214d5500000000, 0x189a7abe00000000, + 0x26f1b85100000000, 0x5fea64b300000000, 0x6181a65c00000000, + 0x623a91b700000000, 0x5c51535800000000, 0x398bf68e00000000, + 0x07e0346100000000, 0x045b038a00000000, 0x3a30c16500000000, + 0x432b1d8700000000, 0x7d40df6800000000, 0x7efbe88300000000, + 0x40902a6c00000000, 0xcdcb219d00000000, 0xf3a0e37200000000, + 0xf01bd49900000000, 0xce70167600000000, 0xb76bca9400000000, + 0x8900087b00000000, 0x8abb3f9000000000, 0xb4d0fd7f00000000, + 0xa10ebf7800000000, 0x9f657d9700000000, 0x9cde4a7c00000000, + 0xa2b5889300000000, 0xdbae547100000000, 0xe5c5969e00000000, + 0xe67ea17500000000, 0xd815639a00000000, 0x554e686b00000000, + 0x6b25aa8400000000, 0x689e9d6f00000000, 0x56f55f8000000000, + 0x2fee836200000000, 0x1185418d00000000, 0x123e766600000000, + 0x2c55b48900000000, 0x498f115f00000000, 0x77e4d3b000000000, + 0x745fe45b00000000, 0x4a3426b400000000, 0x332ffa5600000000, + 0x0d4438b900000000, 0x0eff0f5200000000, 0x3094cdbd00000000, + 0xbdcfc64c00000000, 0x83a404a300000000, 0x801f334800000000, + 0xbe74f1a700000000, 0xc76f2d4500000000, 0xf904efaa00000000, + 0xfabfd84100000000, 0xc4d41aae00000000, 0x710de23700000000, + 0x4f6620d800000000, 0x4cdd173300000000, 0x72b6d5dc00000000, + 0x0bad093e00000000, 0x35c6cbd100000000, 0x367dfc3a00000000, + 0x08163ed500000000, 0x854d352400000000, 0xbb26f7cb00000000, + 0xb89dc02000000000, 0x86f602cf00000000, 0xffedde2d00000000, + 0xc1861cc200000000, 0xc23d2b2900000000, 0xfc56e9c600000000, + 0x998c4c1000000000, 0xa7e78eff00000000, 0xa45cb91400000000, + 0x9a377bfb00000000, 0xe32ca71900000000, 0xdd4765f600000000, + 0xdefc521d00000000, 0xe09790f200000000, 0x6dcc9b0300000000, + 0x53a759ec00000000, 0x501c6e0700000000, 0x6e77ace800000000, + 0x176c700a00000000, 0x2907b2e500000000, 0x2abc850e00000000, + 0x14d747e100000000}, + {0x0000000000000000, 0xc0df8ec100000000, 0xc1b96c5800000000, + 0x0166e29900000000, 0x8273d9b000000000, 0x42ac577100000000, + 0x43cab5e800000000, 0x83153b2900000000, 0x45e1c3ba00000000, + 0x853e4d7b00000000, 0x8458afe200000000, 0x4487212300000000, + 0xc7921a0a00000000, 0x074d94cb00000000, 0x062b765200000000, + 0xc6f4f89300000000, 0xcbc4f6ae00000000, 0x0b1b786f00000000, + 0x0a7d9af600000000, 0xcaa2143700000000, 0x49b72f1e00000000, + 0x8968a1df00000000, 0x880e434600000000, 0x48d1cd8700000000, + 0x8e25351400000000, 0x4efabbd500000000, 0x4f9c594c00000000, + 0x8f43d78d00000000, 0x0c56eca400000000, 0xcc89626500000000, + 0xcdef80fc00000000, 0x0d300e3d00000000, 0xd78f9c8600000000, + 0x1750124700000000, 0x1636f0de00000000, 0xd6e97e1f00000000, + 0x55fc453600000000, 0x9523cbf700000000, 0x9445296e00000000, + 0x549aa7af00000000, 0x926e5f3c00000000, 0x52b1d1fd00000000, + 0x53d7336400000000, 0x9308bda500000000, 0x101d868c00000000, + 0xd0c2084d00000000, 0xd1a4ead400000000, 0x117b641500000000, + 0x1c4b6a2800000000, 0xdc94e4e900000000, 0xddf2067000000000, + 0x1d2d88b100000000, 0x9e38b39800000000, 0x5ee73d5900000000, + 0x5f81dfc000000000, 0x9f5e510100000000, 0x59aaa99200000000, + 0x9975275300000000, 0x9813c5ca00000000, 0x58cc4b0b00000000, + 0xdbd9702200000000, 0x1b06fee300000000, 0x1a601c7a00000000, + 0xdabf92bb00000000, 0xef1948d600000000, 0x2fc6c61700000000, + 0x2ea0248e00000000, 0xee7faa4f00000000, 0x6d6a916600000000, + 0xadb51fa700000000, 0xacd3fd3e00000000, 0x6c0c73ff00000000, + 0xaaf88b6c00000000, 0x6a2705ad00000000, 0x6b41e73400000000, + 0xab9e69f500000000, 0x288b52dc00000000, 0xe854dc1d00000000, + 0xe9323e8400000000, 0x29edb04500000000, 0x24ddbe7800000000, + 0xe40230b900000000, 0xe564d22000000000, 0x25bb5ce100000000, + 0xa6ae67c800000000, 0x6671e90900000000, 0x67170b9000000000, + 0xa7c8855100000000, 0x613c7dc200000000, 0xa1e3f30300000000, + 0xa085119a00000000, 0x605a9f5b00000000, 0xe34fa47200000000, + 0x23902ab300000000, 0x22f6c82a00000000, 0xe22946eb00000000, + 0x3896d45000000000, 0xf8495a9100000000, 0xf92fb80800000000, + 0x39f036c900000000, 0xbae50de000000000, 0x7a3a832100000000, + 0x7b5c61b800000000, 0xbb83ef7900000000, 0x7d7717ea00000000, + 0xbda8992b00000000, 0xbcce7bb200000000, 0x7c11f57300000000, + 0xff04ce5a00000000, 0x3fdb409b00000000, 0x3ebda20200000000, + 0xfe622cc300000000, 0xf35222fe00000000, 0x338dac3f00000000, + 0x32eb4ea600000000, 0xf234c06700000000, 0x7121fb4e00000000, + 0xb1fe758f00000000, 0xb098971600000000, 0x704719d700000000, + 0xb6b3e14400000000, 0x766c6f8500000000, 0x770a8d1c00000000, + 0xb7d503dd00000000, 0x34c038f400000000, 0xf41fb63500000000, + 0xf57954ac00000000, 0x35a6da6d00000000, 0x9f35e17700000000, + 0x5fea6fb600000000, 0x5e8c8d2f00000000, 0x9e5303ee00000000, + 0x1d4638c700000000, 0xdd99b60600000000, 0xdcff549f00000000, + 0x1c20da5e00000000, 0xdad422cd00000000, 0x1a0bac0c00000000, + 0x1b6d4e9500000000, 0xdbb2c05400000000, 0x58a7fb7d00000000, + 0x987875bc00000000, 0x991e972500000000, 0x59c119e400000000, + 0x54f117d900000000, 0x942e991800000000, 0x95487b8100000000, + 0x5597f54000000000, 0xd682ce6900000000, 0x165d40a800000000, + 0x173ba23100000000, 0xd7e42cf000000000, 0x1110d46300000000, + 0xd1cf5aa200000000, 0xd0a9b83b00000000, 0x107636fa00000000, + 0x93630dd300000000, 0x53bc831200000000, 0x52da618b00000000, + 0x9205ef4a00000000, 0x48ba7df100000000, 0x8865f33000000000, + 0x890311a900000000, 0x49dc9f6800000000, 0xcac9a44100000000, + 0x0a162a8000000000, 0x0b70c81900000000, 0xcbaf46d800000000, + 0x0d5bbe4b00000000, 0xcd84308a00000000, 0xcce2d21300000000, + 0x0c3d5cd200000000, 0x8f2867fb00000000, 0x4ff7e93a00000000, + 0x4e910ba300000000, 0x8e4e856200000000, 0x837e8b5f00000000, + 0x43a1059e00000000, 0x42c7e70700000000, 0x821869c600000000, + 0x010d52ef00000000, 0xc1d2dc2e00000000, 0xc0b43eb700000000, + 0x006bb07600000000, 0xc69f48e500000000, 0x0640c62400000000, + 0x072624bd00000000, 0xc7f9aa7c00000000, 0x44ec915500000000, + 0x84331f9400000000, 0x8555fd0d00000000, 0x458a73cc00000000, + 0x702ca9a100000000, 0xb0f3276000000000, 0xb195c5f900000000, + 0x714a4b3800000000, 0xf25f701100000000, 0x3280fed000000000, + 0x33e61c4900000000, 0xf339928800000000, 0x35cd6a1b00000000, + 0xf512e4da00000000, 0xf474064300000000, 0x34ab888200000000, + 0xb7beb3ab00000000, 0x77613d6a00000000, 0x7607dff300000000, + 0xb6d8513200000000, 0xbbe85f0f00000000, 0x7b37d1ce00000000, + 0x7a51335700000000, 0xba8ebd9600000000, 0x399b86bf00000000, + 0xf944087e00000000, 0xf822eae700000000, 0x38fd642600000000, + 0xfe099cb500000000, 0x3ed6127400000000, 0x3fb0f0ed00000000, + 0xff6f7e2c00000000, 0x7c7a450500000000, 0xbca5cbc400000000, + 0xbdc3295d00000000, 0x7d1ca79c00000000, 0xa7a3352700000000, + 0x677cbbe600000000, 0x661a597f00000000, 0xa6c5d7be00000000, + 0x25d0ec9700000000, 0xe50f625600000000, 0xe46980cf00000000, + 0x24b60e0e00000000, 0xe242f69d00000000, 0x229d785c00000000, + 0x23fb9ac500000000, 0xe324140400000000, 0x60312f2d00000000, + 0xa0eea1ec00000000, 0xa188437500000000, 0x6157cdb400000000, + 0x6c67c38900000000, 0xacb84d4800000000, 0xaddeafd100000000, + 0x6d01211000000000, 0xee141a3900000000, 0x2ecb94f800000000, + 0x2fad766100000000, 0xef72f8a000000000, 0x2986003300000000, + 0xe9598ef200000000, 0xe83f6c6b00000000, 0x28e0e2aa00000000, + 0xabf5d98300000000, 0x6b2a574200000000, 0x6a4cb5db00000000, + 0xaa933b1a00000000}, + {0x0000000000000000, 0x6f4ca59b00000000, 0x9f9e3bec00000000, + 0xf0d29e7700000000, 0x7f3b060300000000, 0x1077a39800000000, + 0xe0a53def00000000, 0x8fe9987400000000, 0xfe760c0600000000, + 0x913aa99d00000000, 0x61e837ea00000000, 0x0ea4927100000000, + 0x814d0a0500000000, 0xee01af9e00000000, 0x1ed331e900000000, + 0x719f947200000000, 0xfced180c00000000, 0x93a1bd9700000000, + 0x637323e000000000, 0x0c3f867b00000000, 0x83d61e0f00000000, + 0xec9abb9400000000, 0x1c4825e300000000, 0x7304807800000000, + 0x029b140a00000000, 0x6dd7b19100000000, 0x9d052fe600000000, + 0xf2498a7d00000000, 0x7da0120900000000, 0x12ecb79200000000, + 0xe23e29e500000000, 0x8d728c7e00000000, 0xf8db311800000000, + 0x9797948300000000, 0x67450af400000000, 0x0809af6f00000000, + 0x87e0371b00000000, 0xe8ac928000000000, 0x187e0cf700000000, + 0x7732a96c00000000, 0x06ad3d1e00000000, 0x69e1988500000000, + 0x993306f200000000, 0xf67fa36900000000, 0x79963b1d00000000, + 0x16da9e8600000000, 0xe60800f100000000, 0x8944a56a00000000, + 0x0436291400000000, 0x6b7a8c8f00000000, 0x9ba812f800000000, + 0xf4e4b76300000000, 0x7b0d2f1700000000, 0x14418a8c00000000, + 0xe49314fb00000000, 0x8bdfb16000000000, 0xfa40251200000000, + 0x950c808900000000, 0x65de1efe00000000, 0x0a92bb6500000000, + 0x857b231100000000, 0xea37868a00000000, 0x1ae518fd00000000, + 0x75a9bd6600000000, 0xf0b7633000000000, 0x9ffbc6ab00000000, + 0x6f2958dc00000000, 0x0065fd4700000000, 0x8f8c653300000000, + 0xe0c0c0a800000000, 0x10125edf00000000, 0x7f5efb4400000000, + 0x0ec16f3600000000, 0x618dcaad00000000, 0x915f54da00000000, + 0xfe13f14100000000, 0x71fa693500000000, 0x1eb6ccae00000000, + 0xee6452d900000000, 0x8128f74200000000, 0x0c5a7b3c00000000, + 0x6316dea700000000, 0x93c440d000000000, 0xfc88e54b00000000, + 0x73617d3f00000000, 0x1c2dd8a400000000, 0xecff46d300000000, + 0x83b3e34800000000, 0xf22c773a00000000, 0x9d60d2a100000000, + 0x6db24cd600000000, 0x02fee94d00000000, 0x8d17713900000000, + 0xe25bd4a200000000, 0x12894ad500000000, 0x7dc5ef4e00000000, + 0x086c522800000000, 0x6720f7b300000000, 0x97f269c400000000, + 0xf8becc5f00000000, 0x7757542b00000000, 0x181bf1b000000000, + 0xe8c96fc700000000, 0x8785ca5c00000000, 0xf61a5e2e00000000, + 0x9956fbb500000000, 0x698465c200000000, 0x06c8c05900000000, + 0x8921582d00000000, 0xe66dfdb600000000, 0x16bf63c100000000, + 0x79f3c65a00000000, 0xf4814a2400000000, 0x9bcdefbf00000000, + 0x6b1f71c800000000, 0x0453d45300000000, 0x8bba4c2700000000, + 0xe4f6e9bc00000000, 0x142477cb00000000, 0x7b68d25000000000, + 0x0af7462200000000, 0x65bbe3b900000000, 0x95697dce00000000, + 0xfa25d85500000000, 0x75cc402100000000, 0x1a80e5ba00000000, + 0xea527bcd00000000, 0x851ede5600000000, 0xe06fc76000000000, + 0x8f2362fb00000000, 0x7ff1fc8c00000000, 0x10bd591700000000, + 0x9f54c16300000000, 0xf01864f800000000, 0x00cafa8f00000000, + 0x6f865f1400000000, 0x1e19cb6600000000, 0x71556efd00000000, + 0x8187f08a00000000, 0xeecb551100000000, 0x6122cd6500000000, + 0x0e6e68fe00000000, 0xfebcf68900000000, 0x91f0531200000000, + 0x1c82df6c00000000, 0x73ce7af700000000, 0x831ce48000000000, + 0xec50411b00000000, 0x63b9d96f00000000, 0x0cf57cf400000000, + 0xfc27e28300000000, 0x936b471800000000, 0xe2f4d36a00000000, + 0x8db876f100000000, 0x7d6ae88600000000, 0x12264d1d00000000, + 0x9dcfd56900000000, 0xf28370f200000000, 0x0251ee8500000000, + 0x6d1d4b1e00000000, 0x18b4f67800000000, 0x77f853e300000000, + 0x872acd9400000000, 0xe866680f00000000, 0x678ff07b00000000, + 0x08c355e000000000, 0xf811cb9700000000, 0x975d6e0c00000000, + 0xe6c2fa7e00000000, 0x898e5fe500000000, 0x795cc19200000000, + 0x1610640900000000, 0x99f9fc7d00000000, 0xf6b559e600000000, + 0x0667c79100000000, 0x692b620a00000000, 0xe459ee7400000000, + 0x8b154bef00000000, 0x7bc7d59800000000, 0x148b700300000000, + 0x9b62e87700000000, 0xf42e4dec00000000, 0x04fcd39b00000000, + 0x6bb0760000000000, 0x1a2fe27200000000, 0x756347e900000000, + 0x85b1d99e00000000, 0xeafd7c0500000000, 0x6514e47100000000, + 0x0a5841ea00000000, 0xfa8adf9d00000000, 0x95c67a0600000000, + 0x10d8a45000000000, 0x7f9401cb00000000, 0x8f469fbc00000000, + 0xe00a3a2700000000, 0x6fe3a25300000000, 0x00af07c800000000, + 0xf07d99bf00000000, 0x9f313c2400000000, 0xeeaea85600000000, + 0x81e20dcd00000000, 0x713093ba00000000, 0x1e7c362100000000, + 0x9195ae5500000000, 0xfed90bce00000000, 0x0e0b95b900000000, + 0x6147302200000000, 0xec35bc5c00000000, 0x837919c700000000, + 0x73ab87b000000000, 0x1ce7222b00000000, 0x930eba5f00000000, + 0xfc421fc400000000, 0x0c9081b300000000, 0x63dc242800000000, + 0x1243b05a00000000, 0x7d0f15c100000000, 0x8ddd8bb600000000, + 0xe2912e2d00000000, 0x6d78b65900000000, 0x023413c200000000, + 0xf2e68db500000000, 0x9daa282e00000000, 0xe803954800000000, + 0x874f30d300000000, 0x779daea400000000, 0x18d10b3f00000000, + 0x9738934b00000000, 0xf87436d000000000, 0x08a6a8a700000000, + 0x67ea0d3c00000000, 0x1675994e00000000, 0x79393cd500000000, + 0x89eba2a200000000, 0xe6a7073900000000, 0x694e9f4d00000000, + 0x06023ad600000000, 0xf6d0a4a100000000, 0x999c013a00000000, + 0x14ee8d4400000000, 0x7ba228df00000000, 0x8b70b6a800000000, + 0xe43c133300000000, 0x6bd58b4700000000, 0x04992edc00000000, + 0xf44bb0ab00000000, 0x9b07153000000000, 0xea98814200000000, + 0x85d424d900000000, 0x7506baae00000000, 0x1a4a1f3500000000, + 0x95a3874100000000, 0xfaef22da00000000, 0x0a3dbcad00000000, + 0x6571193600000000}, + {0x0000000000000000, 0x85d996dd00000000, 0x4bb55c6000000000, + 0xce6ccabd00000000, 0x966ab9c000000000, 0x13b32f1d00000000, + 0xdddfe5a000000000, 0x5806737d00000000, 0x6dd3035a00000000, + 0xe80a958700000000, 0x26665f3a00000000, 0xa3bfc9e700000000, + 0xfbb9ba9a00000000, 0x7e602c4700000000, 0xb00ce6fa00000000, + 0x35d5702700000000, 0xdaa607b400000000, 0x5f7f916900000000, + 0x91135bd400000000, 0x14cacd0900000000, 0x4cccbe7400000000, + 0xc91528a900000000, 0x0779e21400000000, 0x82a074c900000000, + 0xb77504ee00000000, 0x32ac923300000000, 0xfcc0588e00000000, + 0x7919ce5300000000, 0x211fbd2e00000000, 0xa4c62bf300000000, + 0x6aaae14e00000000, 0xef73779300000000, 0xf54b7eb300000000, + 0x7092e86e00000000, 0xbefe22d300000000, 0x3b27b40e00000000, + 0x6321c77300000000, 0xe6f851ae00000000, 0x28949b1300000000, + 0xad4d0dce00000000, 0x98987de900000000, 0x1d41eb3400000000, + 0xd32d218900000000, 0x56f4b75400000000, 0x0ef2c42900000000, + 0x8b2b52f400000000, 0x4547984900000000, 0xc09e0e9400000000, + 0x2fed790700000000, 0xaa34efda00000000, 0x6458256700000000, + 0xe181b3ba00000000, 0xb987c0c700000000, 0x3c5e561a00000000, + 0xf2329ca700000000, 0x77eb0a7a00000000, 0x423e7a5d00000000, + 0xc7e7ec8000000000, 0x098b263d00000000, 0x8c52b0e000000000, + 0xd454c39d00000000, 0x518d554000000000, 0x9fe19ffd00000000, + 0x1a38092000000000, 0xab918dbd00000000, 0x2e481b6000000000, + 0xe024d1dd00000000, 0x65fd470000000000, 0x3dfb347d00000000, + 0xb822a2a000000000, 0x764e681d00000000, 0xf397fec000000000, + 0xc6428ee700000000, 0x439b183a00000000, 0x8df7d28700000000, + 0x082e445a00000000, 0x5028372700000000, 0xd5f1a1fa00000000, + 0x1b9d6b4700000000, 0x9e44fd9a00000000, 0x71378a0900000000, + 0xf4ee1cd400000000, 0x3a82d66900000000, 0xbf5b40b400000000, + 0xe75d33c900000000, 0x6284a51400000000, 0xace86fa900000000, + 0x2931f97400000000, 0x1ce4895300000000, 0x993d1f8e00000000, + 0x5751d53300000000, 0xd28843ee00000000, 0x8a8e309300000000, + 0x0f57a64e00000000, 0xc13b6cf300000000, 0x44e2fa2e00000000, + 0x5edaf30e00000000, 0xdb0365d300000000, 0x156faf6e00000000, + 0x90b639b300000000, 0xc8b04ace00000000, 0x4d69dc1300000000, + 0x830516ae00000000, 0x06dc807300000000, 0x3309f05400000000, + 0xb6d0668900000000, 0x78bcac3400000000, 0xfd653ae900000000, + 0xa563499400000000, 0x20badf4900000000, 0xeed615f400000000, + 0x6b0f832900000000, 0x847cf4ba00000000, 0x01a5626700000000, + 0xcfc9a8da00000000, 0x4a103e0700000000, 0x12164d7a00000000, + 0x97cfdba700000000, 0x59a3111a00000000, 0xdc7a87c700000000, + 0xe9aff7e000000000, 0x6c76613d00000000, 0xa21aab8000000000, + 0x27c33d5d00000000, 0x7fc54e2000000000, 0xfa1cd8fd00000000, + 0x3470124000000000, 0xb1a9849d00000000, 0x17256aa000000000, + 0x92fcfc7d00000000, 0x5c9036c000000000, 0xd949a01d00000000, + 0x814fd36000000000, 0x049645bd00000000, 0xcafa8f0000000000, + 0x4f2319dd00000000, 0x7af669fa00000000, 0xff2fff2700000000, + 0x3143359a00000000, 0xb49aa34700000000, 0xec9cd03a00000000, + 0x694546e700000000, 0xa7298c5a00000000, 0x22f01a8700000000, + 0xcd836d1400000000, 0x485afbc900000000, 0x8636317400000000, + 0x03efa7a900000000, 0x5be9d4d400000000, 0xde30420900000000, + 0x105c88b400000000, 0x95851e6900000000, 0xa0506e4e00000000, + 0x2589f89300000000, 0xebe5322e00000000, 0x6e3ca4f300000000, + 0x363ad78e00000000, 0xb3e3415300000000, 0x7d8f8bee00000000, + 0xf8561d3300000000, 0xe26e141300000000, 0x67b782ce00000000, + 0xa9db487300000000, 0x2c02deae00000000, 0x7404add300000000, + 0xf1dd3b0e00000000, 0x3fb1f1b300000000, 0xba68676e00000000, + 0x8fbd174900000000, 0x0a64819400000000, 0xc4084b2900000000, + 0x41d1ddf400000000, 0x19d7ae8900000000, 0x9c0e385400000000, + 0x5262f2e900000000, 0xd7bb643400000000, 0x38c813a700000000, + 0xbd11857a00000000, 0x737d4fc700000000, 0xf6a4d91a00000000, + 0xaea2aa6700000000, 0x2b7b3cba00000000, 0xe517f60700000000, + 0x60ce60da00000000, 0x551b10fd00000000, 0xd0c2862000000000, + 0x1eae4c9d00000000, 0x9b77da4000000000, 0xc371a93d00000000, + 0x46a83fe000000000, 0x88c4f55d00000000, 0x0d1d638000000000, + 0xbcb4e71d00000000, 0x396d71c000000000, 0xf701bb7d00000000, + 0x72d82da000000000, 0x2ade5edd00000000, 0xaf07c80000000000, + 0x616b02bd00000000, 0xe4b2946000000000, 0xd167e44700000000, + 0x54be729a00000000, 0x9ad2b82700000000, 0x1f0b2efa00000000, + 0x470d5d8700000000, 0xc2d4cb5a00000000, 0x0cb801e700000000, + 0x8961973a00000000, 0x6612e0a900000000, 0xe3cb767400000000, + 0x2da7bcc900000000, 0xa87e2a1400000000, 0xf078596900000000, + 0x75a1cfb400000000, 0xbbcd050900000000, 0x3e1493d400000000, + 0x0bc1e3f300000000, 0x8e18752e00000000, 0x4074bf9300000000, + 0xc5ad294e00000000, 0x9dab5a3300000000, 0x1872ccee00000000, + 0xd61e065300000000, 0x53c7908e00000000, 0x49ff99ae00000000, + 0xcc260f7300000000, 0x024ac5ce00000000, 0x8793531300000000, + 0xdf95206e00000000, 0x5a4cb6b300000000, 0x94207c0e00000000, + 0x11f9ead300000000, 0x242c9af400000000, 0xa1f50c2900000000, + 0x6f99c69400000000, 0xea40504900000000, 0xb246233400000000, + 0x379fb5e900000000, 0xf9f37f5400000000, 0x7c2ae98900000000, + 0x93599e1a00000000, 0x168008c700000000, 0xd8ecc27a00000000, + 0x5d3554a700000000, 0x053327da00000000, 0x80eab10700000000, + 0x4e867bba00000000, 0xcb5fed6700000000, 0xfe8a9d4000000000, + 0x7b530b9d00000000, 0xb53fc12000000000, 0x30e657fd00000000, + 0x68e0248000000000, 0xed39b25d00000000, 0x235578e000000000, + 0xa68cee3d00000000}, + {0x0000000000000000, 0x76e10f9d00000000, 0xadc46ee100000000, + 0xdb25617c00000000, 0x1b8fac1900000000, 0x6d6ea38400000000, + 0xb64bc2f800000000, 0xc0aacd6500000000, 0x361e593300000000, + 0x40ff56ae00000000, 0x9bda37d200000000, 0xed3b384f00000000, + 0x2d91f52a00000000, 0x5b70fab700000000, 0x80559bcb00000000, + 0xf6b4945600000000, 0x6c3cb26600000000, 0x1addbdfb00000000, + 0xc1f8dc8700000000, 0xb719d31a00000000, 0x77b31e7f00000000, + 0x015211e200000000, 0xda77709e00000000, 0xac967f0300000000, + 0x5a22eb5500000000, 0x2cc3e4c800000000, 0xf7e685b400000000, + 0x81078a2900000000, 0x41ad474c00000000, 0x374c48d100000000, + 0xec6929ad00000000, 0x9a88263000000000, 0xd87864cd00000000, + 0xae996b5000000000, 0x75bc0a2c00000000, 0x035d05b100000000, + 0xc3f7c8d400000000, 0xb516c74900000000, 0x6e33a63500000000, + 0x18d2a9a800000000, 0xee663dfe00000000, 0x9887326300000000, + 0x43a2531f00000000, 0x35435c8200000000, 0xf5e991e700000000, + 0x83089e7a00000000, 0x582dff0600000000, 0x2eccf09b00000000, + 0xb444d6ab00000000, 0xc2a5d93600000000, 0x1980b84a00000000, + 0x6f61b7d700000000, 0xafcb7ab200000000, 0xd92a752f00000000, + 0x020f145300000000, 0x74ee1bce00000000, 0x825a8f9800000000, + 0xf4bb800500000000, 0x2f9ee17900000000, 0x597feee400000000, + 0x99d5238100000000, 0xef342c1c00000000, 0x34114d6000000000, + 0x42f042fd00000000, 0xf1f7b94100000000, 0x8716b6dc00000000, + 0x5c33d7a000000000, 0x2ad2d83d00000000, 0xea78155800000000, + 0x9c991ac500000000, 0x47bc7bb900000000, 0x315d742400000000, + 0xc7e9e07200000000, 0xb108efef00000000, 0x6a2d8e9300000000, + 0x1ccc810e00000000, 0xdc664c6b00000000, 0xaa8743f600000000, + 0x71a2228a00000000, 0x07432d1700000000, 0x9dcb0b2700000000, + 0xeb2a04ba00000000, 0x300f65c600000000, 0x46ee6a5b00000000, + 0x8644a73e00000000, 0xf0a5a8a300000000, 0x2b80c9df00000000, + 0x5d61c64200000000, 0xabd5521400000000, 0xdd345d8900000000, + 0x06113cf500000000, 0x70f0336800000000, 0xb05afe0d00000000, + 0xc6bbf19000000000, 0x1d9e90ec00000000, 0x6b7f9f7100000000, + 0x298fdd8c00000000, 0x5f6ed21100000000, 0x844bb36d00000000, + 0xf2aabcf000000000, 0x3200719500000000, 0x44e17e0800000000, + 0x9fc41f7400000000, 0xe92510e900000000, 0x1f9184bf00000000, + 0x69708b2200000000, 0xb255ea5e00000000, 0xc4b4e5c300000000, + 0x041e28a600000000, 0x72ff273b00000000, 0xa9da464700000000, + 0xdf3b49da00000000, 0x45b36fea00000000, 0x3352607700000000, + 0xe877010b00000000, 0x9e960e9600000000, 0x5e3cc3f300000000, + 0x28ddcc6e00000000, 0xf3f8ad1200000000, 0x8519a28f00000000, + 0x73ad36d900000000, 0x054c394400000000, 0xde69583800000000, + 0xa88857a500000000, 0x68229ac000000000, 0x1ec3955d00000000, + 0xc5e6f42100000000, 0xb307fbbc00000000, 0xe2ef738300000000, + 0x940e7c1e00000000, 0x4f2b1d6200000000, 0x39ca12ff00000000, + 0xf960df9a00000000, 0x8f81d00700000000, 0x54a4b17b00000000, + 0x2245bee600000000, 0xd4f12ab000000000, 0xa210252d00000000, + 0x7935445100000000, 0x0fd44bcc00000000, 0xcf7e86a900000000, + 0xb99f893400000000, 0x62bae84800000000, 0x145be7d500000000, + 0x8ed3c1e500000000, 0xf832ce7800000000, 0x2317af0400000000, + 0x55f6a09900000000, 0x955c6dfc00000000, 0xe3bd626100000000, + 0x3898031d00000000, 0x4e790c8000000000, 0xb8cd98d600000000, + 0xce2c974b00000000, 0x1509f63700000000, 0x63e8f9aa00000000, + 0xa34234cf00000000, 0xd5a33b5200000000, 0x0e865a2e00000000, + 0x786755b300000000, 0x3a97174e00000000, 0x4c7618d300000000, + 0x975379af00000000, 0xe1b2763200000000, 0x2118bb5700000000, + 0x57f9b4ca00000000, 0x8cdcd5b600000000, 0xfa3dda2b00000000, + 0x0c894e7d00000000, 0x7a6841e000000000, 0xa14d209c00000000, + 0xd7ac2f0100000000, 0x1706e26400000000, 0x61e7edf900000000, + 0xbac28c8500000000, 0xcc23831800000000, 0x56aba52800000000, + 0x204aaab500000000, 0xfb6fcbc900000000, 0x8d8ec45400000000, + 0x4d24093100000000, 0x3bc506ac00000000, 0xe0e067d000000000, + 0x9601684d00000000, 0x60b5fc1b00000000, 0x1654f38600000000, + 0xcd7192fa00000000, 0xbb909d6700000000, 0x7b3a500200000000, + 0x0ddb5f9f00000000, 0xd6fe3ee300000000, 0xa01f317e00000000, + 0x1318cac200000000, 0x65f9c55f00000000, 0xbedca42300000000, + 0xc83dabbe00000000, 0x089766db00000000, 0x7e76694600000000, + 0xa553083a00000000, 0xd3b207a700000000, 0x250693f100000000, + 0x53e79c6c00000000, 0x88c2fd1000000000, 0xfe23f28d00000000, + 0x3e893fe800000000, 0x4868307500000000, 0x934d510900000000, + 0xe5ac5e9400000000, 0x7f2478a400000000, 0x09c5773900000000, + 0xd2e0164500000000, 0xa40119d800000000, 0x64abd4bd00000000, + 0x124adb2000000000, 0xc96fba5c00000000, 0xbf8eb5c100000000, + 0x493a219700000000, 0x3fdb2e0a00000000, 0xe4fe4f7600000000, + 0x921f40eb00000000, 0x52b58d8e00000000, 0x2454821300000000, + 0xff71e36f00000000, 0x8990ecf200000000, 0xcb60ae0f00000000, + 0xbd81a19200000000, 0x66a4c0ee00000000, 0x1045cf7300000000, + 0xd0ef021600000000, 0xa60e0d8b00000000, 0x7d2b6cf700000000, + 0x0bca636a00000000, 0xfd7ef73c00000000, 0x8b9ff8a100000000, + 0x50ba99dd00000000, 0x265b964000000000, 0xe6f15b2500000000, + 0x901054b800000000, 0x4b3535c400000000, 0x3dd43a5900000000, + 0xa75c1c6900000000, 0xd1bd13f400000000, 0x0a98728800000000, + 0x7c797d1500000000, 0xbcd3b07000000000, 0xca32bfed00000000, + 0x1117de9100000000, 0x67f6d10c00000000, 0x9142455a00000000, + 0xe7a34ac700000000, 0x3c862bbb00000000, 0x4a67242600000000, + 0x8acde94300000000, 0xfc2ce6de00000000, 0x270987a200000000, + 0x51e8883f00000000}, + {0x0000000000000000, 0xe8dbfbb900000000, 0x91b186a800000000, + 0x796a7d1100000000, 0x63657c8a00000000, 0x8bbe873300000000, + 0xf2d4fa2200000000, 0x1a0f019b00000000, 0x87cc89cf00000000, + 0x6f17727600000000, 0x167d0f6700000000, 0xfea6f4de00000000, + 0xe4a9f54500000000, 0x0c720efc00000000, 0x751873ed00000000, + 0x9dc3885400000000, 0x4f9f624400000000, 0xa74499fd00000000, + 0xde2ee4ec00000000, 0x36f51f5500000000, 0x2cfa1ece00000000, + 0xc421e57700000000, 0xbd4b986600000000, 0x559063df00000000, + 0xc853eb8b00000000, 0x2088103200000000, 0x59e26d2300000000, + 0xb139969a00000000, 0xab36970100000000, 0x43ed6cb800000000, + 0x3a8711a900000000, 0xd25cea1000000000, 0x9e3ec58800000000, + 0x76e53e3100000000, 0x0f8f432000000000, 0xe754b89900000000, + 0xfd5bb90200000000, 0x158042bb00000000, 0x6cea3faa00000000, + 0x8431c41300000000, 0x19f24c4700000000, 0xf129b7fe00000000, + 0x8843caef00000000, 0x6098315600000000, 0x7a9730cd00000000, + 0x924ccb7400000000, 0xeb26b66500000000, 0x03fd4ddc00000000, + 0xd1a1a7cc00000000, 0x397a5c7500000000, 0x4010216400000000, + 0xa8cbdadd00000000, 0xb2c4db4600000000, 0x5a1f20ff00000000, + 0x23755dee00000000, 0xcbaea65700000000, 0x566d2e0300000000, + 0xbeb6d5ba00000000, 0xc7dca8ab00000000, 0x2f07531200000000, + 0x3508528900000000, 0xddd3a93000000000, 0xa4b9d42100000000, + 0x4c622f9800000000, 0x7d7bfbca00000000, 0x95a0007300000000, + 0xecca7d6200000000, 0x041186db00000000, 0x1e1e874000000000, + 0xf6c57cf900000000, 0x8faf01e800000000, 0x6774fa5100000000, + 0xfab7720500000000, 0x126c89bc00000000, 0x6b06f4ad00000000, + 0x83dd0f1400000000, 0x99d20e8f00000000, 0x7109f53600000000, + 0x0863882700000000, 0xe0b8739e00000000, 0x32e4998e00000000, + 0xda3f623700000000, 0xa3551f2600000000, 0x4b8ee49f00000000, + 0x5181e50400000000, 0xb95a1ebd00000000, 0xc03063ac00000000, + 0x28eb981500000000, 0xb528104100000000, 0x5df3ebf800000000, + 0x249996e900000000, 0xcc426d5000000000, 0xd64d6ccb00000000, + 0x3e96977200000000, 0x47fcea6300000000, 0xaf2711da00000000, + 0xe3453e4200000000, 0x0b9ec5fb00000000, 0x72f4b8ea00000000, + 0x9a2f435300000000, 0x802042c800000000, 0x68fbb97100000000, + 0x1191c46000000000, 0xf94a3fd900000000, 0x6489b78d00000000, + 0x8c524c3400000000, 0xf538312500000000, 0x1de3ca9c00000000, + 0x07eccb0700000000, 0xef3730be00000000, 0x965d4daf00000000, + 0x7e86b61600000000, 0xacda5c0600000000, 0x4401a7bf00000000, + 0x3d6bdaae00000000, 0xd5b0211700000000, 0xcfbf208c00000000, + 0x2764db3500000000, 0x5e0ea62400000000, 0xb6d55d9d00000000, + 0x2b16d5c900000000, 0xc3cd2e7000000000, 0xbaa7536100000000, + 0x527ca8d800000000, 0x4873a94300000000, 0xa0a852fa00000000, + 0xd9c22feb00000000, 0x3119d45200000000, 0xbbf0874e00000000, + 0x532b7cf700000000, 0x2a4101e600000000, 0xc29afa5f00000000, + 0xd895fbc400000000, 0x304e007d00000000, 0x49247d6c00000000, + 0xa1ff86d500000000, 0x3c3c0e8100000000, 0xd4e7f53800000000, + 0xad8d882900000000, 0x4556739000000000, 0x5f59720b00000000, + 0xb78289b200000000, 0xcee8f4a300000000, 0x26330f1a00000000, + 0xf46fe50a00000000, 0x1cb41eb300000000, 0x65de63a200000000, + 0x8d05981b00000000, 0x970a998000000000, 0x7fd1623900000000, + 0x06bb1f2800000000, 0xee60e49100000000, 0x73a36cc500000000, + 0x9b78977c00000000, 0xe212ea6d00000000, 0x0ac911d400000000, + 0x10c6104f00000000, 0xf81debf600000000, 0x817796e700000000, + 0x69ac6d5e00000000, 0x25ce42c600000000, 0xcd15b97f00000000, + 0xb47fc46e00000000, 0x5ca43fd700000000, 0x46ab3e4c00000000, + 0xae70c5f500000000, 0xd71ab8e400000000, 0x3fc1435d00000000, + 0xa202cb0900000000, 0x4ad930b000000000, 0x33b34da100000000, + 0xdb68b61800000000, 0xc167b78300000000, 0x29bc4c3a00000000, + 0x50d6312b00000000, 0xb80dca9200000000, 0x6a51208200000000, + 0x828adb3b00000000, 0xfbe0a62a00000000, 0x133b5d9300000000, + 0x09345c0800000000, 0xe1efa7b100000000, 0x9885daa000000000, + 0x705e211900000000, 0xed9da94d00000000, 0x054652f400000000, + 0x7c2c2fe500000000, 0x94f7d45c00000000, 0x8ef8d5c700000000, + 0x66232e7e00000000, 0x1f49536f00000000, 0xf792a8d600000000, + 0xc68b7c8400000000, 0x2e50873d00000000, 0x573afa2c00000000, + 0xbfe1019500000000, 0xa5ee000e00000000, 0x4d35fbb700000000, + 0x345f86a600000000, 0xdc847d1f00000000, 0x4147f54b00000000, + 0xa99c0ef200000000, 0xd0f673e300000000, 0x382d885a00000000, + 0x222289c100000000, 0xcaf9727800000000, 0xb3930f6900000000, + 0x5b48f4d000000000, 0x89141ec000000000, 0x61cfe57900000000, + 0x18a5986800000000, 0xf07e63d100000000, 0xea71624a00000000, + 0x02aa99f300000000, 0x7bc0e4e200000000, 0x931b1f5b00000000, + 0x0ed8970f00000000, 0xe6036cb600000000, 0x9f6911a700000000, + 0x77b2ea1e00000000, 0x6dbdeb8500000000, 0x8566103c00000000, + 0xfc0c6d2d00000000, 0x14d7969400000000, 0x58b5b90c00000000, + 0xb06e42b500000000, 0xc9043fa400000000, 0x21dfc41d00000000, + 0x3bd0c58600000000, 0xd30b3e3f00000000, 0xaa61432e00000000, + 0x42bab89700000000, 0xdf7930c300000000, 0x37a2cb7a00000000, + 0x4ec8b66b00000000, 0xa6134dd200000000, 0xbc1c4c4900000000, + 0x54c7b7f000000000, 0x2dadcae100000000, 0xc576315800000000, + 0x172adb4800000000, 0xfff120f100000000, 0x869b5de000000000, + 0x6e40a65900000000, 0x744fa7c200000000, 0x9c945c7b00000000, + 0xe5fe216a00000000, 0x0d25dad300000000, 0x90e6528700000000, + 0x783da93e00000000, 0x0157d42f00000000, 0xe98c2f9600000000, + 0xf3832e0d00000000, 0x1b58d5b400000000, 0x6232a8a500000000, + 0x8ae9531c00000000}, + {0x0000000000000000, 0x919168ae00000000, 0x6325a08700000000, + 0xf2b4c82900000000, 0x874c31d400000000, 0x16dd597a00000000, + 0xe469915300000000, 0x75f8f9fd00000000, 0x4f9f137300000000, + 0xde0e7bdd00000000, 0x2cbab3f400000000, 0xbd2bdb5a00000000, + 0xc8d322a700000000, 0x59424a0900000000, 0xabf6822000000000, + 0x3a67ea8e00000000, 0x9e3e27e600000000, 0x0faf4f4800000000, + 0xfd1b876100000000, 0x6c8aefcf00000000, 0x1972163200000000, + 0x88e37e9c00000000, 0x7a57b6b500000000, 0xebc6de1b00000000, + 0xd1a1349500000000, 0x40305c3b00000000, 0xb284941200000000, + 0x2315fcbc00000000, 0x56ed054100000000, 0xc77c6def00000000, + 0x35c8a5c600000000, 0xa459cd6800000000, 0x7d7b3f1700000000, + 0xecea57b900000000, 0x1e5e9f9000000000, 0x8fcff73e00000000, + 0xfa370ec300000000, 0x6ba6666d00000000, 0x9912ae4400000000, + 0x0883c6ea00000000, 0x32e42c6400000000, 0xa37544ca00000000, + 0x51c18ce300000000, 0xc050e44d00000000, 0xb5a81db000000000, + 0x2439751e00000000, 0xd68dbd3700000000, 0x471cd59900000000, + 0xe34518f100000000, 0x72d4705f00000000, 0x8060b87600000000, + 0x11f1d0d800000000, 0x6409292500000000, 0xf598418b00000000, + 0x072c89a200000000, 0x96bde10c00000000, 0xacda0b8200000000, + 0x3d4b632c00000000, 0xcfffab0500000000, 0x5e6ec3ab00000000, + 0x2b963a5600000000, 0xba0752f800000000, 0x48b39ad100000000, + 0xd922f27f00000000, 0xfaf67e2e00000000, 0x6b67168000000000, + 0x99d3dea900000000, 0x0842b60700000000, 0x7dba4ffa00000000, + 0xec2b275400000000, 0x1e9fef7d00000000, 0x8f0e87d300000000, + 0xb5696d5d00000000, 0x24f805f300000000, 0xd64ccdda00000000, + 0x47dda57400000000, 0x32255c8900000000, 0xa3b4342700000000, + 0x5100fc0e00000000, 0xc09194a000000000, 0x64c859c800000000, + 0xf559316600000000, 0x07edf94f00000000, 0x967c91e100000000, + 0xe384681c00000000, 0x721500b200000000, 0x80a1c89b00000000, + 0x1130a03500000000, 0x2b574abb00000000, 0xbac6221500000000, + 0x4872ea3c00000000, 0xd9e3829200000000, 0xac1b7b6f00000000, + 0x3d8a13c100000000, 0xcf3edbe800000000, 0x5eafb34600000000, + 0x878d413900000000, 0x161c299700000000, 0xe4a8e1be00000000, + 0x7539891000000000, 0x00c170ed00000000, 0x9150184300000000, + 0x63e4d06a00000000, 0xf275b8c400000000, 0xc812524a00000000, + 0x59833ae400000000, 0xab37f2cd00000000, 0x3aa69a6300000000, + 0x4f5e639e00000000, 0xdecf0b3000000000, 0x2c7bc31900000000, + 0xbdeaabb700000000, 0x19b366df00000000, 0x88220e7100000000, + 0x7a96c65800000000, 0xeb07aef600000000, 0x9eff570b00000000, + 0x0f6e3fa500000000, 0xfddaf78c00000000, 0x6c4b9f2200000000, + 0x562c75ac00000000, 0xc7bd1d0200000000, 0x3509d52b00000000, + 0xa498bd8500000000, 0xd160447800000000, 0x40f12cd600000000, + 0xb245e4ff00000000, 0x23d48c5100000000, 0xf4edfd5c00000000, + 0x657c95f200000000, 0x97c85ddb00000000, 0x0659357500000000, + 0x73a1cc8800000000, 0xe230a42600000000, 0x10846c0f00000000, + 0x811504a100000000, 0xbb72ee2f00000000, 0x2ae3868100000000, + 0xd8574ea800000000, 0x49c6260600000000, 0x3c3edffb00000000, + 0xadafb75500000000, 0x5f1b7f7c00000000, 0xce8a17d200000000, + 0x6ad3daba00000000, 0xfb42b21400000000, 0x09f67a3d00000000, + 0x9867129300000000, 0xed9feb6e00000000, 0x7c0e83c000000000, + 0x8eba4be900000000, 0x1f2b234700000000, 0x254cc9c900000000, + 0xb4dda16700000000, 0x4669694e00000000, 0xd7f801e000000000, + 0xa200f81d00000000, 0x339190b300000000, 0xc125589a00000000, + 0x50b4303400000000, 0x8996c24b00000000, 0x1807aae500000000, + 0xeab362cc00000000, 0x7b220a6200000000, 0x0edaf39f00000000, + 0x9f4b9b3100000000, 0x6dff531800000000, 0xfc6e3bb600000000, + 0xc609d13800000000, 0x5798b99600000000, 0xa52c71bf00000000, + 0x34bd191100000000, 0x4145e0ec00000000, 0xd0d4884200000000, + 0x2260406b00000000, 0xb3f128c500000000, 0x17a8e5ad00000000, + 0x86398d0300000000, 0x748d452a00000000, 0xe51c2d8400000000, + 0x90e4d47900000000, 0x0175bcd700000000, 0xf3c174fe00000000, + 0x62501c5000000000, 0x5837f6de00000000, 0xc9a69e7000000000, + 0x3b12565900000000, 0xaa833ef700000000, 0xdf7bc70a00000000, + 0x4eeaafa400000000, 0xbc5e678d00000000, 0x2dcf0f2300000000, + 0x0e1b837200000000, 0x9f8aebdc00000000, 0x6d3e23f500000000, + 0xfcaf4b5b00000000, 0x8957b2a600000000, 0x18c6da0800000000, + 0xea72122100000000, 0x7be37a8f00000000, 0x4184900100000000, + 0xd015f8af00000000, 0x22a1308600000000, 0xb330582800000000, + 0xc6c8a1d500000000, 0x5759c97b00000000, 0xa5ed015200000000, + 0x347c69fc00000000, 0x9025a49400000000, 0x01b4cc3a00000000, + 0xf300041300000000, 0x62916cbd00000000, 0x1769954000000000, + 0x86f8fdee00000000, 0x744c35c700000000, 0xe5dd5d6900000000, + 0xdfbab7e700000000, 0x4e2bdf4900000000, 0xbc9f176000000000, + 0x2d0e7fce00000000, 0x58f6863300000000, 0xc967ee9d00000000, + 0x3bd326b400000000, 0xaa424e1a00000000, 0x7360bc6500000000, + 0xe2f1d4cb00000000, 0x10451ce200000000, 0x81d4744c00000000, + 0xf42c8db100000000, 0x65bde51f00000000, 0x97092d3600000000, + 0x0698459800000000, 0x3cffaf1600000000, 0xad6ec7b800000000, + 0x5fda0f9100000000, 0xce4b673f00000000, 0xbbb39ec200000000, + 0x2a22f66c00000000, 0xd8963e4500000000, 0x490756eb00000000, + 0xed5e9b8300000000, 0x7ccff32d00000000, 0x8e7b3b0400000000, + 0x1fea53aa00000000, 0x6a12aa5700000000, 0xfb83c2f900000000, + 0x09370ad000000000, 0x98a6627e00000000, 0xa2c188f000000000, + 0x3350e05e00000000, 0xc1e4287700000000, 0x507540d900000000, + 0x258db92400000000, 0xb41cd18a00000000, 0x46a819a300000000, + 0xd739710d00000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0xb029603d, 0x6053c07a, 0xd07aa047, 0xc0a680f5, + 0x708fe0c8, 0xa0f5408f, 0x10dc20b2, 0xc14b7030, 0x7162100d, + 0xa118b04a, 0x1131d077, 0x01edf0c5, 0xb1c490f8, 0x61be30bf, + 0xd1975082, 0x8297e060, 0x32be805d, 0xe2c4201a, 0x52ed4027, + 0x42316095, 0xf21800a8, 0x2262a0ef, 0x924bc0d2, 0x43dc9050, + 0xf3f5f06d, 0x238f502a, 0x93a63017, 0x837a10a5, 0x33537098, + 0xe329d0df, 0x5300b0e2, 0x042fc1c1, 0xb406a1fc, 0x647c01bb, + 0xd4556186, 0xc4894134, 0x74a02109, 0xa4da814e, 0x14f3e173, + 0xc564b1f1, 0x754dd1cc, 0xa537718b, 0x151e11b6, 0x05c23104, + 0xb5eb5139, 0x6591f17e, 0xd5b89143, 0x86b821a1, 0x3691419c, + 0xe6ebe1db, 0x56c281e6, 0x461ea154, 0xf637c169, 0x264d612e, + 0x96640113, 0x47f35191, 0xf7da31ac, 0x27a091eb, 0x9789f1d6, + 0x8755d164, 0x377cb159, 0xe706111e, 0x572f7123, 0x4958f358, + 0xf9719365, 0x290b3322, 0x9922531f, 0x89fe73ad, 0x39d71390, + 0xe9adb3d7, 0x5984d3ea, 0x88138368, 0x383ae355, 0xe8404312, + 0x5869232f, 0x48b5039d, 0xf89c63a0, 0x28e6c3e7, 0x98cfa3da, + 0xcbcf1338, 0x7be67305, 0xab9cd342, 0x1bb5b37f, 0x0b6993cd, + 0xbb40f3f0, 0x6b3a53b7, 0xdb13338a, 0x0a846308, 0xbaad0335, + 0x6ad7a372, 0xdafec34f, 0xca22e3fd, 0x7a0b83c0, 0xaa712387, + 0x1a5843ba, 0x4d773299, 0xfd5e52a4, 0x2d24f2e3, 0x9d0d92de, + 0x8dd1b26c, 0x3df8d251, 0xed827216, 0x5dab122b, 0x8c3c42a9, + 0x3c152294, 0xec6f82d3, 0x5c46e2ee, 0x4c9ac25c, 0xfcb3a261, + 0x2cc90226, 0x9ce0621b, 0xcfe0d2f9, 0x7fc9b2c4, 0xafb31283, + 0x1f9a72be, 0x0f46520c, 0xbf6f3231, 0x6f159276, 0xdf3cf24b, + 0x0eaba2c9, 0xbe82c2f4, 0x6ef862b3, 0xded1028e, 0xce0d223c, + 0x7e244201, 0xae5ee246, 0x1e77827b, 0x92b0e6b1, 0x2299868c, + 0xf2e326cb, 0x42ca46f6, 0x52166644, 0xe23f0679, 0x3245a63e, + 0x826cc603, 0x53fb9681, 0xe3d2f6bc, 0x33a856fb, 0x838136c6, + 0x935d1674, 0x23747649, 0xf30ed60e, 0x4327b633, 0x102706d1, + 0xa00e66ec, 0x7074c6ab, 0xc05da696, 0xd0818624, 0x60a8e619, + 0xb0d2465e, 0x00fb2663, 0xd16c76e1, 0x614516dc, 0xb13fb69b, + 0x0116d6a6, 0x11caf614, 0xa1e39629, 0x7199366e, 0xc1b05653, + 0x969f2770, 0x26b6474d, 0xf6cce70a, 0x46e58737, 0x5639a785, + 0xe610c7b8, 0x366a67ff, 0x864307c2, 0x57d45740, 0xe7fd377d, + 0x3787973a, 0x87aef707, 0x9772d7b5, 0x275bb788, 0xf72117cf, + 0x470877f2, 0x1408c710, 0xa421a72d, 0x745b076a, 0xc4726757, + 0xd4ae47e5, 0x648727d8, 0xb4fd879f, 0x04d4e7a2, 0xd543b720, + 0x656ad71d, 0xb510775a, 0x05391767, 0x15e537d5, 0xa5cc57e8, + 0x75b6f7af, 0xc59f9792, 0xdbe815e9, 0x6bc175d4, 0xbbbbd593, + 0x0b92b5ae, 0x1b4e951c, 0xab67f521, 0x7b1d5566, 0xcb34355b, + 0x1aa365d9, 0xaa8a05e4, 0x7af0a5a3, 0xcad9c59e, 0xda05e52c, + 0x6a2c8511, 0xba562556, 0x0a7f456b, 0x597ff589, 0xe95695b4, + 0x392c35f3, 0x890555ce, 0x99d9757c, 0x29f01541, 0xf98ab506, + 0x49a3d53b, 0x983485b9, 0x281de584, 0xf86745c3, 0x484e25fe, + 0x5892054c, 0xe8bb6571, 0x38c1c536, 0x88e8a50b, 0xdfc7d428, + 0x6feeb415, 0xbf941452, 0x0fbd746f, 0x1f6154dd, 0xaf4834e0, + 0x7f3294a7, 0xcf1bf49a, 0x1e8ca418, 0xaea5c425, 0x7edf6462, + 0xcef6045f, 0xde2a24ed, 0x6e0344d0, 0xbe79e497, 0x0e5084aa, + 0x5d503448, 0xed795475, 0x3d03f432, 0x8d2a940f, 0x9df6b4bd, + 0x2ddfd480, 0xfda574c7, 0x4d8c14fa, 0x9c1b4478, 0x2c322445, + 0xfc488402, 0x4c61e43f, 0x5cbdc48d, 0xec94a4b0, 0x3cee04f7, + 0x8cc764ca}, + {0x00000000, 0xa5d35ccb, 0x0ba1c84d, 0xae729486, 0x1642919b, + 0xb391cd50, 0x1de359d6, 0xb830051d, 0x6d8253ec, 0xc8510f27, + 0x66239ba1, 0xc3f0c76a, 0x7bc0c277, 0xde139ebc, 0x70610a3a, + 0xd5b256f1, 0x9b02d603, 0x3ed18ac8, 0x90a31e4e, 0x35704285, + 0x8d404798, 0x28931b53, 0x86e18fd5, 0x2332d31e, 0xf68085ef, + 0x5353d924, 0xfd214da2, 0x58f21169, 0xe0c21474, 0x451148bf, + 0xeb63dc39, 0x4eb080f2, 0x3605ac07, 0x93d6f0cc, 0x3da4644a, + 0x98773881, 0x20473d9c, 0x85946157, 0x2be6f5d1, 0x8e35a91a, + 0x5b87ffeb, 0xfe54a320, 0x502637a6, 0xf5f56b6d, 0x4dc56e70, + 0xe81632bb, 0x4664a63d, 0xe3b7faf6, 0xad077a04, 0x08d426cf, + 0xa6a6b249, 0x0375ee82, 0xbb45eb9f, 0x1e96b754, 0xb0e423d2, + 0x15377f19, 0xc08529e8, 0x65567523, 0xcb24e1a5, 0x6ef7bd6e, + 0xd6c7b873, 0x7314e4b8, 0xdd66703e, 0x78b52cf5, 0x6c0a580f, + 0xc9d904c4, 0x67ab9042, 0xc278cc89, 0x7a48c994, 0xdf9b955f, + 0x71e901d9, 0xd43a5d12, 0x01880be3, 0xa45b5728, 0x0a29c3ae, + 0xaffa9f65, 0x17ca9a78, 0xb219c6b3, 0x1c6b5235, 0xb9b80efe, + 0xf7088e0c, 0x52dbd2c7, 0xfca94641, 0x597a1a8a, 0xe14a1f97, + 0x4499435c, 0xeaebd7da, 0x4f388b11, 0x9a8adde0, 0x3f59812b, + 0x912b15ad, 0x34f84966, 0x8cc84c7b, 0x291b10b0, 0x87698436, + 0x22bad8fd, 0x5a0ff408, 0xffdca8c3, 0x51ae3c45, 0xf47d608e, + 0x4c4d6593, 0xe99e3958, 0x47ecadde, 0xe23ff115, 0x378da7e4, + 0x925efb2f, 0x3c2c6fa9, 0x99ff3362, 0x21cf367f, 0x841c6ab4, + 0x2a6efe32, 0x8fbda2f9, 0xc10d220b, 0x64de7ec0, 0xcaacea46, + 0x6f7fb68d, 0xd74fb390, 0x729cef5b, 0xdcee7bdd, 0x793d2716, + 0xac8f71e7, 0x095c2d2c, 0xa72eb9aa, 0x02fde561, 0xbacde07c, + 0x1f1ebcb7, 0xb16c2831, 0x14bf74fa, 0xd814b01e, 0x7dc7ecd5, + 0xd3b57853, 0x76662498, 0xce562185, 0x6b857d4e, 0xc5f7e9c8, + 0x6024b503, 0xb596e3f2, 0x1045bf39, 0xbe372bbf, 0x1be47774, + 0xa3d47269, 0x06072ea2, 0xa875ba24, 0x0da6e6ef, 0x4316661d, + 0xe6c53ad6, 0x48b7ae50, 0xed64f29b, 0x5554f786, 0xf087ab4d, + 0x5ef53fcb, 0xfb266300, 0x2e9435f1, 0x8b47693a, 0x2535fdbc, + 0x80e6a177, 0x38d6a46a, 0x9d05f8a1, 0x33776c27, 0x96a430ec, + 0xee111c19, 0x4bc240d2, 0xe5b0d454, 0x4063889f, 0xf8538d82, + 0x5d80d149, 0xf3f245cf, 0x56211904, 0x83934ff5, 0x2640133e, + 0x883287b8, 0x2de1db73, 0x95d1de6e, 0x300282a5, 0x9e701623, + 0x3ba34ae8, 0x7513ca1a, 0xd0c096d1, 0x7eb20257, 0xdb615e9c, + 0x63515b81, 0xc682074a, 0x68f093cc, 0xcd23cf07, 0x189199f6, + 0xbd42c53d, 0x133051bb, 0xb6e30d70, 0x0ed3086d, 0xab0054a6, + 0x0572c020, 0xa0a19ceb, 0xb41ee811, 0x11cdb4da, 0xbfbf205c, + 0x1a6c7c97, 0xa25c798a, 0x078f2541, 0xa9fdb1c7, 0x0c2eed0c, + 0xd99cbbfd, 0x7c4fe736, 0xd23d73b0, 0x77ee2f7b, 0xcfde2a66, + 0x6a0d76ad, 0xc47fe22b, 0x61acbee0, 0x2f1c3e12, 0x8acf62d9, + 0x24bdf65f, 0x816eaa94, 0x395eaf89, 0x9c8df342, 0x32ff67c4, + 0x972c3b0f, 0x429e6dfe, 0xe74d3135, 0x493fa5b3, 0xececf978, + 0x54dcfc65, 0xf10fa0ae, 0x5f7d3428, 0xfaae68e3, 0x821b4416, + 0x27c818dd, 0x89ba8c5b, 0x2c69d090, 0x9459d58d, 0x318a8946, + 0x9ff81dc0, 0x3a2b410b, 0xef9917fa, 0x4a4a4b31, 0xe438dfb7, + 0x41eb837c, 0xf9db8661, 0x5c08daaa, 0xf27a4e2c, 0x57a912e7, + 0x19199215, 0xbccacede, 0x12b85a58, 0xb76b0693, 0x0f5b038e, + 0xaa885f45, 0x04facbc3, 0xa1299708, 0x749bc1f9, 0xd1489d32, + 0x7f3a09b4, 0xdae9557f, 0x62d95062, 0xc70a0ca9, 0x6978982f, + 0xccabc4e4}, + {0x00000000, 0xb40b77a6, 0x29119f97, 0x9d1ae831, 0x13244ff4, + 0xa72f3852, 0x3a35d063, 0x8e3ea7c5, 0x674eef33, 0xd3459895, + 0x4e5f70a4, 0xfa540702, 0x746aa0c7, 0xc061d761, 0x5d7b3f50, + 0xe97048f6, 0xce9cde67, 0x7a97a9c1, 0xe78d41f0, 0x53863656, + 0xddb89193, 0x69b3e635, 0xf4a90e04, 0x40a279a2, 0xa9d23154, + 0x1dd946f2, 0x80c3aec3, 0x34c8d965, 0xbaf67ea0, 0x0efd0906, + 0x93e7e137, 0x27ec9691, 0x9c39bdcf, 0x2832ca69, 0xb5282258, + 0x012355fe, 0x8f1df23b, 0x3b16859d, 0xa60c6dac, 0x12071a0a, + 0xfb7752fc, 0x4f7c255a, 0xd266cd6b, 0x666dbacd, 0xe8531d08, + 0x5c586aae, 0xc142829f, 0x7549f539, 0x52a563a8, 0xe6ae140e, + 0x7bb4fc3f, 0xcfbf8b99, 0x41812c5c, 0xf58a5bfa, 0x6890b3cb, + 0xdc9bc46d, 0x35eb8c9b, 0x81e0fb3d, 0x1cfa130c, 0xa8f164aa, + 0x26cfc36f, 0x92c4b4c9, 0x0fde5cf8, 0xbbd52b5e, 0x79750b44, + 0xcd7e7ce2, 0x506494d3, 0xe46fe375, 0x6a5144b0, 0xde5a3316, + 0x4340db27, 0xf74bac81, 0x1e3be477, 0xaa3093d1, 0x372a7be0, + 0x83210c46, 0x0d1fab83, 0xb914dc25, 0x240e3414, 0x900543b2, + 0xb7e9d523, 0x03e2a285, 0x9ef84ab4, 0x2af33d12, 0xa4cd9ad7, + 0x10c6ed71, 0x8ddc0540, 0x39d772e6, 0xd0a73a10, 0x64ac4db6, + 0xf9b6a587, 0x4dbdd221, 0xc38375e4, 0x77880242, 0xea92ea73, + 0x5e999dd5, 0xe54cb68b, 0x5147c12d, 0xcc5d291c, 0x78565eba, + 0xf668f97f, 0x42638ed9, 0xdf7966e8, 0x6b72114e, 0x820259b8, + 0x36092e1e, 0xab13c62f, 0x1f18b189, 0x9126164c, 0x252d61ea, + 0xb83789db, 0x0c3cfe7d, 0x2bd068ec, 0x9fdb1f4a, 0x02c1f77b, + 0xb6ca80dd, 0x38f42718, 0x8cff50be, 0x11e5b88f, 0xa5eecf29, + 0x4c9e87df, 0xf895f079, 0x658f1848, 0xd1846fee, 0x5fbac82b, + 0xebb1bf8d, 0x76ab57bc, 0xc2a0201a, 0xf2ea1688, 0x46e1612e, + 0xdbfb891f, 0x6ff0feb9, 0xe1ce597c, 0x55c52eda, 0xc8dfc6eb, + 0x7cd4b14d, 0x95a4f9bb, 0x21af8e1d, 0xbcb5662c, 0x08be118a, + 0x8680b64f, 0x328bc1e9, 0xaf9129d8, 0x1b9a5e7e, 0x3c76c8ef, + 0x887dbf49, 0x15675778, 0xa16c20de, 0x2f52871b, 0x9b59f0bd, + 0x0643188c, 0xb2486f2a, 0x5b3827dc, 0xef33507a, 0x7229b84b, + 0xc622cfed, 0x481c6828, 0xfc171f8e, 0x610df7bf, 0xd5068019, + 0x6ed3ab47, 0xdad8dce1, 0x47c234d0, 0xf3c94376, 0x7df7e4b3, + 0xc9fc9315, 0x54e67b24, 0xe0ed0c82, 0x099d4474, 0xbd9633d2, + 0x208cdbe3, 0x9487ac45, 0x1ab90b80, 0xaeb27c26, 0x33a89417, + 0x87a3e3b1, 0xa04f7520, 0x14440286, 0x895eeab7, 0x3d559d11, + 0xb36b3ad4, 0x07604d72, 0x9a7aa543, 0x2e71d2e5, 0xc7019a13, + 0x730aedb5, 0xee100584, 0x5a1b7222, 0xd425d5e7, 0x602ea241, + 0xfd344a70, 0x493f3dd6, 0x8b9f1dcc, 0x3f946a6a, 0xa28e825b, + 0x1685f5fd, 0x98bb5238, 0x2cb0259e, 0xb1aacdaf, 0x05a1ba09, + 0xecd1f2ff, 0x58da8559, 0xc5c06d68, 0x71cb1ace, 0xfff5bd0b, + 0x4bfecaad, 0xd6e4229c, 0x62ef553a, 0x4503c3ab, 0xf108b40d, + 0x6c125c3c, 0xd8192b9a, 0x56278c5f, 0xe22cfbf9, 0x7f3613c8, + 0xcb3d646e, 0x224d2c98, 0x96465b3e, 0x0b5cb30f, 0xbf57c4a9, + 0x3169636c, 0x856214ca, 0x1878fcfb, 0xac738b5d, 0x17a6a003, + 0xa3add7a5, 0x3eb73f94, 0x8abc4832, 0x0482eff7, 0xb0899851, + 0x2d937060, 0x999807c6, 0x70e84f30, 0xc4e33896, 0x59f9d0a7, + 0xedf2a701, 0x63cc00c4, 0xd7c77762, 0x4add9f53, 0xfed6e8f5, + 0xd93a7e64, 0x6d3109c2, 0xf02be1f3, 0x44209655, 0xca1e3190, + 0x7e154636, 0xe30fae07, 0x5704d9a1, 0xbe749157, 0x0a7fe6f1, + 0x97650ec0, 0x236e7966, 0xad50dea3, 0x195ba905, 0x84414134, + 0x304a3692}, + {0x00000000, 0x9e00aacc, 0x7d072542, 0xe3078f8e, 0xfa0e4a84, + 0x640ee048, 0x87096fc6, 0x1909c50a, 0xb51be5d3, 0x2b1b4f1f, + 0xc81cc091, 0x561c6a5d, 0x4f15af57, 0xd115059b, 0x32128a15, + 0xac1220d9, 0x2b31bb7c, 0xb53111b0, 0x56369e3e, 0xc83634f2, + 0xd13ff1f8, 0x4f3f5b34, 0xac38d4ba, 0x32387e76, 0x9e2a5eaf, + 0x002af463, 0xe32d7bed, 0x7d2dd121, 0x6424142b, 0xfa24bee7, + 0x19233169, 0x87239ba5, 0x566276f9, 0xc862dc35, 0x2b6553bb, + 0xb565f977, 0xac6c3c7d, 0x326c96b1, 0xd16b193f, 0x4f6bb3f3, + 0xe379932a, 0x7d7939e6, 0x9e7eb668, 0x007e1ca4, 0x1977d9ae, + 0x87777362, 0x6470fcec, 0xfa705620, 0x7d53cd85, 0xe3536749, + 0x0054e8c7, 0x9e54420b, 0x875d8701, 0x195d2dcd, 0xfa5aa243, + 0x645a088f, 0xc8482856, 0x5648829a, 0xb54f0d14, 0x2b4fa7d8, + 0x324662d2, 0xac46c81e, 0x4f414790, 0xd141ed5c, 0xedc29d29, + 0x73c237e5, 0x90c5b86b, 0x0ec512a7, 0x17ccd7ad, 0x89cc7d61, + 0x6acbf2ef, 0xf4cb5823, 0x58d978fa, 0xc6d9d236, 0x25de5db8, + 0xbbdef774, 0xa2d7327e, 0x3cd798b2, 0xdfd0173c, 0x41d0bdf0, + 0xc6f32655, 0x58f38c99, 0xbbf40317, 0x25f4a9db, 0x3cfd6cd1, + 0xa2fdc61d, 0x41fa4993, 0xdffae35f, 0x73e8c386, 0xede8694a, + 0x0eefe6c4, 0x90ef4c08, 0x89e68902, 0x17e623ce, 0xf4e1ac40, + 0x6ae1068c, 0xbba0ebd0, 0x25a0411c, 0xc6a7ce92, 0x58a7645e, + 0x41aea154, 0xdfae0b98, 0x3ca98416, 0xa2a92eda, 0x0ebb0e03, + 0x90bba4cf, 0x73bc2b41, 0xedbc818d, 0xf4b54487, 0x6ab5ee4b, + 0x89b261c5, 0x17b2cb09, 0x909150ac, 0x0e91fa60, 0xed9675ee, + 0x7396df22, 0x6a9f1a28, 0xf49fb0e4, 0x17983f6a, 0x899895a6, + 0x258ab57f, 0xbb8a1fb3, 0x588d903d, 0xc68d3af1, 0xdf84fffb, + 0x41845537, 0xa283dab9, 0x3c837075, 0xda853b53, 0x4485919f, + 0xa7821e11, 0x3982b4dd, 0x208b71d7, 0xbe8bdb1b, 0x5d8c5495, + 0xc38cfe59, 0x6f9ede80, 0xf19e744c, 0x1299fbc2, 0x8c99510e, + 0x95909404, 0x0b903ec8, 0xe897b146, 0x76971b8a, 0xf1b4802f, + 0x6fb42ae3, 0x8cb3a56d, 0x12b30fa1, 0x0bbacaab, 0x95ba6067, + 0x76bdefe9, 0xe8bd4525, 0x44af65fc, 0xdaafcf30, 0x39a840be, + 0xa7a8ea72, 0xbea12f78, 0x20a185b4, 0xc3a60a3a, 0x5da6a0f6, + 0x8ce74daa, 0x12e7e766, 0xf1e068e8, 0x6fe0c224, 0x76e9072e, + 0xe8e9ade2, 0x0bee226c, 0x95ee88a0, 0x39fca879, 0xa7fc02b5, + 0x44fb8d3b, 0xdafb27f7, 0xc3f2e2fd, 0x5df24831, 0xbef5c7bf, + 0x20f56d73, 0xa7d6f6d6, 0x39d65c1a, 0xdad1d394, 0x44d17958, + 0x5dd8bc52, 0xc3d8169e, 0x20df9910, 0xbedf33dc, 0x12cd1305, + 0x8ccdb9c9, 0x6fca3647, 0xf1ca9c8b, 0xe8c35981, 0x76c3f34d, + 0x95c47cc3, 0x0bc4d60f, 0x3747a67a, 0xa9470cb6, 0x4a408338, + 0xd44029f4, 0xcd49ecfe, 0x53494632, 0xb04ec9bc, 0x2e4e6370, + 0x825c43a9, 0x1c5ce965, 0xff5b66eb, 0x615bcc27, 0x7852092d, + 0xe652a3e1, 0x05552c6f, 0x9b5586a3, 0x1c761d06, 0x8276b7ca, + 0x61713844, 0xff719288, 0xe6785782, 0x7878fd4e, 0x9b7f72c0, + 0x057fd80c, 0xa96df8d5, 0x376d5219, 0xd46add97, 0x4a6a775b, + 0x5363b251, 0xcd63189d, 0x2e649713, 0xb0643ddf, 0x6125d083, + 0xff257a4f, 0x1c22f5c1, 0x82225f0d, 0x9b2b9a07, 0x052b30cb, + 0xe62cbf45, 0x782c1589, 0xd43e3550, 0x4a3e9f9c, 0xa9391012, + 0x3739bade, 0x2e307fd4, 0xb030d518, 0x53375a96, 0xcd37f05a, + 0x4a146bff, 0xd414c133, 0x37134ebd, 0xa913e471, 0xb01a217b, + 0x2e1a8bb7, 0xcd1d0439, 0x531daef5, 0xff0f8e2c, 0x610f24e0, + 0x8208ab6e, 0x1c0801a2, 0x0501c4a8, 0x9b016e64, 0x7806e1ea, + 0xe6064b26}}; + +#endif + +#endif + +#if N == 3 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}, + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43cba68700000000, 0xc7903cd400000000, + 0x845b9a5300000000, 0xcf27087300000000, 0x8cecaef400000000, + 0x08b734a700000000, 0x4b7c922000000000, 0x9e4f10e600000000, + 0xdd84b66100000000, 0x59df2c3200000000, 0x1a148ab500000000, + 0x5168189500000000, 0x12a3be1200000000, 0x96f8244100000000, + 0xd53382c600000000, 0x7d99511700000000, 0x3e52f79000000000, + 0xba096dc300000000, 0xf9c2cb4400000000, 0xb2be596400000000, + 0xf175ffe300000000, 0x752e65b000000000, 0x36e5c33700000000, + 0xe3d641f100000000, 0xa01de77600000000, 0x24467d2500000000, + 0x678ddba200000000, 0x2cf1498200000000, 0x6f3aef0500000000, + 0xeb61755600000000, 0xa8aad3d100000000, 0xfa32a32e00000000, + 0xb9f905a900000000, 0x3da29ffa00000000, 0x7e69397d00000000, + 0x3515ab5d00000000, 0x76de0dda00000000, 0xf285978900000000, + 0xb14e310e00000000, 0x647db3c800000000, 0x27b6154f00000000, + 0xa3ed8f1c00000000, 0xe026299b00000000, 0xab5abbbb00000000, + 0xe8911d3c00000000, 0x6cca876f00000000, 0x2f0121e800000000, + 0x87abf23900000000, 0xc46054be00000000, 0x403bceed00000000, + 0x03f0686a00000000, 0x488cfa4a00000000, 0x0b475ccd00000000, + 0x8f1cc69e00000000, 0xccd7601900000000, 0x19e4e2df00000000, + 0x5a2f445800000000, 0xde74de0b00000000, 0x9dbf788c00000000, + 0xd6c3eaac00000000, 0x95084c2b00000000, 0x1153d67800000000, + 0x529870ff00000000, 0xf465465d00000000, 0xb7aee0da00000000, + 0x33f57a8900000000, 0x703edc0e00000000, 0x3b424e2e00000000, + 0x7889e8a900000000, 0xfcd272fa00000000, 0xbf19d47d00000000, + 0x6a2a56bb00000000, 0x29e1f03c00000000, 0xadba6a6f00000000, + 0xee71cce800000000, 0xa50d5ec800000000, 0xe6c6f84f00000000, + 0x629d621c00000000, 0x2156c49b00000000, 0x89fc174a00000000, + 0xca37b1cd00000000, 0x4e6c2b9e00000000, 0x0da78d1900000000, + 0x46db1f3900000000, 0x0510b9be00000000, 0x814b23ed00000000, + 0xc280856a00000000, 0x17b307ac00000000, 0x5478a12b00000000, + 0xd0233b7800000000, 0x93e89dff00000000, 0xd8940fdf00000000, + 0x9b5fa95800000000, 0x1f04330b00000000, 0x5ccf958c00000000, + 0x0e57e57300000000, 0x4d9c43f400000000, 0xc9c7d9a700000000, + 0x8a0c7f2000000000, 0xc170ed0000000000, 0x82bb4b8700000000, + 0x06e0d1d400000000, 0x452b775300000000, 0x9018f59500000000, + 0xd3d3531200000000, 0x5788c94100000000, 0x14436fc600000000, + 0x5f3ffde600000000, 0x1cf45b6100000000, 0x98afc13200000000, + 0xdb6467b500000000, 0x73ceb46400000000, 0x300512e300000000, + 0xb45e88b000000000, 0xf7952e3700000000, 0xbce9bc1700000000, + 0xff221a9000000000, 0x7b7980c300000000, 0x38b2264400000000, + 0xed81a48200000000, 0xae4a020500000000, 0x2a11985600000000, + 0x69da3ed100000000, 0x22a6acf100000000, 0x616d0a7600000000, + 0xe536902500000000, 0xa6fd36a200000000, 0xe8cb8cba00000000, + 0xab002a3d00000000, 0x2f5bb06e00000000, 0x6c9016e900000000, + 0x27ec84c900000000, 0x6427224e00000000, 0xe07cb81d00000000, + 0xa3b71e9a00000000, 0x76849c5c00000000, 0x354f3adb00000000, + 0xb114a08800000000, 0xf2df060f00000000, 0xb9a3942f00000000, + 0xfa6832a800000000, 0x7e33a8fb00000000, 0x3df80e7c00000000, + 0x9552ddad00000000, 0xd6997b2a00000000, 0x52c2e17900000000, + 0x110947fe00000000, 0x5a75d5de00000000, 0x19be735900000000, + 0x9de5e90a00000000, 0xde2e4f8d00000000, 0x0b1dcd4b00000000, + 0x48d66bcc00000000, 0xcc8df19f00000000, 0x8f46571800000000, + 0xc43ac53800000000, 0x87f163bf00000000, 0x03aaf9ec00000000, + 0x40615f6b00000000, 0x12f92f9400000000, 0x5132891300000000, + 0xd569134000000000, 0x96a2b5c700000000, 0xddde27e700000000, + 0x9e15816000000000, 0x1a4e1b3300000000, 0x5985bdb400000000, + 0x8cb63f7200000000, 0xcf7d99f500000000, 0x4b2603a600000000, + 0x08eda52100000000, 0x4391370100000000, 0x005a918600000000, + 0x84010bd500000000, 0xc7caad5200000000, 0x6f607e8300000000, + 0x2cabd80400000000, 0xa8f0425700000000, 0xeb3be4d000000000, + 0xa04776f000000000, 0xe38cd07700000000, 0x67d74a2400000000, + 0x241ceca300000000, 0xf12f6e6500000000, 0xb2e4c8e200000000, + 0x36bf52b100000000, 0x7574f43600000000, 0x3e08661600000000, + 0x7dc3c09100000000, 0xf9985ac200000000, 0xba53fc4500000000, + 0x1caecae700000000, 0x5f656c6000000000, 0xdb3ef63300000000, + 0x98f550b400000000, 0xd389c29400000000, 0x9042641300000000, + 0x1419fe4000000000, 0x57d258c700000000, 0x82e1da0100000000, + 0xc12a7c8600000000, 0x4571e6d500000000, 0x06ba405200000000, + 0x4dc6d27200000000, 0x0e0d74f500000000, 0x8a56eea600000000, + 0xc99d482100000000, 0x61379bf000000000, 0x22fc3d7700000000, + 0xa6a7a72400000000, 0xe56c01a300000000, 0xae10938300000000, + 0xeddb350400000000, 0x6980af5700000000, 0x2a4b09d000000000, + 0xff788b1600000000, 0xbcb32d9100000000, 0x38e8b7c200000000, + 0x7b23114500000000, 0x305f836500000000, 0x739425e200000000, + 0xf7cfbfb100000000, 0xb404193600000000, 0xe69c69c900000000, + 0xa557cf4e00000000, 0x210c551d00000000, 0x62c7f39a00000000, + 0x29bb61ba00000000, 0x6a70c73d00000000, 0xee2b5d6e00000000, + 0xade0fbe900000000, 0x78d3792f00000000, 0x3b18dfa800000000, + 0xbf4345fb00000000, 0xfc88e37c00000000, 0xb7f4715c00000000, + 0xf43fd7db00000000, 0x70644d8800000000, 0x33afeb0f00000000, + 0x9b0538de00000000, 0xd8ce9e5900000000, 0x5c95040a00000000, + 0x1f5ea28d00000000, 0x542230ad00000000, 0x17e9962a00000000, + 0x93b20c7900000000, 0xd079aafe00000000, 0x054a283800000000, + 0x46818ebf00000000, 0xc2da14ec00000000, 0x8111b26b00000000, + 0xca6d204b00000000, 0x89a686cc00000000, 0x0dfd1c9f00000000, + 0x4e36ba1800000000}, + {0x0000000000000000, 0xe1b652ef00000000, 0x836bd40500000000, + 0x62dd86ea00000000, 0x06d7a80b00000000, 0xe761fae400000000, + 0x85bc7c0e00000000, 0x640a2ee100000000, 0x0cae511700000000, + 0xed1803f800000000, 0x8fc5851200000000, 0x6e73d7fd00000000, + 0x0a79f91c00000000, 0xebcfabf300000000, 0x89122d1900000000, + 0x68a47ff600000000, 0x185ca32e00000000, 0xf9eaf1c100000000, + 0x9b37772b00000000, 0x7a8125c400000000, 0x1e8b0b2500000000, + 0xff3d59ca00000000, 0x9de0df2000000000, 0x7c568dcf00000000, + 0x14f2f23900000000, 0xf544a0d600000000, 0x9799263c00000000, + 0x762f74d300000000, 0x12255a3200000000, 0xf39308dd00000000, + 0x914e8e3700000000, 0x70f8dcd800000000, 0x30b8465d00000000, + 0xd10e14b200000000, 0xb3d3925800000000, 0x5265c0b700000000, + 0x366fee5600000000, 0xd7d9bcb900000000, 0xb5043a5300000000, + 0x54b268bc00000000, 0x3c16174a00000000, 0xdda045a500000000, + 0xbf7dc34f00000000, 0x5ecb91a000000000, 0x3ac1bf4100000000, + 0xdb77edae00000000, 0xb9aa6b4400000000, 0x581c39ab00000000, + 0x28e4e57300000000, 0xc952b79c00000000, 0xab8f317600000000, + 0x4a39639900000000, 0x2e334d7800000000, 0xcf851f9700000000, + 0xad58997d00000000, 0x4ceecb9200000000, 0x244ab46400000000, + 0xc5fce68b00000000, 0xa721606100000000, 0x4697328e00000000, + 0x229d1c6f00000000, 0xc32b4e8000000000, 0xa1f6c86a00000000, + 0x40409a8500000000, 0x60708dba00000000, 0x81c6df5500000000, + 0xe31b59bf00000000, 0x02ad0b5000000000, 0x66a725b100000000, + 0x8711775e00000000, 0xe5ccf1b400000000, 0x047aa35b00000000, + 0x6cdedcad00000000, 0x8d688e4200000000, 0xefb508a800000000, + 0x0e035a4700000000, 0x6a0974a600000000, 0x8bbf264900000000, + 0xe962a0a300000000, 0x08d4f24c00000000, 0x782c2e9400000000, + 0x999a7c7b00000000, 0xfb47fa9100000000, 0x1af1a87e00000000, + 0x7efb869f00000000, 0x9f4dd47000000000, 0xfd90529a00000000, + 0x1c26007500000000, 0x74827f8300000000, 0x95342d6c00000000, + 0xf7e9ab8600000000, 0x165ff96900000000, 0x7255d78800000000, + 0x93e3856700000000, 0xf13e038d00000000, 0x1088516200000000, + 0x50c8cbe700000000, 0xb17e990800000000, 0xd3a31fe200000000, + 0x32154d0d00000000, 0x561f63ec00000000, 0xb7a9310300000000, + 0xd574b7e900000000, 0x34c2e50600000000, 0x5c669af000000000, + 0xbdd0c81f00000000, 0xdf0d4ef500000000, 0x3ebb1c1a00000000, + 0x5ab132fb00000000, 0xbb07601400000000, 0xd9dae6fe00000000, + 0x386cb41100000000, 0x489468c900000000, 0xa9223a2600000000, + 0xcbffbccc00000000, 0x2a49ee2300000000, 0x4e43c0c200000000, + 0xaff5922d00000000, 0xcd2814c700000000, 0x2c9e462800000000, + 0x443a39de00000000, 0xa58c6b3100000000, 0xc751eddb00000000, + 0x26e7bf3400000000, 0x42ed91d500000000, 0xa35bc33a00000000, + 0xc18645d000000000, 0x2030173f00000000, 0x81e66bae00000000, + 0x6050394100000000, 0x028dbfab00000000, 0xe33bed4400000000, + 0x8731c3a500000000, 0x6687914a00000000, 0x045a17a000000000, + 0xe5ec454f00000000, 0x8d483ab900000000, 0x6cfe685600000000, + 0x0e23eebc00000000, 0xef95bc5300000000, 0x8b9f92b200000000, + 0x6a29c05d00000000, 0x08f446b700000000, 0xe942145800000000, + 0x99bac88000000000, 0x780c9a6f00000000, 0x1ad11c8500000000, + 0xfb674e6a00000000, 0x9f6d608b00000000, 0x7edb326400000000, + 0x1c06b48e00000000, 0xfdb0e66100000000, 0x9514999700000000, + 0x74a2cb7800000000, 0x167f4d9200000000, 0xf7c91f7d00000000, + 0x93c3319c00000000, 0x7275637300000000, 0x10a8e59900000000, + 0xf11eb77600000000, 0xb15e2df300000000, 0x50e87f1c00000000, + 0x3235f9f600000000, 0xd383ab1900000000, 0xb78985f800000000, + 0x563fd71700000000, 0x34e251fd00000000, 0xd554031200000000, + 0xbdf07ce400000000, 0x5c462e0b00000000, 0x3e9ba8e100000000, + 0xdf2dfa0e00000000, 0xbb27d4ef00000000, 0x5a91860000000000, + 0x384c00ea00000000, 0xd9fa520500000000, 0xa9028edd00000000, + 0x48b4dc3200000000, 0x2a695ad800000000, 0xcbdf083700000000, + 0xafd526d600000000, 0x4e63743900000000, 0x2cbef2d300000000, + 0xcd08a03c00000000, 0xa5acdfca00000000, 0x441a8d2500000000, + 0x26c70bcf00000000, 0xc771592000000000, 0xa37b77c100000000, + 0x42cd252e00000000, 0x2010a3c400000000, 0xc1a6f12b00000000, + 0xe196e61400000000, 0x0020b4fb00000000, 0x62fd321100000000, + 0x834b60fe00000000, 0xe7414e1f00000000, 0x06f71cf000000000, + 0x642a9a1a00000000, 0x859cc8f500000000, 0xed38b70300000000, + 0x0c8ee5ec00000000, 0x6e53630600000000, 0x8fe531e900000000, + 0xebef1f0800000000, 0x0a594de700000000, 0x6884cb0d00000000, + 0x893299e200000000, 0xf9ca453a00000000, 0x187c17d500000000, + 0x7aa1913f00000000, 0x9b17c3d000000000, 0xff1ded3100000000, + 0x1eabbfde00000000, 0x7c76393400000000, 0x9dc06bdb00000000, + 0xf564142d00000000, 0x14d246c200000000, 0x760fc02800000000, + 0x97b992c700000000, 0xf3b3bc2600000000, 0x1205eec900000000, + 0x70d8682300000000, 0x916e3acc00000000, 0xd12ea04900000000, + 0x3098f2a600000000, 0x5245744c00000000, 0xb3f326a300000000, + 0xd7f9084200000000, 0x364f5aad00000000, 0x5492dc4700000000, + 0xb5248ea800000000, 0xdd80f15e00000000, 0x3c36a3b100000000, + 0x5eeb255b00000000, 0xbf5d77b400000000, 0xdb57595500000000, + 0x3ae10bba00000000, 0x583c8d5000000000, 0xb98adfbf00000000, + 0xc972036700000000, 0x28c4518800000000, 0x4a19d76200000000, + 0xabaf858d00000000, 0xcfa5ab6c00000000, 0x2e13f98300000000, + 0x4cce7f6900000000, 0xad782d8600000000, 0xc5dc527000000000, + 0x246a009f00000000, 0x46b7867500000000, 0xa701d49a00000000, + 0xc30bfa7b00000000, 0x22bda89400000000, 0x40602e7e00000000, + 0xa1d67c9100000000}, + {0x0000000000000000, 0x5880e2d700000000, 0xf106b47400000000, + 0xa98656a300000000, 0xe20d68e900000000, 0xba8d8a3e00000000, + 0x130bdc9d00000000, 0x4b8b3e4a00000000, 0x851da10900000000, + 0xdd9d43de00000000, 0x741b157d00000000, 0x2c9bf7aa00000000, + 0x6710c9e000000000, 0x3f902b3700000000, 0x96167d9400000000, + 0xce969f4300000000, 0x0a3b421300000000, 0x52bba0c400000000, + 0xfb3df66700000000, 0xa3bd14b000000000, 0xe8362afa00000000, + 0xb0b6c82d00000000, 0x19309e8e00000000, 0x41b07c5900000000, + 0x8f26e31a00000000, 0xd7a601cd00000000, 0x7e20576e00000000, + 0x26a0b5b900000000, 0x6d2b8bf300000000, 0x35ab692400000000, + 0x9c2d3f8700000000, 0xc4addd5000000000, 0x1476842600000000, + 0x4cf666f100000000, 0xe570305200000000, 0xbdf0d28500000000, + 0xf67beccf00000000, 0xaefb0e1800000000, 0x077d58bb00000000, + 0x5ffdba6c00000000, 0x916b252f00000000, 0xc9ebc7f800000000, + 0x606d915b00000000, 0x38ed738c00000000, 0x73664dc600000000, + 0x2be6af1100000000, 0x8260f9b200000000, 0xdae01b6500000000, + 0x1e4dc63500000000, 0x46cd24e200000000, 0xef4b724100000000, + 0xb7cb909600000000, 0xfc40aedc00000000, 0xa4c04c0b00000000, + 0x0d461aa800000000, 0x55c6f87f00000000, 0x9b50673c00000000, + 0xc3d085eb00000000, 0x6a56d34800000000, 0x32d6319f00000000, + 0x795d0fd500000000, 0x21dded0200000000, 0x885bbba100000000, + 0xd0db597600000000, 0x28ec084d00000000, 0x706cea9a00000000, + 0xd9eabc3900000000, 0x816a5eee00000000, 0xcae160a400000000, + 0x9261827300000000, 0x3be7d4d000000000, 0x6367360700000000, + 0xadf1a94400000000, 0xf5714b9300000000, 0x5cf71d3000000000, + 0x0477ffe700000000, 0x4ffcc1ad00000000, 0x177c237a00000000, + 0xbefa75d900000000, 0xe67a970e00000000, 0x22d74a5e00000000, + 0x7a57a88900000000, 0xd3d1fe2a00000000, 0x8b511cfd00000000, + 0xc0da22b700000000, 0x985ac06000000000, 0x31dc96c300000000, + 0x695c741400000000, 0xa7caeb5700000000, 0xff4a098000000000, + 0x56cc5f2300000000, 0x0e4cbdf400000000, 0x45c783be00000000, + 0x1d47616900000000, 0xb4c137ca00000000, 0xec41d51d00000000, + 0x3c9a8c6b00000000, 0x641a6ebc00000000, 0xcd9c381f00000000, + 0x951cdac800000000, 0xde97e48200000000, 0x8617065500000000, + 0x2f9150f600000000, 0x7711b22100000000, 0xb9872d6200000000, + 0xe107cfb500000000, 0x4881991600000000, 0x10017bc100000000, + 0x5b8a458b00000000, 0x030aa75c00000000, 0xaa8cf1ff00000000, + 0xf20c132800000000, 0x36a1ce7800000000, 0x6e212caf00000000, + 0xc7a77a0c00000000, 0x9f2798db00000000, 0xd4aca69100000000, + 0x8c2c444600000000, 0x25aa12e500000000, 0x7d2af03200000000, + 0xb3bc6f7100000000, 0xeb3c8da600000000, 0x42badb0500000000, + 0x1a3a39d200000000, 0x51b1079800000000, 0x0931e54f00000000, + 0xa0b7b3ec00000000, 0xf837513b00000000, 0x50d8119a00000000, + 0x0858f34d00000000, 0xa1dea5ee00000000, 0xf95e473900000000, + 0xb2d5797300000000, 0xea559ba400000000, 0x43d3cd0700000000, + 0x1b532fd000000000, 0xd5c5b09300000000, 0x8d45524400000000, + 0x24c304e700000000, 0x7c43e63000000000, 0x37c8d87a00000000, + 0x6f483aad00000000, 0xc6ce6c0e00000000, 0x9e4e8ed900000000, + 0x5ae3538900000000, 0x0263b15e00000000, 0xabe5e7fd00000000, + 0xf365052a00000000, 0xb8ee3b6000000000, 0xe06ed9b700000000, + 0x49e88f1400000000, 0x11686dc300000000, 0xdffef28000000000, + 0x877e105700000000, 0x2ef846f400000000, 0x7678a42300000000, + 0x3df39a6900000000, 0x657378be00000000, 0xccf52e1d00000000, + 0x9475ccca00000000, 0x44ae95bc00000000, 0x1c2e776b00000000, + 0xb5a821c800000000, 0xed28c31f00000000, 0xa6a3fd5500000000, + 0xfe231f8200000000, 0x57a5492100000000, 0x0f25abf600000000, + 0xc1b334b500000000, 0x9933d66200000000, 0x30b580c100000000, + 0x6835621600000000, 0x23be5c5c00000000, 0x7b3ebe8b00000000, + 0xd2b8e82800000000, 0x8a380aff00000000, 0x4e95d7af00000000, + 0x1615357800000000, 0xbf9363db00000000, 0xe713810c00000000, + 0xac98bf4600000000, 0xf4185d9100000000, 0x5d9e0b3200000000, + 0x051ee9e500000000, 0xcb8876a600000000, 0x9308947100000000, + 0x3a8ec2d200000000, 0x620e200500000000, 0x29851e4f00000000, + 0x7105fc9800000000, 0xd883aa3b00000000, 0x800348ec00000000, + 0x783419d700000000, 0x20b4fb0000000000, 0x8932ada300000000, + 0xd1b24f7400000000, 0x9a39713e00000000, 0xc2b993e900000000, + 0x6b3fc54a00000000, 0x33bf279d00000000, 0xfd29b8de00000000, + 0xa5a95a0900000000, 0x0c2f0caa00000000, 0x54afee7d00000000, + 0x1f24d03700000000, 0x47a432e000000000, 0xee22644300000000, + 0xb6a2869400000000, 0x720f5bc400000000, 0x2a8fb91300000000, + 0x8309efb000000000, 0xdb890d6700000000, 0x9002332d00000000, + 0xc882d1fa00000000, 0x6104875900000000, 0x3984658e00000000, + 0xf712facd00000000, 0xaf92181a00000000, 0x06144eb900000000, + 0x5e94ac6e00000000, 0x151f922400000000, 0x4d9f70f300000000, + 0xe419265000000000, 0xbc99c48700000000, 0x6c429df100000000, + 0x34c27f2600000000, 0x9d44298500000000, 0xc5c4cb5200000000, + 0x8e4ff51800000000, 0xd6cf17cf00000000, 0x7f49416c00000000, + 0x27c9a3bb00000000, 0xe95f3cf800000000, 0xb1dfde2f00000000, + 0x1859888c00000000, 0x40d96a5b00000000, 0x0b52541100000000, + 0x53d2b6c600000000, 0xfa54e06500000000, 0xa2d402b200000000, + 0x6679dfe200000000, 0x3ef93d3500000000, 0x977f6b9600000000, + 0xcfff894100000000, 0x8474b70b00000000, 0xdcf455dc00000000, + 0x7572037f00000000, 0x2df2e1a800000000, 0xe3647eeb00000000, + 0xbbe49c3c00000000, 0x1262ca9f00000000, 0x4ae2284800000000, + 0x0169160200000000, 0x59e9f4d500000000, 0xf06fa27600000000, + 0xa8ef40a100000000}, + {0x0000000000000000, 0x463b676500000000, 0x8c76ceca00000000, + 0xca4da9af00000000, 0x59ebed4e00000000, 0x1fd08a2b00000000, + 0xd59d238400000000, 0x93a644e100000000, 0xb2d6db9d00000000, + 0xf4edbcf800000000, 0x3ea0155700000000, 0x789b723200000000, + 0xeb3d36d300000000, 0xad0651b600000000, 0x674bf81900000000, + 0x21709f7c00000000, 0x25abc6e000000000, 0x6390a18500000000, + 0xa9dd082a00000000, 0xefe66f4f00000000, 0x7c402bae00000000, + 0x3a7b4ccb00000000, 0xf036e56400000000, 0xb60d820100000000, + 0x977d1d7d00000000, 0xd1467a1800000000, 0x1b0bd3b700000000, + 0x5d30b4d200000000, 0xce96f03300000000, 0x88ad975600000000, + 0x42e03ef900000000, 0x04db599c00000000, 0x0b50fc1a00000000, + 0x4d6b9b7f00000000, 0x872632d000000000, 0xc11d55b500000000, + 0x52bb115400000000, 0x1480763100000000, 0xdecddf9e00000000, + 0x98f6b8fb00000000, 0xb986278700000000, 0xffbd40e200000000, + 0x35f0e94d00000000, 0x73cb8e2800000000, 0xe06dcac900000000, + 0xa656adac00000000, 0x6c1b040300000000, 0x2a20636600000000, + 0x2efb3afa00000000, 0x68c05d9f00000000, 0xa28df43000000000, + 0xe4b6935500000000, 0x7710d7b400000000, 0x312bb0d100000000, + 0xfb66197e00000000, 0xbd5d7e1b00000000, 0x9c2de16700000000, + 0xda16860200000000, 0x105b2fad00000000, 0x566048c800000000, + 0xc5c60c2900000000, 0x83fd6b4c00000000, 0x49b0c2e300000000, + 0x0f8ba58600000000, 0x16a0f83500000000, 0x509b9f5000000000, + 0x9ad636ff00000000, 0xdced519a00000000, 0x4f4b157b00000000, + 0x0970721e00000000, 0xc33ddbb100000000, 0x8506bcd400000000, + 0xa47623a800000000, 0xe24d44cd00000000, 0x2800ed6200000000, + 0x6e3b8a0700000000, 0xfd9dcee600000000, 0xbba6a98300000000, + 0x71eb002c00000000, 0x37d0674900000000, 0x330b3ed500000000, + 0x753059b000000000, 0xbf7df01f00000000, 0xf946977a00000000, + 0x6ae0d39b00000000, 0x2cdbb4fe00000000, 0xe6961d5100000000, + 0xa0ad7a3400000000, 0x81dde54800000000, 0xc7e6822d00000000, + 0x0dab2b8200000000, 0x4b904ce700000000, 0xd836080600000000, + 0x9e0d6f6300000000, 0x5440c6cc00000000, 0x127ba1a900000000, + 0x1df0042f00000000, 0x5bcb634a00000000, 0x9186cae500000000, + 0xd7bdad8000000000, 0x441be96100000000, 0x02208e0400000000, + 0xc86d27ab00000000, 0x8e5640ce00000000, 0xaf26dfb200000000, + 0xe91db8d700000000, 0x2350117800000000, 0x656b761d00000000, + 0xf6cd32fc00000000, 0xb0f6559900000000, 0x7abbfc3600000000, + 0x3c809b5300000000, 0x385bc2cf00000000, 0x7e60a5aa00000000, + 0xb42d0c0500000000, 0xf2166b6000000000, 0x61b02f8100000000, + 0x278b48e400000000, 0xedc6e14b00000000, 0xabfd862e00000000, + 0x8a8d195200000000, 0xccb67e3700000000, 0x06fbd79800000000, + 0x40c0b0fd00000000, 0xd366f41c00000000, 0x955d937900000000, + 0x5f103ad600000000, 0x192b5db300000000, 0x2c40f16b00000000, + 0x6a7b960e00000000, 0xa0363fa100000000, 0xe60d58c400000000, + 0x75ab1c2500000000, 0x33907b4000000000, 0xf9ddd2ef00000000, + 0xbfe6b58a00000000, 0x9e962af600000000, 0xd8ad4d9300000000, + 0x12e0e43c00000000, 0x54db835900000000, 0xc77dc7b800000000, + 0x8146a0dd00000000, 0x4b0b097200000000, 0x0d306e1700000000, + 0x09eb378b00000000, 0x4fd050ee00000000, 0x859df94100000000, + 0xc3a69e2400000000, 0x5000dac500000000, 0x163bbda000000000, + 0xdc76140f00000000, 0x9a4d736a00000000, 0xbb3dec1600000000, + 0xfd068b7300000000, 0x374b22dc00000000, 0x717045b900000000, + 0xe2d6015800000000, 0xa4ed663d00000000, 0x6ea0cf9200000000, + 0x289ba8f700000000, 0x27100d7100000000, 0x612b6a1400000000, + 0xab66c3bb00000000, 0xed5da4de00000000, 0x7efbe03f00000000, + 0x38c0875a00000000, 0xf28d2ef500000000, 0xb4b6499000000000, + 0x95c6d6ec00000000, 0xd3fdb18900000000, 0x19b0182600000000, + 0x5f8b7f4300000000, 0xcc2d3ba200000000, 0x8a165cc700000000, + 0x405bf56800000000, 0x0660920d00000000, 0x02bbcb9100000000, + 0x4480acf400000000, 0x8ecd055b00000000, 0xc8f6623e00000000, + 0x5b5026df00000000, 0x1d6b41ba00000000, 0xd726e81500000000, + 0x911d8f7000000000, 0xb06d100c00000000, 0xf656776900000000, + 0x3c1bdec600000000, 0x7a20b9a300000000, 0xe986fd4200000000, + 0xafbd9a2700000000, 0x65f0338800000000, 0x23cb54ed00000000, + 0x3ae0095e00000000, 0x7cdb6e3b00000000, 0xb696c79400000000, + 0xf0ada0f100000000, 0x630be41000000000, 0x2530837500000000, + 0xef7d2ada00000000, 0xa9464dbf00000000, 0x8836d2c300000000, + 0xce0db5a600000000, 0x04401c0900000000, 0x427b7b6c00000000, + 0xd1dd3f8d00000000, 0x97e658e800000000, 0x5dabf14700000000, + 0x1b90962200000000, 0x1f4bcfbe00000000, 0x5970a8db00000000, + 0x933d017400000000, 0xd506661100000000, 0x46a022f000000000, + 0x009b459500000000, 0xcad6ec3a00000000, 0x8ced8b5f00000000, + 0xad9d142300000000, 0xeba6734600000000, 0x21ebdae900000000, + 0x67d0bd8c00000000, 0xf476f96d00000000, 0xb24d9e0800000000, + 0x780037a700000000, 0x3e3b50c200000000, 0x31b0f54400000000, + 0x778b922100000000, 0xbdc63b8e00000000, 0xfbfd5ceb00000000, + 0x685b180a00000000, 0x2e607f6f00000000, 0xe42dd6c000000000, + 0xa216b1a500000000, 0x83662ed900000000, 0xc55d49bc00000000, + 0x0f10e01300000000, 0x492b877600000000, 0xda8dc39700000000, + 0x9cb6a4f200000000, 0x56fb0d5d00000000, 0x10c06a3800000000, + 0x141b33a400000000, 0x522054c100000000, 0x986dfd6e00000000, + 0xde569a0b00000000, 0x4df0deea00000000, 0x0bcbb98f00000000, + 0xc186102000000000, 0x87bd774500000000, 0xa6cde83900000000, + 0xe0f68f5c00000000, 0x2abb26f300000000, 0x6c80419600000000, + 0xff26057700000000, 0xb91d621200000000, 0x7350cbbd00000000, + 0x356bacd800000000}, + {0x0000000000000000, 0x9e83da9f00000000, 0x7d01c4e400000000, + 0xe3821e7b00000000, 0xbb04f91200000000, 0x2587238d00000000, + 0xc6053df600000000, 0x5886e76900000000, 0x7609f22500000000, + 0xe88a28ba00000000, 0x0b0836c100000000, 0x958bec5e00000000, + 0xcd0d0b3700000000, 0x538ed1a800000000, 0xb00ccfd300000000, + 0x2e8f154c00000000, 0xec12e44b00000000, 0x72913ed400000000, + 0x911320af00000000, 0x0f90fa3000000000, 0x57161d5900000000, + 0xc995c7c600000000, 0x2a17d9bd00000000, 0xb494032200000000, + 0x9a1b166e00000000, 0x0498ccf100000000, 0xe71ad28a00000000, + 0x7999081500000000, 0x211fef7c00000000, 0xbf9c35e300000000, + 0x5c1e2b9800000000, 0xc29df10700000000, 0xd825c89700000000, + 0x46a6120800000000, 0xa5240c7300000000, 0x3ba7d6ec00000000, + 0x6321318500000000, 0xfda2eb1a00000000, 0x1e20f56100000000, + 0x80a32ffe00000000, 0xae2c3ab200000000, 0x30afe02d00000000, + 0xd32dfe5600000000, 0x4dae24c900000000, 0x1528c3a000000000, + 0x8bab193f00000000, 0x6829074400000000, 0xf6aadddb00000000, + 0x34372cdc00000000, 0xaab4f64300000000, 0x4936e83800000000, + 0xd7b532a700000000, 0x8f33d5ce00000000, 0x11b00f5100000000, + 0xf232112a00000000, 0x6cb1cbb500000000, 0x423edef900000000, + 0xdcbd046600000000, 0x3f3f1a1d00000000, 0xa1bcc08200000000, + 0xf93a27eb00000000, 0x67b9fd7400000000, 0x843be30f00000000, + 0x1ab8399000000000, 0xf14de1f400000000, 0x6fce3b6b00000000, + 0x8c4c251000000000, 0x12cfff8f00000000, 0x4a4918e600000000, + 0xd4cac27900000000, 0x3748dc0200000000, 0xa9cb069d00000000, + 0x874413d100000000, 0x19c7c94e00000000, 0xfa45d73500000000, + 0x64c60daa00000000, 0x3c40eac300000000, 0xa2c3305c00000000, + 0x41412e2700000000, 0xdfc2f4b800000000, 0x1d5f05bf00000000, + 0x83dcdf2000000000, 0x605ec15b00000000, 0xfedd1bc400000000, + 0xa65bfcad00000000, 0x38d8263200000000, 0xdb5a384900000000, + 0x45d9e2d600000000, 0x6b56f79a00000000, 0xf5d52d0500000000, + 0x1657337e00000000, 0x88d4e9e100000000, 0xd0520e8800000000, + 0x4ed1d41700000000, 0xad53ca6c00000000, 0x33d010f300000000, + 0x2968296300000000, 0xb7ebf3fc00000000, 0x5469ed8700000000, + 0xcaea371800000000, 0x926cd07100000000, 0x0cef0aee00000000, + 0xef6d149500000000, 0x71eece0a00000000, 0x5f61db4600000000, + 0xc1e201d900000000, 0x22601fa200000000, 0xbce3c53d00000000, + 0xe465225400000000, 0x7ae6f8cb00000000, 0x9964e6b000000000, + 0x07e73c2f00000000, 0xc57acd2800000000, 0x5bf917b700000000, + 0xb87b09cc00000000, 0x26f8d35300000000, 0x7e7e343a00000000, + 0xe0fdeea500000000, 0x037ff0de00000000, 0x9dfc2a4100000000, + 0xb3733f0d00000000, 0x2df0e59200000000, 0xce72fbe900000000, + 0x50f1217600000000, 0x0877c61f00000000, 0x96f41c8000000000, + 0x757602fb00000000, 0xebf5d86400000000, 0xa39db33200000000, + 0x3d1e69ad00000000, 0xde9c77d600000000, 0x401fad4900000000, + 0x18994a2000000000, 0x861a90bf00000000, 0x65988ec400000000, + 0xfb1b545b00000000, 0xd594411700000000, 0x4b179b8800000000, + 0xa89585f300000000, 0x36165f6c00000000, 0x6e90b80500000000, + 0xf013629a00000000, 0x13917ce100000000, 0x8d12a67e00000000, + 0x4f8f577900000000, 0xd10c8de600000000, 0x328e939d00000000, + 0xac0d490200000000, 0xf48bae6b00000000, 0x6a0874f400000000, + 0x898a6a8f00000000, 0x1709b01000000000, 0x3986a55c00000000, + 0xa7057fc300000000, 0x448761b800000000, 0xda04bb2700000000, + 0x82825c4e00000000, 0x1c0186d100000000, 0xff8398aa00000000, + 0x6100423500000000, 0x7bb87ba500000000, 0xe53ba13a00000000, + 0x06b9bf4100000000, 0x983a65de00000000, 0xc0bc82b700000000, + 0x5e3f582800000000, 0xbdbd465300000000, 0x233e9ccc00000000, + 0x0db1898000000000, 0x9332531f00000000, 0x70b04d6400000000, + 0xee3397fb00000000, 0xb6b5709200000000, 0x2836aa0d00000000, + 0xcbb4b47600000000, 0x55376ee900000000, 0x97aa9fee00000000, + 0x0929457100000000, 0xeaab5b0a00000000, 0x7428819500000000, + 0x2cae66fc00000000, 0xb22dbc6300000000, 0x51afa21800000000, + 0xcf2c788700000000, 0xe1a36dcb00000000, 0x7f20b75400000000, + 0x9ca2a92f00000000, 0x022173b000000000, 0x5aa794d900000000, + 0xc4244e4600000000, 0x27a6503d00000000, 0xb9258aa200000000, + 0x52d052c600000000, 0xcc53885900000000, 0x2fd1962200000000, + 0xb1524cbd00000000, 0xe9d4abd400000000, 0x7757714b00000000, + 0x94d56f3000000000, 0x0a56b5af00000000, 0x24d9a0e300000000, + 0xba5a7a7c00000000, 0x59d8640700000000, 0xc75bbe9800000000, + 0x9fdd59f100000000, 0x015e836e00000000, 0xe2dc9d1500000000, + 0x7c5f478a00000000, 0xbec2b68d00000000, 0x20416c1200000000, + 0xc3c3726900000000, 0x5d40a8f600000000, 0x05c64f9f00000000, + 0x9b45950000000000, 0x78c78b7b00000000, 0xe64451e400000000, + 0xc8cb44a800000000, 0x56489e3700000000, 0xb5ca804c00000000, + 0x2b495ad300000000, 0x73cfbdba00000000, 0xed4c672500000000, + 0x0ece795e00000000, 0x904da3c100000000, 0x8af59a5100000000, + 0x147640ce00000000, 0xf7f45eb500000000, 0x6977842a00000000, + 0x31f1634300000000, 0xaf72b9dc00000000, 0x4cf0a7a700000000, + 0xd2737d3800000000, 0xfcfc687400000000, 0x627fb2eb00000000, + 0x81fdac9000000000, 0x1f7e760f00000000, 0x47f8916600000000, + 0xd97b4bf900000000, 0x3af9558200000000, 0xa47a8f1d00000000, + 0x66e77e1a00000000, 0xf864a48500000000, 0x1be6bafe00000000, + 0x8565606100000000, 0xdde3870800000000, 0x43605d9700000000, + 0xa0e243ec00000000, 0x3e61997300000000, 0x10ee8c3f00000000, + 0x8e6d56a000000000, 0x6def48db00000000, 0xf36c924400000000, + 0xabea752d00000000, 0x3569afb200000000, 0xd6ebb1c900000000, + 0x48686b5600000000}, + {0x0000000000000000, 0xc064281700000000, 0x80c9502e00000000, + 0x40ad783900000000, 0x0093a15c00000000, 0xc0f7894b00000000, + 0x805af17200000000, 0x403ed96500000000, 0x002643b900000000, + 0xc0426bae00000000, 0x80ef139700000000, 0x408b3b8000000000, + 0x00b5e2e500000000, 0xc0d1caf200000000, 0x807cb2cb00000000, + 0x40189adc00000000, 0x414af7a900000000, 0x812edfbe00000000, + 0xc183a78700000000, 0x01e78f9000000000, 0x41d956f500000000, + 0x81bd7ee200000000, 0xc11006db00000000, 0x01742ecc00000000, + 0x416cb41000000000, 0x81089c0700000000, 0xc1a5e43e00000000, + 0x01c1cc2900000000, 0x41ff154c00000000, 0x819b3d5b00000000, + 0xc136456200000000, 0x01526d7500000000, 0xc3929f8800000000, + 0x03f6b79f00000000, 0x435bcfa600000000, 0x833fe7b100000000, + 0xc3013ed400000000, 0x036516c300000000, 0x43c86efa00000000, + 0x83ac46ed00000000, 0xc3b4dc3100000000, 0x03d0f42600000000, + 0x437d8c1f00000000, 0x8319a40800000000, 0xc3277d6d00000000, + 0x0343557a00000000, 0x43ee2d4300000000, 0x838a055400000000, + 0x82d8682100000000, 0x42bc403600000000, 0x0211380f00000000, + 0xc275101800000000, 0x824bc97d00000000, 0x422fe16a00000000, + 0x0282995300000000, 0xc2e6b14400000000, 0x82fe2b9800000000, + 0x429a038f00000000, 0x02377bb600000000, 0xc25353a100000000, + 0x826d8ac400000000, 0x4209a2d300000000, 0x02a4daea00000000, + 0xc2c0f2fd00000000, 0xc7234eca00000000, 0x074766dd00000000, + 0x47ea1ee400000000, 0x878e36f300000000, 0xc7b0ef9600000000, + 0x07d4c78100000000, 0x4779bfb800000000, 0x871d97af00000000, + 0xc7050d7300000000, 0x0761256400000000, 0x47cc5d5d00000000, + 0x87a8754a00000000, 0xc796ac2f00000000, 0x07f2843800000000, + 0x475ffc0100000000, 0x873bd41600000000, 0x8669b96300000000, + 0x460d917400000000, 0x06a0e94d00000000, 0xc6c4c15a00000000, + 0x86fa183f00000000, 0x469e302800000000, 0x0633481100000000, + 0xc657600600000000, 0x864ffada00000000, 0x462bd2cd00000000, + 0x0686aaf400000000, 0xc6e282e300000000, 0x86dc5b8600000000, + 0x46b8739100000000, 0x06150ba800000000, 0xc67123bf00000000, + 0x04b1d14200000000, 0xc4d5f95500000000, 0x8478816c00000000, + 0x441ca97b00000000, 0x0422701e00000000, 0xc446580900000000, + 0x84eb203000000000, 0x448f082700000000, 0x049792fb00000000, + 0xc4f3baec00000000, 0x845ec2d500000000, 0x443aeac200000000, + 0x040433a700000000, 0xc4601bb000000000, 0x84cd638900000000, + 0x44a94b9e00000000, 0x45fb26eb00000000, 0x859f0efc00000000, + 0xc53276c500000000, 0x05565ed200000000, 0x456887b700000000, + 0x850cafa000000000, 0xc5a1d79900000000, 0x05c5ff8e00000000, + 0x45dd655200000000, 0x85b94d4500000000, 0xc514357c00000000, + 0x05701d6b00000000, 0x454ec40e00000000, 0x852aec1900000000, + 0xc587942000000000, 0x05e3bc3700000000, 0xcf41ed4f00000000, + 0x0f25c55800000000, 0x4f88bd6100000000, 0x8fec957600000000, + 0xcfd24c1300000000, 0x0fb6640400000000, 0x4f1b1c3d00000000, + 0x8f7f342a00000000, 0xcf67aef600000000, 0x0f0386e100000000, + 0x4faefed800000000, 0x8fcad6cf00000000, 0xcff40faa00000000, + 0x0f9027bd00000000, 0x4f3d5f8400000000, 0x8f59779300000000, + 0x8e0b1ae600000000, 0x4e6f32f100000000, 0x0ec24ac800000000, + 0xcea662df00000000, 0x8e98bbba00000000, 0x4efc93ad00000000, + 0x0e51eb9400000000, 0xce35c38300000000, 0x8e2d595f00000000, + 0x4e49714800000000, 0x0ee4097100000000, 0xce80216600000000, + 0x8ebef80300000000, 0x4edad01400000000, 0x0e77a82d00000000, + 0xce13803a00000000, 0x0cd372c700000000, 0xccb75ad000000000, + 0x8c1a22e900000000, 0x4c7e0afe00000000, 0x0c40d39b00000000, + 0xcc24fb8c00000000, 0x8c8983b500000000, 0x4cedaba200000000, + 0x0cf5317e00000000, 0xcc91196900000000, 0x8c3c615000000000, + 0x4c58494700000000, 0x0c66902200000000, 0xcc02b83500000000, + 0x8cafc00c00000000, 0x4ccbe81b00000000, 0x4d99856e00000000, + 0x8dfdad7900000000, 0xcd50d54000000000, 0x0d34fd5700000000, + 0x4d0a243200000000, 0x8d6e0c2500000000, 0xcdc3741c00000000, + 0x0da75c0b00000000, 0x4dbfc6d700000000, 0x8ddbeec000000000, + 0xcd7696f900000000, 0x0d12beee00000000, 0x4d2c678b00000000, + 0x8d484f9c00000000, 0xcde537a500000000, 0x0d811fb200000000, + 0x0862a38500000000, 0xc8068b9200000000, 0x88abf3ab00000000, + 0x48cfdbbc00000000, 0x08f102d900000000, 0xc8952ace00000000, + 0x883852f700000000, 0x485c7ae000000000, 0x0844e03c00000000, + 0xc820c82b00000000, 0x888db01200000000, 0x48e9980500000000, + 0x08d7416000000000, 0xc8b3697700000000, 0x881e114e00000000, + 0x487a395900000000, 0x4928542c00000000, 0x894c7c3b00000000, + 0xc9e1040200000000, 0x09852c1500000000, 0x49bbf57000000000, + 0x89dfdd6700000000, 0xc972a55e00000000, 0x09168d4900000000, + 0x490e179500000000, 0x896a3f8200000000, 0xc9c747bb00000000, + 0x09a36fac00000000, 0x499db6c900000000, 0x89f99ede00000000, + 0xc954e6e700000000, 0x0930cef000000000, 0xcbf03c0d00000000, + 0x0b94141a00000000, 0x4b396c2300000000, 0x8b5d443400000000, + 0xcb639d5100000000, 0x0b07b54600000000, 0x4baacd7f00000000, + 0x8bcee56800000000, 0xcbd67fb400000000, 0x0bb257a300000000, + 0x4b1f2f9a00000000, 0x8b7b078d00000000, 0xcb45dee800000000, + 0x0b21f6ff00000000, 0x4b8c8ec600000000, 0x8be8a6d100000000, + 0x8abacba400000000, 0x4adee3b300000000, 0x0a739b8a00000000, + 0xca17b39d00000000, 0x8a296af800000000, 0x4a4d42ef00000000, + 0x0ae03ad600000000, 0xca8412c100000000, 0x8a9c881d00000000, + 0x4af8a00a00000000, 0x0a55d83300000000, 0xca31f02400000000, + 0x8a0f294100000000, 0x4a6b015600000000, 0x0ac6796f00000000, + 0xcaa2517800000000}, + {0x0000000000000000, 0xd4ea739b00000000, 0xe9d396ed00000000, + 0x3d39e57600000000, 0x93a15c0000000000, 0x474b2f9b00000000, + 0x7a72caed00000000, 0xae98b97600000000, 0x2643b90000000000, + 0xf2a9ca9b00000000, 0xcf902fed00000000, 0x1b7a5c7600000000, + 0xb5e2e50000000000, 0x6108969b00000000, 0x5c3173ed00000000, + 0x88db007600000000, 0x4c86720100000000, 0x986c019a00000000, + 0xa555e4ec00000000, 0x71bf977700000000, 0xdf272e0100000000, + 0x0bcd5d9a00000000, 0x36f4b8ec00000000, 0xe21ecb7700000000, + 0x6ac5cb0100000000, 0xbe2fb89a00000000, 0x83165dec00000000, + 0x57fc2e7700000000, 0xf964970100000000, 0x2d8ee49a00000000, + 0x10b701ec00000000, 0xc45d727700000000, 0x980ce50200000000, + 0x4ce6969900000000, 0x71df73ef00000000, 0xa535007400000000, + 0x0badb90200000000, 0xdf47ca9900000000, 0xe27e2fef00000000, + 0x36945c7400000000, 0xbe4f5c0200000000, 0x6aa52f9900000000, + 0x579ccaef00000000, 0x8376b97400000000, 0x2dee000200000000, + 0xf904739900000000, 0xc43d96ef00000000, 0x10d7e57400000000, + 0xd48a970300000000, 0x0060e49800000000, 0x3d5901ee00000000, + 0xe9b3727500000000, 0x472bcb0300000000, 0x93c1b89800000000, + 0xaef85dee00000000, 0x7a122e7500000000, 0xf2c92e0300000000, + 0x26235d9800000000, 0x1b1ab8ee00000000, 0xcff0cb7500000000, + 0x6168720300000000, 0xb582019800000000, 0x88bbe4ee00000000, + 0x5c51977500000000, 0x3019ca0500000000, 0xe4f3b99e00000000, + 0xd9ca5ce800000000, 0x0d202f7300000000, 0xa3b8960500000000, + 0x7752e59e00000000, 0x4a6b00e800000000, 0x9e81737300000000, + 0x165a730500000000, 0xc2b0009e00000000, 0xff89e5e800000000, + 0x2b63967300000000, 0x85fb2f0500000000, 0x51115c9e00000000, + 0x6c28b9e800000000, 0xb8c2ca7300000000, 0x7c9fb80400000000, + 0xa875cb9f00000000, 0x954c2ee900000000, 0x41a65d7200000000, + 0xef3ee40400000000, 0x3bd4979f00000000, 0x06ed72e900000000, + 0xd207017200000000, 0x5adc010400000000, 0x8e36729f00000000, + 0xb30f97e900000000, 0x67e5e47200000000, 0xc97d5d0400000000, + 0x1d972e9f00000000, 0x20aecbe900000000, 0xf444b87200000000, + 0xa8152f0700000000, 0x7cff5c9c00000000, 0x41c6b9ea00000000, + 0x952cca7100000000, 0x3bb4730700000000, 0xef5e009c00000000, + 0xd267e5ea00000000, 0x068d967100000000, 0x8e56960700000000, + 0x5abce59c00000000, 0x678500ea00000000, 0xb36f737100000000, + 0x1df7ca0700000000, 0xc91db99c00000000, 0xf4245cea00000000, + 0x20ce2f7100000000, 0xe4935d0600000000, 0x30792e9d00000000, + 0x0d40cbeb00000000, 0xd9aab87000000000, 0x7732010600000000, + 0xa3d8729d00000000, 0x9ee197eb00000000, 0x4a0be47000000000, + 0xc2d0e40600000000, 0x163a979d00000000, 0x2b0372eb00000000, + 0xffe9017000000000, 0x5171b80600000000, 0x859bcb9d00000000, + 0xb8a22eeb00000000, 0x6c485d7000000000, 0x6032940b00000000, + 0xb4d8e79000000000, 0x89e102e600000000, 0x5d0b717d00000000, + 0xf393c80b00000000, 0x2779bb9000000000, 0x1a405ee600000000, + 0xceaa2d7d00000000, 0x46712d0b00000000, 0x929b5e9000000000, + 0xafa2bbe600000000, 0x7b48c87d00000000, 0xd5d0710b00000000, + 0x013a029000000000, 0x3c03e7e600000000, 0xe8e9947d00000000, + 0x2cb4e60a00000000, 0xf85e959100000000, 0xc56770e700000000, + 0x118d037c00000000, 0xbf15ba0a00000000, 0x6bffc99100000000, + 0x56c62ce700000000, 0x822c5f7c00000000, 0x0af75f0a00000000, + 0xde1d2c9100000000, 0xe324c9e700000000, 0x37ceba7c00000000, + 0x9956030a00000000, 0x4dbc709100000000, 0x708595e700000000, + 0xa46fe67c00000000, 0xf83e710900000000, 0x2cd4029200000000, + 0x11ede7e400000000, 0xc507947f00000000, 0x6b9f2d0900000000, + 0xbf755e9200000000, 0x824cbbe400000000, 0x56a6c87f00000000, + 0xde7dc80900000000, 0x0a97bb9200000000, 0x37ae5ee400000000, + 0xe3442d7f00000000, 0x4ddc940900000000, 0x9936e79200000000, + 0xa40f02e400000000, 0x70e5717f00000000, 0xb4b8030800000000, + 0x6052709300000000, 0x5d6b95e500000000, 0x8981e67e00000000, + 0x27195f0800000000, 0xf3f32c9300000000, 0xcecac9e500000000, + 0x1a20ba7e00000000, 0x92fbba0800000000, 0x4611c99300000000, + 0x7b282ce500000000, 0xafc25f7e00000000, 0x015ae60800000000, + 0xd5b0959300000000, 0xe88970e500000000, 0x3c63037e00000000, + 0x502b5e0e00000000, 0x84c12d9500000000, 0xb9f8c8e300000000, + 0x6d12bb7800000000, 0xc38a020e00000000, 0x1760719500000000, + 0x2a5994e300000000, 0xfeb3e77800000000, 0x7668e70e00000000, + 0xa282949500000000, 0x9fbb71e300000000, 0x4b51027800000000, + 0xe5c9bb0e00000000, 0x3123c89500000000, 0x0c1a2de300000000, + 0xd8f05e7800000000, 0x1cad2c0f00000000, 0xc8475f9400000000, + 0xf57ebae200000000, 0x2194c97900000000, 0x8f0c700f00000000, + 0x5be6039400000000, 0x66dfe6e200000000, 0xb235957900000000, + 0x3aee950f00000000, 0xee04e69400000000, 0xd33d03e200000000, + 0x07d7707900000000, 0xa94fc90f00000000, 0x7da5ba9400000000, + 0x409c5fe200000000, 0x94762c7900000000, 0xc827bb0c00000000, + 0x1ccdc89700000000, 0x21f42de100000000, 0xf51e5e7a00000000, + 0x5b86e70c00000000, 0x8f6c949700000000, 0xb25571e100000000, + 0x66bf027a00000000, 0xee64020c00000000, 0x3a8e719700000000, + 0x07b794e100000000, 0xd35de77a00000000, 0x7dc55e0c00000000, + 0xa92f2d9700000000, 0x9416c8e100000000, 0x40fcbb7a00000000, + 0x84a1c90d00000000, 0x504bba9600000000, 0x6d725fe000000000, + 0xb9982c7b00000000, 0x1700950d00000000, 0xc3eae69600000000, + 0xfed303e000000000, 0x2a39707b00000000, 0xa2e2700d00000000, + 0x7608039600000000, 0x4b31e6e000000000, 0x9fdb957b00000000, + 0x31432c0d00000000, 0xe5a95f9600000000, 0xd890bae000000000, + 0x0c7ac97b00000000}, + {0x0000000000000000, 0x2765258100000000, 0x0fcc3bd900000000, + 0x28a91e5800000000, 0x5f9e066900000000, 0x78fb23e800000000, + 0x50523db000000000, 0x7737183100000000, 0xbe3c0dd200000000, + 0x9959285300000000, 0xb1f0360b00000000, 0x9695138a00000000, + 0xe1a20bbb00000000, 0xc6c72e3a00000000, 0xee6e306200000000, + 0xc90b15e300000000, 0x3d7f6b7f00000000, 0x1a1a4efe00000000, + 0x32b350a600000000, 0x15d6752700000000, 0x62e16d1600000000, + 0x4584489700000000, 0x6d2d56cf00000000, 0x4a48734e00000000, + 0x834366ad00000000, 0xa426432c00000000, 0x8c8f5d7400000000, + 0xabea78f500000000, 0xdcdd60c400000000, 0xfbb8454500000000, + 0xd3115b1d00000000, 0xf4747e9c00000000, 0x7afed6fe00000000, + 0x5d9bf37f00000000, 0x7532ed2700000000, 0x5257c8a600000000, + 0x2560d09700000000, 0x0205f51600000000, 0x2aaceb4e00000000, + 0x0dc9cecf00000000, 0xc4c2db2c00000000, 0xe3a7fead00000000, + 0xcb0ee0f500000000, 0xec6bc57400000000, 0x9b5cdd4500000000, + 0xbc39f8c400000000, 0x9490e69c00000000, 0xb3f5c31d00000000, + 0x4781bd8100000000, 0x60e4980000000000, 0x484d865800000000, + 0x6f28a3d900000000, 0x181fbbe800000000, 0x3f7a9e6900000000, + 0x17d3803100000000, 0x30b6a5b000000000, 0xf9bdb05300000000, + 0xded895d200000000, 0xf6718b8a00000000, 0xd114ae0b00000000, + 0xa623b63a00000000, 0x814693bb00000000, 0xa9ef8de300000000, + 0x8e8aa86200000000, 0xb5fadc2600000000, 0x929ff9a700000000, + 0xba36e7ff00000000, 0x9d53c27e00000000, 0xea64da4f00000000, + 0xcd01ffce00000000, 0xe5a8e19600000000, 0xc2cdc41700000000, + 0x0bc6d1f400000000, 0x2ca3f47500000000, 0x040aea2d00000000, + 0x236fcfac00000000, 0x5458d79d00000000, 0x733df21c00000000, + 0x5b94ec4400000000, 0x7cf1c9c500000000, 0x8885b75900000000, + 0xafe092d800000000, 0x87498c8000000000, 0xa02ca90100000000, + 0xd71bb13000000000, 0xf07e94b100000000, 0xd8d78ae900000000, + 0xffb2af6800000000, 0x36b9ba8b00000000, 0x11dc9f0a00000000, + 0x3975815200000000, 0x1e10a4d300000000, 0x6927bce200000000, + 0x4e42996300000000, 0x66eb873b00000000, 0x418ea2ba00000000, + 0xcf040ad800000000, 0xe8612f5900000000, 0xc0c8310100000000, + 0xe7ad148000000000, 0x909a0cb100000000, 0xb7ff293000000000, + 0x9f56376800000000, 0xb83312e900000000, 0x7138070a00000000, + 0x565d228b00000000, 0x7ef43cd300000000, 0x5991195200000000, + 0x2ea6016300000000, 0x09c324e200000000, 0x216a3aba00000000, + 0x060f1f3b00000000, 0xf27b61a700000000, 0xd51e442600000000, + 0xfdb75a7e00000000, 0xdad27fff00000000, 0xade567ce00000000, + 0x8a80424f00000000, 0xa2295c1700000000, 0x854c799600000000, + 0x4c476c7500000000, 0x6b2249f400000000, 0x438b57ac00000000, + 0x64ee722d00000000, 0x13d96a1c00000000, 0x34bc4f9d00000000, + 0x1c1551c500000000, 0x3b70744400000000, 0x6af5b94d00000000, + 0x4d909ccc00000000, 0x6539829400000000, 0x425ca71500000000, + 0x356bbf2400000000, 0x120e9aa500000000, 0x3aa784fd00000000, + 0x1dc2a17c00000000, 0xd4c9b49f00000000, 0xf3ac911e00000000, + 0xdb058f4600000000, 0xfc60aac700000000, 0x8b57b2f600000000, + 0xac32977700000000, 0x849b892f00000000, 0xa3feacae00000000, + 0x578ad23200000000, 0x70eff7b300000000, 0x5846e9eb00000000, + 0x7f23cc6a00000000, 0x0814d45b00000000, 0x2f71f1da00000000, + 0x07d8ef8200000000, 0x20bdca0300000000, 0xe9b6dfe000000000, + 0xced3fa6100000000, 0xe67ae43900000000, 0xc11fc1b800000000, + 0xb628d98900000000, 0x914dfc0800000000, 0xb9e4e25000000000, + 0x9e81c7d100000000, 0x100b6fb300000000, 0x376e4a3200000000, + 0x1fc7546a00000000, 0x38a271eb00000000, 0x4f9569da00000000, + 0x68f04c5b00000000, 0x4059520300000000, 0x673c778200000000, + 0xae37626100000000, 0x895247e000000000, 0xa1fb59b800000000, + 0x869e7c3900000000, 0xf1a9640800000000, 0xd6cc418900000000, + 0xfe655fd100000000, 0xd9007a5000000000, 0x2d7404cc00000000, + 0x0a11214d00000000, 0x22b83f1500000000, 0x05dd1a9400000000, + 0x72ea02a500000000, 0x558f272400000000, 0x7d26397c00000000, + 0x5a431cfd00000000, 0x9348091e00000000, 0xb42d2c9f00000000, + 0x9c8432c700000000, 0xbbe1174600000000, 0xccd60f7700000000, + 0xebb32af600000000, 0xc31a34ae00000000, 0xe47f112f00000000, + 0xdf0f656b00000000, 0xf86a40ea00000000, 0xd0c35eb200000000, + 0xf7a67b3300000000, 0x8091630200000000, 0xa7f4468300000000, + 0x8f5d58db00000000, 0xa8387d5a00000000, 0x613368b900000000, + 0x46564d3800000000, 0x6eff536000000000, 0x499a76e100000000, + 0x3ead6ed000000000, 0x19c84b5100000000, 0x3161550900000000, + 0x1604708800000000, 0xe2700e1400000000, 0xc5152b9500000000, + 0xedbc35cd00000000, 0xcad9104c00000000, 0xbdee087d00000000, + 0x9a8b2dfc00000000, 0xb22233a400000000, 0x9547162500000000, + 0x5c4c03c600000000, 0x7b29264700000000, 0x5380381f00000000, + 0x74e51d9e00000000, 0x03d205af00000000, 0x24b7202e00000000, + 0x0c1e3e7600000000, 0x2b7b1bf700000000, 0xa5f1b39500000000, + 0x8294961400000000, 0xaa3d884c00000000, 0x8d58adcd00000000, + 0xfa6fb5fc00000000, 0xdd0a907d00000000, 0xf5a38e2500000000, + 0xd2c6aba400000000, 0x1bcdbe4700000000, 0x3ca89bc600000000, + 0x1401859e00000000, 0x3364a01f00000000, 0x4453b82e00000000, + 0x63369daf00000000, 0x4b9f83f700000000, 0x6cfaa67600000000, + 0x988ed8ea00000000, 0xbfebfd6b00000000, 0x9742e33300000000, + 0xb027c6b200000000, 0xc710de8300000000, 0xe075fb0200000000, + 0xc8dce55a00000000, 0xefb9c0db00000000, 0x26b2d53800000000, + 0x01d7f0b900000000, 0x297eeee100000000, 0x0e1bcb6000000000, + 0x792cd35100000000, 0x5e49f6d000000000, 0x76e0e88800000000, + 0x5185cd0900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43147b17, 0x8628f62e, 0xc53c8d39, 0x0c51ec5d, + 0x4f45974a, 0x8a791a73, 0xc96d6164, 0x18a2d8bb, 0x5bb6a3ac, + 0x9e8a2e95, 0xdd9e5582, 0x14f334e6, 0x57e74ff1, 0x92dbc2c8, + 0xd1cfb9df, 0x7142c0ac, 0x3256bbbb, 0xf76a3682, 0xb47e4d95, + 0x7d132cf1, 0x3e0757e6, 0xfb3bdadf, 0xb82fa1c8, 0x69e01817, + 0x2af46300, 0xefc8ee39, 0xacdc952e, 0x65b1f44a, 0x26a58f5d, + 0xe3990264, 0xa08d7973, 0xa382f182, 0xe0968a95, 0x25aa07ac, + 0x66be7cbb, 0xafd31ddf, 0xecc766c8, 0x29fbebf1, 0x6aef90e6, + 0xbb202939, 0xf834522e, 0x3d08df17, 0x7e1ca400, 0xb771c564, + 0xf465be73, 0x3159334a, 0x724d485d, 0xd2c0312e, 0x91d44a39, + 0x54e8c700, 0x17fcbc17, 0xde91dd73, 0x9d85a664, 0x58b92b5d, + 0x1bad504a, 0xca62e995, 0x89769282, 0x4c4a1fbb, 0x0f5e64ac, + 0xc63305c8, 0x85277edf, 0x401bf3e6, 0x030f88f1, 0x070392de, + 0x4417e9c9, 0x812b64f0, 0xc23f1fe7, 0x0b527e83, 0x48460594, + 0x8d7a88ad, 0xce6ef3ba, 0x1fa14a65, 0x5cb53172, 0x9989bc4b, + 0xda9dc75c, 0x13f0a638, 0x50e4dd2f, 0x95d85016, 0xd6cc2b01, + 0x76415272, 0x35552965, 0xf069a45c, 0xb37ddf4b, 0x7a10be2f, + 0x3904c538, 0xfc384801, 0xbf2c3316, 0x6ee38ac9, 0x2df7f1de, + 0xe8cb7ce7, 0xabdf07f0, 0x62b26694, 0x21a61d83, 0xe49a90ba, + 0xa78eebad, 0xa481635c, 0xe795184b, 0x22a99572, 0x61bdee65, + 0xa8d08f01, 0xebc4f416, 0x2ef8792f, 0x6dec0238, 0xbc23bbe7, + 0xff37c0f0, 0x3a0b4dc9, 0x791f36de, 0xb07257ba, 0xf3662cad, + 0x365aa194, 0x754eda83, 0xd5c3a3f0, 0x96d7d8e7, 0x53eb55de, + 0x10ff2ec9, 0xd9924fad, 0x9a8634ba, 0x5fbab983, 0x1caec294, + 0xcd617b4b, 0x8e75005c, 0x4b498d65, 0x085df672, 0xc1309716, + 0x8224ec01, 0x47186138, 0x040c1a2f, 0x4f005566, 0x0c142e71, + 0xc928a348, 0x8a3cd85f, 0x4351b93b, 0x0045c22c, 0xc5794f15, + 0x866d3402, 0x57a28ddd, 0x14b6f6ca, 0xd18a7bf3, 0x929e00e4, + 0x5bf36180, 0x18e71a97, 0xdddb97ae, 0x9ecfecb9, 0x3e4295ca, + 0x7d56eedd, 0xb86a63e4, 0xfb7e18f3, 0x32137997, 0x71070280, + 0xb43b8fb9, 0xf72ff4ae, 0x26e04d71, 0x65f43666, 0xa0c8bb5f, + 0xe3dcc048, 0x2ab1a12c, 0x69a5da3b, 0xac995702, 0xef8d2c15, + 0xec82a4e4, 0xaf96dff3, 0x6aaa52ca, 0x29be29dd, 0xe0d348b9, + 0xa3c733ae, 0x66fbbe97, 0x25efc580, 0xf4207c5f, 0xb7340748, + 0x72088a71, 0x311cf166, 0xf8719002, 0xbb65eb15, 0x7e59662c, + 0x3d4d1d3b, 0x9dc06448, 0xded41f5f, 0x1be89266, 0x58fce971, + 0x91918815, 0xd285f302, 0x17b97e3b, 0x54ad052c, 0x8562bcf3, + 0xc676c7e4, 0x034a4add, 0x405e31ca, 0x893350ae, 0xca272bb9, + 0x0f1ba680, 0x4c0fdd97, 0x4803c7b8, 0x0b17bcaf, 0xce2b3196, + 0x8d3f4a81, 0x44522be5, 0x074650f2, 0xc27addcb, 0x816ea6dc, + 0x50a11f03, 0x13b56414, 0xd689e92d, 0x959d923a, 0x5cf0f35e, + 0x1fe48849, 0xdad80570, 0x99cc7e67, 0x39410714, 0x7a557c03, + 0xbf69f13a, 0xfc7d8a2d, 0x3510eb49, 0x7604905e, 0xb3381d67, + 0xf02c6670, 0x21e3dfaf, 0x62f7a4b8, 0xa7cb2981, 0xe4df5296, + 0x2db233f2, 0x6ea648e5, 0xab9ac5dc, 0xe88ebecb, 0xeb81363a, + 0xa8954d2d, 0x6da9c014, 0x2ebdbb03, 0xe7d0da67, 0xa4c4a170, + 0x61f82c49, 0x22ec575e, 0xf323ee81, 0xb0379596, 0x750b18af, + 0x361f63b8, 0xff7202dc, 0xbc6679cb, 0x795af4f2, 0x3a4e8fe5, + 0x9ac3f696, 0xd9d78d81, 0x1ceb00b8, 0x5fff7baf, 0x96921acb, + 0xd58661dc, 0x10baece5, 0x53ae97f2, 0x82612e2d, 0xc175553a, + 0x0449d803, 0x475da314, 0x8e30c270, 0xcd24b967, 0x0818345e, + 0x4b0c4f49}, + {0x00000000, 0x3e6bc2ef, 0x3dd0f504, 0x03bb37eb, 0x7aa0eb09, + 0x44cb29e6, 0x47701e0d, 0x791bdce2, 0xf440d713, 0xca2b15fc, + 0xc9902217, 0xf7fbe0f8, 0x8ee03c1a, 0xb08bfef5, 0xb330c91e, + 0x8d5b0bf1, 0xe881ae27, 0xd6ea6cc8, 0xd5515b23, 0xeb3a99cc, + 0x9221452e, 0xac4a87c1, 0xaff1b02a, 0x919a72c5, 0x1cc17934, + 0x22aabbdb, 0x21118c30, 0x1f7a4edf, 0x6661923d, 0x580a50d2, + 0x5bb16739, 0x65daa5d6, 0xd0035d4f, 0xee689fa0, 0xedd3a84b, + 0xd3b86aa4, 0xaaa3b646, 0x94c874a9, 0x97734342, 0xa91881ad, + 0x24438a5c, 0x1a2848b3, 0x19937f58, 0x27f8bdb7, 0x5ee36155, + 0x6088a3ba, 0x63339451, 0x5d5856be, 0x3882f368, 0x06e93187, + 0x0552066c, 0x3b39c483, 0x42221861, 0x7c49da8e, 0x7ff2ed65, + 0x41992f8a, 0xccc2247b, 0xf2a9e694, 0xf112d17f, 0xcf791390, + 0xb662cf72, 0x88090d9d, 0x8bb23a76, 0xb5d9f899, 0xa007ba9e, + 0x9e6c7871, 0x9dd74f9a, 0xa3bc8d75, 0xdaa75197, 0xe4cc9378, + 0xe777a493, 0xd91c667c, 0x54476d8d, 0x6a2caf62, 0x69979889, + 0x57fc5a66, 0x2ee78684, 0x108c446b, 0x13377380, 0x2d5cb16f, + 0x488614b9, 0x76edd656, 0x7556e1bd, 0x4b3d2352, 0x3226ffb0, + 0x0c4d3d5f, 0x0ff60ab4, 0x319dc85b, 0xbcc6c3aa, 0x82ad0145, + 0x811636ae, 0xbf7df441, 0xc66628a3, 0xf80dea4c, 0xfbb6dda7, + 0xc5dd1f48, 0x7004e7d1, 0x4e6f253e, 0x4dd412d5, 0x73bfd03a, + 0x0aa40cd8, 0x34cfce37, 0x3774f9dc, 0x091f3b33, 0x844430c2, + 0xba2ff22d, 0xb994c5c6, 0x87ff0729, 0xfee4dbcb, 0xc08f1924, + 0xc3342ecf, 0xfd5fec20, 0x988549f6, 0xa6ee8b19, 0xa555bcf2, + 0x9b3e7e1d, 0xe225a2ff, 0xdc4e6010, 0xdff557fb, 0xe19e9514, + 0x6cc59ee5, 0x52ae5c0a, 0x51156be1, 0x6f7ea90e, 0x166575ec, + 0x280eb703, 0x2bb580e8, 0x15de4207, 0x010905e6, 0x3f62c709, + 0x3cd9f0e2, 0x02b2320d, 0x7ba9eeef, 0x45c22c00, 0x46791beb, + 0x7812d904, 0xf549d2f5, 0xcb22101a, 0xc89927f1, 0xf6f2e51e, + 0x8fe939fc, 0xb182fb13, 0xb239ccf8, 0x8c520e17, 0xe988abc1, + 0xd7e3692e, 0xd4585ec5, 0xea339c2a, 0x932840c8, 0xad438227, + 0xaef8b5cc, 0x90937723, 0x1dc87cd2, 0x23a3be3d, 0x201889d6, + 0x1e734b39, 0x676897db, 0x59035534, 0x5ab862df, 0x64d3a030, + 0xd10a58a9, 0xef619a46, 0xecdaadad, 0xd2b16f42, 0xabaab3a0, + 0x95c1714f, 0x967a46a4, 0xa811844b, 0x254a8fba, 0x1b214d55, + 0x189a7abe, 0x26f1b851, 0x5fea64b3, 0x6181a65c, 0x623a91b7, + 0x5c515358, 0x398bf68e, 0x07e03461, 0x045b038a, 0x3a30c165, + 0x432b1d87, 0x7d40df68, 0x7efbe883, 0x40902a6c, 0xcdcb219d, + 0xf3a0e372, 0xf01bd499, 0xce701676, 0xb76bca94, 0x8900087b, + 0x8abb3f90, 0xb4d0fd7f, 0xa10ebf78, 0x9f657d97, 0x9cde4a7c, + 0xa2b58893, 0xdbae5471, 0xe5c5969e, 0xe67ea175, 0xd815639a, + 0x554e686b, 0x6b25aa84, 0x689e9d6f, 0x56f55f80, 0x2fee8362, + 0x1185418d, 0x123e7666, 0x2c55b489, 0x498f115f, 0x77e4d3b0, + 0x745fe45b, 0x4a3426b4, 0x332ffa56, 0x0d4438b9, 0x0eff0f52, + 0x3094cdbd, 0xbdcfc64c, 0x83a404a3, 0x801f3348, 0xbe74f1a7, + 0xc76f2d45, 0xf904efaa, 0xfabfd841, 0xc4d41aae, 0x710de237, + 0x4f6620d8, 0x4cdd1733, 0x72b6d5dc, 0x0bad093e, 0x35c6cbd1, + 0x367dfc3a, 0x08163ed5, 0x854d3524, 0xbb26f7cb, 0xb89dc020, + 0x86f602cf, 0xffedde2d, 0xc1861cc2, 0xc23d2b29, 0xfc56e9c6, + 0x998c4c10, 0xa7e78eff, 0xa45cb914, 0x9a377bfb, 0xe32ca719, + 0xdd4765f6, 0xdefc521d, 0xe09790f2, 0x6dcc9b03, 0x53a759ec, + 0x501c6e07, 0x6e77ace8, 0x176c700a, 0x2907b2e5, 0x2abc850e, + 0x14d747e1}, + {0x00000000, 0xc0df8ec1, 0xc1b96c58, 0x0166e299, 0x8273d9b0, + 0x42ac5771, 0x43cab5e8, 0x83153b29, 0x45e1c3ba, 0x853e4d7b, + 0x8458afe2, 0x44872123, 0xc7921a0a, 0x074d94cb, 0x062b7652, + 0xc6f4f893, 0xcbc4f6ae, 0x0b1b786f, 0x0a7d9af6, 0xcaa21437, + 0x49b72f1e, 0x8968a1df, 0x880e4346, 0x48d1cd87, 0x8e253514, + 0x4efabbd5, 0x4f9c594c, 0x8f43d78d, 0x0c56eca4, 0xcc896265, + 0xcdef80fc, 0x0d300e3d, 0xd78f9c86, 0x17501247, 0x1636f0de, + 0xd6e97e1f, 0x55fc4536, 0x9523cbf7, 0x9445296e, 0x549aa7af, + 0x926e5f3c, 0x52b1d1fd, 0x53d73364, 0x9308bda5, 0x101d868c, + 0xd0c2084d, 0xd1a4ead4, 0x117b6415, 0x1c4b6a28, 0xdc94e4e9, + 0xddf20670, 0x1d2d88b1, 0x9e38b398, 0x5ee73d59, 0x5f81dfc0, + 0x9f5e5101, 0x59aaa992, 0x99752753, 0x9813c5ca, 0x58cc4b0b, + 0xdbd97022, 0x1b06fee3, 0x1a601c7a, 0xdabf92bb, 0xef1948d6, + 0x2fc6c617, 0x2ea0248e, 0xee7faa4f, 0x6d6a9166, 0xadb51fa7, + 0xacd3fd3e, 0x6c0c73ff, 0xaaf88b6c, 0x6a2705ad, 0x6b41e734, + 0xab9e69f5, 0x288b52dc, 0xe854dc1d, 0xe9323e84, 0x29edb045, + 0x24ddbe78, 0xe40230b9, 0xe564d220, 0x25bb5ce1, 0xa6ae67c8, + 0x6671e909, 0x67170b90, 0xa7c88551, 0x613c7dc2, 0xa1e3f303, + 0xa085119a, 0x605a9f5b, 0xe34fa472, 0x23902ab3, 0x22f6c82a, + 0xe22946eb, 0x3896d450, 0xf8495a91, 0xf92fb808, 0x39f036c9, + 0xbae50de0, 0x7a3a8321, 0x7b5c61b8, 0xbb83ef79, 0x7d7717ea, + 0xbda8992b, 0xbcce7bb2, 0x7c11f573, 0xff04ce5a, 0x3fdb409b, + 0x3ebda202, 0xfe622cc3, 0xf35222fe, 0x338dac3f, 0x32eb4ea6, + 0xf234c067, 0x7121fb4e, 0xb1fe758f, 0xb0989716, 0x704719d7, + 0xb6b3e144, 0x766c6f85, 0x770a8d1c, 0xb7d503dd, 0x34c038f4, + 0xf41fb635, 0xf57954ac, 0x35a6da6d, 0x9f35e177, 0x5fea6fb6, + 0x5e8c8d2f, 0x9e5303ee, 0x1d4638c7, 0xdd99b606, 0xdcff549f, + 0x1c20da5e, 0xdad422cd, 0x1a0bac0c, 0x1b6d4e95, 0xdbb2c054, + 0x58a7fb7d, 0x987875bc, 0x991e9725, 0x59c119e4, 0x54f117d9, + 0x942e9918, 0x95487b81, 0x5597f540, 0xd682ce69, 0x165d40a8, + 0x173ba231, 0xd7e42cf0, 0x1110d463, 0xd1cf5aa2, 0xd0a9b83b, + 0x107636fa, 0x93630dd3, 0x53bc8312, 0x52da618b, 0x9205ef4a, + 0x48ba7df1, 0x8865f330, 0x890311a9, 0x49dc9f68, 0xcac9a441, + 0x0a162a80, 0x0b70c819, 0xcbaf46d8, 0x0d5bbe4b, 0xcd84308a, + 0xcce2d213, 0x0c3d5cd2, 0x8f2867fb, 0x4ff7e93a, 0x4e910ba3, + 0x8e4e8562, 0x837e8b5f, 0x43a1059e, 0x42c7e707, 0x821869c6, + 0x010d52ef, 0xc1d2dc2e, 0xc0b43eb7, 0x006bb076, 0xc69f48e5, + 0x0640c624, 0x072624bd, 0xc7f9aa7c, 0x44ec9155, 0x84331f94, + 0x8555fd0d, 0x458a73cc, 0x702ca9a1, 0xb0f32760, 0xb195c5f9, + 0x714a4b38, 0xf25f7011, 0x3280fed0, 0x33e61c49, 0xf3399288, + 0x35cd6a1b, 0xf512e4da, 0xf4740643, 0x34ab8882, 0xb7beb3ab, + 0x77613d6a, 0x7607dff3, 0xb6d85132, 0xbbe85f0f, 0x7b37d1ce, + 0x7a513357, 0xba8ebd96, 0x399b86bf, 0xf944087e, 0xf822eae7, + 0x38fd6426, 0xfe099cb5, 0x3ed61274, 0x3fb0f0ed, 0xff6f7e2c, + 0x7c7a4505, 0xbca5cbc4, 0xbdc3295d, 0x7d1ca79c, 0xa7a33527, + 0x677cbbe6, 0x661a597f, 0xa6c5d7be, 0x25d0ec97, 0xe50f6256, + 0xe46980cf, 0x24b60e0e, 0xe242f69d, 0x229d785c, 0x23fb9ac5, + 0xe3241404, 0x60312f2d, 0xa0eea1ec, 0xa1884375, 0x6157cdb4, + 0x6c67c389, 0xacb84d48, 0xaddeafd1, 0x6d012110, 0xee141a39, + 0x2ecb94f8, 0x2fad7661, 0xef72f8a0, 0x29860033, 0xe9598ef2, + 0xe83f6c6b, 0x28e0e2aa, 0xabf5d983, 0x6b2a5742, 0x6a4cb5db, + 0xaa933b1a}, + {0x00000000, 0x6f4ca59b, 0x9f9e3bec, 0xf0d29e77, 0x7f3b0603, + 0x1077a398, 0xe0a53def, 0x8fe99874, 0xfe760c06, 0x913aa99d, + 0x61e837ea, 0x0ea49271, 0x814d0a05, 0xee01af9e, 0x1ed331e9, + 0x719f9472, 0xfced180c, 0x93a1bd97, 0x637323e0, 0x0c3f867b, + 0x83d61e0f, 0xec9abb94, 0x1c4825e3, 0x73048078, 0x029b140a, + 0x6dd7b191, 0x9d052fe6, 0xf2498a7d, 0x7da01209, 0x12ecb792, + 0xe23e29e5, 0x8d728c7e, 0xf8db3118, 0x97979483, 0x67450af4, + 0x0809af6f, 0x87e0371b, 0xe8ac9280, 0x187e0cf7, 0x7732a96c, + 0x06ad3d1e, 0x69e19885, 0x993306f2, 0xf67fa369, 0x79963b1d, + 0x16da9e86, 0xe60800f1, 0x8944a56a, 0x04362914, 0x6b7a8c8f, + 0x9ba812f8, 0xf4e4b763, 0x7b0d2f17, 0x14418a8c, 0xe49314fb, + 0x8bdfb160, 0xfa402512, 0x950c8089, 0x65de1efe, 0x0a92bb65, + 0x857b2311, 0xea37868a, 0x1ae518fd, 0x75a9bd66, 0xf0b76330, + 0x9ffbc6ab, 0x6f2958dc, 0x0065fd47, 0x8f8c6533, 0xe0c0c0a8, + 0x10125edf, 0x7f5efb44, 0x0ec16f36, 0x618dcaad, 0x915f54da, + 0xfe13f141, 0x71fa6935, 0x1eb6ccae, 0xee6452d9, 0x8128f742, + 0x0c5a7b3c, 0x6316dea7, 0x93c440d0, 0xfc88e54b, 0x73617d3f, + 0x1c2dd8a4, 0xecff46d3, 0x83b3e348, 0xf22c773a, 0x9d60d2a1, + 0x6db24cd6, 0x02fee94d, 0x8d177139, 0xe25bd4a2, 0x12894ad5, + 0x7dc5ef4e, 0x086c5228, 0x6720f7b3, 0x97f269c4, 0xf8becc5f, + 0x7757542b, 0x181bf1b0, 0xe8c96fc7, 0x8785ca5c, 0xf61a5e2e, + 0x9956fbb5, 0x698465c2, 0x06c8c059, 0x8921582d, 0xe66dfdb6, + 0x16bf63c1, 0x79f3c65a, 0xf4814a24, 0x9bcdefbf, 0x6b1f71c8, + 0x0453d453, 0x8bba4c27, 0xe4f6e9bc, 0x142477cb, 0x7b68d250, + 0x0af74622, 0x65bbe3b9, 0x95697dce, 0xfa25d855, 0x75cc4021, + 0x1a80e5ba, 0xea527bcd, 0x851ede56, 0xe06fc760, 0x8f2362fb, + 0x7ff1fc8c, 0x10bd5917, 0x9f54c163, 0xf01864f8, 0x00cafa8f, + 0x6f865f14, 0x1e19cb66, 0x71556efd, 0x8187f08a, 0xeecb5511, + 0x6122cd65, 0x0e6e68fe, 0xfebcf689, 0x91f05312, 0x1c82df6c, + 0x73ce7af7, 0x831ce480, 0xec50411b, 0x63b9d96f, 0x0cf57cf4, + 0xfc27e283, 0x936b4718, 0xe2f4d36a, 0x8db876f1, 0x7d6ae886, + 0x12264d1d, 0x9dcfd569, 0xf28370f2, 0x0251ee85, 0x6d1d4b1e, + 0x18b4f678, 0x77f853e3, 0x872acd94, 0xe866680f, 0x678ff07b, + 0x08c355e0, 0xf811cb97, 0x975d6e0c, 0xe6c2fa7e, 0x898e5fe5, + 0x795cc192, 0x16106409, 0x99f9fc7d, 0xf6b559e6, 0x0667c791, + 0x692b620a, 0xe459ee74, 0x8b154bef, 0x7bc7d598, 0x148b7003, + 0x9b62e877, 0xf42e4dec, 0x04fcd39b, 0x6bb07600, 0x1a2fe272, + 0x756347e9, 0x85b1d99e, 0xeafd7c05, 0x6514e471, 0x0a5841ea, + 0xfa8adf9d, 0x95c67a06, 0x10d8a450, 0x7f9401cb, 0x8f469fbc, + 0xe00a3a27, 0x6fe3a253, 0x00af07c8, 0xf07d99bf, 0x9f313c24, + 0xeeaea856, 0x81e20dcd, 0x713093ba, 0x1e7c3621, 0x9195ae55, + 0xfed90bce, 0x0e0b95b9, 0x61473022, 0xec35bc5c, 0x837919c7, + 0x73ab87b0, 0x1ce7222b, 0x930eba5f, 0xfc421fc4, 0x0c9081b3, + 0x63dc2428, 0x1243b05a, 0x7d0f15c1, 0x8ddd8bb6, 0xe2912e2d, + 0x6d78b659, 0x023413c2, 0xf2e68db5, 0x9daa282e, 0xe8039548, + 0x874f30d3, 0x779daea4, 0x18d10b3f, 0x9738934b, 0xf87436d0, + 0x08a6a8a7, 0x67ea0d3c, 0x1675994e, 0x79393cd5, 0x89eba2a2, + 0xe6a70739, 0x694e9f4d, 0x06023ad6, 0xf6d0a4a1, 0x999c013a, + 0x14ee8d44, 0x7ba228df, 0x8b70b6a8, 0xe43c1333, 0x6bd58b47, + 0x04992edc, 0xf44bb0ab, 0x9b071530, 0xea988142, 0x85d424d9, + 0x7506baae, 0x1a4a1f35, 0x95a38741, 0xfaef22da, 0x0a3dbcad, + 0x65711936}}; + +#endif + +#endif + +#if N == 4 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xf1da05aa, 0x38c50d15, 0xc91f08bf, 0x718a1a2a, + 0x80501f80, 0x494f173f, 0xb8951295, 0xe3143454, 0x12ce31fe, + 0xdbd13941, 0x2a0b3ceb, 0x929e2e7e, 0x63442bd4, 0xaa5b236b, + 0x5b8126c1, 0x1d596ee9, 0xec836b43, 0x259c63fc, 0xd4466656, + 0x6cd374c3, 0x9d097169, 0x541679d6, 0xa5cc7c7c, 0xfe4d5abd, + 0x0f975f17, 0xc68857a8, 0x37525202, 0x8fc74097, 0x7e1d453d, + 0xb7024d82, 0x46d84828, 0x3ab2ddd2, 0xcb68d878, 0x0277d0c7, + 0xf3add56d, 0x4b38c7f8, 0xbae2c252, 0x73fdcaed, 0x8227cf47, + 0xd9a6e986, 0x287cec2c, 0xe163e493, 0x10b9e139, 0xa82cf3ac, + 0x59f6f606, 0x90e9feb9, 0x6133fb13, 0x27ebb33b, 0xd631b691, + 0x1f2ebe2e, 0xeef4bb84, 0x5661a911, 0xa7bbacbb, 0x6ea4a404, + 0x9f7ea1ae, 0xc4ff876f, 0x352582c5, 0xfc3a8a7a, 0x0de08fd0, + 0xb5759d45, 0x44af98ef, 0x8db09050, 0x7c6a95fa, 0x7565bba4, + 0x84bfbe0e, 0x4da0b6b1, 0xbc7ab31b, 0x04efa18e, 0xf535a424, + 0x3c2aac9b, 0xcdf0a931, 0x96718ff0, 0x67ab8a5a, 0xaeb482e5, + 0x5f6e874f, 0xe7fb95da, 0x16219070, 0xdf3e98cf, 0x2ee49d65, + 0x683cd54d, 0x99e6d0e7, 0x50f9d858, 0xa123ddf2, 0x19b6cf67, + 0xe86ccacd, 0x2173c272, 0xd0a9c7d8, 0x8b28e119, 0x7af2e4b3, + 0xb3edec0c, 0x4237e9a6, 0xfaa2fb33, 0x0b78fe99, 0xc267f626, + 0x33bdf38c, 0x4fd76676, 0xbe0d63dc, 0x77126b63, 0x86c86ec9, + 0x3e5d7c5c, 0xcf8779f6, 0x06987149, 0xf74274e3, 0xacc35222, + 0x5d195788, 0x94065f37, 0x65dc5a9d, 0xdd494808, 0x2c934da2, + 0xe58c451d, 0x145640b7, 0x528e089f, 0xa3540d35, 0x6a4b058a, + 0x9b910020, 0x230412b5, 0xd2de171f, 0x1bc11fa0, 0xea1b1a0a, + 0xb19a3ccb, 0x40403961, 0x895f31de, 0x78853474, 0xc01026e1, + 0x31ca234b, 0xf8d52bf4, 0x090f2e5e, 0xeacb7748, 0x1b1172e2, + 0xd20e7a5d, 0x23d47ff7, 0x9b416d62, 0x6a9b68c8, 0xa3846077, + 0x525e65dd, 0x09df431c, 0xf80546b6, 0x311a4e09, 0xc0c04ba3, + 0x78555936, 0x898f5c9c, 0x40905423, 0xb14a5189, 0xf79219a1, + 0x06481c0b, 0xcf5714b4, 0x3e8d111e, 0x8618038b, 0x77c20621, + 0xbedd0e9e, 0x4f070b34, 0x14862df5, 0xe55c285f, 0x2c4320e0, + 0xdd99254a, 0x650c37df, 0x94d63275, 0x5dc93aca, 0xac133f60, + 0xd079aa9a, 0x21a3af30, 0xe8bca78f, 0x1966a225, 0xa1f3b0b0, + 0x5029b51a, 0x9936bda5, 0x68ecb80f, 0x336d9ece, 0xc2b79b64, + 0x0ba893db, 0xfa729671, 0x42e784e4, 0xb33d814e, 0x7a2289f1, + 0x8bf88c5b, 0xcd20c473, 0x3cfac1d9, 0xf5e5c966, 0x043fcccc, + 0xbcaade59, 0x4d70dbf3, 0x846fd34c, 0x75b5d6e6, 0x2e34f027, + 0xdfeef58d, 0x16f1fd32, 0xe72bf898, 0x5fbeea0d, 0xae64efa7, + 0x677be718, 0x96a1e2b2, 0x9faeccec, 0x6e74c946, 0xa76bc1f9, + 0x56b1c453, 0xee24d6c6, 0x1ffed36c, 0xd6e1dbd3, 0x273bde79, + 0x7cbaf8b8, 0x8d60fd12, 0x447ff5ad, 0xb5a5f007, 0x0d30e292, + 0xfceae738, 0x35f5ef87, 0xc42fea2d, 0x82f7a205, 0x732da7af, + 0xba32af10, 0x4be8aaba, 0xf37db82f, 0x02a7bd85, 0xcbb8b53a, + 0x3a62b090, 0x61e39651, 0x903993fb, 0x59269b44, 0xa8fc9eee, + 0x10698c7b, 0xe1b389d1, 0x28ac816e, 0xd97684c4, 0xa51c113e, + 0x54c61494, 0x9dd91c2b, 0x6c031981, 0xd4960b14, 0x254c0ebe, + 0xec530601, 0x1d8903ab, 0x4608256a, 0xb7d220c0, 0x7ecd287f, + 0x8f172dd5, 0x37823f40, 0xc6583aea, 0x0f473255, 0xfe9d37ff, + 0xb8457fd7, 0x499f7a7d, 0x808072c2, 0x715a7768, 0xc9cf65fd, + 0x38156057, 0xf10a68e8, 0x00d06d42, 0x5b514b83, 0xaa8b4e29, + 0x63944696, 0x924e433c, 0x2adb51a9, 0xdb015403, 0x121e5cbc, + 0xe3c45916}, + {0x00000000, 0x0ee7e8d1, 0x1dcfd1a2, 0x13283973, 0x3b9fa344, + 0x35784b95, 0x265072e6, 0x28b79a37, 0x773f4688, 0x79d8ae59, + 0x6af0972a, 0x64177ffb, 0x4ca0e5cc, 0x42470d1d, 0x516f346e, + 0x5f88dcbf, 0xee7e8d10, 0xe09965c1, 0xf3b15cb2, 0xfd56b463, + 0xd5e12e54, 0xdb06c685, 0xc82efff6, 0xc6c91727, 0x9941cb98, + 0x97a62349, 0x848e1a3a, 0x8a69f2eb, 0xa2de68dc, 0xac39800d, + 0xbf11b97e, 0xb1f651af, 0x078c1c61, 0x096bf4b0, 0x1a43cdc3, + 0x14a42512, 0x3c13bf25, 0x32f457f4, 0x21dc6e87, 0x2f3b8656, + 0x70b35ae9, 0x7e54b238, 0x6d7c8b4b, 0x639b639a, 0x4b2cf9ad, + 0x45cb117c, 0x56e3280f, 0x5804c0de, 0xe9f29171, 0xe71579a0, + 0xf43d40d3, 0xfadaa802, 0xd26d3235, 0xdc8adae4, 0xcfa2e397, + 0xc1450b46, 0x9ecdd7f9, 0x902a3f28, 0x8302065b, 0x8de5ee8a, + 0xa55274bd, 0xabb59c6c, 0xb89da51f, 0xb67a4dce, 0x0f1838c2, + 0x01ffd013, 0x12d7e960, 0x1c3001b1, 0x34879b86, 0x3a607357, + 0x29484a24, 0x27afa2f5, 0x78277e4a, 0x76c0969b, 0x65e8afe8, + 0x6b0f4739, 0x43b8dd0e, 0x4d5f35df, 0x5e770cac, 0x5090e47d, + 0xe166b5d2, 0xef815d03, 0xfca96470, 0xf24e8ca1, 0xdaf91696, + 0xd41efe47, 0xc736c734, 0xc9d12fe5, 0x9659f35a, 0x98be1b8b, + 0x8b9622f8, 0x8571ca29, 0xadc6501e, 0xa321b8cf, 0xb00981bc, + 0xbeee696d, 0x089424a3, 0x0673cc72, 0x155bf501, 0x1bbc1dd0, + 0x330b87e7, 0x3dec6f36, 0x2ec45645, 0x2023be94, 0x7fab622b, + 0x714c8afa, 0x6264b389, 0x6c835b58, 0x4434c16f, 0x4ad329be, + 0x59fb10cd, 0x571cf81c, 0xe6eaa9b3, 0xe80d4162, 0xfb257811, + 0xf5c290c0, 0xdd750af7, 0xd392e226, 0xc0badb55, 0xce5d3384, + 0x91d5ef3b, 0x9f3207ea, 0x8c1a3e99, 0x82fdd648, 0xaa4a4c7f, + 0xa4ada4ae, 0xb7859ddd, 0xb962750c, 0x1e307184, 0x10d79955, + 0x03ffa026, 0x0d1848f7, 0x25afd2c0, 0x2b483a11, 0x38600362, + 0x3687ebb3, 0x690f370c, 0x67e8dfdd, 0x74c0e6ae, 0x7a270e7f, + 0x52909448, 0x5c777c99, 0x4f5f45ea, 0x41b8ad3b, 0xf04efc94, + 0xfea91445, 0xed812d36, 0xe366c5e7, 0xcbd15fd0, 0xc536b701, + 0xd61e8e72, 0xd8f966a3, 0x8771ba1c, 0x899652cd, 0x9abe6bbe, + 0x9459836f, 0xbcee1958, 0xb209f189, 0xa121c8fa, 0xafc6202b, + 0x19bc6de5, 0x175b8534, 0x0473bc47, 0x0a945496, 0x2223cea1, + 0x2cc42670, 0x3fec1f03, 0x310bf7d2, 0x6e832b6d, 0x6064c3bc, + 0x734cfacf, 0x7dab121e, 0x551c8829, 0x5bfb60f8, 0x48d3598b, + 0x4634b15a, 0xf7c2e0f5, 0xf9250824, 0xea0d3157, 0xe4ead986, + 0xcc5d43b1, 0xc2baab60, 0xd1929213, 0xdf757ac2, 0x80fda67d, + 0x8e1a4eac, 0x9d3277df, 0x93d59f0e, 0xbb620539, 0xb585ede8, + 0xa6add49b, 0xa84a3c4a, 0x11284946, 0x1fcfa197, 0x0ce798e4, + 0x02007035, 0x2ab7ea02, 0x245002d3, 0x37783ba0, 0x399fd371, + 0x66170fce, 0x68f0e71f, 0x7bd8de6c, 0x753f36bd, 0x5d88ac8a, + 0x536f445b, 0x40477d28, 0x4ea095f9, 0xff56c456, 0xf1b12c87, + 0xe29915f4, 0xec7efd25, 0xc4c96712, 0xca2e8fc3, 0xd906b6b0, + 0xd7e15e61, 0x886982de, 0x868e6a0f, 0x95a6537c, 0x9b41bbad, + 0xb3f6219a, 0xbd11c94b, 0xae39f038, 0xa0de18e9, 0x16a45527, + 0x1843bdf6, 0x0b6b8485, 0x058c6c54, 0x2d3bf663, 0x23dc1eb2, + 0x30f427c1, 0x3e13cf10, 0x619b13af, 0x6f7cfb7e, 0x7c54c20d, + 0x72b32adc, 0x5a04b0eb, 0x54e3583a, 0x47cb6149, 0x492c8998, + 0xf8dad837, 0xf63d30e6, 0xe5150995, 0xebf2e144, 0xc3457b73, + 0xcda293a2, 0xde8aaad1, 0xd06d4200, 0x8fe59ebf, 0x8102766e, + 0x922a4f1d, 0x9ccda7cc, 0xb47a3dfb, 0xba9dd52a, 0xa9b5ec59, + 0xa7520488}, + {0x00000000, 0x3c60e308, 0x78c1c610, 0x44a12518, 0xf1838c20, + 0xcde36f28, 0x89424a30, 0xb522a938, 0x38761e01, 0x0416fd09, + 0x40b7d811, 0x7cd73b19, 0xc9f59221, 0xf5957129, 0xb1345431, + 0x8d54b739, 0x70ec3c02, 0x4c8cdf0a, 0x082dfa12, 0x344d191a, + 0x816fb022, 0xbd0f532a, 0xf9ae7632, 0xc5ce953a, 0x489a2203, + 0x74fac10b, 0x305be413, 0x0c3b071b, 0xb919ae23, 0x85794d2b, + 0xc1d86833, 0xfdb88b3b, 0xe1d87804, 0xddb89b0c, 0x9919be14, + 0xa5795d1c, 0x105bf424, 0x2c3b172c, 0x689a3234, 0x54fad13c, + 0xd9ae6605, 0xe5ce850d, 0xa16fa015, 0x9d0f431d, 0x282dea25, + 0x144d092d, 0x50ec2c35, 0x6c8ccf3d, 0x91344406, 0xad54a70e, + 0xe9f58216, 0xd595611e, 0x60b7c826, 0x5cd72b2e, 0x18760e36, + 0x2416ed3e, 0xa9425a07, 0x9522b90f, 0xd1839c17, 0xede37f1f, + 0x58c1d627, 0x64a1352f, 0x20001037, 0x1c60f33f, 0x18c1f649, + 0x24a11541, 0x60003059, 0x5c60d351, 0xe9427a69, 0xd5229961, + 0x9183bc79, 0xade35f71, 0x20b7e848, 0x1cd70b40, 0x58762e58, + 0x6416cd50, 0xd1346468, 0xed548760, 0xa9f5a278, 0x95954170, + 0x682dca4b, 0x544d2943, 0x10ec0c5b, 0x2c8cef53, 0x99ae466b, + 0xa5cea563, 0xe16f807b, 0xdd0f6373, 0x505bd44a, 0x6c3b3742, + 0x289a125a, 0x14faf152, 0xa1d8586a, 0x9db8bb62, 0xd9199e7a, + 0xe5797d72, 0xf9198e4d, 0xc5796d45, 0x81d8485d, 0xbdb8ab55, + 0x089a026d, 0x34fae165, 0x705bc47d, 0x4c3b2775, 0xc16f904c, + 0xfd0f7344, 0xb9ae565c, 0x85ceb554, 0x30ec1c6c, 0x0c8cff64, + 0x482dda7c, 0x744d3974, 0x89f5b24f, 0xb5955147, 0xf134745f, + 0xcd549757, 0x78763e6f, 0x4416dd67, 0x00b7f87f, 0x3cd71b77, + 0xb183ac4e, 0x8de34f46, 0xc9426a5e, 0xf5228956, 0x4000206e, + 0x7c60c366, 0x38c1e67e, 0x04a10576, 0x3183ec92, 0x0de30f9a, + 0x49422a82, 0x7522c98a, 0xc00060b2, 0xfc6083ba, 0xb8c1a6a2, + 0x84a145aa, 0x09f5f293, 0x3595119b, 0x71343483, 0x4d54d78b, + 0xf8767eb3, 0xc4169dbb, 0x80b7b8a3, 0xbcd75bab, 0x416fd090, + 0x7d0f3398, 0x39ae1680, 0x05cef588, 0xb0ec5cb0, 0x8c8cbfb8, + 0xc82d9aa0, 0xf44d79a8, 0x7919ce91, 0x45792d99, 0x01d80881, + 0x3db8eb89, 0x889a42b1, 0xb4faa1b9, 0xf05b84a1, 0xcc3b67a9, + 0xd05b9496, 0xec3b779e, 0xa89a5286, 0x94fab18e, 0x21d818b6, + 0x1db8fbbe, 0x5919dea6, 0x65793dae, 0xe82d8a97, 0xd44d699f, + 0x90ec4c87, 0xac8caf8f, 0x19ae06b7, 0x25cee5bf, 0x616fc0a7, + 0x5d0f23af, 0xa0b7a894, 0x9cd74b9c, 0xd8766e84, 0xe4168d8c, + 0x513424b4, 0x6d54c7bc, 0x29f5e2a4, 0x159501ac, 0x98c1b695, + 0xa4a1559d, 0xe0007085, 0xdc60938d, 0x69423ab5, 0x5522d9bd, + 0x1183fca5, 0x2de31fad, 0x29421adb, 0x1522f9d3, 0x5183dccb, + 0x6de33fc3, 0xd8c196fb, 0xe4a175f3, 0xa00050eb, 0x9c60b3e3, + 0x113404da, 0x2d54e7d2, 0x69f5c2ca, 0x559521c2, 0xe0b788fa, + 0xdcd76bf2, 0x98764eea, 0xa416ade2, 0x59ae26d9, 0x65cec5d1, + 0x216fe0c9, 0x1d0f03c1, 0xa82daaf9, 0x944d49f1, 0xd0ec6ce9, + 0xec8c8fe1, 0x61d838d8, 0x5db8dbd0, 0x1919fec8, 0x25791dc0, + 0x905bb4f8, 0xac3b57f0, 0xe89a72e8, 0xd4fa91e0, 0xc89a62df, + 0xf4fa81d7, 0xb05ba4cf, 0x8c3b47c7, 0x3919eeff, 0x05790df7, + 0x41d828ef, 0x7db8cbe7, 0xf0ec7cde, 0xcc8c9fd6, 0x882dbace, + 0xb44d59c6, 0x016ff0fe, 0x3d0f13f6, 0x79ae36ee, 0x45ced5e6, + 0xb8765edd, 0x8416bdd5, 0xc0b798cd, 0xfcd77bc5, 0x49f5d2fd, + 0x759531f5, 0x313414ed, 0x0d54f7e5, 0x800040dc, 0xbc60a3d4, + 0xf8c186cc, 0xc4a165c4, 0x7183ccfc, 0x4de32ff4, 0x09420aec, + 0x3522e9e4}, + {0x00000000, 0x6307d924, 0xc60fb248, 0xa5086b6c, 0x576e62d1, + 0x3469bbf5, 0x9161d099, 0xf26609bd, 0xaedcc5a2, 0xcddb1c86, + 0x68d377ea, 0x0bd4aece, 0xf9b2a773, 0x9ab57e57, 0x3fbd153b, + 0x5cbacc1f, 0x86c88d05, 0xe5cf5421, 0x40c73f4d, 0x23c0e669, + 0xd1a6efd4, 0xb2a136f0, 0x17a95d9c, 0x74ae84b8, 0x281448a7, + 0x4b139183, 0xee1bfaef, 0x8d1c23cb, 0x7f7a2a76, 0x1c7df352, + 0xb975983e, 0xda72411a, 0xd6e01c4b, 0xb5e7c56f, 0x10efae03, + 0x73e87727, 0x818e7e9a, 0xe289a7be, 0x4781ccd2, 0x248615f6, + 0x783cd9e9, 0x1b3b00cd, 0xbe336ba1, 0xdd34b285, 0x2f52bb38, + 0x4c55621c, 0xe95d0970, 0x8a5ad054, 0x5028914e, 0x332f486a, + 0x96272306, 0xf520fa22, 0x0746f39f, 0x64412abb, 0xc14941d7, + 0xa24e98f3, 0xfef454ec, 0x9df38dc8, 0x38fbe6a4, 0x5bfc3f80, + 0xa99a363d, 0xca9def19, 0x6f958475, 0x0c925d51, 0x76b13ed7, + 0x15b6e7f3, 0xb0be8c9f, 0xd3b955bb, 0x21df5c06, 0x42d88522, + 0xe7d0ee4e, 0x84d7376a, 0xd86dfb75, 0xbb6a2251, 0x1e62493d, + 0x7d659019, 0x8f0399a4, 0xec044080, 0x490c2bec, 0x2a0bf2c8, + 0xf079b3d2, 0x937e6af6, 0x3676019a, 0x5571d8be, 0xa717d103, + 0xc4100827, 0x6118634b, 0x021fba6f, 0x5ea57670, 0x3da2af54, + 0x98aac438, 0xfbad1d1c, 0x09cb14a1, 0x6acccd85, 0xcfc4a6e9, + 0xacc37fcd, 0xa051229c, 0xc356fbb8, 0x665e90d4, 0x055949f0, + 0xf73f404d, 0x94389969, 0x3130f205, 0x52372b21, 0x0e8de73e, + 0x6d8a3e1a, 0xc8825576, 0xab858c52, 0x59e385ef, 0x3ae45ccb, + 0x9fec37a7, 0xfcebee83, 0x2699af99, 0x459e76bd, 0xe0961dd1, + 0x8391c4f5, 0x71f7cd48, 0x12f0146c, 0xb7f87f00, 0xd4ffa624, + 0x88456a3b, 0xeb42b31f, 0x4e4ad873, 0x2d4d0157, 0xdf2b08ea, + 0xbc2cd1ce, 0x1924baa2, 0x7a236386, 0xed627dae, 0x8e65a48a, + 0x2b6dcfe6, 0x486a16c2, 0xba0c1f7f, 0xd90bc65b, 0x7c03ad37, + 0x1f047413, 0x43beb80c, 0x20b96128, 0x85b10a44, 0xe6b6d360, + 0x14d0dadd, 0x77d703f9, 0xd2df6895, 0xb1d8b1b1, 0x6baaf0ab, + 0x08ad298f, 0xada542e3, 0xcea29bc7, 0x3cc4927a, 0x5fc34b5e, + 0xfacb2032, 0x99ccf916, 0xc5763509, 0xa671ec2d, 0x03798741, + 0x607e5e65, 0x921857d8, 0xf11f8efc, 0x5417e590, 0x37103cb4, + 0x3b8261e5, 0x5885b8c1, 0xfd8dd3ad, 0x9e8a0a89, 0x6cec0334, + 0x0febda10, 0xaae3b17c, 0xc9e46858, 0x955ea447, 0xf6597d63, + 0x5351160f, 0x3056cf2b, 0xc230c696, 0xa1371fb2, 0x043f74de, + 0x6738adfa, 0xbd4aece0, 0xde4d35c4, 0x7b455ea8, 0x1842878c, + 0xea248e31, 0x89235715, 0x2c2b3c79, 0x4f2ce55d, 0x13962942, + 0x7091f066, 0xd5999b0a, 0xb69e422e, 0x44f84b93, 0x27ff92b7, + 0x82f7f9db, 0xe1f020ff, 0x9bd34379, 0xf8d49a5d, 0x5ddcf131, + 0x3edb2815, 0xccbd21a8, 0xafbaf88c, 0x0ab293e0, 0x69b54ac4, + 0x350f86db, 0x56085fff, 0xf3003493, 0x9007edb7, 0x6261e40a, + 0x01663d2e, 0xa46e5642, 0xc7698f66, 0x1d1bce7c, 0x7e1c1758, + 0xdb147c34, 0xb813a510, 0x4a75acad, 0x29727589, 0x8c7a1ee5, + 0xef7dc7c1, 0xb3c70bde, 0xd0c0d2fa, 0x75c8b996, 0x16cf60b2, + 0xe4a9690f, 0x87aeb02b, 0x22a6db47, 0x41a10263, 0x4d335f32, + 0x2e348616, 0x8b3ced7a, 0xe83b345e, 0x1a5d3de3, 0x795ae4c7, + 0xdc528fab, 0xbf55568f, 0xe3ef9a90, 0x80e843b4, 0x25e028d8, + 0x46e7f1fc, 0xb481f841, 0xd7862165, 0x728e4a09, 0x1189932d, + 0xcbfbd237, 0xa8fc0b13, 0x0df4607f, 0x6ef3b95b, 0x9c95b0e6, + 0xff9269c2, 0x5a9a02ae, 0x399ddb8a, 0x65271795, 0x0620ceb1, + 0xa328a5dd, 0xc02f7cf9, 0x32497544, 0x514eac60, 0xf446c70c, + 0x97411e28}, + {0x00000000, 0x01b5fd1d, 0x036bfa3a, 0x02de0727, 0x06d7f474, + 0x07620969, 0x05bc0e4e, 0x0409f353, 0x0dafe8e8, 0x0c1a15f5, + 0x0ec412d2, 0x0f71efcf, 0x0b781c9c, 0x0acde181, 0x0813e6a6, + 0x09a61bbb, 0x1b5fd1d0, 0x1aea2ccd, 0x18342bea, 0x1981d6f7, + 0x1d8825a4, 0x1c3dd8b9, 0x1ee3df9e, 0x1f562283, 0x16f03938, + 0x1745c425, 0x159bc302, 0x142e3e1f, 0x1027cd4c, 0x11923051, + 0x134c3776, 0x12f9ca6b, 0x36bfa3a0, 0x370a5ebd, 0x35d4599a, + 0x3461a487, 0x306857d4, 0x31ddaac9, 0x3303adee, 0x32b650f3, + 0x3b104b48, 0x3aa5b655, 0x387bb172, 0x39ce4c6f, 0x3dc7bf3c, + 0x3c724221, 0x3eac4506, 0x3f19b81b, 0x2de07270, 0x2c558f6d, + 0x2e8b884a, 0x2f3e7557, 0x2b378604, 0x2a827b19, 0x285c7c3e, + 0x29e98123, 0x204f9a98, 0x21fa6785, 0x232460a2, 0x22919dbf, + 0x26986eec, 0x272d93f1, 0x25f394d6, 0x244669cb, 0x6d7f4740, + 0x6ccaba5d, 0x6e14bd7a, 0x6fa14067, 0x6ba8b334, 0x6a1d4e29, + 0x68c3490e, 0x6976b413, 0x60d0afa8, 0x616552b5, 0x63bb5592, + 0x620ea88f, 0x66075bdc, 0x67b2a6c1, 0x656ca1e6, 0x64d95cfb, + 0x76209690, 0x77956b8d, 0x754b6caa, 0x74fe91b7, 0x70f762e4, + 0x71429ff9, 0x739c98de, 0x722965c3, 0x7b8f7e78, 0x7a3a8365, + 0x78e48442, 0x7951795f, 0x7d588a0c, 0x7ced7711, 0x7e337036, + 0x7f868d2b, 0x5bc0e4e0, 0x5a7519fd, 0x58ab1eda, 0x591ee3c7, + 0x5d171094, 0x5ca2ed89, 0x5e7ceaae, 0x5fc917b3, 0x566f0c08, + 0x57daf115, 0x5504f632, 0x54b10b2f, 0x50b8f87c, 0x510d0561, + 0x53d30246, 0x5266ff5b, 0x409f3530, 0x412ac82d, 0x43f4cf0a, + 0x42413217, 0x4648c144, 0x47fd3c59, 0x45233b7e, 0x4496c663, + 0x4d30ddd8, 0x4c8520c5, 0x4e5b27e2, 0x4feedaff, 0x4be729ac, + 0x4a52d4b1, 0x488cd396, 0x49392e8b, 0xdafe8e80, 0xdb4b739d, + 0xd99574ba, 0xd82089a7, 0xdc297af4, 0xdd9c87e9, 0xdf4280ce, + 0xdef77dd3, 0xd7516668, 0xd6e49b75, 0xd43a9c52, 0xd58f614f, + 0xd186921c, 0xd0336f01, 0xd2ed6826, 0xd358953b, 0xc1a15f50, + 0xc014a24d, 0xc2caa56a, 0xc37f5877, 0xc776ab24, 0xc6c35639, + 0xc41d511e, 0xc5a8ac03, 0xcc0eb7b8, 0xcdbb4aa5, 0xcf654d82, + 0xced0b09f, 0xcad943cc, 0xcb6cbed1, 0xc9b2b9f6, 0xc80744eb, + 0xec412d20, 0xedf4d03d, 0xef2ad71a, 0xee9f2a07, 0xea96d954, + 0xeb232449, 0xe9fd236e, 0xe848de73, 0xe1eec5c8, 0xe05b38d5, + 0xe2853ff2, 0xe330c2ef, 0xe73931bc, 0xe68ccca1, 0xe452cb86, + 0xe5e7369b, 0xf71efcf0, 0xf6ab01ed, 0xf47506ca, 0xf5c0fbd7, + 0xf1c90884, 0xf07cf599, 0xf2a2f2be, 0xf3170fa3, 0xfab11418, + 0xfb04e905, 0xf9daee22, 0xf86f133f, 0xfc66e06c, 0xfdd31d71, + 0xff0d1a56, 0xfeb8e74b, 0xb781c9c0, 0xb63434dd, 0xb4ea33fa, + 0xb55fcee7, 0xb1563db4, 0xb0e3c0a9, 0xb23dc78e, 0xb3883a93, + 0xba2e2128, 0xbb9bdc35, 0xb945db12, 0xb8f0260f, 0xbcf9d55c, + 0xbd4c2841, 0xbf922f66, 0xbe27d27b, 0xacde1810, 0xad6be50d, + 0xafb5e22a, 0xae001f37, 0xaa09ec64, 0xabbc1179, 0xa962165e, + 0xa8d7eb43, 0xa171f0f8, 0xa0c40de5, 0xa21a0ac2, 0xa3aff7df, + 0xa7a6048c, 0xa613f991, 0xa4cdfeb6, 0xa57803ab, 0x813e6a60, + 0x808b977d, 0x8255905a, 0x83e06d47, 0x87e99e14, 0x865c6309, + 0x8482642e, 0x85379933, 0x8c918288, 0x8d247f95, 0x8ffa78b2, + 0x8e4f85af, 0x8a4676fc, 0x8bf38be1, 0x892d8cc6, 0x889871db, + 0x9a61bbb0, 0x9bd446ad, 0x990a418a, 0x98bfbc97, 0x9cb64fc4, + 0x9d03b2d9, 0x9fddb5fe, 0x9e6848e3, 0x97ce5358, 0x967bae45, + 0x94a5a962, 0x9510547f, 0x9119a72c, 0x90ac5a31, 0x92725d16, + 0x93c7a00b}, + {0x00000000, 0x6e8c1b41, 0xdd183682, 0xb3942dc3, 0x61416b45, + 0x0fcd7004, 0xbc595dc7, 0xd2d54686, 0xc282d68a, 0xac0ecdcb, + 0x1f9ae008, 0x7116fb49, 0xa3c3bdcf, 0xcd4fa68e, 0x7edb8b4d, + 0x1057900c, 0x5e74ab55, 0x30f8b014, 0x836c9dd7, 0xede08696, + 0x3f35c010, 0x51b9db51, 0xe22df692, 0x8ca1edd3, 0x9cf67ddf, + 0xf27a669e, 0x41ee4b5d, 0x2f62501c, 0xfdb7169a, 0x933b0ddb, + 0x20af2018, 0x4e233b59, 0xbce956aa, 0xd2654deb, 0x61f16028, + 0x0f7d7b69, 0xdda83def, 0xb32426ae, 0x00b00b6d, 0x6e3c102c, + 0x7e6b8020, 0x10e79b61, 0xa373b6a2, 0xcdffade3, 0x1f2aeb65, + 0x71a6f024, 0xc232dde7, 0xacbec6a6, 0xe29dfdff, 0x8c11e6be, + 0x3f85cb7d, 0x5109d03c, 0x83dc96ba, 0xed508dfb, 0x5ec4a038, + 0x3048bb79, 0x201f2b75, 0x4e933034, 0xfd071df7, 0x938b06b6, + 0x415e4030, 0x2fd25b71, 0x9c4676b2, 0xf2ca6df3, 0xa2a3ab15, + 0xcc2fb054, 0x7fbb9d97, 0x113786d6, 0xc3e2c050, 0xad6edb11, + 0x1efaf6d2, 0x7076ed93, 0x60217d9f, 0x0ead66de, 0xbd394b1d, + 0xd3b5505c, 0x016016da, 0x6fec0d9b, 0xdc782058, 0xb2f43b19, + 0xfcd70040, 0x925b1b01, 0x21cf36c2, 0x4f432d83, 0x9d966b05, + 0xf31a7044, 0x408e5d87, 0x2e0246c6, 0x3e55d6ca, 0x50d9cd8b, + 0xe34de048, 0x8dc1fb09, 0x5f14bd8f, 0x3198a6ce, 0x820c8b0d, + 0xec80904c, 0x1e4afdbf, 0x70c6e6fe, 0xc352cb3d, 0xadded07c, + 0x7f0b96fa, 0x11878dbb, 0xa213a078, 0xcc9fbb39, 0xdcc82b35, + 0xb2443074, 0x01d01db7, 0x6f5c06f6, 0xbd894070, 0xd3055b31, + 0x609176f2, 0x0e1d6db3, 0x403e56ea, 0x2eb24dab, 0x9d266068, + 0xf3aa7b29, 0x217f3daf, 0x4ff326ee, 0xfc670b2d, 0x92eb106c, + 0x82bc8060, 0xec309b21, 0x5fa4b6e2, 0x3128ada3, 0xe3fdeb25, + 0x8d71f064, 0x3ee5dda7, 0x5069c6e6, 0x9e36506b, 0xf0ba4b2a, + 0x432e66e9, 0x2da27da8, 0xff773b2e, 0x91fb206f, 0x226f0dac, + 0x4ce316ed, 0x5cb486e1, 0x32389da0, 0x81acb063, 0xef20ab22, + 0x3df5eda4, 0x5379f6e5, 0xe0eddb26, 0x8e61c067, 0xc042fb3e, + 0xaecee07f, 0x1d5acdbc, 0x73d6d6fd, 0xa103907b, 0xcf8f8b3a, + 0x7c1ba6f9, 0x1297bdb8, 0x02c02db4, 0x6c4c36f5, 0xdfd81b36, + 0xb1540077, 0x638146f1, 0x0d0d5db0, 0xbe997073, 0xd0156b32, + 0x22df06c1, 0x4c531d80, 0xffc73043, 0x914b2b02, 0x439e6d84, + 0x2d1276c5, 0x9e865b06, 0xf00a4047, 0xe05dd04b, 0x8ed1cb0a, + 0x3d45e6c9, 0x53c9fd88, 0x811cbb0e, 0xef90a04f, 0x5c048d8c, + 0x328896cd, 0x7cabad94, 0x1227b6d5, 0xa1b39b16, 0xcf3f8057, + 0x1deac6d1, 0x7366dd90, 0xc0f2f053, 0xae7eeb12, 0xbe297b1e, + 0xd0a5605f, 0x63314d9c, 0x0dbd56dd, 0xdf68105b, 0xb1e40b1a, + 0x027026d9, 0x6cfc3d98, 0x3c95fb7e, 0x5219e03f, 0xe18dcdfc, + 0x8f01d6bd, 0x5dd4903b, 0x33588b7a, 0x80cca6b9, 0xee40bdf8, + 0xfe172df4, 0x909b36b5, 0x230f1b76, 0x4d830037, 0x9f5646b1, + 0xf1da5df0, 0x424e7033, 0x2cc26b72, 0x62e1502b, 0x0c6d4b6a, + 0xbff966a9, 0xd1757de8, 0x03a03b6e, 0x6d2c202f, 0xdeb80dec, + 0xb03416ad, 0xa06386a1, 0xceef9de0, 0x7d7bb023, 0x13f7ab62, + 0xc122ede4, 0xafaef6a5, 0x1c3adb66, 0x72b6c027, 0x807cadd4, + 0xeef0b695, 0x5d649b56, 0x33e88017, 0xe13dc691, 0x8fb1ddd0, + 0x3c25f013, 0x52a9eb52, 0x42fe7b5e, 0x2c72601f, 0x9fe64ddc, + 0xf16a569d, 0x23bf101b, 0x4d330b5a, 0xfea72699, 0x902b3dd8, + 0xde080681, 0xb0841dc0, 0x03103003, 0x6d9c2b42, 0xbf496dc4, + 0xd1c57685, 0x62515b46, 0x0cdd4007, 0x1c8ad00b, 0x7206cb4a, + 0xc192e689, 0xaf1efdc8, 0x7dcbbb4e, 0x1347a00f, 0xa0d38dcc, + 0xce5f968d}, + {0x00000000, 0xe71da697, 0x154a4b6f, 0xf257edf8, 0x2a9496de, + 0xcd893049, 0x3fdeddb1, 0xd8c37b26, 0x55292dbc, 0xb2348b2b, + 0x406366d3, 0xa77ec044, 0x7fbdbb62, 0x98a01df5, 0x6af7f00d, + 0x8dea569a, 0xaa525b78, 0x4d4ffdef, 0xbf181017, 0x5805b680, + 0x80c6cda6, 0x67db6b31, 0x958c86c9, 0x7291205e, 0xff7b76c4, + 0x1866d053, 0xea313dab, 0x0d2c9b3c, 0xd5efe01a, 0x32f2468d, + 0xc0a5ab75, 0x27b80de2, 0x8fd5b0b1, 0x68c81626, 0x9a9ffbde, + 0x7d825d49, 0xa541266f, 0x425c80f8, 0xb00b6d00, 0x5716cb97, + 0xdafc9d0d, 0x3de13b9a, 0xcfb6d662, 0x28ab70f5, 0xf0680bd3, + 0x1775ad44, 0xe52240bc, 0x023fe62b, 0x2587ebc9, 0xc29a4d5e, + 0x30cda0a6, 0xd7d00631, 0x0f137d17, 0xe80edb80, 0x1a593678, + 0xfd4490ef, 0x70aec675, 0x97b360e2, 0x65e48d1a, 0x82f92b8d, + 0x5a3a50ab, 0xbd27f63c, 0x4f701bc4, 0xa86dbd53, 0xc4da6723, + 0x23c7c1b4, 0xd1902c4c, 0x368d8adb, 0xee4ef1fd, 0x0953576a, + 0xfb04ba92, 0x1c191c05, 0x91f34a9f, 0x76eeec08, 0x84b901f0, + 0x63a4a767, 0xbb67dc41, 0x5c7a7ad6, 0xae2d972e, 0x493031b9, + 0x6e883c5b, 0x89959acc, 0x7bc27734, 0x9cdfd1a3, 0x441caa85, + 0xa3010c12, 0x5156e1ea, 0xb64b477d, 0x3ba111e7, 0xdcbcb770, + 0x2eeb5a88, 0xc9f6fc1f, 0x11358739, 0xf62821ae, 0x047fcc56, + 0xe3626ac1, 0x4b0fd792, 0xac127105, 0x5e459cfd, 0xb9583a6a, + 0x619b414c, 0x8686e7db, 0x74d10a23, 0x93ccacb4, 0x1e26fa2e, + 0xf93b5cb9, 0x0b6cb141, 0xec7117d6, 0x34b26cf0, 0xd3afca67, + 0x21f8279f, 0xc6e58108, 0xe15d8cea, 0x06402a7d, 0xf417c785, + 0x130a6112, 0xcbc91a34, 0x2cd4bca3, 0xde83515b, 0x399ef7cc, + 0xb474a156, 0x536907c1, 0xa13eea39, 0x46234cae, 0x9ee03788, + 0x79fd911f, 0x8baa7ce7, 0x6cb7da70, 0x52c5c807, 0xb5d86e90, + 0x478f8368, 0xa09225ff, 0x78515ed9, 0x9f4cf84e, 0x6d1b15b6, + 0x8a06b321, 0x07ece5bb, 0xe0f1432c, 0x12a6aed4, 0xf5bb0843, + 0x2d787365, 0xca65d5f2, 0x3832380a, 0xdf2f9e9d, 0xf897937f, + 0x1f8a35e8, 0xedddd810, 0x0ac07e87, 0xd20305a1, 0x351ea336, + 0xc7494ece, 0x2054e859, 0xadbebec3, 0x4aa31854, 0xb8f4f5ac, + 0x5fe9533b, 0x872a281d, 0x60378e8a, 0x92606372, 0x757dc5e5, + 0xdd1078b6, 0x3a0dde21, 0xc85a33d9, 0x2f47954e, 0xf784ee68, + 0x109948ff, 0xe2cea507, 0x05d30390, 0x8839550a, 0x6f24f39d, + 0x9d731e65, 0x7a6eb8f2, 0xa2adc3d4, 0x45b06543, 0xb7e788bb, + 0x50fa2e2c, 0x774223ce, 0x905f8559, 0x620868a1, 0x8515ce36, + 0x5dd6b510, 0xbacb1387, 0x489cfe7f, 0xaf8158e8, 0x226b0e72, + 0xc576a8e5, 0x3721451d, 0xd03ce38a, 0x08ff98ac, 0xefe23e3b, + 0x1db5d3c3, 0xfaa87554, 0x961faf24, 0x710209b3, 0x8355e44b, + 0x644842dc, 0xbc8b39fa, 0x5b969f6d, 0xa9c17295, 0x4edcd402, + 0xc3368298, 0x242b240f, 0xd67cc9f7, 0x31616f60, 0xe9a21446, + 0x0ebfb2d1, 0xfce85f29, 0x1bf5f9be, 0x3c4df45c, 0xdb5052cb, + 0x2907bf33, 0xce1a19a4, 0x16d96282, 0xf1c4c415, 0x039329ed, + 0xe48e8f7a, 0x6964d9e0, 0x8e797f77, 0x7c2e928f, 0x9b333418, + 0x43f04f3e, 0xa4ede9a9, 0x56ba0451, 0xb1a7a2c6, 0x19ca1f95, + 0xfed7b902, 0x0c8054fa, 0xeb9df26d, 0x335e894b, 0xd4432fdc, + 0x2614c224, 0xc10964b3, 0x4ce33229, 0xabfe94be, 0x59a97946, + 0xbeb4dfd1, 0x6677a4f7, 0x816a0260, 0x733def98, 0x9420490f, + 0xb39844ed, 0x5485e27a, 0xa6d20f82, 0x41cfa915, 0x990cd233, + 0x7e1174a4, 0x8c46995c, 0x6b5b3fcb, 0xe6b16951, 0x01accfc6, + 0xf3fb223e, 0x14e684a9, 0xcc25ff8f, 0x2b385918, 0xd96fb4e0, + 0x3e721277}, + {0x00000000, 0xa58b900e, 0x9066265d, 0x35edb653, 0xfbbd4afb, + 0x5e36daf5, 0x6bdb6ca6, 0xce50fca8, 0x2c0b93b7, 0x898003b9, + 0xbc6db5ea, 0x19e625e4, 0xd7b6d94c, 0x723d4942, 0x47d0ff11, + 0xe25b6f1f, 0x5817276e, 0xfd9cb760, 0xc8710133, 0x6dfa913d, + 0xa3aa6d95, 0x0621fd9b, 0x33cc4bc8, 0x9647dbc6, 0x741cb4d9, + 0xd19724d7, 0xe47a9284, 0x41f1028a, 0x8fa1fe22, 0x2a2a6e2c, + 0x1fc7d87f, 0xba4c4871, 0xb02e4edc, 0x15a5ded2, 0x20486881, + 0x85c3f88f, 0x4b930427, 0xee189429, 0xdbf5227a, 0x7e7eb274, + 0x9c25dd6b, 0x39ae4d65, 0x0c43fb36, 0xa9c86b38, 0x67989790, + 0xc213079e, 0xf7feb1cd, 0x527521c3, 0xe83969b2, 0x4db2f9bc, + 0x785f4fef, 0xddd4dfe1, 0x13842349, 0xb60fb347, 0x83e20514, + 0x2669951a, 0xc432fa05, 0x61b96a0b, 0x5454dc58, 0xf1df4c56, + 0x3f8fb0fe, 0x9a0420f0, 0xafe996a3, 0x0a6206ad, 0xbb2d9bf9, + 0x1ea60bf7, 0x2b4bbda4, 0x8ec02daa, 0x4090d102, 0xe51b410c, + 0xd0f6f75f, 0x757d6751, 0x9726084e, 0x32ad9840, 0x07402e13, + 0xa2cbbe1d, 0x6c9b42b5, 0xc910d2bb, 0xfcfd64e8, 0x5976f4e6, + 0xe33abc97, 0x46b12c99, 0x735c9aca, 0xd6d70ac4, 0x1887f66c, + 0xbd0c6662, 0x88e1d031, 0x2d6a403f, 0xcf312f20, 0x6ababf2e, + 0x5f57097d, 0xfadc9973, 0x348c65db, 0x9107f5d5, 0xa4ea4386, + 0x0161d388, 0x0b03d525, 0xae88452b, 0x9b65f378, 0x3eee6376, + 0xf0be9fde, 0x55350fd0, 0x60d8b983, 0xc553298d, 0x27084692, + 0x8283d69c, 0xb76e60cf, 0x12e5f0c1, 0xdcb50c69, 0x793e9c67, + 0x4cd32a34, 0xe958ba3a, 0x5314f24b, 0xf69f6245, 0xc372d416, + 0x66f94418, 0xa8a9b8b0, 0x0d2228be, 0x38cf9eed, 0x9d440ee3, + 0x7f1f61fc, 0xda94f1f2, 0xef7947a1, 0x4af2d7af, 0x84a22b07, + 0x2129bb09, 0x14c40d5a, 0xb14f9d54, 0xad2a31b3, 0x08a1a1bd, + 0x3d4c17ee, 0x98c787e0, 0x56977b48, 0xf31ceb46, 0xc6f15d15, + 0x637acd1b, 0x8121a204, 0x24aa320a, 0x11478459, 0xb4cc1457, + 0x7a9ce8ff, 0xdf1778f1, 0xeafacea2, 0x4f715eac, 0xf53d16dd, + 0x50b686d3, 0x655b3080, 0xc0d0a08e, 0x0e805c26, 0xab0bcc28, + 0x9ee67a7b, 0x3b6dea75, 0xd936856a, 0x7cbd1564, 0x4950a337, + 0xecdb3339, 0x228bcf91, 0x87005f9f, 0xb2ede9cc, 0x176679c2, + 0x1d047f6f, 0xb88fef61, 0x8d625932, 0x28e9c93c, 0xe6b93594, + 0x4332a59a, 0x76df13c9, 0xd35483c7, 0x310fecd8, 0x94847cd6, + 0xa169ca85, 0x04e25a8b, 0xcab2a623, 0x6f39362d, 0x5ad4807e, + 0xff5f1070, 0x45135801, 0xe098c80f, 0xd5757e5c, 0x70feee52, + 0xbeae12fa, 0x1b2582f4, 0x2ec834a7, 0x8b43a4a9, 0x6918cbb6, + 0xcc935bb8, 0xf97eedeb, 0x5cf57de5, 0x92a5814d, 0x372e1143, + 0x02c3a710, 0xa748371e, 0x1607aa4a, 0xb38c3a44, 0x86618c17, + 0x23ea1c19, 0xedbae0b1, 0x483170bf, 0x7ddcc6ec, 0xd85756e2, + 0x3a0c39fd, 0x9f87a9f3, 0xaa6a1fa0, 0x0fe18fae, 0xc1b17306, + 0x643ae308, 0x51d7555b, 0xf45cc555, 0x4e108d24, 0xeb9b1d2a, + 0xde76ab79, 0x7bfd3b77, 0xb5adc7df, 0x102657d1, 0x25cbe182, + 0x8040718c, 0x621b1e93, 0xc7908e9d, 0xf27d38ce, 0x57f6a8c0, + 0x99a65468, 0x3c2dc466, 0x09c07235, 0xac4be23b, 0xa629e496, + 0x03a27498, 0x364fc2cb, 0x93c452c5, 0x5d94ae6d, 0xf81f3e63, + 0xcdf28830, 0x6879183e, 0x8a227721, 0x2fa9e72f, 0x1a44517c, + 0xbfcfc172, 0x719f3dda, 0xd414add4, 0xe1f91b87, 0x44728b89, + 0xfe3ec3f8, 0x5bb553f6, 0x6e58e5a5, 0xcbd375ab, 0x05838903, + 0xa008190d, 0x95e5af5e, 0x306e3f50, 0xd235504f, 0x77bec041, + 0x42537612, 0xe7d8e61c, 0x29881ab4, 0x8c038aba, 0xb9ee3ce9, + 0x1c65ace7}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x0e908ba500000000, 0x5d26669000000000, + 0x53b6ed3500000000, 0xfb4abdfb00000000, 0xf5da365e00000000, + 0xa66cdb6b00000000, 0xa8fc50ce00000000, 0xb7930b2c00000000, + 0xb903808900000000, 0xeab56dbc00000000, 0xe425e61900000000, + 0x4cd9b6d700000000, 0x42493d7200000000, 0x11ffd04700000000, + 0x1f6f5be200000000, 0x6e27175800000000, 0x60b79cfd00000000, + 0x330171c800000000, 0x3d91fa6d00000000, 0x956daaa300000000, + 0x9bfd210600000000, 0xc84bcc3300000000, 0xc6db479600000000, + 0xd9b41c7400000000, 0xd72497d100000000, 0x84927ae400000000, + 0x8a02f14100000000, 0x22fea18f00000000, 0x2c6e2a2a00000000, + 0x7fd8c71f00000000, 0x71484cba00000000, 0xdc4e2eb000000000, + 0xd2dea51500000000, 0x8168482000000000, 0x8ff8c38500000000, + 0x2704934b00000000, 0x299418ee00000000, 0x7a22f5db00000000, + 0x74b27e7e00000000, 0x6bdd259c00000000, 0x654dae3900000000, + 0x36fb430c00000000, 0x386bc8a900000000, 0x9097986700000000, + 0x9e0713c200000000, 0xcdb1fef700000000, 0xc321755200000000, + 0xb26939e800000000, 0xbcf9b24d00000000, 0xef4f5f7800000000, + 0xe1dfd4dd00000000, 0x4923841300000000, 0x47b30fb600000000, + 0x1405e28300000000, 0x1a95692600000000, 0x05fa32c400000000, + 0x0b6ab96100000000, 0x58dc545400000000, 0x564cdff100000000, + 0xfeb08f3f00000000, 0xf020049a00000000, 0xa396e9af00000000, + 0xad06620a00000000, 0xf99b2dbb00000000, 0xf70ba61e00000000, + 0xa4bd4b2b00000000, 0xaa2dc08e00000000, 0x02d1904000000000, + 0x0c411be500000000, 0x5ff7f6d000000000, 0x51677d7500000000, + 0x4e08269700000000, 0x4098ad3200000000, 0x132e400700000000, + 0x1dbecba200000000, 0xb5429b6c00000000, 0xbbd210c900000000, + 0xe864fdfc00000000, 0xe6f4765900000000, 0x97bc3ae300000000, + 0x992cb14600000000, 0xca9a5c7300000000, 0xc40ad7d600000000, + 0x6cf6871800000000, 0x62660cbd00000000, 0x31d0e18800000000, + 0x3f406a2d00000000, 0x202f31cf00000000, 0x2ebfba6a00000000, + 0x7d09575f00000000, 0x7399dcfa00000000, 0xdb658c3400000000, + 0xd5f5079100000000, 0x8643eaa400000000, 0x88d3610100000000, + 0x25d5030b00000000, 0x2b4588ae00000000, 0x78f3659b00000000, + 0x7663ee3e00000000, 0xde9fbef000000000, 0xd00f355500000000, + 0x83b9d86000000000, 0x8d2953c500000000, 0x9246082700000000, + 0x9cd6838200000000, 0xcf606eb700000000, 0xc1f0e51200000000, + 0x690cb5dc00000000, 0x679c3e7900000000, 0x342ad34c00000000, + 0x3aba58e900000000, 0x4bf2145300000000, 0x45629ff600000000, + 0x16d472c300000000, 0x1844f96600000000, 0xb0b8a9a800000000, + 0xbe28220d00000000, 0xed9ecf3800000000, 0xe30e449d00000000, + 0xfc611f7f00000000, 0xf2f194da00000000, 0xa14779ef00000000, + 0xafd7f24a00000000, 0x072ba28400000000, 0x09bb292100000000, + 0x5a0dc41400000000, 0x549d4fb100000000, 0xb3312aad00000000, + 0xbda1a10800000000, 0xee174c3d00000000, 0xe087c79800000000, + 0x487b975600000000, 0x46eb1cf300000000, 0x155df1c600000000, + 0x1bcd7a6300000000, 0x04a2218100000000, 0x0a32aa2400000000, + 0x5984471100000000, 0x5714ccb400000000, 0xffe89c7a00000000, + 0xf17817df00000000, 0xa2cefaea00000000, 0xac5e714f00000000, + 0xdd163df500000000, 0xd386b65000000000, 0x80305b6500000000, + 0x8ea0d0c000000000, 0x265c800e00000000, 0x28cc0bab00000000, + 0x7b7ae69e00000000, 0x75ea6d3b00000000, 0x6a8536d900000000, + 0x6415bd7c00000000, 0x37a3504900000000, 0x3933dbec00000000, + 0x91cf8b2200000000, 0x9f5f008700000000, 0xcce9edb200000000, + 0xc279661700000000, 0x6f7f041d00000000, 0x61ef8fb800000000, + 0x3259628d00000000, 0x3cc9e92800000000, 0x9435b9e600000000, + 0x9aa5324300000000, 0xc913df7600000000, 0xc78354d300000000, + 0xd8ec0f3100000000, 0xd67c849400000000, 0x85ca69a100000000, + 0x8b5ae20400000000, 0x23a6b2ca00000000, 0x2d36396f00000000, + 0x7e80d45a00000000, 0x70105fff00000000, 0x0158134500000000, + 0x0fc898e000000000, 0x5c7e75d500000000, 0x52eefe7000000000, + 0xfa12aebe00000000, 0xf482251b00000000, 0xa734c82e00000000, + 0xa9a4438b00000000, 0xb6cb186900000000, 0xb85b93cc00000000, + 0xebed7ef900000000, 0xe57df55c00000000, 0x4d81a59200000000, + 0x43112e3700000000, 0x10a7c30200000000, 0x1e3748a700000000, + 0x4aaa071600000000, 0x443a8cb300000000, 0x178c618600000000, + 0x191cea2300000000, 0xb1e0baed00000000, 0xbf70314800000000, + 0xecc6dc7d00000000, 0xe25657d800000000, 0xfd390c3a00000000, + 0xf3a9879f00000000, 0xa01f6aaa00000000, 0xae8fe10f00000000, + 0x0673b1c100000000, 0x08e33a6400000000, 0x5b55d75100000000, + 0x55c55cf400000000, 0x248d104e00000000, 0x2a1d9beb00000000, + 0x79ab76de00000000, 0x773bfd7b00000000, 0xdfc7adb500000000, + 0xd157261000000000, 0x82e1cb2500000000, 0x8c71408000000000, + 0x931e1b6200000000, 0x9d8e90c700000000, 0xce387df200000000, + 0xc0a8f65700000000, 0x6854a69900000000, 0x66c42d3c00000000, + 0x3572c00900000000, 0x3be24bac00000000, 0x96e429a600000000, + 0x9874a20300000000, 0xcbc24f3600000000, 0xc552c49300000000, + 0x6dae945d00000000, 0x633e1ff800000000, 0x3088f2cd00000000, + 0x3e18796800000000, 0x2177228a00000000, 0x2fe7a92f00000000, + 0x7c51441a00000000, 0x72c1cfbf00000000, 0xda3d9f7100000000, + 0xd4ad14d400000000, 0x871bf9e100000000, 0x898b724400000000, + 0xf8c33efe00000000, 0xf653b55b00000000, 0xa5e5586e00000000, + 0xab75d3cb00000000, 0x0389830500000000, 0x0d1908a000000000, + 0x5eafe59500000000, 0x503f6e3000000000, 0x4f5035d200000000, + 0x41c0be7700000000, 0x1276534200000000, 0x1ce6d8e700000000, + 0xb41a882900000000, 0xba8a038c00000000, 0xe93ceeb900000000, + 0xe7ac651c00000000}, + {0x0000000000000000, 0x97a61de700000000, 0x6f4b4a1500000000, + 0xf8ed57f200000000, 0xde96942a00000000, 0x493089cd00000000, + 0xb1ddde3f00000000, 0x267bc3d800000000, 0xbc2d295500000000, + 0x2b8b34b200000000, 0xd366634000000000, 0x44c07ea700000000, + 0x62bbbd7f00000000, 0xf51da09800000000, 0x0df0f76a00000000, + 0x9a56ea8d00000000, 0x785b52aa00000000, 0xeffd4f4d00000000, + 0x171018bf00000000, 0x80b6055800000000, 0xa6cdc68000000000, + 0x316bdb6700000000, 0xc9868c9500000000, 0x5e20917200000000, + 0xc4767bff00000000, 0x53d0661800000000, 0xab3d31ea00000000, + 0x3c9b2c0d00000000, 0x1ae0efd500000000, 0x8d46f23200000000, + 0x75aba5c000000000, 0xe20db82700000000, 0xb1b0d58f00000000, + 0x2616c86800000000, 0xdefb9f9a00000000, 0x495d827d00000000, + 0x6f2641a500000000, 0xf8805c4200000000, 0x006d0bb000000000, + 0x97cb165700000000, 0x0d9dfcda00000000, 0x9a3be13d00000000, + 0x62d6b6cf00000000, 0xf570ab2800000000, 0xd30b68f000000000, + 0x44ad751700000000, 0xbc4022e500000000, 0x2be63f0200000000, + 0xc9eb872500000000, 0x5e4d9ac200000000, 0xa6a0cd3000000000, + 0x3106d0d700000000, 0x177d130f00000000, 0x80db0ee800000000, + 0x7836591a00000000, 0xef9044fd00000000, 0x75c6ae7000000000, + 0xe260b39700000000, 0x1a8de46500000000, 0x8d2bf98200000000, + 0xab503a5a00000000, 0x3cf627bd00000000, 0xc41b704f00000000, + 0x53bd6da800000000, 0x2367dac400000000, 0xb4c1c72300000000, + 0x4c2c90d100000000, 0xdb8a8d3600000000, 0xfdf14eee00000000, + 0x6a57530900000000, 0x92ba04fb00000000, 0x051c191c00000000, + 0x9f4af39100000000, 0x08ecee7600000000, 0xf001b98400000000, + 0x67a7a46300000000, 0x41dc67bb00000000, 0xd67a7a5c00000000, + 0x2e972dae00000000, 0xb931304900000000, 0x5b3c886e00000000, + 0xcc9a958900000000, 0x3477c27b00000000, 0xa3d1df9c00000000, + 0x85aa1c4400000000, 0x120c01a300000000, 0xeae1565100000000, + 0x7d474bb600000000, 0xe711a13b00000000, 0x70b7bcdc00000000, + 0x885aeb2e00000000, 0x1ffcf6c900000000, 0x3987351100000000, + 0xae2128f600000000, 0x56cc7f0400000000, 0xc16a62e300000000, + 0x92d70f4b00000000, 0x057112ac00000000, 0xfd9c455e00000000, + 0x6a3a58b900000000, 0x4c419b6100000000, 0xdbe7868600000000, + 0x230ad17400000000, 0xb4accc9300000000, 0x2efa261e00000000, + 0xb95c3bf900000000, 0x41b16c0b00000000, 0xd61771ec00000000, + 0xf06cb23400000000, 0x67caafd300000000, 0x9f27f82100000000, + 0x0881e5c600000000, 0xea8c5de100000000, 0x7d2a400600000000, + 0x85c717f400000000, 0x12610a1300000000, 0x341ac9cb00000000, + 0xa3bcd42c00000000, 0x5b5183de00000000, 0xccf79e3900000000, + 0x56a174b400000000, 0xc107695300000000, 0x39ea3ea100000000, + 0xae4c234600000000, 0x8837e09e00000000, 0x1f91fd7900000000, + 0xe77caa8b00000000, 0x70dab76c00000000, 0x07c8c55200000000, + 0x906ed8b500000000, 0x68838f4700000000, 0xff2592a000000000, + 0xd95e517800000000, 0x4ef84c9f00000000, 0xb6151b6d00000000, + 0x21b3068a00000000, 0xbbe5ec0700000000, 0x2c43f1e000000000, + 0xd4aea61200000000, 0x4308bbf500000000, 0x6573782d00000000, + 0xf2d565ca00000000, 0x0a38323800000000, 0x9d9e2fdf00000000, + 0x7f9397f800000000, 0xe8358a1f00000000, 0x10d8dded00000000, + 0x877ec00a00000000, 0xa10503d200000000, 0x36a31e3500000000, + 0xce4e49c700000000, 0x59e8542000000000, 0xc3bebead00000000, + 0x5418a34a00000000, 0xacf5f4b800000000, 0x3b53e95f00000000, + 0x1d282a8700000000, 0x8a8e376000000000, 0x7263609200000000, + 0xe5c57d7500000000, 0xb67810dd00000000, 0x21de0d3a00000000, + 0xd9335ac800000000, 0x4e95472f00000000, 0x68ee84f700000000, + 0xff48991000000000, 0x07a5cee200000000, 0x9003d30500000000, + 0x0a55398800000000, 0x9df3246f00000000, 0x651e739d00000000, + 0xf2b86e7a00000000, 0xd4c3ada200000000, 0x4365b04500000000, + 0xbb88e7b700000000, 0x2c2efa5000000000, 0xce23427700000000, + 0x59855f9000000000, 0xa168086200000000, 0x36ce158500000000, + 0x10b5d65d00000000, 0x8713cbba00000000, 0x7ffe9c4800000000, + 0xe85881af00000000, 0x720e6b2200000000, 0xe5a876c500000000, + 0x1d45213700000000, 0x8ae33cd000000000, 0xac98ff0800000000, + 0x3b3ee2ef00000000, 0xc3d3b51d00000000, 0x5475a8fa00000000, + 0x24af1f9600000000, 0xb309027100000000, 0x4be4558300000000, + 0xdc42486400000000, 0xfa398bbc00000000, 0x6d9f965b00000000, + 0x9572c1a900000000, 0x02d4dc4e00000000, 0x988236c300000000, + 0x0f242b2400000000, 0xf7c97cd600000000, 0x606f613100000000, + 0x4614a2e900000000, 0xd1b2bf0e00000000, 0x295fe8fc00000000, + 0xbef9f51b00000000, 0x5cf44d3c00000000, 0xcb5250db00000000, + 0x33bf072900000000, 0xa4191ace00000000, 0x8262d91600000000, + 0x15c4c4f100000000, 0xed29930300000000, 0x7a8f8ee400000000, + 0xe0d9646900000000, 0x777f798e00000000, 0x8f922e7c00000000, + 0x1834339b00000000, 0x3e4ff04300000000, 0xa9e9eda400000000, + 0x5104ba5600000000, 0xc6a2a7b100000000, 0x951fca1900000000, + 0x02b9d7fe00000000, 0xfa54800c00000000, 0x6df29deb00000000, + 0x4b895e3300000000, 0xdc2f43d400000000, 0x24c2142600000000, + 0xb36409c100000000, 0x2932e34c00000000, 0xbe94feab00000000, + 0x4679a95900000000, 0xd1dfb4be00000000, 0xf7a4776600000000, + 0x60026a8100000000, 0x98ef3d7300000000, 0x0f49209400000000, + 0xed4498b300000000, 0x7ae2855400000000, 0x820fd2a600000000, + 0x15a9cf4100000000, 0x33d20c9900000000, 0xa474117e00000000, + 0x5c99468c00000000, 0xcb3f5b6b00000000, 0x5169b1e600000000, + 0xc6cfac0100000000, 0x3e22fbf300000000, 0xa984e61400000000, + 0x8fff25cc00000000, 0x1859382b00000000, 0xe0b46fd900000000, + 0x7712723e00000000}, + {0x0000000000000000, 0x411b8c6e00000000, 0x823618dd00000000, + 0xc32d94b300000000, 0x456b416100000000, 0x0470cd0f00000000, + 0xc75d59bc00000000, 0x8646d5d200000000, 0x8ad682c200000000, + 0xcbcd0eac00000000, 0x08e09a1f00000000, 0x49fb167100000000, + 0xcfbdc3a300000000, 0x8ea64fcd00000000, 0x4d8bdb7e00000000, + 0x0c90571000000000, 0x55ab745e00000000, 0x14b0f83000000000, + 0xd79d6c8300000000, 0x9686e0ed00000000, 0x10c0353f00000000, + 0x51dbb95100000000, 0x92f62de200000000, 0xd3eda18c00000000, + 0xdf7df69c00000000, 0x9e667af200000000, 0x5d4bee4100000000, + 0x1c50622f00000000, 0x9a16b7fd00000000, 0xdb0d3b9300000000, + 0x1820af2000000000, 0x593b234e00000000, 0xaa56e9bc00000000, + 0xeb4d65d200000000, 0x2860f16100000000, 0x697b7d0f00000000, + 0xef3da8dd00000000, 0xae2624b300000000, 0x6d0bb00000000000, + 0x2c103c6e00000000, 0x20806b7e00000000, 0x619be71000000000, + 0xa2b673a300000000, 0xe3adffcd00000000, 0x65eb2a1f00000000, + 0x24f0a67100000000, 0xe7dd32c200000000, 0xa6c6beac00000000, + 0xfffd9de200000000, 0xbee6118c00000000, 0x7dcb853f00000000, + 0x3cd0095100000000, 0xba96dc8300000000, 0xfb8d50ed00000000, + 0x38a0c45e00000000, 0x79bb483000000000, 0x752b1f2000000000, + 0x3430934e00000000, 0xf71d07fd00000000, 0xb6068b9300000000, + 0x30405e4100000000, 0x715bd22f00000000, 0xb276469c00000000, + 0xf36dcaf200000000, 0x15aba3a200000000, 0x54b02fcc00000000, + 0x979dbb7f00000000, 0xd686371100000000, 0x50c0e2c300000000, + 0x11db6ead00000000, 0xd2f6fa1e00000000, 0x93ed767000000000, + 0x9f7d216000000000, 0xde66ad0e00000000, 0x1d4b39bd00000000, + 0x5c50b5d300000000, 0xda16600100000000, 0x9b0dec6f00000000, + 0x582078dc00000000, 0x193bf4b200000000, 0x4000d7fc00000000, + 0x011b5b9200000000, 0xc236cf2100000000, 0x832d434f00000000, + 0x056b969d00000000, 0x44701af300000000, 0x875d8e4000000000, + 0xc646022e00000000, 0xcad6553e00000000, 0x8bcdd95000000000, + 0x48e04de300000000, 0x09fbc18d00000000, 0x8fbd145f00000000, + 0xcea6983100000000, 0x0d8b0c8200000000, 0x4c9080ec00000000, + 0xbffd4a1e00000000, 0xfee6c67000000000, 0x3dcb52c300000000, + 0x7cd0dead00000000, 0xfa960b7f00000000, 0xbb8d871100000000, + 0x78a013a200000000, 0x39bb9fcc00000000, 0x352bc8dc00000000, + 0x743044b200000000, 0xb71dd00100000000, 0xf6065c6f00000000, + 0x704089bd00000000, 0x315b05d300000000, 0xf276916000000000, + 0xb36d1d0e00000000, 0xea563e4000000000, 0xab4db22e00000000, + 0x6860269d00000000, 0x297baaf300000000, 0xaf3d7f2100000000, + 0xee26f34f00000000, 0x2d0b67fc00000000, 0x6c10eb9200000000, + 0x6080bc8200000000, 0x219b30ec00000000, 0xe2b6a45f00000000, + 0xa3ad283100000000, 0x25ebfde300000000, 0x64f0718d00000000, + 0xa7dde53e00000000, 0xe6c6695000000000, 0x6b50369e00000000, + 0x2a4bbaf000000000, 0xe9662e4300000000, 0xa87da22d00000000, + 0x2e3b77ff00000000, 0x6f20fb9100000000, 0xac0d6f2200000000, + 0xed16e34c00000000, 0xe186b45c00000000, 0xa09d383200000000, + 0x63b0ac8100000000, 0x22ab20ef00000000, 0xa4edf53d00000000, + 0xe5f6795300000000, 0x26dbede000000000, 0x67c0618e00000000, + 0x3efb42c000000000, 0x7fe0ceae00000000, 0xbccd5a1d00000000, + 0xfdd6d67300000000, 0x7b9003a100000000, 0x3a8b8fcf00000000, + 0xf9a61b7c00000000, 0xb8bd971200000000, 0xb42dc00200000000, + 0xf5364c6c00000000, 0x361bd8df00000000, 0x770054b100000000, + 0xf146816300000000, 0xb05d0d0d00000000, 0x737099be00000000, + 0x326b15d000000000, 0xc106df2200000000, 0x801d534c00000000, + 0x4330c7ff00000000, 0x022b4b9100000000, 0x846d9e4300000000, + 0xc576122d00000000, 0x065b869e00000000, 0x47400af000000000, + 0x4bd05de000000000, 0x0acbd18e00000000, 0xc9e6453d00000000, + 0x88fdc95300000000, 0x0ebb1c8100000000, 0x4fa090ef00000000, + 0x8c8d045c00000000, 0xcd96883200000000, 0x94adab7c00000000, + 0xd5b6271200000000, 0x169bb3a100000000, 0x57803fcf00000000, + 0xd1c6ea1d00000000, 0x90dd667300000000, 0x53f0f2c000000000, + 0x12eb7eae00000000, 0x1e7b29be00000000, 0x5f60a5d000000000, + 0x9c4d316300000000, 0xdd56bd0d00000000, 0x5b1068df00000000, + 0x1a0be4b100000000, 0xd926700200000000, 0x983dfc6c00000000, + 0x7efb953c00000000, 0x3fe0195200000000, 0xfccd8de100000000, + 0xbdd6018f00000000, 0x3b90d45d00000000, 0x7a8b583300000000, + 0xb9a6cc8000000000, 0xf8bd40ee00000000, 0xf42d17fe00000000, + 0xb5369b9000000000, 0x761b0f2300000000, 0x3700834d00000000, + 0xb146569f00000000, 0xf05ddaf100000000, 0x33704e4200000000, + 0x726bc22c00000000, 0x2b50e16200000000, 0x6a4b6d0c00000000, + 0xa966f9bf00000000, 0xe87d75d100000000, 0x6e3ba00300000000, + 0x2f202c6d00000000, 0xec0db8de00000000, 0xad1634b000000000, + 0xa18663a000000000, 0xe09defce00000000, 0x23b07b7d00000000, + 0x62abf71300000000, 0xe4ed22c100000000, 0xa5f6aeaf00000000, + 0x66db3a1c00000000, 0x27c0b67200000000, 0xd4ad7c8000000000, + 0x95b6f0ee00000000, 0x569b645d00000000, 0x1780e83300000000, + 0x91c63de100000000, 0xd0ddb18f00000000, 0x13f0253c00000000, + 0x52eba95200000000, 0x5e7bfe4200000000, 0x1f60722c00000000, + 0xdc4de69f00000000, 0x9d566af100000000, 0x1b10bf2300000000, + 0x5a0b334d00000000, 0x9926a7fe00000000, 0xd83d2b9000000000, + 0x810608de00000000, 0xc01d84b000000000, 0x0330100300000000, + 0x422b9c6d00000000, 0xc46d49bf00000000, 0x8576c5d100000000, + 0x465b516200000000, 0x0740dd0c00000000, 0x0bd08a1c00000000, + 0x4acb067200000000, 0x89e692c100000000, 0xc8fd1eaf00000000, + 0x4ebbcb7d00000000, 0x0fa0471300000000, 0xcc8dd3a000000000, + 0x8d965fce00000000}, + {0x0000000000000000, 0x1dfdb50100000000, 0x3afa6b0300000000, + 0x2707de0200000000, 0x74f4d70600000000, 0x6909620700000000, + 0x4e0ebc0500000000, 0x53f3090400000000, 0xe8e8af0d00000000, + 0xf5151a0c00000000, 0xd212c40e00000000, 0xcfef710f00000000, + 0x9c1c780b00000000, 0x81e1cd0a00000000, 0xa6e6130800000000, + 0xbb1ba60900000000, 0xd0d15f1b00000000, 0xcd2cea1a00000000, + 0xea2b341800000000, 0xf7d6811900000000, 0xa425881d00000000, + 0xb9d83d1c00000000, 0x9edfe31e00000000, 0x8322561f00000000, + 0x3839f01600000000, 0x25c4451700000000, 0x02c39b1500000000, + 0x1f3e2e1400000000, 0x4ccd271000000000, 0x5130921100000000, + 0x76374c1300000000, 0x6bcaf91200000000, 0xa0a3bf3600000000, + 0xbd5e0a3700000000, 0x9a59d43500000000, 0x87a4613400000000, + 0xd457683000000000, 0xc9aadd3100000000, 0xeead033300000000, + 0xf350b63200000000, 0x484b103b00000000, 0x55b6a53a00000000, + 0x72b17b3800000000, 0x6f4cce3900000000, 0x3cbfc73d00000000, + 0x2142723c00000000, 0x0645ac3e00000000, 0x1bb8193f00000000, + 0x7072e02d00000000, 0x6d8f552c00000000, 0x4a888b2e00000000, + 0x57753e2f00000000, 0x0486372b00000000, 0x197b822a00000000, + 0x3e7c5c2800000000, 0x2381e92900000000, 0x989a4f2000000000, + 0x8567fa2100000000, 0xa260242300000000, 0xbf9d912200000000, + 0xec6e982600000000, 0xf1932d2700000000, 0xd694f32500000000, + 0xcb69462400000000, 0x40477f6d00000000, 0x5dbaca6c00000000, + 0x7abd146e00000000, 0x6740a16f00000000, 0x34b3a86b00000000, + 0x294e1d6a00000000, 0x0e49c36800000000, 0x13b4766900000000, + 0xa8afd06000000000, 0xb552656100000000, 0x9255bb6300000000, + 0x8fa80e6200000000, 0xdc5b076600000000, 0xc1a6b26700000000, + 0xe6a16c6500000000, 0xfb5cd96400000000, 0x9096207600000000, + 0x8d6b957700000000, 0xaa6c4b7500000000, 0xb791fe7400000000, + 0xe462f77000000000, 0xf99f427100000000, 0xde989c7300000000, + 0xc365297200000000, 0x787e8f7b00000000, 0x65833a7a00000000, + 0x4284e47800000000, 0x5f79517900000000, 0x0c8a587d00000000, + 0x1177ed7c00000000, 0x3670337e00000000, 0x2b8d867f00000000, + 0xe0e4c05b00000000, 0xfd19755a00000000, 0xda1eab5800000000, + 0xc7e31e5900000000, 0x9410175d00000000, 0x89eda25c00000000, + 0xaeea7c5e00000000, 0xb317c95f00000000, 0x080c6f5600000000, + 0x15f1da5700000000, 0x32f6045500000000, 0x2f0bb15400000000, + 0x7cf8b85000000000, 0x61050d5100000000, 0x4602d35300000000, + 0x5bff665200000000, 0x30359f4000000000, 0x2dc82a4100000000, + 0x0acff44300000000, 0x1732414200000000, 0x44c1484600000000, + 0x593cfd4700000000, 0x7e3b234500000000, 0x63c6964400000000, + 0xd8dd304d00000000, 0xc520854c00000000, 0xe2275b4e00000000, + 0xffdaee4f00000000, 0xac29e74b00000000, 0xb1d4524a00000000, + 0x96d38c4800000000, 0x8b2e394900000000, 0x808efeda00000000, + 0x9d734bdb00000000, 0xba7495d900000000, 0xa78920d800000000, + 0xf47a29dc00000000, 0xe9879cdd00000000, 0xce8042df00000000, + 0xd37df7de00000000, 0x686651d700000000, 0x759be4d600000000, + 0x529c3ad400000000, 0x4f618fd500000000, 0x1c9286d100000000, + 0x016f33d000000000, 0x2668edd200000000, 0x3b9558d300000000, + 0x505fa1c100000000, 0x4da214c000000000, 0x6aa5cac200000000, + 0x77587fc300000000, 0x24ab76c700000000, 0x3956c3c600000000, + 0x1e511dc400000000, 0x03aca8c500000000, 0xb8b70ecc00000000, + 0xa54abbcd00000000, 0x824d65cf00000000, 0x9fb0d0ce00000000, + 0xcc43d9ca00000000, 0xd1be6ccb00000000, 0xf6b9b2c900000000, + 0xeb4407c800000000, 0x202d41ec00000000, 0x3dd0f4ed00000000, + 0x1ad72aef00000000, 0x072a9fee00000000, 0x54d996ea00000000, + 0x492423eb00000000, 0x6e23fde900000000, 0x73de48e800000000, + 0xc8c5eee100000000, 0xd5385be000000000, 0xf23f85e200000000, + 0xefc230e300000000, 0xbc3139e700000000, 0xa1cc8ce600000000, + 0x86cb52e400000000, 0x9b36e7e500000000, 0xf0fc1ef700000000, + 0xed01abf600000000, 0xca0675f400000000, 0xd7fbc0f500000000, + 0x8408c9f100000000, 0x99f57cf000000000, 0xbef2a2f200000000, + 0xa30f17f300000000, 0x1814b1fa00000000, 0x05e904fb00000000, + 0x22eedaf900000000, 0x3f136ff800000000, 0x6ce066fc00000000, + 0x711dd3fd00000000, 0x561a0dff00000000, 0x4be7b8fe00000000, + 0xc0c981b700000000, 0xdd3434b600000000, 0xfa33eab400000000, + 0xe7ce5fb500000000, 0xb43d56b100000000, 0xa9c0e3b000000000, + 0x8ec73db200000000, 0x933a88b300000000, 0x28212eba00000000, + 0x35dc9bbb00000000, 0x12db45b900000000, 0x0f26f0b800000000, + 0x5cd5f9bc00000000, 0x41284cbd00000000, 0x662f92bf00000000, + 0x7bd227be00000000, 0x1018deac00000000, 0x0de56bad00000000, + 0x2ae2b5af00000000, 0x371f00ae00000000, 0x64ec09aa00000000, + 0x7911bcab00000000, 0x5e1662a900000000, 0x43ebd7a800000000, + 0xf8f071a100000000, 0xe50dc4a000000000, 0xc20a1aa200000000, + 0xdff7afa300000000, 0x8c04a6a700000000, 0x91f913a600000000, + 0xb6fecda400000000, 0xab0378a500000000, 0x606a3e8100000000, + 0x7d978b8000000000, 0x5a90558200000000, 0x476de08300000000, + 0x149ee98700000000, 0x09635c8600000000, 0x2e64828400000000, + 0x3399378500000000, 0x8882918c00000000, 0x957f248d00000000, + 0xb278fa8f00000000, 0xaf854f8e00000000, 0xfc76468a00000000, + 0xe18bf38b00000000, 0xc68c2d8900000000, 0xdb71988800000000, + 0xb0bb619a00000000, 0xad46d49b00000000, 0x8a410a9900000000, + 0x97bcbf9800000000, 0xc44fb69c00000000, 0xd9b2039d00000000, + 0xfeb5dd9f00000000, 0xe348689e00000000, 0x5853ce9700000000, + 0x45ae7b9600000000, 0x62a9a59400000000, 0x7f54109500000000, + 0x2ca7199100000000, 0x315aac9000000000, 0x165d729200000000, + 0x0ba0c79300000000}, + {0x0000000000000000, 0x24d9076300000000, 0x48b20fc600000000, + 0x6c6b08a500000000, 0xd1626e5700000000, 0xf5bb693400000000, + 0x99d0619100000000, 0xbd0966f200000000, 0xa2c5dcae00000000, + 0x861cdbcd00000000, 0xea77d36800000000, 0xceaed40b00000000, + 0x73a7b2f900000000, 0x577eb59a00000000, 0x3b15bd3f00000000, + 0x1fccba5c00000000, 0x058dc88600000000, 0x2154cfe500000000, + 0x4d3fc74000000000, 0x69e6c02300000000, 0xd4efa6d100000000, + 0xf036a1b200000000, 0x9c5da91700000000, 0xb884ae7400000000, + 0xa748142800000000, 0x8391134b00000000, 0xeffa1bee00000000, + 0xcb231c8d00000000, 0x762a7a7f00000000, 0x52f37d1c00000000, + 0x3e9875b900000000, 0x1a4172da00000000, 0x4b1ce0d600000000, + 0x6fc5e7b500000000, 0x03aeef1000000000, 0x2777e87300000000, + 0x9a7e8e8100000000, 0xbea789e200000000, 0xd2cc814700000000, + 0xf615862400000000, 0xe9d93c7800000000, 0xcd003b1b00000000, + 0xa16b33be00000000, 0x85b234dd00000000, 0x38bb522f00000000, + 0x1c62554c00000000, 0x70095de900000000, 0x54d05a8a00000000, + 0x4e91285000000000, 0x6a482f3300000000, 0x0623279600000000, + 0x22fa20f500000000, 0x9ff3460700000000, 0xbb2a416400000000, + 0xd74149c100000000, 0xf3984ea200000000, 0xec54f4fe00000000, + 0xc88df39d00000000, 0xa4e6fb3800000000, 0x803ffc5b00000000, + 0x3d369aa900000000, 0x19ef9dca00000000, 0x7584956f00000000, + 0x515d920c00000000, 0xd73eb17600000000, 0xf3e7b61500000000, + 0x9f8cbeb000000000, 0xbb55b9d300000000, 0x065cdf2100000000, + 0x2285d84200000000, 0x4eeed0e700000000, 0x6a37d78400000000, + 0x75fb6dd800000000, 0x51226abb00000000, 0x3d49621e00000000, + 0x1990657d00000000, 0xa499038f00000000, 0x804004ec00000000, + 0xec2b0c4900000000, 0xc8f20b2a00000000, 0xd2b379f000000000, + 0xf66a7e9300000000, 0x9a01763600000000, 0xbed8715500000000, + 0x03d117a700000000, 0x270810c400000000, 0x4b63186100000000, + 0x6fba1f0200000000, 0x7076a55e00000000, 0x54afa23d00000000, + 0x38c4aa9800000000, 0x1c1dadfb00000000, 0xa114cb0900000000, + 0x85cdcc6a00000000, 0xe9a6c4cf00000000, 0xcd7fc3ac00000000, + 0x9c2251a000000000, 0xb8fb56c300000000, 0xd4905e6600000000, + 0xf049590500000000, 0x4d403ff700000000, 0x6999389400000000, + 0x05f2303100000000, 0x212b375200000000, 0x3ee78d0e00000000, + 0x1a3e8a6d00000000, 0x765582c800000000, 0x528c85ab00000000, + 0xef85e35900000000, 0xcb5ce43a00000000, 0xa737ec9f00000000, + 0x83eeebfc00000000, 0x99af992600000000, 0xbd769e4500000000, + 0xd11d96e000000000, 0xf5c4918300000000, 0x48cdf77100000000, + 0x6c14f01200000000, 0x007ff8b700000000, 0x24a6ffd400000000, + 0x3b6a458800000000, 0x1fb342eb00000000, 0x73d84a4e00000000, + 0x57014d2d00000000, 0xea082bdf00000000, 0xced12cbc00000000, + 0xa2ba241900000000, 0x8663237a00000000, 0xae7d62ed00000000, + 0x8aa4658e00000000, 0xe6cf6d2b00000000, 0xc2166a4800000000, + 0x7f1f0cba00000000, 0x5bc60bd900000000, 0x37ad037c00000000, + 0x1374041f00000000, 0x0cb8be4300000000, 0x2861b92000000000, + 0x440ab18500000000, 0x60d3b6e600000000, 0xdddad01400000000, + 0xf903d77700000000, 0x9568dfd200000000, 0xb1b1d8b100000000, + 0xabf0aa6b00000000, 0x8f29ad0800000000, 0xe342a5ad00000000, + 0xc79ba2ce00000000, 0x7a92c43c00000000, 0x5e4bc35f00000000, + 0x3220cbfa00000000, 0x16f9cc9900000000, 0x093576c500000000, + 0x2dec71a600000000, 0x4187790300000000, 0x655e7e6000000000, + 0xd857189200000000, 0xfc8e1ff100000000, 0x90e5175400000000, + 0xb43c103700000000, 0xe561823b00000000, 0xc1b8855800000000, + 0xadd38dfd00000000, 0x890a8a9e00000000, 0x3403ec6c00000000, + 0x10daeb0f00000000, 0x7cb1e3aa00000000, 0x5868e4c900000000, + 0x47a45e9500000000, 0x637d59f600000000, 0x0f16515300000000, + 0x2bcf563000000000, 0x96c630c200000000, 0xb21f37a100000000, + 0xde743f0400000000, 0xfaad386700000000, 0xe0ec4abd00000000, + 0xc4354dde00000000, 0xa85e457b00000000, 0x8c87421800000000, + 0x318e24ea00000000, 0x1557238900000000, 0x793c2b2c00000000, + 0x5de52c4f00000000, 0x4229961300000000, 0x66f0917000000000, + 0x0a9b99d500000000, 0x2e429eb600000000, 0x934bf84400000000, + 0xb792ff2700000000, 0xdbf9f78200000000, 0xff20f0e100000000, + 0x7943d39b00000000, 0x5d9ad4f800000000, 0x31f1dc5d00000000, + 0x1528db3e00000000, 0xa821bdcc00000000, 0x8cf8baaf00000000, + 0xe093b20a00000000, 0xc44ab56900000000, 0xdb860f3500000000, + 0xff5f085600000000, 0x933400f300000000, 0xb7ed079000000000, + 0x0ae4616200000000, 0x2e3d660100000000, 0x42566ea400000000, + 0x668f69c700000000, 0x7cce1b1d00000000, 0x58171c7e00000000, + 0x347c14db00000000, 0x10a513b800000000, 0xadac754a00000000, + 0x8975722900000000, 0xe51e7a8c00000000, 0xc1c77def00000000, + 0xde0bc7b300000000, 0xfad2c0d000000000, 0x96b9c87500000000, + 0xb260cf1600000000, 0x0f69a9e400000000, 0x2bb0ae8700000000, + 0x47dba62200000000, 0x6302a14100000000, 0x325f334d00000000, + 0x1686342e00000000, 0x7aed3c8b00000000, 0x5e343be800000000, + 0xe33d5d1a00000000, 0xc7e45a7900000000, 0xab8f52dc00000000, + 0x8f5655bf00000000, 0x909aefe300000000, 0xb443e88000000000, + 0xd828e02500000000, 0xfcf1e74600000000, 0x41f881b400000000, + 0x652186d700000000, 0x094a8e7200000000, 0x2d93891100000000, + 0x37d2fbcb00000000, 0x130bfca800000000, 0x7f60f40d00000000, + 0x5bb9f36e00000000, 0xe6b0959c00000000, 0xc26992ff00000000, + 0xae029a5a00000000, 0x8adb9d3900000000, 0x9517276500000000, + 0xb1ce200600000000, 0xdda528a300000000, 0xf97c2fc000000000, + 0x4475493200000000, 0x60ac4e5100000000, 0x0cc746f400000000, + 0x281e419700000000}, + {0x0000000000000000, 0x08e3603c00000000, 0x10c6c17800000000, + 0x1825a14400000000, 0x208c83f100000000, 0x286fe3cd00000000, + 0x304a428900000000, 0x38a922b500000000, 0x011e763800000000, + 0x09fd160400000000, 0x11d8b74000000000, 0x193bd77c00000000, + 0x2192f5c900000000, 0x297195f500000000, 0x315434b100000000, + 0x39b7548d00000000, 0x023cec7000000000, 0x0adf8c4c00000000, + 0x12fa2d0800000000, 0x1a194d3400000000, 0x22b06f8100000000, + 0x2a530fbd00000000, 0x3276aef900000000, 0x3a95cec500000000, + 0x03229a4800000000, 0x0bc1fa7400000000, 0x13e45b3000000000, + 0x1b073b0c00000000, 0x23ae19b900000000, 0x2b4d798500000000, + 0x3368d8c100000000, 0x3b8bb8fd00000000, 0x0478d8e100000000, + 0x0c9bb8dd00000000, 0x14be199900000000, 0x1c5d79a500000000, + 0x24f45b1000000000, 0x2c173b2c00000000, 0x34329a6800000000, + 0x3cd1fa5400000000, 0x0566aed900000000, 0x0d85cee500000000, + 0x15a06fa100000000, 0x1d430f9d00000000, 0x25ea2d2800000000, + 0x2d094d1400000000, 0x352cec5000000000, 0x3dcf8c6c00000000, + 0x0644349100000000, 0x0ea754ad00000000, 0x1682f5e900000000, + 0x1e6195d500000000, 0x26c8b76000000000, 0x2e2bd75c00000000, + 0x360e761800000000, 0x3eed162400000000, 0x075a42a900000000, + 0x0fb9229500000000, 0x179c83d100000000, 0x1f7fe3ed00000000, + 0x27d6c15800000000, 0x2f35a16400000000, 0x3710002000000000, + 0x3ff3601c00000000, 0x49f6c11800000000, 0x4115a12400000000, + 0x5930006000000000, 0x51d3605c00000000, 0x697a42e900000000, + 0x619922d500000000, 0x79bc839100000000, 0x715fe3ad00000000, + 0x48e8b72000000000, 0x400bd71c00000000, 0x582e765800000000, + 0x50cd166400000000, 0x686434d100000000, 0x608754ed00000000, + 0x78a2f5a900000000, 0x7041959500000000, 0x4bca2d6800000000, + 0x43294d5400000000, 0x5b0cec1000000000, 0x53ef8c2c00000000, + 0x6b46ae9900000000, 0x63a5cea500000000, 0x7b806fe100000000, + 0x73630fdd00000000, 0x4ad45b5000000000, 0x42373b6c00000000, + 0x5a129a2800000000, 0x52f1fa1400000000, 0x6a58d8a100000000, + 0x62bbb89d00000000, 0x7a9e19d900000000, 0x727d79e500000000, + 0x4d8e19f900000000, 0x456d79c500000000, 0x5d48d88100000000, + 0x55abb8bd00000000, 0x6d029a0800000000, 0x65e1fa3400000000, + 0x7dc45b7000000000, 0x75273b4c00000000, 0x4c906fc100000000, + 0x44730ffd00000000, 0x5c56aeb900000000, 0x54b5ce8500000000, + 0x6c1cec3000000000, 0x64ff8c0c00000000, 0x7cda2d4800000000, + 0x74394d7400000000, 0x4fb2f58900000000, 0x475195b500000000, + 0x5f7434f100000000, 0x579754cd00000000, 0x6f3e767800000000, + 0x67dd164400000000, 0x7ff8b70000000000, 0x771bd73c00000000, + 0x4eac83b100000000, 0x464fe38d00000000, 0x5e6a42c900000000, + 0x568922f500000000, 0x6e20004000000000, 0x66c3607c00000000, + 0x7ee6c13800000000, 0x7605a10400000000, 0x92ec833100000000, + 0x9a0fe30d00000000, 0x822a424900000000, 0x8ac9227500000000, + 0xb26000c000000000, 0xba8360fc00000000, 0xa2a6c1b800000000, + 0xaa45a18400000000, 0x93f2f50900000000, 0x9b11953500000000, + 0x8334347100000000, 0x8bd7544d00000000, 0xb37e76f800000000, + 0xbb9d16c400000000, 0xa3b8b78000000000, 0xab5bd7bc00000000, + 0x90d06f4100000000, 0x98330f7d00000000, 0x8016ae3900000000, + 0x88f5ce0500000000, 0xb05cecb000000000, 0xb8bf8c8c00000000, + 0xa09a2dc800000000, 0xa8794df400000000, 0x91ce197900000000, + 0x992d794500000000, 0x8108d80100000000, 0x89ebb83d00000000, + 0xb1429a8800000000, 0xb9a1fab400000000, 0xa1845bf000000000, + 0xa9673bcc00000000, 0x96945bd000000000, 0x9e773bec00000000, + 0x86529aa800000000, 0x8eb1fa9400000000, 0xb618d82100000000, + 0xbefbb81d00000000, 0xa6de195900000000, 0xae3d796500000000, + 0x978a2de800000000, 0x9f694dd400000000, 0x874cec9000000000, + 0x8faf8cac00000000, 0xb706ae1900000000, 0xbfe5ce2500000000, + 0xa7c06f6100000000, 0xaf230f5d00000000, 0x94a8b7a000000000, + 0x9c4bd79c00000000, 0x846e76d800000000, 0x8c8d16e400000000, + 0xb424345100000000, 0xbcc7546d00000000, 0xa4e2f52900000000, + 0xac01951500000000, 0x95b6c19800000000, 0x9d55a1a400000000, + 0x857000e000000000, 0x8d9360dc00000000, 0xb53a426900000000, + 0xbdd9225500000000, 0xa5fc831100000000, 0xad1fe32d00000000, + 0xdb1a422900000000, 0xd3f9221500000000, 0xcbdc835100000000, + 0xc33fe36d00000000, 0xfb96c1d800000000, 0xf375a1e400000000, + 0xeb5000a000000000, 0xe3b3609c00000000, 0xda04341100000000, + 0xd2e7542d00000000, 0xcac2f56900000000, 0xc221955500000000, + 0xfa88b7e000000000, 0xf26bd7dc00000000, 0xea4e769800000000, + 0xe2ad16a400000000, 0xd926ae5900000000, 0xd1c5ce6500000000, + 0xc9e06f2100000000, 0xc1030f1d00000000, 0xf9aa2da800000000, + 0xf1494d9400000000, 0xe96cecd000000000, 0xe18f8cec00000000, + 0xd838d86100000000, 0xd0dbb85d00000000, 0xc8fe191900000000, + 0xc01d792500000000, 0xf8b45b9000000000, 0xf0573bac00000000, + 0xe8729ae800000000, 0xe091fad400000000, 0xdf629ac800000000, + 0xd781faf400000000, 0xcfa45bb000000000, 0xc7473b8c00000000, + 0xffee193900000000, 0xf70d790500000000, 0xef28d84100000000, + 0xe7cbb87d00000000, 0xde7cecf000000000, 0xd69f8ccc00000000, + 0xceba2d8800000000, 0xc6594db400000000, 0xfef06f0100000000, + 0xf6130f3d00000000, 0xee36ae7900000000, 0xe6d5ce4500000000, + 0xdd5e76b800000000, 0xd5bd168400000000, 0xcd98b7c000000000, + 0xc57bd7fc00000000, 0xfdd2f54900000000, 0xf531957500000000, + 0xed14343100000000, 0xe5f7540d00000000, 0xdc40008000000000, + 0xd4a360bc00000000, 0xcc86c1f800000000, 0xc465a1c400000000, + 0xfccc837100000000, 0xf42fe34d00000000, 0xec0a420900000000, + 0xe4e9223500000000}, + {0x0000000000000000, 0xd1e8e70e00000000, 0xa2d1cf1d00000000, + 0x7339281300000000, 0x44a39f3b00000000, 0x954b783500000000, + 0xe672502600000000, 0x379ab72800000000, 0x88463f7700000000, + 0x59aed87900000000, 0x2a97f06a00000000, 0xfb7f176400000000, + 0xcce5a04c00000000, 0x1d0d474200000000, 0x6e346f5100000000, + 0xbfdc885f00000000, 0x108d7eee00000000, 0xc16599e000000000, + 0xb25cb1f300000000, 0x63b456fd00000000, 0x542ee1d500000000, + 0x85c606db00000000, 0xf6ff2ec800000000, 0x2717c9c600000000, + 0x98cb419900000000, 0x4923a69700000000, 0x3a1a8e8400000000, + 0xebf2698a00000000, 0xdc68dea200000000, 0x0d8039ac00000000, + 0x7eb911bf00000000, 0xaf51f6b100000000, 0x611c8c0700000000, + 0xb0f46b0900000000, 0xc3cd431a00000000, 0x1225a41400000000, + 0x25bf133c00000000, 0xf457f43200000000, 0x876edc2100000000, + 0x56863b2f00000000, 0xe95ab37000000000, 0x38b2547e00000000, + 0x4b8b7c6d00000000, 0x9a639b6300000000, 0xadf92c4b00000000, + 0x7c11cb4500000000, 0x0f28e35600000000, 0xdec0045800000000, + 0x7191f2e900000000, 0xa07915e700000000, 0xd3403df400000000, + 0x02a8dafa00000000, 0x35326dd200000000, 0xe4da8adc00000000, + 0x97e3a2cf00000000, 0x460b45c100000000, 0xf9d7cd9e00000000, + 0x283f2a9000000000, 0x5b06028300000000, 0x8aeee58d00000000, + 0xbd7452a500000000, 0x6c9cb5ab00000000, 0x1fa59db800000000, + 0xce4d7ab600000000, 0xc238180f00000000, 0x13d0ff0100000000, + 0x60e9d71200000000, 0xb101301c00000000, 0x869b873400000000, + 0x5773603a00000000, 0x244a482900000000, 0xf5a2af2700000000, + 0x4a7e277800000000, 0x9b96c07600000000, 0xe8afe86500000000, + 0x39470f6b00000000, 0x0eddb84300000000, 0xdf355f4d00000000, + 0xac0c775e00000000, 0x7de4905000000000, 0xd2b566e100000000, + 0x035d81ef00000000, 0x7064a9fc00000000, 0xa18c4ef200000000, + 0x9616f9da00000000, 0x47fe1ed400000000, 0x34c736c700000000, + 0xe52fd1c900000000, 0x5af3599600000000, 0x8b1bbe9800000000, + 0xf822968b00000000, 0x29ca718500000000, 0x1e50c6ad00000000, + 0xcfb821a300000000, 0xbc8109b000000000, 0x6d69eebe00000000, + 0xa324940800000000, 0x72cc730600000000, 0x01f55b1500000000, + 0xd01dbc1b00000000, 0xe7870b3300000000, 0x366fec3d00000000, + 0x4556c42e00000000, 0x94be232000000000, 0x2b62ab7f00000000, + 0xfa8a4c7100000000, 0x89b3646200000000, 0x585b836c00000000, + 0x6fc1344400000000, 0xbe29d34a00000000, 0xcd10fb5900000000, + 0x1cf81c5700000000, 0xb3a9eae600000000, 0x62410de800000000, + 0x117825fb00000000, 0xc090c2f500000000, 0xf70a75dd00000000, + 0x26e292d300000000, 0x55dbbac000000000, 0x84335dce00000000, + 0x3befd59100000000, 0xea07329f00000000, 0x993e1a8c00000000, + 0x48d6fd8200000000, 0x7f4c4aaa00000000, 0xaea4ada400000000, + 0xdd9d85b700000000, 0x0c7562b900000000, 0x8471301e00000000, + 0x5599d71000000000, 0x26a0ff0300000000, 0xf748180d00000000, + 0xc0d2af2500000000, 0x113a482b00000000, 0x6203603800000000, + 0xb3eb873600000000, 0x0c370f6900000000, 0xdddfe86700000000, + 0xaee6c07400000000, 0x7f0e277a00000000, 0x4894905200000000, + 0x997c775c00000000, 0xea455f4f00000000, 0x3badb84100000000, + 0x94fc4ef000000000, 0x4514a9fe00000000, 0x362d81ed00000000, + 0xe7c566e300000000, 0xd05fd1cb00000000, 0x01b736c500000000, + 0x728e1ed600000000, 0xa366f9d800000000, 0x1cba718700000000, + 0xcd52968900000000, 0xbe6bbe9a00000000, 0x6f83599400000000, + 0x5819eebc00000000, 0x89f109b200000000, 0xfac821a100000000, + 0x2b20c6af00000000, 0xe56dbc1900000000, 0x34855b1700000000, + 0x47bc730400000000, 0x9654940a00000000, 0xa1ce232200000000, + 0x7026c42c00000000, 0x031fec3f00000000, 0xd2f70b3100000000, + 0x6d2b836e00000000, 0xbcc3646000000000, 0xcffa4c7300000000, + 0x1e12ab7d00000000, 0x29881c5500000000, 0xf860fb5b00000000, + 0x8b59d34800000000, 0x5ab1344600000000, 0xf5e0c2f700000000, + 0x240825f900000000, 0x57310dea00000000, 0x86d9eae400000000, + 0xb1435dcc00000000, 0x60abbac200000000, 0x139292d100000000, + 0xc27a75df00000000, 0x7da6fd8000000000, 0xac4e1a8e00000000, + 0xdf77329d00000000, 0x0e9fd59300000000, 0x390562bb00000000, + 0xe8ed85b500000000, 0x9bd4ada600000000, 0x4a3c4aa800000000, + 0x4649281100000000, 0x97a1cf1f00000000, 0xe498e70c00000000, + 0x3570000200000000, 0x02eab72a00000000, 0xd302502400000000, + 0xa03b783700000000, 0x71d39f3900000000, 0xce0f176600000000, + 0x1fe7f06800000000, 0x6cded87b00000000, 0xbd363f7500000000, + 0x8aac885d00000000, 0x5b446f5300000000, 0x287d474000000000, + 0xf995a04e00000000, 0x56c456ff00000000, 0x872cb1f100000000, + 0xf41599e200000000, 0x25fd7eec00000000, 0x1267c9c400000000, + 0xc38f2eca00000000, 0xb0b606d900000000, 0x615ee1d700000000, + 0xde82698800000000, 0x0f6a8e8600000000, 0x7c53a69500000000, + 0xadbb419b00000000, 0x9a21f6b300000000, 0x4bc911bd00000000, + 0x38f039ae00000000, 0xe918dea000000000, 0x2755a41600000000, + 0xf6bd431800000000, 0x85846b0b00000000, 0x546c8c0500000000, + 0x63f63b2d00000000, 0xb21edc2300000000, 0xc127f43000000000, + 0x10cf133e00000000, 0xaf139b6100000000, 0x7efb7c6f00000000, + 0x0dc2547c00000000, 0xdc2ab37200000000, 0xebb0045a00000000, + 0x3a58e35400000000, 0x4961cb4700000000, 0x98892c4900000000, + 0x37d8daf800000000, 0xe6303df600000000, 0x950915e500000000, + 0x44e1f2eb00000000, 0x737b45c300000000, 0xa293a2cd00000000, + 0xd1aa8ade00000000, 0x00426dd000000000, 0xbf9ee58f00000000, + 0x6e76028100000000, 0x1d4f2a9200000000, 0xcca7cd9c00000000, + 0xfb3d7ab400000000, 0x2ad59dba00000000, 0x59ecb5a900000000, + 0x880452a700000000}, + {0x0000000000000000, 0xaa05daf100000000, 0x150dc53800000000, + 0xbf081fc900000000, 0x2a1a8a7100000000, 0x801f508000000000, + 0x3f174f4900000000, 0x951295b800000000, 0x543414e300000000, + 0xfe31ce1200000000, 0x4139d1db00000000, 0xeb3c0b2a00000000, + 0x7e2e9e9200000000, 0xd42b446300000000, 0x6b235baa00000000, + 0xc126815b00000000, 0xe96e591d00000000, 0x436b83ec00000000, + 0xfc639c2500000000, 0x566646d400000000, 0xc374d36c00000000, + 0x6971099d00000000, 0xd679165400000000, 0x7c7ccca500000000, + 0xbd5a4dfe00000000, 0x175f970f00000000, 0xa85788c600000000, + 0x0252523700000000, 0x9740c78f00000000, 0x3d451d7e00000000, + 0x824d02b700000000, 0x2848d84600000000, 0xd2ddb23a00000000, + 0x78d868cb00000000, 0xc7d0770200000000, 0x6dd5adf300000000, + 0xf8c7384b00000000, 0x52c2e2ba00000000, 0xedcafd7300000000, + 0x47cf278200000000, 0x86e9a6d900000000, 0x2cec7c2800000000, + 0x93e463e100000000, 0x39e1b91000000000, 0xacf32ca800000000, + 0x06f6f65900000000, 0xb9fee99000000000, 0x13fb336100000000, + 0x3bb3eb2700000000, 0x91b631d600000000, 0x2ebe2e1f00000000, + 0x84bbf4ee00000000, 0x11a9615600000000, 0xbbacbba700000000, + 0x04a4a46e00000000, 0xaea17e9f00000000, 0x6f87ffc400000000, + 0xc582253500000000, 0x7a8a3afc00000000, 0xd08fe00d00000000, + 0x459d75b500000000, 0xef98af4400000000, 0x5090b08d00000000, + 0xfa956a7c00000000, 0xa4bb657500000000, 0x0ebebf8400000000, + 0xb1b6a04d00000000, 0x1bb37abc00000000, 0x8ea1ef0400000000, + 0x24a435f500000000, 0x9bac2a3c00000000, 0x31a9f0cd00000000, + 0xf08f719600000000, 0x5a8aab6700000000, 0xe582b4ae00000000, + 0x4f876e5f00000000, 0xda95fbe700000000, 0x7090211600000000, + 0xcf983edf00000000, 0x659de42e00000000, 0x4dd53c6800000000, + 0xe7d0e69900000000, 0x58d8f95000000000, 0xf2dd23a100000000, + 0x67cfb61900000000, 0xcdca6ce800000000, 0x72c2732100000000, + 0xd8c7a9d000000000, 0x19e1288b00000000, 0xb3e4f27a00000000, + 0x0cecedb300000000, 0xa6e9374200000000, 0x33fba2fa00000000, + 0x99fe780b00000000, 0x26f667c200000000, 0x8cf3bd3300000000, + 0x7666d74f00000000, 0xdc630dbe00000000, 0x636b127700000000, + 0xc96ec88600000000, 0x5c7c5d3e00000000, 0xf67987cf00000000, + 0x4971980600000000, 0xe37442f700000000, 0x2252c3ac00000000, + 0x8857195d00000000, 0x375f069400000000, 0x9d5adc6500000000, + 0x084849dd00000000, 0xa24d932c00000000, 0x1d458ce500000000, + 0xb740561400000000, 0x9f088e5200000000, 0x350d54a300000000, + 0x8a054b6a00000000, 0x2000919b00000000, 0xb512042300000000, + 0x1f17ded200000000, 0xa01fc11b00000000, 0x0a1a1bea00000000, + 0xcb3c9ab100000000, 0x6139404000000000, 0xde315f8900000000, + 0x7434857800000000, 0xe12610c000000000, 0x4b23ca3100000000, + 0xf42bd5f800000000, 0x5e2e0f0900000000, 0x4877cbea00000000, + 0xe272111b00000000, 0x5d7a0ed200000000, 0xf77fd42300000000, + 0x626d419b00000000, 0xc8689b6a00000000, 0x776084a300000000, + 0xdd655e5200000000, 0x1c43df0900000000, 0xb64605f800000000, + 0x094e1a3100000000, 0xa34bc0c000000000, 0x3659557800000000, + 0x9c5c8f8900000000, 0x2354904000000000, 0x89514ab100000000, + 0xa11992f700000000, 0x0b1c480600000000, 0xb41457cf00000000, + 0x1e118d3e00000000, 0x8b03188600000000, 0x2106c27700000000, + 0x9e0eddbe00000000, 0x340b074f00000000, 0xf52d861400000000, + 0x5f285ce500000000, 0xe020432c00000000, 0x4a2599dd00000000, + 0xdf370c6500000000, 0x7532d69400000000, 0xca3ac95d00000000, + 0x603f13ac00000000, 0x9aaa79d000000000, 0x30afa32100000000, + 0x8fa7bce800000000, 0x25a2661900000000, 0xb0b0f3a100000000, + 0x1ab5295000000000, 0xa5bd369900000000, 0x0fb8ec6800000000, + 0xce9e6d3300000000, 0x649bb7c200000000, 0xdb93a80b00000000, + 0x719672fa00000000, 0xe484e74200000000, 0x4e813db300000000, + 0xf189227a00000000, 0x5b8cf88b00000000, 0x73c420cd00000000, + 0xd9c1fa3c00000000, 0x66c9e5f500000000, 0xcccc3f0400000000, + 0x59deaabc00000000, 0xf3db704d00000000, 0x4cd36f8400000000, + 0xe6d6b57500000000, 0x27f0342e00000000, 0x8df5eedf00000000, + 0x32fdf11600000000, 0x98f82be700000000, 0x0deabe5f00000000, + 0xa7ef64ae00000000, 0x18e77b6700000000, 0xb2e2a19600000000, + 0xecccae9f00000000, 0x46c9746e00000000, 0xf9c16ba700000000, + 0x53c4b15600000000, 0xc6d624ee00000000, 0x6cd3fe1f00000000, + 0xd3dbe1d600000000, 0x79de3b2700000000, 0xb8f8ba7c00000000, + 0x12fd608d00000000, 0xadf57f4400000000, 0x07f0a5b500000000, + 0x92e2300d00000000, 0x38e7eafc00000000, 0x87eff53500000000, + 0x2dea2fc400000000, 0x05a2f78200000000, 0xafa72d7300000000, + 0x10af32ba00000000, 0xbaaae84b00000000, 0x2fb87df300000000, + 0x85bda70200000000, 0x3ab5b8cb00000000, 0x90b0623a00000000, + 0x5196e36100000000, 0xfb93399000000000, 0x449b265900000000, + 0xee9efca800000000, 0x7b8c691000000000, 0xd189b3e100000000, + 0x6e81ac2800000000, 0xc48476d900000000, 0x3e111ca500000000, + 0x9414c65400000000, 0x2b1cd99d00000000, 0x8119036c00000000, + 0x140b96d400000000, 0xbe0e4c2500000000, 0x010653ec00000000, + 0xab03891d00000000, 0x6a25084600000000, 0xc020d2b700000000, + 0x7f28cd7e00000000, 0xd52d178f00000000, 0x403f823700000000, + 0xea3a58c600000000, 0x5532470f00000000, 0xff379dfe00000000, + 0xd77f45b800000000, 0x7d7a9f4900000000, 0xc272808000000000, + 0x68775a7100000000, 0xfd65cfc900000000, 0x5760153800000000, + 0xe8680af100000000, 0x426dd00000000000, 0x834b515b00000000, + 0x294e8baa00000000, 0x9646946300000000, 0x3c434e9200000000, + 0xa951db2a00000000, 0x035401db00000000, 0xbc5c1e1200000000, + 0x1659c4e300000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x85d996dd, 0x4bb55c60, 0xce6ccabd, 0x966ab9c0, + 0x13b32f1d, 0xdddfe5a0, 0x5806737d, 0x6dd3035a, 0xe80a9587, + 0x26665f3a, 0xa3bfc9e7, 0xfbb9ba9a, 0x7e602c47, 0xb00ce6fa, + 0x35d57027, 0xdaa607b4, 0x5f7f9169, 0x91135bd4, 0x14cacd09, + 0x4cccbe74, 0xc91528a9, 0x0779e214, 0x82a074c9, 0xb77504ee, + 0x32ac9233, 0xfcc0588e, 0x7919ce53, 0x211fbd2e, 0xa4c62bf3, + 0x6aaae14e, 0xef737793, 0xf54b7eb3, 0x7092e86e, 0xbefe22d3, + 0x3b27b40e, 0x6321c773, 0xe6f851ae, 0x28949b13, 0xad4d0dce, + 0x98987de9, 0x1d41eb34, 0xd32d2189, 0x56f4b754, 0x0ef2c429, + 0x8b2b52f4, 0x45479849, 0xc09e0e94, 0x2fed7907, 0xaa34efda, + 0x64582567, 0xe181b3ba, 0xb987c0c7, 0x3c5e561a, 0xf2329ca7, + 0x77eb0a7a, 0x423e7a5d, 0xc7e7ec80, 0x098b263d, 0x8c52b0e0, + 0xd454c39d, 0x518d5540, 0x9fe19ffd, 0x1a380920, 0xab918dbd, + 0x2e481b60, 0xe024d1dd, 0x65fd4700, 0x3dfb347d, 0xb822a2a0, + 0x764e681d, 0xf397fec0, 0xc6428ee7, 0x439b183a, 0x8df7d287, + 0x082e445a, 0x50283727, 0xd5f1a1fa, 0x1b9d6b47, 0x9e44fd9a, + 0x71378a09, 0xf4ee1cd4, 0x3a82d669, 0xbf5b40b4, 0xe75d33c9, + 0x6284a514, 0xace86fa9, 0x2931f974, 0x1ce48953, 0x993d1f8e, + 0x5751d533, 0xd28843ee, 0x8a8e3093, 0x0f57a64e, 0xc13b6cf3, + 0x44e2fa2e, 0x5edaf30e, 0xdb0365d3, 0x156faf6e, 0x90b639b3, + 0xc8b04ace, 0x4d69dc13, 0x830516ae, 0x06dc8073, 0x3309f054, + 0xb6d06689, 0x78bcac34, 0xfd653ae9, 0xa5634994, 0x20badf49, + 0xeed615f4, 0x6b0f8329, 0x847cf4ba, 0x01a56267, 0xcfc9a8da, + 0x4a103e07, 0x12164d7a, 0x97cfdba7, 0x59a3111a, 0xdc7a87c7, + 0xe9aff7e0, 0x6c76613d, 0xa21aab80, 0x27c33d5d, 0x7fc54e20, + 0xfa1cd8fd, 0x34701240, 0xb1a9849d, 0x17256aa0, 0x92fcfc7d, + 0x5c9036c0, 0xd949a01d, 0x814fd360, 0x049645bd, 0xcafa8f00, + 0x4f2319dd, 0x7af669fa, 0xff2fff27, 0x3143359a, 0xb49aa347, + 0xec9cd03a, 0x694546e7, 0xa7298c5a, 0x22f01a87, 0xcd836d14, + 0x485afbc9, 0x86363174, 0x03efa7a9, 0x5be9d4d4, 0xde304209, + 0x105c88b4, 0x95851e69, 0xa0506e4e, 0x2589f893, 0xebe5322e, + 0x6e3ca4f3, 0x363ad78e, 0xb3e34153, 0x7d8f8bee, 0xf8561d33, + 0xe26e1413, 0x67b782ce, 0xa9db4873, 0x2c02deae, 0x7404add3, + 0xf1dd3b0e, 0x3fb1f1b3, 0xba68676e, 0x8fbd1749, 0x0a648194, + 0xc4084b29, 0x41d1ddf4, 0x19d7ae89, 0x9c0e3854, 0x5262f2e9, + 0xd7bb6434, 0x38c813a7, 0xbd11857a, 0x737d4fc7, 0xf6a4d91a, + 0xaea2aa67, 0x2b7b3cba, 0xe517f607, 0x60ce60da, 0x551b10fd, + 0xd0c28620, 0x1eae4c9d, 0x9b77da40, 0xc371a93d, 0x46a83fe0, + 0x88c4f55d, 0x0d1d6380, 0xbcb4e71d, 0x396d71c0, 0xf701bb7d, + 0x72d82da0, 0x2ade5edd, 0xaf07c800, 0x616b02bd, 0xe4b29460, + 0xd167e447, 0x54be729a, 0x9ad2b827, 0x1f0b2efa, 0x470d5d87, + 0xc2d4cb5a, 0x0cb801e7, 0x8961973a, 0x6612e0a9, 0xe3cb7674, + 0x2da7bcc9, 0xa87e2a14, 0xf0785969, 0x75a1cfb4, 0xbbcd0509, + 0x3e1493d4, 0x0bc1e3f3, 0x8e18752e, 0x4074bf93, 0xc5ad294e, + 0x9dab5a33, 0x1872ccee, 0xd61e0653, 0x53c7908e, 0x49ff99ae, + 0xcc260f73, 0x024ac5ce, 0x87935313, 0xdf95206e, 0x5a4cb6b3, + 0x94207c0e, 0x11f9ead3, 0x242c9af4, 0xa1f50c29, 0x6f99c694, + 0xea405049, 0xb2462334, 0x379fb5e9, 0xf9f37f54, 0x7c2ae989, + 0x93599e1a, 0x168008c7, 0xd8ecc27a, 0x5d3554a7, 0x053327da, + 0x80eab107, 0x4e867bba, 0xcb5fed67, 0xfe8a9d40, 0x7b530b9d, + 0xb53fc120, 0x30e657fd, 0x68e02480, 0xed39b25d, 0x235578e0, + 0xa68cee3d}, + {0x00000000, 0x76e10f9d, 0xadc46ee1, 0xdb25617c, 0x1b8fac19, + 0x6d6ea384, 0xb64bc2f8, 0xc0aacd65, 0x361e5933, 0x40ff56ae, + 0x9bda37d2, 0xed3b384f, 0x2d91f52a, 0x5b70fab7, 0x80559bcb, + 0xf6b49456, 0x6c3cb266, 0x1addbdfb, 0xc1f8dc87, 0xb719d31a, + 0x77b31e7f, 0x015211e2, 0xda77709e, 0xac967f03, 0x5a22eb55, + 0x2cc3e4c8, 0xf7e685b4, 0x81078a29, 0x41ad474c, 0x374c48d1, + 0xec6929ad, 0x9a882630, 0xd87864cd, 0xae996b50, 0x75bc0a2c, + 0x035d05b1, 0xc3f7c8d4, 0xb516c749, 0x6e33a635, 0x18d2a9a8, + 0xee663dfe, 0x98873263, 0x43a2531f, 0x35435c82, 0xf5e991e7, + 0x83089e7a, 0x582dff06, 0x2eccf09b, 0xb444d6ab, 0xc2a5d936, + 0x1980b84a, 0x6f61b7d7, 0xafcb7ab2, 0xd92a752f, 0x020f1453, + 0x74ee1bce, 0x825a8f98, 0xf4bb8005, 0x2f9ee179, 0x597feee4, + 0x99d52381, 0xef342c1c, 0x34114d60, 0x42f042fd, 0xf1f7b941, + 0x8716b6dc, 0x5c33d7a0, 0x2ad2d83d, 0xea781558, 0x9c991ac5, + 0x47bc7bb9, 0x315d7424, 0xc7e9e072, 0xb108efef, 0x6a2d8e93, + 0x1ccc810e, 0xdc664c6b, 0xaa8743f6, 0x71a2228a, 0x07432d17, + 0x9dcb0b27, 0xeb2a04ba, 0x300f65c6, 0x46ee6a5b, 0x8644a73e, + 0xf0a5a8a3, 0x2b80c9df, 0x5d61c642, 0xabd55214, 0xdd345d89, + 0x06113cf5, 0x70f03368, 0xb05afe0d, 0xc6bbf190, 0x1d9e90ec, + 0x6b7f9f71, 0x298fdd8c, 0x5f6ed211, 0x844bb36d, 0xf2aabcf0, + 0x32007195, 0x44e17e08, 0x9fc41f74, 0xe92510e9, 0x1f9184bf, + 0x69708b22, 0xb255ea5e, 0xc4b4e5c3, 0x041e28a6, 0x72ff273b, + 0xa9da4647, 0xdf3b49da, 0x45b36fea, 0x33526077, 0xe877010b, + 0x9e960e96, 0x5e3cc3f3, 0x28ddcc6e, 0xf3f8ad12, 0x8519a28f, + 0x73ad36d9, 0x054c3944, 0xde695838, 0xa88857a5, 0x68229ac0, + 0x1ec3955d, 0xc5e6f421, 0xb307fbbc, 0xe2ef7383, 0x940e7c1e, + 0x4f2b1d62, 0x39ca12ff, 0xf960df9a, 0x8f81d007, 0x54a4b17b, + 0x2245bee6, 0xd4f12ab0, 0xa210252d, 0x79354451, 0x0fd44bcc, + 0xcf7e86a9, 0xb99f8934, 0x62bae848, 0x145be7d5, 0x8ed3c1e5, + 0xf832ce78, 0x2317af04, 0x55f6a099, 0x955c6dfc, 0xe3bd6261, + 0x3898031d, 0x4e790c80, 0xb8cd98d6, 0xce2c974b, 0x1509f637, + 0x63e8f9aa, 0xa34234cf, 0xd5a33b52, 0x0e865a2e, 0x786755b3, + 0x3a97174e, 0x4c7618d3, 0x975379af, 0xe1b27632, 0x2118bb57, + 0x57f9b4ca, 0x8cdcd5b6, 0xfa3dda2b, 0x0c894e7d, 0x7a6841e0, + 0xa14d209c, 0xd7ac2f01, 0x1706e264, 0x61e7edf9, 0xbac28c85, + 0xcc238318, 0x56aba528, 0x204aaab5, 0xfb6fcbc9, 0x8d8ec454, + 0x4d240931, 0x3bc506ac, 0xe0e067d0, 0x9601684d, 0x60b5fc1b, + 0x1654f386, 0xcd7192fa, 0xbb909d67, 0x7b3a5002, 0x0ddb5f9f, + 0xd6fe3ee3, 0xa01f317e, 0x1318cac2, 0x65f9c55f, 0xbedca423, + 0xc83dabbe, 0x089766db, 0x7e766946, 0xa553083a, 0xd3b207a7, + 0x250693f1, 0x53e79c6c, 0x88c2fd10, 0xfe23f28d, 0x3e893fe8, + 0x48683075, 0x934d5109, 0xe5ac5e94, 0x7f2478a4, 0x09c57739, + 0xd2e01645, 0xa40119d8, 0x64abd4bd, 0x124adb20, 0xc96fba5c, + 0xbf8eb5c1, 0x493a2197, 0x3fdb2e0a, 0xe4fe4f76, 0x921f40eb, + 0x52b58d8e, 0x24548213, 0xff71e36f, 0x8990ecf2, 0xcb60ae0f, + 0xbd81a192, 0x66a4c0ee, 0x1045cf73, 0xd0ef0216, 0xa60e0d8b, + 0x7d2b6cf7, 0x0bca636a, 0xfd7ef73c, 0x8b9ff8a1, 0x50ba99dd, + 0x265b9640, 0xe6f15b25, 0x901054b8, 0x4b3535c4, 0x3dd43a59, + 0xa75c1c69, 0xd1bd13f4, 0x0a987288, 0x7c797d15, 0xbcd3b070, + 0xca32bfed, 0x1117de91, 0x67f6d10c, 0x9142455a, 0xe7a34ac7, + 0x3c862bbb, 0x4a672426, 0x8acde943, 0xfc2ce6de, 0x270987a2, + 0x51e8883f}, + {0x00000000, 0xe8dbfbb9, 0x91b186a8, 0x796a7d11, 0x63657c8a, + 0x8bbe8733, 0xf2d4fa22, 0x1a0f019b, 0x87cc89cf, 0x6f177276, + 0x167d0f67, 0xfea6f4de, 0xe4a9f545, 0x0c720efc, 0x751873ed, + 0x9dc38854, 0x4f9f6244, 0xa74499fd, 0xde2ee4ec, 0x36f51f55, + 0x2cfa1ece, 0xc421e577, 0xbd4b9866, 0x559063df, 0xc853eb8b, + 0x20881032, 0x59e26d23, 0xb139969a, 0xab369701, 0x43ed6cb8, + 0x3a8711a9, 0xd25cea10, 0x9e3ec588, 0x76e53e31, 0x0f8f4320, + 0xe754b899, 0xfd5bb902, 0x158042bb, 0x6cea3faa, 0x8431c413, + 0x19f24c47, 0xf129b7fe, 0x8843caef, 0x60983156, 0x7a9730cd, + 0x924ccb74, 0xeb26b665, 0x03fd4ddc, 0xd1a1a7cc, 0x397a5c75, + 0x40102164, 0xa8cbdadd, 0xb2c4db46, 0x5a1f20ff, 0x23755dee, + 0xcbaea657, 0x566d2e03, 0xbeb6d5ba, 0xc7dca8ab, 0x2f075312, + 0x35085289, 0xddd3a930, 0xa4b9d421, 0x4c622f98, 0x7d7bfbca, + 0x95a00073, 0xecca7d62, 0x041186db, 0x1e1e8740, 0xf6c57cf9, + 0x8faf01e8, 0x6774fa51, 0xfab77205, 0x126c89bc, 0x6b06f4ad, + 0x83dd0f14, 0x99d20e8f, 0x7109f536, 0x08638827, 0xe0b8739e, + 0x32e4998e, 0xda3f6237, 0xa3551f26, 0x4b8ee49f, 0x5181e504, + 0xb95a1ebd, 0xc03063ac, 0x28eb9815, 0xb5281041, 0x5df3ebf8, + 0x249996e9, 0xcc426d50, 0xd64d6ccb, 0x3e969772, 0x47fcea63, + 0xaf2711da, 0xe3453e42, 0x0b9ec5fb, 0x72f4b8ea, 0x9a2f4353, + 0x802042c8, 0x68fbb971, 0x1191c460, 0xf94a3fd9, 0x6489b78d, + 0x8c524c34, 0xf5383125, 0x1de3ca9c, 0x07eccb07, 0xef3730be, + 0x965d4daf, 0x7e86b616, 0xacda5c06, 0x4401a7bf, 0x3d6bdaae, + 0xd5b02117, 0xcfbf208c, 0x2764db35, 0x5e0ea624, 0xb6d55d9d, + 0x2b16d5c9, 0xc3cd2e70, 0xbaa75361, 0x527ca8d8, 0x4873a943, + 0xa0a852fa, 0xd9c22feb, 0x3119d452, 0xbbf0874e, 0x532b7cf7, + 0x2a4101e6, 0xc29afa5f, 0xd895fbc4, 0x304e007d, 0x49247d6c, + 0xa1ff86d5, 0x3c3c0e81, 0xd4e7f538, 0xad8d8829, 0x45567390, + 0x5f59720b, 0xb78289b2, 0xcee8f4a3, 0x26330f1a, 0xf46fe50a, + 0x1cb41eb3, 0x65de63a2, 0x8d05981b, 0x970a9980, 0x7fd16239, + 0x06bb1f28, 0xee60e491, 0x73a36cc5, 0x9b78977c, 0xe212ea6d, + 0x0ac911d4, 0x10c6104f, 0xf81debf6, 0x817796e7, 0x69ac6d5e, + 0x25ce42c6, 0xcd15b97f, 0xb47fc46e, 0x5ca43fd7, 0x46ab3e4c, + 0xae70c5f5, 0xd71ab8e4, 0x3fc1435d, 0xa202cb09, 0x4ad930b0, + 0x33b34da1, 0xdb68b618, 0xc167b783, 0x29bc4c3a, 0x50d6312b, + 0xb80dca92, 0x6a512082, 0x828adb3b, 0xfbe0a62a, 0x133b5d93, + 0x09345c08, 0xe1efa7b1, 0x9885daa0, 0x705e2119, 0xed9da94d, + 0x054652f4, 0x7c2c2fe5, 0x94f7d45c, 0x8ef8d5c7, 0x66232e7e, + 0x1f49536f, 0xf792a8d6, 0xc68b7c84, 0x2e50873d, 0x573afa2c, + 0xbfe10195, 0xa5ee000e, 0x4d35fbb7, 0x345f86a6, 0xdc847d1f, + 0x4147f54b, 0xa99c0ef2, 0xd0f673e3, 0x382d885a, 0x222289c1, + 0xcaf97278, 0xb3930f69, 0x5b48f4d0, 0x89141ec0, 0x61cfe579, + 0x18a59868, 0xf07e63d1, 0xea71624a, 0x02aa99f3, 0x7bc0e4e2, + 0x931b1f5b, 0x0ed8970f, 0xe6036cb6, 0x9f6911a7, 0x77b2ea1e, + 0x6dbdeb85, 0x8566103c, 0xfc0c6d2d, 0x14d79694, 0x58b5b90c, + 0xb06e42b5, 0xc9043fa4, 0x21dfc41d, 0x3bd0c586, 0xd30b3e3f, + 0xaa61432e, 0x42bab897, 0xdf7930c3, 0x37a2cb7a, 0x4ec8b66b, + 0xa6134dd2, 0xbc1c4c49, 0x54c7b7f0, 0x2dadcae1, 0xc5763158, + 0x172adb48, 0xfff120f1, 0x869b5de0, 0x6e40a659, 0x744fa7c2, + 0x9c945c7b, 0xe5fe216a, 0x0d25dad3, 0x90e65287, 0x783da93e, + 0x0157d42f, 0xe98c2f96, 0xf3832e0d, 0x1b58d5b4, 0x6232a8a5, + 0x8ae9531c}, + {0x00000000, 0x919168ae, 0x6325a087, 0xf2b4c829, 0x874c31d4, + 0x16dd597a, 0xe4699153, 0x75f8f9fd, 0x4f9f1373, 0xde0e7bdd, + 0x2cbab3f4, 0xbd2bdb5a, 0xc8d322a7, 0x59424a09, 0xabf68220, + 0x3a67ea8e, 0x9e3e27e6, 0x0faf4f48, 0xfd1b8761, 0x6c8aefcf, + 0x19721632, 0x88e37e9c, 0x7a57b6b5, 0xebc6de1b, 0xd1a13495, + 0x40305c3b, 0xb2849412, 0x2315fcbc, 0x56ed0541, 0xc77c6def, + 0x35c8a5c6, 0xa459cd68, 0x7d7b3f17, 0xecea57b9, 0x1e5e9f90, + 0x8fcff73e, 0xfa370ec3, 0x6ba6666d, 0x9912ae44, 0x0883c6ea, + 0x32e42c64, 0xa37544ca, 0x51c18ce3, 0xc050e44d, 0xb5a81db0, + 0x2439751e, 0xd68dbd37, 0x471cd599, 0xe34518f1, 0x72d4705f, + 0x8060b876, 0x11f1d0d8, 0x64092925, 0xf598418b, 0x072c89a2, + 0x96bde10c, 0xacda0b82, 0x3d4b632c, 0xcfffab05, 0x5e6ec3ab, + 0x2b963a56, 0xba0752f8, 0x48b39ad1, 0xd922f27f, 0xfaf67e2e, + 0x6b671680, 0x99d3dea9, 0x0842b607, 0x7dba4ffa, 0xec2b2754, + 0x1e9fef7d, 0x8f0e87d3, 0xb5696d5d, 0x24f805f3, 0xd64ccdda, + 0x47dda574, 0x32255c89, 0xa3b43427, 0x5100fc0e, 0xc09194a0, + 0x64c859c8, 0xf5593166, 0x07edf94f, 0x967c91e1, 0xe384681c, + 0x721500b2, 0x80a1c89b, 0x1130a035, 0x2b574abb, 0xbac62215, + 0x4872ea3c, 0xd9e38292, 0xac1b7b6f, 0x3d8a13c1, 0xcf3edbe8, + 0x5eafb346, 0x878d4139, 0x161c2997, 0xe4a8e1be, 0x75398910, + 0x00c170ed, 0x91501843, 0x63e4d06a, 0xf275b8c4, 0xc812524a, + 0x59833ae4, 0xab37f2cd, 0x3aa69a63, 0x4f5e639e, 0xdecf0b30, + 0x2c7bc319, 0xbdeaabb7, 0x19b366df, 0x88220e71, 0x7a96c658, + 0xeb07aef6, 0x9eff570b, 0x0f6e3fa5, 0xfddaf78c, 0x6c4b9f22, + 0x562c75ac, 0xc7bd1d02, 0x3509d52b, 0xa498bd85, 0xd1604478, + 0x40f12cd6, 0xb245e4ff, 0x23d48c51, 0xf4edfd5c, 0x657c95f2, + 0x97c85ddb, 0x06593575, 0x73a1cc88, 0xe230a426, 0x10846c0f, + 0x811504a1, 0xbb72ee2f, 0x2ae38681, 0xd8574ea8, 0x49c62606, + 0x3c3edffb, 0xadafb755, 0x5f1b7f7c, 0xce8a17d2, 0x6ad3daba, + 0xfb42b214, 0x09f67a3d, 0x98671293, 0xed9feb6e, 0x7c0e83c0, + 0x8eba4be9, 0x1f2b2347, 0x254cc9c9, 0xb4dda167, 0x4669694e, + 0xd7f801e0, 0xa200f81d, 0x339190b3, 0xc125589a, 0x50b43034, + 0x8996c24b, 0x1807aae5, 0xeab362cc, 0x7b220a62, 0x0edaf39f, + 0x9f4b9b31, 0x6dff5318, 0xfc6e3bb6, 0xc609d138, 0x5798b996, + 0xa52c71bf, 0x34bd1911, 0x4145e0ec, 0xd0d48842, 0x2260406b, + 0xb3f128c5, 0x17a8e5ad, 0x86398d03, 0x748d452a, 0xe51c2d84, + 0x90e4d479, 0x0175bcd7, 0xf3c174fe, 0x62501c50, 0x5837f6de, + 0xc9a69e70, 0x3b125659, 0xaa833ef7, 0xdf7bc70a, 0x4eeaafa4, + 0xbc5e678d, 0x2dcf0f23, 0x0e1b8372, 0x9f8aebdc, 0x6d3e23f5, + 0xfcaf4b5b, 0x8957b2a6, 0x18c6da08, 0xea721221, 0x7be37a8f, + 0x41849001, 0xd015f8af, 0x22a13086, 0xb3305828, 0xc6c8a1d5, + 0x5759c97b, 0xa5ed0152, 0x347c69fc, 0x9025a494, 0x01b4cc3a, + 0xf3000413, 0x62916cbd, 0x17699540, 0x86f8fdee, 0x744c35c7, + 0xe5dd5d69, 0xdfbab7e7, 0x4e2bdf49, 0xbc9f1760, 0x2d0e7fce, + 0x58f68633, 0xc967ee9d, 0x3bd326b4, 0xaa424e1a, 0x7360bc65, + 0xe2f1d4cb, 0x10451ce2, 0x81d4744c, 0xf42c8db1, 0x65bde51f, + 0x97092d36, 0x06984598, 0x3cffaf16, 0xad6ec7b8, 0x5fda0f91, + 0xce4b673f, 0xbbb39ec2, 0x2a22f66c, 0xd8963e45, 0x490756eb, + 0xed5e9b83, 0x7ccff32d, 0x8e7b3b04, 0x1fea53aa, 0x6a12aa57, + 0xfb83c2f9, 0x09370ad0, 0x98a6627e, 0xa2c188f0, 0x3350e05e, + 0xc1e42877, 0x507540d9, 0x258db924, 0xb41cd18a, 0x46a819a3, + 0xd739710d}}; + +#endif + +#endif + +#if N == 5 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xaf449247, 0x85f822cf, 0x2abcb088, 0xd08143df, + 0x7fc5d198, 0x55796110, 0xfa3df357, 0x7a7381ff, 0xd53713b8, + 0xff8ba330, 0x50cf3177, 0xaaf2c220, 0x05b65067, 0x2f0ae0ef, + 0x804e72a8, 0xf4e703fe, 0x5ba391b9, 0x711f2131, 0xde5bb376, + 0x24664021, 0x8b22d266, 0xa19e62ee, 0x0edaf0a9, 0x8e948201, + 0x21d01046, 0x0b6ca0ce, 0xa4283289, 0x5e15c1de, 0xf1515399, + 0xdbede311, 0x74a97156, 0x32bf01bd, 0x9dfb93fa, 0xb7472372, + 0x1803b135, 0xe23e4262, 0x4d7ad025, 0x67c660ad, 0xc882f2ea, + 0x48cc8042, 0xe7881205, 0xcd34a28d, 0x627030ca, 0x984dc39d, + 0x370951da, 0x1db5e152, 0xb2f17315, 0xc6580243, 0x691c9004, + 0x43a0208c, 0xece4b2cb, 0x16d9419c, 0xb99dd3db, 0x93216353, + 0x3c65f114, 0xbc2b83bc, 0x136f11fb, 0x39d3a173, 0x96973334, + 0x6caac063, 0xc3ee5224, 0xe952e2ac, 0x461670eb, 0x657e037a, + 0xca3a913d, 0xe08621b5, 0x4fc2b3f2, 0xb5ff40a5, 0x1abbd2e2, + 0x3007626a, 0x9f43f02d, 0x1f0d8285, 0xb04910c2, 0x9af5a04a, + 0x35b1320d, 0xcf8cc15a, 0x60c8531d, 0x4a74e395, 0xe53071d2, + 0x91990084, 0x3edd92c3, 0x1461224b, 0xbb25b00c, 0x4118435b, + 0xee5cd11c, 0xc4e06194, 0x6ba4f3d3, 0xebea817b, 0x44ae133c, + 0x6e12a3b4, 0xc15631f3, 0x3b6bc2a4, 0x942f50e3, 0xbe93e06b, + 0x11d7722c, 0x57c102c7, 0xf8859080, 0xd2392008, 0x7d7db24f, + 0x87404118, 0x2804d35f, 0x02b863d7, 0xadfcf190, 0x2db28338, + 0x82f6117f, 0xa84aa1f7, 0x070e33b0, 0xfd33c0e7, 0x527752a0, + 0x78cbe228, 0xd78f706f, 0xa3260139, 0x0c62937e, 0x26de23f6, + 0x899ab1b1, 0x73a742e6, 0xdce3d0a1, 0xf65f6029, 0x591bf26e, + 0xd95580c6, 0x76111281, 0x5cada209, 0xf3e9304e, 0x09d4c319, + 0xa690515e, 0x8c2ce1d6, 0x23687391, 0xcafc06f4, 0x65b894b3, + 0x4f04243b, 0xe040b67c, 0x1a7d452b, 0xb539d76c, 0x9f8567e4, + 0x30c1f5a3, 0xb08f870b, 0x1fcb154c, 0x3577a5c4, 0x9a333783, + 0x600ec4d4, 0xcf4a5693, 0xe5f6e61b, 0x4ab2745c, 0x3e1b050a, + 0x915f974d, 0xbbe327c5, 0x14a7b582, 0xee9a46d5, 0x41ded492, + 0x6b62641a, 0xc426f65d, 0x446884f5, 0xeb2c16b2, 0xc190a63a, + 0x6ed4347d, 0x94e9c72a, 0x3bad556d, 0x1111e5e5, 0xbe5577a2, + 0xf8430749, 0x5707950e, 0x7dbb2586, 0xd2ffb7c1, 0x28c24496, + 0x8786d6d1, 0xad3a6659, 0x027ef41e, 0x823086b6, 0x2d7414f1, + 0x07c8a479, 0xa88c363e, 0x52b1c569, 0xfdf5572e, 0xd749e7a6, + 0x780d75e1, 0x0ca404b7, 0xa3e096f0, 0x895c2678, 0x2618b43f, + 0xdc254768, 0x7361d52f, 0x59dd65a7, 0xf699f7e0, 0x76d78548, + 0xd993170f, 0xf32fa787, 0x5c6b35c0, 0xa656c697, 0x091254d0, + 0x23aee458, 0x8cea761f, 0xaf82058e, 0x00c697c9, 0x2a7a2741, + 0x853eb506, 0x7f034651, 0xd047d416, 0xfafb649e, 0x55bff6d9, + 0xd5f18471, 0x7ab51636, 0x5009a6be, 0xff4d34f9, 0x0570c7ae, + 0xaa3455e9, 0x8088e561, 0x2fcc7726, 0x5b650670, 0xf4219437, + 0xde9d24bf, 0x71d9b6f8, 0x8be445af, 0x24a0d7e8, 0x0e1c6760, + 0xa158f527, 0x2116878f, 0x8e5215c8, 0xa4eea540, 0x0baa3707, + 0xf197c450, 0x5ed35617, 0x746fe69f, 0xdb2b74d8, 0x9d3d0433, + 0x32799674, 0x18c526fc, 0xb781b4bb, 0x4dbc47ec, 0xe2f8d5ab, + 0xc8446523, 0x6700f764, 0xe74e85cc, 0x480a178b, 0x62b6a703, + 0xcdf23544, 0x37cfc613, 0x988b5454, 0xb237e4dc, 0x1d73769b, + 0x69da07cd, 0xc69e958a, 0xec222502, 0x4366b745, 0xb95b4412, + 0x161fd655, 0x3ca366dd, 0x93e7f49a, 0x13a98632, 0xbced1475, + 0x9651a4fd, 0x391536ba, 0xc328c5ed, 0x6c6c57aa, 0x46d0e722, + 0xe9947565}, + {0x00000000, 0x4e890ba9, 0x9d121752, 0xd39b1cfb, 0xe15528e5, + 0xafdc234c, 0x7c473fb7, 0x32ce341e, 0x19db578b, 0x57525c22, + 0x84c940d9, 0xca404b70, 0xf88e7f6e, 0xb60774c7, 0x659c683c, + 0x2b156395, 0x33b6af16, 0x7d3fa4bf, 0xaea4b844, 0xe02db3ed, + 0xd2e387f3, 0x9c6a8c5a, 0x4ff190a1, 0x01789b08, 0x2a6df89d, + 0x64e4f334, 0xb77fefcf, 0xf9f6e466, 0xcb38d078, 0x85b1dbd1, + 0x562ac72a, 0x18a3cc83, 0x676d5e2c, 0x29e45585, 0xfa7f497e, + 0xb4f642d7, 0x863876c9, 0xc8b17d60, 0x1b2a619b, 0x55a36a32, + 0x7eb609a7, 0x303f020e, 0xe3a41ef5, 0xad2d155c, 0x9fe32142, + 0xd16a2aeb, 0x02f13610, 0x4c783db9, 0x54dbf13a, 0x1a52fa93, + 0xc9c9e668, 0x8740edc1, 0xb58ed9df, 0xfb07d276, 0x289cce8d, + 0x6615c524, 0x4d00a6b1, 0x0389ad18, 0xd012b1e3, 0x9e9bba4a, + 0xac558e54, 0xe2dc85fd, 0x31479906, 0x7fce92af, 0xcedabc58, + 0x8053b7f1, 0x53c8ab0a, 0x1d41a0a3, 0x2f8f94bd, 0x61069f14, + 0xb29d83ef, 0xfc148846, 0xd701ebd3, 0x9988e07a, 0x4a13fc81, + 0x049af728, 0x3654c336, 0x78ddc89f, 0xab46d464, 0xe5cfdfcd, + 0xfd6c134e, 0xb3e518e7, 0x607e041c, 0x2ef70fb5, 0x1c393bab, + 0x52b03002, 0x812b2cf9, 0xcfa22750, 0xe4b744c5, 0xaa3e4f6c, + 0x79a55397, 0x372c583e, 0x05e26c20, 0x4b6b6789, 0x98f07b72, + 0xd67970db, 0xa9b7e274, 0xe73ee9dd, 0x34a5f526, 0x7a2cfe8f, + 0x48e2ca91, 0x066bc138, 0xd5f0ddc3, 0x9b79d66a, 0xb06cb5ff, + 0xfee5be56, 0x2d7ea2ad, 0x63f7a904, 0x51399d1a, 0x1fb096b3, + 0xcc2b8a48, 0x82a281e1, 0x9a014d62, 0xd48846cb, 0x07135a30, + 0x499a5199, 0x7b546587, 0x35dd6e2e, 0xe64672d5, 0xa8cf797c, + 0x83da1ae9, 0xcd531140, 0x1ec80dbb, 0x50410612, 0x628f320c, + 0x2c0639a5, 0xff9d255e, 0xb1142ef7, 0x46c47ef1, 0x084d7558, + 0xdbd669a3, 0x955f620a, 0xa7915614, 0xe9185dbd, 0x3a834146, + 0x740a4aef, 0x5f1f297a, 0x119622d3, 0xc20d3e28, 0x8c843581, + 0xbe4a019f, 0xf0c30a36, 0x235816cd, 0x6dd11d64, 0x7572d1e7, + 0x3bfbda4e, 0xe860c6b5, 0xa6e9cd1c, 0x9427f902, 0xdaaef2ab, + 0x0935ee50, 0x47bce5f9, 0x6ca9866c, 0x22208dc5, 0xf1bb913e, + 0xbf329a97, 0x8dfcae89, 0xc375a520, 0x10eeb9db, 0x5e67b272, + 0x21a920dd, 0x6f202b74, 0xbcbb378f, 0xf2323c26, 0xc0fc0838, + 0x8e750391, 0x5dee1f6a, 0x136714c3, 0x38727756, 0x76fb7cff, + 0xa5606004, 0xebe96bad, 0xd9275fb3, 0x97ae541a, 0x443548e1, + 0x0abc4348, 0x121f8fcb, 0x5c968462, 0x8f0d9899, 0xc1849330, + 0xf34aa72e, 0xbdc3ac87, 0x6e58b07c, 0x20d1bbd5, 0x0bc4d840, + 0x454dd3e9, 0x96d6cf12, 0xd85fc4bb, 0xea91f0a5, 0xa418fb0c, + 0x7783e7f7, 0x390aec5e, 0x881ec2a9, 0xc697c900, 0x150cd5fb, + 0x5b85de52, 0x694bea4c, 0x27c2e1e5, 0xf459fd1e, 0xbad0f6b7, + 0x91c59522, 0xdf4c9e8b, 0x0cd78270, 0x425e89d9, 0x7090bdc7, + 0x3e19b66e, 0xed82aa95, 0xa30ba13c, 0xbba86dbf, 0xf5216616, + 0x26ba7aed, 0x68337144, 0x5afd455a, 0x14744ef3, 0xc7ef5208, + 0x896659a1, 0xa2733a34, 0xecfa319d, 0x3f612d66, 0x71e826cf, + 0x432612d1, 0x0daf1978, 0xde340583, 0x90bd0e2a, 0xef739c85, + 0xa1fa972c, 0x72618bd7, 0x3ce8807e, 0x0e26b460, 0x40afbfc9, + 0x9334a332, 0xddbda89b, 0xf6a8cb0e, 0xb821c0a7, 0x6bbadc5c, + 0x2533d7f5, 0x17fde3eb, 0x5974e842, 0x8aeff4b9, 0xc466ff10, + 0xdcc53393, 0x924c383a, 0x41d724c1, 0x0f5e2f68, 0x3d901b76, + 0x731910df, 0xa0820c24, 0xee0b078d, 0xc51e6418, 0x8b976fb1, + 0x580c734a, 0x168578e3, 0x244b4cfd, 0x6ac24754, 0xb9595baf, + 0xf7d05006}, + {0x00000000, 0x8d88fde2, 0xc060fd85, 0x4de80067, 0x5bb0fd4b, + 0xd63800a9, 0x9bd000ce, 0x1658fd2c, 0xb761fa96, 0x3ae90774, + 0x77010713, 0xfa89faf1, 0xecd107dd, 0x6159fa3f, 0x2cb1fa58, + 0xa13907ba, 0xb5b2f36d, 0x383a0e8f, 0x75d20ee8, 0xf85af30a, + 0xee020e26, 0x638af3c4, 0x2e62f3a3, 0xa3ea0e41, 0x02d309fb, + 0x8f5bf419, 0xc2b3f47e, 0x4f3b099c, 0x5963f4b0, 0xd4eb0952, + 0x99030935, 0x148bf4d7, 0xb014e09b, 0x3d9c1d79, 0x70741d1e, + 0xfdfce0fc, 0xeba41dd0, 0x662ce032, 0x2bc4e055, 0xa64c1db7, + 0x07751a0d, 0x8afde7ef, 0xc715e788, 0x4a9d1a6a, 0x5cc5e746, + 0xd14d1aa4, 0x9ca51ac3, 0x112de721, 0x05a613f6, 0x882eee14, + 0xc5c6ee73, 0x484e1391, 0x5e16eebd, 0xd39e135f, 0x9e761338, + 0x13feeeda, 0xb2c7e960, 0x3f4f1482, 0x72a714e5, 0xff2fe907, + 0xe977142b, 0x64ffe9c9, 0x2917e9ae, 0xa49f144c, 0xbb58c777, + 0x36d03a95, 0x7b383af2, 0xf6b0c710, 0xe0e83a3c, 0x6d60c7de, + 0x2088c7b9, 0xad003a5b, 0x0c393de1, 0x81b1c003, 0xcc59c064, + 0x41d13d86, 0x5789c0aa, 0xda013d48, 0x97e93d2f, 0x1a61c0cd, + 0x0eea341a, 0x8362c9f8, 0xce8ac99f, 0x4302347d, 0x555ac951, + 0xd8d234b3, 0x953a34d4, 0x18b2c936, 0xb98bce8c, 0x3403336e, + 0x79eb3309, 0xf463ceeb, 0xe23b33c7, 0x6fb3ce25, 0x225bce42, + 0xafd333a0, 0x0b4c27ec, 0x86c4da0e, 0xcb2cda69, 0x46a4278b, + 0x50fcdaa7, 0xdd742745, 0x909c2722, 0x1d14dac0, 0xbc2ddd7a, + 0x31a52098, 0x7c4d20ff, 0xf1c5dd1d, 0xe79d2031, 0x6a15ddd3, + 0x27fdddb4, 0xaa752056, 0xbefed481, 0x33762963, 0x7e9e2904, + 0xf316d4e6, 0xe54e29ca, 0x68c6d428, 0x252ed44f, 0xa8a629ad, + 0x099f2e17, 0x8417d3f5, 0xc9ffd392, 0x44772e70, 0x522fd35c, + 0xdfa72ebe, 0x924f2ed9, 0x1fc7d33b, 0xadc088af, 0x2048754d, + 0x6da0752a, 0xe02888c8, 0xf67075e4, 0x7bf88806, 0x36108861, + 0xbb987583, 0x1aa17239, 0x97298fdb, 0xdac18fbc, 0x5749725e, + 0x41118f72, 0xcc997290, 0x817172f7, 0x0cf98f15, 0x18727bc2, + 0x95fa8620, 0xd8128647, 0x559a7ba5, 0x43c28689, 0xce4a7b6b, + 0x83a27b0c, 0x0e2a86ee, 0xaf138154, 0x229b7cb6, 0x6f737cd1, + 0xe2fb8133, 0xf4a37c1f, 0x792b81fd, 0x34c3819a, 0xb94b7c78, + 0x1dd46834, 0x905c95d6, 0xddb495b1, 0x503c6853, 0x4664957f, + 0xcbec689d, 0x860468fa, 0x0b8c9518, 0xaab592a2, 0x273d6f40, + 0x6ad56f27, 0xe75d92c5, 0xf1056fe9, 0x7c8d920b, 0x3165926c, + 0xbced6f8e, 0xa8669b59, 0x25ee66bb, 0x680666dc, 0xe58e9b3e, + 0xf3d66612, 0x7e5e9bf0, 0x33b69b97, 0xbe3e6675, 0x1f0761cf, + 0x928f9c2d, 0xdf679c4a, 0x52ef61a8, 0x44b79c84, 0xc93f6166, + 0x84d76101, 0x095f9ce3, 0x16984fd8, 0x9b10b23a, 0xd6f8b25d, + 0x5b704fbf, 0x4d28b293, 0xc0a04f71, 0x8d484f16, 0x00c0b2f4, + 0xa1f9b54e, 0x2c7148ac, 0x619948cb, 0xec11b529, 0xfa494805, + 0x77c1b5e7, 0x3a29b580, 0xb7a14862, 0xa32abcb5, 0x2ea24157, + 0x634a4130, 0xeec2bcd2, 0xf89a41fe, 0x7512bc1c, 0x38fabc7b, + 0xb5724199, 0x144b4623, 0x99c3bbc1, 0xd42bbba6, 0x59a34644, + 0x4ffbbb68, 0xc273468a, 0x8f9b46ed, 0x0213bb0f, 0xa68caf43, + 0x2b0452a1, 0x66ec52c6, 0xeb64af24, 0xfd3c5208, 0x70b4afea, + 0x3d5caf8d, 0xb0d4526f, 0x11ed55d5, 0x9c65a837, 0xd18da850, + 0x5c0555b2, 0x4a5da89e, 0xc7d5557c, 0x8a3d551b, 0x07b5a8f9, + 0x133e5c2e, 0x9eb6a1cc, 0xd35ea1ab, 0x5ed65c49, 0x488ea165, + 0xc5065c87, 0x88ee5ce0, 0x0566a102, 0xa45fa6b8, 0x29d75b5a, + 0x643f5b3d, 0xe9b7a6df, 0xffef5bf3, 0x7267a611, 0x3f8fa676, + 0xb2075b94}, + {0x00000000, 0x80f0171f, 0xda91287f, 0x5a613f60, 0x6e5356bf, + 0xeea341a0, 0xb4c27ec0, 0x343269df, 0xdca6ad7e, 0x5c56ba61, + 0x06378501, 0x86c7921e, 0xb2f5fbc1, 0x3205ecde, 0x6864d3be, + 0xe894c4a1, 0x623c5cbd, 0xe2cc4ba2, 0xb8ad74c2, 0x385d63dd, + 0x0c6f0a02, 0x8c9f1d1d, 0xd6fe227d, 0x560e3562, 0xbe9af1c3, + 0x3e6ae6dc, 0x640bd9bc, 0xe4fbcea3, 0xd0c9a77c, 0x5039b063, + 0x0a588f03, 0x8aa8981c, 0xc478b97a, 0x4488ae65, 0x1ee99105, + 0x9e19861a, 0xaa2befc5, 0x2adbf8da, 0x70bac7ba, 0xf04ad0a5, + 0x18de1404, 0x982e031b, 0xc24f3c7b, 0x42bf2b64, 0x768d42bb, + 0xf67d55a4, 0xac1c6ac4, 0x2cec7ddb, 0xa644e5c7, 0x26b4f2d8, + 0x7cd5cdb8, 0xfc25daa7, 0xc817b378, 0x48e7a467, 0x12869b07, + 0x92768c18, 0x7ae248b9, 0xfa125fa6, 0xa07360c6, 0x208377d9, + 0x14b11e06, 0x94410919, 0xce203679, 0x4ed02166, 0x538074b5, + 0xd37063aa, 0x89115cca, 0x09e14bd5, 0x3dd3220a, 0xbd233515, + 0xe7420a75, 0x67b21d6a, 0x8f26d9cb, 0x0fd6ced4, 0x55b7f1b4, + 0xd547e6ab, 0xe1758f74, 0x6185986b, 0x3be4a70b, 0xbb14b014, + 0x31bc2808, 0xb14c3f17, 0xeb2d0077, 0x6bdd1768, 0x5fef7eb7, + 0xdf1f69a8, 0x857e56c8, 0x058e41d7, 0xed1a8576, 0x6dea9269, + 0x378bad09, 0xb77bba16, 0x8349d3c9, 0x03b9c4d6, 0x59d8fbb6, + 0xd928eca9, 0x97f8cdcf, 0x1708dad0, 0x4d69e5b0, 0xcd99f2af, + 0xf9ab9b70, 0x795b8c6f, 0x233ab30f, 0xa3caa410, 0x4b5e60b1, + 0xcbae77ae, 0x91cf48ce, 0x113f5fd1, 0x250d360e, 0xa5fd2111, + 0xff9c1e71, 0x7f6c096e, 0xf5c49172, 0x7534866d, 0x2f55b90d, + 0xafa5ae12, 0x9b97c7cd, 0x1b67d0d2, 0x4106efb2, 0xc1f6f8ad, + 0x29623c0c, 0xa9922b13, 0xf3f31473, 0x7303036c, 0x47316ab3, + 0xc7c17dac, 0x9da042cc, 0x1d5055d3, 0xa700e96a, 0x27f0fe75, + 0x7d91c115, 0xfd61d60a, 0xc953bfd5, 0x49a3a8ca, 0x13c297aa, + 0x933280b5, 0x7ba64414, 0xfb56530b, 0xa1376c6b, 0x21c77b74, + 0x15f512ab, 0x950505b4, 0xcf643ad4, 0x4f942dcb, 0xc53cb5d7, + 0x45cca2c8, 0x1fad9da8, 0x9f5d8ab7, 0xab6fe368, 0x2b9ff477, + 0x71fecb17, 0xf10edc08, 0x199a18a9, 0x996a0fb6, 0xc30b30d6, + 0x43fb27c9, 0x77c94e16, 0xf7395909, 0xad586669, 0x2da87176, + 0x63785010, 0xe388470f, 0xb9e9786f, 0x39196f70, 0x0d2b06af, + 0x8ddb11b0, 0xd7ba2ed0, 0x574a39cf, 0xbfdefd6e, 0x3f2eea71, + 0x654fd511, 0xe5bfc20e, 0xd18dabd1, 0x517dbcce, 0x0b1c83ae, + 0x8bec94b1, 0x01440cad, 0x81b41bb2, 0xdbd524d2, 0x5b2533cd, + 0x6f175a12, 0xefe74d0d, 0xb586726d, 0x35766572, 0xdde2a1d3, + 0x5d12b6cc, 0x077389ac, 0x87839eb3, 0xb3b1f76c, 0x3341e073, + 0x6920df13, 0xe9d0c80c, 0xf4809ddf, 0x74708ac0, 0x2e11b5a0, + 0xaee1a2bf, 0x9ad3cb60, 0x1a23dc7f, 0x4042e31f, 0xc0b2f400, + 0x282630a1, 0xa8d627be, 0xf2b718de, 0x72470fc1, 0x4675661e, + 0xc6857101, 0x9ce44e61, 0x1c14597e, 0x96bcc162, 0x164cd67d, + 0x4c2de91d, 0xccddfe02, 0xf8ef97dd, 0x781f80c2, 0x227ebfa2, + 0xa28ea8bd, 0x4a1a6c1c, 0xcaea7b03, 0x908b4463, 0x107b537c, + 0x24493aa3, 0xa4b92dbc, 0xfed812dc, 0x7e2805c3, 0x30f824a5, + 0xb00833ba, 0xea690cda, 0x6a991bc5, 0x5eab721a, 0xde5b6505, + 0x843a5a65, 0x04ca4d7a, 0xec5e89db, 0x6cae9ec4, 0x36cfa1a4, + 0xb63fb6bb, 0x820ddf64, 0x02fdc87b, 0x589cf71b, 0xd86ce004, + 0x52c47818, 0xd2346f07, 0x88555067, 0x08a54778, 0x3c972ea7, + 0xbc6739b8, 0xe60606d8, 0x66f611c7, 0x8e62d566, 0x0e92c279, + 0x54f3fd19, 0xd403ea06, 0xe03183d9, 0x60c194c6, 0x3aa0aba6, + 0xba50bcb9}, + {0x00000000, 0x9570d495, 0xf190af6b, 0x64e07bfe, 0x38505897, + 0xad208c02, 0xc9c0f7fc, 0x5cb02369, 0x70a0b12e, 0xe5d065bb, + 0x81301e45, 0x1440cad0, 0x48f0e9b9, 0xdd803d2c, 0xb96046d2, + 0x2c109247, 0xe141625c, 0x7431b6c9, 0x10d1cd37, 0x85a119a2, + 0xd9113acb, 0x4c61ee5e, 0x288195a0, 0xbdf14135, 0x91e1d372, + 0x049107e7, 0x60717c19, 0xf501a88c, 0xa9b18be5, 0x3cc15f70, + 0x5821248e, 0xcd51f01b, 0x19f3c2f9, 0x8c83166c, 0xe8636d92, + 0x7d13b907, 0x21a39a6e, 0xb4d34efb, 0xd0333505, 0x4543e190, + 0x695373d7, 0xfc23a742, 0x98c3dcbc, 0x0db30829, 0x51032b40, + 0xc473ffd5, 0xa093842b, 0x35e350be, 0xf8b2a0a5, 0x6dc27430, + 0x09220fce, 0x9c52db5b, 0xc0e2f832, 0x55922ca7, 0x31725759, + 0xa40283cc, 0x8812118b, 0x1d62c51e, 0x7982bee0, 0xecf26a75, + 0xb042491c, 0x25329d89, 0x41d2e677, 0xd4a232e2, 0x33e785f2, + 0xa6975167, 0xc2772a99, 0x5707fe0c, 0x0bb7dd65, 0x9ec709f0, + 0xfa27720e, 0x6f57a69b, 0x434734dc, 0xd637e049, 0xb2d79bb7, + 0x27a74f22, 0x7b176c4b, 0xee67b8de, 0x8a87c320, 0x1ff717b5, + 0xd2a6e7ae, 0x47d6333b, 0x233648c5, 0xb6469c50, 0xeaf6bf39, + 0x7f866bac, 0x1b661052, 0x8e16c4c7, 0xa2065680, 0x37768215, + 0x5396f9eb, 0xc6e62d7e, 0x9a560e17, 0x0f26da82, 0x6bc6a17c, + 0xfeb675e9, 0x2a14470b, 0xbf64939e, 0xdb84e860, 0x4ef43cf5, + 0x12441f9c, 0x8734cb09, 0xe3d4b0f7, 0x76a46462, 0x5ab4f625, + 0xcfc422b0, 0xab24594e, 0x3e548ddb, 0x62e4aeb2, 0xf7947a27, + 0x937401d9, 0x0604d54c, 0xcb552557, 0x5e25f1c2, 0x3ac58a3c, + 0xafb55ea9, 0xf3057dc0, 0x6675a955, 0x0295d2ab, 0x97e5063e, + 0xbbf59479, 0x2e8540ec, 0x4a653b12, 0xdf15ef87, 0x83a5ccee, + 0x16d5187b, 0x72356385, 0xe745b710, 0x67cf0be4, 0xf2bfdf71, + 0x965fa48f, 0x032f701a, 0x5f9f5373, 0xcaef87e6, 0xae0ffc18, + 0x3b7f288d, 0x176fbaca, 0x821f6e5f, 0xe6ff15a1, 0x738fc134, + 0x2f3fe25d, 0xba4f36c8, 0xdeaf4d36, 0x4bdf99a3, 0x868e69b8, + 0x13febd2d, 0x771ec6d3, 0xe26e1246, 0xbede312f, 0x2baee5ba, + 0x4f4e9e44, 0xda3e4ad1, 0xf62ed896, 0x635e0c03, 0x07be77fd, + 0x92cea368, 0xce7e8001, 0x5b0e5494, 0x3fee2f6a, 0xaa9efbff, + 0x7e3cc91d, 0xeb4c1d88, 0x8fac6676, 0x1adcb2e3, 0x466c918a, + 0xd31c451f, 0xb7fc3ee1, 0x228cea74, 0x0e9c7833, 0x9becaca6, + 0xff0cd758, 0x6a7c03cd, 0x36cc20a4, 0xa3bcf431, 0xc75c8fcf, + 0x522c5b5a, 0x9f7dab41, 0x0a0d7fd4, 0x6eed042a, 0xfb9dd0bf, + 0xa72df3d6, 0x325d2743, 0x56bd5cbd, 0xc3cd8828, 0xefdd1a6f, + 0x7aadcefa, 0x1e4db504, 0x8b3d6191, 0xd78d42f8, 0x42fd966d, + 0x261ded93, 0xb36d3906, 0x54288e16, 0xc1585a83, 0xa5b8217d, + 0x30c8f5e8, 0x6c78d681, 0xf9080214, 0x9de879ea, 0x0898ad7f, + 0x24883f38, 0xb1f8ebad, 0xd5189053, 0x406844c6, 0x1cd867af, + 0x89a8b33a, 0xed48c8c4, 0x78381c51, 0xb569ec4a, 0x201938df, + 0x44f94321, 0xd18997b4, 0x8d39b4dd, 0x18496048, 0x7ca91bb6, + 0xe9d9cf23, 0xc5c95d64, 0x50b989f1, 0x3459f20f, 0xa129269a, + 0xfd9905f3, 0x68e9d166, 0x0c09aa98, 0x99797e0d, 0x4ddb4cef, + 0xd8ab987a, 0xbc4be384, 0x293b3711, 0x758b1478, 0xe0fbc0ed, + 0x841bbb13, 0x116b6f86, 0x3d7bfdc1, 0xa80b2954, 0xcceb52aa, + 0x599b863f, 0x052ba556, 0x905b71c3, 0xf4bb0a3d, 0x61cbdea8, + 0xac9a2eb3, 0x39eafa26, 0x5d0a81d8, 0xc87a554d, 0x94ca7624, + 0x01baa2b1, 0x655ad94f, 0xf02a0dda, 0xdc3a9f9d, 0x494a4b08, + 0x2daa30f6, 0xb8dae463, 0xe46ac70a, 0x711a139f, 0x15fa6861, + 0x808abcf4}, + {0x00000000, 0xcf9e17c8, 0x444d29d1, 0x8bd33e19, 0x889a53a2, + 0x4704446a, 0xccd77a73, 0x03496dbb, 0xca45a105, 0x05dbb6cd, + 0x8e0888d4, 0x41969f1c, 0x42dff2a7, 0x8d41e56f, 0x0692db76, + 0xc90cccbe, 0x4ffa444b, 0x80645383, 0x0bb76d9a, 0xc4297a52, + 0xc76017e9, 0x08fe0021, 0x832d3e38, 0x4cb329f0, 0x85bfe54e, + 0x4a21f286, 0xc1f2cc9f, 0x0e6cdb57, 0x0d25b6ec, 0xc2bba124, + 0x49689f3d, 0x86f688f5, 0x9ff48896, 0x506a9f5e, 0xdbb9a147, + 0x1427b68f, 0x176edb34, 0xd8f0ccfc, 0x5323f2e5, 0x9cbde52d, + 0x55b12993, 0x9a2f3e5b, 0x11fc0042, 0xde62178a, 0xdd2b7a31, + 0x12b56df9, 0x996653e0, 0x56f84428, 0xd00eccdd, 0x1f90db15, + 0x9443e50c, 0x5bddf2c4, 0x58949f7f, 0x970a88b7, 0x1cd9b6ae, + 0xd347a166, 0x1a4b6dd8, 0xd5d57a10, 0x5e064409, 0x919853c1, + 0x92d13e7a, 0x5d4f29b2, 0xd69c17ab, 0x19020063, 0xe498176d, + 0x2b0600a5, 0xa0d53ebc, 0x6f4b2974, 0x6c0244cf, 0xa39c5307, + 0x284f6d1e, 0xe7d17ad6, 0x2eddb668, 0xe143a1a0, 0x6a909fb9, + 0xa50e8871, 0xa647e5ca, 0x69d9f202, 0xe20acc1b, 0x2d94dbd3, + 0xab625326, 0x64fc44ee, 0xef2f7af7, 0x20b16d3f, 0x23f80084, + 0xec66174c, 0x67b52955, 0xa82b3e9d, 0x6127f223, 0xaeb9e5eb, + 0x256adbf2, 0xeaf4cc3a, 0xe9bda181, 0x2623b649, 0xadf08850, + 0x626e9f98, 0x7b6c9ffb, 0xb4f28833, 0x3f21b62a, 0xf0bfa1e2, + 0xf3f6cc59, 0x3c68db91, 0xb7bbe588, 0x7825f240, 0xb1293efe, + 0x7eb72936, 0xf564172f, 0x3afa00e7, 0x39b36d5c, 0xf62d7a94, + 0x7dfe448d, 0xb2605345, 0x3496dbb0, 0xfb08cc78, 0x70dbf261, + 0xbf45e5a9, 0xbc0c8812, 0x73929fda, 0xf841a1c3, 0x37dfb60b, + 0xfed37ab5, 0x314d6d7d, 0xba9e5364, 0x750044ac, 0x76492917, + 0xb9d73edf, 0x320400c6, 0xfd9a170e, 0x1241289b, 0xdddf3f53, + 0x560c014a, 0x99921682, 0x9adb7b39, 0x55456cf1, 0xde9652e8, + 0x11084520, 0xd804899e, 0x179a9e56, 0x9c49a04f, 0x53d7b787, + 0x509eda3c, 0x9f00cdf4, 0x14d3f3ed, 0xdb4de425, 0x5dbb6cd0, + 0x92257b18, 0x19f64501, 0xd66852c9, 0xd5213f72, 0x1abf28ba, + 0x916c16a3, 0x5ef2016b, 0x97fecdd5, 0x5860da1d, 0xd3b3e404, + 0x1c2df3cc, 0x1f649e77, 0xd0fa89bf, 0x5b29b7a6, 0x94b7a06e, + 0x8db5a00d, 0x422bb7c5, 0xc9f889dc, 0x06669e14, 0x052ff3af, + 0xcab1e467, 0x4162da7e, 0x8efccdb6, 0x47f00108, 0x886e16c0, + 0x03bd28d9, 0xcc233f11, 0xcf6a52aa, 0x00f44562, 0x8b277b7b, + 0x44b96cb3, 0xc24fe446, 0x0dd1f38e, 0x8602cd97, 0x499cda5f, + 0x4ad5b7e4, 0x854ba02c, 0x0e989e35, 0xc10689fd, 0x080a4543, + 0xc794528b, 0x4c476c92, 0x83d97b5a, 0x809016e1, 0x4f0e0129, + 0xc4dd3f30, 0x0b4328f8, 0xf6d93ff6, 0x3947283e, 0xb2941627, + 0x7d0a01ef, 0x7e436c54, 0xb1dd7b9c, 0x3a0e4585, 0xf590524d, + 0x3c9c9ef3, 0xf302893b, 0x78d1b722, 0xb74fa0ea, 0xb406cd51, + 0x7b98da99, 0xf04be480, 0x3fd5f348, 0xb9237bbd, 0x76bd6c75, + 0xfd6e526c, 0x32f045a4, 0x31b9281f, 0xfe273fd7, 0x75f401ce, + 0xba6a1606, 0x7366dab8, 0xbcf8cd70, 0x372bf369, 0xf8b5e4a1, + 0xfbfc891a, 0x34629ed2, 0xbfb1a0cb, 0x702fb703, 0x692db760, + 0xa6b3a0a8, 0x2d609eb1, 0xe2fe8979, 0xe1b7e4c2, 0x2e29f30a, + 0xa5facd13, 0x6a64dadb, 0xa3681665, 0x6cf601ad, 0xe7253fb4, + 0x28bb287c, 0x2bf245c7, 0xe46c520f, 0x6fbf6c16, 0xa0217bde, + 0x26d7f32b, 0xe949e4e3, 0x629adafa, 0xad04cd32, 0xae4da089, + 0x61d3b741, 0xea008958, 0x259e9e90, 0xec92522e, 0x230c45e6, + 0xa8df7bff, 0x67416c37, 0x6408018c, 0xab961644, 0x2045285d, + 0xefdb3f95}, + {0x00000000, 0x24825136, 0x4904a26c, 0x6d86f35a, 0x920944d8, + 0xb68b15ee, 0xdb0de6b4, 0xff8fb782, 0xff638ff1, 0xdbe1dec7, + 0xb6672d9d, 0x92e57cab, 0x6d6acb29, 0x49e89a1f, 0x246e6945, + 0x00ec3873, 0x25b619a3, 0x01344895, 0x6cb2bbcf, 0x4830eaf9, + 0xb7bf5d7b, 0x933d0c4d, 0xfebbff17, 0xda39ae21, 0xdad59652, + 0xfe57c764, 0x93d1343e, 0xb7536508, 0x48dcd28a, 0x6c5e83bc, + 0x01d870e6, 0x255a21d0, 0x4b6c3346, 0x6fee6270, 0x0268912a, + 0x26eac01c, 0xd965779e, 0xfde726a8, 0x9061d5f2, 0xb4e384c4, + 0xb40fbcb7, 0x908ded81, 0xfd0b1edb, 0xd9894fed, 0x2606f86f, + 0x0284a959, 0x6f025a03, 0x4b800b35, 0x6eda2ae5, 0x4a587bd3, + 0x27de8889, 0x035cd9bf, 0xfcd36e3d, 0xd8513f0b, 0xb5d7cc51, + 0x91559d67, 0x91b9a514, 0xb53bf422, 0xd8bd0778, 0xfc3f564e, + 0x03b0e1cc, 0x2732b0fa, 0x4ab443a0, 0x6e361296, 0x96d8668c, + 0xb25a37ba, 0xdfdcc4e0, 0xfb5e95d6, 0x04d12254, 0x20537362, + 0x4dd58038, 0x6957d10e, 0x69bbe97d, 0x4d39b84b, 0x20bf4b11, + 0x043d1a27, 0xfbb2ada5, 0xdf30fc93, 0xb2b60fc9, 0x96345eff, + 0xb36e7f2f, 0x97ec2e19, 0xfa6add43, 0xdee88c75, 0x21673bf7, + 0x05e56ac1, 0x6863999b, 0x4ce1c8ad, 0x4c0df0de, 0x688fa1e8, + 0x050952b2, 0x218b0384, 0xde04b406, 0xfa86e530, 0x9700166a, + 0xb382475c, 0xddb455ca, 0xf93604fc, 0x94b0f7a6, 0xb032a690, + 0x4fbd1112, 0x6b3f4024, 0x06b9b37e, 0x223be248, 0x22d7da3b, + 0x06558b0d, 0x6bd37857, 0x4f512961, 0xb0de9ee3, 0x945ccfd5, + 0xf9da3c8f, 0xdd586db9, 0xf8024c69, 0xdc801d5f, 0xb106ee05, + 0x9584bf33, 0x6a0b08b1, 0x4e895987, 0x230faadd, 0x078dfbeb, + 0x0761c398, 0x23e392ae, 0x4e6561f4, 0x6ae730c2, 0x95688740, + 0xb1ead676, 0xdc6c252c, 0xf8ee741a, 0xf6c1cb59, 0xd2439a6f, + 0xbfc56935, 0x9b473803, 0x64c88f81, 0x404adeb7, 0x2dcc2ded, + 0x094e7cdb, 0x09a244a8, 0x2d20159e, 0x40a6e6c4, 0x6424b7f2, + 0x9bab0070, 0xbf295146, 0xd2afa21c, 0xf62df32a, 0xd377d2fa, + 0xf7f583cc, 0x9a737096, 0xbef121a0, 0x417e9622, 0x65fcc714, + 0x087a344e, 0x2cf86578, 0x2c145d0b, 0x08960c3d, 0x6510ff67, + 0x4192ae51, 0xbe1d19d3, 0x9a9f48e5, 0xf719bbbf, 0xd39bea89, + 0xbdadf81f, 0x992fa929, 0xf4a95a73, 0xd02b0b45, 0x2fa4bcc7, + 0x0b26edf1, 0x66a01eab, 0x42224f9d, 0x42ce77ee, 0x664c26d8, + 0x0bcad582, 0x2f4884b4, 0xd0c73336, 0xf4456200, 0x99c3915a, + 0xbd41c06c, 0x981be1bc, 0xbc99b08a, 0xd11f43d0, 0xf59d12e6, + 0x0a12a564, 0x2e90f452, 0x43160708, 0x6794563e, 0x67786e4d, + 0x43fa3f7b, 0x2e7ccc21, 0x0afe9d17, 0xf5712a95, 0xd1f37ba3, + 0xbc7588f9, 0x98f7d9cf, 0x6019add5, 0x449bfce3, 0x291d0fb9, + 0x0d9f5e8f, 0xf210e90d, 0xd692b83b, 0xbb144b61, 0x9f961a57, + 0x9f7a2224, 0xbbf87312, 0xd67e8048, 0xf2fcd17e, 0x0d7366fc, + 0x29f137ca, 0x4477c490, 0x60f595a6, 0x45afb476, 0x612de540, + 0x0cab161a, 0x2829472c, 0xd7a6f0ae, 0xf324a198, 0x9ea252c2, + 0xba2003f4, 0xbacc3b87, 0x9e4e6ab1, 0xf3c899eb, 0xd74ac8dd, + 0x28c57f5f, 0x0c472e69, 0x61c1dd33, 0x45438c05, 0x2b759e93, + 0x0ff7cfa5, 0x62713cff, 0x46f36dc9, 0xb97cda4b, 0x9dfe8b7d, + 0xf0787827, 0xd4fa2911, 0xd4161162, 0xf0944054, 0x9d12b30e, + 0xb990e238, 0x461f55ba, 0x629d048c, 0x0f1bf7d6, 0x2b99a6e0, + 0x0ec38730, 0x2a41d606, 0x47c7255c, 0x6345746a, 0x9ccac3e8, + 0xb84892de, 0xd5ce6184, 0xf14c30b2, 0xf1a008c1, 0xd52259f7, + 0xb8a4aaad, 0x9c26fb9b, 0x63a94c19, 0x472b1d2f, 0x2aadee75, + 0x0e2fbf43}, + {0x00000000, 0x36f290f3, 0x6de521e6, 0x5b17b115, 0xdbca43cc, + 0xed38d33f, 0xb62f622a, 0x80ddf2d9, 0x6ce581d9, 0x5a17112a, + 0x0100a03f, 0x37f230cc, 0xb72fc215, 0x81dd52e6, 0xdacae3f3, + 0xec387300, 0xd9cb03b2, 0xef399341, 0xb42e2254, 0x82dcb2a7, + 0x0201407e, 0x34f3d08d, 0x6fe46198, 0x5916f16b, 0xb52e826b, + 0x83dc1298, 0xd8cba38d, 0xee39337e, 0x6ee4c1a7, 0x58165154, + 0x0301e041, 0x35f370b2, 0x68e70125, 0x5e1591d6, 0x050220c3, + 0x33f0b030, 0xb32d42e9, 0x85dfd21a, 0xdec8630f, 0xe83af3fc, + 0x040280fc, 0x32f0100f, 0x69e7a11a, 0x5f1531e9, 0xdfc8c330, + 0xe93a53c3, 0xb22de2d6, 0x84df7225, 0xb12c0297, 0x87de9264, + 0xdcc92371, 0xea3bb382, 0x6ae6415b, 0x5c14d1a8, 0x070360bd, + 0x31f1f04e, 0xddc9834e, 0xeb3b13bd, 0xb02ca2a8, 0x86de325b, + 0x0603c082, 0x30f15071, 0x6be6e164, 0x5d147197, 0xd1ce024a, + 0xe73c92b9, 0xbc2b23ac, 0x8ad9b35f, 0x0a044186, 0x3cf6d175, + 0x67e16060, 0x5113f093, 0xbd2b8393, 0x8bd91360, 0xd0cea275, + 0xe63c3286, 0x66e1c05f, 0x501350ac, 0x0b04e1b9, 0x3df6714a, + 0x080501f8, 0x3ef7910b, 0x65e0201e, 0x5312b0ed, 0xd3cf4234, + 0xe53dd2c7, 0xbe2a63d2, 0x88d8f321, 0x64e08021, 0x521210d2, + 0x0905a1c7, 0x3ff73134, 0xbf2ac3ed, 0x89d8531e, 0xd2cfe20b, + 0xe43d72f8, 0xb929036f, 0x8fdb939c, 0xd4cc2289, 0xe23eb27a, + 0x62e340a3, 0x5411d050, 0x0f066145, 0x39f4f1b6, 0xd5cc82b6, + 0xe33e1245, 0xb829a350, 0x8edb33a3, 0x0e06c17a, 0x38f45189, + 0x63e3e09c, 0x5511706f, 0x60e200dd, 0x5610902e, 0x0d07213b, + 0x3bf5b1c8, 0xbb284311, 0x8ddad3e2, 0xd6cd62f7, 0xe03ff204, + 0x0c078104, 0x3af511f7, 0x61e2a0e2, 0x57103011, 0xd7cdc2c8, + 0xe13f523b, 0xba28e32e, 0x8cda73dd, 0x78ed02d5, 0x4e1f9226, + 0x15082333, 0x23fab3c0, 0xa3274119, 0x95d5d1ea, 0xcec260ff, + 0xf830f00c, 0x1408830c, 0x22fa13ff, 0x79eda2ea, 0x4f1f3219, + 0xcfc2c0c0, 0xf9305033, 0xa227e126, 0x94d571d5, 0xa1260167, + 0x97d49194, 0xccc32081, 0xfa31b072, 0x7aec42ab, 0x4c1ed258, + 0x1709634d, 0x21fbf3be, 0xcdc380be, 0xfb31104d, 0xa026a158, + 0x96d431ab, 0x1609c372, 0x20fb5381, 0x7bece294, 0x4d1e7267, + 0x100a03f0, 0x26f89303, 0x7def2216, 0x4b1db2e5, 0xcbc0403c, + 0xfd32d0cf, 0xa62561da, 0x90d7f129, 0x7cef8229, 0x4a1d12da, + 0x110aa3cf, 0x27f8333c, 0xa725c1e5, 0x91d75116, 0xcac0e003, + 0xfc3270f0, 0xc9c10042, 0xff3390b1, 0xa42421a4, 0x92d6b157, + 0x120b438e, 0x24f9d37d, 0x7fee6268, 0x491cf29b, 0xa524819b, + 0x93d61168, 0xc8c1a07d, 0xfe33308e, 0x7eeec257, 0x481c52a4, + 0x130be3b1, 0x25f97342, 0xa923009f, 0x9fd1906c, 0xc4c62179, + 0xf234b18a, 0x72e94353, 0x441bd3a0, 0x1f0c62b5, 0x29fef246, + 0xc5c68146, 0xf33411b5, 0xa823a0a0, 0x9ed13053, 0x1e0cc28a, + 0x28fe5279, 0x73e9e36c, 0x451b739f, 0x70e8032d, 0x461a93de, + 0x1d0d22cb, 0x2bffb238, 0xab2240e1, 0x9dd0d012, 0xc6c76107, + 0xf035f1f4, 0x1c0d82f4, 0x2aff1207, 0x71e8a312, 0x471a33e1, + 0xc7c7c138, 0xf13551cb, 0xaa22e0de, 0x9cd0702d, 0xc1c401ba, + 0xf7369149, 0xac21205c, 0x9ad3b0af, 0x1a0e4276, 0x2cfcd285, + 0x77eb6390, 0x4119f363, 0xad218063, 0x9bd31090, 0xc0c4a185, + 0xf6363176, 0x76ebc3af, 0x4019535c, 0x1b0ee249, 0x2dfc72ba, + 0x180f0208, 0x2efd92fb, 0x75ea23ee, 0x4318b31d, 0xc3c541c4, + 0xf537d137, 0xae206022, 0x98d2f0d1, 0x74ea83d1, 0x42181322, + 0x190fa237, 0x2ffd32c4, 0xaf20c01d, 0x99d250ee, 0xc2c5e1fb, + 0xf4377108}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xf390f23600000000, 0xe621e56d00000000, + 0x15b1175b00000000, 0xcc43cadb00000000, 0x3fd338ed00000000, + 0x2a622fb600000000, 0xd9f2dd8000000000, 0xd981e56c00000000, + 0x2a11175a00000000, 0x3fa0000100000000, 0xcc30f23700000000, + 0x15c22fb700000000, 0xe652dd8100000000, 0xf3e3cada00000000, + 0x007338ec00000000, 0xb203cbd900000000, 0x419339ef00000000, + 0x54222eb400000000, 0xa7b2dc8200000000, 0x7e40010200000000, + 0x8dd0f33400000000, 0x9861e46f00000000, 0x6bf1165900000000, + 0x6b822eb500000000, 0x9812dc8300000000, 0x8da3cbd800000000, + 0x7e3339ee00000000, 0xa7c1e46e00000000, 0x5451165800000000, + 0x41e0010300000000, 0xb270f33500000000, 0x2501e76800000000, + 0xd691155e00000000, 0xc320020500000000, 0x30b0f03300000000, + 0xe9422db300000000, 0x1ad2df8500000000, 0x0f63c8de00000000, + 0xfcf33ae800000000, 0xfc80020400000000, 0x0f10f03200000000, + 0x1aa1e76900000000, 0xe931155f00000000, 0x30c3c8df00000000, + 0xc3533ae900000000, 0xd6e22db200000000, 0x2572df8400000000, + 0x97022cb100000000, 0x6492de8700000000, 0x7123c9dc00000000, + 0x82b33bea00000000, 0x5b41e66a00000000, 0xa8d1145c00000000, + 0xbd60030700000000, 0x4ef0f13100000000, 0x4e83c9dd00000000, + 0xbd133beb00000000, 0xa8a22cb000000000, 0x5b32de8600000000, + 0x82c0030600000000, 0x7150f13000000000, 0x64e1e66b00000000, + 0x9771145d00000000, 0x4a02ced100000000, 0xb9923ce700000000, + 0xac232bbc00000000, 0x5fb3d98a00000000, 0x8641040a00000000, + 0x75d1f63c00000000, 0x6060e16700000000, 0x93f0135100000000, + 0x93832bbd00000000, 0x6013d98b00000000, 0x75a2ced000000000, + 0x86323ce600000000, 0x5fc0e16600000000, 0xac50135000000000, + 0xb9e1040b00000000, 0x4a71f63d00000000, 0xf801050800000000, + 0x0b91f73e00000000, 0x1e20e06500000000, 0xedb0125300000000, + 0x3442cfd300000000, 0xc7d23de500000000, 0xd2632abe00000000, + 0x21f3d88800000000, 0x2180e06400000000, 0xd210125200000000, + 0xc7a1050900000000, 0x3431f73f00000000, 0xedc32abf00000000, + 0x1e53d88900000000, 0x0be2cfd200000000, 0xf8723de400000000, + 0x6f0329b900000000, 0x9c93db8f00000000, 0x8922ccd400000000, + 0x7ab23ee200000000, 0xa340e36200000000, 0x50d0115400000000, + 0x4561060f00000000, 0xb6f1f43900000000, 0xb682ccd500000000, + 0x45123ee300000000, 0x50a329b800000000, 0xa333db8e00000000, + 0x7ac1060e00000000, 0x8951f43800000000, 0x9ce0e36300000000, + 0x6f70115500000000, 0xdd00e26000000000, 0x2e90105600000000, + 0x3b21070d00000000, 0xc8b1f53b00000000, 0x114328bb00000000, + 0xe2d3da8d00000000, 0xf762cdd600000000, 0x04f23fe000000000, + 0x0481070c00000000, 0xf711f53a00000000, 0xe2a0e26100000000, + 0x1130105700000000, 0xc8c2cdd700000000, 0x3b523fe100000000, + 0x2ee328ba00000000, 0xdd73da8c00000000, 0xd502ed7800000000, + 0x26921f4e00000000, 0x3323081500000000, 0xc0b3fa2300000000, + 0x194127a300000000, 0xead1d59500000000, 0xff60c2ce00000000, + 0x0cf030f800000000, 0x0c83081400000000, 0xff13fa2200000000, + 0xeaa2ed7900000000, 0x19321f4f00000000, 0xc0c0c2cf00000000, + 0x335030f900000000, 0x26e127a200000000, 0xd571d59400000000, + 0x670126a100000000, 0x9491d49700000000, 0x8120c3cc00000000, + 0x72b031fa00000000, 0xab42ec7a00000000, 0x58d21e4c00000000, + 0x4d63091700000000, 0xbef3fb2100000000, 0xbe80c3cd00000000, + 0x4d1031fb00000000, 0x58a126a000000000, 0xab31d49600000000, + 0x72c3091600000000, 0x8153fb2000000000, 0x94e2ec7b00000000, + 0x67721e4d00000000, 0xf0030a1000000000, 0x0393f82600000000, + 0x1622ef7d00000000, 0xe5b21d4b00000000, 0x3c40c0cb00000000, + 0xcfd032fd00000000, 0xda6125a600000000, 0x29f1d79000000000, + 0x2982ef7c00000000, 0xda121d4a00000000, 0xcfa30a1100000000, + 0x3c33f82700000000, 0xe5c125a700000000, 0x1651d79100000000, + 0x03e0c0ca00000000, 0xf07032fc00000000, 0x4200c1c900000000, + 0xb19033ff00000000, 0xa42124a400000000, 0x57b1d69200000000, + 0x8e430b1200000000, 0x7dd3f92400000000, 0x6862ee7f00000000, + 0x9bf21c4900000000, 0x9b8124a500000000, 0x6811d69300000000, + 0x7da0c1c800000000, 0x8e3033fe00000000, 0x57c2ee7e00000000, + 0xa4521c4800000000, 0xb1e30b1300000000, 0x4273f92500000000, + 0x9f0023a900000000, 0x6c90d19f00000000, 0x7921c6c400000000, + 0x8ab134f200000000, 0x5343e97200000000, 0xa0d31b4400000000, + 0xb5620c1f00000000, 0x46f2fe2900000000, 0x4681c6c500000000, + 0xb51134f300000000, 0xa0a023a800000000, 0x5330d19e00000000, + 0x8ac20c1e00000000, 0x7952fe2800000000, 0x6ce3e97300000000, + 0x9f731b4500000000, 0x2d03e87000000000, 0xde931a4600000000, + 0xcb220d1d00000000, 0x38b2ff2b00000000, 0xe14022ab00000000, + 0x12d0d09d00000000, 0x0761c7c600000000, 0xf4f135f000000000, + 0xf4820d1c00000000, 0x0712ff2a00000000, 0x12a3e87100000000, + 0xe1331a4700000000, 0x38c1c7c700000000, 0xcb5135f100000000, + 0xdee022aa00000000, 0x2d70d09c00000000, 0xba01c4c100000000, + 0x499136f700000000, 0x5c2021ac00000000, 0xafb0d39a00000000, + 0x76420e1a00000000, 0x85d2fc2c00000000, 0x9063eb7700000000, + 0x63f3194100000000, 0x638021ad00000000, 0x9010d39b00000000, + 0x85a1c4c000000000, 0x763136f600000000, 0xafc3eb7600000000, + 0x5c53194000000000, 0x49e20e1b00000000, 0xba72fc2d00000000, + 0x08020f1800000000, 0xfb92fd2e00000000, 0xee23ea7500000000, + 0x1db3184300000000, 0xc441c5c300000000, 0x37d137f500000000, + 0x226020ae00000000, 0xd1f0d29800000000, 0xd183ea7400000000, + 0x2213184200000000, 0x37a20f1900000000, 0xc432fd2f00000000, + 0x1dc020af00000000, 0xee50d29900000000, 0xfbe1c5c200000000, + 0x087137f400000000}, + {0x0000000000000000, 0x3651822400000000, 0x6ca2044900000000, + 0x5af3866d00000000, 0xd844099200000000, 0xee158bb600000000, + 0xb4e60ddb00000000, 0x82b78fff00000000, 0xf18f63ff00000000, + 0xc7dee1db00000000, 0x9d2d67b600000000, 0xab7ce59200000000, + 0x29cb6a6d00000000, 0x1f9ae84900000000, 0x45696e2400000000, + 0x7338ec0000000000, 0xa319b62500000000, 0x9548340100000000, + 0xcfbbb26c00000000, 0xf9ea304800000000, 0x7b5dbfb700000000, + 0x4d0c3d9300000000, 0x17ffbbfe00000000, 0x21ae39da00000000, + 0x5296d5da00000000, 0x64c757fe00000000, 0x3e34d19300000000, + 0x086553b700000000, 0x8ad2dc4800000000, 0xbc835e6c00000000, + 0xe670d80100000000, 0xd0215a2500000000, 0x46336c4b00000000, + 0x7062ee6f00000000, 0x2a91680200000000, 0x1cc0ea2600000000, + 0x9e7765d900000000, 0xa826e7fd00000000, 0xf2d5619000000000, + 0xc484e3b400000000, 0xb7bc0fb400000000, 0x81ed8d9000000000, + 0xdb1e0bfd00000000, 0xed4f89d900000000, 0x6ff8062600000000, + 0x59a9840200000000, 0x035a026f00000000, 0x350b804b00000000, + 0xe52ada6e00000000, 0xd37b584a00000000, 0x8988de2700000000, + 0xbfd95c0300000000, 0x3d6ed3fc00000000, 0x0b3f51d800000000, + 0x51ccd7b500000000, 0x679d559100000000, 0x14a5b99100000000, + 0x22f43bb500000000, 0x7807bdd800000000, 0x4e563ffc00000000, + 0xcce1b00300000000, 0xfab0322700000000, 0xa043b44a00000000, + 0x9612366e00000000, 0x8c66d89600000000, 0xba375ab200000000, + 0xe0c4dcdf00000000, 0xd6955efb00000000, 0x5422d10400000000, + 0x6273532000000000, 0x3880d54d00000000, 0x0ed1576900000000, + 0x7de9bb6900000000, 0x4bb8394d00000000, 0x114bbf2000000000, + 0x271a3d0400000000, 0xa5adb2fb00000000, 0x93fc30df00000000, + 0xc90fb6b200000000, 0xff5e349600000000, 0x2f7f6eb300000000, + 0x192eec9700000000, 0x43dd6afa00000000, 0x758ce8de00000000, + 0xf73b672100000000, 0xc16ae50500000000, 0x9b99636800000000, + 0xadc8e14c00000000, 0xdef00d4c00000000, 0xe8a18f6800000000, + 0xb252090500000000, 0x84038b2100000000, 0x06b404de00000000, + 0x30e586fa00000000, 0x6a16009700000000, 0x5c4782b300000000, + 0xca55b4dd00000000, 0xfc0436f900000000, 0xa6f7b09400000000, + 0x90a632b000000000, 0x1211bd4f00000000, 0x24403f6b00000000, + 0x7eb3b90600000000, 0x48e23b2200000000, 0x3bdad72200000000, + 0x0d8b550600000000, 0x5778d36b00000000, 0x6129514f00000000, + 0xe39edeb000000000, 0xd5cf5c9400000000, 0x8f3cdaf900000000, + 0xb96d58dd00000000, 0x694c02f800000000, 0x5f1d80dc00000000, + 0x05ee06b100000000, 0x33bf849500000000, 0xb1080b6a00000000, + 0x8759894e00000000, 0xddaa0f2300000000, 0xebfb8d0700000000, + 0x98c3610700000000, 0xae92e32300000000, 0xf461654e00000000, + 0xc230e76a00000000, 0x4087689500000000, 0x76d6eab100000000, + 0x2c256cdc00000000, 0x1a74eef800000000, 0x59cbc1f600000000, + 0x6f9a43d200000000, 0x3569c5bf00000000, 0x0338479b00000000, + 0x818fc86400000000, 0xb7de4a4000000000, 0xed2dcc2d00000000, + 0xdb7c4e0900000000, 0xa844a20900000000, 0x9e15202d00000000, + 0xc4e6a64000000000, 0xf2b7246400000000, 0x7000ab9b00000000, + 0x465129bf00000000, 0x1ca2afd200000000, 0x2af32df600000000, + 0xfad277d300000000, 0xcc83f5f700000000, 0x9670739a00000000, + 0xa021f1be00000000, 0x22967e4100000000, 0x14c7fc6500000000, + 0x4e347a0800000000, 0x7865f82c00000000, 0x0b5d142c00000000, + 0x3d0c960800000000, 0x67ff106500000000, 0x51ae924100000000, + 0xd3191dbe00000000, 0xe5489f9a00000000, 0xbfbb19f700000000, + 0x89ea9bd300000000, 0x1ff8adbd00000000, 0x29a92f9900000000, + 0x735aa9f400000000, 0x450b2bd000000000, 0xc7bca42f00000000, + 0xf1ed260b00000000, 0xab1ea06600000000, 0x9d4f224200000000, + 0xee77ce4200000000, 0xd8264c6600000000, 0x82d5ca0b00000000, + 0xb484482f00000000, 0x3633c7d000000000, 0x006245f400000000, + 0x5a91c39900000000, 0x6cc041bd00000000, 0xbce11b9800000000, + 0x8ab099bc00000000, 0xd0431fd100000000, 0xe6129df500000000, + 0x64a5120a00000000, 0x52f4902e00000000, 0x0807164300000000, + 0x3e56946700000000, 0x4d6e786700000000, 0x7b3ffa4300000000, + 0x21cc7c2e00000000, 0x179dfe0a00000000, 0x952a71f500000000, + 0xa37bf3d100000000, 0xf98875bc00000000, 0xcfd9f79800000000, + 0xd5ad196000000000, 0xe3fc9b4400000000, 0xb90f1d2900000000, + 0x8f5e9f0d00000000, 0x0de910f200000000, 0x3bb892d600000000, + 0x614b14bb00000000, 0x571a969f00000000, 0x24227a9f00000000, + 0x1273f8bb00000000, 0x48807ed600000000, 0x7ed1fcf200000000, + 0xfc66730d00000000, 0xca37f12900000000, 0x90c4774400000000, + 0xa695f56000000000, 0x76b4af4500000000, 0x40e52d6100000000, + 0x1a16ab0c00000000, 0x2c47292800000000, 0xaef0a6d700000000, + 0x98a124f300000000, 0xc252a29e00000000, 0xf40320ba00000000, + 0x873bccba00000000, 0xb16a4e9e00000000, 0xeb99c8f300000000, + 0xddc84ad700000000, 0x5f7fc52800000000, 0x692e470c00000000, + 0x33ddc16100000000, 0x058c434500000000, 0x939e752b00000000, + 0xa5cff70f00000000, 0xff3c716200000000, 0xc96df34600000000, + 0x4bda7cb900000000, 0x7d8bfe9d00000000, 0x277878f000000000, + 0x1129fad400000000, 0x621116d400000000, 0x544094f000000000, + 0x0eb3129d00000000, 0x38e290b900000000, 0xba551f4600000000, + 0x8c049d6200000000, 0xd6f71b0f00000000, 0xe0a6992b00000000, + 0x3087c30e00000000, 0x06d6412a00000000, 0x5c25c74700000000, + 0x6a74456300000000, 0xe8c3ca9c00000000, 0xde9248b800000000, + 0x8461ced500000000, 0xb2304cf100000000, 0xc108a0f100000000, + 0xf75922d500000000, 0xadaaa4b800000000, 0x9bfb269c00000000, + 0x194ca96300000000, 0x2f1d2b4700000000, 0x75eead2a00000000, + 0x43bf2f0e00000000}, + {0x0000000000000000, 0xc8179ecf00000000, 0xd1294d4400000000, + 0x193ed38b00000000, 0xa2539a8800000000, 0x6a44044700000000, + 0x737ad7cc00000000, 0xbb6d490300000000, 0x05a145ca00000000, + 0xcdb6db0500000000, 0xd488088e00000000, 0x1c9f964100000000, + 0xa7f2df4200000000, 0x6fe5418d00000000, 0x76db920600000000, + 0xbecc0cc900000000, 0x4b44fa4f00000000, 0x8353648000000000, + 0x9a6db70b00000000, 0x527a29c400000000, 0xe91760c700000000, + 0x2100fe0800000000, 0x383e2d8300000000, 0xf029b34c00000000, + 0x4ee5bf8500000000, 0x86f2214a00000000, 0x9fccf2c100000000, + 0x57db6c0e00000000, 0xecb6250d00000000, 0x24a1bbc200000000, + 0x3d9f684900000000, 0xf588f68600000000, 0x9688f49f00000000, + 0x5e9f6a5000000000, 0x47a1b9db00000000, 0x8fb6271400000000, + 0x34db6e1700000000, 0xfcccf0d800000000, 0xe5f2235300000000, + 0x2de5bd9c00000000, 0x9329b15500000000, 0x5b3e2f9a00000000, + 0x4200fc1100000000, 0x8a1762de00000000, 0x317a2bdd00000000, + 0xf96db51200000000, 0xe053669900000000, 0x2844f85600000000, + 0xddcc0ed000000000, 0x15db901f00000000, 0x0ce5439400000000, + 0xc4f2dd5b00000000, 0x7f9f945800000000, 0xb7880a9700000000, + 0xaeb6d91c00000000, 0x66a147d300000000, 0xd86d4b1a00000000, + 0x107ad5d500000000, 0x0944065e00000000, 0xc153989100000000, + 0x7a3ed19200000000, 0xb2294f5d00000000, 0xab179cd600000000, + 0x6300021900000000, 0x6d1798e400000000, 0xa500062b00000000, + 0xbc3ed5a000000000, 0x74294b6f00000000, 0xcf44026c00000000, + 0x07539ca300000000, 0x1e6d4f2800000000, 0xd67ad1e700000000, + 0x68b6dd2e00000000, 0xa0a143e100000000, 0xb99f906a00000000, + 0x71880ea500000000, 0xcae547a600000000, 0x02f2d96900000000, + 0x1bcc0ae200000000, 0xd3db942d00000000, 0x265362ab00000000, + 0xee44fc6400000000, 0xf77a2fef00000000, 0x3f6db12000000000, + 0x8400f82300000000, 0x4c1766ec00000000, 0x5529b56700000000, + 0x9d3e2ba800000000, 0x23f2276100000000, 0xebe5b9ae00000000, + 0xf2db6a2500000000, 0x3accf4ea00000000, 0x81a1bde900000000, + 0x49b6232600000000, 0x5088f0ad00000000, 0x989f6e6200000000, + 0xfb9f6c7b00000000, 0x3388f2b400000000, 0x2ab6213f00000000, + 0xe2a1bff000000000, 0x59ccf6f300000000, 0x91db683c00000000, + 0x88e5bbb700000000, 0x40f2257800000000, 0xfe3e29b100000000, + 0x3629b77e00000000, 0x2f1764f500000000, 0xe700fa3a00000000, + 0x5c6db33900000000, 0x947a2df600000000, 0x8d44fe7d00000000, + 0x455360b200000000, 0xb0db963400000000, 0x78cc08fb00000000, + 0x61f2db7000000000, 0xa9e545bf00000000, 0x12880cbc00000000, + 0xda9f927300000000, 0xc3a141f800000000, 0x0bb6df3700000000, + 0xb57ad3fe00000000, 0x7d6d4d3100000000, 0x64539eba00000000, + 0xac44007500000000, 0x1729497600000000, 0xdf3ed7b900000000, + 0xc600043200000000, 0x0e179afd00000000, 0x9b28411200000000, + 0x533fdfdd00000000, 0x4a010c5600000000, 0x8216929900000000, + 0x397bdb9a00000000, 0xf16c455500000000, 0xe85296de00000000, + 0x2045081100000000, 0x9e8904d800000000, 0x569e9a1700000000, + 0x4fa0499c00000000, 0x87b7d75300000000, 0x3cda9e5000000000, + 0xf4cd009f00000000, 0xedf3d31400000000, 0x25e44ddb00000000, + 0xd06cbb5d00000000, 0x187b259200000000, 0x0145f61900000000, + 0xc95268d600000000, 0x723f21d500000000, 0xba28bf1a00000000, + 0xa3166c9100000000, 0x6b01f25e00000000, 0xd5cdfe9700000000, + 0x1dda605800000000, 0x04e4b3d300000000, 0xccf32d1c00000000, + 0x779e641f00000000, 0xbf89fad000000000, 0xa6b7295b00000000, + 0x6ea0b79400000000, 0x0da0b58d00000000, 0xc5b72b4200000000, + 0xdc89f8c900000000, 0x149e660600000000, 0xaff32f0500000000, + 0x67e4b1ca00000000, 0x7eda624100000000, 0xb6cdfc8e00000000, + 0x0801f04700000000, 0xc0166e8800000000, 0xd928bd0300000000, + 0x113f23cc00000000, 0xaa526acf00000000, 0x6245f40000000000, + 0x7b7b278b00000000, 0xb36cb94400000000, 0x46e44fc200000000, + 0x8ef3d10d00000000, 0x97cd028600000000, 0x5fda9c4900000000, + 0xe4b7d54a00000000, 0x2ca04b8500000000, 0x359e980e00000000, + 0xfd8906c100000000, 0x43450a0800000000, 0x8b5294c700000000, + 0x926c474c00000000, 0x5a7bd98300000000, 0xe116908000000000, + 0x29010e4f00000000, 0x303fddc400000000, 0xf828430b00000000, + 0xf63fd9f600000000, 0x3e28473900000000, 0x271694b200000000, + 0xef010a7d00000000, 0x546c437e00000000, 0x9c7bddb100000000, + 0x85450e3a00000000, 0x4d5290f500000000, 0xf39e9c3c00000000, + 0x3b8902f300000000, 0x22b7d17800000000, 0xeaa04fb700000000, + 0x51cd06b400000000, 0x99da987b00000000, 0x80e44bf000000000, + 0x48f3d53f00000000, 0xbd7b23b900000000, 0x756cbd7600000000, + 0x6c526efd00000000, 0xa445f03200000000, 0x1f28b93100000000, + 0xd73f27fe00000000, 0xce01f47500000000, 0x06166aba00000000, + 0xb8da667300000000, 0x70cdf8bc00000000, 0x69f32b3700000000, + 0xa1e4b5f800000000, 0x1a89fcfb00000000, 0xd29e623400000000, + 0xcba0b1bf00000000, 0x03b72f7000000000, 0x60b72d6900000000, + 0xa8a0b3a600000000, 0xb19e602d00000000, 0x7989fee200000000, + 0xc2e4b7e100000000, 0x0af3292e00000000, 0x13cdfaa500000000, + 0xdbda646a00000000, 0x651668a300000000, 0xad01f66c00000000, + 0xb43f25e700000000, 0x7c28bb2800000000, 0xc745f22b00000000, + 0x0f526ce400000000, 0x166cbf6f00000000, 0xde7b21a000000000, + 0x2bf3d72600000000, 0xe3e449e900000000, 0xfada9a6200000000, + 0x32cd04ad00000000, 0x89a04dae00000000, 0x41b7d36100000000, + 0x588900ea00000000, 0x909e9e2500000000, 0x2e5292ec00000000, + 0xe6450c2300000000, 0xff7bdfa800000000, 0x376c416700000000, + 0x8c01086400000000, 0x441696ab00000000, 0x5d28452000000000, + 0x953fdbef00000000}, + {0x0000000000000000, 0x95d4709500000000, 0x6baf90f100000000, + 0xfe7be06400000000, 0x9758503800000000, 0x028c20ad00000000, + 0xfcf7c0c900000000, 0x6923b05c00000000, 0x2eb1a07000000000, + 0xbb65d0e500000000, 0x451e308100000000, 0xd0ca401400000000, + 0xb9e9f04800000000, 0x2c3d80dd00000000, 0xd24660b900000000, + 0x4792102c00000000, 0x5c6241e100000000, 0xc9b6317400000000, + 0x37cdd11000000000, 0xa219a18500000000, 0xcb3a11d900000000, + 0x5eee614c00000000, 0xa095812800000000, 0x3541f1bd00000000, + 0x72d3e19100000000, 0xe707910400000000, 0x197c716000000000, + 0x8ca801f500000000, 0xe58bb1a900000000, 0x705fc13c00000000, + 0x8e24215800000000, 0x1bf051cd00000000, 0xf9c2f31900000000, + 0x6c16838c00000000, 0x926d63e800000000, 0x07b9137d00000000, + 0x6e9aa32100000000, 0xfb4ed3b400000000, 0x053533d000000000, + 0x90e1434500000000, 0xd773536900000000, 0x42a723fc00000000, + 0xbcdcc39800000000, 0x2908b30d00000000, 0x402b035100000000, + 0xd5ff73c400000000, 0x2b8493a000000000, 0xbe50e33500000000, + 0xa5a0b2f800000000, 0x3074c26d00000000, 0xce0f220900000000, + 0x5bdb529c00000000, 0x32f8e2c000000000, 0xa72c925500000000, + 0x5957723100000000, 0xcc8302a400000000, 0x8b11128800000000, + 0x1ec5621d00000000, 0xe0be827900000000, 0x756af2ec00000000, + 0x1c4942b000000000, 0x899d322500000000, 0x77e6d24100000000, + 0xe232a2d400000000, 0xf285e73300000000, 0x675197a600000000, + 0x992a77c200000000, 0x0cfe075700000000, 0x65ddb70b00000000, + 0xf009c79e00000000, 0x0e7227fa00000000, 0x9ba6576f00000000, + 0xdc34474300000000, 0x49e037d600000000, 0xb79bd7b200000000, + 0x224fa72700000000, 0x4b6c177b00000000, 0xdeb867ee00000000, + 0x20c3878a00000000, 0xb517f71f00000000, 0xaee7a6d200000000, + 0x3b33d64700000000, 0xc548362300000000, 0x509c46b600000000, + 0x39bff6ea00000000, 0xac6b867f00000000, 0x5210661b00000000, + 0xc7c4168e00000000, 0x805606a200000000, 0x1582763700000000, + 0xebf9965300000000, 0x7e2de6c600000000, 0x170e569a00000000, + 0x82da260f00000000, 0x7ca1c66b00000000, 0xe975b6fe00000000, + 0x0b47142a00000000, 0x9e9364bf00000000, 0x60e884db00000000, + 0xf53cf44e00000000, 0x9c1f441200000000, 0x09cb348700000000, + 0xf7b0d4e300000000, 0x6264a47600000000, 0x25f6b45a00000000, + 0xb022c4cf00000000, 0x4e5924ab00000000, 0xdb8d543e00000000, + 0xb2aee46200000000, 0x277a94f700000000, 0xd901749300000000, + 0x4cd5040600000000, 0x572555cb00000000, 0xc2f1255e00000000, + 0x3c8ac53a00000000, 0xa95eb5af00000000, 0xc07d05f300000000, + 0x55a9756600000000, 0xabd2950200000000, 0x3e06e59700000000, + 0x7994f5bb00000000, 0xec40852e00000000, 0x123b654a00000000, + 0x87ef15df00000000, 0xeecca58300000000, 0x7b18d51600000000, + 0x8563357200000000, 0x10b745e700000000, 0xe40bcf6700000000, + 0x71dfbff200000000, 0x8fa45f9600000000, 0x1a702f0300000000, + 0x73539f5f00000000, 0xe687efca00000000, 0x18fc0fae00000000, + 0x8d287f3b00000000, 0xcaba6f1700000000, 0x5f6e1f8200000000, + 0xa115ffe600000000, 0x34c18f7300000000, 0x5de23f2f00000000, + 0xc8364fba00000000, 0x364dafde00000000, 0xa399df4b00000000, + 0xb8698e8600000000, 0x2dbdfe1300000000, 0xd3c61e7700000000, + 0x46126ee200000000, 0x2f31debe00000000, 0xbae5ae2b00000000, + 0x449e4e4f00000000, 0xd14a3eda00000000, 0x96d82ef600000000, + 0x030c5e6300000000, 0xfd77be0700000000, 0x68a3ce9200000000, + 0x01807ece00000000, 0x94540e5b00000000, 0x6a2fee3f00000000, + 0xfffb9eaa00000000, 0x1dc93c7e00000000, 0x881d4ceb00000000, + 0x7666ac8f00000000, 0xe3b2dc1a00000000, 0x8a916c4600000000, + 0x1f451cd300000000, 0xe13efcb700000000, 0x74ea8c2200000000, + 0x33789c0e00000000, 0xa6acec9b00000000, 0x58d70cff00000000, + 0xcd037c6a00000000, 0xa420cc3600000000, 0x31f4bca300000000, + 0xcf8f5cc700000000, 0x5a5b2c5200000000, 0x41ab7d9f00000000, + 0xd47f0d0a00000000, 0x2a04ed6e00000000, 0xbfd09dfb00000000, + 0xd6f32da700000000, 0x43275d3200000000, 0xbd5cbd5600000000, + 0x2888cdc300000000, 0x6f1addef00000000, 0xfacead7a00000000, + 0x04b54d1e00000000, 0x91613d8b00000000, 0xf8428dd700000000, + 0x6d96fd4200000000, 0x93ed1d2600000000, 0x06396db300000000, + 0x168e285400000000, 0x835a58c100000000, 0x7d21b8a500000000, + 0xe8f5c83000000000, 0x81d6786c00000000, 0x140208f900000000, + 0xea79e89d00000000, 0x7fad980800000000, 0x383f882400000000, + 0xadebf8b100000000, 0x539018d500000000, 0xc644684000000000, + 0xaf67d81c00000000, 0x3ab3a88900000000, 0xc4c848ed00000000, + 0x511c387800000000, 0x4aec69b500000000, 0xdf38192000000000, + 0x2143f94400000000, 0xb49789d100000000, 0xddb4398d00000000, + 0x4860491800000000, 0xb61ba97c00000000, 0x23cfd9e900000000, + 0x645dc9c500000000, 0xf189b95000000000, 0x0ff2593400000000, + 0x9a2629a100000000, 0xf30599fd00000000, 0x66d1e96800000000, + 0x98aa090c00000000, 0x0d7e799900000000, 0xef4cdb4d00000000, + 0x7a98abd800000000, 0x84e34bbc00000000, 0x11373b2900000000, + 0x78148b7500000000, 0xedc0fbe000000000, 0x13bb1b8400000000, + 0x866f6b1100000000, 0xc1fd7b3d00000000, 0x54290ba800000000, + 0xaa52ebcc00000000, 0x3f869b5900000000, 0x56a52b0500000000, + 0xc3715b9000000000, 0x3d0abbf400000000, 0xa8decb6100000000, + 0xb32e9aac00000000, 0x26faea3900000000, 0xd8810a5d00000000, + 0x4d557ac800000000, 0x2476ca9400000000, 0xb1a2ba0100000000, + 0x4fd95a6500000000, 0xda0d2af000000000, 0x9d9f3adc00000000, + 0x084b4a4900000000, 0xf630aa2d00000000, 0x63e4dab800000000, + 0x0ac76ae400000000, 0x9f131a7100000000, 0x6168fa1500000000, + 0xf4bc8a8000000000}, + {0x0000000000000000, 0x1f17f08000000000, 0x7f2891da00000000, + 0x603f615a00000000, 0xbf56536e00000000, 0xa041a3ee00000000, + 0xc07ec2b400000000, 0xdf69323400000000, 0x7eada6dc00000000, + 0x61ba565c00000000, 0x0185370600000000, 0x1e92c78600000000, + 0xc1fbf5b200000000, 0xdeec053200000000, 0xbed3646800000000, + 0xa1c494e800000000, 0xbd5c3c6200000000, 0xa24bcce200000000, + 0xc274adb800000000, 0xdd635d3800000000, 0x020a6f0c00000000, + 0x1d1d9f8c00000000, 0x7d22fed600000000, 0x62350e5600000000, + 0xc3f19abe00000000, 0xdce66a3e00000000, 0xbcd90b6400000000, + 0xa3cefbe400000000, 0x7ca7c9d000000000, 0x63b0395000000000, + 0x038f580a00000000, 0x1c98a88a00000000, 0x7ab978c400000000, + 0x65ae884400000000, 0x0591e91e00000000, 0x1a86199e00000000, + 0xc5ef2baa00000000, 0xdaf8db2a00000000, 0xbac7ba7000000000, + 0xa5d04af000000000, 0x0414de1800000000, 0x1b032e9800000000, + 0x7b3c4fc200000000, 0x642bbf4200000000, 0xbb428d7600000000, + 0xa4557df600000000, 0xc46a1cac00000000, 0xdb7dec2c00000000, + 0xc7e544a600000000, 0xd8f2b42600000000, 0xb8cdd57c00000000, + 0xa7da25fc00000000, 0x78b317c800000000, 0x67a4e74800000000, + 0x079b861200000000, 0x188c769200000000, 0xb948e27a00000000, + 0xa65f12fa00000000, 0xc66073a000000000, 0xd977832000000000, + 0x061eb11400000000, 0x1909419400000000, 0x793620ce00000000, + 0x6621d04e00000000, 0xb574805300000000, 0xaa6370d300000000, + 0xca5c118900000000, 0xd54be10900000000, 0x0a22d33d00000000, + 0x153523bd00000000, 0x750a42e700000000, 0x6a1db26700000000, + 0xcbd9268f00000000, 0xd4ced60f00000000, 0xb4f1b75500000000, + 0xabe647d500000000, 0x748f75e100000000, 0x6b98856100000000, + 0x0ba7e43b00000000, 0x14b014bb00000000, 0x0828bc3100000000, + 0x173f4cb100000000, 0x77002deb00000000, 0x6817dd6b00000000, + 0xb77eef5f00000000, 0xa8691fdf00000000, 0xc8567e8500000000, + 0xd7418e0500000000, 0x76851aed00000000, 0x6992ea6d00000000, + 0x09ad8b3700000000, 0x16ba7bb700000000, 0xc9d3498300000000, + 0xd6c4b90300000000, 0xb6fbd85900000000, 0xa9ec28d900000000, + 0xcfcdf89700000000, 0xd0da081700000000, 0xb0e5694d00000000, + 0xaff299cd00000000, 0x709babf900000000, 0x6f8c5b7900000000, + 0x0fb33a2300000000, 0x10a4caa300000000, 0xb1605e4b00000000, + 0xae77aecb00000000, 0xce48cf9100000000, 0xd15f3f1100000000, + 0x0e360d2500000000, 0x1121fda500000000, 0x711e9cff00000000, + 0x6e096c7f00000000, 0x7291c4f500000000, 0x6d86347500000000, + 0x0db9552f00000000, 0x12aea5af00000000, 0xcdc7979b00000000, + 0xd2d0671b00000000, 0xb2ef064100000000, 0xadf8f6c100000000, + 0x0c3c622900000000, 0x132b92a900000000, 0x7314f3f300000000, + 0x6c03037300000000, 0xb36a314700000000, 0xac7dc1c700000000, + 0xcc42a09d00000000, 0xd355501d00000000, 0x6ae900a700000000, + 0x75fef02700000000, 0x15c1917d00000000, 0x0ad661fd00000000, + 0xd5bf53c900000000, 0xcaa8a34900000000, 0xaa97c21300000000, + 0xb580329300000000, 0x1444a67b00000000, 0x0b5356fb00000000, + 0x6b6c37a100000000, 0x747bc72100000000, 0xab12f51500000000, + 0xb405059500000000, 0xd43a64cf00000000, 0xcb2d944f00000000, + 0xd7b53cc500000000, 0xc8a2cc4500000000, 0xa89dad1f00000000, + 0xb78a5d9f00000000, 0x68e36fab00000000, 0x77f49f2b00000000, + 0x17cbfe7100000000, 0x08dc0ef100000000, 0xa9189a1900000000, + 0xb60f6a9900000000, 0xd6300bc300000000, 0xc927fb4300000000, + 0x164ec97700000000, 0x095939f700000000, 0x696658ad00000000, + 0x7671a82d00000000, 0x1050786300000000, 0x0f4788e300000000, + 0x6f78e9b900000000, 0x706f193900000000, 0xaf062b0d00000000, + 0xb011db8d00000000, 0xd02ebad700000000, 0xcf394a5700000000, + 0x6efddebf00000000, 0x71ea2e3f00000000, 0x11d54f6500000000, + 0x0ec2bfe500000000, 0xd1ab8dd100000000, 0xcebc7d5100000000, + 0xae831c0b00000000, 0xb194ec8b00000000, 0xad0c440100000000, + 0xb21bb48100000000, 0xd224d5db00000000, 0xcd33255b00000000, + 0x125a176f00000000, 0x0d4de7ef00000000, 0x6d7286b500000000, + 0x7265763500000000, 0xd3a1e2dd00000000, 0xccb6125d00000000, + 0xac89730700000000, 0xb39e838700000000, 0x6cf7b1b300000000, + 0x73e0413300000000, 0x13df206900000000, 0x0cc8d0e900000000, + 0xdf9d80f400000000, 0xc08a707400000000, 0xa0b5112e00000000, + 0xbfa2e1ae00000000, 0x60cbd39a00000000, 0x7fdc231a00000000, + 0x1fe3424000000000, 0x00f4b2c000000000, 0xa130262800000000, + 0xbe27d6a800000000, 0xde18b7f200000000, 0xc10f477200000000, + 0x1e66754600000000, 0x017185c600000000, 0x614ee49c00000000, + 0x7e59141c00000000, 0x62c1bc9600000000, 0x7dd64c1600000000, + 0x1de92d4c00000000, 0x02feddcc00000000, 0xdd97eff800000000, + 0xc2801f7800000000, 0xa2bf7e2200000000, 0xbda88ea200000000, + 0x1c6c1a4a00000000, 0x037beaca00000000, 0x63448b9000000000, + 0x7c537b1000000000, 0xa33a492400000000, 0xbc2db9a400000000, + 0xdc12d8fe00000000, 0xc305287e00000000, 0xa524f83000000000, + 0xba3308b000000000, 0xda0c69ea00000000, 0xc51b996a00000000, + 0x1a72ab5e00000000, 0x05655bde00000000, 0x655a3a8400000000, + 0x7a4dca0400000000, 0xdb895eec00000000, 0xc49eae6c00000000, + 0xa4a1cf3600000000, 0xbbb63fb600000000, 0x64df0d8200000000, + 0x7bc8fd0200000000, 0x1bf79c5800000000, 0x04e06cd800000000, + 0x1878c45200000000, 0x076f34d200000000, 0x6750558800000000, + 0x7847a50800000000, 0xa72e973c00000000, 0xb83967bc00000000, + 0xd80606e600000000, 0xc711f66600000000, 0x66d5628e00000000, + 0x79c2920e00000000, 0x19fdf35400000000, 0x06ea03d400000000, + 0xd98331e000000000, 0xc694c16000000000, 0xa6aba03a00000000, + 0xb9bc50ba00000000}, + {0x0000000000000000, 0xe2fd888d00000000, 0x85fd60c000000000, + 0x6700e84d00000000, 0x4bfdb05b00000000, 0xa90038d600000000, + 0xce00d09b00000000, 0x2cfd581600000000, 0x96fa61b700000000, + 0x7407e93a00000000, 0x1307017700000000, 0xf1fa89fa00000000, + 0xdd07d1ec00000000, 0x3ffa596100000000, 0x58fab12c00000000, + 0xba0739a100000000, 0x6df3b2b500000000, 0x8f0e3a3800000000, + 0xe80ed27500000000, 0x0af35af800000000, 0x260e02ee00000000, + 0xc4f38a6300000000, 0xa3f3622e00000000, 0x410eeaa300000000, + 0xfb09d30200000000, 0x19f45b8f00000000, 0x7ef4b3c200000000, + 0x9c093b4f00000000, 0xb0f4635900000000, 0x5209ebd400000000, + 0x3509039900000000, 0xd7f48b1400000000, 0x9be014b000000000, + 0x791d9c3d00000000, 0x1e1d747000000000, 0xfce0fcfd00000000, + 0xd01da4eb00000000, 0x32e02c6600000000, 0x55e0c42b00000000, + 0xb71d4ca600000000, 0x0d1a750700000000, 0xefe7fd8a00000000, + 0x88e715c700000000, 0x6a1a9d4a00000000, 0x46e7c55c00000000, + 0xa41a4dd100000000, 0xc31aa59c00000000, 0x21e72d1100000000, + 0xf613a60500000000, 0x14ee2e8800000000, 0x73eec6c500000000, + 0x91134e4800000000, 0xbdee165e00000000, 0x5f139ed300000000, + 0x3813769e00000000, 0xdaeefe1300000000, 0x60e9c7b200000000, + 0x82144f3f00000000, 0xe514a77200000000, 0x07e92fff00000000, + 0x2b1477e900000000, 0xc9e9ff6400000000, 0xaee9172900000000, + 0x4c149fa400000000, 0x77c758bb00000000, 0x953ad03600000000, + 0xf23a387b00000000, 0x10c7b0f600000000, 0x3c3ae8e000000000, + 0xdec7606d00000000, 0xb9c7882000000000, 0x5b3a00ad00000000, + 0xe13d390c00000000, 0x03c0b18100000000, 0x64c059cc00000000, + 0x863dd14100000000, 0xaac0895700000000, 0x483d01da00000000, + 0x2f3de99700000000, 0xcdc0611a00000000, 0x1a34ea0e00000000, + 0xf8c9628300000000, 0x9fc98ace00000000, 0x7d34024300000000, + 0x51c95a5500000000, 0xb334d2d800000000, 0xd4343a9500000000, + 0x36c9b21800000000, 0x8cce8bb900000000, 0x6e33033400000000, + 0x0933eb7900000000, 0xebce63f400000000, 0xc7333be200000000, + 0x25ceb36f00000000, 0x42ce5b2200000000, 0xa033d3af00000000, + 0xec274c0b00000000, 0x0edac48600000000, 0x69da2ccb00000000, + 0x8b27a44600000000, 0xa7dafc5000000000, 0x452774dd00000000, + 0x22279c9000000000, 0xc0da141d00000000, 0x7add2dbc00000000, + 0x9820a53100000000, 0xff204d7c00000000, 0x1dddc5f100000000, + 0x31209de700000000, 0xd3dd156a00000000, 0xb4ddfd2700000000, + 0x562075aa00000000, 0x81d4febe00000000, 0x6329763300000000, + 0x04299e7e00000000, 0xe6d416f300000000, 0xca294ee500000000, + 0x28d4c66800000000, 0x4fd42e2500000000, 0xad29a6a800000000, + 0x172e9f0900000000, 0xf5d3178400000000, 0x92d3ffc900000000, + 0x702e774400000000, 0x5cd32f5200000000, 0xbe2ea7df00000000, + 0xd92e4f9200000000, 0x3bd3c71f00000000, 0xaf88c0ad00000000, + 0x4d75482000000000, 0x2a75a06d00000000, 0xc88828e000000000, + 0xe47570f600000000, 0x0688f87b00000000, 0x6188103600000000, + 0x837598bb00000000, 0x3972a11a00000000, 0xdb8f299700000000, + 0xbc8fc1da00000000, 0x5e72495700000000, 0x728f114100000000, + 0x907299cc00000000, 0xf772718100000000, 0x158ff90c00000000, + 0xc27b721800000000, 0x2086fa9500000000, 0x478612d800000000, + 0xa57b9a5500000000, 0x8986c24300000000, 0x6b7b4ace00000000, + 0x0c7ba28300000000, 0xee862a0e00000000, 0x548113af00000000, + 0xb67c9b2200000000, 0xd17c736f00000000, 0x3381fbe200000000, + 0x1f7ca3f400000000, 0xfd812b7900000000, 0x9a81c33400000000, + 0x787c4bb900000000, 0x3468d41d00000000, 0xd6955c9000000000, + 0xb195b4dd00000000, 0x53683c5000000000, 0x7f95644600000000, + 0x9d68eccb00000000, 0xfa68048600000000, 0x18958c0b00000000, + 0xa292b5aa00000000, 0x406f3d2700000000, 0x276fd56a00000000, + 0xc5925de700000000, 0xe96f05f100000000, 0x0b928d7c00000000, + 0x6c92653100000000, 0x8e6fedbc00000000, 0x599b66a800000000, + 0xbb66ee2500000000, 0xdc66066800000000, 0x3e9b8ee500000000, + 0x1266d6f300000000, 0xf09b5e7e00000000, 0x979bb63300000000, + 0x75663ebe00000000, 0xcf61071f00000000, 0x2d9c8f9200000000, + 0x4a9c67df00000000, 0xa861ef5200000000, 0x849cb74400000000, + 0x66613fc900000000, 0x0161d78400000000, 0xe39c5f0900000000, + 0xd84f981600000000, 0x3ab2109b00000000, 0x5db2f8d600000000, + 0xbf4f705b00000000, 0x93b2284d00000000, 0x714fa0c000000000, + 0x164f488d00000000, 0xf4b2c00000000000, 0x4eb5f9a100000000, + 0xac48712c00000000, 0xcb48996100000000, 0x29b511ec00000000, + 0x054849fa00000000, 0xe7b5c17700000000, 0x80b5293a00000000, + 0x6248a1b700000000, 0xb5bc2aa300000000, 0x5741a22e00000000, + 0x30414a6300000000, 0xd2bcc2ee00000000, 0xfe419af800000000, + 0x1cbc127500000000, 0x7bbcfa3800000000, 0x994172b500000000, + 0x23464b1400000000, 0xc1bbc39900000000, 0xa6bb2bd400000000, + 0x4446a35900000000, 0x68bbfb4f00000000, 0x8a4673c200000000, + 0xed469b8f00000000, 0x0fbb130200000000, 0x43af8ca600000000, + 0xa152042b00000000, 0xc652ec6600000000, 0x24af64eb00000000, + 0x08523cfd00000000, 0xeaafb47000000000, 0x8daf5c3d00000000, + 0x6f52d4b000000000, 0xd555ed1100000000, 0x37a8659c00000000, + 0x50a88dd100000000, 0xb255055c00000000, 0x9ea85d4a00000000, + 0x7c55d5c700000000, 0x1b553d8a00000000, 0xf9a8b50700000000, + 0x2e5c3e1300000000, 0xcca1b69e00000000, 0xaba15ed300000000, + 0x495cd65e00000000, 0x65a18e4800000000, 0x875c06c500000000, + 0xe05cee8800000000, 0x02a1660500000000, 0xb8a65fa400000000, + 0x5a5bd72900000000, 0x3d5b3f6400000000, 0xdfa6b7e900000000, + 0xf35befff00000000, 0x11a6677200000000, 0x76a68f3f00000000, + 0x945b07b200000000}, + {0x0000000000000000, 0xa90b894e00000000, 0x5217129d00000000, + 0xfb1c9bd300000000, 0xe52855e100000000, 0x4c23dcaf00000000, + 0xb73f477c00000000, 0x1e34ce3200000000, 0x8b57db1900000000, + 0x225c525700000000, 0xd940c98400000000, 0x704b40ca00000000, + 0x6e7f8ef800000000, 0xc77407b600000000, 0x3c689c6500000000, + 0x9563152b00000000, 0x16afb63300000000, 0xbfa43f7d00000000, + 0x44b8a4ae00000000, 0xedb32de000000000, 0xf387e3d200000000, + 0x5a8c6a9c00000000, 0xa190f14f00000000, 0x089b780100000000, + 0x9df86d2a00000000, 0x34f3e46400000000, 0xcfef7fb700000000, + 0x66e4f6f900000000, 0x78d038cb00000000, 0xd1dbb18500000000, + 0x2ac72a5600000000, 0x83cca31800000000, 0x2c5e6d6700000000, + 0x8555e42900000000, 0x7e497ffa00000000, 0xd742f6b400000000, + 0xc976388600000000, 0x607db1c800000000, 0x9b612a1b00000000, + 0x326aa35500000000, 0xa709b67e00000000, 0x0e023f3000000000, + 0xf51ea4e300000000, 0x5c152dad00000000, 0x4221e39f00000000, + 0xeb2a6ad100000000, 0x1036f10200000000, 0xb93d784c00000000, + 0x3af1db5400000000, 0x93fa521a00000000, 0x68e6c9c900000000, + 0xc1ed408700000000, 0xdfd98eb500000000, 0x76d207fb00000000, + 0x8dce9c2800000000, 0x24c5156600000000, 0xb1a6004d00000000, + 0x18ad890300000000, 0xe3b112d000000000, 0x4aba9b9e00000000, + 0x548e55ac00000000, 0xfd85dce200000000, 0x0699473100000000, + 0xaf92ce7f00000000, 0x58bcdace00000000, 0xf1b7538000000000, + 0x0aabc85300000000, 0xa3a0411d00000000, 0xbd948f2f00000000, + 0x149f066100000000, 0xef839db200000000, 0x468814fc00000000, + 0xd3eb01d700000000, 0x7ae0889900000000, 0x81fc134a00000000, + 0x28f79a0400000000, 0x36c3543600000000, 0x9fc8dd7800000000, + 0x64d446ab00000000, 0xcddfcfe500000000, 0x4e136cfd00000000, + 0xe718e5b300000000, 0x1c047e6000000000, 0xb50ff72e00000000, + 0xab3b391c00000000, 0x0230b05200000000, 0xf92c2b8100000000, + 0x5027a2cf00000000, 0xc544b7e400000000, 0x6c4f3eaa00000000, + 0x9753a57900000000, 0x3e582c3700000000, 0x206ce20500000000, + 0x89676b4b00000000, 0x727bf09800000000, 0xdb7079d600000000, + 0x74e2b7a900000000, 0xdde93ee700000000, 0x26f5a53400000000, + 0x8ffe2c7a00000000, 0x91cae24800000000, 0x38c16b0600000000, + 0xc3ddf0d500000000, 0x6ad6799b00000000, 0xffb56cb000000000, + 0x56bee5fe00000000, 0xada27e2d00000000, 0x04a9f76300000000, + 0x1a9d395100000000, 0xb396b01f00000000, 0x488a2bcc00000000, + 0xe181a28200000000, 0x624d019a00000000, 0xcb4688d400000000, + 0x305a130700000000, 0x99519a4900000000, 0x8765547b00000000, + 0x2e6edd3500000000, 0xd57246e600000000, 0x7c79cfa800000000, + 0xe91ada8300000000, 0x401153cd00000000, 0xbb0dc81e00000000, + 0x1206415000000000, 0x0c328f6200000000, 0xa539062c00000000, + 0x5e259dff00000000, 0xf72e14b100000000, 0xf17ec44600000000, + 0x58754d0800000000, 0xa369d6db00000000, 0x0a625f9500000000, + 0x145691a700000000, 0xbd5d18e900000000, 0x4641833a00000000, + 0xef4a0a7400000000, 0x7a291f5f00000000, 0xd322961100000000, + 0x283e0dc200000000, 0x8135848c00000000, 0x9f014abe00000000, + 0x360ac3f000000000, 0xcd16582300000000, 0x641dd16d00000000, + 0xe7d1727500000000, 0x4edafb3b00000000, 0xb5c660e800000000, + 0x1ccde9a600000000, 0x02f9279400000000, 0xabf2aeda00000000, + 0x50ee350900000000, 0xf9e5bc4700000000, 0x6c86a96c00000000, + 0xc58d202200000000, 0x3e91bbf100000000, 0x979a32bf00000000, + 0x89aefc8d00000000, 0x20a575c300000000, 0xdbb9ee1000000000, + 0x72b2675e00000000, 0xdd20a92100000000, 0x742b206f00000000, + 0x8f37bbbc00000000, 0x263c32f200000000, 0x3808fcc000000000, + 0x9103758e00000000, 0x6a1fee5d00000000, 0xc314671300000000, + 0x5677723800000000, 0xff7cfb7600000000, 0x046060a500000000, + 0xad6be9eb00000000, 0xb35f27d900000000, 0x1a54ae9700000000, + 0xe148354400000000, 0x4843bc0a00000000, 0xcb8f1f1200000000, + 0x6284965c00000000, 0x99980d8f00000000, 0x309384c100000000, + 0x2ea74af300000000, 0x87acc3bd00000000, 0x7cb0586e00000000, + 0xd5bbd12000000000, 0x40d8c40b00000000, 0xe9d34d4500000000, + 0x12cfd69600000000, 0xbbc45fd800000000, 0xa5f091ea00000000, + 0x0cfb18a400000000, 0xf7e7837700000000, 0x5eec0a3900000000, + 0xa9c21e8800000000, 0x00c997c600000000, 0xfbd50c1500000000, + 0x52de855b00000000, 0x4cea4b6900000000, 0xe5e1c22700000000, + 0x1efd59f400000000, 0xb7f6d0ba00000000, 0x2295c59100000000, + 0x8b9e4cdf00000000, 0x7082d70c00000000, 0xd9895e4200000000, + 0xc7bd907000000000, 0x6eb6193e00000000, 0x95aa82ed00000000, + 0x3ca10ba300000000, 0xbf6da8bb00000000, 0x166621f500000000, + 0xed7aba2600000000, 0x4471336800000000, 0x5a45fd5a00000000, + 0xf34e741400000000, 0x0852efc700000000, 0xa159668900000000, + 0x343a73a200000000, 0x9d31faec00000000, 0x662d613f00000000, + 0xcf26e87100000000, 0xd112264300000000, 0x7819af0d00000000, + 0x830534de00000000, 0x2a0ebd9000000000, 0x859c73ef00000000, + 0x2c97faa100000000, 0xd78b617200000000, 0x7e80e83c00000000, + 0x60b4260e00000000, 0xc9bfaf4000000000, 0x32a3349300000000, + 0x9ba8bddd00000000, 0x0ecba8f600000000, 0xa7c021b800000000, + 0x5cdcba6b00000000, 0xf5d7332500000000, 0xebe3fd1700000000, + 0x42e8745900000000, 0xb9f4ef8a00000000, 0x10ff66c400000000, + 0x9333c5dc00000000, 0x3a384c9200000000, 0xc124d74100000000, + 0x682f5e0f00000000, 0x761b903d00000000, 0xdf10197300000000, + 0x240c82a000000000, 0x8d070bee00000000, 0x18641ec500000000, + 0xb16f978b00000000, 0x4a730c5800000000, 0xe378851600000000, + 0xfd4c4b2400000000, 0x5447c26a00000000, 0xaf5b59b900000000, + 0x0650d0f700000000}, + {0x0000000000000000, 0x479244af00000000, 0xcf22f88500000000, + 0x88b0bc2a00000000, 0xdf4381d000000000, 0x98d1c57f00000000, + 0x1061795500000000, 0x57f33dfa00000000, 0xff81737a00000000, + 0xb81337d500000000, 0x30a38bff00000000, 0x7731cf5000000000, + 0x20c2f2aa00000000, 0x6750b60500000000, 0xefe00a2f00000000, + 0xa8724e8000000000, 0xfe03e7f400000000, 0xb991a35b00000000, + 0x31211f7100000000, 0x76b35bde00000000, 0x2140662400000000, + 0x66d2228b00000000, 0xee629ea100000000, 0xa9f0da0e00000000, + 0x0182948e00000000, 0x4610d02100000000, 0xcea06c0b00000000, + 0x893228a400000000, 0xdec1155e00000000, 0x995351f100000000, + 0x11e3eddb00000000, 0x5671a97400000000, 0xbd01bf3200000000, + 0xfa93fb9d00000000, 0x722347b700000000, 0x35b1031800000000, + 0x62423ee200000000, 0x25d07a4d00000000, 0xad60c66700000000, + 0xeaf282c800000000, 0x4280cc4800000000, 0x051288e700000000, + 0x8da234cd00000000, 0xca30706200000000, 0x9dc34d9800000000, + 0xda51093700000000, 0x52e1b51d00000000, 0x1573f1b200000000, + 0x430258c600000000, 0x04901c6900000000, 0x8c20a04300000000, + 0xcbb2e4ec00000000, 0x9c41d91600000000, 0xdbd39db900000000, + 0x5363219300000000, 0x14f1653c00000000, 0xbc832bbc00000000, + 0xfb116f1300000000, 0x73a1d33900000000, 0x3433979600000000, + 0x63c0aa6c00000000, 0x2452eec300000000, 0xace252e900000000, + 0xeb70164600000000, 0x7a037e6500000000, 0x3d913aca00000000, + 0xb52186e000000000, 0xf2b3c24f00000000, 0xa540ffb500000000, + 0xe2d2bb1a00000000, 0x6a62073000000000, 0x2df0439f00000000, + 0x85820d1f00000000, 0xc21049b000000000, 0x4aa0f59a00000000, + 0x0d32b13500000000, 0x5ac18ccf00000000, 0x1d53c86000000000, + 0x95e3744a00000000, 0xd27130e500000000, 0x8400999100000000, + 0xc392dd3e00000000, 0x4b22611400000000, 0x0cb025bb00000000, + 0x5b43184100000000, 0x1cd15cee00000000, 0x9461e0c400000000, + 0xd3f3a46b00000000, 0x7b81eaeb00000000, 0x3c13ae4400000000, + 0xb4a3126e00000000, 0xf33156c100000000, 0xa4c26b3b00000000, + 0xe3502f9400000000, 0x6be093be00000000, 0x2c72d71100000000, + 0xc702c15700000000, 0x809085f800000000, 0x082039d200000000, + 0x4fb27d7d00000000, 0x1841408700000000, 0x5fd3042800000000, + 0xd763b80200000000, 0x90f1fcad00000000, 0x3883b22d00000000, + 0x7f11f68200000000, 0xf7a14aa800000000, 0xb0330e0700000000, + 0xe7c033fd00000000, 0xa052775200000000, 0x28e2cb7800000000, + 0x6f708fd700000000, 0x390126a300000000, 0x7e93620c00000000, + 0xf623de2600000000, 0xb1b19a8900000000, 0xe642a77300000000, + 0xa1d0e3dc00000000, 0x29605ff600000000, 0x6ef21b5900000000, + 0xc68055d900000000, 0x8112117600000000, 0x09a2ad5c00000000, + 0x4e30e9f300000000, 0x19c3d40900000000, 0x5e5190a600000000, + 0xd6e12c8c00000000, 0x9173682300000000, 0xf406fcca00000000, + 0xb394b86500000000, 0x3b24044f00000000, 0x7cb640e000000000, + 0x2b457d1a00000000, 0x6cd739b500000000, 0xe467859f00000000, + 0xa3f5c13000000000, 0x0b878fb000000000, 0x4c15cb1f00000000, + 0xc4a5773500000000, 0x8337339a00000000, 0xd4c40e6000000000, + 0x93564acf00000000, 0x1be6f6e500000000, 0x5c74b24a00000000, + 0x0a051b3e00000000, 0x4d975f9100000000, 0xc527e3bb00000000, + 0x82b5a71400000000, 0xd5469aee00000000, 0x92d4de4100000000, + 0x1a64626b00000000, 0x5df626c400000000, 0xf584684400000000, + 0xb2162ceb00000000, 0x3aa690c100000000, 0x7d34d46e00000000, + 0x2ac7e99400000000, 0x6d55ad3b00000000, 0xe5e5111100000000, + 0xa27755be00000000, 0x490743f800000000, 0x0e95075700000000, + 0x8625bb7d00000000, 0xc1b7ffd200000000, 0x9644c22800000000, + 0xd1d6868700000000, 0x59663aad00000000, 0x1ef47e0200000000, + 0xb686308200000000, 0xf114742d00000000, 0x79a4c80700000000, + 0x3e368ca800000000, 0x69c5b15200000000, 0x2e57f5fd00000000, + 0xa6e749d700000000, 0xe1750d7800000000, 0xb704a40c00000000, + 0xf096e0a300000000, 0x78265c8900000000, 0x3fb4182600000000, + 0x684725dc00000000, 0x2fd5617300000000, 0xa765dd5900000000, + 0xe0f799f600000000, 0x4885d77600000000, 0x0f1793d900000000, + 0x87a72ff300000000, 0xc0356b5c00000000, 0x97c656a600000000, + 0xd054120900000000, 0x58e4ae2300000000, 0x1f76ea8c00000000, + 0x8e0582af00000000, 0xc997c60000000000, 0x41277a2a00000000, + 0x06b53e8500000000, 0x5146037f00000000, 0x16d447d000000000, + 0x9e64fbfa00000000, 0xd9f6bf5500000000, 0x7184f1d500000000, + 0x3616b57a00000000, 0xbea6095000000000, 0xf9344dff00000000, + 0xaec7700500000000, 0xe95534aa00000000, 0x61e5888000000000, + 0x2677cc2f00000000, 0x7006655b00000000, 0x379421f400000000, + 0xbf249dde00000000, 0xf8b6d97100000000, 0xaf45e48b00000000, + 0xe8d7a02400000000, 0x60671c0e00000000, 0x27f558a100000000, + 0x8f87162100000000, 0xc815528e00000000, 0x40a5eea400000000, + 0x0737aa0b00000000, 0x50c497f100000000, 0x1756d35e00000000, + 0x9fe66f7400000000, 0xd8742bdb00000000, 0x33043d9d00000000, + 0x7496793200000000, 0xfc26c51800000000, 0xbbb481b700000000, + 0xec47bc4d00000000, 0xabd5f8e200000000, 0x236544c800000000, + 0x64f7006700000000, 0xcc854ee700000000, 0x8b170a4800000000, + 0x03a7b66200000000, 0x4435f2cd00000000, 0x13c6cf3700000000, + 0x54548b9800000000, 0xdce437b200000000, 0x9b76731d00000000, + 0xcd07da6900000000, 0x8a959ec600000000, 0x022522ec00000000, + 0x45b7664300000000, 0x12445bb900000000, 0x55d61f1600000000, + 0xdd66a33c00000000, 0x9af4e79300000000, 0x3286a91300000000, + 0x7514edbc00000000, 0xfda4519600000000, 0xba36153900000000, + 0xedc528c300000000, 0xaa576c6c00000000, 0x22e7d04600000000, + 0x657594e900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43cba687, 0xc7903cd4, 0x845b9a53, 0xcf270873, + 0x8cecaef4, 0x08b734a7, 0x4b7c9220, 0x9e4f10e6, 0xdd84b661, + 0x59df2c32, 0x1a148ab5, 0x51681895, 0x12a3be12, 0x96f82441, + 0xd53382c6, 0x7d995117, 0x3e52f790, 0xba096dc3, 0xf9c2cb44, + 0xb2be5964, 0xf175ffe3, 0x752e65b0, 0x36e5c337, 0xe3d641f1, + 0xa01de776, 0x24467d25, 0x678ddba2, 0x2cf14982, 0x6f3aef05, + 0xeb617556, 0xa8aad3d1, 0xfa32a32e, 0xb9f905a9, 0x3da29ffa, + 0x7e69397d, 0x3515ab5d, 0x76de0dda, 0xf2859789, 0xb14e310e, + 0x647db3c8, 0x27b6154f, 0xa3ed8f1c, 0xe026299b, 0xab5abbbb, + 0xe8911d3c, 0x6cca876f, 0x2f0121e8, 0x87abf239, 0xc46054be, + 0x403bceed, 0x03f0686a, 0x488cfa4a, 0x0b475ccd, 0x8f1cc69e, + 0xccd76019, 0x19e4e2df, 0x5a2f4458, 0xde74de0b, 0x9dbf788c, + 0xd6c3eaac, 0x95084c2b, 0x1153d678, 0x529870ff, 0xf465465d, + 0xb7aee0da, 0x33f57a89, 0x703edc0e, 0x3b424e2e, 0x7889e8a9, + 0xfcd272fa, 0xbf19d47d, 0x6a2a56bb, 0x29e1f03c, 0xadba6a6f, + 0xee71cce8, 0xa50d5ec8, 0xe6c6f84f, 0x629d621c, 0x2156c49b, + 0x89fc174a, 0xca37b1cd, 0x4e6c2b9e, 0x0da78d19, 0x46db1f39, + 0x0510b9be, 0x814b23ed, 0xc280856a, 0x17b307ac, 0x5478a12b, + 0xd0233b78, 0x93e89dff, 0xd8940fdf, 0x9b5fa958, 0x1f04330b, + 0x5ccf958c, 0x0e57e573, 0x4d9c43f4, 0xc9c7d9a7, 0x8a0c7f20, + 0xc170ed00, 0x82bb4b87, 0x06e0d1d4, 0x452b7753, 0x9018f595, + 0xd3d35312, 0x5788c941, 0x14436fc6, 0x5f3ffde6, 0x1cf45b61, + 0x98afc132, 0xdb6467b5, 0x73ceb464, 0x300512e3, 0xb45e88b0, + 0xf7952e37, 0xbce9bc17, 0xff221a90, 0x7b7980c3, 0x38b22644, + 0xed81a482, 0xae4a0205, 0x2a119856, 0x69da3ed1, 0x22a6acf1, + 0x616d0a76, 0xe5369025, 0xa6fd36a2, 0xe8cb8cba, 0xab002a3d, + 0x2f5bb06e, 0x6c9016e9, 0x27ec84c9, 0x6427224e, 0xe07cb81d, + 0xa3b71e9a, 0x76849c5c, 0x354f3adb, 0xb114a088, 0xf2df060f, + 0xb9a3942f, 0xfa6832a8, 0x7e33a8fb, 0x3df80e7c, 0x9552ddad, + 0xd6997b2a, 0x52c2e179, 0x110947fe, 0x5a75d5de, 0x19be7359, + 0x9de5e90a, 0xde2e4f8d, 0x0b1dcd4b, 0x48d66bcc, 0xcc8df19f, + 0x8f465718, 0xc43ac538, 0x87f163bf, 0x03aaf9ec, 0x40615f6b, + 0x12f92f94, 0x51328913, 0xd5691340, 0x96a2b5c7, 0xddde27e7, + 0x9e158160, 0x1a4e1b33, 0x5985bdb4, 0x8cb63f72, 0xcf7d99f5, + 0x4b2603a6, 0x08eda521, 0x43913701, 0x005a9186, 0x84010bd5, + 0xc7caad52, 0x6f607e83, 0x2cabd804, 0xa8f04257, 0xeb3be4d0, + 0xa04776f0, 0xe38cd077, 0x67d74a24, 0x241ceca3, 0xf12f6e65, + 0xb2e4c8e2, 0x36bf52b1, 0x7574f436, 0x3e086616, 0x7dc3c091, + 0xf9985ac2, 0xba53fc45, 0x1caecae7, 0x5f656c60, 0xdb3ef633, + 0x98f550b4, 0xd389c294, 0x90426413, 0x1419fe40, 0x57d258c7, + 0x82e1da01, 0xc12a7c86, 0x4571e6d5, 0x06ba4052, 0x4dc6d272, + 0x0e0d74f5, 0x8a56eea6, 0xc99d4821, 0x61379bf0, 0x22fc3d77, + 0xa6a7a724, 0xe56c01a3, 0xae109383, 0xeddb3504, 0x6980af57, + 0x2a4b09d0, 0xff788b16, 0xbcb32d91, 0x38e8b7c2, 0x7b231145, + 0x305f8365, 0x739425e2, 0xf7cfbfb1, 0xb4041936, 0xe69c69c9, + 0xa557cf4e, 0x210c551d, 0x62c7f39a, 0x29bb61ba, 0x6a70c73d, + 0xee2b5d6e, 0xade0fbe9, 0x78d3792f, 0x3b18dfa8, 0xbf4345fb, + 0xfc88e37c, 0xb7f4715c, 0xf43fd7db, 0x70644d88, 0x33afeb0f, + 0x9b0538de, 0xd8ce9e59, 0x5c95040a, 0x1f5ea28d, 0x542230ad, + 0x17e9962a, 0x93b20c79, 0xd079aafe, 0x054a2838, 0x46818ebf, + 0xc2da14ec, 0x8111b26b, 0xca6d204b, 0x89a686cc, 0x0dfd1c9f, + 0x4e36ba18}, + {0x00000000, 0xe1b652ef, 0x836bd405, 0x62dd86ea, 0x06d7a80b, + 0xe761fae4, 0x85bc7c0e, 0x640a2ee1, 0x0cae5117, 0xed1803f8, + 0x8fc58512, 0x6e73d7fd, 0x0a79f91c, 0xebcfabf3, 0x89122d19, + 0x68a47ff6, 0x185ca32e, 0xf9eaf1c1, 0x9b37772b, 0x7a8125c4, + 0x1e8b0b25, 0xff3d59ca, 0x9de0df20, 0x7c568dcf, 0x14f2f239, + 0xf544a0d6, 0x9799263c, 0x762f74d3, 0x12255a32, 0xf39308dd, + 0x914e8e37, 0x70f8dcd8, 0x30b8465d, 0xd10e14b2, 0xb3d39258, + 0x5265c0b7, 0x366fee56, 0xd7d9bcb9, 0xb5043a53, 0x54b268bc, + 0x3c16174a, 0xdda045a5, 0xbf7dc34f, 0x5ecb91a0, 0x3ac1bf41, + 0xdb77edae, 0xb9aa6b44, 0x581c39ab, 0x28e4e573, 0xc952b79c, + 0xab8f3176, 0x4a396399, 0x2e334d78, 0xcf851f97, 0xad58997d, + 0x4ceecb92, 0x244ab464, 0xc5fce68b, 0xa7216061, 0x4697328e, + 0x229d1c6f, 0xc32b4e80, 0xa1f6c86a, 0x40409a85, 0x60708dba, + 0x81c6df55, 0xe31b59bf, 0x02ad0b50, 0x66a725b1, 0x8711775e, + 0xe5ccf1b4, 0x047aa35b, 0x6cdedcad, 0x8d688e42, 0xefb508a8, + 0x0e035a47, 0x6a0974a6, 0x8bbf2649, 0xe962a0a3, 0x08d4f24c, + 0x782c2e94, 0x999a7c7b, 0xfb47fa91, 0x1af1a87e, 0x7efb869f, + 0x9f4dd470, 0xfd90529a, 0x1c260075, 0x74827f83, 0x95342d6c, + 0xf7e9ab86, 0x165ff969, 0x7255d788, 0x93e38567, 0xf13e038d, + 0x10885162, 0x50c8cbe7, 0xb17e9908, 0xd3a31fe2, 0x32154d0d, + 0x561f63ec, 0xb7a93103, 0xd574b7e9, 0x34c2e506, 0x5c669af0, + 0xbdd0c81f, 0xdf0d4ef5, 0x3ebb1c1a, 0x5ab132fb, 0xbb076014, + 0xd9dae6fe, 0x386cb411, 0x489468c9, 0xa9223a26, 0xcbffbccc, + 0x2a49ee23, 0x4e43c0c2, 0xaff5922d, 0xcd2814c7, 0x2c9e4628, + 0x443a39de, 0xa58c6b31, 0xc751eddb, 0x26e7bf34, 0x42ed91d5, + 0xa35bc33a, 0xc18645d0, 0x2030173f, 0x81e66bae, 0x60503941, + 0x028dbfab, 0xe33bed44, 0x8731c3a5, 0x6687914a, 0x045a17a0, + 0xe5ec454f, 0x8d483ab9, 0x6cfe6856, 0x0e23eebc, 0xef95bc53, + 0x8b9f92b2, 0x6a29c05d, 0x08f446b7, 0xe9421458, 0x99bac880, + 0x780c9a6f, 0x1ad11c85, 0xfb674e6a, 0x9f6d608b, 0x7edb3264, + 0x1c06b48e, 0xfdb0e661, 0x95149997, 0x74a2cb78, 0x167f4d92, + 0xf7c91f7d, 0x93c3319c, 0x72756373, 0x10a8e599, 0xf11eb776, + 0xb15e2df3, 0x50e87f1c, 0x3235f9f6, 0xd383ab19, 0xb78985f8, + 0x563fd717, 0x34e251fd, 0xd5540312, 0xbdf07ce4, 0x5c462e0b, + 0x3e9ba8e1, 0xdf2dfa0e, 0xbb27d4ef, 0x5a918600, 0x384c00ea, + 0xd9fa5205, 0xa9028edd, 0x48b4dc32, 0x2a695ad8, 0xcbdf0837, + 0xafd526d6, 0x4e637439, 0x2cbef2d3, 0xcd08a03c, 0xa5acdfca, + 0x441a8d25, 0x26c70bcf, 0xc7715920, 0xa37b77c1, 0x42cd252e, + 0x2010a3c4, 0xc1a6f12b, 0xe196e614, 0x0020b4fb, 0x62fd3211, + 0x834b60fe, 0xe7414e1f, 0x06f71cf0, 0x642a9a1a, 0x859cc8f5, + 0xed38b703, 0x0c8ee5ec, 0x6e536306, 0x8fe531e9, 0xebef1f08, + 0x0a594de7, 0x6884cb0d, 0x893299e2, 0xf9ca453a, 0x187c17d5, + 0x7aa1913f, 0x9b17c3d0, 0xff1ded31, 0x1eabbfde, 0x7c763934, + 0x9dc06bdb, 0xf564142d, 0x14d246c2, 0x760fc028, 0x97b992c7, + 0xf3b3bc26, 0x1205eec9, 0x70d86823, 0x916e3acc, 0xd12ea049, + 0x3098f2a6, 0x5245744c, 0xb3f326a3, 0xd7f90842, 0x364f5aad, + 0x5492dc47, 0xb5248ea8, 0xdd80f15e, 0x3c36a3b1, 0x5eeb255b, + 0xbf5d77b4, 0xdb575955, 0x3ae10bba, 0x583c8d50, 0xb98adfbf, + 0xc9720367, 0x28c45188, 0x4a19d762, 0xabaf858d, 0xcfa5ab6c, + 0x2e13f983, 0x4cce7f69, 0xad782d86, 0xc5dc5270, 0x246a009f, + 0x46b78675, 0xa701d49a, 0xc30bfa7b, 0x22bda894, 0x40602e7e, + 0xa1d67c91}, + {0x00000000, 0x5880e2d7, 0xf106b474, 0xa98656a3, 0xe20d68e9, + 0xba8d8a3e, 0x130bdc9d, 0x4b8b3e4a, 0x851da109, 0xdd9d43de, + 0x741b157d, 0x2c9bf7aa, 0x6710c9e0, 0x3f902b37, 0x96167d94, + 0xce969f43, 0x0a3b4213, 0x52bba0c4, 0xfb3df667, 0xa3bd14b0, + 0xe8362afa, 0xb0b6c82d, 0x19309e8e, 0x41b07c59, 0x8f26e31a, + 0xd7a601cd, 0x7e20576e, 0x26a0b5b9, 0x6d2b8bf3, 0x35ab6924, + 0x9c2d3f87, 0xc4addd50, 0x14768426, 0x4cf666f1, 0xe5703052, + 0xbdf0d285, 0xf67beccf, 0xaefb0e18, 0x077d58bb, 0x5ffdba6c, + 0x916b252f, 0xc9ebc7f8, 0x606d915b, 0x38ed738c, 0x73664dc6, + 0x2be6af11, 0x8260f9b2, 0xdae01b65, 0x1e4dc635, 0x46cd24e2, + 0xef4b7241, 0xb7cb9096, 0xfc40aedc, 0xa4c04c0b, 0x0d461aa8, + 0x55c6f87f, 0x9b50673c, 0xc3d085eb, 0x6a56d348, 0x32d6319f, + 0x795d0fd5, 0x21dded02, 0x885bbba1, 0xd0db5976, 0x28ec084d, + 0x706cea9a, 0xd9eabc39, 0x816a5eee, 0xcae160a4, 0x92618273, + 0x3be7d4d0, 0x63673607, 0xadf1a944, 0xf5714b93, 0x5cf71d30, + 0x0477ffe7, 0x4ffcc1ad, 0x177c237a, 0xbefa75d9, 0xe67a970e, + 0x22d74a5e, 0x7a57a889, 0xd3d1fe2a, 0x8b511cfd, 0xc0da22b7, + 0x985ac060, 0x31dc96c3, 0x695c7414, 0xa7caeb57, 0xff4a0980, + 0x56cc5f23, 0x0e4cbdf4, 0x45c783be, 0x1d476169, 0xb4c137ca, + 0xec41d51d, 0x3c9a8c6b, 0x641a6ebc, 0xcd9c381f, 0x951cdac8, + 0xde97e482, 0x86170655, 0x2f9150f6, 0x7711b221, 0xb9872d62, + 0xe107cfb5, 0x48819916, 0x10017bc1, 0x5b8a458b, 0x030aa75c, + 0xaa8cf1ff, 0xf20c1328, 0x36a1ce78, 0x6e212caf, 0xc7a77a0c, + 0x9f2798db, 0xd4aca691, 0x8c2c4446, 0x25aa12e5, 0x7d2af032, + 0xb3bc6f71, 0xeb3c8da6, 0x42badb05, 0x1a3a39d2, 0x51b10798, + 0x0931e54f, 0xa0b7b3ec, 0xf837513b, 0x50d8119a, 0x0858f34d, + 0xa1dea5ee, 0xf95e4739, 0xb2d57973, 0xea559ba4, 0x43d3cd07, + 0x1b532fd0, 0xd5c5b093, 0x8d455244, 0x24c304e7, 0x7c43e630, + 0x37c8d87a, 0x6f483aad, 0xc6ce6c0e, 0x9e4e8ed9, 0x5ae35389, + 0x0263b15e, 0xabe5e7fd, 0xf365052a, 0xb8ee3b60, 0xe06ed9b7, + 0x49e88f14, 0x11686dc3, 0xdffef280, 0x877e1057, 0x2ef846f4, + 0x7678a423, 0x3df39a69, 0x657378be, 0xccf52e1d, 0x9475ccca, + 0x44ae95bc, 0x1c2e776b, 0xb5a821c8, 0xed28c31f, 0xa6a3fd55, + 0xfe231f82, 0x57a54921, 0x0f25abf6, 0xc1b334b5, 0x9933d662, + 0x30b580c1, 0x68356216, 0x23be5c5c, 0x7b3ebe8b, 0xd2b8e828, + 0x8a380aff, 0x4e95d7af, 0x16153578, 0xbf9363db, 0xe713810c, + 0xac98bf46, 0xf4185d91, 0x5d9e0b32, 0x051ee9e5, 0xcb8876a6, + 0x93089471, 0x3a8ec2d2, 0x620e2005, 0x29851e4f, 0x7105fc98, + 0xd883aa3b, 0x800348ec, 0x783419d7, 0x20b4fb00, 0x8932ada3, + 0xd1b24f74, 0x9a39713e, 0xc2b993e9, 0x6b3fc54a, 0x33bf279d, + 0xfd29b8de, 0xa5a95a09, 0x0c2f0caa, 0x54afee7d, 0x1f24d037, + 0x47a432e0, 0xee226443, 0xb6a28694, 0x720f5bc4, 0x2a8fb913, + 0x8309efb0, 0xdb890d67, 0x9002332d, 0xc882d1fa, 0x61048759, + 0x3984658e, 0xf712facd, 0xaf92181a, 0x06144eb9, 0x5e94ac6e, + 0x151f9224, 0x4d9f70f3, 0xe4192650, 0xbc99c487, 0x6c429df1, + 0x34c27f26, 0x9d442985, 0xc5c4cb52, 0x8e4ff518, 0xd6cf17cf, + 0x7f49416c, 0x27c9a3bb, 0xe95f3cf8, 0xb1dfde2f, 0x1859888c, + 0x40d96a5b, 0x0b525411, 0x53d2b6c6, 0xfa54e065, 0xa2d402b2, + 0x6679dfe2, 0x3ef93d35, 0x977f6b96, 0xcfff8941, 0x8474b70b, + 0xdcf455dc, 0x7572037f, 0x2df2e1a8, 0xe3647eeb, 0xbbe49c3c, + 0x1262ca9f, 0x4ae22848, 0x01691602, 0x59e9f4d5, 0xf06fa276, + 0xa8ef40a1}, + {0x00000000, 0x463b6765, 0x8c76ceca, 0xca4da9af, 0x59ebed4e, + 0x1fd08a2b, 0xd59d2384, 0x93a644e1, 0xb2d6db9d, 0xf4edbcf8, + 0x3ea01557, 0x789b7232, 0xeb3d36d3, 0xad0651b6, 0x674bf819, + 0x21709f7c, 0x25abc6e0, 0x6390a185, 0xa9dd082a, 0xefe66f4f, + 0x7c402bae, 0x3a7b4ccb, 0xf036e564, 0xb60d8201, 0x977d1d7d, + 0xd1467a18, 0x1b0bd3b7, 0x5d30b4d2, 0xce96f033, 0x88ad9756, + 0x42e03ef9, 0x04db599c, 0x0b50fc1a, 0x4d6b9b7f, 0x872632d0, + 0xc11d55b5, 0x52bb1154, 0x14807631, 0xdecddf9e, 0x98f6b8fb, + 0xb9862787, 0xffbd40e2, 0x35f0e94d, 0x73cb8e28, 0xe06dcac9, + 0xa656adac, 0x6c1b0403, 0x2a206366, 0x2efb3afa, 0x68c05d9f, + 0xa28df430, 0xe4b69355, 0x7710d7b4, 0x312bb0d1, 0xfb66197e, + 0xbd5d7e1b, 0x9c2de167, 0xda168602, 0x105b2fad, 0x566048c8, + 0xc5c60c29, 0x83fd6b4c, 0x49b0c2e3, 0x0f8ba586, 0x16a0f835, + 0x509b9f50, 0x9ad636ff, 0xdced519a, 0x4f4b157b, 0x0970721e, + 0xc33ddbb1, 0x8506bcd4, 0xa47623a8, 0xe24d44cd, 0x2800ed62, + 0x6e3b8a07, 0xfd9dcee6, 0xbba6a983, 0x71eb002c, 0x37d06749, + 0x330b3ed5, 0x753059b0, 0xbf7df01f, 0xf946977a, 0x6ae0d39b, + 0x2cdbb4fe, 0xe6961d51, 0xa0ad7a34, 0x81dde548, 0xc7e6822d, + 0x0dab2b82, 0x4b904ce7, 0xd8360806, 0x9e0d6f63, 0x5440c6cc, + 0x127ba1a9, 0x1df0042f, 0x5bcb634a, 0x9186cae5, 0xd7bdad80, + 0x441be961, 0x02208e04, 0xc86d27ab, 0x8e5640ce, 0xaf26dfb2, + 0xe91db8d7, 0x23501178, 0x656b761d, 0xf6cd32fc, 0xb0f65599, + 0x7abbfc36, 0x3c809b53, 0x385bc2cf, 0x7e60a5aa, 0xb42d0c05, + 0xf2166b60, 0x61b02f81, 0x278b48e4, 0xedc6e14b, 0xabfd862e, + 0x8a8d1952, 0xccb67e37, 0x06fbd798, 0x40c0b0fd, 0xd366f41c, + 0x955d9379, 0x5f103ad6, 0x192b5db3, 0x2c40f16b, 0x6a7b960e, + 0xa0363fa1, 0xe60d58c4, 0x75ab1c25, 0x33907b40, 0xf9ddd2ef, + 0xbfe6b58a, 0x9e962af6, 0xd8ad4d93, 0x12e0e43c, 0x54db8359, + 0xc77dc7b8, 0x8146a0dd, 0x4b0b0972, 0x0d306e17, 0x09eb378b, + 0x4fd050ee, 0x859df941, 0xc3a69e24, 0x5000dac5, 0x163bbda0, + 0xdc76140f, 0x9a4d736a, 0xbb3dec16, 0xfd068b73, 0x374b22dc, + 0x717045b9, 0xe2d60158, 0xa4ed663d, 0x6ea0cf92, 0x289ba8f7, + 0x27100d71, 0x612b6a14, 0xab66c3bb, 0xed5da4de, 0x7efbe03f, + 0x38c0875a, 0xf28d2ef5, 0xb4b64990, 0x95c6d6ec, 0xd3fdb189, + 0x19b01826, 0x5f8b7f43, 0xcc2d3ba2, 0x8a165cc7, 0x405bf568, + 0x0660920d, 0x02bbcb91, 0x4480acf4, 0x8ecd055b, 0xc8f6623e, + 0x5b5026df, 0x1d6b41ba, 0xd726e815, 0x911d8f70, 0xb06d100c, + 0xf6567769, 0x3c1bdec6, 0x7a20b9a3, 0xe986fd42, 0xafbd9a27, + 0x65f03388, 0x23cb54ed, 0x3ae0095e, 0x7cdb6e3b, 0xb696c794, + 0xf0ada0f1, 0x630be410, 0x25308375, 0xef7d2ada, 0xa9464dbf, + 0x8836d2c3, 0xce0db5a6, 0x04401c09, 0x427b7b6c, 0xd1dd3f8d, + 0x97e658e8, 0x5dabf147, 0x1b909622, 0x1f4bcfbe, 0x5970a8db, + 0x933d0174, 0xd5066611, 0x46a022f0, 0x009b4595, 0xcad6ec3a, + 0x8ced8b5f, 0xad9d1423, 0xeba67346, 0x21ebdae9, 0x67d0bd8c, + 0xf476f96d, 0xb24d9e08, 0x780037a7, 0x3e3b50c2, 0x31b0f544, + 0x778b9221, 0xbdc63b8e, 0xfbfd5ceb, 0x685b180a, 0x2e607f6f, + 0xe42dd6c0, 0xa216b1a5, 0x83662ed9, 0xc55d49bc, 0x0f10e013, + 0x492b8776, 0xda8dc397, 0x9cb6a4f2, 0x56fb0d5d, 0x10c06a38, + 0x141b33a4, 0x522054c1, 0x986dfd6e, 0xde569a0b, 0x4df0deea, + 0x0bcbb98f, 0xc1861020, 0x87bd7745, 0xa6cde839, 0xe0f68f5c, + 0x2abb26f3, 0x6c804196, 0xff260577, 0xb91d6212, 0x7350cbbd, + 0x356bacd8}}; + +#endif + +#endif + +#if N == 6 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x3db1ecdc, 0x7b63d9b8, 0x46d23564, 0xf6c7b370, + 0xcb765fac, 0x8da46ac8, 0xb0158614, 0x36fe60a1, 0x0b4f8c7d, + 0x4d9db919, 0x702c55c5, 0xc039d3d1, 0xfd883f0d, 0xbb5a0a69, + 0x86ebe6b5, 0x6dfcc142, 0x504d2d9e, 0x169f18fa, 0x2b2ef426, + 0x9b3b7232, 0xa68a9eee, 0xe058ab8a, 0xdde94756, 0x5b02a1e3, + 0x66b34d3f, 0x2061785b, 0x1dd09487, 0xadc51293, 0x9074fe4f, + 0xd6a6cb2b, 0xeb1727f7, 0xdbf98284, 0xe6486e58, 0xa09a5b3c, + 0x9d2bb7e0, 0x2d3e31f4, 0x108fdd28, 0x565de84c, 0x6bec0490, + 0xed07e225, 0xd0b60ef9, 0x96643b9d, 0xabd5d741, 0x1bc05155, + 0x2671bd89, 0x60a388ed, 0x5d126431, 0xb60543c6, 0x8bb4af1a, + 0xcd669a7e, 0xf0d776a2, 0x40c2f0b6, 0x7d731c6a, 0x3ba1290e, + 0x0610c5d2, 0x80fb2367, 0xbd4acfbb, 0xfb98fadf, 0xc6291603, + 0x763c9017, 0x4b8d7ccb, 0x0d5f49af, 0x30eea573, 0x6c820349, + 0x5133ef95, 0x17e1daf1, 0x2a50362d, 0x9a45b039, 0xa7f45ce5, + 0xe1266981, 0xdc97855d, 0x5a7c63e8, 0x67cd8f34, 0x211fba50, + 0x1cae568c, 0xacbbd098, 0x910a3c44, 0xd7d80920, 0xea69e5fc, + 0x017ec20b, 0x3ccf2ed7, 0x7a1d1bb3, 0x47acf76f, 0xf7b9717b, + 0xca089da7, 0x8cdaa8c3, 0xb16b441f, 0x3780a2aa, 0x0a314e76, + 0x4ce37b12, 0x715297ce, 0xc14711da, 0xfcf6fd06, 0xba24c862, + 0x879524be, 0xb77b81cd, 0x8aca6d11, 0xcc185875, 0xf1a9b4a9, + 0x41bc32bd, 0x7c0dde61, 0x3adfeb05, 0x076e07d9, 0x8185e16c, + 0xbc340db0, 0xfae638d4, 0xc757d408, 0x7742521c, 0x4af3bec0, + 0x0c218ba4, 0x31906778, 0xda87408f, 0xe736ac53, 0xa1e49937, + 0x9c5575eb, 0x2c40f3ff, 0x11f11f23, 0x57232a47, 0x6a92c69b, + 0xec79202e, 0xd1c8ccf2, 0x971af996, 0xaaab154a, 0x1abe935e, + 0x270f7f82, 0x61dd4ae6, 0x5c6ca63a, 0xd9040692, 0xe4b5ea4e, + 0xa267df2a, 0x9fd633f6, 0x2fc3b5e2, 0x1272593e, 0x54a06c5a, + 0x69118086, 0xeffa6633, 0xd24b8aef, 0x9499bf8b, 0xa9285357, + 0x193dd543, 0x248c399f, 0x625e0cfb, 0x5fefe027, 0xb4f8c7d0, + 0x89492b0c, 0xcf9b1e68, 0xf22af2b4, 0x423f74a0, 0x7f8e987c, + 0x395cad18, 0x04ed41c4, 0x8206a771, 0xbfb74bad, 0xf9657ec9, + 0xc4d49215, 0x74c11401, 0x4970f8dd, 0x0fa2cdb9, 0x32132165, + 0x02fd8416, 0x3f4c68ca, 0x799e5dae, 0x442fb172, 0xf43a3766, + 0xc98bdbba, 0x8f59eede, 0xb2e80202, 0x3403e4b7, 0x09b2086b, + 0x4f603d0f, 0x72d1d1d3, 0xc2c457c7, 0xff75bb1b, 0xb9a78e7f, + 0x841662a3, 0x6f014554, 0x52b0a988, 0x14629cec, 0x29d37030, + 0x99c6f624, 0xa4771af8, 0xe2a52f9c, 0xdf14c340, 0x59ff25f5, + 0x644ec929, 0x229cfc4d, 0x1f2d1091, 0xaf389685, 0x92897a59, + 0xd45b4f3d, 0xe9eaa3e1, 0xb58605db, 0x8837e907, 0xcee5dc63, + 0xf35430bf, 0x4341b6ab, 0x7ef05a77, 0x38226f13, 0x059383cf, + 0x8378657a, 0xbec989a6, 0xf81bbcc2, 0xc5aa501e, 0x75bfd60a, + 0x480e3ad6, 0x0edc0fb2, 0x336de36e, 0xd87ac499, 0xe5cb2845, + 0xa3191d21, 0x9ea8f1fd, 0x2ebd77e9, 0x130c9b35, 0x55deae51, + 0x686f428d, 0xee84a438, 0xd33548e4, 0x95e77d80, 0xa856915c, + 0x18431748, 0x25f2fb94, 0x6320cef0, 0x5e91222c, 0x6e7f875f, + 0x53ce6b83, 0x151c5ee7, 0x28adb23b, 0x98b8342f, 0xa509d8f3, + 0xe3dbed97, 0xde6a014b, 0x5881e7fe, 0x65300b22, 0x23e23e46, + 0x1e53d29a, 0xae46548e, 0x93f7b852, 0xd5258d36, 0xe89461ea, + 0x0383461d, 0x3e32aac1, 0x78e09fa5, 0x45517379, 0xf544f56d, + 0xc8f519b1, 0x8e272cd5, 0xb396c009, 0x357d26bc, 0x08ccca60, + 0x4e1eff04, 0x73af13d8, 0xc3ba95cc, 0xfe0b7910, 0xb8d94c74, + 0x8568a0a8}, + {0x00000000, 0x69790b65, 0xd2f216ca, 0xbb8b1daf, 0x7e952bd5, + 0x17ec20b0, 0xac673d1f, 0xc51e367a, 0xfd2a57aa, 0x94535ccf, + 0x2fd84160, 0x46a14a05, 0x83bf7c7f, 0xeac6771a, 0x514d6ab5, + 0x383461d0, 0x2125a915, 0x485ca270, 0xf3d7bfdf, 0x9aaeb4ba, + 0x5fb082c0, 0x36c989a5, 0x8d42940a, 0xe43b9f6f, 0xdc0ffebf, + 0xb576f5da, 0x0efde875, 0x6784e310, 0xa29ad56a, 0xcbe3de0f, + 0x7068c3a0, 0x1911c8c5, 0x424b522a, 0x2b32594f, 0x90b944e0, + 0xf9c04f85, 0x3cde79ff, 0x55a7729a, 0xee2c6f35, 0x87556450, + 0xbf610580, 0xd6180ee5, 0x6d93134a, 0x04ea182f, 0xc1f42e55, + 0xa88d2530, 0x1306389f, 0x7a7f33fa, 0x636efb3f, 0x0a17f05a, + 0xb19cedf5, 0xd8e5e690, 0x1dfbd0ea, 0x7482db8f, 0xcf09c620, + 0xa670cd45, 0x9e44ac95, 0xf73da7f0, 0x4cb6ba5f, 0x25cfb13a, + 0xe0d18740, 0x89a88c25, 0x3223918a, 0x5b5a9aef, 0x8496a454, + 0xedefaf31, 0x5664b29e, 0x3f1db9fb, 0xfa038f81, 0x937a84e4, + 0x28f1994b, 0x4188922e, 0x79bcf3fe, 0x10c5f89b, 0xab4ee534, + 0xc237ee51, 0x0729d82b, 0x6e50d34e, 0xd5dbcee1, 0xbca2c584, + 0xa5b30d41, 0xccca0624, 0x77411b8b, 0x1e3810ee, 0xdb262694, + 0xb25f2df1, 0x09d4305e, 0x60ad3b3b, 0x58995aeb, 0x31e0518e, + 0x8a6b4c21, 0xe3124744, 0x260c713e, 0x4f757a5b, 0xf4fe67f4, + 0x9d876c91, 0xc6ddf67e, 0xafa4fd1b, 0x142fe0b4, 0x7d56ebd1, + 0xb848ddab, 0xd131d6ce, 0x6abacb61, 0x03c3c004, 0x3bf7a1d4, + 0x528eaab1, 0xe905b71e, 0x807cbc7b, 0x45628a01, 0x2c1b8164, + 0x97909ccb, 0xfee997ae, 0xe7f85f6b, 0x8e81540e, 0x350a49a1, + 0x5c7342c4, 0x996d74be, 0xf0147fdb, 0x4b9f6274, 0x22e66911, + 0x1ad208c1, 0x73ab03a4, 0xc8201e0b, 0xa159156e, 0x64472314, + 0x0d3e2871, 0xb6b535de, 0xdfcc3ebb, 0xd25c4ee9, 0xbb25458c, + 0x00ae5823, 0x69d75346, 0xacc9653c, 0xc5b06e59, 0x7e3b73f6, + 0x17427893, 0x2f761943, 0x460f1226, 0xfd840f89, 0x94fd04ec, + 0x51e33296, 0x389a39f3, 0x8311245c, 0xea682f39, 0xf379e7fc, + 0x9a00ec99, 0x218bf136, 0x48f2fa53, 0x8deccc29, 0xe495c74c, + 0x5f1edae3, 0x3667d186, 0x0e53b056, 0x672abb33, 0xdca1a69c, + 0xb5d8adf9, 0x70c69b83, 0x19bf90e6, 0xa2348d49, 0xcb4d862c, + 0x90171cc3, 0xf96e17a6, 0x42e50a09, 0x2b9c016c, 0xee823716, + 0x87fb3c73, 0x3c7021dc, 0x55092ab9, 0x6d3d4b69, 0x0444400c, + 0xbfcf5da3, 0xd6b656c6, 0x13a860bc, 0x7ad16bd9, 0xc15a7676, + 0xa8237d13, 0xb132b5d6, 0xd84bbeb3, 0x63c0a31c, 0x0ab9a879, + 0xcfa79e03, 0xa6de9566, 0x1d5588c9, 0x742c83ac, 0x4c18e27c, + 0x2561e919, 0x9eeaf4b6, 0xf793ffd3, 0x328dc9a9, 0x5bf4c2cc, + 0xe07fdf63, 0x8906d406, 0x56caeabd, 0x3fb3e1d8, 0x8438fc77, + 0xed41f712, 0x285fc168, 0x4126ca0d, 0xfaadd7a2, 0x93d4dcc7, + 0xabe0bd17, 0xc299b672, 0x7912abdd, 0x106ba0b8, 0xd57596c2, + 0xbc0c9da7, 0x07878008, 0x6efe8b6d, 0x77ef43a8, 0x1e9648cd, + 0xa51d5562, 0xcc645e07, 0x097a687d, 0x60036318, 0xdb887eb7, + 0xb2f175d2, 0x8ac51402, 0xe3bc1f67, 0x583702c8, 0x314e09ad, + 0xf4503fd7, 0x9d2934b2, 0x26a2291d, 0x4fdb2278, 0x1481b897, + 0x7df8b3f2, 0xc673ae5d, 0xaf0aa538, 0x6a149342, 0x036d9827, + 0xb8e68588, 0xd19f8eed, 0xe9abef3d, 0x80d2e458, 0x3b59f9f7, + 0x5220f292, 0x973ec4e8, 0xfe47cf8d, 0x45ccd222, 0x2cb5d947, + 0x35a41182, 0x5cdd1ae7, 0xe7560748, 0x8e2f0c2d, 0x4b313a57, + 0x22483132, 0x99c32c9d, 0xf0ba27f8, 0xc88e4628, 0xa1f74d4d, + 0x1a7c50e2, 0x73055b87, 0xb61b6dfd, 0xdf626698, 0x64e97b37, + 0x0d907052}, + {0x00000000, 0x7fc99b93, 0xff933726, 0x805aacb5, 0x2457680d, + 0x5b9ef39e, 0xdbc45f2b, 0xa40dc4b8, 0x48aed01a, 0x37674b89, + 0xb73de73c, 0xc8f47caf, 0x6cf9b817, 0x13302384, 0x936a8f31, + 0xeca314a2, 0x915da034, 0xee943ba7, 0x6ece9712, 0x11070c81, + 0xb50ac839, 0xcac353aa, 0x4a99ff1f, 0x3550648c, 0xd9f3702e, + 0xa63aebbd, 0x26604708, 0x59a9dc9b, 0xfda41823, 0x826d83b0, + 0x02372f05, 0x7dfeb496, 0xf9ca4629, 0x8603ddba, 0x0659710f, + 0x7990ea9c, 0xdd9d2e24, 0xa254b5b7, 0x220e1902, 0x5dc78291, + 0xb1649633, 0xcead0da0, 0x4ef7a115, 0x313e3a86, 0x9533fe3e, + 0xeafa65ad, 0x6aa0c918, 0x1569528b, 0x6897e61d, 0x175e7d8e, + 0x9704d13b, 0xe8cd4aa8, 0x4cc08e10, 0x33091583, 0xb353b936, + 0xcc9a22a5, 0x20393607, 0x5ff0ad94, 0xdfaa0121, 0xa0639ab2, + 0x046e5e0a, 0x7ba7c599, 0xfbfd692c, 0x8434f2bf, 0x28e58a13, + 0x572c1180, 0xd776bd35, 0xa8bf26a6, 0x0cb2e21e, 0x737b798d, + 0xf321d538, 0x8ce84eab, 0x604b5a09, 0x1f82c19a, 0x9fd86d2f, + 0xe011f6bc, 0x441c3204, 0x3bd5a997, 0xbb8f0522, 0xc4469eb1, + 0xb9b82a27, 0xc671b1b4, 0x462b1d01, 0x39e28692, 0x9def422a, + 0xe226d9b9, 0x627c750c, 0x1db5ee9f, 0xf116fa3d, 0x8edf61ae, + 0x0e85cd1b, 0x714c5688, 0xd5419230, 0xaa8809a3, 0x2ad2a516, + 0x551b3e85, 0xd12fcc3a, 0xaee657a9, 0x2ebcfb1c, 0x5175608f, + 0xf578a437, 0x8ab13fa4, 0x0aeb9311, 0x75220882, 0x99811c20, + 0xe64887b3, 0x66122b06, 0x19dbb095, 0xbdd6742d, 0xc21fefbe, + 0x4245430b, 0x3d8cd898, 0x40726c0e, 0x3fbbf79d, 0xbfe15b28, + 0xc028c0bb, 0x64250403, 0x1bec9f90, 0x9bb63325, 0xe47fa8b6, + 0x08dcbc14, 0x77152787, 0xf74f8b32, 0x888610a1, 0x2c8bd419, + 0x53424f8a, 0xd318e33f, 0xacd178ac, 0x51cb1426, 0x2e028fb5, + 0xae582300, 0xd191b893, 0x759c7c2b, 0x0a55e7b8, 0x8a0f4b0d, + 0xf5c6d09e, 0x1965c43c, 0x66ac5faf, 0xe6f6f31a, 0x993f6889, + 0x3d32ac31, 0x42fb37a2, 0xc2a19b17, 0xbd680084, 0xc096b412, + 0xbf5f2f81, 0x3f058334, 0x40cc18a7, 0xe4c1dc1f, 0x9b08478c, + 0x1b52eb39, 0x649b70aa, 0x88386408, 0xf7f1ff9b, 0x77ab532e, + 0x0862c8bd, 0xac6f0c05, 0xd3a69796, 0x53fc3b23, 0x2c35a0b0, + 0xa801520f, 0xd7c8c99c, 0x57926529, 0x285bfeba, 0x8c563a02, + 0xf39fa191, 0x73c50d24, 0x0c0c96b7, 0xe0af8215, 0x9f661986, + 0x1f3cb533, 0x60f52ea0, 0xc4f8ea18, 0xbb31718b, 0x3b6bdd3e, + 0x44a246ad, 0x395cf23b, 0x469569a8, 0xc6cfc51d, 0xb9065e8e, + 0x1d0b9a36, 0x62c201a5, 0xe298ad10, 0x9d513683, 0x71f22221, + 0x0e3bb9b2, 0x8e611507, 0xf1a88e94, 0x55a54a2c, 0x2a6cd1bf, + 0xaa367d0a, 0xd5ffe699, 0x792e9e35, 0x06e705a6, 0x86bda913, + 0xf9743280, 0x5d79f638, 0x22b06dab, 0xa2eac11e, 0xdd235a8d, + 0x31804e2f, 0x4e49d5bc, 0xce137909, 0xb1dae29a, 0x15d72622, + 0x6a1ebdb1, 0xea441104, 0x958d8a97, 0xe8733e01, 0x97baa592, + 0x17e00927, 0x682992b4, 0xcc24560c, 0xb3edcd9f, 0x33b7612a, + 0x4c7efab9, 0xa0ddee1b, 0xdf147588, 0x5f4ed93d, 0x208742ae, + 0x848a8616, 0xfb431d85, 0x7b19b130, 0x04d02aa3, 0x80e4d81c, + 0xff2d438f, 0x7f77ef3a, 0x00be74a9, 0xa4b3b011, 0xdb7a2b82, + 0x5b208737, 0x24e91ca4, 0xc84a0806, 0xb7839395, 0x37d93f20, + 0x4810a4b3, 0xec1d600b, 0x93d4fb98, 0x138e572d, 0x6c47ccbe, + 0x11b97828, 0x6e70e3bb, 0xee2a4f0e, 0x91e3d49d, 0x35ee1025, + 0x4a278bb6, 0xca7d2703, 0xb5b4bc90, 0x5917a832, 0x26de33a1, + 0xa6849f14, 0xd94d0487, 0x7d40c03f, 0x02895bac, 0x82d3f719, + 0xfd1a6c8a}, + {0x00000000, 0xa396284c, 0x9c5d56d9, 0x3fcb7e95, 0xe3cbabf3, + 0x405d83bf, 0x7f96fd2a, 0xdc00d566, 0x1ce651a7, 0xbf7079eb, + 0x80bb077e, 0x232d2f32, 0xff2dfa54, 0x5cbbd218, 0x6370ac8d, + 0xc0e684c1, 0x39cca34e, 0x9a5a8b02, 0xa591f597, 0x0607dddb, + 0xda0708bd, 0x799120f1, 0x465a5e64, 0xe5cc7628, 0x252af2e9, + 0x86bcdaa5, 0xb977a430, 0x1ae18c7c, 0xc6e1591a, 0x65777156, + 0x5abc0fc3, 0xf92a278f, 0x7399469c, 0xd00f6ed0, 0xefc41045, + 0x4c523809, 0x9052ed6f, 0x33c4c523, 0x0c0fbbb6, 0xaf9993fa, + 0x6f7f173b, 0xcce93f77, 0xf32241e2, 0x50b469ae, 0x8cb4bcc8, + 0x2f229484, 0x10e9ea11, 0xb37fc25d, 0x4a55e5d2, 0xe9c3cd9e, + 0xd608b30b, 0x759e9b47, 0xa99e4e21, 0x0a08666d, 0x35c318f8, + 0x965530b4, 0x56b3b475, 0xf5259c39, 0xcaeee2ac, 0x6978cae0, + 0xb5781f86, 0x16ee37ca, 0x2925495f, 0x8ab36113, 0xe7328d38, + 0x44a4a574, 0x7b6fdbe1, 0xd8f9f3ad, 0x04f926cb, 0xa76f0e87, + 0x98a47012, 0x3b32585e, 0xfbd4dc9f, 0x5842f4d3, 0x67898a46, + 0xc41fa20a, 0x181f776c, 0xbb895f20, 0x844221b5, 0x27d409f9, + 0xdefe2e76, 0x7d68063a, 0x42a378af, 0xe13550e3, 0x3d358585, + 0x9ea3adc9, 0xa168d35c, 0x02fefb10, 0xc2187fd1, 0x618e579d, + 0x5e452908, 0xfdd30144, 0x21d3d422, 0x8245fc6e, 0xbd8e82fb, + 0x1e18aab7, 0x94abcba4, 0x373de3e8, 0x08f69d7d, 0xab60b531, + 0x77606057, 0xd4f6481b, 0xeb3d368e, 0x48ab1ec2, 0x884d9a03, + 0x2bdbb24f, 0x1410ccda, 0xb786e496, 0x6b8631f0, 0xc81019bc, + 0xf7db6729, 0x544d4f65, 0xad6768ea, 0x0ef140a6, 0x313a3e33, + 0x92ac167f, 0x4eacc319, 0xed3aeb55, 0xd2f195c0, 0x7167bd8c, + 0xb181394d, 0x12171101, 0x2ddc6f94, 0x8e4a47d8, 0x524a92be, + 0xf1dcbaf2, 0xce17c467, 0x6d81ec2b, 0x15141c31, 0xb682347d, + 0x89494ae8, 0x2adf62a4, 0xf6dfb7c2, 0x55499f8e, 0x6a82e11b, + 0xc914c957, 0x09f24d96, 0xaa6465da, 0x95af1b4f, 0x36393303, + 0xea39e665, 0x49afce29, 0x7664b0bc, 0xd5f298f0, 0x2cd8bf7f, + 0x8f4e9733, 0xb085e9a6, 0x1313c1ea, 0xcf13148c, 0x6c853cc0, + 0x534e4255, 0xf0d86a19, 0x303eeed8, 0x93a8c694, 0xac63b801, + 0x0ff5904d, 0xd3f5452b, 0x70636d67, 0x4fa813f2, 0xec3e3bbe, + 0x668d5aad, 0xc51b72e1, 0xfad00c74, 0x59462438, 0x8546f15e, + 0x26d0d912, 0x191ba787, 0xba8d8fcb, 0x7a6b0b0a, 0xd9fd2346, + 0xe6365dd3, 0x45a0759f, 0x99a0a0f9, 0x3a3688b5, 0x05fdf620, + 0xa66bde6c, 0x5f41f9e3, 0xfcd7d1af, 0xc31caf3a, 0x608a8776, + 0xbc8a5210, 0x1f1c7a5c, 0x20d704c9, 0x83412c85, 0x43a7a844, + 0xe0318008, 0xdffafe9d, 0x7c6cd6d1, 0xa06c03b7, 0x03fa2bfb, + 0x3c31556e, 0x9fa77d22, 0xf2269109, 0x51b0b945, 0x6e7bc7d0, + 0xcdedef9c, 0x11ed3afa, 0xb27b12b6, 0x8db06c23, 0x2e26446f, + 0xeec0c0ae, 0x4d56e8e2, 0x729d9677, 0xd10bbe3b, 0x0d0b6b5d, + 0xae9d4311, 0x91563d84, 0x32c015c8, 0xcbea3247, 0x687c1a0b, + 0x57b7649e, 0xf4214cd2, 0x282199b4, 0x8bb7b1f8, 0xb47ccf6d, + 0x17eae721, 0xd70c63e0, 0x749a4bac, 0x4b513539, 0xe8c71d75, + 0x34c7c813, 0x9751e05f, 0xa89a9eca, 0x0b0cb686, 0x81bfd795, + 0x2229ffd9, 0x1de2814c, 0xbe74a900, 0x62747c66, 0xc1e2542a, + 0xfe292abf, 0x5dbf02f3, 0x9d598632, 0x3ecfae7e, 0x0104d0eb, + 0xa292f8a7, 0x7e922dc1, 0xdd04058d, 0xe2cf7b18, 0x41595354, + 0xb87374db, 0x1be55c97, 0x242e2202, 0x87b80a4e, 0x5bb8df28, + 0xf82ef764, 0xc7e589f1, 0x6473a1bd, 0xa495257c, 0x07030d30, + 0x38c873a5, 0x9b5e5be9, 0x475e8e8f, 0xe4c8a6c3, 0xdb03d856, + 0x7895f01a}, + {0x00000000, 0x2a283862, 0x545070c4, 0x7e7848a6, 0xa8a0e188, + 0x8288d9ea, 0xfcf0914c, 0xd6d8a92e, 0x8a30c551, 0xa018fd33, + 0xde60b595, 0xf4488df7, 0x229024d9, 0x08b81cbb, 0x76c0541d, + 0x5ce86c7f, 0xcf108ce3, 0xe538b481, 0x9b40fc27, 0xb168c445, + 0x67b06d6b, 0x4d985509, 0x33e01daf, 0x19c825cd, 0x452049b2, + 0x6f0871d0, 0x11703976, 0x3b580114, 0xed80a83a, 0xc7a89058, + 0xb9d0d8fe, 0x93f8e09c, 0x45501f87, 0x6f7827e5, 0x11006f43, + 0x3b285721, 0xedf0fe0f, 0xc7d8c66d, 0xb9a08ecb, 0x9388b6a9, + 0xcf60dad6, 0xe548e2b4, 0x9b30aa12, 0xb1189270, 0x67c03b5e, + 0x4de8033c, 0x33904b9a, 0x19b873f8, 0x8a409364, 0xa068ab06, + 0xde10e3a0, 0xf438dbc2, 0x22e072ec, 0x08c84a8e, 0x76b00228, + 0x5c983a4a, 0x00705635, 0x2a586e57, 0x542026f1, 0x7e081e93, + 0xa8d0b7bd, 0x82f88fdf, 0xfc80c779, 0xd6a8ff1b, 0x8aa03f0e, + 0xa088076c, 0xdef04fca, 0xf4d877a8, 0x2200de86, 0x0828e6e4, + 0x7650ae42, 0x5c789620, 0x0090fa5f, 0x2ab8c23d, 0x54c08a9b, + 0x7ee8b2f9, 0xa8301bd7, 0x821823b5, 0xfc606b13, 0xd6485371, + 0x45b0b3ed, 0x6f988b8f, 0x11e0c329, 0x3bc8fb4b, 0xed105265, + 0xc7386a07, 0xb94022a1, 0x93681ac3, 0xcf8076bc, 0xe5a84ede, + 0x9bd00678, 0xb1f83e1a, 0x67209734, 0x4d08af56, 0x3370e7f0, + 0x1958df92, 0xcff02089, 0xe5d818eb, 0x9ba0504d, 0xb188682f, + 0x6750c101, 0x4d78f963, 0x3300b1c5, 0x192889a7, 0x45c0e5d8, + 0x6fe8ddba, 0x1190951c, 0x3bb8ad7e, 0xed600450, 0xc7483c32, + 0xb9307494, 0x93184cf6, 0x00e0ac6a, 0x2ac89408, 0x54b0dcae, + 0x7e98e4cc, 0xa8404de2, 0x82687580, 0xfc103d26, 0xd6380544, + 0x8ad0693b, 0xa0f85159, 0xde8019ff, 0xf4a8219d, 0x227088b3, + 0x0858b0d1, 0x7620f877, 0x5c08c015, 0xce31785d, 0xe419403f, + 0x9a610899, 0xb04930fb, 0x669199d5, 0x4cb9a1b7, 0x32c1e911, + 0x18e9d173, 0x4401bd0c, 0x6e29856e, 0x1051cdc8, 0x3a79f5aa, + 0xeca15c84, 0xc68964e6, 0xb8f12c40, 0x92d91422, 0x0121f4be, + 0x2b09ccdc, 0x5571847a, 0x7f59bc18, 0xa9811536, 0x83a92d54, + 0xfdd165f2, 0xd7f95d90, 0x8b1131ef, 0xa139098d, 0xdf41412b, + 0xf5697949, 0x23b1d067, 0x0999e805, 0x77e1a0a3, 0x5dc998c1, + 0x8b6167da, 0xa1495fb8, 0xdf31171e, 0xf5192f7c, 0x23c18652, + 0x09e9be30, 0x7791f696, 0x5db9cef4, 0x0151a28b, 0x2b799ae9, + 0x5501d24f, 0x7f29ea2d, 0xa9f14303, 0x83d97b61, 0xfda133c7, + 0xd7890ba5, 0x4471eb39, 0x6e59d35b, 0x10219bfd, 0x3a09a39f, + 0xecd10ab1, 0xc6f932d3, 0xb8817a75, 0x92a94217, 0xce412e68, + 0xe469160a, 0x9a115eac, 0xb03966ce, 0x66e1cfe0, 0x4cc9f782, + 0x32b1bf24, 0x18998746, 0x44914753, 0x6eb97f31, 0x10c13797, + 0x3ae90ff5, 0xec31a6db, 0xc6199eb9, 0xb861d61f, 0x9249ee7d, + 0xcea18202, 0xe489ba60, 0x9af1f2c6, 0xb0d9caa4, 0x6601638a, + 0x4c295be8, 0x3251134e, 0x18792b2c, 0x8b81cbb0, 0xa1a9f3d2, + 0xdfd1bb74, 0xf5f98316, 0x23212a38, 0x0909125a, 0x77715afc, + 0x5d59629e, 0x01b10ee1, 0x2b993683, 0x55e17e25, 0x7fc94647, + 0xa911ef69, 0x8339d70b, 0xfd419fad, 0xd769a7cf, 0x01c158d4, + 0x2be960b6, 0x55912810, 0x7fb91072, 0xa961b95c, 0x8349813e, + 0xfd31c998, 0xd719f1fa, 0x8bf19d85, 0xa1d9a5e7, 0xdfa1ed41, + 0xf589d523, 0x23517c0d, 0x0979446f, 0x77010cc9, 0x5d2934ab, + 0xced1d437, 0xe4f9ec55, 0x9a81a4f3, 0xb0a99c91, 0x667135bf, + 0x4c590ddd, 0x3221457b, 0x18097d19, 0x44e11166, 0x6ec92904, + 0x10b161a2, 0x3a9959c0, 0xec41f0ee, 0xc669c88c, 0xb811802a, + 0x9239b848}, + {0x00000000, 0x4713f6fb, 0x8e27edf6, 0xc9341b0d, 0xc73eddad, + 0x802d2b56, 0x4919305b, 0x0e0ac6a0, 0x550cbd1b, 0x121f4be0, + 0xdb2b50ed, 0x9c38a616, 0x923260b6, 0xd521964d, 0x1c158d40, + 0x5b067bbb, 0xaa197a36, 0xed0a8ccd, 0x243e97c0, 0x632d613b, + 0x6d27a79b, 0x2a345160, 0xe3004a6d, 0xa413bc96, 0xff15c72d, + 0xb80631d6, 0x71322adb, 0x3621dc20, 0x382b1a80, 0x7f38ec7b, + 0xb60cf776, 0xf11f018d, 0x8f43f22d, 0xc85004d6, 0x01641fdb, + 0x4677e920, 0x487d2f80, 0x0f6ed97b, 0xc65ac276, 0x8149348d, + 0xda4f4f36, 0x9d5cb9cd, 0x5468a2c0, 0x137b543b, 0x1d71929b, + 0x5a626460, 0x93567f6d, 0xd4458996, 0x255a881b, 0x62497ee0, + 0xab7d65ed, 0xec6e9316, 0xe26455b6, 0xa577a34d, 0x6c43b840, + 0x2b504ebb, 0x70563500, 0x3745c3fb, 0xfe71d8f6, 0xb9622e0d, + 0xb768e8ad, 0xf07b1e56, 0x394f055b, 0x7e5cf3a0, 0xc5f6e21b, + 0x82e514e0, 0x4bd10fed, 0x0cc2f916, 0x02c83fb6, 0x45dbc94d, + 0x8cefd240, 0xcbfc24bb, 0x90fa5f00, 0xd7e9a9fb, 0x1eddb2f6, + 0x59ce440d, 0x57c482ad, 0x10d77456, 0xd9e36f5b, 0x9ef099a0, + 0x6fef982d, 0x28fc6ed6, 0xe1c875db, 0xa6db8320, 0xa8d14580, + 0xefc2b37b, 0x26f6a876, 0x61e55e8d, 0x3ae32536, 0x7df0d3cd, + 0xb4c4c8c0, 0xf3d73e3b, 0xfdddf89b, 0xbace0e60, 0x73fa156d, + 0x34e9e396, 0x4ab51036, 0x0da6e6cd, 0xc492fdc0, 0x83810b3b, + 0x8d8bcd9b, 0xca983b60, 0x03ac206d, 0x44bfd696, 0x1fb9ad2d, + 0x58aa5bd6, 0x919e40db, 0xd68db620, 0xd8877080, 0x9f94867b, + 0x56a09d76, 0x11b36b8d, 0xe0ac6a00, 0xa7bf9cfb, 0x6e8b87f6, + 0x2998710d, 0x2792b7ad, 0x60814156, 0xa9b55a5b, 0xeea6aca0, + 0xb5a0d71b, 0xf2b321e0, 0x3b873aed, 0x7c94cc16, 0x729e0ab6, + 0x358dfc4d, 0xfcb9e740, 0xbbaa11bb, 0x509cc277, 0x178f348c, + 0xdebb2f81, 0x99a8d97a, 0x97a21fda, 0xd0b1e921, 0x1985f22c, + 0x5e9604d7, 0x05907f6c, 0x42838997, 0x8bb7929a, 0xcca46461, + 0xc2aea2c1, 0x85bd543a, 0x4c894f37, 0x0b9ab9cc, 0xfa85b841, + 0xbd964eba, 0x74a255b7, 0x33b1a34c, 0x3dbb65ec, 0x7aa89317, + 0xb39c881a, 0xf48f7ee1, 0xaf89055a, 0xe89af3a1, 0x21aee8ac, + 0x66bd1e57, 0x68b7d8f7, 0x2fa42e0c, 0xe6903501, 0xa183c3fa, + 0xdfdf305a, 0x98ccc6a1, 0x51f8ddac, 0x16eb2b57, 0x18e1edf7, + 0x5ff21b0c, 0x96c60001, 0xd1d5f6fa, 0x8ad38d41, 0xcdc07bba, + 0x04f460b7, 0x43e7964c, 0x4ded50ec, 0x0afea617, 0xc3cabd1a, + 0x84d94be1, 0x75c64a6c, 0x32d5bc97, 0xfbe1a79a, 0xbcf25161, + 0xb2f897c1, 0xf5eb613a, 0x3cdf7a37, 0x7bcc8ccc, 0x20caf777, + 0x67d9018c, 0xaeed1a81, 0xe9feec7a, 0xe7f42ada, 0xa0e7dc21, + 0x69d3c72c, 0x2ec031d7, 0x956a206c, 0xd279d697, 0x1b4dcd9a, + 0x5c5e3b61, 0x5254fdc1, 0x15470b3a, 0xdc731037, 0x9b60e6cc, + 0xc0669d77, 0x87756b8c, 0x4e417081, 0x0952867a, 0x075840da, + 0x404bb621, 0x897fad2c, 0xce6c5bd7, 0x3f735a5a, 0x7860aca1, + 0xb154b7ac, 0xf6474157, 0xf84d87f7, 0xbf5e710c, 0x766a6a01, + 0x31799cfa, 0x6a7fe741, 0x2d6c11ba, 0xe4580ab7, 0xa34bfc4c, + 0xad413aec, 0xea52cc17, 0x2366d71a, 0x647521e1, 0x1a29d241, + 0x5d3a24ba, 0x940e3fb7, 0xd31dc94c, 0xdd170fec, 0x9a04f917, + 0x5330e21a, 0x142314e1, 0x4f256f5a, 0x083699a1, 0xc10282ac, + 0x86117457, 0x881bb2f7, 0xcf08440c, 0x063c5f01, 0x412fa9fa, + 0xb030a877, 0xf7235e8c, 0x3e174581, 0x7904b37a, 0x770e75da, + 0x301d8321, 0xf929982c, 0xbe3a6ed7, 0xe53c156c, 0xa22fe397, + 0x6b1bf89a, 0x2c080e61, 0x2202c8c1, 0x65113e3a, 0xac252537, + 0xeb36d3cc}, + {0x00000000, 0xa13984ee, 0x99020f9d, 0x383b8b73, 0xe975197b, + 0x484c9d95, 0x707716e6, 0xd14e9208, 0x099b34b7, 0xa8a2b059, + 0x90993b2a, 0x31a0bfc4, 0xe0ee2dcc, 0x41d7a922, 0x79ec2251, + 0xd8d5a6bf, 0x1336696e, 0xb20fed80, 0x8a3466f3, 0x2b0de21d, + 0xfa437015, 0x5b7af4fb, 0x63417f88, 0xc278fb66, 0x1aad5dd9, + 0xbb94d937, 0x83af5244, 0x2296d6aa, 0xf3d844a2, 0x52e1c04c, + 0x6ada4b3f, 0xcbe3cfd1, 0x266cd2dc, 0x87555632, 0xbf6edd41, + 0x1e5759af, 0xcf19cba7, 0x6e204f49, 0x561bc43a, 0xf72240d4, + 0x2ff7e66b, 0x8ece6285, 0xb6f5e9f6, 0x17cc6d18, 0xc682ff10, + 0x67bb7bfe, 0x5f80f08d, 0xfeb97463, 0x355abbb2, 0x94633f5c, + 0xac58b42f, 0x0d6130c1, 0xdc2fa2c9, 0x7d162627, 0x452dad54, + 0xe41429ba, 0x3cc18f05, 0x9df80beb, 0xa5c38098, 0x04fa0476, + 0xd5b4967e, 0x748d1290, 0x4cb699e3, 0xed8f1d0d, 0x4cd9a5b8, + 0xede02156, 0xd5dbaa25, 0x74e22ecb, 0xa5acbcc3, 0x0495382d, + 0x3caeb35e, 0x9d9737b0, 0x4542910f, 0xe47b15e1, 0xdc409e92, + 0x7d791a7c, 0xac378874, 0x0d0e0c9a, 0x353587e9, 0x940c0307, + 0x5fefccd6, 0xfed64838, 0xc6edc34b, 0x67d447a5, 0xb69ad5ad, + 0x17a35143, 0x2f98da30, 0x8ea15ede, 0x5674f861, 0xf74d7c8f, + 0xcf76f7fc, 0x6e4f7312, 0xbf01e11a, 0x1e3865f4, 0x2603ee87, + 0x873a6a69, 0x6ab57764, 0xcb8cf38a, 0xf3b778f9, 0x528efc17, + 0x83c06e1f, 0x22f9eaf1, 0x1ac26182, 0xbbfbe56c, 0x632e43d3, + 0xc217c73d, 0xfa2c4c4e, 0x5b15c8a0, 0x8a5b5aa8, 0x2b62de46, + 0x13595535, 0xb260d1db, 0x79831e0a, 0xd8ba9ae4, 0xe0811197, + 0x41b89579, 0x90f60771, 0x31cf839f, 0x09f408ec, 0xa8cd8c02, + 0x70182abd, 0xd121ae53, 0xe91a2520, 0x4823a1ce, 0x996d33c6, + 0x3854b728, 0x006f3c5b, 0xa156b8b5, 0x99b34b70, 0x388acf9e, + 0x00b144ed, 0xa188c003, 0x70c6520b, 0xd1ffd6e5, 0xe9c45d96, + 0x48fdd978, 0x90287fc7, 0x3111fb29, 0x092a705a, 0xa813f4b4, + 0x795d66bc, 0xd864e252, 0xe05f6921, 0x4166edcf, 0x8a85221e, + 0x2bbca6f0, 0x13872d83, 0xb2bea96d, 0x63f03b65, 0xc2c9bf8b, + 0xfaf234f8, 0x5bcbb016, 0x831e16a9, 0x22279247, 0x1a1c1934, + 0xbb259dda, 0x6a6b0fd2, 0xcb528b3c, 0xf369004f, 0x525084a1, + 0xbfdf99ac, 0x1ee61d42, 0x26dd9631, 0x87e412df, 0x56aa80d7, + 0xf7930439, 0xcfa88f4a, 0x6e910ba4, 0xb644ad1b, 0x177d29f5, + 0x2f46a286, 0x8e7f2668, 0x5f31b460, 0xfe08308e, 0xc633bbfd, + 0x670a3f13, 0xace9f0c2, 0x0dd0742c, 0x35ebff5f, 0x94d27bb1, + 0x459ce9b9, 0xe4a56d57, 0xdc9ee624, 0x7da762ca, 0xa572c475, + 0x044b409b, 0x3c70cbe8, 0x9d494f06, 0x4c07dd0e, 0xed3e59e0, + 0xd505d293, 0x743c567d, 0xd56aeec8, 0x74536a26, 0x4c68e155, + 0xed5165bb, 0x3c1ff7b3, 0x9d26735d, 0xa51df82e, 0x04247cc0, + 0xdcf1da7f, 0x7dc85e91, 0x45f3d5e2, 0xe4ca510c, 0x3584c304, + 0x94bd47ea, 0xac86cc99, 0x0dbf4877, 0xc65c87a6, 0x67650348, + 0x5f5e883b, 0xfe670cd5, 0x2f299edd, 0x8e101a33, 0xb62b9140, + 0x171215ae, 0xcfc7b311, 0x6efe37ff, 0x56c5bc8c, 0xf7fc3862, + 0x26b2aa6a, 0x878b2e84, 0xbfb0a5f7, 0x1e892119, 0xf3063c14, + 0x523fb8fa, 0x6a043389, 0xcb3db767, 0x1a73256f, 0xbb4aa181, + 0x83712af2, 0x2248ae1c, 0xfa9d08a3, 0x5ba48c4d, 0x639f073e, + 0xc2a683d0, 0x13e811d8, 0xb2d19536, 0x8aea1e45, 0x2bd39aab, + 0xe030557a, 0x4109d194, 0x79325ae7, 0xd80bde09, 0x09454c01, + 0xa87cc8ef, 0x9047439c, 0x317ec772, 0xe9ab61cd, 0x4892e523, + 0x70a96e50, 0xd190eabe, 0x00de78b6, 0xa1e7fc58, 0x99dc772b, + 0x38e5f3c5}, + {0x00000000, 0xe81790a1, 0x0b5e2703, 0xe349b7a2, 0x16bc4e06, + 0xfeabdea7, 0x1de26905, 0xf5f5f9a4, 0x2d789c0c, 0xc56f0cad, + 0x2626bb0f, 0xce312bae, 0x3bc4d20a, 0xd3d342ab, 0x309af509, + 0xd88d65a8, 0x5af13818, 0xb2e6a8b9, 0x51af1f1b, 0xb9b88fba, + 0x4c4d761e, 0xa45ae6bf, 0x4713511d, 0xaf04c1bc, 0x7789a414, + 0x9f9e34b5, 0x7cd78317, 0x94c013b6, 0x6135ea12, 0x89227ab3, + 0x6a6bcd11, 0x827c5db0, 0xb5e27030, 0x5df5e091, 0xbebc5733, + 0x56abc792, 0xa35e3e36, 0x4b49ae97, 0xa8001935, 0x40178994, + 0x989aec3c, 0x708d7c9d, 0x93c4cb3f, 0x7bd35b9e, 0x8e26a23a, + 0x6631329b, 0x85788539, 0x6d6f1598, 0xef134828, 0x0704d889, + 0xe44d6f2b, 0x0c5aff8a, 0xf9af062e, 0x11b8968f, 0xf2f1212d, + 0x1ae6b18c, 0xc26bd424, 0x2a7c4485, 0xc935f327, 0x21226386, + 0xd4d79a22, 0x3cc00a83, 0xdf89bd21, 0x379e2d80, 0xb0b5e621, + 0x58a27680, 0xbbebc122, 0x53fc5183, 0xa609a827, 0x4e1e3886, + 0xad578f24, 0x45401f85, 0x9dcd7a2d, 0x75daea8c, 0x96935d2e, + 0x7e84cd8f, 0x8b71342b, 0x6366a48a, 0x802f1328, 0x68388389, + 0xea44de39, 0x02534e98, 0xe11af93a, 0x090d699b, 0xfcf8903f, + 0x14ef009e, 0xf7a6b73c, 0x1fb1279d, 0xc73c4235, 0x2f2bd294, + 0xcc626536, 0x2475f597, 0xd1800c33, 0x39979c92, 0xdade2b30, + 0x32c9bb91, 0x05579611, 0xed4006b0, 0x0e09b112, 0xe61e21b3, + 0x13ebd817, 0xfbfc48b6, 0x18b5ff14, 0xf0a26fb5, 0x282f0a1d, + 0xc0389abc, 0x23712d1e, 0xcb66bdbf, 0x3e93441b, 0xd684d4ba, + 0x35cd6318, 0xdddaf3b9, 0x5fa6ae09, 0xb7b13ea8, 0x54f8890a, + 0xbcef19ab, 0x491ae00f, 0xa10d70ae, 0x4244c70c, 0xaa5357ad, + 0x72de3205, 0x9ac9a2a4, 0x79801506, 0x919785a7, 0x64627c03, + 0x8c75eca2, 0x6f3c5b00, 0x872bcba1, 0xba1aca03, 0x520d5aa2, + 0xb144ed00, 0x59537da1, 0xaca68405, 0x44b114a4, 0xa7f8a306, + 0x4fef33a7, 0x9762560f, 0x7f75c6ae, 0x9c3c710c, 0x742be1ad, + 0x81de1809, 0x69c988a8, 0x8a803f0a, 0x6297afab, 0xe0ebf21b, + 0x08fc62ba, 0xebb5d518, 0x03a245b9, 0xf657bc1d, 0x1e402cbc, + 0xfd099b1e, 0x151e0bbf, 0xcd936e17, 0x2584feb6, 0xc6cd4914, + 0x2edad9b5, 0xdb2f2011, 0x3338b0b0, 0xd0710712, 0x386697b3, + 0x0ff8ba33, 0xe7ef2a92, 0x04a69d30, 0xecb10d91, 0x1944f435, + 0xf1536494, 0x121ad336, 0xfa0d4397, 0x2280263f, 0xca97b69e, + 0x29de013c, 0xc1c9919d, 0x343c6839, 0xdc2bf898, 0x3f624f3a, + 0xd775df9b, 0x5509822b, 0xbd1e128a, 0x5e57a528, 0xb6403589, + 0x43b5cc2d, 0xaba25c8c, 0x48ebeb2e, 0xa0fc7b8f, 0x78711e27, + 0x90668e86, 0x732f3924, 0x9b38a985, 0x6ecd5021, 0x86dac080, + 0x65937722, 0x8d84e783, 0x0aaf2c22, 0xe2b8bc83, 0x01f10b21, + 0xe9e69b80, 0x1c136224, 0xf404f285, 0x174d4527, 0xff5ad586, + 0x27d7b02e, 0xcfc0208f, 0x2c89972d, 0xc49e078c, 0x316bfe28, + 0xd97c6e89, 0x3a35d92b, 0xd222498a, 0x505e143a, 0xb849849b, + 0x5b003339, 0xb317a398, 0x46e25a3c, 0xaef5ca9d, 0x4dbc7d3f, + 0xa5abed9e, 0x7d268836, 0x95311897, 0x7678af35, 0x9e6f3f94, + 0x6b9ac630, 0x838d5691, 0x60c4e133, 0x88d37192, 0xbf4d5c12, + 0x575accb3, 0xb4137b11, 0x5c04ebb0, 0xa9f11214, 0x41e682b5, + 0xa2af3517, 0x4ab8a5b6, 0x9235c01e, 0x7a2250bf, 0x996be71d, + 0x717c77bc, 0x84898e18, 0x6c9e1eb9, 0x8fd7a91b, 0x67c039ba, + 0xe5bc640a, 0x0dabf4ab, 0xeee24309, 0x06f5d3a8, 0xf3002a0c, + 0x1b17baad, 0xf85e0d0f, 0x10499dae, 0xc8c4f806, 0x20d368a7, + 0xc39adf05, 0x2b8d4fa4, 0xde78b600, 0x366f26a1, 0xd5269103, + 0x3d3101a2}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xa19017e800000000, 0x03275e0b00000000, + 0xa2b749e300000000, 0x064ebc1600000000, 0xa7deabfe00000000, + 0x0569e21d00000000, 0xa4f9f5f500000000, 0x0c9c782d00000000, + 0xad0c6fc500000000, 0x0fbb262600000000, 0xae2b31ce00000000, + 0x0ad2c43b00000000, 0xab42d3d300000000, 0x09f59a3000000000, + 0xa8658dd800000000, 0x1838f15a00000000, 0xb9a8e6b200000000, + 0x1b1faf5100000000, 0xba8fb8b900000000, 0x1e764d4c00000000, + 0xbfe65aa400000000, 0x1d51134700000000, 0xbcc104af00000000, + 0x14a4897700000000, 0xb5349e9f00000000, 0x1783d77c00000000, + 0xb613c09400000000, 0x12ea356100000000, 0xb37a228900000000, + 0x11cd6b6a00000000, 0xb05d7c8200000000, 0x3070e2b500000000, + 0x91e0f55d00000000, 0x3357bcbe00000000, 0x92c7ab5600000000, + 0x363e5ea300000000, 0x97ae494b00000000, 0x351900a800000000, + 0x9489174000000000, 0x3cec9a9800000000, 0x9d7c8d7000000000, + 0x3fcbc49300000000, 0x9e5bd37b00000000, 0x3aa2268e00000000, + 0x9b32316600000000, 0x3985788500000000, 0x98156f6d00000000, + 0x284813ef00000000, 0x89d8040700000000, 0x2b6f4de400000000, + 0x8aff5a0c00000000, 0x2e06aff900000000, 0x8f96b81100000000, + 0x2d21f1f200000000, 0x8cb1e61a00000000, 0x24d46bc200000000, + 0x85447c2a00000000, 0x27f335c900000000, 0x8663222100000000, + 0x229ad7d400000000, 0x830ac03c00000000, 0x21bd89df00000000, + 0x802d9e3700000000, 0x21e6b5b000000000, 0x8076a25800000000, + 0x22c1ebbb00000000, 0x8351fc5300000000, 0x27a809a600000000, + 0x86381e4e00000000, 0x248f57ad00000000, 0x851f404500000000, + 0x2d7acd9d00000000, 0x8ceada7500000000, 0x2e5d939600000000, + 0x8fcd847e00000000, 0x2b34718b00000000, 0x8aa4666300000000, + 0x28132f8000000000, 0x8983386800000000, 0x39de44ea00000000, + 0x984e530200000000, 0x3af91ae100000000, 0x9b690d0900000000, + 0x3f90f8fc00000000, 0x9e00ef1400000000, 0x3cb7a6f700000000, + 0x9d27b11f00000000, 0x35423cc700000000, 0x94d22b2f00000000, + 0x366562cc00000000, 0x97f5752400000000, 0x330c80d100000000, + 0x929c973900000000, 0x302bdeda00000000, 0x91bbc93200000000, + 0x1196570500000000, 0xb00640ed00000000, 0x12b1090e00000000, + 0xb3211ee600000000, 0x17d8eb1300000000, 0xb648fcfb00000000, + 0x14ffb51800000000, 0xb56fa2f000000000, 0x1d0a2f2800000000, + 0xbc9a38c000000000, 0x1e2d712300000000, 0xbfbd66cb00000000, + 0x1b44933e00000000, 0xbad484d600000000, 0x1863cd3500000000, + 0xb9f3dadd00000000, 0x09aea65f00000000, 0xa83eb1b700000000, + 0x0a89f85400000000, 0xab19efbc00000000, 0x0fe01a4900000000, + 0xae700da100000000, 0x0cc7444200000000, 0xad5753aa00000000, + 0x0532de7200000000, 0xa4a2c99a00000000, 0x0615807900000000, + 0xa785979100000000, 0x037c626400000000, 0xa2ec758c00000000, + 0x005b3c6f00000000, 0xa1cb2b8700000000, 0x03ca1aba00000000, + 0xa25a0d5200000000, 0x00ed44b100000000, 0xa17d535900000000, + 0x0584a6ac00000000, 0xa414b14400000000, 0x06a3f8a700000000, + 0xa733ef4f00000000, 0x0f56629700000000, 0xaec6757f00000000, + 0x0c713c9c00000000, 0xade12b7400000000, 0x0918de8100000000, + 0xa888c96900000000, 0x0a3f808a00000000, 0xabaf976200000000, + 0x1bf2ebe000000000, 0xba62fc0800000000, 0x18d5b5eb00000000, + 0xb945a20300000000, 0x1dbc57f600000000, 0xbc2c401e00000000, + 0x1e9b09fd00000000, 0xbf0b1e1500000000, 0x176e93cd00000000, + 0xb6fe842500000000, 0x1449cdc600000000, 0xb5d9da2e00000000, + 0x11202fdb00000000, 0xb0b0383300000000, 0x120771d000000000, + 0xb397663800000000, 0x33baf80f00000000, 0x922aefe700000000, + 0x309da60400000000, 0x910db1ec00000000, 0x35f4441900000000, + 0x946453f100000000, 0x36d31a1200000000, 0x97430dfa00000000, + 0x3f26802200000000, 0x9eb697ca00000000, 0x3c01de2900000000, + 0x9d91c9c100000000, 0x39683c3400000000, 0x98f82bdc00000000, + 0x3a4f623f00000000, 0x9bdf75d700000000, 0x2b82095500000000, + 0x8a121ebd00000000, 0x28a5575e00000000, 0x893540b600000000, + 0x2dccb54300000000, 0x8c5ca2ab00000000, 0x2eebeb4800000000, + 0x8f7bfca000000000, 0x271e717800000000, 0x868e669000000000, + 0x24392f7300000000, 0x85a9389b00000000, 0x2150cd6e00000000, + 0x80c0da8600000000, 0x2277936500000000, 0x83e7848d00000000, + 0x222caf0a00000000, 0x83bcb8e200000000, 0x210bf10100000000, + 0x809be6e900000000, 0x2462131c00000000, 0x85f204f400000000, + 0x27454d1700000000, 0x86d55aff00000000, 0x2eb0d72700000000, + 0x8f20c0cf00000000, 0x2d97892c00000000, 0x8c079ec400000000, + 0x28fe6b3100000000, 0x896e7cd900000000, 0x2bd9353a00000000, + 0x8a4922d200000000, 0x3a145e5000000000, 0x9b8449b800000000, + 0x3933005b00000000, 0x98a317b300000000, 0x3c5ae24600000000, + 0x9dcaf5ae00000000, 0x3f7dbc4d00000000, 0x9eedaba500000000, + 0x3688267d00000000, 0x9718319500000000, 0x35af787600000000, + 0x943f6f9e00000000, 0x30c69a6b00000000, 0x91568d8300000000, + 0x33e1c46000000000, 0x9271d38800000000, 0x125c4dbf00000000, + 0xb3cc5a5700000000, 0x117b13b400000000, 0xb0eb045c00000000, + 0x1412f1a900000000, 0xb582e64100000000, 0x1735afa200000000, + 0xb6a5b84a00000000, 0x1ec0359200000000, 0xbf50227a00000000, + 0x1de76b9900000000, 0xbc777c7100000000, 0x188e898400000000, + 0xb91e9e6c00000000, 0x1ba9d78f00000000, 0xba39c06700000000, + 0x0a64bce500000000, 0xabf4ab0d00000000, 0x0943e2ee00000000, + 0xa8d3f50600000000, 0x0c2a00f300000000, 0xadba171b00000000, + 0x0f0d5ef800000000, 0xae9d491000000000, 0x06f8c4c800000000, + 0xa768d32000000000, 0x05df9ac300000000, 0xa44f8d2b00000000, + 0x00b678de00000000, 0xa1266f3600000000, 0x039126d500000000, + 0xa201313d00000000}, + {0x0000000000000000, 0xee8439a100000000, 0x9d0f029900000000, + 0x738b3b3800000000, 0x7b1975e900000000, 0x959d4c4800000000, + 0xe616777000000000, 0x08924ed100000000, 0xb7349b0900000000, + 0x59b0a2a800000000, 0x2a3b999000000000, 0xc4bfa03100000000, + 0xcc2deee000000000, 0x22a9d74100000000, 0x5122ec7900000000, + 0xbfa6d5d800000000, 0x6e69361300000000, 0x80ed0fb200000000, + 0xf366348a00000000, 0x1de20d2b00000000, 0x157043fa00000000, + 0xfbf47a5b00000000, 0x887f416300000000, 0x66fb78c200000000, + 0xd95dad1a00000000, 0x37d994bb00000000, 0x4452af8300000000, + 0xaad6962200000000, 0xa244d8f300000000, 0x4cc0e15200000000, + 0x3f4bda6a00000000, 0xd1cfe3cb00000000, 0xdcd26c2600000000, + 0x3256558700000000, 0x41dd6ebf00000000, 0xaf59571e00000000, + 0xa7cb19cf00000000, 0x494f206e00000000, 0x3ac41b5600000000, + 0xd44022f700000000, 0x6be6f72f00000000, 0x8562ce8e00000000, + 0xf6e9f5b600000000, 0x186dcc1700000000, 0x10ff82c600000000, + 0xfe7bbb6700000000, 0x8df0805f00000000, 0x6374b9fe00000000, + 0xb2bb5a3500000000, 0x5c3f639400000000, 0x2fb458ac00000000, + 0xc130610d00000000, 0xc9a22fdc00000000, 0x2726167d00000000, + 0x54ad2d4500000000, 0xba2914e400000000, 0x058fc13c00000000, + 0xeb0bf89d00000000, 0x9880c3a500000000, 0x7604fa0400000000, + 0x7e96b4d500000000, 0x90128d7400000000, 0xe399b64c00000000, + 0x0d1d8fed00000000, 0xb8a5d94c00000000, 0x5621e0ed00000000, + 0x25aadbd500000000, 0xcb2ee27400000000, 0xc3bcaca500000000, + 0x2d38950400000000, 0x5eb3ae3c00000000, 0xb037979d00000000, + 0x0f91424500000000, 0xe1157be400000000, 0x929e40dc00000000, + 0x7c1a797d00000000, 0x748837ac00000000, 0x9a0c0e0d00000000, + 0xe987353500000000, 0x07030c9400000000, 0xd6ccef5f00000000, + 0x3848d6fe00000000, 0x4bc3edc600000000, 0xa547d46700000000, + 0xadd59ab600000000, 0x4351a31700000000, 0x30da982f00000000, + 0xde5ea18e00000000, 0x61f8745600000000, 0x8f7c4df700000000, + 0xfcf776cf00000000, 0x12734f6e00000000, 0x1ae101bf00000000, + 0xf465381e00000000, 0x87ee032600000000, 0x696a3a8700000000, + 0x6477b56a00000000, 0x8af38ccb00000000, 0xf978b7f300000000, + 0x17fc8e5200000000, 0x1f6ec08300000000, 0xf1eaf92200000000, + 0x8261c21a00000000, 0x6ce5fbbb00000000, 0xd3432e6300000000, + 0x3dc717c200000000, 0x4e4c2cfa00000000, 0xa0c8155b00000000, + 0xa85a5b8a00000000, 0x46de622b00000000, 0x3555591300000000, + 0xdbd160b200000000, 0x0a1e837900000000, 0xe49abad800000000, + 0x971181e000000000, 0x7995b84100000000, 0x7107f69000000000, + 0x9f83cf3100000000, 0xec08f40900000000, 0x028ccda800000000, + 0xbd2a187000000000, 0x53ae21d100000000, 0x20251ae900000000, + 0xcea1234800000000, 0xc6336d9900000000, 0x28b7543800000000, + 0x5b3c6f0000000000, 0xb5b856a100000000, 0x704bb39900000000, + 0x9ecf8a3800000000, 0xed44b10000000000, 0x03c088a100000000, + 0x0b52c67000000000, 0xe5d6ffd100000000, 0x965dc4e900000000, + 0x78d9fd4800000000, 0xc77f289000000000, 0x29fb113100000000, + 0x5a702a0900000000, 0xb4f413a800000000, 0xbc665d7900000000, + 0x52e264d800000000, 0x21695fe000000000, 0xcfed664100000000, + 0x1e22858a00000000, 0xf0a6bc2b00000000, 0x832d871300000000, + 0x6da9beb200000000, 0x653bf06300000000, 0x8bbfc9c200000000, + 0xf834f2fa00000000, 0x16b0cb5b00000000, 0xa9161e8300000000, + 0x4792272200000000, 0x34191c1a00000000, 0xda9d25bb00000000, + 0xd20f6b6a00000000, 0x3c8b52cb00000000, 0x4f0069f300000000, + 0xa184505200000000, 0xac99dfbf00000000, 0x421de61e00000000, + 0x3196dd2600000000, 0xdf12e48700000000, 0xd780aa5600000000, + 0x390493f700000000, 0x4a8fa8cf00000000, 0xa40b916e00000000, + 0x1bad44b600000000, 0xf5297d1700000000, 0x86a2462f00000000, + 0x68267f8e00000000, 0x60b4315f00000000, 0x8e3008fe00000000, + 0xfdbb33c600000000, 0x133f0a6700000000, 0xc2f0e9ac00000000, + 0x2c74d00d00000000, 0x5fffeb3500000000, 0xb17bd29400000000, + 0xb9e99c4500000000, 0x576da5e400000000, 0x24e69edc00000000, + 0xca62a77d00000000, 0x75c472a500000000, 0x9b404b0400000000, + 0xe8cb703c00000000, 0x064f499d00000000, 0x0edd074c00000000, + 0xe0593eed00000000, 0x93d205d500000000, 0x7d563c7400000000, + 0xc8ee6ad500000000, 0x266a537400000000, 0x55e1684c00000000, + 0xbb6551ed00000000, 0xb3f71f3c00000000, 0x5d73269d00000000, + 0x2ef81da500000000, 0xc07c240400000000, 0x7fdaf1dc00000000, + 0x915ec87d00000000, 0xe2d5f34500000000, 0x0c51cae400000000, + 0x04c3843500000000, 0xea47bd9400000000, 0x99cc86ac00000000, + 0x7748bf0d00000000, 0xa6875cc600000000, 0x4803656700000000, + 0x3b885e5f00000000, 0xd50c67fe00000000, 0xdd9e292f00000000, + 0x331a108e00000000, 0x40912bb600000000, 0xae15121700000000, + 0x11b3c7cf00000000, 0xff37fe6e00000000, 0x8cbcc55600000000, + 0x6238fcf700000000, 0x6aaab22600000000, 0x842e8b8700000000, + 0xf7a5b0bf00000000, 0x1921891e00000000, 0x143c06f300000000, + 0xfab83f5200000000, 0x8933046a00000000, 0x67b73dcb00000000, + 0x6f25731a00000000, 0x81a14abb00000000, 0xf22a718300000000, + 0x1cae482200000000, 0xa3089dfa00000000, 0x4d8ca45b00000000, + 0x3e079f6300000000, 0xd083a6c200000000, 0xd811e81300000000, + 0x3695d1b200000000, 0x451eea8a00000000, 0xab9ad32b00000000, + 0x7a5530e000000000, 0x94d1094100000000, 0xe75a327900000000, + 0x09de0bd800000000, 0x014c450900000000, 0xefc87ca800000000, + 0x9c43479000000000, 0x72c77e3100000000, 0xcd61abe900000000, + 0x23e5924800000000, 0x506ea97000000000, 0xbeea90d100000000, + 0xb678de0000000000, 0x58fce7a100000000, 0x2b77dc9900000000, + 0xc5f3e53800000000}, + {0x0000000000000000, 0xfbf6134700000000, 0xf6ed278e00000000, + 0x0d1b34c900000000, 0xaddd3ec700000000, 0x562b2d8000000000, + 0x5b30194900000000, 0xa0c60a0e00000000, 0x1bbd0c5500000000, + 0xe04b1f1200000000, 0xed502bdb00000000, 0x16a6389c00000000, + 0xb660329200000000, 0x4d9621d500000000, 0x408d151c00000000, + 0xbb7b065b00000000, 0x367a19aa00000000, 0xcd8c0aed00000000, + 0xc0973e2400000000, 0x3b612d6300000000, 0x9ba7276d00000000, + 0x6051342a00000000, 0x6d4a00e300000000, 0x96bc13a400000000, + 0x2dc715ff00000000, 0xd63106b800000000, 0xdb2a327100000000, + 0x20dc213600000000, 0x801a2b3800000000, 0x7bec387f00000000, + 0x76f70cb600000000, 0x8d011ff100000000, 0x2df2438f00000000, + 0xd60450c800000000, 0xdb1f640100000000, 0x20e9774600000000, + 0x802f7d4800000000, 0x7bd96e0f00000000, 0x76c25ac600000000, + 0x8d34498100000000, 0x364f4fda00000000, 0xcdb95c9d00000000, + 0xc0a2685400000000, 0x3b547b1300000000, 0x9b92711d00000000, + 0x6064625a00000000, 0x6d7f569300000000, 0x968945d400000000, + 0x1b885a2500000000, 0xe07e496200000000, 0xed657dab00000000, + 0x16936eec00000000, 0xb65564e200000000, 0x4da377a500000000, + 0x40b8436c00000000, 0xbb4e502b00000000, 0x0035567000000000, + 0xfbc3453700000000, 0xf6d871fe00000000, 0x0d2e62b900000000, + 0xade868b700000000, 0x561e7bf000000000, 0x5b054f3900000000, + 0xa0f35c7e00000000, 0x1be2f6c500000000, 0xe014e58200000000, + 0xed0fd14b00000000, 0x16f9c20c00000000, 0xb63fc80200000000, + 0x4dc9db4500000000, 0x40d2ef8c00000000, 0xbb24fccb00000000, + 0x005ffa9000000000, 0xfba9e9d700000000, 0xf6b2dd1e00000000, + 0x0d44ce5900000000, 0xad82c45700000000, 0x5674d71000000000, + 0x5b6fe3d900000000, 0xa099f09e00000000, 0x2d98ef6f00000000, + 0xd66efc2800000000, 0xdb75c8e100000000, 0x2083dba600000000, + 0x8045d1a800000000, 0x7bb3c2ef00000000, 0x76a8f62600000000, + 0x8d5ee56100000000, 0x3625e33a00000000, 0xcdd3f07d00000000, + 0xc0c8c4b400000000, 0x3b3ed7f300000000, 0x9bf8ddfd00000000, + 0x600eceba00000000, 0x6d15fa7300000000, 0x96e3e93400000000, + 0x3610b54a00000000, 0xcde6a60d00000000, 0xc0fd92c400000000, + 0x3b0b818300000000, 0x9bcd8b8d00000000, 0x603b98ca00000000, + 0x6d20ac0300000000, 0x96d6bf4400000000, 0x2dadb91f00000000, + 0xd65baa5800000000, 0xdb409e9100000000, 0x20b68dd600000000, + 0x807087d800000000, 0x7b86949f00000000, 0x769da05600000000, + 0x8d6bb31100000000, 0x006aace000000000, 0xfb9cbfa700000000, + 0xf6878b6e00000000, 0x0d71982900000000, 0xadb7922700000000, + 0x5641816000000000, 0x5b5ab5a900000000, 0xa0aca6ee00000000, + 0x1bd7a0b500000000, 0xe021b3f200000000, 0xed3a873b00000000, + 0x16cc947c00000000, 0xb60a9e7200000000, 0x4dfc8d3500000000, + 0x40e7b9fc00000000, 0xbb11aabb00000000, 0x77c29c5000000000, + 0x8c348f1700000000, 0x812fbbde00000000, 0x7ad9a89900000000, + 0xda1fa29700000000, 0x21e9b1d000000000, 0x2cf2851900000000, + 0xd704965e00000000, 0x6c7f900500000000, 0x9789834200000000, + 0x9a92b78b00000000, 0x6164a4cc00000000, 0xc1a2aec200000000, + 0x3a54bd8500000000, 0x374f894c00000000, 0xccb99a0b00000000, + 0x41b885fa00000000, 0xba4e96bd00000000, 0xb755a27400000000, + 0x4ca3b13300000000, 0xec65bb3d00000000, 0x1793a87a00000000, + 0x1a889cb300000000, 0xe17e8ff400000000, 0x5a0589af00000000, + 0xa1f39ae800000000, 0xace8ae2100000000, 0x571ebd6600000000, + 0xf7d8b76800000000, 0x0c2ea42f00000000, 0x013590e600000000, + 0xfac383a100000000, 0x5a30dfdf00000000, 0xa1c6cc9800000000, + 0xacddf85100000000, 0x572beb1600000000, 0xf7ede11800000000, + 0x0c1bf25f00000000, 0x0100c69600000000, 0xfaf6d5d100000000, + 0x418dd38a00000000, 0xba7bc0cd00000000, 0xb760f40400000000, + 0x4c96e74300000000, 0xec50ed4d00000000, 0x17a6fe0a00000000, + 0x1abdcac300000000, 0xe14bd98400000000, 0x6c4ac67500000000, + 0x97bcd53200000000, 0x9aa7e1fb00000000, 0x6151f2bc00000000, + 0xc197f8b200000000, 0x3a61ebf500000000, 0x377adf3c00000000, + 0xcc8ccc7b00000000, 0x77f7ca2000000000, 0x8c01d96700000000, + 0x811aedae00000000, 0x7aecfee900000000, 0xda2af4e700000000, + 0x21dce7a000000000, 0x2cc7d36900000000, 0xd731c02e00000000, + 0x6c206a9500000000, 0x97d679d200000000, 0x9acd4d1b00000000, + 0x613b5e5c00000000, 0xc1fd545200000000, 0x3a0b471500000000, + 0x371073dc00000000, 0xcce6609b00000000, 0x779d66c000000000, + 0x8c6b758700000000, 0x8170414e00000000, 0x7a86520900000000, + 0xda40580700000000, 0x21b64b4000000000, 0x2cad7f8900000000, + 0xd75b6cce00000000, 0x5a5a733f00000000, 0xa1ac607800000000, + 0xacb754b100000000, 0x574147f600000000, 0xf7874df800000000, + 0x0c715ebf00000000, 0x016a6a7600000000, 0xfa9c793100000000, + 0x41e77f6a00000000, 0xba116c2d00000000, 0xb70a58e400000000, + 0x4cfc4ba300000000, 0xec3a41ad00000000, 0x17cc52ea00000000, + 0x1ad7662300000000, 0xe121756400000000, 0x41d2291a00000000, + 0xba243a5d00000000, 0xb73f0e9400000000, 0x4cc91dd300000000, + 0xec0f17dd00000000, 0x17f9049a00000000, 0x1ae2305300000000, + 0xe114231400000000, 0x5a6f254f00000000, 0xa199360800000000, + 0xac8202c100000000, 0x5774118600000000, 0xf7b21b8800000000, + 0x0c4408cf00000000, 0x015f3c0600000000, 0xfaa92f4100000000, + 0x77a830b000000000, 0x8c5e23f700000000, 0x8145173e00000000, + 0x7ab3047900000000, 0xda750e7700000000, 0x21831d3000000000, + 0x2c9829f900000000, 0xd76e3abe00000000, 0x6c153ce500000000, + 0x97e32fa200000000, 0x9af81b6b00000000, 0x610e082c00000000, + 0xc1c8022200000000, 0x3a3e116500000000, 0x372525ac00000000, + 0xccd336eb00000000}, + {0x0000000000000000, 0x6238282a00000000, 0xc470505400000000, + 0xa648787e00000000, 0x88e1a0a800000000, 0xead9888200000000, + 0x4c91f0fc00000000, 0x2ea9d8d600000000, 0x51c5308a00000000, + 0x33fd18a000000000, 0x95b560de00000000, 0xf78d48f400000000, + 0xd924902200000000, 0xbb1cb80800000000, 0x1d54c07600000000, + 0x7f6ce85c00000000, 0xe38c10cf00000000, 0x81b438e500000000, + 0x27fc409b00000000, 0x45c468b100000000, 0x6b6db06700000000, + 0x0955984d00000000, 0xaf1de03300000000, 0xcd25c81900000000, + 0xb249204500000000, 0xd071086f00000000, 0x7639701100000000, + 0x1401583b00000000, 0x3aa880ed00000000, 0x5890a8c700000000, + 0xfed8d0b900000000, 0x9ce0f89300000000, 0x871f504500000000, + 0xe527786f00000000, 0x436f001100000000, 0x2157283b00000000, + 0x0ffef0ed00000000, 0x6dc6d8c700000000, 0xcb8ea0b900000000, + 0xa9b6889300000000, 0xd6da60cf00000000, 0xb4e248e500000000, + 0x12aa309b00000000, 0x709218b100000000, 0x5e3bc06700000000, + 0x3c03e84d00000000, 0x9a4b903300000000, 0xf873b81900000000, + 0x6493408a00000000, 0x06ab68a000000000, 0xa0e310de00000000, + 0xc2db38f400000000, 0xec72e02200000000, 0x8e4ac80800000000, + 0x2802b07600000000, 0x4a3a985c00000000, 0x3556700000000000, + 0x576e582a00000000, 0xf126205400000000, 0x931e087e00000000, + 0xbdb7d0a800000000, 0xdf8ff88200000000, 0x79c780fc00000000, + 0x1bffa8d600000000, 0x0e3fa08a00000000, 0x6c0788a000000000, + 0xca4ff0de00000000, 0xa877d8f400000000, 0x86de002200000000, + 0xe4e6280800000000, 0x42ae507600000000, 0x2096785c00000000, + 0x5ffa900000000000, 0x3dc2b82a00000000, 0x9b8ac05400000000, + 0xf9b2e87e00000000, 0xd71b30a800000000, 0xb523188200000000, + 0x136b60fc00000000, 0x715348d600000000, 0xedb3b04500000000, + 0x8f8b986f00000000, 0x29c3e01100000000, 0x4bfbc83b00000000, + 0x655210ed00000000, 0x076a38c700000000, 0xa12240b900000000, + 0xc31a689300000000, 0xbc7680cf00000000, 0xde4ea8e500000000, + 0x7806d09b00000000, 0x1a3ef8b100000000, 0x3497206700000000, + 0x56af084d00000000, 0xf0e7703300000000, 0x92df581900000000, + 0x8920f0cf00000000, 0xeb18d8e500000000, 0x4d50a09b00000000, + 0x2f6888b100000000, 0x01c1506700000000, 0x63f9784d00000000, + 0xc5b1003300000000, 0xa789281900000000, 0xd8e5c04500000000, + 0xbadde86f00000000, 0x1c95901100000000, 0x7eadb83b00000000, + 0x500460ed00000000, 0x323c48c700000000, 0x947430b900000000, + 0xf64c189300000000, 0x6aace00000000000, 0x0894c82a00000000, + 0xaedcb05400000000, 0xcce4987e00000000, 0xe24d40a800000000, + 0x8075688200000000, 0x263d10fc00000000, 0x440538d600000000, + 0x3b69d08a00000000, 0x5951f8a000000000, 0xff1980de00000000, + 0x9d21a8f400000000, 0xb388702200000000, 0xd1b0580800000000, + 0x77f8207600000000, 0x15c0085c00000000, 0x5d7831ce00000000, + 0x3f4019e400000000, 0x9908619a00000000, 0xfb3049b000000000, + 0xd599916600000000, 0xb7a1b94c00000000, 0x11e9c13200000000, + 0x73d1e91800000000, 0x0cbd014400000000, 0x6e85296e00000000, + 0xc8cd511000000000, 0xaaf5793a00000000, 0x845ca1ec00000000, + 0xe66489c600000000, 0x402cf1b800000000, 0x2214d99200000000, + 0xbef4210100000000, 0xdccc092b00000000, 0x7a84715500000000, + 0x18bc597f00000000, 0x361581a900000000, 0x542da98300000000, + 0xf265d1fd00000000, 0x905df9d700000000, 0xef31118b00000000, + 0x8d0939a100000000, 0x2b4141df00000000, 0x497969f500000000, + 0x67d0b12300000000, 0x05e8990900000000, 0xa3a0e17700000000, + 0xc198c95d00000000, 0xda67618b00000000, 0xb85f49a100000000, + 0x1e1731df00000000, 0x7c2f19f500000000, 0x5286c12300000000, + 0x30bee90900000000, 0x96f6917700000000, 0xf4ceb95d00000000, + 0x8ba2510100000000, 0xe99a792b00000000, 0x4fd2015500000000, + 0x2dea297f00000000, 0x0343f1a900000000, 0x617bd98300000000, + 0xc733a1fd00000000, 0xa50b89d700000000, 0x39eb714400000000, + 0x5bd3596e00000000, 0xfd9b211000000000, 0x9fa3093a00000000, + 0xb10ad1ec00000000, 0xd332f9c600000000, 0x757a81b800000000, + 0x1742a99200000000, 0x682e41ce00000000, 0x0a1669e400000000, + 0xac5e119a00000000, 0xce6639b000000000, 0xe0cfe16600000000, + 0x82f7c94c00000000, 0x24bfb13200000000, 0x4687991800000000, + 0x5347914400000000, 0x317fb96e00000000, 0x9737c11000000000, + 0xf50fe93a00000000, 0xdba631ec00000000, 0xb99e19c600000000, + 0x1fd661b800000000, 0x7dee499200000000, 0x0282a1ce00000000, + 0x60ba89e400000000, 0xc6f2f19a00000000, 0xa4cad9b000000000, + 0x8a63016600000000, 0xe85b294c00000000, 0x4e13513200000000, + 0x2c2b791800000000, 0xb0cb818b00000000, 0xd2f3a9a100000000, + 0x74bbd1df00000000, 0x1683f9f500000000, 0x382a212300000000, + 0x5a12090900000000, 0xfc5a717700000000, 0x9e62595d00000000, + 0xe10eb10100000000, 0x8336992b00000000, 0x257ee15500000000, + 0x4746c97f00000000, 0x69ef11a900000000, 0x0bd7398300000000, + 0xad9f41fd00000000, 0xcfa769d700000000, 0xd458c10100000000, + 0xb660e92b00000000, 0x1028915500000000, 0x7210b97f00000000, + 0x5cb961a900000000, 0x3e81498300000000, 0x98c931fd00000000, + 0xfaf119d700000000, 0x859df18b00000000, 0xe7a5d9a100000000, + 0x41eda1df00000000, 0x23d589f500000000, 0x0d7c512300000000, + 0x6f44790900000000, 0xc90c017700000000, 0xab34295d00000000, + 0x37d4d1ce00000000, 0x55ecf9e400000000, 0xf3a4819a00000000, + 0x919ca9b000000000, 0xbf35716600000000, 0xdd0d594c00000000, + 0x7b45213200000000, 0x197d091800000000, 0x6611e14400000000, + 0x0429c96e00000000, 0xa261b11000000000, 0xc059993a00000000, + 0xeef041ec00000000, 0x8cc869c600000000, 0x2a8011b800000000, + 0x48b8399200000000}, + {0x0000000000000000, 0x4c2896a300000000, 0xd9565d9c00000000, + 0x957ecb3f00000000, 0xf3abcbe300000000, 0xbf835d4000000000, + 0x2afd967f00000000, 0x66d500dc00000000, 0xa751e61c00000000, + 0xeb7970bf00000000, 0x7e07bb8000000000, 0x322f2d2300000000, + 0x54fa2dff00000000, 0x18d2bb5c00000000, 0x8dac706300000000, + 0xc184e6c000000000, 0x4ea3cc3900000000, 0x028b5a9a00000000, + 0x97f591a500000000, 0xdbdd070600000000, 0xbd0807da00000000, + 0xf120917900000000, 0x645e5a4600000000, 0x2876cce500000000, + 0xe9f22a2500000000, 0xa5dabc8600000000, 0x30a477b900000000, + 0x7c8ce11a00000000, 0x1a59e1c600000000, 0x5671776500000000, + 0xc30fbc5a00000000, 0x8f272af900000000, 0x9c46997300000000, + 0xd06e0fd000000000, 0x4510c4ef00000000, 0x0938524c00000000, + 0x6fed529000000000, 0x23c5c43300000000, 0xb6bb0f0c00000000, + 0xfa9399af00000000, 0x3b177f6f00000000, 0x773fe9cc00000000, + 0xe24122f300000000, 0xae69b45000000000, 0xc8bcb48c00000000, + 0x8494222f00000000, 0x11eae91000000000, 0x5dc27fb300000000, + 0xd2e5554a00000000, 0x9ecdc3e900000000, 0x0bb308d600000000, + 0x479b9e7500000000, 0x214e9ea900000000, 0x6d66080a00000000, + 0xf818c33500000000, 0xb430559600000000, 0x75b4b35600000000, + 0x399c25f500000000, 0xace2eeca00000000, 0xe0ca786900000000, + 0x861f78b500000000, 0xca37ee1600000000, 0x5f49252900000000, + 0x1361b38a00000000, 0x388d32e700000000, 0x74a5a44400000000, + 0xe1db6f7b00000000, 0xadf3f9d800000000, 0xcb26f90400000000, + 0x870e6fa700000000, 0x1270a49800000000, 0x5e58323b00000000, + 0x9fdcd4fb00000000, 0xd3f4425800000000, 0x468a896700000000, + 0x0aa21fc400000000, 0x6c771f1800000000, 0x205f89bb00000000, + 0xb521428400000000, 0xf909d42700000000, 0x762efede00000000, + 0x3a06687d00000000, 0xaf78a34200000000, 0xe35035e100000000, + 0x8585353d00000000, 0xc9ada39e00000000, 0x5cd368a100000000, + 0x10fbfe0200000000, 0xd17f18c200000000, 0x9d578e6100000000, + 0x0829455e00000000, 0x4401d3fd00000000, 0x22d4d32100000000, + 0x6efc458200000000, 0xfb828ebd00000000, 0xb7aa181e00000000, + 0xa4cbab9400000000, 0xe8e33d3700000000, 0x7d9df60800000000, + 0x31b560ab00000000, 0x5760607700000000, 0x1b48f6d400000000, + 0x8e363deb00000000, 0xc21eab4800000000, 0x039a4d8800000000, + 0x4fb2db2b00000000, 0xdacc101400000000, 0x96e486b700000000, + 0xf031866b00000000, 0xbc1910c800000000, 0x2967dbf700000000, + 0x654f4d5400000000, 0xea6867ad00000000, 0xa640f10e00000000, + 0x333e3a3100000000, 0x7f16ac9200000000, 0x19c3ac4e00000000, + 0x55eb3aed00000000, 0xc095f1d200000000, 0x8cbd677100000000, + 0x4d3981b100000000, 0x0111171200000000, 0x946fdc2d00000000, + 0xd8474a8e00000000, 0xbe924a5200000000, 0xf2badcf100000000, + 0x67c417ce00000000, 0x2bec816d00000000, 0x311c141500000000, + 0x7d3482b600000000, 0xe84a498900000000, 0xa462df2a00000000, + 0xc2b7dff600000000, 0x8e9f495500000000, 0x1be1826a00000000, + 0x57c914c900000000, 0x964df20900000000, 0xda6564aa00000000, + 0x4f1baf9500000000, 0x0333393600000000, 0x65e639ea00000000, + 0x29ceaf4900000000, 0xbcb0647600000000, 0xf098f2d500000000, + 0x7fbfd82c00000000, 0x33974e8f00000000, 0xa6e985b000000000, + 0xeac1131300000000, 0x8c1413cf00000000, 0xc03c856c00000000, + 0x55424e5300000000, 0x196ad8f000000000, 0xd8ee3e3000000000, + 0x94c6a89300000000, 0x01b863ac00000000, 0x4d90f50f00000000, + 0x2b45f5d300000000, 0x676d637000000000, 0xf213a84f00000000, + 0xbe3b3eec00000000, 0xad5a8d6600000000, 0xe1721bc500000000, + 0x740cd0fa00000000, 0x3824465900000000, 0x5ef1468500000000, + 0x12d9d02600000000, 0x87a71b1900000000, 0xcb8f8dba00000000, + 0x0a0b6b7a00000000, 0x4623fdd900000000, 0xd35d36e600000000, + 0x9f75a04500000000, 0xf9a0a09900000000, 0xb588363a00000000, + 0x20f6fd0500000000, 0x6cde6ba600000000, 0xe3f9415f00000000, + 0xafd1d7fc00000000, 0x3aaf1cc300000000, 0x76878a6000000000, + 0x10528abc00000000, 0x5c7a1c1f00000000, 0xc904d72000000000, + 0x852c418300000000, 0x44a8a74300000000, 0x088031e000000000, + 0x9dfefadf00000000, 0xd1d66c7c00000000, 0xb7036ca000000000, + 0xfb2bfa0300000000, 0x6e55313c00000000, 0x227da79f00000000, + 0x099126f200000000, 0x45b9b05100000000, 0xd0c77b6e00000000, + 0x9cefedcd00000000, 0xfa3aed1100000000, 0xb6127bb200000000, + 0x236cb08d00000000, 0x6f44262e00000000, 0xaec0c0ee00000000, + 0xe2e8564d00000000, 0x77969d7200000000, 0x3bbe0bd100000000, + 0x5d6b0b0d00000000, 0x11439dae00000000, 0x843d569100000000, + 0xc815c03200000000, 0x4732eacb00000000, 0x0b1a7c6800000000, + 0x9e64b75700000000, 0xd24c21f400000000, 0xb499212800000000, + 0xf8b1b78b00000000, 0x6dcf7cb400000000, 0x21e7ea1700000000, + 0xe0630cd700000000, 0xac4b9a7400000000, 0x3935514b00000000, + 0x751dc7e800000000, 0x13c8c73400000000, 0x5fe0519700000000, + 0xca9e9aa800000000, 0x86b60c0b00000000, 0x95d7bf8100000000, + 0xd9ff292200000000, 0x4c81e21d00000000, 0x00a974be00000000, + 0x667c746200000000, 0x2a54e2c100000000, 0xbf2a29fe00000000, + 0xf302bf5d00000000, 0x3286599d00000000, 0x7eaecf3e00000000, + 0xebd0040100000000, 0xa7f892a200000000, 0xc12d927e00000000, + 0x8d0504dd00000000, 0x187bcfe200000000, 0x5453594100000000, + 0xdb7473b800000000, 0x975ce51b00000000, 0x02222e2400000000, + 0x4e0ab88700000000, 0x28dfb85b00000000, 0x64f72ef800000000, + 0xf189e5c700000000, 0xbda1736400000000, 0x7c2595a400000000, + 0x300d030700000000, 0xa573c83800000000, 0xe95b5e9b00000000, + 0x8f8e5e4700000000, 0xc3a6c8e400000000, 0x56d803db00000000, + 0x1af0957800000000}, + {0x0000000000000000, 0x939bc97f00000000, 0x263793ff00000000, + 0xb5ac5a8000000000, 0x0d68572400000000, 0x9ef39e5b00000000, + 0x2b5fc4db00000000, 0xb8c40da400000000, 0x1ad0ae4800000000, + 0x894b673700000000, 0x3ce73db700000000, 0xaf7cf4c800000000, + 0x17b8f96c00000000, 0x8423301300000000, 0x318f6a9300000000, + 0xa214a3ec00000000, 0x34a05d9100000000, 0xa73b94ee00000000, + 0x1297ce6e00000000, 0x810c071100000000, 0x39c80ab500000000, + 0xaa53c3ca00000000, 0x1fff994a00000000, 0x8c64503500000000, + 0x2e70f3d900000000, 0xbdeb3aa600000000, 0x0847602600000000, + 0x9bdca95900000000, 0x2318a4fd00000000, 0xb0836d8200000000, + 0x052f370200000000, 0x96b4fe7d00000000, 0x2946caf900000000, + 0xbadd038600000000, 0x0f71590600000000, 0x9cea907900000000, + 0x242e9ddd00000000, 0xb7b554a200000000, 0x02190e2200000000, + 0x9182c75d00000000, 0x339664b100000000, 0xa00dadce00000000, + 0x15a1f74e00000000, 0x863a3e3100000000, 0x3efe339500000000, + 0xad65faea00000000, 0x18c9a06a00000000, 0x8b52691500000000, + 0x1de6976800000000, 0x8e7d5e1700000000, 0x3bd1049700000000, + 0xa84acde800000000, 0x108ec04c00000000, 0x8315093300000000, + 0x36b953b300000000, 0xa5229acc00000000, 0x0736392000000000, + 0x94adf05f00000000, 0x2101aadf00000000, 0xb29a63a000000000, + 0x0a5e6e0400000000, 0x99c5a77b00000000, 0x2c69fdfb00000000, + 0xbff2348400000000, 0x138ae52800000000, 0x80112c5700000000, + 0x35bd76d700000000, 0xa626bfa800000000, 0x1ee2b20c00000000, + 0x8d797b7300000000, 0x38d521f300000000, 0xab4ee88c00000000, + 0x095a4b6000000000, 0x9ac1821f00000000, 0x2f6dd89f00000000, + 0xbcf611e000000000, 0x04321c4400000000, 0x97a9d53b00000000, + 0x22058fbb00000000, 0xb19e46c400000000, 0x272ab8b900000000, + 0xb4b171c600000000, 0x011d2b4600000000, 0x9286e23900000000, + 0x2a42ef9d00000000, 0xb9d926e200000000, 0x0c757c6200000000, + 0x9feeb51d00000000, 0x3dfa16f100000000, 0xae61df8e00000000, + 0x1bcd850e00000000, 0x88564c7100000000, 0x309241d500000000, + 0xa30988aa00000000, 0x16a5d22a00000000, 0x853e1b5500000000, + 0x3acc2fd100000000, 0xa957e6ae00000000, 0x1cfbbc2e00000000, + 0x8f60755100000000, 0x37a478f500000000, 0xa43fb18a00000000, + 0x1193eb0a00000000, 0x8208227500000000, 0x201c819900000000, + 0xb38748e600000000, 0x062b126600000000, 0x95b0db1900000000, + 0x2d74d6bd00000000, 0xbeef1fc200000000, 0x0b43454200000000, + 0x98d88c3d00000000, 0x0e6c724000000000, 0x9df7bb3f00000000, + 0x285be1bf00000000, 0xbbc028c000000000, 0x0304256400000000, + 0x909fec1b00000000, 0x2533b69b00000000, 0xb6a87fe400000000, + 0x14bcdc0800000000, 0x8727157700000000, 0x328b4ff700000000, + 0xa110868800000000, 0x19d48b2c00000000, 0x8a4f425300000000, + 0x3fe318d300000000, 0xac78d1ac00000000, 0x2614cb5100000000, + 0xb58f022e00000000, 0x002358ae00000000, 0x93b891d100000000, + 0x2b7c9c7500000000, 0xb8e7550a00000000, 0x0d4b0f8a00000000, + 0x9ed0c6f500000000, 0x3cc4651900000000, 0xaf5fac6600000000, + 0x1af3f6e600000000, 0x89683f9900000000, 0x31ac323d00000000, + 0xa237fb4200000000, 0x179ba1c200000000, 0x840068bd00000000, + 0x12b496c000000000, 0x812f5fbf00000000, 0x3483053f00000000, + 0xa718cc4000000000, 0x1fdcc1e400000000, 0x8c47089b00000000, + 0x39eb521b00000000, 0xaa709b6400000000, 0x0864388800000000, + 0x9bfff1f700000000, 0x2e53ab7700000000, 0xbdc8620800000000, + 0x050c6fac00000000, 0x9697a6d300000000, 0x233bfc5300000000, + 0xb0a0352c00000000, 0x0f5201a800000000, 0x9cc9c8d700000000, + 0x2965925700000000, 0xbafe5b2800000000, 0x023a568c00000000, + 0x91a19ff300000000, 0x240dc57300000000, 0xb7960c0c00000000, + 0x1582afe000000000, 0x8619669f00000000, 0x33b53c1f00000000, + 0xa02ef56000000000, 0x18eaf8c400000000, 0x8b7131bb00000000, + 0x3edd6b3b00000000, 0xad46a24400000000, 0x3bf25c3900000000, + 0xa869954600000000, 0x1dc5cfc600000000, 0x8e5e06b900000000, + 0x369a0b1d00000000, 0xa501c26200000000, 0x10ad98e200000000, + 0x8336519d00000000, 0x2122f27100000000, 0xb2b93b0e00000000, + 0x0715618e00000000, 0x948ea8f100000000, 0x2c4aa55500000000, + 0xbfd16c2a00000000, 0x0a7d36aa00000000, 0x99e6ffd500000000, + 0x359e2e7900000000, 0xa605e70600000000, 0x13a9bd8600000000, + 0x803274f900000000, 0x38f6795d00000000, 0xab6db02200000000, + 0x1ec1eaa200000000, 0x8d5a23dd00000000, 0x2f4e803100000000, + 0xbcd5494e00000000, 0x097913ce00000000, 0x9ae2dab100000000, + 0x2226d71500000000, 0xb1bd1e6a00000000, 0x041144ea00000000, + 0x978a8d9500000000, 0x013e73e800000000, 0x92a5ba9700000000, + 0x2709e01700000000, 0xb492296800000000, 0x0c5624cc00000000, + 0x9fcdedb300000000, 0x2a61b73300000000, 0xb9fa7e4c00000000, + 0x1beedda000000000, 0x887514df00000000, 0x3dd94e5f00000000, + 0xae42872000000000, 0x16868a8400000000, 0x851d43fb00000000, + 0x30b1197b00000000, 0xa32ad00400000000, 0x1cd8e48000000000, + 0x8f432dff00000000, 0x3aef777f00000000, 0xa974be0000000000, + 0x11b0b3a400000000, 0x822b7adb00000000, 0x3787205b00000000, + 0xa41ce92400000000, 0x06084ac800000000, 0x959383b700000000, + 0x203fd93700000000, 0xb3a4104800000000, 0x0b601dec00000000, + 0x98fbd49300000000, 0x2d578e1300000000, 0xbecc476c00000000, + 0x2878b91100000000, 0xbbe3706e00000000, 0x0e4f2aee00000000, + 0x9dd4e39100000000, 0x2510ee3500000000, 0xb68b274a00000000, + 0x03277dca00000000, 0x90bcb4b500000000, 0x32a8175900000000, + 0xa133de2600000000, 0x149f84a600000000, 0x87044dd900000000, + 0x3fc0407d00000000, 0xac5b890200000000, 0x19f7d38200000000, + 0x8a6c1afd00000000}, + {0x0000000000000000, 0x650b796900000000, 0xca16f2d200000000, + 0xaf1d8bbb00000000, 0xd52b957e00000000, 0xb020ec1700000000, + 0x1f3d67ac00000000, 0x7a361ec500000000, 0xaa572afd00000000, + 0xcf5c539400000000, 0x6041d82f00000000, 0x054aa14600000000, + 0x7f7cbf8300000000, 0x1a77c6ea00000000, 0xb56a4d5100000000, + 0xd061343800000000, 0x15a9252100000000, 0x70a25c4800000000, + 0xdfbfd7f300000000, 0xbab4ae9a00000000, 0xc082b05f00000000, + 0xa589c93600000000, 0x0a94428d00000000, 0x6f9f3be400000000, + 0xbffe0fdc00000000, 0xdaf576b500000000, 0x75e8fd0e00000000, + 0x10e3846700000000, 0x6ad59aa200000000, 0x0fdee3cb00000000, + 0xa0c3687000000000, 0xc5c8111900000000, 0x2a524b4200000000, + 0x4f59322b00000000, 0xe044b99000000000, 0x854fc0f900000000, + 0xff79de3c00000000, 0x9a72a75500000000, 0x356f2cee00000000, + 0x5064558700000000, 0x800561bf00000000, 0xe50e18d600000000, + 0x4a13936d00000000, 0x2f18ea0400000000, 0x552ef4c100000000, + 0x30258da800000000, 0x9f38061300000000, 0xfa337f7a00000000, + 0x3ffb6e6300000000, 0x5af0170a00000000, 0xf5ed9cb100000000, + 0x90e6e5d800000000, 0xead0fb1d00000000, 0x8fdb827400000000, + 0x20c609cf00000000, 0x45cd70a600000000, 0x95ac449e00000000, + 0xf0a73df700000000, 0x5fbab64c00000000, 0x3ab1cf2500000000, + 0x4087d1e000000000, 0x258ca88900000000, 0x8a91233200000000, + 0xef9a5a5b00000000, 0x54a4968400000000, 0x31afefed00000000, + 0x9eb2645600000000, 0xfbb91d3f00000000, 0x818f03fa00000000, + 0xe4847a9300000000, 0x4b99f12800000000, 0x2e92884100000000, + 0xfef3bc7900000000, 0x9bf8c51000000000, 0x34e54eab00000000, + 0x51ee37c200000000, 0x2bd8290700000000, 0x4ed3506e00000000, + 0xe1cedbd500000000, 0x84c5a2bc00000000, 0x410db3a500000000, + 0x2406cacc00000000, 0x8b1b417700000000, 0xee10381e00000000, + 0x942626db00000000, 0xf12d5fb200000000, 0x5e30d40900000000, + 0x3b3bad6000000000, 0xeb5a995800000000, 0x8e51e03100000000, + 0x214c6b8a00000000, 0x444712e300000000, 0x3e710c2600000000, + 0x5b7a754f00000000, 0xf467fef400000000, 0x916c879d00000000, + 0x7ef6ddc600000000, 0x1bfda4af00000000, 0xb4e02f1400000000, + 0xd1eb567d00000000, 0xabdd48b800000000, 0xced631d100000000, + 0x61cbba6a00000000, 0x04c0c30300000000, 0xd4a1f73b00000000, + 0xb1aa8e5200000000, 0x1eb705e900000000, 0x7bbc7c8000000000, + 0x018a624500000000, 0x64811b2c00000000, 0xcb9c909700000000, + 0xae97e9fe00000000, 0x6b5ff8e700000000, 0x0e54818e00000000, + 0xa1490a3500000000, 0xc442735c00000000, 0xbe746d9900000000, + 0xdb7f14f000000000, 0x74629f4b00000000, 0x1169e62200000000, + 0xc108d21a00000000, 0xa403ab7300000000, 0x0b1e20c800000000, + 0x6e1559a100000000, 0x1423476400000000, 0x71283e0d00000000, + 0xde35b5b600000000, 0xbb3eccdf00000000, 0xe94e5cd200000000, + 0x8c4525bb00000000, 0x2358ae0000000000, 0x4653d76900000000, + 0x3c65c9ac00000000, 0x596eb0c500000000, 0xf6733b7e00000000, + 0x9378421700000000, 0x4319762f00000000, 0x26120f4600000000, + 0x890f84fd00000000, 0xec04fd9400000000, 0x9632e35100000000, + 0xf3399a3800000000, 0x5c24118300000000, 0x392f68ea00000000, + 0xfce779f300000000, 0x99ec009a00000000, 0x36f18b2100000000, + 0x53faf24800000000, 0x29ccec8d00000000, 0x4cc795e400000000, + 0xe3da1e5f00000000, 0x86d1673600000000, 0x56b0530e00000000, + 0x33bb2a6700000000, 0x9ca6a1dc00000000, 0xf9add8b500000000, + 0x839bc67000000000, 0xe690bf1900000000, 0x498d34a200000000, + 0x2c864dcb00000000, 0xc31c179000000000, 0xa6176ef900000000, + 0x090ae54200000000, 0x6c019c2b00000000, 0x163782ee00000000, + 0x733cfb8700000000, 0xdc21703c00000000, 0xb92a095500000000, + 0x694b3d6d00000000, 0x0c40440400000000, 0xa35dcfbf00000000, + 0xc656b6d600000000, 0xbc60a81300000000, 0xd96bd17a00000000, + 0x76765ac100000000, 0x137d23a800000000, 0xd6b532b100000000, + 0xb3be4bd800000000, 0x1ca3c06300000000, 0x79a8b90a00000000, + 0x039ea7cf00000000, 0x6695dea600000000, 0xc988551d00000000, + 0xac832c7400000000, 0x7ce2184c00000000, 0x19e9612500000000, + 0xb6f4ea9e00000000, 0xd3ff93f700000000, 0xa9c98d3200000000, + 0xccc2f45b00000000, 0x63df7fe000000000, 0x06d4068900000000, + 0xbdeaca5600000000, 0xd8e1b33f00000000, 0x77fc388400000000, + 0x12f741ed00000000, 0x68c15f2800000000, 0x0dca264100000000, + 0xa2d7adfa00000000, 0xc7dcd49300000000, 0x17bde0ab00000000, + 0x72b699c200000000, 0xddab127900000000, 0xb8a06b1000000000, + 0xc29675d500000000, 0xa79d0cbc00000000, 0x0880870700000000, + 0x6d8bfe6e00000000, 0xa843ef7700000000, 0xcd48961e00000000, + 0x62551da500000000, 0x075e64cc00000000, 0x7d687a0900000000, + 0x1863036000000000, 0xb77e88db00000000, 0xd275f1b200000000, + 0x0214c58a00000000, 0x671fbce300000000, 0xc802375800000000, + 0xad094e3100000000, 0xd73f50f400000000, 0xb234299d00000000, + 0x1d29a22600000000, 0x7822db4f00000000, 0x97b8811400000000, + 0xf2b3f87d00000000, 0x5dae73c600000000, 0x38a50aaf00000000, + 0x4293146a00000000, 0x27986d0300000000, 0x8885e6b800000000, + 0xed8e9fd100000000, 0x3defabe900000000, 0x58e4d28000000000, + 0xf7f9593b00000000, 0x92f2205200000000, 0xe8c43e9700000000, + 0x8dcf47fe00000000, 0x22d2cc4500000000, 0x47d9b52c00000000, + 0x8211a43500000000, 0xe71add5c00000000, 0x480756e700000000, + 0x2d0c2f8e00000000, 0x573a314b00000000, 0x3231482200000000, + 0x9d2cc39900000000, 0xf827baf000000000, 0x28468ec800000000, + 0x4d4df7a100000000, 0xe2507c1a00000000, 0x875b057300000000, + 0xfd6d1bb600000000, 0x986662df00000000, 0x377be96400000000, + 0x5270900d00000000}, + {0x0000000000000000, 0xdcecb13d00000000, 0xb8d9637b00000000, + 0x6435d24600000000, 0x70b3c7f600000000, 0xac5f76cb00000000, + 0xc86aa48d00000000, 0x148615b000000000, 0xa160fe3600000000, + 0x7d8c4f0b00000000, 0x19b99d4d00000000, 0xc5552c7000000000, + 0xd1d339c000000000, 0x0d3f88fd00000000, 0x690a5abb00000000, + 0xb5e6eb8600000000, 0x42c1fc6d00000000, 0x9e2d4d5000000000, + 0xfa189f1600000000, 0x26f42e2b00000000, 0x32723b9b00000000, + 0xee9e8aa600000000, 0x8aab58e000000000, 0x5647e9dd00000000, + 0xe3a1025b00000000, 0x3f4db36600000000, 0x5b78612000000000, + 0x8794d01d00000000, 0x9312c5ad00000000, 0x4ffe749000000000, + 0x2bcba6d600000000, 0xf72717eb00000000, 0x8482f9db00000000, + 0x586e48e600000000, 0x3c5b9aa000000000, 0xe0b72b9d00000000, + 0xf4313e2d00000000, 0x28dd8f1000000000, 0x4ce85d5600000000, + 0x9004ec6b00000000, 0x25e207ed00000000, 0xf90eb6d000000000, + 0x9d3b649600000000, 0x41d7d5ab00000000, 0x5551c01b00000000, + 0x89bd712600000000, 0xed88a36000000000, 0x3164125d00000000, + 0xc64305b600000000, 0x1aafb48b00000000, 0x7e9a66cd00000000, + 0xa276d7f000000000, 0xb6f0c24000000000, 0x6a1c737d00000000, + 0x0e29a13b00000000, 0xd2c5100600000000, 0x6723fb8000000000, + 0xbbcf4abd00000000, 0xdffa98fb00000000, 0x031629c600000000, + 0x17903c7600000000, 0xcb7c8d4b00000000, 0xaf495f0d00000000, + 0x73a5ee3000000000, 0x4903826c00000000, 0x95ef335100000000, + 0xf1dae11700000000, 0x2d36502a00000000, 0x39b0459a00000000, + 0xe55cf4a700000000, 0x816926e100000000, 0x5d8597dc00000000, + 0xe8637c5a00000000, 0x348fcd6700000000, 0x50ba1f2100000000, + 0x8c56ae1c00000000, 0x98d0bbac00000000, 0x443c0a9100000000, + 0x2009d8d700000000, 0xfce569ea00000000, 0x0bc27e0100000000, + 0xd72ecf3c00000000, 0xb31b1d7a00000000, 0x6ff7ac4700000000, + 0x7b71b9f700000000, 0xa79d08ca00000000, 0xc3a8da8c00000000, + 0x1f446bb100000000, 0xaaa2803700000000, 0x764e310a00000000, + 0x127be34c00000000, 0xce97527100000000, 0xda1147c100000000, + 0x06fdf6fc00000000, 0x62c824ba00000000, 0xbe24958700000000, + 0xcd817bb700000000, 0x116dca8a00000000, 0x755818cc00000000, + 0xa9b4a9f100000000, 0xbd32bc4100000000, 0x61de0d7c00000000, + 0x05ebdf3a00000000, 0xd9076e0700000000, 0x6ce1858100000000, + 0xb00d34bc00000000, 0xd438e6fa00000000, 0x08d457c700000000, + 0x1c52427700000000, 0xc0bef34a00000000, 0xa48b210c00000000, + 0x7867903100000000, 0x8f4087da00000000, 0x53ac36e700000000, + 0x3799e4a100000000, 0xeb75559c00000000, 0xfff3402c00000000, + 0x231ff11100000000, 0x472a235700000000, 0x9bc6926a00000000, + 0x2e2079ec00000000, 0xf2ccc8d100000000, 0x96f91a9700000000, + 0x4a15abaa00000000, 0x5e93be1a00000000, 0x827f0f2700000000, + 0xe64add6100000000, 0x3aa66c5c00000000, 0x920604d900000000, + 0x4eeab5e400000000, 0x2adf67a200000000, 0xf633d69f00000000, + 0xe2b5c32f00000000, 0x3e59721200000000, 0x5a6ca05400000000, + 0x8680116900000000, 0x3366faef00000000, 0xef8a4bd200000000, + 0x8bbf999400000000, 0x575328a900000000, 0x43d53d1900000000, + 0x9f398c2400000000, 0xfb0c5e6200000000, 0x27e0ef5f00000000, + 0xd0c7f8b400000000, 0x0c2b498900000000, 0x681e9bcf00000000, + 0xb4f22af200000000, 0xa0743f4200000000, 0x7c988e7f00000000, + 0x18ad5c3900000000, 0xc441ed0400000000, 0x71a7068200000000, + 0xad4bb7bf00000000, 0xc97e65f900000000, 0x1592d4c400000000, + 0x0114c17400000000, 0xddf8704900000000, 0xb9cda20f00000000, + 0x6521133200000000, 0x1684fd0200000000, 0xca684c3f00000000, + 0xae5d9e7900000000, 0x72b12f4400000000, 0x66373af400000000, + 0xbadb8bc900000000, 0xdeee598f00000000, 0x0202e8b200000000, + 0xb7e4033400000000, 0x6b08b20900000000, 0x0f3d604f00000000, + 0xd3d1d17200000000, 0xc757c4c200000000, 0x1bbb75ff00000000, + 0x7f8ea7b900000000, 0xa362168400000000, 0x5445016f00000000, + 0x88a9b05200000000, 0xec9c621400000000, 0x3070d32900000000, + 0x24f6c69900000000, 0xf81a77a400000000, 0x9c2fa5e200000000, + 0x40c314df00000000, 0xf525ff5900000000, 0x29c94e6400000000, + 0x4dfc9c2200000000, 0x91102d1f00000000, 0x859638af00000000, + 0x597a899200000000, 0x3d4f5bd400000000, 0xe1a3eae900000000, + 0xdb0586b500000000, 0x07e9378800000000, 0x63dce5ce00000000, + 0xbf3054f300000000, 0xabb6414300000000, 0x775af07e00000000, + 0x136f223800000000, 0xcf83930500000000, 0x7a65788300000000, + 0xa689c9be00000000, 0xc2bc1bf800000000, 0x1e50aac500000000, + 0x0ad6bf7500000000, 0xd63a0e4800000000, 0xb20fdc0e00000000, + 0x6ee36d3300000000, 0x99c47ad800000000, 0x4528cbe500000000, + 0x211d19a300000000, 0xfdf1a89e00000000, 0xe977bd2e00000000, + 0x359b0c1300000000, 0x51aede5500000000, 0x8d426f6800000000, + 0x38a484ee00000000, 0xe44835d300000000, 0x807de79500000000, + 0x5c9156a800000000, 0x4817431800000000, 0x94fbf22500000000, + 0xf0ce206300000000, 0x2c22915e00000000, 0x5f877f6e00000000, + 0x836bce5300000000, 0xe75e1c1500000000, 0x3bb2ad2800000000, + 0x2f34b89800000000, 0xf3d809a500000000, 0x97eddbe300000000, + 0x4b016ade00000000, 0xfee7815800000000, 0x220b306500000000, + 0x463ee22300000000, 0x9ad2531e00000000, 0x8e5446ae00000000, + 0x52b8f79300000000, 0x368d25d500000000, 0xea6194e800000000, + 0x1d46830300000000, 0xc1aa323e00000000, 0xa59fe07800000000, + 0x7973514500000000, 0x6df544f500000000, 0xb119f5c800000000, + 0xd52c278e00000000, 0x09c096b300000000, 0xbc267d3500000000, + 0x60cacc0800000000, 0x04ff1e4e00000000, 0xd813af7300000000, + 0xcc95bac300000000, 0x10790bfe00000000, 0x744cd9b800000000, + 0xa8a0688500000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x9e83da9f, 0x7d01c4e4, 0xe3821e7b, 0xbb04f912, + 0x2587238d, 0xc6053df6, 0x5886e769, 0x7609f225, 0xe88a28ba, + 0x0b0836c1, 0x958bec5e, 0xcd0d0b37, 0x538ed1a8, 0xb00ccfd3, + 0x2e8f154c, 0xec12e44b, 0x72913ed4, 0x911320af, 0x0f90fa30, + 0x57161d59, 0xc995c7c6, 0x2a17d9bd, 0xb4940322, 0x9a1b166e, + 0x0498ccf1, 0xe71ad28a, 0x79990815, 0x211fef7c, 0xbf9c35e3, + 0x5c1e2b98, 0xc29df107, 0xd825c897, 0x46a61208, 0xa5240c73, + 0x3ba7d6ec, 0x63213185, 0xfda2eb1a, 0x1e20f561, 0x80a32ffe, + 0xae2c3ab2, 0x30afe02d, 0xd32dfe56, 0x4dae24c9, 0x1528c3a0, + 0x8bab193f, 0x68290744, 0xf6aadddb, 0x34372cdc, 0xaab4f643, + 0x4936e838, 0xd7b532a7, 0x8f33d5ce, 0x11b00f51, 0xf232112a, + 0x6cb1cbb5, 0x423edef9, 0xdcbd0466, 0x3f3f1a1d, 0xa1bcc082, + 0xf93a27eb, 0x67b9fd74, 0x843be30f, 0x1ab83990, 0xf14de1f4, + 0x6fce3b6b, 0x8c4c2510, 0x12cfff8f, 0x4a4918e6, 0xd4cac279, + 0x3748dc02, 0xa9cb069d, 0x874413d1, 0x19c7c94e, 0xfa45d735, + 0x64c60daa, 0x3c40eac3, 0xa2c3305c, 0x41412e27, 0xdfc2f4b8, + 0x1d5f05bf, 0x83dcdf20, 0x605ec15b, 0xfedd1bc4, 0xa65bfcad, + 0x38d82632, 0xdb5a3849, 0x45d9e2d6, 0x6b56f79a, 0xf5d52d05, + 0x1657337e, 0x88d4e9e1, 0xd0520e88, 0x4ed1d417, 0xad53ca6c, + 0x33d010f3, 0x29682963, 0xb7ebf3fc, 0x5469ed87, 0xcaea3718, + 0x926cd071, 0x0cef0aee, 0xef6d1495, 0x71eece0a, 0x5f61db46, + 0xc1e201d9, 0x22601fa2, 0xbce3c53d, 0xe4652254, 0x7ae6f8cb, + 0x9964e6b0, 0x07e73c2f, 0xc57acd28, 0x5bf917b7, 0xb87b09cc, + 0x26f8d353, 0x7e7e343a, 0xe0fdeea5, 0x037ff0de, 0x9dfc2a41, + 0xb3733f0d, 0x2df0e592, 0xce72fbe9, 0x50f12176, 0x0877c61f, + 0x96f41c80, 0x757602fb, 0xebf5d864, 0xa39db332, 0x3d1e69ad, + 0xde9c77d6, 0x401fad49, 0x18994a20, 0x861a90bf, 0x65988ec4, + 0xfb1b545b, 0xd5944117, 0x4b179b88, 0xa89585f3, 0x36165f6c, + 0x6e90b805, 0xf013629a, 0x13917ce1, 0x8d12a67e, 0x4f8f5779, + 0xd10c8de6, 0x328e939d, 0xac0d4902, 0xf48bae6b, 0x6a0874f4, + 0x898a6a8f, 0x1709b010, 0x3986a55c, 0xa7057fc3, 0x448761b8, + 0xda04bb27, 0x82825c4e, 0x1c0186d1, 0xff8398aa, 0x61004235, + 0x7bb87ba5, 0xe53ba13a, 0x06b9bf41, 0x983a65de, 0xc0bc82b7, + 0x5e3f5828, 0xbdbd4653, 0x233e9ccc, 0x0db18980, 0x9332531f, + 0x70b04d64, 0xee3397fb, 0xb6b57092, 0x2836aa0d, 0xcbb4b476, + 0x55376ee9, 0x97aa9fee, 0x09294571, 0xeaab5b0a, 0x74288195, + 0x2cae66fc, 0xb22dbc63, 0x51afa218, 0xcf2c7887, 0xe1a36dcb, + 0x7f20b754, 0x9ca2a92f, 0x022173b0, 0x5aa794d9, 0xc4244e46, + 0x27a6503d, 0xb9258aa2, 0x52d052c6, 0xcc538859, 0x2fd19622, + 0xb1524cbd, 0xe9d4abd4, 0x7757714b, 0x94d56f30, 0x0a56b5af, + 0x24d9a0e3, 0xba5a7a7c, 0x59d86407, 0xc75bbe98, 0x9fdd59f1, + 0x015e836e, 0xe2dc9d15, 0x7c5f478a, 0xbec2b68d, 0x20416c12, + 0xc3c37269, 0x5d40a8f6, 0x05c64f9f, 0x9b459500, 0x78c78b7b, + 0xe64451e4, 0xc8cb44a8, 0x56489e37, 0xb5ca804c, 0x2b495ad3, + 0x73cfbdba, 0xed4c6725, 0x0ece795e, 0x904da3c1, 0x8af59a51, + 0x147640ce, 0xf7f45eb5, 0x6977842a, 0x31f16343, 0xaf72b9dc, + 0x4cf0a7a7, 0xd2737d38, 0xfcfc6874, 0x627fb2eb, 0x81fdac90, + 0x1f7e760f, 0x47f89166, 0xd97b4bf9, 0x3af95582, 0xa47a8f1d, + 0x66e77e1a, 0xf864a485, 0x1be6bafe, 0x85656061, 0xdde38708, + 0x43605d97, 0xa0e243ec, 0x3e619973, 0x10ee8c3f, 0x8e6d56a0, + 0x6def48db, 0xf36c9244, 0xabea752d, 0x3569afb2, 0xd6ebb1c9, + 0x48686b56}, + {0x00000000, 0xc0642817, 0x80c9502e, 0x40ad7839, 0x0093a15c, + 0xc0f7894b, 0x805af172, 0x403ed965, 0x002643b9, 0xc0426bae, + 0x80ef1397, 0x408b3b80, 0x00b5e2e5, 0xc0d1caf2, 0x807cb2cb, + 0x40189adc, 0x414af7a9, 0x812edfbe, 0xc183a787, 0x01e78f90, + 0x41d956f5, 0x81bd7ee2, 0xc11006db, 0x01742ecc, 0x416cb410, + 0x81089c07, 0xc1a5e43e, 0x01c1cc29, 0x41ff154c, 0x819b3d5b, + 0xc1364562, 0x01526d75, 0xc3929f88, 0x03f6b79f, 0x435bcfa6, + 0x833fe7b1, 0xc3013ed4, 0x036516c3, 0x43c86efa, 0x83ac46ed, + 0xc3b4dc31, 0x03d0f426, 0x437d8c1f, 0x8319a408, 0xc3277d6d, + 0x0343557a, 0x43ee2d43, 0x838a0554, 0x82d86821, 0x42bc4036, + 0x0211380f, 0xc2751018, 0x824bc97d, 0x422fe16a, 0x02829953, + 0xc2e6b144, 0x82fe2b98, 0x429a038f, 0x02377bb6, 0xc25353a1, + 0x826d8ac4, 0x4209a2d3, 0x02a4daea, 0xc2c0f2fd, 0xc7234eca, + 0x074766dd, 0x47ea1ee4, 0x878e36f3, 0xc7b0ef96, 0x07d4c781, + 0x4779bfb8, 0x871d97af, 0xc7050d73, 0x07612564, 0x47cc5d5d, + 0x87a8754a, 0xc796ac2f, 0x07f28438, 0x475ffc01, 0x873bd416, + 0x8669b963, 0x460d9174, 0x06a0e94d, 0xc6c4c15a, 0x86fa183f, + 0x469e3028, 0x06334811, 0xc6576006, 0x864ffada, 0x462bd2cd, + 0x0686aaf4, 0xc6e282e3, 0x86dc5b86, 0x46b87391, 0x06150ba8, + 0xc67123bf, 0x04b1d142, 0xc4d5f955, 0x8478816c, 0x441ca97b, + 0x0422701e, 0xc4465809, 0x84eb2030, 0x448f0827, 0x049792fb, + 0xc4f3baec, 0x845ec2d5, 0x443aeac2, 0x040433a7, 0xc4601bb0, + 0x84cd6389, 0x44a94b9e, 0x45fb26eb, 0x859f0efc, 0xc53276c5, + 0x05565ed2, 0x456887b7, 0x850cafa0, 0xc5a1d799, 0x05c5ff8e, + 0x45dd6552, 0x85b94d45, 0xc514357c, 0x05701d6b, 0x454ec40e, + 0x852aec19, 0xc5879420, 0x05e3bc37, 0xcf41ed4f, 0x0f25c558, + 0x4f88bd61, 0x8fec9576, 0xcfd24c13, 0x0fb66404, 0x4f1b1c3d, + 0x8f7f342a, 0xcf67aef6, 0x0f0386e1, 0x4faefed8, 0x8fcad6cf, + 0xcff40faa, 0x0f9027bd, 0x4f3d5f84, 0x8f597793, 0x8e0b1ae6, + 0x4e6f32f1, 0x0ec24ac8, 0xcea662df, 0x8e98bbba, 0x4efc93ad, + 0x0e51eb94, 0xce35c383, 0x8e2d595f, 0x4e497148, 0x0ee40971, + 0xce802166, 0x8ebef803, 0x4edad014, 0x0e77a82d, 0xce13803a, + 0x0cd372c7, 0xccb75ad0, 0x8c1a22e9, 0x4c7e0afe, 0x0c40d39b, + 0xcc24fb8c, 0x8c8983b5, 0x4cedaba2, 0x0cf5317e, 0xcc911969, + 0x8c3c6150, 0x4c584947, 0x0c669022, 0xcc02b835, 0x8cafc00c, + 0x4ccbe81b, 0x4d99856e, 0x8dfdad79, 0xcd50d540, 0x0d34fd57, + 0x4d0a2432, 0x8d6e0c25, 0xcdc3741c, 0x0da75c0b, 0x4dbfc6d7, + 0x8ddbeec0, 0xcd7696f9, 0x0d12beee, 0x4d2c678b, 0x8d484f9c, + 0xcde537a5, 0x0d811fb2, 0x0862a385, 0xc8068b92, 0x88abf3ab, + 0x48cfdbbc, 0x08f102d9, 0xc8952ace, 0x883852f7, 0x485c7ae0, + 0x0844e03c, 0xc820c82b, 0x888db012, 0x48e99805, 0x08d74160, + 0xc8b36977, 0x881e114e, 0x487a3959, 0x4928542c, 0x894c7c3b, + 0xc9e10402, 0x09852c15, 0x49bbf570, 0x89dfdd67, 0xc972a55e, + 0x09168d49, 0x490e1795, 0x896a3f82, 0xc9c747bb, 0x09a36fac, + 0x499db6c9, 0x89f99ede, 0xc954e6e7, 0x0930cef0, 0xcbf03c0d, + 0x0b94141a, 0x4b396c23, 0x8b5d4434, 0xcb639d51, 0x0b07b546, + 0x4baacd7f, 0x8bcee568, 0xcbd67fb4, 0x0bb257a3, 0x4b1f2f9a, + 0x8b7b078d, 0xcb45dee8, 0x0b21f6ff, 0x4b8c8ec6, 0x8be8a6d1, + 0x8abacba4, 0x4adee3b3, 0x0a739b8a, 0xca17b39d, 0x8a296af8, + 0x4a4d42ef, 0x0ae03ad6, 0xca8412c1, 0x8a9c881d, 0x4af8a00a, + 0x0a55d833, 0xca31f024, 0x8a0f2941, 0x4a6b0156, 0x0ac6796f, + 0xcaa25178}, + {0x00000000, 0xd4ea739b, 0xe9d396ed, 0x3d39e576, 0x93a15c00, + 0x474b2f9b, 0x7a72caed, 0xae98b976, 0x2643b900, 0xf2a9ca9b, + 0xcf902fed, 0x1b7a5c76, 0xb5e2e500, 0x6108969b, 0x5c3173ed, + 0x88db0076, 0x4c867201, 0x986c019a, 0xa555e4ec, 0x71bf9777, + 0xdf272e01, 0x0bcd5d9a, 0x36f4b8ec, 0xe21ecb77, 0x6ac5cb01, + 0xbe2fb89a, 0x83165dec, 0x57fc2e77, 0xf9649701, 0x2d8ee49a, + 0x10b701ec, 0xc45d7277, 0x980ce502, 0x4ce69699, 0x71df73ef, + 0xa5350074, 0x0badb902, 0xdf47ca99, 0xe27e2fef, 0x36945c74, + 0xbe4f5c02, 0x6aa52f99, 0x579ccaef, 0x8376b974, 0x2dee0002, + 0xf9047399, 0xc43d96ef, 0x10d7e574, 0xd48a9703, 0x0060e498, + 0x3d5901ee, 0xe9b37275, 0x472bcb03, 0x93c1b898, 0xaef85dee, + 0x7a122e75, 0xf2c92e03, 0x26235d98, 0x1b1ab8ee, 0xcff0cb75, + 0x61687203, 0xb5820198, 0x88bbe4ee, 0x5c519775, 0x3019ca05, + 0xe4f3b99e, 0xd9ca5ce8, 0x0d202f73, 0xa3b89605, 0x7752e59e, + 0x4a6b00e8, 0x9e817373, 0x165a7305, 0xc2b0009e, 0xff89e5e8, + 0x2b639673, 0x85fb2f05, 0x51115c9e, 0x6c28b9e8, 0xb8c2ca73, + 0x7c9fb804, 0xa875cb9f, 0x954c2ee9, 0x41a65d72, 0xef3ee404, + 0x3bd4979f, 0x06ed72e9, 0xd2070172, 0x5adc0104, 0x8e36729f, + 0xb30f97e9, 0x67e5e472, 0xc97d5d04, 0x1d972e9f, 0x20aecbe9, + 0xf444b872, 0xa8152f07, 0x7cff5c9c, 0x41c6b9ea, 0x952cca71, + 0x3bb47307, 0xef5e009c, 0xd267e5ea, 0x068d9671, 0x8e569607, + 0x5abce59c, 0x678500ea, 0xb36f7371, 0x1df7ca07, 0xc91db99c, + 0xf4245cea, 0x20ce2f71, 0xe4935d06, 0x30792e9d, 0x0d40cbeb, + 0xd9aab870, 0x77320106, 0xa3d8729d, 0x9ee197eb, 0x4a0be470, + 0xc2d0e406, 0x163a979d, 0x2b0372eb, 0xffe90170, 0x5171b806, + 0x859bcb9d, 0xb8a22eeb, 0x6c485d70, 0x6032940b, 0xb4d8e790, + 0x89e102e6, 0x5d0b717d, 0xf393c80b, 0x2779bb90, 0x1a405ee6, + 0xceaa2d7d, 0x46712d0b, 0x929b5e90, 0xafa2bbe6, 0x7b48c87d, + 0xd5d0710b, 0x013a0290, 0x3c03e7e6, 0xe8e9947d, 0x2cb4e60a, + 0xf85e9591, 0xc56770e7, 0x118d037c, 0xbf15ba0a, 0x6bffc991, + 0x56c62ce7, 0x822c5f7c, 0x0af75f0a, 0xde1d2c91, 0xe324c9e7, + 0x37ceba7c, 0x9956030a, 0x4dbc7091, 0x708595e7, 0xa46fe67c, + 0xf83e7109, 0x2cd40292, 0x11ede7e4, 0xc507947f, 0x6b9f2d09, + 0xbf755e92, 0x824cbbe4, 0x56a6c87f, 0xde7dc809, 0x0a97bb92, + 0x37ae5ee4, 0xe3442d7f, 0x4ddc9409, 0x9936e792, 0xa40f02e4, + 0x70e5717f, 0xb4b80308, 0x60527093, 0x5d6b95e5, 0x8981e67e, + 0x27195f08, 0xf3f32c93, 0xcecac9e5, 0x1a20ba7e, 0x92fbba08, + 0x4611c993, 0x7b282ce5, 0xafc25f7e, 0x015ae608, 0xd5b09593, + 0xe88970e5, 0x3c63037e, 0x502b5e0e, 0x84c12d95, 0xb9f8c8e3, + 0x6d12bb78, 0xc38a020e, 0x17607195, 0x2a5994e3, 0xfeb3e778, + 0x7668e70e, 0xa2829495, 0x9fbb71e3, 0x4b510278, 0xe5c9bb0e, + 0x3123c895, 0x0c1a2de3, 0xd8f05e78, 0x1cad2c0f, 0xc8475f94, + 0xf57ebae2, 0x2194c979, 0x8f0c700f, 0x5be60394, 0x66dfe6e2, + 0xb2359579, 0x3aee950f, 0xee04e694, 0xd33d03e2, 0x07d77079, + 0xa94fc90f, 0x7da5ba94, 0x409c5fe2, 0x94762c79, 0xc827bb0c, + 0x1ccdc897, 0x21f42de1, 0xf51e5e7a, 0x5b86e70c, 0x8f6c9497, + 0xb25571e1, 0x66bf027a, 0xee64020c, 0x3a8e7197, 0x07b794e1, + 0xd35de77a, 0x7dc55e0c, 0xa92f2d97, 0x9416c8e1, 0x40fcbb7a, + 0x84a1c90d, 0x504bba96, 0x6d725fe0, 0xb9982c7b, 0x1700950d, + 0xc3eae696, 0xfed303e0, 0x2a39707b, 0xa2e2700d, 0x76080396, + 0x4b31e6e0, 0x9fdb957b, 0x31432c0d, 0xe5a95f96, 0xd890bae0, + 0x0c7ac97b}, + {0x00000000, 0x27652581, 0x0fcc3bd9, 0x28a91e58, 0x5f9e0669, + 0x78fb23e8, 0x50523db0, 0x77371831, 0xbe3c0dd2, 0x99592853, + 0xb1f0360b, 0x9695138a, 0xe1a20bbb, 0xc6c72e3a, 0xee6e3062, + 0xc90b15e3, 0x3d7f6b7f, 0x1a1a4efe, 0x32b350a6, 0x15d67527, + 0x62e16d16, 0x45844897, 0x6d2d56cf, 0x4a48734e, 0x834366ad, + 0xa426432c, 0x8c8f5d74, 0xabea78f5, 0xdcdd60c4, 0xfbb84545, + 0xd3115b1d, 0xf4747e9c, 0x7afed6fe, 0x5d9bf37f, 0x7532ed27, + 0x5257c8a6, 0x2560d097, 0x0205f516, 0x2aaceb4e, 0x0dc9cecf, + 0xc4c2db2c, 0xe3a7fead, 0xcb0ee0f5, 0xec6bc574, 0x9b5cdd45, + 0xbc39f8c4, 0x9490e69c, 0xb3f5c31d, 0x4781bd81, 0x60e49800, + 0x484d8658, 0x6f28a3d9, 0x181fbbe8, 0x3f7a9e69, 0x17d38031, + 0x30b6a5b0, 0xf9bdb053, 0xded895d2, 0xf6718b8a, 0xd114ae0b, + 0xa623b63a, 0x814693bb, 0xa9ef8de3, 0x8e8aa862, 0xb5fadc26, + 0x929ff9a7, 0xba36e7ff, 0x9d53c27e, 0xea64da4f, 0xcd01ffce, + 0xe5a8e196, 0xc2cdc417, 0x0bc6d1f4, 0x2ca3f475, 0x040aea2d, + 0x236fcfac, 0x5458d79d, 0x733df21c, 0x5b94ec44, 0x7cf1c9c5, + 0x8885b759, 0xafe092d8, 0x87498c80, 0xa02ca901, 0xd71bb130, + 0xf07e94b1, 0xd8d78ae9, 0xffb2af68, 0x36b9ba8b, 0x11dc9f0a, + 0x39758152, 0x1e10a4d3, 0x6927bce2, 0x4e429963, 0x66eb873b, + 0x418ea2ba, 0xcf040ad8, 0xe8612f59, 0xc0c83101, 0xe7ad1480, + 0x909a0cb1, 0xb7ff2930, 0x9f563768, 0xb83312e9, 0x7138070a, + 0x565d228b, 0x7ef43cd3, 0x59911952, 0x2ea60163, 0x09c324e2, + 0x216a3aba, 0x060f1f3b, 0xf27b61a7, 0xd51e4426, 0xfdb75a7e, + 0xdad27fff, 0xade567ce, 0x8a80424f, 0xa2295c17, 0x854c7996, + 0x4c476c75, 0x6b2249f4, 0x438b57ac, 0x64ee722d, 0x13d96a1c, + 0x34bc4f9d, 0x1c1551c5, 0x3b707444, 0x6af5b94d, 0x4d909ccc, + 0x65398294, 0x425ca715, 0x356bbf24, 0x120e9aa5, 0x3aa784fd, + 0x1dc2a17c, 0xd4c9b49f, 0xf3ac911e, 0xdb058f46, 0xfc60aac7, + 0x8b57b2f6, 0xac329777, 0x849b892f, 0xa3feacae, 0x578ad232, + 0x70eff7b3, 0x5846e9eb, 0x7f23cc6a, 0x0814d45b, 0x2f71f1da, + 0x07d8ef82, 0x20bdca03, 0xe9b6dfe0, 0xced3fa61, 0xe67ae439, + 0xc11fc1b8, 0xb628d989, 0x914dfc08, 0xb9e4e250, 0x9e81c7d1, + 0x100b6fb3, 0x376e4a32, 0x1fc7546a, 0x38a271eb, 0x4f9569da, + 0x68f04c5b, 0x40595203, 0x673c7782, 0xae376261, 0x895247e0, + 0xa1fb59b8, 0x869e7c39, 0xf1a96408, 0xd6cc4189, 0xfe655fd1, + 0xd9007a50, 0x2d7404cc, 0x0a11214d, 0x22b83f15, 0x05dd1a94, + 0x72ea02a5, 0x558f2724, 0x7d26397c, 0x5a431cfd, 0x9348091e, + 0xb42d2c9f, 0x9c8432c7, 0xbbe11746, 0xccd60f77, 0xebb32af6, + 0xc31a34ae, 0xe47f112f, 0xdf0f656b, 0xf86a40ea, 0xd0c35eb2, + 0xf7a67b33, 0x80916302, 0xa7f44683, 0x8f5d58db, 0xa8387d5a, + 0x613368b9, 0x46564d38, 0x6eff5360, 0x499a76e1, 0x3ead6ed0, + 0x19c84b51, 0x31615509, 0x16047088, 0xe2700e14, 0xc5152b95, + 0xedbc35cd, 0xcad9104c, 0xbdee087d, 0x9a8b2dfc, 0xb22233a4, + 0x95471625, 0x5c4c03c6, 0x7b292647, 0x5380381f, 0x74e51d9e, + 0x03d205af, 0x24b7202e, 0x0c1e3e76, 0x2b7b1bf7, 0xa5f1b395, + 0x82949614, 0xaa3d884c, 0x8d58adcd, 0xfa6fb5fc, 0xdd0a907d, + 0xf5a38e25, 0xd2c6aba4, 0x1bcdbe47, 0x3ca89bc6, 0x1401859e, + 0x3364a01f, 0x4453b82e, 0x63369daf, 0x4b9f83f7, 0x6cfaa676, + 0x988ed8ea, 0xbfebfd6b, 0x9742e333, 0xb027c6b2, 0xc710de83, + 0xe075fb02, 0xc8dce55a, 0xefb9c0db, 0x26b2d538, 0x01d7f0b9, + 0x297eeee1, 0x0e1bcb60, 0x792cd351, 0x5e49f6d0, 0x76e0e888, + 0x5185cd09}}; + +#endif + +#endif + +#endif + +local const z_crc_t FAR x2n_table[] = { + 0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000, + 0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467, + 0xd7bbfe6a, 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0, + 0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3, 0x31fec169, + 0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37, + 0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a, + 0xc40ba6d0, 0xc4e22c3c}; diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.c new file mode 100644 index 000000000..742827092 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.c @@ -0,0 +1,621 @@ +/* crc32_simd.c + * + * Copyright 2017 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#include "crc32_simd.h" +#if defined(CRC32_SIMD_AVX512_PCLMUL) + +/* + * crc32_avx512_simd_(): compute the crc32 of the buffer, where the buffer + * length must be at least 256, and a multiple of 64. Based on: + * + * "Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction" + * V. Gopal, E. Ozturk, et al., 2009, http://intel.ly/2ySEwL0 + */ + +#include +#include +#include +#include + +uint32_t ZLIB_INTERNAL crc32_avx512_simd_( /* AVX512+PCLMUL */ + const unsigned char *buf, + z_size_t len, + uint32_t crc) +{ + /* + * Definitions of the bit-reflected domain constants k1,k2,k3,k4 + * are similar to those given at the end of the paper, and remaining + * constants and CRC32+Barrett polynomials remain unchanged. + * + * Replace the index of x from 128 to 512. As follows: + * k1 = ( x ^ ( 512 * 4 + 32 ) mod P(x) << 32 )' << 1 = 0x011542778a + * k2 = ( x ^ ( 512 * 4 - 32 ) mod P(x) << 32 )' << 1 = 0x01322d1430 + * k3 = ( x ^ ( 512 + 32 ) mod P(x) << 32 )' << 1 = 0x0154442bd4 + * k4 = ( x ^ ( 512 - 32 ) mod P(x) << 32 )' << 1 = 0x01c6e41596 + */ + static const uint64_t zalign(64) k1k2[] = { 0x011542778a, 0x01322d1430, + 0x011542778a, 0x01322d1430, + 0x011542778a, 0x01322d1430, + 0x011542778a, 0x01322d1430 }; + static const uint64_t zalign(64) k3k4[] = { 0x0154442bd4, 0x01c6e41596, + 0x0154442bd4, 0x01c6e41596, + 0x0154442bd4, 0x01c6e41596, + 0x0154442bd4, 0x01c6e41596 }; + static const uint64_t zalign(16) k5k6[] = { 0x01751997d0, 0x00ccaa009e }; + static const uint64_t zalign(16) k7k8[] = { 0x0163cd6124, 0x0000000000 }; + static const uint64_t zalign(16) poly[] = { 0x01db710641, 0x01f7011641 }; + __m512i x0, x1, x2, x3, x4, x5, x6, x7, x8, y5, y6, y7, y8; + __m128i a0, a1, a2, a3; + + /* + * There's at least one block of 256. + */ + x1 = _mm512_loadu_si512((__m512i *)(buf + 0x00)); + x2 = _mm512_loadu_si512((__m512i *)(buf + 0x40)); + x3 = _mm512_loadu_si512((__m512i *)(buf + 0x80)); + x4 = _mm512_loadu_si512((__m512i *)(buf + 0xC0)); + + x1 = _mm512_xor_si512(x1, _mm512_castsi128_si512(_mm_cvtsi32_si128(crc))); + + x0 = _mm512_load_si512((__m512i *)k1k2); + + buf += 256; + len -= 256; + + /* + * Parallel fold blocks of 256, if any. + */ + while (len >= 256) + { + x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); + x6 = _mm512_clmulepi64_epi128(x2, x0, 0x00); + x7 = _mm512_clmulepi64_epi128(x3, x0, 0x00); + x8 = _mm512_clmulepi64_epi128(x4, x0, 0x00); + + + x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); + x2 = _mm512_clmulepi64_epi128(x2, x0, 0x11); + x3 = _mm512_clmulepi64_epi128(x3, x0, 0x11); + x4 = _mm512_clmulepi64_epi128(x4, x0, 0x11); + + y5 = _mm512_loadu_si512((__m512i *)(buf + 0x00)); + y6 = _mm512_loadu_si512((__m512i *)(buf + 0x40)); + y7 = _mm512_loadu_si512((__m512i *)(buf + 0x80)); + y8 = _mm512_loadu_si512((__m512i *)(buf + 0xC0)); + + x1 = _mm512_xor_si512(x1, x5); + x2 = _mm512_xor_si512(x2, x6); + x3 = _mm512_xor_si512(x3, x7); + x4 = _mm512_xor_si512(x4, x8); + + x1 = _mm512_xor_si512(x1, y5); + x2 = _mm512_xor_si512(x2, y6); + x3 = _mm512_xor_si512(x3, y7); + x4 = _mm512_xor_si512(x4, y8); + + buf += 256; + len -= 256; + } + + /* + * Fold into 512-bits. + */ + x0 = _mm512_load_si512((__m512i *)k3k4); + + x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); + x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); + x1 = _mm512_xor_si512(x1, x2); + x1 = _mm512_xor_si512(x1, x5); + + x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); + x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); + x1 = _mm512_xor_si512(x1, x3); + x1 = _mm512_xor_si512(x1, x5); + + x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); + x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); + x1 = _mm512_xor_si512(x1, x4); + x1 = _mm512_xor_si512(x1, x5); + + /* + * Single fold blocks of 64, if any. + */ + while (len >= 64) + { + x2 = _mm512_loadu_si512((__m512i *)buf); + + x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); + x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); + x1 = _mm512_xor_si512(x1, x2); + x1 = _mm512_xor_si512(x1, x5); + + buf += 64; + len -= 64; + } + + /* + * Fold 512-bits to 384-bits. + */ + a0 = _mm_load_si128((__m128i *)k5k6); + + a1 = _mm512_extracti32x4_epi32(x1, 0); + a2 = _mm512_extracti32x4_epi32(x1, 1); + + a3 = _mm_clmulepi64_si128(a1, a0, 0x00); + a1 = _mm_clmulepi64_si128(a1, a0, 0x11); + + a1 = _mm_xor_si128(a1, a3); + a1 = _mm_xor_si128(a1, a2); + + /* + * Fold 384-bits to 256-bits. + */ + a2 = _mm512_extracti32x4_epi32(x1, 2); + a3 = _mm_clmulepi64_si128(a1, a0, 0x00); + a1 = _mm_clmulepi64_si128(a1, a0, 0x11); + a1 = _mm_xor_si128(a1, a3); + a1 = _mm_xor_si128(a1, a2); + + /* + * Fold 256-bits to 128-bits. + */ + a2 = _mm512_extracti32x4_epi32(x1, 3); + a3 = _mm_clmulepi64_si128(a1, a0, 0x00); + a1 = _mm_clmulepi64_si128(a1, a0, 0x11); + a1 = _mm_xor_si128(a1, a3); + a1 = _mm_xor_si128(a1, a2); + + /* + * Fold 128-bits to 64-bits. + */ + a2 = _mm_clmulepi64_si128(a1, a0, 0x10); + a3 = _mm_setr_epi32(~0, 0, ~0, 0); + a1 = _mm_srli_si128(a1, 8); + a1 = _mm_xor_si128(a1, a2); + + a0 = _mm_loadl_epi64((__m128i*)k7k8); + a2 = _mm_srli_si128(a1, 4); + a1 = _mm_and_si128(a1, a3); + a1 = _mm_clmulepi64_si128(a1, a0, 0x00); + a1 = _mm_xor_si128(a1, a2); + + /* + * Barret reduce to 32-bits. + */ + a0 = _mm_load_si128((__m128i*)poly); + + a2 = _mm_and_si128(a1, a3); + a2 = _mm_clmulepi64_si128(a2, a0, 0x10); + a2 = _mm_and_si128(a2, a3); + a2 = _mm_clmulepi64_si128(a2, a0, 0x00); + a1 = _mm_xor_si128(a1, a2); + + /* + * Return the crc32. + */ + return _mm_extract_epi32(a1, 1); +} + +#elif defined(CRC32_SIMD_SSE42_PCLMUL) + +/* + * crc32_sse42_simd_(): compute the crc32 of the buffer, where the buffer + * length must be at least 64, and a multiple of 16. + */ + +#include +#include +#include + +uint32_t ZLIB_INTERNAL crc32_sse42_simd_( /* SSE4.2+PCLMUL */ + const unsigned char *buf, + z_size_t len, + uint32_t crc) +{ + /* + * Definitions of the bit-reflected domain constants k1,k2,k3, etc and + * the CRC32+Barrett polynomials given at the end of the paper. + */ + static const uint64_t zalign(16) k1k2[] = { 0x0154442bd4, 0x01c6e41596 }; + static const uint64_t zalign(16) k3k4[] = { 0x01751997d0, 0x00ccaa009e }; + static const uint64_t zalign(16) k5k0[] = { 0x0163cd6124, 0x0000000000 }; + static const uint64_t zalign(16) poly[] = { 0x01db710641, 0x01f7011641 }; + + __m128i x0, x1, x2, x3, x4, x5, x6, x7, x8, y5, y6, y7, y8; + + /* + * There's at least one block of 64. + */ + x1 = _mm_loadu_si128((__m128i *)(buf + 0x00)); + x2 = _mm_loadu_si128((__m128i *)(buf + 0x10)); + x3 = _mm_loadu_si128((__m128i *)(buf + 0x20)); + x4 = _mm_loadu_si128((__m128i *)(buf + 0x30)); + + x1 = _mm_xor_si128(x1, _mm_cvtsi32_si128(crc)); + + x0 = _mm_load_si128((__m128i *)k1k2); + + buf += 64; + len -= 64; + + /* + * Parallel fold blocks of 64, if any. + */ + while (len >= 64) + { + x5 = _mm_clmulepi64_si128(x1, x0, 0x00); + x6 = _mm_clmulepi64_si128(x2, x0, 0x00); + x7 = _mm_clmulepi64_si128(x3, x0, 0x00); + x8 = _mm_clmulepi64_si128(x4, x0, 0x00); + + x1 = _mm_clmulepi64_si128(x1, x0, 0x11); + x2 = _mm_clmulepi64_si128(x2, x0, 0x11); + x3 = _mm_clmulepi64_si128(x3, x0, 0x11); + x4 = _mm_clmulepi64_si128(x4, x0, 0x11); + + y5 = _mm_loadu_si128((__m128i *)(buf + 0x00)); + y6 = _mm_loadu_si128((__m128i *)(buf + 0x10)); + y7 = _mm_loadu_si128((__m128i *)(buf + 0x20)); + y8 = _mm_loadu_si128((__m128i *)(buf + 0x30)); + + x1 = _mm_xor_si128(x1, x5); + x2 = _mm_xor_si128(x2, x6); + x3 = _mm_xor_si128(x3, x7); + x4 = _mm_xor_si128(x4, x8); + + x1 = _mm_xor_si128(x1, y5); + x2 = _mm_xor_si128(x2, y6); + x3 = _mm_xor_si128(x3, y7); + x4 = _mm_xor_si128(x4, y8); + + buf += 64; + len -= 64; + } + + /* + * Fold into 128-bits. + */ + x0 = _mm_load_si128((__m128i *)k3k4); + + x5 = _mm_clmulepi64_si128(x1, x0, 0x00); + x1 = _mm_clmulepi64_si128(x1, x0, 0x11); + x1 = _mm_xor_si128(x1, x2); + x1 = _mm_xor_si128(x1, x5); + + x5 = _mm_clmulepi64_si128(x1, x0, 0x00); + x1 = _mm_clmulepi64_si128(x1, x0, 0x11); + x1 = _mm_xor_si128(x1, x3); + x1 = _mm_xor_si128(x1, x5); + + x5 = _mm_clmulepi64_si128(x1, x0, 0x00); + x1 = _mm_clmulepi64_si128(x1, x0, 0x11); + x1 = _mm_xor_si128(x1, x4); + x1 = _mm_xor_si128(x1, x5); + + /* + * Single fold blocks of 16, if any. + */ + while (len >= 16) + { + x2 = _mm_loadu_si128((__m128i *)buf); + + x5 = _mm_clmulepi64_si128(x1, x0, 0x00); + x1 = _mm_clmulepi64_si128(x1, x0, 0x11); + x1 = _mm_xor_si128(x1, x2); + x1 = _mm_xor_si128(x1, x5); + + buf += 16; + len -= 16; + } + + /* + * Fold 128-bits to 64-bits. + */ + x2 = _mm_clmulepi64_si128(x1, x0, 0x10); + x3 = _mm_setr_epi32(~0, 0, ~0, 0); + x1 = _mm_srli_si128(x1, 8); + x1 = _mm_xor_si128(x1, x2); + + x0 = _mm_loadl_epi64((__m128i*)k5k0); + + x2 = _mm_srli_si128(x1, 4); + x1 = _mm_and_si128(x1, x3); + x1 = _mm_clmulepi64_si128(x1, x0, 0x00); + x1 = _mm_xor_si128(x1, x2); + + /* + * Barret reduce to 32-bits. + */ + x0 = _mm_load_si128((__m128i*)poly); + + x2 = _mm_and_si128(x1, x3); + x2 = _mm_clmulepi64_si128(x2, x0, 0x10); + x2 = _mm_and_si128(x2, x3); + x2 = _mm_clmulepi64_si128(x2, x0, 0x00); + x1 = _mm_xor_si128(x1, x2); + + /* + * Return the crc32. + */ + return _mm_extract_epi32(x1, 1); +} + +#elif defined(CRC32_ARMV8_CRC32) + +/* CRC32 checksums using ARMv8-a crypto instructions. + */ + +#if defined(__clang__) +/* We need some extra types for using PMULL. + */ +#if defined(__aarch64__) +#include +#include +#endif + +/* CRC32 intrinsics are #ifdef'ed out of arm_acle.h unless we build with an + * armv8 target, which is incompatible with ThinLTO optimizations on Android. + * (Namely, mixing and matching different module-level targets makes ThinLTO + * warn, and Android defaults to armv7-a. This restriction does not apply to + * function-level `target`s, however.) + * + * Since we only need four crc intrinsics, and since clang's implementation of + * those are just wrappers around compiler builtins, it's simplest to #define + * those builtins directly. If this #define list grows too much (or we depend on + * an intrinsic that isn't a trivial wrapper), we may have to find a better way + * to go about this. + * + * NOTE: clang currently complains that "'+soft-float-abi' is not a recognized + * feature for this target (ignoring feature)." This appears to be a harmless + * bug in clang. + * + * These definitions must appear *after* including arm_acle.h otherwise that + * header may end up defining functions named __builtin_arm_crc32* that call + * themselves, creating an infinite loop when the intrinsic is called. + */ +/* XXX: Cannot hook into builtins with XCode for arm64. */ +#if !defined(ARMV8_OS_MACOS) +#define __crc32b __builtin_arm_crc32b +#define __crc32d __builtin_arm_crc32d +#define __crc32w __builtin_arm_crc32w +#define __crc32cw __builtin_arm_crc32cw +#endif + +#if defined(__aarch64__) +#define TARGET_ARMV8_WITH_CRC __attribute__((target("aes,crc"))) +#else // !defined(__aarch64__) +#define TARGET_ARMV8_WITH_CRC __attribute__((target("armv8-a,crc"))) +#endif // defined(__aarch64__) + +#elif defined(__GNUC__) +/* For GCC, we are setting CRC extensions at module level, so ThinLTO is not + * allowed. We can just include arm_acle.h. + */ +#include +#include +#define TARGET_ARMV8_WITH_CRC +#else // !defined(__GNUC__) && !defined(_aarch64__) +#error ARM CRC32 SIMD extensions only supported for Clang and GCC +#endif + +TARGET_ARMV8_WITH_CRC +uint32_t ZLIB_INTERNAL armv8_crc32_little( + const unsigned char *buf, + z_size_t len, + uint32_t crc) +{ + uint32_t c = (uint32_t) ~crc; + + while (len && ((uintptr_t)buf & 7)) { + c = __crc32b(c, *buf++); + --len; + } + + const uint64_t *buf8 = (const uint64_t *)buf; + + while (len >= 64) { + c = __crc32d(c, *buf8++); + c = __crc32d(c, *buf8++); + c = __crc32d(c, *buf8++); + c = __crc32d(c, *buf8++); + + c = __crc32d(c, *buf8++); + c = __crc32d(c, *buf8++); + c = __crc32d(c, *buf8++); + c = __crc32d(c, *buf8++); + len -= 64; + } + + while (len >= 8) { + c = __crc32d(c, *buf8++); + len -= 8; + } + + buf = (const unsigned char *)buf8; + + while (len--) { + c = __crc32b(c, *buf++); + } + + return ~c; +} + +#if defined(__aarch64__) || defined(ARMV8_OS_MACOS) /* aarch64 specific code. */ + +/* + * crc32_pmull_simd_(): compute the crc32 of the buffer, where the buffer + * length must be at least 64, and a multiple of 16. Based on: + * + * "Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction" + * V. Gopal, E. Ozturk, et al., 2009, http://intel.ly/2ySEwL0 + */ +TARGET_ARMV8_WITH_CRC +static inline uint8x16_t pmull_lo(const uint64x2_t a, const uint64x2_t b) +{ + uint8x16_t r; + __asm__ __volatile__ ("pmull %0.1q, %1.1d, %2.1d \n\t" + : "=w" (r) : "w" (a), "w" (b) ); + return r; +} + +TARGET_ARMV8_WITH_CRC +static inline uint8x16_t pmull_01(const uint64x2_t a, const uint64x2_t b) +{ + uint8x16_t r; + __asm__ __volatile__ ("pmull %0.1q, %1.1d, %2.1d \n\t" + : "=w" (r) : "w" (a), "w" (vgetq_lane_u64(b, 1)) ); + return r; +} + +TARGET_ARMV8_WITH_CRC +static inline uint8x16_t pmull_hi(const uint64x2_t a, const uint64x2_t b) +{ + uint8x16_t r; + __asm__ __volatile__ ("pmull2 %0.1q, %1.2d, %2.2d \n\t" + : "=w" (r) : "w" (a), "w" (b) ); + return r; +} + +TARGET_ARMV8_WITH_CRC +uint32_t ZLIB_INTERNAL armv8_crc32_pmull_little( + const unsigned char *buf, + z_size_t len, + uint32_t crc) +{ + /* + * Definitions of the bit-reflected domain constants k1,k2,k3, etc and + * the CRC32+Barrett polynomials given at the end of the paper. + */ + static const uint64_t zalign(16) k1k2[] = { 0x0154442bd4, 0x01c6e41596 }; + static const uint64_t zalign(16) k3k4[] = { 0x01751997d0, 0x00ccaa009e }; + static const uint64_t zalign(16) k5k0[] = { 0x0163cd6124, 0x0000000000 }; + static const uint64_t zalign(16) poly[] = { 0x01db710641, 0x01f7011641 }; + + uint64x2_t x0, x1, x2, x3, x4, x5, x6, x7, x8, y5, y6, y7, y8; + + /* + * There's at least one block of 64. + */ + x1 = vld1q_u64((const uint64_t *)(buf + 0x00)); + x2 = vld1q_u64((const uint64_t *)(buf + 0x10)); + x3 = vld1q_u64((const uint64_t *)(buf + 0x20)); + x4 = vld1q_u64((const uint64_t *)(buf + 0x30)); + + x1 = veorq_u64(x1, (uint64x2_t) vsetq_lane_u32(crc, vdupq_n_u32(0), 0)); + + x0 = vld1q_u64(k1k2); + + buf += 64; + len -= 64; + + /* + * Parallel fold blocks of 64, if any. + */ + while (len >= 64) + { + x5 = (uint64x2_t) pmull_lo(x1, x0); + x6 = (uint64x2_t) pmull_lo(x2, x0); + x7 = (uint64x2_t) pmull_lo(x3, x0); + x8 = (uint64x2_t) pmull_lo(x4, x0); + + y5 = vld1q_u64((const uint64_t *)(buf + 0x00)); + y6 = vld1q_u64((const uint64_t *)(buf + 0x10)); + y7 = vld1q_u64((const uint64_t *)(buf + 0x20)); + y8 = vld1q_u64((const uint64_t *)(buf + 0x30)); + + x1 = (uint64x2_t) pmull_hi(x1, x0); + x2 = (uint64x2_t) pmull_hi(x2, x0); + x3 = (uint64x2_t) pmull_hi(x3, x0); + x4 = (uint64x2_t) pmull_hi(x4, x0); + + x1 = veorq_u64(x1, x5); + x2 = veorq_u64(x2, x6); + x3 = veorq_u64(x3, x7); + x4 = veorq_u64(x4, x8); + + x1 = veorq_u64(x1, y5); + x2 = veorq_u64(x2, y6); + x3 = veorq_u64(x3, y7); + x4 = veorq_u64(x4, y8); + + buf += 64; + len -= 64; + } + + /* + * Fold into 128-bits. + */ + x0 = vld1q_u64(k3k4); + + x5 = (uint64x2_t) pmull_lo(x1, x0); + x1 = (uint64x2_t) pmull_hi(x1, x0); + x1 = veorq_u64(x1, x2); + x1 = veorq_u64(x1, x5); + + x5 = (uint64x2_t) pmull_lo(x1, x0); + x1 = (uint64x2_t) pmull_hi(x1, x0); + x1 = veorq_u64(x1, x3); + x1 = veorq_u64(x1, x5); + + x5 = (uint64x2_t) pmull_lo(x1, x0); + x1 = (uint64x2_t) pmull_hi(x1, x0); + x1 = veorq_u64(x1, x4); + x1 = veorq_u64(x1, x5); + + /* + * Single fold blocks of 16, if any. + */ + while (len >= 16) + { + x2 = vld1q_u64((const uint64_t *)buf); + + x5 = (uint64x2_t) pmull_lo(x1, x0); + x1 = (uint64x2_t) pmull_hi(x1, x0); + x1 = veorq_u64(x1, x2); + x1 = veorq_u64(x1, x5); + + buf += 16; + len -= 16; + } + + /* + * Fold 128-bits to 64-bits. + */ + static uint32_t zalign(16) mask[] = { ~0u, 0u, ~0u, 0u }; + + x2 = (uint64x2_t) pmull_01(x1, x0); + x1 = (uint64x2_t) vextq_u8(vreinterpretq_u8_u64(x1), vdupq_n_u8(0), 8); + x3 = (uint64x2_t) vld1q_u32(mask); + x1 = veorq_u64(x1, x2); + + x0 = vld1q_u64(k5k0); + + x2 = (uint64x2_t) pmull_01(x2, x0); + x2 = (uint64x2_t) vextq_u8(vreinterpretq_u8_u64(x1), vdupq_n_u8(0), 4); + x1 = vandq_u64(x1, x3); + x1 = (uint64x2_t) pmull_lo(x1, x0); + x1 = veorq_u64(x1, x2); + + /* + * Barret reduce to 32-bits. + */ + x0 = vld1q_u64(poly); + + x2 = vandq_u64(x1, x3); + x2 = (uint64x2_t) pmull_01(x2, x0); + x2 = vandq_u64(x2, x3); + x2 = (uint64x2_t) pmull_lo(x2, x0); + x1 = veorq_u64(x1, x2); + + /* + * Return the crc32. + */ + return vgetq_lane_u32(vreinterpretq_u32_u64(x1), 1); +} +#endif /* aarch64 specific code. */ + +#endif diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.h new file mode 100644 index 000000000..84624647b --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc32_simd.h @@ -0,0 +1,57 @@ +/* crc32_simd.h + * + * Copyright 2017 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#include + +#include "zconf.h" +#include "zutil.h" +#include "deflate.h" + +/* + * crc32_sse42_simd_(): compute the crc32 of the buffer, where the buffer + * length must be at least 64, and a multiple of 16. + */ +uint32_t ZLIB_INTERNAL crc32_sse42_simd_(const unsigned char* buf, + z_size_t len, + uint32_t crc); + +uint32_t ZLIB_INTERNAL crc32_avx512_simd_(const unsigned char* buf, + z_size_t len, + uint32_t crc); + +/* + * crc32_sse42_simd_ buffer size constraints: see the use in zlib/crc32.c + * for computing the crc32 of an arbitrary length buffer. + */ +#define Z_CRC32_SSE42_MINIMUM_LENGTH 64 +#define Z_CRC32_SSE42_CHUNKSIZE_MASK 15 +#define Z_CRC32_AVX512_MINIMUM_LENGTH 256 +#define Z_CRC32_AVX512_CHUNKSIZE_MASK 63 + +/* + * CRC32 checksums using ARMv8-a crypto instructions. + */ +uint32_t ZLIB_INTERNAL armv8_crc32_little(const unsigned char* buf, + z_size_t len, + uint32_t crc); + +/* aarch64 specific code. */ +#if defined(__aarch64__) + +/* 128 is the sweet spot at the time of coding (late 2020). */ +#define Z_CRC32_PMULL_MINIMUM_LENGTH 128 +#define Z_CRC32_PMULL_CHUNKSIZE_MASK 15 + +/* + * CRC32 checksums using ARMv8-a PMULL instructions, where the buffer + * length must be at least 64, and a multiple of 16. + */ +uint32_t ZLIB_INTERNAL armv8_crc32_pmull_little(const unsigned char* buf, + z_size_t len, + uint32_t crc); + +#endif diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/crc_folding.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc_folding.c similarity index 97% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/crc_folding.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc_folding.c index 48d77744a..1b4f4e1d1 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/crc_folding.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/crc_folding.c @@ -18,6 +18,8 @@ #include "deflate.h" +#ifdef CRC32_SIMD_SSE42_PCLMUL + #include #include #include @@ -283,7 +285,7 @@ ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s, goto partial; } - algn_diff = 0 - (uintptr_t)src & 0xF; + algn_diff = (0 - (uintptr_t)src) & 0xF; if (algn_diff) { xmm_crc_part = _mm_loadu_si128((__m128i *)src); _mm_storeu_si128((__m128i *)dst, xmm_crc_part); @@ -433,7 +435,10 @@ unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) unsigned crc; __m128i x_tmp0, x_tmp1, x_tmp2, crc_fold; - CRC_LOAD(s) + __m128i xmm_crc0 = _mm_loadu_si128((__m128i *)s->crc0 + 0); + __m128i xmm_crc1 = _mm_loadu_si128((__m128i *)s->crc0 + 1); + __m128i xmm_crc2 = _mm_loadu_si128((__m128i *)s->crc0 + 2); + __m128i xmm_crc3 = _mm_loadu_si128((__m128i *)s->crc0 + 3); /* * k1 @@ -489,5 +494,6 @@ unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) crc = _mm_extract_epi32(xmm_crc3, 2); return ~crc; - CRC_SAVE(s) } + +#endif /* CRC32_SIMD_SSE42_PCLMUL */ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/deflate.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/deflate.c similarity index 81% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/deflate.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/deflate.c index aa0c9c67a..173ce596b 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/deflate.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -50,10 +50,22 @@ /* @(#) $Id$ */ #include #include "deflate.h" -#include "x86.h" + +#include "cpu_features.h" + +#if defined(DEFLATE_SLIDE_HASH_SSE2) || defined(DEFLATE_SLIDE_HASH_NEON) +#include "slide_hash_simd.h" +#endif + +#include "contrib/optimizations/insert_string.h" + +#ifdef FASTEST +/* See http://crbug.com/1113596 */ +#error "FASTEST is not supported in Chromium's zlib." +#endif const char deflate_copyright[] = - " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.13.1 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -61,9 +73,6 @@ const char deflate_copyright[] = copyright string in the executable of your product. */ -/* =========================================================================== - * Function prototypes. - */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ @@ -71,50 +80,22 @@ typedef enum { finish_done /* finish done, accept no more input or output */ } block_state; -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +typedef block_state (*compress_func)(deflate_state *s, int flush); /* Compression function. Returns the block state after the call. */ -local int deflateStateCheck OF((z_streamp strm)); -local void slide_hash OF((deflate_state *s)); -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); +local block_state deflate_stored(deflate_state *s, int flush); +local block_state deflate_fast(deflate_state *s, int flush); #ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -unsigned ZLIB_INTERNAL read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV -# pragma message("Assembler code may have bugs -- use at your own risk") - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif - -#ifdef ZLIB_DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); +local block_state deflate_slow(deflate_state *s, int flush); #endif +local block_state deflate_rle(deflate_state *s, int flush); +local block_state deflate_huff(deflate_state *s, int flush); /* From crc32.c */ extern void ZLIB_INTERNAL crc_reset(deflate_state *const s); extern void ZLIB_INTERNAL crc_finalize(deflate_state *const s); extern void ZLIB_INTERNAL copy_with_crc(z_streamp strm, Bytef *dst, long size); -#ifdef _MSC_VER -#define INLINE __inline -#else -#define INLINE inline -#endif - -/* Inline optimisation */ -local INLINE Pos insert_string_sse(deflate_state *const s, const Pos str); - /* =========================================================================== * Local data */ @@ -169,63 +150,30 @@ local const config configuration_table[10] = { /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ #define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to UPDATE_HASH are made with consecutive input - * characters, so that a running hash key can be computed from the previous - * key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to INSERT_STRING are made with consecutive input - * characters and the first MIN_MATCH bytes of str are valid (except for - * the last MIN_MATCH-1 bytes of the input file). - */ -local INLINE Pos insert_string_c(deflate_state *const s, const Pos str) -{ - Pos ret; - - UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]); -#ifdef FASTEST - ret = s->head[s->ins_h]; -#else - ret = s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = str; - - return ret; -} - -local INLINE Pos insert_string(deflate_state *const s, const Pos str) -{ - if (x86_cpu_enable_simd) - return insert_string_sse(s, str); - return insert_string_c(s, str); -} - - /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. + * TODO(cavalcantii): optimization opportunity, check comments on: + * https://chromium-review.googlesource.com/c/chromium/src/+/3561506/ */ #define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + do { \ + s->head[s->hash_size - 1] = NIL; \ + zmemzero((Bytef *)s->head, \ + (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \ + } while (0) /* =========================================================================== * Slide the hash table when sliding the window down (could be avoided with 32 * bit values at the expense of memory usage). We slide even when level == 0 to * keep the hash table consistent if we switch back to level > 0 later. */ -local void slide_hash(s) - deflate_state *s; -{ +local void slide_hash(deflate_state *s) { +#if defined(DEFLATE_SLIDE_HASH_SSE2) || defined(DEFLATE_SLIDE_HASH_NEON) + slide_hash_simd(s->head, s->prev, s->w_size, s->hash_size); + return; +#endif + unsigned n, m; Posf *p; uInt wsize = s->w_size; @@ -249,41 +197,207 @@ local void slide_hash(s) #endif } +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size) { + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + /* TODO(cavalcantii): verify if we can remove 'copy_with_crc', it is legacy + * of the Intel optimizations dating back to 2015. + */ +#ifdef GZIP + if (strm->state->wrap == 2) + copy_with_crc(strm, buf, len); + else +#endif + { + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) + strm->adler = adler32(strm->adler, buf, len); + } + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(deflate_state *s) { + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize + MAX_DIST(s)) { + + zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + if (s->insert > s->strstart) + s->insert = s->strstart; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->chromium_zlib_hash) { + /* chromium hash reads 4 bytes */ + if (s->lookahead + s->insert > MIN_MATCH) { + uInt str = s->strstart - s->insert; + while (s->insert) { + insert_string(s, str); + str++; + s->insert--; + if (s->lookahead + s->insert <= MIN_MATCH) + break; + } + } + } else + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + /* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, + int stream_size) { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, int strategy, + const char *version, int stream_size) { unsigned window_padding = 8; deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - x86_check_features(); + // Needed to activate optimized insert_string() that helps compression + // for all wrapper formats (e.g. RAW, ZLIB, GZIP). + // Feature detection is not triggered while using RAW mode (i.e. we never + // call crc32() with a NULL buffer). +#if defined(CRC32_ARMV8_CRC32) || defined(CRC32_SIMD_SSE42_PCLMUL) + cpu_check_features(); +#endif if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { @@ -315,6 +429,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; + if (windowBits < -15) + return Z_STREAM_ERROR; windowBits = -windowBits; } #ifdef GZIP @@ -341,29 +457,77 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; - if (x86_cpu_enable_simd) { + s->chromium_zlib_hash = 1; +#if defined(USE_ZLIB_RABIN_KARP_ROLLING_HASH) + s->chromium_zlib_hash = 0; +#endif + + s->hash_bits = memLevel + 7; + if (s->chromium_zlib_hash && s->hash_bits < 15) { s->hash_bits = 15; - } else { - s->hash_bits = memLevel + 7; } s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size + window_padding, 2*sizeof(Byte)); + /* Avoid use of unitialized values in the window, see crbug.com/1137613 and + * crbug.com/1144420 */ + zmemzero(s->window, (s->w_size + window_padding) * (2 * sizeof(Byte))); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + /* Avoid use of uninitialized value, see: + * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360 + */ + zmemzero(s->prev, s->w_size * sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->high_water = 0; /* nothing written to s->window yet */ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + /* We overlay pending_buf and sym_buf. This works since the average size + * for length/distance pairs over any compressed block is assured to be 31 + * bits or less. + * + * Analysis: The longest fixed codes are a length code of 8 bits plus 5 + * extra bits, for lengths 131 to 257. The longest fixed distance codes are + * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest + * possible fixed-codes length/distance pair is then 31 bits total. + * + * sym_buf starts one-fourth of the way into pending_buf. So there are + * three bytes in sym_buf for every four bytes in pending_buf. Each symbol + * in sym_buf is three bytes -- two for the distance and one for the + * literal/length. As each symbol is consumed, the pointer to the next + * sym_buf value to read moves forward three bytes. From that symbol, up to + * 31 bits are written to pending_buf. The closest the written pending_buf + * bits gets to the next sym_buf symbol to read is just before the last + * code is written. At that time, 31*(n - 2) bits have been written, just + * after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1 + * symbols are written.) The closest the writing gets to what is unread is + * then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and + * can range from 128 to 32768. + * + * Therefore, at a minimum, there are 142 bits of space between what is + * written and what is read in the overlain buffers, so the symbols cannot + * be overwritten by the compressed data. That space is actually 139 bits, + * due to the three-bit fixed-code block header. + * + * That covers the case where either Z_FIXED is specified, forcing fixed + * codes, or when the use of fixed codes is chosen, because that choice + * results in a smaller compressed block than dynamic codes. That latter + * condition then assures that the above analysis also covers all dynamic + * blocks. A dynamic-code block will only be chosen to be emitted if it has + * fewer bits than a fixed-code block would for the same set of symbols. + * Therefore its average symbol length is assured to be less than 31. So + * the compressed data for a dynamic block also cannot overwrite the + * symbols from which it is being constructed. + */ + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { @@ -372,8 +536,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, deflateEnd (strm); return Z_MEM_ERROR; } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s->sym_buf = s->pending_buf + s->lit_bufsize; + s->sym_end = (s->lit_bufsize - 1) * 3; + /* We avoid equality with lit_bufsize*3 because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ s->level = level; s->strategy = strategy; @@ -385,9 +553,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, /* ========================================================================= * Check for a valid deflate stream state. Return 0 if ok, 1 if not. */ -local int deflateStateCheck (strm) - z_streamp strm; -{ +local int deflateStateCheck(z_streamp strm) { deflate_state *s; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -408,11 +574,8 @@ local int deflateStateCheck (strm) } /* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ +int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { deflate_state *s; uInt str, n; int wrap; @@ -473,11 +636,8 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) - z_streamp strm; - Bytef *dictionary; - uInt *dictLength; -{ +int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { deflate_state *s; uInt len; @@ -495,9 +655,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateResetKeep (strm) - z_streamp strm; -{ +int ZEXPORT deflateResetKeep(z_streamp strm) { deflate_state *s; if (deflateStateCheck(strm)) { @@ -519,23 +677,45 @@ int ZEXPORT deflateResetKeep (strm) #ifdef GZIP s->wrap == 2 ? GZIP_STATE : #endif - s->wrap ? INIT_STATE : BUSY_STATE; + INIT_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; + s->last_flush = -2; _tr_init(s); return Z_OK; } +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init(deflate_state *s) { + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +} + /* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ +int ZEXPORT deflateReset(z_streamp strm) { int ret; ret = deflateResetKeep(strm); @@ -545,10 +725,7 @@ int ZEXPORT deflateReset (strm) } /* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) - z_streamp strm; - gz_headerp head; -{ +int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) { if (deflateStateCheck(strm) || strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; @@ -556,11 +733,7 @@ int ZEXPORT deflateSetHeader (strm, head) } /* ========================================================================= */ -int ZEXPORT deflatePending (strm, pending, bits) - unsigned *pending; - int *bits; - z_streamp strm; -{ +int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; @@ -570,17 +743,14 @@ int ZEXPORT deflatePending (strm, pending, bits) } /* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) - z_streamp strm; - int bits; - int value; -{ +int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { deflate_state *s; int put; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + if (bits < 0 || bits > 16 || + s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; do { put = Buf_size - s->bi_valid; @@ -596,11 +766,7 @@ int ZEXPORT deflatePrime (strm, bits, value) } /* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ +int ZEXPORT deflateParams(z_streamp strm, int level, int strategy) { deflate_state *s; compress_func func; @@ -618,12 +784,12 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - s->high_water) { + s->last_flush != -2) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) return err; - if (strm->avail_out == 0) + if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) return Z_BUF_ERROR; } if (s->level != level) { @@ -645,13 +811,8 @@ int ZEXPORT deflateParams(strm, level, strategy) } /* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ +int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy, + int nice_length, int max_chain) { deflate_state *s; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -664,36 +825,47 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) } /* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. + * For the default windowBits of 15 and memLevel of 8, this function returns a + * close to exact, as well as small, upper bound on the compressed size. This + * is an expansion of ~0.03%, plus a small constant. + * + * For any setting other than those defaults for windowBits and memLevel, one + * of two worst case bounds is returned. This is at most an expansion of ~4% or + * ~13%, plus a small constant. + * + * Both the 0.03% and 4% derive from the overhead of stored blocks. The first + * one is for stored blocks of 16383 bytes (memLevel == 8), whereas the second + * is for stored blocks of 127 bytes (the worst case memLevel == 1). The + * expansion results from five bytes of header for each stored block. * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. + * The larger expansion of 13% results from a window size less than or equal to + * the symbols buffer size (windowBits <= memLevel + 7). In that case some of + * the data being compressed may have slid out of the sliding window, impeding + * a stored block from being emitted. Then the only choice is a fixed or + * dynamic block, where a fixed block limits the maximum expansion to 9 bits + * per 8-bit byte, plus 10 bits for every block. The smallest block size for + * which this can occur is 255 (memLevel == 2). * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. + * Shifts are used to approximate divisions, for speed. */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ +uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) { deflate_state *s; - uLong complen, wraplen; + uLong fixedlen, storelen, wraplen; - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + /* upper bound for fixed blocks with 9-bit literals and length 255 + (memLevel == 2, which is the lowest that may not use stored blocks) -- + ~13% overhead plus a small constant */ + fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) + + (sourceLen >> 9) + 4; - /* if can't get parameters, return conservative bound plus zlib wrapper */ + /* upper bound for stored blocks with length 127 (memLevel == 1) -- + ~4% overhead plus a small constant */ + storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + + (sourceLen >> 11) + 7; + + /* if can't get parameters, return larger bound plus a zlib wrapper */ if (deflateStateCheck(strm)) - return complen + 6; + return (fixedlen > storelen ? fixedlen : storelen) + 6; /* compute wrapper length */ s = strm->state; @@ -730,11 +902,13 @@ uLong ZEXPORT deflateBound(strm, sourceLen) wraplen = 6; } - /* if not default parameters, return conservative bound */ + /* if not default parameters, return one of the conservative bounds */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; + return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + + wraplen; - /* default settings: return tight bound for that case */ + /* default settings: return tight bound for that case -- ~0.03% overhead + plus a small constant */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } @@ -744,10 +918,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ +local void putShortMSB(deflate_state *s, uInt b) { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } @@ -758,9 +929,7 @@ local void putShortMSB (s, b) * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ -local void flush_pending(strm) - z_streamp strm; -{ +local void flush_pending(z_streamp strm) { unsigned len; deflate_state *s = strm->state; @@ -791,10 +960,7 @@ local void flush_pending(strm) } while (0) /* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ +int ZEXPORT deflate(z_streamp strm, int flush) { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; @@ -842,9 +1008,11 @@ int ZEXPORT deflate (strm, flush) } /* Write the header */ + if (s->status == INIT_STATE && s->wrap == 0) + s->status = BUSY_STATE; if (s->status == INIT_STATE) { /* zlib header */ - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) @@ -1105,9 +1273,7 @@ int ZEXPORT deflate (strm, flush) } /* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ +int ZEXPORT deflateEnd(z_streamp strm) { int status; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1131,16 +1297,14 @@ int ZEXPORT deflateEnd (strm) * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ +int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { #ifdef MAXSEG_64K + (void)dest; + (void)source; return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; - ushf *overlay; if (deflateStateCheck(source) || dest == Z_NULL) { @@ -1160,8 +1324,7 @@ int ZEXPORT deflateCopy (dest, source) ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1175,8 +1338,7 @@ int ZEXPORT deflateCopy (dest, source) zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + ds->sym_buf = ds->pending_buf + ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1186,72 +1348,6 @@ int ZEXPORT deflateCopy (dest, source) #endif /* MAXSEG_64K */ } -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -ZLIB_INTERNAL unsigned read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - -#ifdef GZIP - if (strm->state->wrap == 2) - copy_with_crc(strm, buf, len); - else -#endif - { - zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) - strm->adler = adler32(strm->adler, buf, len); - } - strm->next_in += len; - strm->total_in += len; - - return len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and @@ -1262,14 +1358,7 @@ local void lm_init (s) * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ @@ -1290,10 +1379,10 @@ local uInt longest_match(s, cur_match) */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); + register ush scan_end = *(ushf*)(scan + best_len - 1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end1 = scan[best_len - 1]; register Byte scan_end = scan[best_len]; #endif @@ -1311,7 +1400,8 @@ local uInt longest_match(s, cur_match) */ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); @@ -1329,53 +1419,72 @@ local uInt longest_match(s, cur_match) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ - if (*(ushf*)(match+best_len-1) != scan_end || + if (*(ushf*)(match + best_len - 1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient + * strstart + 3, + 5, up to strstart + 257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * at strstart + 257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ - Assert(scan[2] == match[2], "scan[2]?"); + if (!s->chromium_zlib_hash) { + Assert(scan[2] == match[2], "scan[2]?"); + } else { + /* When using CRC hashing, scan[2] and match[2] may mismatch, but in + * that case at least one of the other hashed bytes will mismatch + * also. Bytes 0 and 1 were already checked above, and we know there + * are at least four bytes to check otherwise the mismatch would have + * been found by the scan_end comparison above, so: */ + Assert(scan[2] == match[2] || scan[3] != match[3], "scan[2]??"); + } scan++, match++; do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + } while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + /* Here, scan <= window + strstart + 257 */ + Assert(scan <= s->window+(unsigned)(s->window_size - 1), + "wild scan"); if (*scan == *match) scan++; - len = (MAX_MATCH - 1) - (int)(strend-scan); + len = (MAX_MATCH - 1) - (int)(strend - scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || + match[best_len - 1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; - Assert(*scan == *match, "match[2]?"); + if (!s->chromium_zlib_hash) { + Assert(*scan == *match, "match[2]?"); + } else { + /* When using CRC hashing, scan[2] and match[2] may mismatch, but in + * that case at least one of the other hashed bytes will mismatch + * also. Bytes 0 and 1 were already checked above, and we know there + * are at least four bytes to check otherwise the mismatch would have + * been found by the scan_end comparison above, so: */ + Assert(*scan == *match || scan[1] != match[1], "match[2]??"); + } /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1384,7 +1493,8 @@ local uInt longest_match(s, cur_match) *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), + "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; @@ -1396,9 +1506,9 @@ local uInt longest_match(s, cur_match) best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); + scan_end = *(ushf*)(scan + best_len - 1); #else - scan_end1 = scan[best_len-1]; + scan_end1 = scan[best_len - 1]; scan_end = scan[best_len]; #endif } @@ -1408,17 +1518,13 @@ local uInt longest_match(s, cur_match) if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } -#endif /* ASMV */ #else /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for FASTEST only */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ @@ -1429,7 +1535,8 @@ local uInt longest_match(s, cur_match) */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); Assert(cur_match < s->strstart, "no future"); @@ -1439,7 +1546,7 @@ local uInt longest_match(s, cur_match) */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that @@ -1449,7 +1556,7 @@ local uInt longest_match(s, cur_match) Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1458,7 +1565,7 @@ local uInt longest_match(s, cur_match) *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); @@ -1478,11 +1585,7 @@ local uInt longest_match(s, cur_match) /* =========================================================================== * Check that the match at match_start is indeed a match. */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ +local void check_match(deflate_state *s, IPos start, IPos match, int length) { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { @@ -1494,7 +1597,7 @@ local void check_match(s, start, match, length) z_error("invalid match"); } if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); + fprintf(stderr,"\\[%d,%d]", start - match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } @@ -1502,147 +1605,6 @@ local void check_match(s, start, match, length) # define check_match(s, start, match, length) #endif /* ZLIB_DEBUG */ -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window_c(deflate_state *s); - -local void fill_window(deflate_state *s) -{ - if (x86_cpu_enable_simd) { - fill_window_sse(s); - return; - } - - fill_window_c(s); -} - -local void fill_window_c(s) - deflate_state *s; -{ - unsigned n; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - slide_hash(s); - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - uInt str = s->strstart - s->insert; - s->ins_h = s->window[str]; - UPDATE_HASH(s, s->ins_h, s->window[str + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - while (s->insert) { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} - /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. @@ -1683,12 +1645,9 @@ local void fill_window_c(s) * * deflate_stored() is written to minimize the number of times an input byte is * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. + * maximizes the opportunities to have a single copy from next_in to next_out. */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_stored(deflate_state *s, int flush) { /* Smallest worthy block size when not flushing or finishing. By default * this is 32K. This can be as small as 507 bytes for memLevel == 1. For * large input and output buffers, the stored block size will be larger. @@ -1787,6 +1746,7 @@ local block_state deflate_stored(s, flush) s->matches = 2; /* clear hash */ zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); s->strstart = s->w_size; + s->insert = s->strstart; } else { if (s->window_size - s->strstart <= used) { @@ -1795,12 +1755,14 @@ local block_state deflate_stored(s, flush) zmemcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ + if (s->insert > s->strstart) + s->insert = s->strstart; } zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); s->strstart += used; + s->insert += MIN(used, s->w_size - s->insert); } s->block_start = s->strstart; - s->insert += MIN(used, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1815,7 +1777,7 @@ local block_state deflate_stored(s, flush) return block_done; /* Fill the window with any remaining input. */ - have = s->window_size - s->strstart - 1; + have = s->window_size - s->strstart; if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { /* Slide the window down. */ s->block_start -= s->w_size; @@ -1824,12 +1786,15 @@ local block_state deflate_stored(s, flush) if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ have += s->w_size; /* more space now */ + if (s->insert > s->strstart) + s->insert = s->strstart; } if (have > s->strm->avail_in) have = s->strm->avail_in; if (have) { read_buf(s->strm, s->window + s->strstart, have); s->strstart += have; + s->insert += MIN(have, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1866,10 +1831,7 @@ local block_state deflate_stored(s, flush) * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_fast(deflate_state *s, int flush) { IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ @@ -1887,7 +1849,7 @@ local block_state deflate_fast(s, flush) if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -1934,19 +1896,22 @@ local block_state deflate_fast(s, flush) { s->strstart += s->match_length; s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + + if (!s->chromium_zlib_hash) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]); #if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times + Call UPDATE_HASH() MIN_MATCH-3 more times #endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -1957,7 +1922,7 @@ local block_state deflate_fast(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -1968,10 +1933,7 @@ local block_state deflate_fast(s, flush) * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_slow(deflate_state *s, int flush) { IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ @@ -1990,7 +1952,7 @@ local block_state deflate_slow(s, flush) if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -2032,17 +1994,23 @@ local block_state deflate_slow(s, flush) uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ - check_match(s, s->strstart-1, s->prev_match, s->prev_length); + if (s->prev_match == -1) { + /* The window has slid one byte past the previous match, + * so the first byte cannot be compared. */ + check_match(s, s->strstart, s->prev_match + 1, s->prev_length - 1); + } else { + check_match(s, s->strstart - 1, s->prev_match, s->prev_length); + } - _tr_tally_dist(s, s->strstart -1 - s->prev_match, + _tr_tally_dist(s, s->strstart - 1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not + * strstart - 1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ - s->lookahead -= s->prev_length-1; + s->lookahead -= s->prev_length - 1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { @@ -2060,8 +2028,8 @@ local block_state deflate_slow(s, flush) * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } @@ -2079,8 +2047,8 @@ local block_state deflate_slow(s, flush) } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); s->match_available = 0; } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; @@ -2088,7 +2056,7 @@ local block_state deflate_slow(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2099,10 +2067,7 @@ local block_state deflate_slow(s, flush) * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_rle(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ uInt prev; /* byte at distance one to match */ Bytef *scan, *strend; /* scan goes up to strend for length of run */ @@ -2137,7 +2102,8 @@ local block_state deflate_rle(s, flush) if (s->match_length > s->lookahead) s->match_length = s->lookahead; } - Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (uInt)(s->window_size - 1), + "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ @@ -2152,7 +2118,7 @@ local block_state deflate_rle(s, flush) } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -2163,7 +2129,7 @@ local block_state deflate_rle(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2172,10 +2138,7 @@ local block_state deflate_rle(s, flush) * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. * (It will be regenerated if this run of deflate switches away from Huffman.) */ -local block_state deflate_huff(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_huff(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ for (;;) { @@ -2192,7 +2155,7 @@ local block_state deflate_huff(s, flush) /* Output a literal byte */ s->match_length = 0; Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); @@ -2202,41 +2165,7 @@ local block_state deflate_huff(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } - -/* Safe to inline this as GCC/clang will use inline asm and Visual Studio will - * use intrinsic without extra params - */ -local INLINE Pos insert_string_sse(deflate_state *const s, const Pos str) -{ - Pos ret; - unsigned *ip, val, h = 0; - - ip = (unsigned *)&s->window[str]; - val = *ip; - - if (s->level >= 6) - val &= 0xFFFFFF; - -/* Windows clang should use inline asm */ -#if defined(_MSC_VER) && !defined(__clang__) - h = _mm_crc32_u32(h, val); -#elif defined(__i386__) || defined(__amd64__) - __asm__ __volatile__ ( - "crc32 %1,%0\n\t" - : "+r" (h) - : "r" (val) - ); -#else - /* This should never happen */ - assert(0); -#endif - - ret = s->head[h & s->hash_mask]; - s->head[h & s->hash_mask] = str; - s->prev[str & s->w_mask] = ret; - return ret; -} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/deflate.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/deflate.h similarity index 90% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/deflate.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/deflate.h index ab56df766..f16419110 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/deflate.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2016 Jean-loup Gailly + * Copyright (C) 1995-2018 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -109,8 +109,8 @@ typedef struct internal_state { ulg gzindex; /* where in extra, name, or comment */ Byte method; /* can only be DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ - unsigned zalign(16) crc0[4 * 5]; - /* used by deflate.c: */ + unsigned crc0[4 * 5]; + /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ @@ -217,7 +217,7 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ - uchf *l_buf; /* buffer for literals or lengths */ + uchf *sym_buf; /* buffer for distances and literals/lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,13 +239,8 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ + uInt sym_next; /* running index in sym_buf */ + uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ @@ -273,6 +268,11 @@ typedef struct internal_state { * updated to the new high water mark. */ + uInt chromium_zlib_hash; + /* 0 if Rabin-Karp rolling hash is enabled, non-zero if chromium zlib + * hash is enabled. + */ + } FAR deflate_state; /* Output a byte on the stream. @@ -296,14 +296,14 @@ typedef struct internal_state { memory checker errors from longest match routines */ /* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_init(deflate_state *s); +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc); +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last); +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s); +void ZLIB_INTERNAL _tr_align(deflate_state *s); +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) @@ -325,20 +325,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = cc; \ s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (uch)(length); \ ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ + s->sym_buf[s->sym_next++] = (uch)dist; \ + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \ + s->sym_buf[s->sym_next++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) @@ -354,6 +356,4 @@ void ZLIB_INTERNAL crc_fold_copy(deflate_state* const s, long len); unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state* const s); -void ZLIB_INTERNAL fill_window_sse(deflate_state* s); - #endif /* DEFLATE_H */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/BUILD.gn b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/BUILD.gn new file mode 100644 index 000000000..122cef573 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/BUILD.gn @@ -0,0 +1,59 @@ +# Copyright 2017 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build_overrides/build.gni") + +if (build_with_chromium && is_ios) { + import("//build/config/ios/bundle_data_from_filelist.gni") +} + +if (build_with_chromium) { + static_library("zip") { + sources = [ + "redact.h", + "zip.cc", + "zip.h", + "zip_internal.cc", + "zip_internal.h", + "zip_reader.cc", + "zip_reader.h", + "zip_writer.cc", + "zip_writer.h", + ] + deps = [ + "..:minizip", + "//base", + "//base:i18n", + ] + } + + static_library("compression_utils") { + sources = [ + "compression_utils.cc", + "compression_utils.h", + ] + deps = [ + "..", + "//base", + ] + public_deps = [ ":compression_utils_portable" ] + } + + if (is_ios) { + bundle_data_from_filelist("zlib_pak_bundle_data") { + testonly = true + filelist_name = "test_data.filelist" + } + } +} + +# This allows other users of Chromium's zlib library, but don't use Chromium's +# //base, to reuse some boilerplate code. +static_library("compression_utils_portable") { + sources = [ + "compression_utils_portable.cc", + "compression_utils_portable.h", + ] + public_deps = [ ".." ] +} diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/DEPS b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/DEPS new file mode 100644 index 000000000..7ec5343ee --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/DEPS @@ -0,0 +1,7 @@ +include_rules = [ + '+base', + '+build', + '+testing', + '+third_party/icu/source/i18n/unicode', + '+third_party/zlib/zlib.h', +] diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/OWNERS b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/OWNERS similarity index 77% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/OWNERS rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/OWNERS index 1ca253146..868af3cc6 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/OWNERS +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/OWNERS @@ -3,3 +3,4 @@ satorux@chromium.org # compression_utils* asvitkine@chromium.org isherman@chromium.org +cavalcantii@chromium.org diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc new file mode 100644 index 000000000..279ea0732 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.cc @@ -0,0 +1,134 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/zlib/google/compression_utils.h" + +#include "base/bit_cast.h" +#include "base/check_op.h" +#include "base/process/memory.h" +#include "base/sys_byteorder.h" + +#include "third_party/zlib/google/compression_utils_portable.h" + +namespace compression { + +bool GzipCompress(base::span input, + char* output_buffer, + size_t output_buffer_size, + size_t* compressed_size, + void* (*malloc_fn)(size_t), + void (*free_fn)(void*)) { + static_assert(sizeof(Bytef) == 1, ""); + + // uLongf can be larger than size_t. + uLongf compressed_size_long = static_cast(output_buffer_size); + if (zlib_internal::GzipCompressHelper( + base::bit_cast(output_buffer), &compressed_size_long, + base::bit_cast(input.data()), + static_cast(input.size()), malloc_fn, free_fn) != Z_OK) { + return false; + } + // No overflow, as compressed_size_long <= output.size() which is a size_t. + *compressed_size = static_cast(compressed_size_long); + return true; +} + +bool GzipCompress(base::span input, std::string* output) { + return GzipCompress(base::as_bytes(input), output); +} + +bool GzipCompress(base::span input, std::string* output) { + // Not using std::vector<> because allocation failures are recoverable, + // which is hidden by std::vector<>. + static_assert(sizeof(Bytef) == 1, ""); + const uLongf input_size = static_cast(input.size()); + + uLongf compressed_data_size = + zlib_internal::GzipExpectedCompressedSize(input_size); + + Bytef* compressed_data; + if (!base::UncheckedMalloc(compressed_data_size, + reinterpret_cast(&compressed_data))) { + return false; + } + + if (zlib_internal::GzipCompressHelper( + compressed_data, &compressed_data_size, + base::bit_cast(input.data()), input_size, nullptr, + nullptr) != Z_OK) { + free(compressed_data); + return false; + } + + Bytef* resized_data = + reinterpret_cast(realloc(compressed_data, compressed_data_size)); + if (!resized_data) { + free(compressed_data); + return false; + } + output->assign(resized_data, resized_data + compressed_data_size); + DCHECK_EQ(input_size, GetUncompressedSize(*output)); + + free(resized_data); + return true; +} + +bool GzipUncompress(const std::string& input, std::string* output) { + std::string uncompressed_output; + uLongf uncompressed_size = static_cast(GetUncompressedSize(input)); + if (size_t{uncompressed_size} > uncompressed_output.max_size()) + return false; + + uncompressed_output.resize(uncompressed_size); + if (zlib_internal::GzipUncompressHelper( + base::bit_cast(uncompressed_output.data()), + &uncompressed_size, base::bit_cast(input.data()), + static_cast(input.length())) == Z_OK) { + output->swap(uncompressed_output); + return true; + } + return false; +} + +bool GzipUncompress(base::span input, + base::span output) { + return GzipUncompress(base::as_bytes(input), base::as_bytes(output)); +} + +bool GzipUncompress(base::span input, + base::span output) { + uLongf uncompressed_size = GetUncompressedSize(input); + if (uncompressed_size > output.size()) + return false; + return zlib_internal::GzipUncompressHelper( + base::bit_cast(output.data()), &uncompressed_size, + base::bit_cast(input.data()), + static_cast(input.size())) == Z_OK; +} + +bool GzipUncompress(base::span input, std::string* output) { + return GzipUncompress(base::as_bytes(input), output); +} + +bool GzipUncompress(base::span input, std::string* output) { + // Disallow in-place usage, i.e., |input| using |*output| as underlying data. + DCHECK_NE(reinterpret_cast(input.data()), output->data()); + uLongf uncompressed_size = GetUncompressedSize(input); + output->resize(uncompressed_size); + return zlib_internal::GzipUncompressHelper( + base::bit_cast(output->data()), &uncompressed_size, + base::bit_cast(input.data()), + static_cast(input.size())) == Z_OK; +} + +uint32_t GetUncompressedSize(base::span compressed_data) { + return GetUncompressedSize(base::as_bytes(compressed_data)); +} + +uint32_t GetUncompressedSize(base::span compressed_data) { + return zlib_internal::GetGzipUncompressedSize( + base::bit_cast(compressed_data.data()), compressed_data.size()); +} + +} // namespace compression diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.h new file mode 100644 index 000000000..ea399816f --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils.h @@ -0,0 +1,70 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_H_ +#define THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_H_ + +#include + +#include "base/containers/span.h" + +namespace compression { + +// Compresses the data in |input| using gzip, storing the result in +// |output_buffer|, of size |output_buffer_size|. If the buffer is large enough +// and compression succeeds, |compressed_size| points to the compressed data +// size after the call. +// |malloc_fn| and |free_fn| are pointers to malloc() and free()-like functions, +// or nullptr to use the standard ones. +// Returns true for success. +bool GzipCompress(base::span input, + char* output_buffer, + size_t output_buffer_size, + size_t* compressed_size, + void* (*malloc_fn)(size_t), + void (*free_fn)(void*)); + +// Compresses the data in |input| using gzip, storing the result in |output|. +// |input| and |output| are allowed to point to the same string (in-place +// operation). +// Returns true for success. +bool GzipCompress(base::span input, std::string* output); + +// Like the above method, but using uint8_t instead. +bool GzipCompress(base::span input, std::string* output); + +// Uncompresses the data in |input| using gzip, storing the result in |output|. +// |input| and |output| are allowed to be the same string (in-place operation). +// Returns true for success. +bool GzipUncompress(const std::string& input, std::string* output); + +// Like the above method, but uses base::span to avoid allocations if +// needed. |output|'s size must be at least as large as the return value from +// GetUncompressedSize. +// Returns true for success. +bool GzipUncompress(base::span input, + base::span output); + +// Like the above method, but using uint8_t instead. +bool GzipUncompress(base::span input, + base::span output); + +// Uncompresses the data in |input| using gzip, and writes the results to +// |output|, which must NOT be the underlying string of |input|, and is resized +// if necessary. +// Returns true for success. +bool GzipUncompress(base::span input, std::string* output); + +// Like the above method, but using uint8_t instead. +bool GzipUncompress(base::span input, std::string* output); + +// Returns the uncompressed size from GZIP-compressed |compressed_data|. +uint32_t GetUncompressedSize(base::span compressed_data); + +// Like the above method, but using uint8_t instead. +uint32_t GetUncompressedSize(base::span compressed_data); + +} // namespace compression + +#endif // THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.cc new file mode 100644 index 000000000..49d6bfe9e --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.cc @@ -0,0 +1,205 @@ +/* compression_utils_portable.cc + * + * Copyright 2019 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#include "compression_utils_portable.h" + +#include +#include +#include + +namespace zlib_internal { + +// The difference in bytes between a zlib header and a gzip header. +const size_t kGzipZlibHeaderDifferenceBytes = 16; + +// Pass an integer greater than the following get a gzip header instead of a +// zlib header when calling deflateInit2() and inflateInit2(). +const int kWindowBitsToGetGzipHeader = 16; + +// This describes the amount of memory zlib uses to compress data. It can go +// from 1 to 9, with 8 being the default. For details, see: +// http://www.zlib.net/manual.html (search for memLevel). +const int kZlibMemoryLevel = 8; + +// The expected compressed size is based on the input size factored by +// internal Zlib constants (e.g. window size, etc) plus the wrapper +// header size. +uLongf GzipExpectedCompressedSize(uLongf input_size) { + return kGzipZlibHeaderDifferenceBytes + compressBound(input_size); +} + +// The expected decompressed size is stored in the last +// 4 bytes of |input| in LE. See https://tools.ietf.org/html/rfc1952#page-5 +uint32_t GetGzipUncompressedSize(const Bytef* compressed_data, size_t length) { + uint32_t size; + if (length < sizeof(size)) + return 0; + + memcpy(&size, &compressed_data[length - sizeof(size)], sizeof(size)); +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return size; +#else + return __builtin_bswap32(size); +#endif +} + +// The number of window bits determines the type of wrapper to use - see +// https://cs.chromium.org/chromium/src/third_party/zlib/zlib.h?l=566 +inline int ZlibStreamWrapperType(WrapperType type) { + if (type == ZLIB) // zlib DEFLATE stream wrapper + return MAX_WBITS; + if (type == GZIP) // gzip DEFLATE stream wrapper + return MAX_WBITS + kWindowBitsToGetGzipHeader; + if (type == ZRAW) // no wrapper, use raw DEFLATE + return -MAX_WBITS; + return 0; +} + +int GzipCompressHelper(Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length, + void* (*malloc_fn)(size_t), + void (*free_fn)(void*)) { + return CompressHelper(GZIP, dest, dest_length, source, source_length, + Z_DEFAULT_COMPRESSION, malloc_fn, free_fn); +} + +// This code is taken almost verbatim from third_party/zlib/compress.c. The only +// difference is deflateInit2() is called which allows different window bits to +// be set. > 16 causes a gzip header to be emitted rather than a zlib header, +// and negative causes no header to emitted. +// +// Compression level can be a number from 1-9, with 1 being the fastest, 9 being +// the best compression. The default, which the GZIP helper uses, is 6. +int CompressHelper(WrapperType wrapper_type, + Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length, + int compression_level, + void* (*malloc_fn)(size_t), + void (*free_fn)(void*)) { + if (compression_level < 0 || compression_level > 9) { + compression_level = Z_DEFAULT_COMPRESSION; + } + + z_stream stream; + + // FIXME(cavalcantii): z_const is not defined as 'const'. + stream.next_in = static_cast(const_cast(source)); + stream.avail_in = static_cast(source_length); + stream.next_out = dest; + stream.avail_out = static_cast(*dest_length); + if (static_cast(stream.avail_out) != *dest_length) + return Z_BUF_ERROR; + + // Cannot convert capturing lambdas to function pointers directly, hence the + // structure. + struct MallocFreeFunctions { + void* (*malloc_fn)(size_t); + void (*free_fn)(void*); + } malloc_free = {malloc_fn, free_fn}; + + if (malloc_fn) { + if (!free_fn) + return Z_BUF_ERROR; + + auto zalloc = [](void* opaque, uInt items, uInt size) { + return reinterpret_cast(opaque)->malloc_fn(items * + size); + }; + auto zfree = [](void* opaque, void* address) { + return reinterpret_cast(opaque)->free_fn(address); + }; + + stream.zalloc = static_cast(zalloc); + stream.zfree = static_cast(zfree); + stream.opaque = static_cast(&malloc_free); + } else { + stream.zalloc = static_cast(0); + stream.zfree = static_cast(0); + stream.opaque = static_cast(0); + } + + int err = deflateInit2(&stream, compression_level, Z_DEFLATED, + ZlibStreamWrapperType(wrapper_type), kZlibMemoryLevel, + Z_DEFAULT_STRATEGY); + if (err != Z_OK) + return err; + + // This has to exist outside of the if statement to prevent it going off the + // stack before deflate(), which will use this object. + gz_header gzip_header; + if (wrapper_type == GZIP) { + memset(&gzip_header, 0, sizeof(gzip_header)); + err = deflateSetHeader(&stream, &gzip_header); + if (err != Z_OK) + return err; + } + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *dest_length = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +int GzipUncompressHelper(Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length) { + return UncompressHelper(GZIP, dest, dest_length, source, source_length); +} + +// This code is taken almost verbatim from third_party/zlib/uncompr.c. The only +// difference is inflateInit2() is called which allows different window bits to +// be set. > 16 causes a gzip header to be emitted rather than a zlib header, +// and negative causes no header to emitted. +int UncompressHelper(WrapperType wrapper_type, + Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length) { + z_stream stream; + + // FIXME(cavalcantii): z_const is not defined as 'const'. + stream.next_in = static_cast(const_cast(source)); + stream.avail_in = static_cast(source_length); + if (static_cast(stream.avail_in) != source_length) + return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = static_cast(*dest_length); + if (static_cast(stream.avail_out) != *dest_length) + return Z_BUF_ERROR; + + stream.zalloc = static_cast(0); + stream.zfree = static_cast(0); + + int err = inflateInit2(&stream, ZlibStreamWrapperType(wrapper_type)); + if (err != Z_OK) + return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *dest_length = stream.total_out; + + err = inflateEnd(&stream); + return err; +} + +} // namespace zlib_internal diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.h new file mode 100644 index 000000000..92b033e88 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_portable.h @@ -0,0 +1,63 @@ +/* compression_utils_portable.h + * + * Copyright 2019 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ +#ifndef THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_PORTABLE_H_ +#define THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_PORTABLE_H_ + +#include + +/* TODO(cavalcantii): remove support for Chromium ever building with a system + * zlib. + */ +#if defined(USE_SYSTEM_ZLIB) +#include +/* AOSP build requires relative paths. */ +#else +#include "zlib.h" +#endif + +namespace zlib_internal { + +enum WrapperType { + ZLIB, + GZIP, + ZRAW, +}; + +uLongf GzipExpectedCompressedSize(uLongf input_size); + +uint32_t GetGzipUncompressedSize(const Bytef* compressed_data, size_t length); + +int GzipCompressHelper(Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length, + void* (*malloc_fn)(size_t), + void (*free_fn)(void*)); + +int CompressHelper(WrapperType wrapper_type, + Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length, + int compression_level, + void* (*malloc_fn)(size_t), + void (*free_fn)(void*)); + +int GzipUncompressHelper(Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length); + +int UncompressHelper(WrapperType wrapper_type, + Bytef* dest, + uLongf* dest_length, + const Bytef* source, + uLong source_length); + +} // namespace zlib_internal + +#endif // THIRD_PARTY_ZLIB_GOOGLE_COMPRESSION_UTILS_PORTABLE_H_ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils_unittest.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_unittest.cc similarity index 80% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils_unittest.cc rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_unittest.cc index adcb77376..8e24387ee 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/compression_utils_unittest.cc +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/compression_utils_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,10 +7,9 @@ #include #include +#include #include -#include "base/logging.h" -#include "base/macros.h" #include "testing/gtest/include/gtest/gtest.h" namespace compression { @@ -34,24 +33,33 @@ const uint8_t kCompressedData[] = { } // namespace TEST(CompressionUtilsTest, GzipCompression) { - std::string data(reinterpret_cast(kData), arraysize(kData)); + std::string data(reinterpret_cast(kData), std::size(kData)); std::string compressed_data; EXPECT_TRUE(GzipCompress(data, &compressed_data)); std::string golden_compressed_data( reinterpret_cast(kCompressedData), - arraysize(kCompressedData)); + std::size(kCompressedData)); EXPECT_EQ(golden_compressed_data, compressed_data); } TEST(CompressionUtilsTest, GzipUncompression) { std::string compressed_data(reinterpret_cast(kCompressedData), - arraysize(kCompressedData)); + std::size(kCompressedData)); std::string uncompressed_data; EXPECT_TRUE(GzipUncompress(compressed_data, &uncompressed_data)); std::string golden_data(reinterpret_cast(kData), - arraysize(kData)); + std::size(kData)); + EXPECT_EQ(golden_data, uncompressed_data); +} + +TEST(CompressionUtilsTest, GzipUncompressionFromSpanToString) { + std::string uncompressed_data; + EXPECT_TRUE(GzipUncompress(kCompressedData, &uncompressed_data)); + + std::string golden_data(reinterpret_cast(kData), + std::size(kData)); EXPECT_EQ(golden_data, uncompressed_data); } @@ -76,10 +84,10 @@ TEST(CompressionUtilsTest, LargeInput) { TEST(CompressionUtilsTest, InPlace) { const std::string original_data(reinterpret_cast(kData), - arraysize(kData)); + std::size(kData)); const std::string golden_compressed_data( reinterpret_cast(kCompressedData), - arraysize(kCompressedData)); + std::size(kCompressedData)); std::string data(original_data); EXPECT_TRUE(GzipCompress(data, &data)); diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/redact.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/redact.h new file mode 100644 index 000000000..df6bcafc2 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/redact.h @@ -0,0 +1,31 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef THIRD_PARTY_ZLIB_GOOGLE_REDACT_H_ +#define THIRD_PARTY_ZLIB_GOOGLE_REDACT_H_ + +#include + +#include "base/files/file_path.h" +#include "base/logging.h" + +namespace zip { + +// Redacts file paths in log messages. +// Example: +// LOG(ERROR) << "Cannot open " << Redact(path); +class Redact { + public: + explicit Redact(const base::FilePath& path) : path_(path) {} + + friend std::ostream& operator<<(std::ostream& out, const Redact&& r) { + return LOG_IS_ON(INFO) ? out << "'" << r.path_ << "'" : out << "(redacted)"; + } + + private: + const base::FilePath& path_; +}; + +} // namespace zip + +#endif // THIRD_PARTY_ZLIB_GOOGLE_REDACT_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Different Encryptions.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Different Encryptions.zip new file mode 100644 index 0000000000000000000000000000000000000000..858e7c74b61ee656a677a0661105b561959379db GIT binary patch literal 1083 zcmWIWW@h1HW&nbdRWgAOp5E>h2eLt!7l@s6QWJ|pQY%XIN-9c1GBS%5fG97&L?JaV zxu~+BBsE2kD*$MMF*74WGQ%sN2|!H@CP1tJ#G(w`46ZPR3XZP9x`sv;Ad?tpvNJF- zIJz=2Ff3>1-=}j&=&)?E>}>}F+0+-6Z1FCyBRRviFo^W-=hk9tHN3f`ROgS-f-5TC zOBZZ@sC%dxVdGn7t4{2wh^`T1TY=Od{s-sO8+ zKCd>nezmgsMR;YSdQ;T?>q`_XxTgnB6*G$oHC~Fa^&`|)8=STpnVKQn3JhO?ljo!v zpK#a)?+CF~H!XUiXd(DL1)iJM`>red=%ogr#m(5bp$^0K25%T3&XY(7Q zl~geFKn#i}LzqS(5vh~%)kHurROL1 literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Empty Dir Same Name As File.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Empty Dir Same Name As File.zip new file mode 100644 index 0000000000000000000000000000000000000000..e26c42d158ccc295a62a8c740fccf6be0ad27666 GIT binary patch literal 218 zcmWIWW@Zs#00Hfyf{<5#H~Dh`*&xgT#6_tEsfi`2DQ=lX#U%=9nK`KeDC&Vq;D8gz zf~nUJ@MdHZVa9DROjiRVhy~Mzt_!9LM1zcn00D--js`#`Oc&5HRyL3n6A2MH- F0RS0yBUk_c literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Mixed Paths.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Mixed Paths.zip new file mode 100644 index 0000000000000000000000000000000000000000..881f498599744758d61c396ba943c940d7bc8f43 GIT binary patch literal 12814 zcmaKz3v?9K8OOs*AfiG+1fnn~AWF=Fys`4ygrJ0EAwha1DoYrWZ8q7k4+tVyJ&=k} zX$2KTPeHWSS6k01RIK(v5v`AE1=~_R6~VStdn(kUB7*k2Gqd;m{@=vvxt_gu|G#_h z%$>bEJHHs4)v0rz0`t$xr?WMKuYTs+=hACax=@*sNN2J&4T+4C$V_s)S`2`L4}VqB zkAkM0N2R1BQq}A_749-O>C9`fsA|VfPOYDO)rAC`(%bKZ@-@p-em@!2k$w+5yLi~0 zt~nr6&ZZKXmUU_xT&E_*vk`3wKlF!}V*Lp+rKf?-yqCG@a1ZJY?561E@&$#2o6^B_ zW6whbgVRe#eBOfsrgWlW4lRGS={1JGckR?-*=q?$F?i1nCmuA1Zc0b5S5B5-^kBC5 zE}VeqwM2!#_{;kn&!PTI>Fo7e0%;XLnEYUkoJNGh5fyFNc;er38gY@O*Er`f1Wwz)pXol#iLaJI3GQsZP(4OFrO7u z&Z1(v#2HZ)r*z^cZGVCFOXBBWm=x%ys05@r1#48y=W??bfZ#Y z7B=mQF@grfu3b93uNC=Mu~LRYZQ)V`QN`ccrOh zl8$PKh4KvnM(5XTwWVuz{8eIQxpc}oa{H4O%QxU?OZv=QEhiXDw7AYK7V@h&(j!Oz zalhGCO)>jNbyFhgI>&#w^>&MK6OMMxf+uI1ebAJyRB95*#jdm3azP!TRi7p9l~6R5 zOf@@`EELocdUkrjVYzD6Zd0Pp1Fy26XhV41N89^+gQjOncPcSAUFSAuouL-BEeJNf zv#=bd8c(}f=SGV~{W?PZKk2kbei-QsW~wDj1>={$f5(?FMyjbP?i5=h>emt4+Uw)$ zzH}s}n6b)Q>yq)Ncs4<2a_8DSB> zipY*dkG~_2t!!y7o^-CZOi)MY+yN!W&!=ND#ccZXnitatv@Vr)otrEv8xgTq^52ms&2UBeZf` z|J@hR5t?H5u+mg+5q{Y1tN>+BqX5IeAe{Yp$nl;G2^zmv2CQebd zJKaqtovxPls{s;Rv#&4dzU3ks(-d<6)!B5Sx!$R9(@lxycs7-G_C8=cXzxv&!TskJ z*UA}`HML|{@Q*0JipV|Bm)|IN(}-e%IznAu?{T5Lg3WeVl`c)B?ObgOf}1aYq`Um4 zwlSV0Hz9iTozHKRUw51{ufhXIOfzoPS$UT>aD? zSas~6+>=d*karYNKIOLQ@}ec#h`01|09EXFq*Ujpu~9cECe>rrxSf4S}H% z{U#jq^PXEyJG66{Vm=vx?+(R2L!6j_lPC=zqcTujFSST2*P|^cus(OI8k);n-Xb(`yW$*--e5 z3{RW)E!#7_#_-NM_f`3EiB`=XWz(jD@%~pP=czc~Zd3e9jBo7Nc(IC)mc5V0c=3Jb zJ*VP)^G&^v!T7U}c6&v|$I9NvV!Ytf4s%s}oQ#jd_`Unj8mi*sWqdrwyS}|=mx@o2 z@d+6J!H2)vtKt)7d?LoTPrjv}j90{Jc$rKE;{#H;+f73XE5xLT$?r+N)iab6~ht7Yo+M87r_=VhX}TBdup4LYIXyi62V%hb7TdtAkN znJBK7>F(W+_Em9SCW@Tuw6_;vQhbc4U#u-`cE{o7km9$rb zZ9#C=?jOAeQ;Q3)Q9+g1tPUOfbTYSA?VAwq4f@Y_%=3KTi)ci<5JpDPOCt<~8PTwI zAPg__VWS455z!rJ@4+4Xj$VTCz$4YpgF)jiv;on>YSrP>JqylED>t-`YvIB17K(ey z181kD2hZ+71L*#>`r!C}uYaA_{)6);ynJW??LZh9NUDXNn}-OkL713LgpnI~#M*^$ zzLoMM3pAj8h!2=0c*F-ntDuz#4{IV%3o*VM!HH=*!o-V)@a+g9+K(`D(nIJbm~4qYXIhUi6(M~V=n))93lc^a z5|Z~L$Y?{t%qC(2LxPBQB#i7M1ndZc+K({UfqZdZk07H32{U7eVLK8~!7pCzN0@3P ziscB7rS%9?4-u8OBRG=wBh0)-j8r2ymX;&T^(3ul)d)gbjxbb4kX0iHX*t5s%>;oK zK~Rek27f`IkRpg_EyCDwGs(OZK}c&6hK79QhzN54+Hi13IqE1%k^@hc)*PJQ?&V27AfQzT1F!jj zQ5G7~s)M19q+{~3LQ~pwFf~z7{xdb4q?Q~^wi4N{*1!(5*x(LcpbkPh17R&R7%rsW z|MXl8<63KQd^E*LZD3r>4UX4R+_xJ@XurY4dLjb9frvI7j66pOS&kqcT>9E`aQyES z7mfolZ8;blNWY+j;lRmh$HCZq!dP%1r4^6|nc7v%TQLHwQ(sF~TokW4wKv0Vf1`iVmN&`VHH5j~zew()=G7#4) zgYhMV=S@by1lOf@8O&@YrhR#VqiTKO_h5eU9HSoc_5vC0FPJH!C)CznAf){TPc=r6 zH4FBWNAH{cUfT;EYn{YGzkjs4;NkWG*WT``odvU9=?QJrvk-W2T3awNj)=N;2yHHy zaLpK=y1+5CykKH85%knopE@lt82GIZgm!A}Fqk;*6QLi>T4OLVh#oG{q>RSEl=S%R=w83Di zKA-}7ftdCejBU4Ady~}ig1NVe`&w0jgKJsAos6XCerzg`(yoH3dZGeXfrz#hj2Lt6 z`3eNIv0&f@0z7AdfVLJ4{FeaFTOgp#1p|ZV&sKbOfrOS9OjP;=-!9WzX4ljHf{9f= zK~KhU46QJjc+w~6;W!f7VleTxPtfymB(%t2qLBW$j*grjkt3m91``u~f}WBip>+lm z4L(5+%8}4UgNgfmf}WKlp``{B`-z~Z>tr>M&|ZUyPkbV@f?91bF@%&MjS*TwZ8w;x z_KDC6YQe$8?LHA&LG3u0c-kjIE2uRG6Nh~ww1V1nFmWFJDV47}@a$^Y!Ng>r2(6&@ x9ZWP4k=GqKiWVNsY$ry@4#c$XVC;~YoaZ~b(4(A!f>!$XIJI>%|I0(c{{Uhu%dY?c literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Parent Dir Same Name As File.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Parent Dir Same Name As File.zip new file mode 100644 index 0000000000000000000000000000000000000000..76cfd906edcf69420bd0890af86cc65b4b9645f6 GIT binary patch literal 241 zcmWIWW@Zs#00Hfyf{<5#H~Dh`*&xgT#6_tEsfi`2DQ=lX#U%=9nK`KeDC*10j(z0@ zssmwuB=!2msmb|yDZyY8s*jOLgc-L@K+Ry#zzCvX_6B&P>O!{F*1oT<2Dasv;f0jM-U6ibYius UqiSPi1DV4Fgn2;P55!>r04Tf~v;Y7A literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Repeated File Name With Different Cases.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Repeated File Name With Different Cases.zip new file mode 100644 index 0000000000000000000000000000000000000000..9eb44e1a507eb9762373b179f622840a7583a664 GIT binary patch literal 313 zcmWIWW@Zs#00Hfyf)J0^dM`d88-!Va*g3H{)i<*uHANvA$WkygGz>sdA9Uh*GA~da z2!qsvRQcqWrxrof8yTT0Z!=$Yod>84gu%u;2D^q96u^`l2Y53wi7?}K4p18yG%$iF xkmJyGpgRbno`Io((E!K;z4!*T^Qia$_5f;2Eu7Tx);P@0024OGW!4k literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Repeated File Name.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Repeated File Name.zip new file mode 100644 index 0000000000000000000000000000000000000000..4a3e7b13c66a4a97893bcfa86f683f8cb833c19a GIT binary patch literal 227 zcmWIWW@Zs#00Hfyf{<5#H~Dh`*&xgT#6_tEsfi`2DQ=lX#U%=9nK`KeDC*10j(z0@ zssmwU^}(sh`FSZ&4U9}8%($%p>I8!ZMi2$FFu)sC7rI3dJq!#Dj0PyWSlK`_OhA|e Jq!U3L1_1j*E6e}@ literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/SJIS Bug 846195.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/SJIS Bug 846195.zip new file mode 100644 index 0000000000000000000000000000000000000000..078300284e634ae6cc639ef7ab4f6942bd0d2e30 GIT binary patch literal 479 zcmWIWW@Zs#U|`??;`xkG+-L8n0$GJXEDyvJ!kV@=Eov@l_Gs>Ij@J+N@(hl*FgA6L zZ;sI`sVLz+ZOC`XfrsV5`Zbprc%3|Knzk%la`Q*cCf5%Of2cT}J)Zb$=S=lg`n$YY z=5u9Ud^yn~SNvezGMl2rTZ}#>!E+WT{3~%?E%7rc?N|trrB}Mq@Ix0Ba5E&oY@p& z%Mjqr$RxsmJA{BvU|?iW08v0dAiR(b!{!-~5fH-`VH!rjYXRP@Y#{wiK)4b}D=>n1 E06cr4rvLx| literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Windows Special Names.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Windows Special Names.zip new file mode 100644 index 0000000000000000000000000000000000000000..4fac907fa754b07364376c9a9e1eb894331fa789 GIT binary patch literal 3985 zcmZ{nSx8i27>38C%{JRDB2QA(MHty?&??l0<_w_`v@z6FlY_#jWqZ+blMzK5byEZ_ zgf~HvW(5(2WfxI5EjQi;Ezpfn6!re+KQrI|y+@TF&pE!&`TjYt&ZDu)y!^2d^U-x` zZ_U&t4|k2gu~`GKRwdJoO*K1{jb5^GvFD$~6!5sX_0BK^&C0{7uC2<(aje62t>ZQh zN64&v8}{6^r{k&XZI38k>c&fTd`k4odw1^`@2R{;!0Kg3R~BL$W(~62DQ#+zmx~*i zb3LW#@Y~yC5H_nI1I5#&JNBuqHTjn`TCna+Y7`K&1_x+pV0dD6qI=tD#LXI#!NOb^ zto!ox9nJHY^DpRaZt3Xlp?O}I>jV7IzWgvf8i1jR_L832Jnq|ZRYh}3bM{|HV!GB3hk|<5-7hZQnn|4ae3>7{@yNx3%D*8(vYnK6_^z z>+p@OiEj6ItRlK*PBv{$bbMl2s+QtqZoEv#&*avXP<*Z%pR41uE{*J@_&hg0PsclM z4Sr4W`EGo^jz@ZP)>3?d8(*N~7hepVPVt3qe4&mH`qX}(;)~q)A{{^b^~p1em%H(D z9ly5pK#?1-iq%L>=0wLQH8dZkxYUF=)zrEr-Ai$)32~}v_N(zbDK0f3PBpdv9#u?n zsR?naDerF4Ns3ENh*M1$t``5KxYUF=)s%noTAboi6XI0Uxd*q#Q(S67oNAhRaMFp9 zcqcMzAXY_Hw4!pF^y;7Lst!K5*`p@J9pP5tBvzS|J2tO>MPrQraU{ol2^6gnmb3*T zks~>CaELc5p24CPV6z2aYCVEoEyQU{z`dGaT?^3}%m^VYY(c&ULwsH9IV@~}O7O(| zclW^6nqylFw<+MPaW%!V7V3P4>I-943--ohfo}CMHnmXsx&BMD-sUIIo)&CL7VB%1 zENS6d43|-~-Xlv|pf*7LDp}uzr7Sne#UGtwWKFS?g(?RXI9VfXWkGfU@x818HnRYi z0Qhd!0NYuB=Ky>^Yk&kZ~vNLPYV&X1Pq`FR<#g^ECC5< zf^98Cn&uyoI<7 z0u~81$o>}Mr6ocQvciSvwM3{vwzv?}p)Twy)F6voh#E_T8f2FXam*5-23hAq+_OZe zK{mP&J(dVH$Wj-g5dQ{RtLp~Y>q0C8VJ*+Cv)F}6n<>882VjSh$P9db#I@^Kk;s2* CY2@hu literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Wrong CRC.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/Wrong CRC.zip new file mode 100644 index 0000000000000000000000000000000000000000..ee9a1ef05431f98929214db4fcdca68724dc121d GIT binary patch literal 231 zcmWIWW@h1H00EvDw_xK1r}E8#Y!K#UkYRAnFDfc6C`nDxE2$_64dG;9p8hT-aTXAl zR&X;gvS=u>Ft7y2Gctr^WELx=W#*(RWF!_VB&DY2DI{kk=B1~mC?uwpq!uY;mJ};E z2RSR01ErJma|=pAhH?dXGcw6Bo^T*C@+4Vp^=yjj^miWz}07)aNF GI1B(~IW;Q) literal 0 HcmV?d00001 diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/create_test_zip.sh b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/create_test_zip.sh similarity index 51% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/create_test_zip.sh rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/create_test_zip.sh index e19d67537..620e8f6d6 100755 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/create_test_zip.sh +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/create_test_zip.sh @@ -1,15 +1,17 @@ #!/bin/bash # -# Copyright (c) 2011 The Chromium Authors. All rights reserved. +# Copyright 2011 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # -# Run this script in its directory to recreate test.zip -# and test_nocompress.zip. +# Run this script in its directory to recreate test.zip, test_nocompress.zip, +# and test_encrypted.zip rm test.zip rm test_nocompress.zip +rm test_encrypted.zip pushd test zip -r ../test.zip . zip -r -0 ../test_nocompress.zip . +zip -P "fake_password" -r ../test_encrypted.zip . popd diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/empty.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/empty.zip new file mode 100644 index 0000000000000000000000000000000000000000..15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7 GIT binary patch literal 22 NcmWIWW@Tf*000g10H*)| literal 0 HcmV?d00001 diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/evil.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/evil.zip similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/evil.zip rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/evil.zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_absolute_file_name.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_absolute_file_name.zip similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_absolute_file_name.zip rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_absolute_file_name.zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_invalid_utf8.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_invalid_utf8.zip similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_invalid_utf8.zip rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/evil_via_invalid_utf8.zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test.zip similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test.zip rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test.zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo.txt b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo.txt similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo.txt rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo.txt diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar.txt b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar.txt similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar.txt rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar.txt diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/.hidden b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/.hidden similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/.hidden rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/.hidden diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/baz.txt b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/baz.txt similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/baz.txt rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/baz.txt diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/quux.txt b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/quux.txt similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/quux.txt rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test/foo/bar/quux.txt diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test_encrypted.zip b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test/data/test_encrypted.zip new file mode 100644 index 0000000000000000000000000000000000000000..5e2a75759a19148515c4a0850f66cc58ffb16be8 GIT binary patch literal 5325 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 xP+Fc|2SRFs5IHQ&}+5?S(h6`mzJ!z~1 k8U+m_%8XjlxEE*?G`w&b#mWX$!@vTBI*beqe?S}t00Hb}KmY&$ literal 0 HcmV?d00001 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.filelist b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.filelist new file mode 100644 index 000000000..0a9d20bce --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.filelist @@ -0,0 +1,32 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# NOTE: this file is generated by build/ios/update_bundle_filelist.py +# If it requires updating, you should get a presubmit error with +# instructions on how to regenerate. Otherwise, do not edit. +test/data/Different Encryptions.zip +test/data/Empty Dir Same Name As File.zip +test/data/Mixed Paths.zip +test/data/Parent Dir Same Name As File.zip +test/data/README.md +test/data/Repeated Dir Name.zip +test/data/Repeated File Name With Different Cases.zip +test/data/Repeated File Name.zip +test/data/SJIS Bug 846195.zip +test/data/Windows Special Names.zip +test/data/Wrong CRC.zip +test/data/create_test_zip.sh +test/data/empty.zip +test/data/evil.zip +test/data/evil_via_absolute_file_name.zip +test/data/evil_via_invalid_utf8.zip +test/data/test.zip +test/data/test/foo.txt +test/data/test/foo/bar.txt +test/data/test/foo/bar/.hidden +test/data/test/foo/bar/baz.txt +test/data/test/foo/bar/quux.txt +test/data/test_encrypted.zip +test/data/test_mismatch_size.zip +test/data/test_nocompress.zip +test/data/test_posix_permissions.zip diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.globlist b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.globlist new file mode 100644 index 000000000..117a1e507 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/test_data.globlist @@ -0,0 +1,8 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# See build/ios/update_bundle_filelist.py for details on how .globlist +# files are used to update their .filelist counterparts. +test/data/** +test/data/test/foo/bar/.hidden \ No newline at end of file diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.cc new file mode 100644 index 000000000..87065b918 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.cc @@ -0,0 +1,274 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/zlib/google/zip.h" + +#include +#include + +#include "base/files/file.h" +#include "base/files/file_enumerator.h" +#include "base/files/file_util.h" +#include "base/functional/bind.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/strings/string_util.h" +#include "build/build_config.h" +#include "third_party/zlib/google/redact.h" +#include "third_party/zlib/google/zip_internal.h" +#include "third_party/zlib/google/zip_reader.h" +#include "third_party/zlib/google/zip_writer.h" + +namespace zip { +namespace { + +bool IsHiddenFile(const base::FilePath& file_path) { + return file_path.BaseName().value()[0] == '.'; +} + +// Creates a directory at |extract_dir|/|entry_path|, including any parents. +bool CreateDirectory(const base::FilePath& extract_dir, + const base::FilePath& entry_path) { + const base::FilePath dir = extract_dir.Append(entry_path); + const bool ok = base::CreateDirectory(dir); + PLOG_IF(ERROR, !ok) << "Cannot create directory " << Redact(dir); + return ok; +} + +// Creates a WriterDelegate that can write a file at |extract_dir|/|entry_path|. +std::unique_ptr CreateFilePathWriterDelegate( + const base::FilePath& extract_dir, + const base::FilePath& entry_path) { + return std::make_unique( + extract_dir.Append(entry_path)); +} + +class DirectFileAccessor : public FileAccessor { + public: + explicit DirectFileAccessor(base::FilePath src_dir) + : src_dir_(std::move(src_dir)) {} + + ~DirectFileAccessor() override = default; + + bool Open(const Paths paths, std::vector* const files) override { + DCHECK(files); + files->reserve(files->size() + paths.size()); + + for (const base::FilePath& path : paths) { + DCHECK(!path.IsAbsolute()); + const base::FilePath absolute_path = src_dir_.Append(path); + if (base::DirectoryExists(absolute_path)) { + files->emplace_back(); + LOG(ERROR) << "Cannot open " << Redact(path) << ": It is a directory"; + } else { + const base::File& file = files->emplace_back( + absolute_path, base::File::FLAG_OPEN | base::File::FLAG_READ); + LOG_IF(ERROR, !file.IsValid()) + << "Cannot open " << Redact(path) << ": " + << base::File::ErrorToString(file.error_details()); + } + } + + return true; + } + + bool List(const base::FilePath& path, + std::vector* const files, + std::vector* const subdirs) override { + DCHECK(!path.IsAbsolute()); + DCHECK(files); + DCHECK(subdirs); + + base::FileEnumerator file_enumerator( + src_dir_.Append(path), false /* recursive */, + base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES); + + while (!file_enumerator.Next().empty()) { + const base::FileEnumerator::FileInfo info = file_enumerator.GetInfo(); + (info.IsDirectory() ? subdirs : files) + ->push_back(path.Append(info.GetName())); + } + + return true; + } + + bool GetInfo(const base::FilePath& path, Info* const info) override { + DCHECK(!path.IsAbsolute()); + DCHECK(info); + + base::File::Info file_info; + if (!base::GetFileInfo(src_dir_.Append(path), &file_info)) { + PLOG(ERROR) << "Cannot get info of " << Redact(path); + return false; + } + + info->is_directory = file_info.is_directory; + info->last_modified = file_info.last_modified; + + return true; + } + + private: + const base::FilePath src_dir_; +}; + +} // namespace + +std::ostream& operator<<(std::ostream& out, const Progress& progress) { + return out << progress.bytes << " bytes, " << progress.files << " files, " + << progress.directories << " dirs, " << progress.errors + << " errors"; +} + +bool Zip(const ZipParams& params) { + DirectFileAccessor default_accessor(params.src_dir); + FileAccessor* const file_accessor = params.file_accessor ?: &default_accessor; + + std::unique_ptr zip_writer; + +#if defined(OS_POSIX) || defined(OS_FUCHSIA) + if (params.dest_fd != base::kInvalidPlatformFile) { + DCHECK(params.dest_file.empty()); + zip_writer = + internal::ZipWriter::CreateWithFd(params.dest_fd, file_accessor); + if (!zip_writer) + return false; + } +#endif + + if (!zip_writer) { + zip_writer = internal::ZipWriter::Create(params.dest_file, file_accessor); + if (!zip_writer) + return false; + } + + zip_writer->SetProgressCallback(params.progress_callback, + params.progress_period); + zip_writer->SetRecursive(params.recursive); + zip_writer->ContinueOnError(params.continue_on_error); + + if (!params.include_hidden_files || params.filter_callback) + zip_writer->SetFilterCallback(base::BindRepeating( + [](const ZipParams* const params, const base::FilePath& path) -> bool { + return (params->include_hidden_files || !IsHiddenFile(path)) && + (!params->filter_callback || + params->filter_callback.Run(params->src_dir.Append(path))); + }, + ¶ms)); + + if (params.src_files.empty()) { + // No source items are specified. Zip the entire source directory. + zip_writer->SetRecursive(true); + if (!zip_writer->AddDirectoryContents(base::FilePath())) + return false; + } else { + // Only zip the specified source items. + if (!zip_writer->AddMixedEntries(params.src_files)) + return false; + } + + return zip_writer->Close(); +} + +bool Unzip(const base::FilePath& src_file, + const base::FilePath& dest_dir, + UnzipOptions options) { + base::File file(src_file, base::File::FLAG_OPEN | base::File::FLAG_READ); + if (!file.IsValid()) { + PLOG(ERROR) << "Cannot open " << Redact(src_file) << ": " + << base::File::ErrorToString(file.error_details()); + return false; + } + + DLOG_IF(WARNING, !base::IsDirectoryEmpty(dest_dir)) + << "ZIP extraction directory is not empty: " << dest_dir; + + return Unzip(file.GetPlatformFile(), + base::BindRepeating(&CreateFilePathWriterDelegate, dest_dir), + base::BindRepeating(&CreateDirectory, dest_dir), + std::move(options)); +} + +bool Unzip(const base::PlatformFile& src_file, + WriterFactory writer_factory, + DirectoryCreator directory_creator, + UnzipOptions options) { + ZipReader reader; + reader.SetEncoding(std::move(options.encoding)); + reader.SetPassword(std::move(options.password)); + + if (!reader.OpenFromPlatformFile(src_file)) { + LOG(ERROR) << "Cannot open ZIP from file handle " << src_file; + return false; + } + + while (const ZipReader::Entry* const entry = reader.Next()) { + if (entry->is_unsafe) { + LOG(ERROR) << "Found unsafe entry " << Redact(entry->path) << " in ZIP"; + if (!options.continue_on_error) + return false; + continue; + } + + if (options.filter && !options.filter.Run(entry->path)) { + VLOG(1) << "Skipped ZIP entry " << Redact(entry->path); + continue; + } + + if (entry->is_directory) { + // It's a directory. + if (!directory_creator.Run(entry->path)) { + LOG(ERROR) << "Cannot create directory " << Redact(entry->path); + if (!options.continue_on_error) + return false; + } + + continue; + } + + // It's a file. + std::unique_ptr writer = writer_factory.Run(entry->path); + if (!writer || + (options.progress ? !reader.ExtractCurrentEntryWithListener( + writer.get(), options.progress) + : !reader.ExtractCurrentEntry(writer.get()))) { + LOG(ERROR) << "Cannot extract file " << Redact(entry->path) + << " from ZIP"; + if (!options.continue_on_error) + return false; + } + } + + return reader.ok(); +} + +bool ZipWithFilterCallback(const base::FilePath& src_dir, + const base::FilePath& dest_file, + FilterCallback filter) { + DCHECK(base::DirectoryExists(src_dir)); + return Zip({.src_dir = src_dir, + .dest_file = dest_file, + .filter_callback = std::move(filter)}); +} + +bool Zip(const base::FilePath& src_dir, + const base::FilePath& dest_file, + bool include_hidden_files) { + return Zip({.src_dir = src_dir, + .dest_file = dest_file, + .include_hidden_files = include_hidden_files}); +} + +#if defined(OS_POSIX) || defined(OS_FUCHSIA) +bool ZipFiles(const base::FilePath& src_dir, + Paths src_relative_paths, + int dest_fd) { + DCHECK(base::DirectoryExists(src_dir)); + return Zip({.src_dir = src_dir, + .dest_fd = dest_fd, + .src_files = src_relative_paths}); +} +#endif // defined(OS_POSIX) || defined(OS_FUCHSIA) + +} // namespace zip diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.h new file mode 100644 index 000000000..ea8778681 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip.h @@ -0,0 +1,219 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_ +#define THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_ + +#include +#include +#include +#include + +#include "base/containers/span.h" +#include "base/files/file_path.h" +#include "base/files/platform_file.h" +#include "base/functional/callback.h" +#include "base/time/time.h" +#include "build/build_config.h" + +namespace base { +class File; +} + +namespace zip { + +class WriterDelegate; + +// Paths passed as span to avoid copying them. +using Paths = base::span; + +// Abstraction for file access operation required by Zip(). +// +// Can be passed to the ZipParams for providing custom access to the files, +// for example over IPC. +// +// All parameters paths are expected to be relative to the source directory. +class FileAccessor { + public: + virtual ~FileAccessor() = default; + + struct Info { + bool is_directory = false; + base::Time last_modified; + }; + + // Opens files specified in |paths|. + // Directories should be mapped to invalid files. + virtual bool Open(Paths paths, std::vector* files) = 0; + + // Lists contents of a directory at |path|. + virtual bool List(const base::FilePath& path, + std::vector* files, + std::vector* subdirs) = 0; + + // Gets info about a file or directory. + virtual bool GetInfo(const base::FilePath& path, Info* info) = 0; +}; + +// Progress of a ZIP creation operation. +struct Progress { + // Total number of bytes read from files getting zipped so far. + std::int64_t bytes = 0; + + // Number of file entries added to the ZIP so far. + // A file entry is added after its bytes have been processed. + int files = 0; + + // Number of directory entries added to the ZIP so far. + // A directory entry is added before items in it. + int directories = 0; + + // Number of errors encountered so far (files that cannot be opened, + // directories that cannot be listed). + int errors = 0; +}; + +// Prints Progress to output stream. +std::ostream& operator<<(std::ostream& out, const Progress& progress); + +// Callback reporting the progress of a ZIP creation operation. +// +// This callback returns a boolean indicating whether the ZIP creation operation +// should continue. If it returns false once, then the ZIP creation operation is +// immediately cancelled and the callback won't be called again. +using ProgressCallback = base::RepeatingCallback; + +using FilterCallback = base::RepeatingCallback; + +// ZIP creation parameters and options. +struct ZipParams { + // Source directory. Ignored if |file_accessor| is set. + base::FilePath src_dir; + + // Abstraction around file system access used to read files. + // If left null, an implementation that accesses files directly is used. + FileAccessor* file_accessor = nullptr; // Not owned + + // Destination file path. + // Either dest_file or dest_fd should be set, but not both. + base::FilePath dest_file; + +#if defined(OS_POSIX) || defined(OS_FUCHSIA) + // Destination file passed a file descriptor. + // Either dest_file or dest_fd should be set, but not both. + int dest_fd = base::kInvalidPlatformFile; +#endif + + // The relative paths to the files and directories that should be included in + // the ZIP file. If this is empty, the whole contents of |src_dir| are + // included. + // + // These paths must be relative to |src_dir| and will be used as the file + // names in the created ZIP file. All files must be under |src_dir| in the + // file system hierarchy. + // + // All the paths in |src_files| are included in the created ZIP file, + // irrespective of |include_hidden_files| and |filter_callback|. + Paths src_files; + + // Filter used to exclude files from the ZIP file. This is only taken in + // account when recursively adding subdirectory contents. + FilterCallback filter_callback; + + // Optional progress reporting callback. + ProgressCallback progress_callback; + + // Progress reporting period. The final callback is always called when the ZIP + // creation operation completes. + base::TimeDelta progress_period; + + // Should add hidden files? This is only taken in account when recursively + // adding subdirectory contents. + bool include_hidden_files = true; + + // Should recursively add subdirectory contents? + bool recursive = false; + + // Should ignore errors when discovering files and zipping them? + bool continue_on_error = false; +}; + +// Zip files specified into a ZIP archives. The source files and ZIP destination +// files (as well as other settings) are specified in |params|. +bool Zip(const ZipParams& params); + +// Zip the contents of src_dir into dest_file. src_path must be a directory. +// An entry will *not* be created in the zip for the root folder -- children +// of src_dir will be at the root level of the created zip. For each file in +// src_dir, include it only if the callback |filter_cb| returns true. Otherwise +// omit it. +bool ZipWithFilterCallback(const base::FilePath& src_dir, + const base::FilePath& dest_file, + FilterCallback filter_cb); + +// Convenience method for callers who don't need to set up the filter callback. +// If |include_hidden_files| is true, files starting with "." are included. +// Otherwise they are omitted. +bool Zip(const base::FilePath& src_dir, + const base::FilePath& dest_file, + bool include_hidden_files); + +#if defined(OS_POSIX) || defined(OS_FUCHSIA) +// Zips files listed in |src_relative_paths| to destination specified by file +// descriptor |dest_fd|, without taking ownership of |dest_fd|. The paths listed +// in |src_relative_paths| are relative to the |src_dir| and will be used as the +// file names in the created zip file. All source paths must be under |src_dir| +// in the file system hierarchy. +bool ZipFiles(const base::FilePath& src_dir, + Paths src_relative_paths, + int dest_fd); +#endif // defined(OS_POSIX) || defined(OS_FUCHSIA) + +// Callback reporting the number of bytes written during Unzip. +using UnzipProgressCallback = base::RepeatingCallback; + +// Options of the Unzip function, with valid default values. +struct UnzipOptions { + // Encoding of entry paths in the ZIP archive. By default, paths are assumed + // to be in UTF-8. + std::string encoding; + + // Only extract the entries for which |filter_cb| returns true. By default, + // everything gets extracted. + FilterCallback filter; + + // Callback to report bytes extracted from the ZIP. + UnzipProgressCallback progress; + + // Password to decrypt the encrypted files. + std::string password; + + // Should ignore errors when extracting files? + bool continue_on_error = false; +}; + +typedef base::RepeatingCallback( + const base::FilePath&)> + WriterFactory; + +typedef base::RepeatingCallback DirectoryCreator; + +// Unzips the contents of |zip_file|, using the writers provided by +// |writer_factory|. +bool Unzip(const base::PlatformFile& zip_file, + WriterFactory writer_factory, + DirectoryCreator directory_creator, + UnzipOptions options = {}); + +// Unzips the contents of |zip_file| into |dest_dir|. +// This function does not overwrite any existing file. +// A filename collision will result in an error. +// Therefore, |dest_dir| should initially be an empty directory. +bool Unzip(const base::FilePath& zip_file, + const base::FilePath& dest_dir, + UnzipOptions options = {}); + +} // namespace zip + +#endif // THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_internal.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_internal.cc similarity index 56% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_internal.cc rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_internal.cc index 77f2b1748..b9976d63e 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_internal.cc +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_internal.cc @@ -1,18 +1,21 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "third_party/zlib/google/zip_internal.h" #include +#include #include -#include "base/files/file_util.h" +#include "base/containers/fixed_flat_set.h" +#include "base/files/file_path.h" #include "base/logging.h" +#include "base/notreached.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "base/time/time.h" -#include "build/build_config.h" #if defined(USE_SYSTEM_MINIZIP) #include @@ -37,9 +40,9 @@ typedef struct { } WIN32FILE_IOWIN; // This function is derived from third_party/minizip/iowin32.c. -// Its only difference is that it treats the char* as UTF8 and +// Its only difference is that it treats the filename as UTF-8 and // uses the Unicode version of CreateFile. -void* ZipOpenFunc(void *opaque, const char* filename, int mode) { +void* ZipOpenFunc(void* opaque, const void* filename, int mode) { DWORD desired_access = 0, creation_disposition = 0; DWORD share_mode = 0, flags_and_attributes = 0; HANDLE file = 0; @@ -57,10 +60,11 @@ void* ZipOpenFunc(void *opaque, const char* filename, int mode) { creation_disposition = CREATE_ALWAYS; } - base::string16 filename16 = base::UTF8ToUTF16(filename); - if ((filename != NULL) && (desired_access != 0)) { - file = CreateFile(filename16.c_str(), desired_access, share_mode, - NULL, creation_disposition, flags_and_attributes, NULL); + if (filename != nullptr && desired_access != 0) { + file = CreateFileW( + base::UTF8ToWide(static_cast(filename)).c_str(), + desired_access, share_mode, nullptr, creation_disposition, + flags_and_attributes, nullptr); } if (file == INVALID_HANDLE_VALUE) @@ -80,11 +84,11 @@ void* ZipOpenFunc(void *opaque, const char* filename, int mode) { } #endif -#if defined(OS_POSIX) +#if defined(OS_POSIX) || defined(OS_FUCHSIA) // Callback function for zlib that opens a file stream from a file descriptor. // Since we do not own the file descriptor, dup it so that we can fdopen/fclose // a file stream. -void* FdOpenFileFunc(void* opaque, const char* filename, int mode) { +void* FdOpenFileFunc(void* opaque, const void* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; @@ -106,15 +110,15 @@ void* FdOpenFileFunc(void* opaque, const char* filename, int mode) { int FdCloseFileFunc(void* opaque, void* stream) { fclose(static_cast(stream)); - free(opaque); // malloc'ed in FillFdOpenFileFunc() + free(opaque); // malloc'ed in FillFdOpenFileFunc() return 0; } // Fills |pzlib_filecunc_def| appropriately to handle the zip file // referred to by |fd|. -void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) { - fill_fopen_filefunc(pzlib_filefunc_def); - pzlib_filefunc_def->zopen_file = FdOpenFileFunc; +void FillFdOpenFileFunc(zlib_filefunc64_def* pzlib_filefunc_def, int fd) { + fill_fopen64_filefunc(pzlib_filefunc_def); + pzlib_filefunc_def->zopen64_file = FdOpenFileFunc; pzlib_filefunc_def->zclose_file = FdCloseFileFunc; int* ptr_fd = static_cast(malloc(sizeof(fd))); *ptr_fd = fd; @@ -125,7 +129,7 @@ void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) { #if defined(OS_WIN) // Callback function for zlib that opens a file stream from a Windows handle. // Does not take ownership of the handle. -void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) { +void* HandleOpenFileFunc(void* opaque, const void* /*filename*/, int mode) { WIN32FILE_IOWIN file_ret; file_ret.hf = static_cast(opaque); file_ret.error = 0; @@ -139,7 +143,7 @@ void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) { } int HandleCloseFileFunc(void* opaque, void* stream) { - free(stream); // malloc'ed in HandleOpenFileFunc() + free(stream); // malloc'ed in HandleOpenFileFunc() return 0; } #endif @@ -149,8 +153,8 @@ int HandleCloseFileFunc(void* opaque, void* stream) { // expect their opaque parameters refer to this struct. struct ZipBuffer { const char* data; // weak - size_t length; - size_t offset; + ZPOS64_T length; + ZPOS64_T offset; }; // Opens the specified file. When this function returns a non-NULL pointer, zlib @@ -159,7 +163,7 @@ struct ZipBuffer { // given opaque parameter and returns it because this parameter stores all // information needed for uncompressing data. (This function does not support // writing compressed data and it returns NULL for this case.) -void* OpenZipBuffer(void* opaque, const char* /*filename*/, int mode) { +void* OpenZipBuffer(void* opaque, const void* /*filename*/, int mode) { if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) != ZLIB_FILEFUNC_MODE_READ) { NOTREACHED(); return NULL; @@ -176,10 +180,11 @@ void* OpenZipBuffer(void* opaque, const char* /*filename*/, int mode) { uLong ReadZipBuffer(void* opaque, void* /*stream*/, void* buf, uLong size) { ZipBuffer* buffer = static_cast(opaque); DCHECK_LE(buffer->offset, buffer->length); - size_t remaining_bytes = buffer->length - buffer->offset; + ZPOS64_T remaining_bytes = buffer->length - buffer->offset; if (!buffer || !buffer->data || !remaining_bytes) return 0; - size = std::min(size, static_cast(remaining_bytes)); + if (size > remaining_bytes) + size = remaining_bytes; memcpy(buf, &buffer->data[buffer->offset], size); buffer->offset += size; return size; @@ -196,21 +201,23 @@ uLong WriteZipBuffer(void* /*opaque*/, } // Returns the offset from the beginning of the data. -long GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) { +ZPOS64_T GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) { ZipBuffer* buffer = static_cast(opaque); if (!buffer) return -1; - return static_cast(buffer->offset); + return buffer->offset; } // Moves the current offset to the specified position. -long SeekZipBuffer(void* opaque, void* /*stream*/, uLong offset, int origin) { +long SeekZipBuffer(void* opaque, + void* /*stream*/, + ZPOS64_T offset, + int origin) { ZipBuffer* buffer = static_cast(opaque); if (!buffer) return -1; if (origin == ZLIB_FILEFUNC_SEEK_CUR) { - buffer->offset = std::min(buffer->offset + static_cast(offset), - buffer->length); + buffer->offset = std::min(buffer->offset + offset, buffer->length); return 0; } if (origin == ZLIB_FILEFUNC_SEEK_END) { @@ -218,7 +225,7 @@ long SeekZipBuffer(void* opaque, void* /*stream*/, uLong offset, int origin) { return 0; } if (origin == ZLIB_FILEFUNC_SEEK_SET) { - buffer->offset = std::min(buffer->length, static_cast(offset)); + buffer->offset = std::min(buffer->length, offset); return 0; } NOTREACHED(); @@ -244,7 +251,7 @@ int GetErrorOfZipBuffer(void* /*opaque*/, void* /*stream*/) { // Returns a zip_fileinfo struct with the time represented by |file_time|. zip_fileinfo TimeToZipFileInfo(const base::Time& file_time) { base::Time::Exploded file_time_parts; - file_time.LocalExplode(&file_time_parts); + file_time.UTCExplode(&file_time_parts); zip_fileinfo zip_info = {}; if (file_time_parts.year >= 1980) { @@ -253,12 +260,13 @@ zip_fileinfo TimeToZipFileInfo(const base::Time& file_time) { // It assumes that dates below 1980 are in the double digit format. // Hence the fail safe option is to leave the date unset. Some programs // might show the unset date as 1980-0-0 which is invalid. - zip_info.tmz_date.tm_year = file_time_parts.year; - zip_info.tmz_date.tm_mon = file_time_parts.month - 1; - zip_info.tmz_date.tm_mday = file_time_parts.day_of_month; - zip_info.tmz_date.tm_hour = file_time_parts.hour; - zip_info.tmz_date.tm_min = file_time_parts.minute; - zip_info.tmz_date.tm_sec = file_time_parts.second; + zip_info.tmz_date = { + .tm_sec = static_cast(file_time_parts.second), + .tm_min = static_cast(file_time_parts.minute), + .tm_hour = static_cast(file_time_parts.hour), + .tm_mday = static_cast(file_time_parts.day_of_month), + .tm_mon = static_cast(file_time_parts.month - 1), + .tm_year = static_cast(file_time_parts.year)}; } return zip_info; @@ -269,33 +277,33 @@ namespace zip { namespace internal { unzFile OpenForUnzipping(const std::string& file_name_utf8) { - zlib_filefunc_def* zip_func_ptrs = NULL; + zlib_filefunc64_def* zip_func_ptrs = nullptr; #if defined(OS_WIN) - zlib_filefunc_def zip_funcs; - fill_win32_filefunc(&zip_funcs); - zip_funcs.zopen_file = ZipOpenFunc; + zlib_filefunc64_def zip_funcs; + fill_win32_filefunc64(&zip_funcs); + zip_funcs.zopen64_file = ZipOpenFunc; zip_func_ptrs = &zip_funcs; #endif - return unzOpen2(file_name_utf8.c_str(), zip_func_ptrs); + return unzOpen2_64(file_name_utf8.c_str(), zip_func_ptrs); } -#if defined(OS_POSIX) +#if defined(OS_POSIX) || defined(OS_FUCHSIA) unzFile OpenFdForUnzipping(int zip_fd) { - zlib_filefunc_def zip_funcs; + zlib_filefunc64_def zip_funcs; FillFdOpenFileFunc(&zip_funcs, zip_fd); // Passing dummy "fd" filename to zlib. - return unzOpen2("fd", &zip_funcs); + return unzOpen2_64("fd", &zip_funcs); } #endif #if defined(OS_WIN) unzFile OpenHandleForUnzipping(HANDLE zip_handle) { - zlib_filefunc_def zip_funcs; - fill_win32_filefunc(&zip_funcs); - zip_funcs.zopen_file = HandleOpenFileFunc; + zlib_filefunc64_def zip_funcs; + fill_win32_filefunc64(&zip_funcs); + zip_funcs.zopen64_file = HandleOpenFileFunc; zip_funcs.zclose_file = HandleCloseFileFunc; zip_funcs.opaque = zip_handle; - return unzOpen2("fd", &zip_funcs); + return unzOpen2_64("fd", &zip_funcs); } #endif @@ -311,80 +319,151 @@ unzFile PrepareMemoryForUnzipping(const std::string& data) { buffer->length = data.length(); buffer->offset = 0; - zlib_filefunc_def zip_functions; - zip_functions.zopen_file = OpenZipBuffer; + zlib_filefunc64_def zip_functions; + zip_functions.zopen64_file = OpenZipBuffer; zip_functions.zread_file = ReadZipBuffer; zip_functions.zwrite_file = WriteZipBuffer; - zip_functions.ztell_file = GetOffsetOfZipBuffer; - zip_functions.zseek_file = SeekZipBuffer; + zip_functions.ztell64_file = GetOffsetOfZipBuffer; + zip_functions.zseek64_file = SeekZipBuffer; zip_functions.zclose_file = CloseZipBuffer; zip_functions.zerror_file = GetErrorOfZipBuffer; - zip_functions.opaque = static_cast(buffer); - return unzOpen2(NULL, &zip_functions); + zip_functions.opaque = buffer; + return unzOpen2_64(nullptr, &zip_functions); } zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag) { - zlib_filefunc_def* zip_func_ptrs = NULL; + zlib_filefunc64_def* zip_func_ptrs = nullptr; #if defined(OS_WIN) - zlib_filefunc_def zip_funcs; - fill_win32_filefunc(&zip_funcs); - zip_funcs.zopen_file = ZipOpenFunc; + zlib_filefunc64_def zip_funcs; + fill_win32_filefunc64(&zip_funcs); + zip_funcs.zopen64_file = ZipOpenFunc; zip_func_ptrs = &zip_funcs; #endif - return zipOpen2(file_name_utf8.c_str(), - append_flag, - NULL, // global comment - zip_func_ptrs); + return zipOpen2_64(file_name_utf8.c_str(), append_flag, nullptr, + zip_func_ptrs); } -#if defined(OS_POSIX) +#if defined(OS_POSIX) || defined(OS_FUCHSIA) zipFile OpenFdForZipping(int zip_fd, int append_flag) { - zlib_filefunc_def zip_funcs; + zlib_filefunc64_def zip_funcs; FillFdOpenFileFunc(&zip_funcs, zip_fd); // Passing dummy "fd" filename to zlib. - return zipOpen2("fd", append_flag, NULL, &zip_funcs); + return zipOpen2_64("fd", append_flag, nullptr, &zip_funcs); } #endif -zip_fileinfo GetFileInfoForZipping(const base::FilePath& path) { - base::Time file_time; - base::File::Info file_info; - if (base::GetFileInfo(path, &file_info)) - file_time = file_info.last_modified; - return TimeToZipFileInfo(file_time); -} - bool ZipOpenNewFileInZip(zipFile zip_file, const std::string& str_path, - const zip_fileinfo* file_info) { + base::Time last_modified_time, + Compression compression) { // Section 4.4.4 http://www.pkware.com/documents/casestudies/APPNOTE.TXT // Setting the Language encoding flag so the file is told to be in utf-8. const uLong LANGUAGE_ENCODING_FLAG = 0x1 << 11; - if (ZIP_OK != zipOpenNewFileInZip4( - zip_file, // file - str_path.c_str(), // filename - file_info, // zipfi - NULL, // extrafield_local, - 0u, // size_extrafield_local - NULL, // extrafield_global - 0u, // size_extrafield_global - NULL, // comment - Z_DEFLATED, // method - Z_DEFAULT_COMPRESSION, // level - 0, // raw - -MAX_WBITS, // windowBits - DEF_MEM_LEVEL, // memLevel - Z_DEFAULT_STRATEGY, // strategy - NULL, // password - 0, // crcForCrypting - 0, // versionMadeBy - LANGUAGE_ENCODING_FLAG)) { // flagBase - DLOG(ERROR) << "Could not open zip file entry " << str_path; + const zip_fileinfo file_info = TimeToZipFileInfo(last_modified_time); + const int err = zipOpenNewFileInZip4_64( + /*file=*/zip_file, + /*filename=*/str_path.c_str(), + /*zip_fileinfo=*/&file_info, + /*extrafield_local=*/nullptr, + /*size_extrafield_local=*/0u, + /*extrafield_global=*/nullptr, + /*size_extrafield_global=*/0u, + /*comment=*/nullptr, + /*method=*/compression, + /*level=*/Z_DEFAULT_COMPRESSION, + /*raw=*/0, + /*windowBits=*/-MAX_WBITS, + /*memLevel=*/DEF_MEM_LEVEL, + /*strategy=*/Z_DEFAULT_STRATEGY, + /*password=*/nullptr, + /*crcForCrypting=*/0, + /*versionMadeBy=*/0, + /*flagBase=*/LANGUAGE_ENCODING_FLAG, + /*zip64=*/1); + + if (err != ZIP_OK) { + DLOG(ERROR) << "Cannot open ZIP file entry '" << str_path + << "': zipOpenNewFileInZip4_64 returned " << err; return false; } + return true; } +Compression GetCompressionMethod(const base::FilePath& path) { + // Get the filename extension in lower case. + const base::FilePath::StringType ext = + base::ToLowerASCII(path.FinalExtension()); + + if (ext.empty()) + return kDeflated; + + using StringPiece = base::FilePath::StringPieceType; + + // Skip the leading dot. + StringPiece ext_without_dot = ext; + DCHECK_EQ(ext_without_dot.front(), FILE_PATH_LITERAL('.')); + ext_without_dot.remove_prefix(1); + + // Well known filename extensions of files that a likely to be already + // compressed. The extensions are in lower case without the leading dot. + static constexpr auto kExts = base::MakeFixedFlatSet({ + FILE_PATH_LITERAL("3g2"), // + FILE_PATH_LITERAL("3gp"), // + FILE_PATH_LITERAL("7z"), // + FILE_PATH_LITERAL("7zip"), // + FILE_PATH_LITERAL("aac"), // + FILE_PATH_LITERAL("avi"), // + FILE_PATH_LITERAL("bz"), // + FILE_PATH_LITERAL("bz2"), // + FILE_PATH_LITERAL("crx"), // + FILE_PATH_LITERAL("gif"), // + FILE_PATH_LITERAL("gz"), // + FILE_PATH_LITERAL("jar"), // + FILE_PATH_LITERAL("jpeg"), // + FILE_PATH_LITERAL("jpg"), // + FILE_PATH_LITERAL("lz"), // + FILE_PATH_LITERAL("m2v"), // + FILE_PATH_LITERAL("m4p"), // + FILE_PATH_LITERAL("m4v"), // + FILE_PATH_LITERAL("mng"), // + FILE_PATH_LITERAL("mov"), // + FILE_PATH_LITERAL("mp2"), // + FILE_PATH_LITERAL("mp3"), // + FILE_PATH_LITERAL("mp4"), // + FILE_PATH_LITERAL("mpe"), // + FILE_PATH_LITERAL("mpeg"), // + FILE_PATH_LITERAL("mpg"), // + FILE_PATH_LITERAL("mpv"), // + FILE_PATH_LITERAL("ogg"), // + FILE_PATH_LITERAL("ogv"), // + FILE_PATH_LITERAL("png"), // + FILE_PATH_LITERAL("qt"), // + FILE_PATH_LITERAL("rar"), // + FILE_PATH_LITERAL("taz"), // + FILE_PATH_LITERAL("tb2"), // + FILE_PATH_LITERAL("tbz"), // + FILE_PATH_LITERAL("tbz2"), // + FILE_PATH_LITERAL("tgz"), // + FILE_PATH_LITERAL("tlz"), // + FILE_PATH_LITERAL("tz"), // + FILE_PATH_LITERAL("tz2"), // + FILE_PATH_LITERAL("vob"), // + FILE_PATH_LITERAL("webm"), // + FILE_PATH_LITERAL("wma"), // + FILE_PATH_LITERAL("wmv"), // + FILE_PATH_LITERAL("xz"), // + FILE_PATH_LITERAL("z"), // + FILE_PATH_LITERAL("zip"), // + }); + + if (kExts.count(ext_without_dot)) { + return kStored; + } + + return kDeflated; +} + } // namespace internal } // namespace zip diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_internal.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_internal.h similarity index 69% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_internal.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_internal.h index 0ebf0c94a..f107d7fe8 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/google/zip_internal.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_internal.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,6 +7,7 @@ #include +#include "base/time/time.h" #include "build/build_config.h" #if defined(OS_WIN) @@ -34,7 +35,7 @@ namespace internal { // Windows. unzFile OpenForUnzipping(const std::string& file_name_utf8); -#if defined(OS_POSIX) +#if defined(OS_POSIX) || defined(OS_FUCHSIA) // Opens the file referred to by |zip_fd| for unzipping. unzFile OpenFdForUnzipping(int zip_fd); #endif @@ -53,19 +54,30 @@ unzFile PrepareMemoryForUnzipping(const std::string& data); // Windows. |append_flag| will be passed to zipOpen2(). zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag); -#if defined(OS_POSIX) +#if defined(OS_POSIX) || defined(OS_FUCHSIA) // Opens the file referred to by |zip_fd| for zipping. |append_flag| will be // passed to zipOpen2(). zipFile OpenFdForZipping(int zip_fd, int append_flag); #endif -// Returns a zip_fileinfo with the last modification date of |path| set. -zip_fileinfo GetFileInfoForZipping(const base::FilePath& path); +// Compression methods. +enum Compression { + kStored = 0, // Stored (no compression) + kDeflated = Z_DEFLATED, // Deflated +}; -// Wrapper around zipOpenNewFileInZip4 which passes most common options. +// Adds a file (or directory) entry to the ZIP archive. bool ZipOpenNewFileInZip(zipFile zip_file, const std::string& str_path, - const zip_fileinfo* file_info); + base::Time last_modified_time, + Compression compression); + +// Selects the best compression method for the given file. The heuristic is +// based on the filename extension. By default, the compression method is +// kDeflated. But if the given path has an extension indicating a well known +// file format which is likely to be already compressed (eg ZIP, RAR, JPG, +// PNG...) then the compression method is simply kStored. +Compression GetCompressionMethod(const base::FilePath& path); const int kZipMaxPath = 256; const int kZipBufSize = 8192; diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc new file mode 100644 index 000000000..34a815e5f --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.cc @@ -0,0 +1,722 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/zlib/google/zip_reader.h" + +#include +#include + +#include "base/check.h" +#include "base/files/file.h" +#include "base/files/file_util.h" +#include "base/functional/bind.h" +#include "base/i18n/icu_string_conversions.h" +#include "base/logging.h" +#include "base/numerics/safe_conversions.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task/sequenced_task_runner.h" +#include "build/build_config.h" +#include "third_party/zlib/google/redact.h" +#include "third_party/zlib/google/zip_internal.h" + +#if defined(USE_SYSTEM_MINIZIP) +#include +#else +#include "third_party/zlib/contrib/minizip/unzip.h" +#if defined(OS_WIN) +#include "third_party/zlib/contrib/minizip/iowin32.h" +#endif // defined(OS_WIN) +#endif // defined(USE_SYSTEM_MINIZIP) + +#if defined(OS_POSIX) +#include +#endif + +namespace zip { +namespace { + +enum UnzipError : int; + +std::ostream& operator<<(std::ostream& out, UnzipError error) { +#define SWITCH_ERR(X) \ + case X: \ + return out << #X; + switch (error) { + SWITCH_ERR(UNZ_OK); + SWITCH_ERR(UNZ_END_OF_LIST_OF_FILE); + SWITCH_ERR(UNZ_ERRNO); + SWITCH_ERR(UNZ_PARAMERROR); + SWITCH_ERR(UNZ_BADZIPFILE); + SWITCH_ERR(UNZ_INTERNALERROR); + SWITCH_ERR(UNZ_CRCERROR); + default: + return out << "UNZ" << static_cast(error); + } +#undef SWITCH_ERR +} + +bool IsValidFileNameCharacterOnWindows(char16_t c) { + if (c < 32) + return false; + + switch (c) { + case '<': // Less than + case '>': // Greater than + case ':': // Colon + case '"': // Double quote + case '|': // Vertical bar or pipe + case '?': // Question mark + case '*': // Asterisk + case '/': // Forward slash + case '\\': // Backslash + return false; + } + + return true; +} + +// A writer delegate that writes to a given string. +class StringWriterDelegate : public WriterDelegate { + public: + explicit StringWriterDelegate(std::string* output) : output_(output) {} + + // WriterDelegate methods: + bool WriteBytes(const char* data, int num_bytes) override { + output_->append(data, num_bytes); + return true; + } + + private: + std::string* const output_; +}; + +#if defined(OS_POSIX) +void SetPosixFilePermissions(int fd, int mode) { + base::stat_wrapper_t sb; + if (base::File::Fstat(fd, &sb)) { + return; + } + mode_t new_mode = sb.st_mode; + // Transfer the executable bit only if the file is readable. + if ((sb.st_mode & S_IRUSR) == S_IRUSR && (mode & S_IXUSR) == S_IXUSR) { + new_mode |= S_IXUSR; + } + if ((sb.st_mode & S_IRGRP) == S_IRGRP && (mode & S_IXGRP) == S_IXGRP) { + new_mode |= S_IXGRP; + } + if ((sb.st_mode & S_IROTH) == S_IROTH && (mode & S_IXOTH) == S_IXOTH) { + new_mode |= S_IXOTH; + } + if (new_mode != sb.st_mode) { + fchmod(fd, new_mode); + } +} +#endif + +} // namespace + +ZipReader::ZipReader() { + Reset(); +} + +ZipReader::~ZipReader() { + Close(); +} + +bool ZipReader::Open(const base::FilePath& zip_path) { + DCHECK(!zip_file_); + + // Use of "Unsafe" function does not look good, but there is no way to do + // this safely on Linux. See file_util.h for details. + zip_file_ = internal::OpenForUnzipping(zip_path.AsUTF8Unsafe()); + if (!zip_file_) { + LOG(ERROR) << "Cannot open ZIP archive " << Redact(zip_path); + return false; + } + + return OpenInternal(); +} + +bool ZipReader::OpenFromPlatformFile(base::PlatformFile zip_fd) { + DCHECK(!zip_file_); + +#if defined(OS_POSIX) || defined(OS_FUCHSIA) + zip_file_ = internal::OpenFdForUnzipping(zip_fd); +#elif defined(OS_WIN) + zip_file_ = internal::OpenHandleForUnzipping(zip_fd); +#endif + if (!zip_file_) { + LOG(ERROR) << "Cannot open ZIP from file handle " << zip_fd; + return false; + } + + return OpenInternal(); +} + +bool ZipReader::OpenFromString(const std::string& data) { + zip_file_ = internal::PrepareMemoryForUnzipping(data); + if (!zip_file_) + return false; + return OpenInternal(); +} + +void ZipReader::Close() { + if (zip_file_) { + if (const UnzipError err{unzClose(zip_file_)}; err != UNZ_OK) { + LOG(ERROR) << "Error while closing ZIP archive: " << err; + } + } + Reset(); +} + +const ZipReader::Entry* ZipReader::Next() { + DCHECK(zip_file_); + + if (reached_end_) + return nullptr; + + DCHECK(ok_); + + // Move to the next entry if we're not trying to open the first entry. + if (next_index_ > 0) { + if (const UnzipError err{unzGoToNextFile(zip_file_)}; err != UNZ_OK) { + reached_end_ = true; + if (err != UNZ_END_OF_LIST_OF_FILE) { + LOG(ERROR) << "Cannot go to next entry in ZIP: " << err; + ok_ = false; + } + return nullptr; + } + } + + next_index_++; + + if (!OpenEntry()) { + reached_end_ = true; + ok_ = false; + return nullptr; + } + + return &entry_; +} + +bool ZipReader::OpenEntry() { + DCHECK(zip_file_); + + // Get entry info. + unz_file_info64 info = {}; + char path_in_zip[internal::kZipMaxPath] = {}; + if (const UnzipError err{unzGetCurrentFileInfo64( + zip_file_, &info, path_in_zip, sizeof(path_in_zip) - 1, nullptr, 0, + nullptr, 0)}; + err != UNZ_OK) { + LOG(ERROR) << "Cannot get entry from ZIP: " << err; + return false; + } + + entry_.path_in_original_encoding = path_in_zip; + + // Convert path from original encoding to Unicode. + std::u16string path_in_utf16; + const char* const encoding = encoding_.empty() ? "UTF-8" : encoding_.c_str(); + if (!base::CodepageToUTF16(entry_.path_in_original_encoding, encoding, + base::OnStringConversionError::SUBSTITUTE, + &path_in_utf16)) { + LOG(ERROR) << "Cannot convert path from encoding " << encoding; + return false; + } + + // Normalize path. + Normalize(path_in_utf16); + + entry_.original_size = info.uncompressed_size; + + // The file content of this entry is encrypted if flag bit 0 is set. + entry_.is_encrypted = info.flag & 1; + if (entry_.is_encrypted) { + // Is the entry AES encrypted. + entry_.uses_aes_encryption = info.compression_method == 99; + } else { + entry_.uses_aes_encryption = false; + } + + // Construct the last modified time. The timezone info is not present in ZIP + // archives, so we construct the time as UTC. + const base::Time::Exploded exploded_time = { + .year = static_cast(info.tmu_date.tm_year), + .month = + static_cast(info.tmu_date.tm_mon + 1), // 0-based vs 1-based + .day_of_month = static_cast(info.tmu_date.tm_mday), + .hour = static_cast(info.tmu_date.tm_hour), + .minute = static_cast(info.tmu_date.tm_min), + .second = static_cast(info.tmu_date.tm_sec)}; + + if (!base::Time::FromUTCExploded(exploded_time, &entry_.last_modified)) + entry_.last_modified = base::Time::UnixEpoch(); + +#if defined(OS_POSIX) + entry_.posix_mode = (info.external_fa >> 16L) & (S_IRWXU | S_IRWXG | S_IRWXO); +#else + entry_.posix_mode = 0; +#endif + + return true; +} + +void ZipReader::Normalize(base::StringPiece16 in) { + entry_.is_unsafe = true; + + // Directory entries in ZIP have a path ending with "/". + entry_.is_directory = base::EndsWith(in, u"/"); + + std::u16string normalized_path; + if (base::StartsWith(in, u"/")) { + normalized_path = u"ROOT"; + entry_.is_unsafe = false; + } + + for (;;) { + // Consume initial path separators. + const base::StringPiece16::size_type i = in.find_first_not_of(u'/'); + if (i == base::StringPiece16::npos) + break; + + in.remove_prefix(i); + DCHECK(!in.empty()); + + // Isolate next path component. + const base::StringPiece16 part = in.substr(0, in.find_first_of(u'/')); + DCHECK(!part.empty()); + + in.remove_prefix(part.size()); + + if (!normalized_path.empty()) + normalized_path += u'/'; + + if (part == u".") { + normalized_path += u"DOT"; + entry_.is_unsafe = true; + continue; + } + + if (part == u"..") { + normalized_path += u"UP"; + entry_.is_unsafe = true; + continue; + } + + // Windows has more restrictions than other systems when it comes to valid + // file paths. Replace Windows-invalid characters on all systems for + // consistency. In particular, this prevents a path component containing + // colon and backslash from being misinterpreted as an absolute path on + // Windows. + for (const char16_t c : part) { + normalized_path += IsValidFileNameCharacterOnWindows(c) ? c : 0xFFFD; + } + + entry_.is_unsafe = false; + } + + // If the entry is a directory, add the final path separator to the entry + // path. + if (entry_.is_directory && !normalized_path.empty()) { + normalized_path += u'/'; + entry_.is_unsafe = false; + } + + entry_.path = base::FilePath::FromUTF16Unsafe(normalized_path); + + // By construction, we should always get a relative path. + DCHECK(!entry_.path.IsAbsolute()) << entry_.path; +} + +void ZipReader::ReportProgress(ListenerCallback listener_callback, + uint64_t bytes) const { + delta_bytes_read_ += bytes; + + const base::TimeTicks now = base::TimeTicks::Now(); + if (next_progress_report_time_ > now) + return; + + next_progress_report_time_ = now + progress_period_; + listener_callback.Run(delta_bytes_read_); + delta_bytes_read_ = 0; +} + +bool ZipReader::ExtractCurrentEntry(WriterDelegate* delegate, + ListenerCallback listener_callback, + uint64_t num_bytes_to_extract) const { + DCHECK(zip_file_); + DCHECK_LT(0, next_index_); + DCHECK(ok_); + DCHECK(!reached_end_); + + // Use password only for encrypted files. For non-encrypted files, no password + // is needed, and must be nullptr. + const char* const password = + entry_.is_encrypted ? password_.c_str() : nullptr; + if (const UnzipError err{unzOpenCurrentFilePassword(zip_file_, password)}; + err != UNZ_OK) { + LOG(ERROR) << "Cannot open file " << Redact(entry_.path) + << " from ZIP: " << err; + return false; + } + + DCHECK(delegate); + if (!delegate->PrepareOutput()) + return false; + + uint64_t remaining_capacity = num_bytes_to_extract; + bool entire_file_extracted = false; + + while (remaining_capacity > 0) { + char buf[internal::kZipBufSize]; + const int num_bytes_read = + unzReadCurrentFile(zip_file_, buf, internal::kZipBufSize); + + if (num_bytes_read == 0) { + entire_file_extracted = true; + break; + } + + if (num_bytes_read < 0) { + LOG(ERROR) << "Cannot read file " << Redact(entry_.path) + << " from ZIP: " << UnzipError(num_bytes_read); + break; + } + + if (listener_callback) { + ReportProgress(listener_callback, num_bytes_read); + } + + DCHECK_LT(0, num_bytes_read); + CHECK_LE(num_bytes_read, internal::kZipBufSize); + + uint64_t num_bytes_to_write = std::min( + remaining_capacity, base::checked_cast(num_bytes_read)); + if (!delegate->WriteBytes(buf, num_bytes_to_write)) + break; + + if (remaining_capacity == base::checked_cast(num_bytes_read)) { + // Ensures function returns true if the entire file has been read. + const int n = unzReadCurrentFile(zip_file_, buf, 1); + entire_file_extracted = (n == 0); + LOG_IF(ERROR, n < 0) << "Cannot read file " << Redact(entry_.path) + << " from ZIP: " << UnzipError(n); + } + + CHECK_GE(remaining_capacity, num_bytes_to_write); + remaining_capacity -= num_bytes_to_write; + } + + if (const UnzipError err{unzCloseCurrentFile(zip_file_)}; err != UNZ_OK) { + LOG(ERROR) << "Cannot extract file " << Redact(entry_.path) + << " from ZIP: " << err; + entire_file_extracted = false; + } + + if (entire_file_extracted) { + delegate->SetPosixFilePermissions(entry_.posix_mode); + if (entry_.last_modified != base::Time::UnixEpoch()) { + delegate->SetTimeModified(entry_.last_modified); + } + } else { + delegate->OnError(); + } + + if (listener_callback) { + listener_callback.Run(delta_bytes_read_); + delta_bytes_read_ = 0; + } + + return entire_file_extracted; +} + +bool ZipReader::ExtractCurrentEntry(WriterDelegate* delegate, + uint64_t num_bytes_to_extract) const { + return ExtractCurrentEntry(delegate, ListenerCallback(), + num_bytes_to_extract); +} + +bool ZipReader::ExtractCurrentEntryWithListener( + WriterDelegate* delegate, + ListenerCallback listener_callback) const { + return ExtractCurrentEntry(delegate, listener_callback); +} + +void ZipReader::ExtractCurrentEntryToFilePathAsync( + const base::FilePath& output_file_path, + SuccessCallback success_callback, + FailureCallback failure_callback, + ProgressCallback progress_callback) { + DCHECK(zip_file_); + DCHECK_LT(0, next_index_); + DCHECK(ok_); + DCHECK(!reached_end_); + + // If this is a directory, just create it and return. + if (entry_.is_directory) { + if (base::CreateDirectory(output_file_path)) { + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, std::move(success_callback)); + } else { + LOG(ERROR) << "Cannot create directory " << Redact(output_file_path); + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, std::move(failure_callback)); + } + return; + } + + // Use password only for encrypted files. For non-encrypted files, no password + // is needed, and must be nullptr. + const char* const password = + entry_.is_encrypted ? password_.c_str() : nullptr; + if (const UnzipError err{unzOpenCurrentFilePassword(zip_file_, password)}; + err != UNZ_OK) { + LOG(ERROR) << "Cannot open file " << Redact(entry_.path) + << " from ZIP: " << err; + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, std::move(failure_callback)); + return; + } + + base::FilePath output_dir_path = output_file_path.DirName(); + if (!base::CreateDirectory(output_dir_path)) { + LOG(ERROR) << "Cannot create directory " << Redact(output_dir_path); + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, std::move(failure_callback)); + return; + } + + const int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE; + base::File output_file(output_file_path, flags); + + if (!output_file.IsValid()) { + LOG(ERROR) << "Cannot create file " << Redact(output_file_path); + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, std::move(failure_callback)); + return; + } + + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(), + std::move(output_file), std::move(success_callback), + std::move(failure_callback), std::move(progress_callback), + 0 /* initial offset */)); +} + +bool ZipReader::ExtractCurrentEntryToString(uint64_t max_read_bytes, + std::string* output) const { + DCHECK(output); + DCHECK(zip_file_); + DCHECK_LT(0, next_index_); + DCHECK(ok_); + DCHECK(!reached_end_); + + output->clear(); + + if (max_read_bytes == 0) + return true; + + if (entry_.is_directory) + return true; + + // The original_size is the best hint for the real size, so it saves doing + // reallocations for the common case when the uncompressed size is correct. + // However, we need to assume that the uncompressed size could be incorrect + // therefore this function needs to read as much data as possible. + output->reserve(base::checked_cast(std::min( + max_read_bytes, base::checked_cast(entry_.original_size)))); + + StringWriterDelegate writer(output); + return ExtractCurrentEntry(&writer, max_read_bytes); +} + +bool ZipReader::OpenInternal() { + DCHECK(zip_file_); + + unz_global_info zip_info = {}; // Zero-clear. + if (const UnzipError err{unzGetGlobalInfo(zip_file_, &zip_info)}; + err != UNZ_OK) { + LOG(ERROR) << "Cannot get ZIP info: " << err; + return false; + } + + num_entries_ = zip_info.number_entry; + reached_end_ = (num_entries_ <= 0); + ok_ = true; + return true; +} + +void ZipReader::Reset() { + zip_file_ = nullptr; + num_entries_ = 0; + next_index_ = 0; + reached_end_ = true; + ok_ = false; + delta_bytes_read_ = 0; + entry_ = {}; +} + +void ZipReader::ExtractChunk(base::File output_file, + SuccessCallback success_callback, + FailureCallback failure_callback, + ProgressCallback progress_callback, + int64_t offset) { + char buffer[internal::kZipBufSize]; + + const int num_bytes_read = + unzReadCurrentFile(zip_file_, buffer, internal::kZipBufSize); + + if (num_bytes_read == 0) { + if (const UnzipError err{unzCloseCurrentFile(zip_file_)}; err != UNZ_OK) { + LOG(ERROR) << "Cannot extract file " << Redact(entry_.path) + << " from ZIP: " << err; + std::move(failure_callback).Run(); + return; + } + + std::move(success_callback).Run(); + return; + } + + if (num_bytes_read < 0) { + LOG(ERROR) << "Cannot read file " << Redact(entry_.path) + << " from ZIP: " << UnzipError(num_bytes_read); + std::move(failure_callback).Run(); + return; + } + + if (num_bytes_read != output_file.Write(offset, buffer, num_bytes_read)) { + LOG(ERROR) << "Cannot write " << num_bytes_read + << " bytes to file at offset " << offset; + std::move(failure_callback).Run(); + return; + } + + offset += num_bytes_read; + progress_callback.Run(offset); + + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(), + std::move(output_file), std::move(success_callback), + std::move(failure_callback), std::move(progress_callback), + offset)); +} + +// FileWriterDelegate ---------------------------------------------------------- + +FileWriterDelegate::FileWriterDelegate(base::File* file) : file_(file) { + DCHECK(file_); +} + +FileWriterDelegate::FileWriterDelegate(base::File owned_file) + : owned_file_(std::move(owned_file)) { + DCHECK_EQ(file_, &owned_file_); +} + +FileWriterDelegate::~FileWriterDelegate() {} + +bool FileWriterDelegate::PrepareOutput() { + DCHECK(file_); + + if (!file_->IsValid()) { + LOG(ERROR) << "File is not valid"; + return false; + } + + const int64_t length = file_->GetLength(); + if (length < 0) { + PLOG(ERROR) << "Cannot get length of file handle " + << file_->GetPlatformFile(); + return false; + } + + // Just log a warning if the file is not empty. + // See crbug.com/1309879 and crbug.com/774762. + LOG_IF(WARNING, length > 0) + << "File handle " << file_->GetPlatformFile() + << " is not empty: Its length is " << length << " bytes"; + + return true; +} + +bool FileWriterDelegate::WriteBytes(const char* data, int num_bytes) { + int bytes_written = file_->WriteAtCurrentPos(data, num_bytes); + if (bytes_written > 0) + file_length_ += bytes_written; + return bytes_written == num_bytes; +} + +void FileWriterDelegate::SetTimeModified(const base::Time& time) { + file_->SetTimes(base::Time::Now(), time); +} + +void FileWriterDelegate::SetPosixFilePermissions(int mode) { +#if defined(OS_POSIX) + zip::SetPosixFilePermissions(file_->GetPlatformFile(), mode); +#endif +} + +void FileWriterDelegate::OnError() { + file_length_ = 0; + file_->SetLength(0); +} + +// FilePathWriterDelegate ------------------------------------------------------ + +FilePathWriterDelegate::FilePathWriterDelegate(base::FilePath output_file_path) + : FileWriterDelegate(base::File()), + output_file_path_(std::move(output_file_path)) {} + +FilePathWriterDelegate::~FilePathWriterDelegate() {} + +bool FilePathWriterDelegate::PrepareOutput() { + // We can't rely on parent directory entries being specified in the + // zip, so we make sure they are created. + if (const base::FilePath dir = output_file_path_.DirName(); + !base::CreateDirectory(dir)) { + PLOG(ERROR) << "Cannot create directory " << Redact(dir); + return false; + } + + owned_file_.Initialize(output_file_path_, + base::File::FLAG_CREATE | base::File::FLAG_WRITE); + if (!owned_file_.IsValid()) { + PLOG(ERROR) << "Cannot create file " << Redact(output_file_path_) << ": " + << base::File::ErrorToString(owned_file_.error_details()); + return false; + } + + const int64_t length = owned_file_.GetLength(); + if (length < 0) { + PLOG(ERROR) << "Cannot get length of file " << Redact(output_file_path_); + return false; + } + + if (length > 0) { + LOG(ERROR) << "File " << Redact(output_file_path_) + << " is not empty: Its length is " << length << " bytes"; + return false; + } + + return true; +} + +void FilePathWriterDelegate::OnError() { + FileWriterDelegate::OnError(); + owned_file_.Close(); + + if (!base::DeleteFile(output_file_path_)) { + LOG(ERROR) << "Cannot delete partially extracted file " + << Redact(output_file_path_); + } +} + +} // namespace zip diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.h new file mode 100644 index 000000000..b7680cc83 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader.h @@ -0,0 +1,404 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_ +#define THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_ + +#include +#include + +#include +#include +#include + +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/functional/callback.h" +#include "base/memory/weak_ptr.h" +#include "base/numerics/safe_conversions.h" +#include "base/time/time.h" + +#if defined(USE_SYSTEM_MINIZIP) +#include +#else +#include "third_party/zlib/contrib/minizip/unzip.h" +#endif + +namespace zip { + +// A delegate interface used to stream out an entry; see +// ZipReader::ExtractCurrentEntry. +class WriterDelegate { + public: + virtual ~WriterDelegate() {} + + // Invoked once before any data is streamed out to pave the way (e.g., to open + // the output file). Return false on failure to cancel extraction. + virtual bool PrepareOutput() { return true; } + + // Invoked to write the next chunk of data. Return false on failure to cancel + // extraction. + virtual bool WriteBytes(const char* data, int num_bytes) { return true; } + + // Sets the last-modified time of the data. + virtual void SetTimeModified(const base::Time& time) {} + + // Called with the POSIX file permissions of the data; POSIX implementations + // may apply some of the permissions (for example, the executable bit) to the + // output file. + virtual void SetPosixFilePermissions(int mode) {} + + // Called if an error occurred while extracting the file. The WriterDelegate + // can then remove and clean up the partially extracted data. + virtual void OnError() {} +}; + +// This class is used for reading ZIP archives. A typical use case of this class +// is to scan entries in a ZIP archive and extract them. The code will look +// like: +// +// ZipReader reader; +// if (!reader.Open(zip_path)) { +// // Cannot open +// return; +// } +// +// while (const ZipReader::entry* entry = reader.Next()) { +// auto writer = CreateFilePathWriterDelegate(extract_dir, entry->path); +// if (!reader.ExtractCurrentEntry(writer)) { +// // Cannot extract +// return; +// } +// } +// +// if (!reader.ok()) { +// // Error while enumerating entries +// return; +// } +// +class ZipReader { + public: + // A callback that is called when the operation is successful. + using SuccessCallback = base::OnceClosure; + // A callback that is called when the operation fails. + using FailureCallback = base::OnceClosure; + // A callback that is called periodically during the operation with the number + // of bytes that have been processed so far. + using ProgressCallback = base::RepeatingCallback; + // A callback that is called periodically during the operation with the number + // of bytes that have been processed since the previous call (i.e. delta). + using ListenerCallback = base::RepeatingCallback; + + // Information of an entry (file or directory) in a ZIP archive. + struct Entry { + // Path of this entry, in its original encoding as it is stored in the ZIP + // archive. The encoding is not specified here. It might or might not be + // UTF-8, and the caller needs to use other means to determine the encoding + // if it wants to interpret this path correctly. + std::string path_in_original_encoding; + + // Path of the entry, converted to Unicode. This path is relative (eg + // "foo/bar.txt"). Absolute paths (eg "/foo/bar.txt") or paths containing + // ".." or "." components (eg "../foo/bar.txt") are converted to safe + // relative paths. Eg: + // (In ZIP) -> (Entry.path) + // /foo/bar -> ROOT/foo/bar + // ../a -> UP/a + // ./a -> DOT/a + base::FilePath path; + + // Size of the original uncompressed file, or 0 if the entry is a directory. + // This value should not be trusted, because it is stored as metadata in the + // ZIP archive and can be different from the real uncompressed size. + int64_t original_size; + + // Last modified time. If the timestamp stored in the ZIP archive is not + // valid, the Unix epoch will be returned. + // + // The timestamp stored in the ZIP archive uses the MS-DOS date and time + // format. + // + // http://msdn.microsoft.com/en-us/library/ms724247(v=vs.85).aspx + // + // As such the following limitations apply: + // * Only years from 1980 to 2107 can be represented. + // * The timestamp has a 2-second resolution. + // * There is no timezone information, so the time is interpreted as UTC. + base::Time last_modified; + + // True if the entry is a directory. + // False if the entry is a file. + bool is_directory = false; + + // True if the entry path cannot be converted to a safe relative path. This + // happens if a file entry (not a directory) has a filename "." or "..". + bool is_unsafe = false; + + // True if the file content is encrypted. + bool is_encrypted = false; + + // True if the encryption scheme is AES. + bool uses_aes_encryption = false; + + // Entry POSIX permissions (POSIX systems only). + int posix_mode; + }; + + ZipReader(); + + ZipReader(const ZipReader&) = delete; + ZipReader& operator=(const ZipReader&) = delete; + + ~ZipReader(); + + // Opens the ZIP archive specified by |zip_path|. Returns true on + // success. + bool Open(const base::FilePath& zip_path); + + // Opens the ZIP archive referred to by the platform file |zip_fd|, without + // taking ownership of |zip_fd|. Returns true on success. + bool OpenFromPlatformFile(base::PlatformFile zip_fd); + + // Opens the zip data stored in |data|. This class uses a weak reference to + // the given sring while extracting files, i.e. the caller should keep the + // string until it finishes extracting files. + bool OpenFromString(const std::string& data); + + // Closes the currently opened ZIP archive. This function is called in the + // destructor of the class, so you usually don't need to call this. + void Close(); + + // Sets the encoding of entry paths in the ZIP archive. + // By default, paths are assumed to be in UTF-8. + void SetEncoding(std::string encoding) { encoding_ = std::move(encoding); } + + // Sets the decryption password that will be used to decrypt encrypted file in + // the ZIP archive. + void SetPassword(std::string password) { password_ = std::move(password); } + + // Gets the next entry. Returns null if there is no more entry, or if an error + // occurred while scanning entries. The returned Entry is owned by this + // ZipReader, and is valid until Next() is called again or until this + // ZipReader is closed. + // + // This function should be called before operations over the current entry + // like ExtractCurrentEntryToFile(). + // + // while (const ZipReader::Entry* entry = reader.Next()) { + // // Do something with the current entry here. + // ... + // } + // + // // Finished scanning entries. + // // Check if the scanning stopped because of an error. + // if (!reader.ok()) { + // // There was an error. + // ... + // } + const Entry* Next(); + + // Returns true if the enumeration of entries was successful, or false if it + // stopped because of an error. + bool ok() const { return ok_; } + + // Extracts |num_bytes_to_extract| bytes of the current entry to |delegate|, + // starting from the beginning of the entry. + // + // Returns true if the entire file was extracted without error. + // + // Precondition: Next() returned a non-null Entry. + bool ExtractCurrentEntry(WriterDelegate* delegate, + uint64_t num_bytes_to_extract = + std::numeric_limits::max()) const; + + // Extracts the current entry to |delegate|, starting from the beginning + // of the entry, calling |listener_callback| regularly with the number of + // bytes extracted. + // + // Returns true if the entire file was extracted without error. + // + // Precondition: Next() returned a non-null Entry. + bool ExtractCurrentEntryWithListener( + WriterDelegate* delegate, + ListenerCallback listener_callback) const; + + // Asynchronously extracts the current entry to the given output file path. If + // the current entry is a directory it just creates the directory + // synchronously instead. + // + // |success_callback| will be called on success and |failure_callback| will be + // called on failure. |progress_callback| will be called at least once. + // Callbacks will be posted to the current MessageLoop in-order. + // + // Precondition: Next() returned a non-null Entry. + void ExtractCurrentEntryToFilePathAsync( + const base::FilePath& output_file_path, + SuccessCallback success_callback, + FailureCallback failure_callback, + ProgressCallback progress_callback); + + // Extracts the current entry into memory. If the current entry is a + // directory, |*output| is set to the empty string. If the current entry is a + // file, |*output| is filled with its contents. + // + // The value in |Entry::original_size| cannot be trusted, so the real size of + // the uncompressed contents can be different. |max_read_bytes| limits the + // amount of memory used to carry the entry. + // + // Returns true if the entire content is read without error. If the content is + // bigger than |max_read_bytes|, this function returns false and |*output| is + // filled with |max_read_bytes| of data. If an error occurs, this function + // returns false and |*output| contains the content extracted so far, which + // might be garbage data. + // + // Precondition: Next() returned a non-null Entry. + bool ExtractCurrentEntryToString(uint64_t max_read_bytes, + std::string* output) const; + + bool ExtractCurrentEntryToString(std::string* output) const { + return ExtractCurrentEntryToString( + base::checked_cast(output->max_size()), output); + } + + // Returns the number of entries in the ZIP archive. + // + // Precondition: one of the Open() methods returned true. + int num_entries() const { return num_entries_; } + + private: + // Common code used both in Open and OpenFromFd. + bool OpenInternal(); + + // Resets the internal state. + void Reset(); + + // Opens the current entry in the ZIP archive. On success, returns true and + // updates the current entry state |entry_|. + // + // Note that there is no matching CloseEntry(). The current entry state is + // reset automatically as needed. + bool OpenEntry(); + + // Normalizes the given path passed as UTF-16 string piece. Sets entry_.path, + // entry_.is_directory and entry_.is_unsafe. + void Normalize(base::StringPiece16 in); + + // Runs the ListenerCallback at a throttled rate. + void ReportProgress(ListenerCallback listener_callback, uint64_t bytes) const; + + // Extracts |num_bytes_to_extract| bytes of the current entry to |delegate|, + // starting from the beginning of the entry calling |listener_callback| if + // its supplied. + // + // Returns true if the entire file was extracted without error. + // + // Precondition: Next() returned a non-null Entry. + bool ExtractCurrentEntry(WriterDelegate* delegate, + ListenerCallback listener_callback, + uint64_t num_bytes_to_extract = + std::numeric_limits::max()) const; + + // Extracts a chunk of the file to the target. Will post a task for the next + // chunk and success/failure/progress callbacks as necessary. + void ExtractChunk(base::File target_file, + SuccessCallback success_callback, + FailureCallback failure_callback, + ProgressCallback progress_callback, + const int64_t offset); + + std::string encoding_; + std::string password_; + unzFile zip_file_; + int num_entries_; + int next_index_; + bool reached_end_; + bool ok_; + Entry entry_; + + // Next time to report progress. + mutable base::TimeTicks next_progress_report_time_ = base::TimeTicks::Now(); + + // Progress time delta. + // TODO(crbug.com/953256) Add this as parameter to the unzip options. + base::TimeDelta progress_period_ = base::Milliseconds(1000); + + // Number of bytes read since last progress report callback executed. + mutable uint64_t delta_bytes_read_ = 0; + + base::WeakPtrFactory weak_ptr_factory_{this}; +}; + +// A writer delegate that writes to a given File. It is recommended that this +// file be initially empty. +class FileWriterDelegate : public WriterDelegate { + public: + // Constructs a FileWriterDelegate that manipulates |file|. The delegate will + // not own |file|, therefore the caller must guarantee |file| will outlive the + // delegate. + explicit FileWriterDelegate(base::File* file); + + // Constructs a FileWriterDelegate that takes ownership of |file|. + explicit FileWriterDelegate(base::File owned_file); + + FileWriterDelegate(const FileWriterDelegate&) = delete; + FileWriterDelegate& operator=(const FileWriterDelegate&) = delete; + + ~FileWriterDelegate() override; + + // Returns true if the file handle passed to the constructor is valid. + bool PrepareOutput() override; + + // Writes |num_bytes| bytes of |data| to the file, returning false on error or + // if not all bytes could be written. + bool WriteBytes(const char* data, int num_bytes) override; + + // Sets the last-modified time of the data. + void SetTimeModified(const base::Time& time) override; + + // On POSIX systems, sets the file to be executable if the source file was + // executable. + void SetPosixFilePermissions(int mode) override; + + // Empties the file to avoid leaving garbage data in it. + void OnError() override; + + // Gets the number of bytes written into the file. + int64_t file_length() { return file_length_; } + + protected: + // The delegate can optionally own the file it modifies, in which case + // owned_file_ is set and file_ is an alias for owned_file_. + base::File owned_file_; + + // The file the delegate modifies. + base::File* const file_ = &owned_file_; + + int64_t file_length_ = 0; +}; + +// A writer delegate that creates and writes a file at a given path. This does +// not overwrite any existing file. +class FilePathWriterDelegate : public FileWriterDelegate { + public: + explicit FilePathWriterDelegate(base::FilePath output_file_path); + + FilePathWriterDelegate(const FilePathWriterDelegate&) = delete; + FilePathWriterDelegate& operator=(const FilePathWriterDelegate&) = delete; + + ~FilePathWriterDelegate() override; + + // Creates the output file and any necessary intermediate directories. Does + // not overwrite any existing file, and returns false if the output file + // cannot be created because another file conflicts with it. + bool PrepareOutput() override; + + // Deletes the output file. + void OnError() override; + + private: + const base::FilePath output_file_path_; +}; + +} // namespace zip + +#endif // THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc new file mode 100644 index 000000000..6086c97c4 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_reader_unittest.cc @@ -0,0 +1,927 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/zlib/google/zip_reader.h" + +#include +#include +#include + +#include +#include +#include + +#include "base/check.h" +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/functional/bind.h" +#include "base/hash/md5.h" +#include "base/i18n/time_formatting.h" +#include "base/path_service.h" +#include "base/run_loop.h" +#include "base/strings/string_piece.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "base/test/bind.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" +#include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" +#include "third_party/icu/source/i18n/unicode/timezone.h" +#include "third_party/zlib/google/zip_internal.h" + +using ::testing::_; +using ::testing::ElementsAre; +using ::testing::ElementsAreArray; +using ::testing::Return; +using ::testing::SizeIs; + +namespace { + +const static std::string kQuuxExpectedMD5 = "d1ae4ac8a17a0e09317113ab284b57a6"; + +class FileWrapper { + public: + typedef enum { READ_ONLY, READ_WRITE } AccessMode; + + FileWrapper(const base::FilePath& path, AccessMode mode) { + int flags = base::File::FLAG_READ; + if (mode == READ_ONLY) + flags |= base::File::FLAG_OPEN; + else + flags |= base::File::FLAG_WRITE | base::File::FLAG_CREATE_ALWAYS; + + file_.Initialize(path, flags); + } + + ~FileWrapper() {} + + base::PlatformFile platform_file() { return file_.GetPlatformFile(); } + + base::File* file() { return &file_; } + + private: + base::File file_; +}; + +// A mock that provides methods that can be used as callbacks in asynchronous +// unzip functions. Tracks the number of calls and number of bytes reported. +// Assumes that progress callbacks will be executed in-order. +class MockUnzipListener : public base::SupportsWeakPtr { + public: + MockUnzipListener() + : success_calls_(0), + failure_calls_(0), + progress_calls_(0), + current_progress_(0) {} + + // Success callback for async functions. + void OnUnzipSuccess() { success_calls_++; } + + // Failure callback for async functions. + void OnUnzipFailure() { failure_calls_++; } + + // Progress callback for async functions. + void OnUnzipProgress(int64_t progress) { + DCHECK(progress > current_progress_); + progress_calls_++; + current_progress_ = progress; + } + + int success_calls() { return success_calls_; } + int failure_calls() { return failure_calls_; } + int progress_calls() { return progress_calls_; } + int current_progress() { return current_progress_; } + + private: + int success_calls_; + int failure_calls_; + int progress_calls_; + + int64_t current_progress_; +}; + +class MockWriterDelegate : public zip::WriterDelegate { + public: + MOCK_METHOD0(PrepareOutput, bool()); + MOCK_METHOD2(WriteBytes, bool(const char*, int)); + MOCK_METHOD1(SetTimeModified, void(const base::Time&)); + MOCK_METHOD1(SetPosixFilePermissions, void(int)); + MOCK_METHOD0(OnError, void()); +}; + +bool ExtractCurrentEntryToFilePath(zip::ZipReader* reader, + base::FilePath path) { + zip::FilePathWriterDelegate writer(path); + return reader->ExtractCurrentEntry(&writer); +} + +const zip::ZipReader::Entry* LocateAndOpenEntry( + zip::ZipReader* const reader, + const base::FilePath& path_in_zip) { + DCHECK(reader); + EXPECT_TRUE(reader->ok()); + + // The underlying library can do O(1) access, but ZipReader does not expose + // that. O(N) access is acceptable for these tests. + while (const zip::ZipReader::Entry* const entry = reader->Next()) { + EXPECT_TRUE(reader->ok()); + if (entry->path == path_in_zip) + return entry; + } + + EXPECT_TRUE(reader->ok()); + return nullptr; +} + +using Paths = std::vector; + +} // namespace + +namespace zip { + +// Make the test a PlatformTest to setup autorelease pools properly on Mac. +class ZipReaderTest : public PlatformTest { + protected: + void SetUp() override { + PlatformTest::SetUp(); + + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + test_dir_ = temp_dir_.GetPath(); + } + + static base::FilePath GetTestDataDirectory() { + base::FilePath path; + CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &path)); + return path.AppendASCII("third_party") + .AppendASCII("zlib") + .AppendASCII("google") + .AppendASCII("test") + .AppendASCII("data"); + } + + static Paths GetPaths(const base::FilePath& zip_path, + base::StringPiece encoding = {}) { + Paths paths; + + if (ZipReader reader; reader.Open(zip_path)) { + if (!encoding.empty()) + reader.SetEncoding(std::string(encoding)); + + while (const ZipReader::Entry* const entry = reader.Next()) { + EXPECT_TRUE(reader.ok()); + paths.push_back(entry->path); + } + + EXPECT_TRUE(reader.ok()); + } + + return paths; + } + + // The path to temporary directory used to contain the test operations. + base::FilePath test_dir_; + // The path to the test data directory where test.zip etc. are located. + const base::FilePath data_dir_ = GetTestDataDirectory(); + // The path to test.zip in the test data directory. + const base::FilePath test_zip_file_ = data_dir_.AppendASCII("test.zip"); + const Paths test_zip_contents_ = { + base::FilePath(FILE_PATH_LITERAL("foo/")), + base::FilePath(FILE_PATH_LITERAL("foo/bar/")), + base::FilePath(FILE_PATH_LITERAL("foo/bar/baz.txt")), + base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt")), + base::FilePath(FILE_PATH_LITERAL("foo/bar.txt")), + base::FilePath(FILE_PATH_LITERAL("foo.txt")), + base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden")), + }; + base::ScopedTempDir temp_dir_; + base::test::TaskEnvironment task_environment_; +}; + +TEST_F(ZipReaderTest, Open_ValidZipFile) { + ZipReader reader; + EXPECT_TRUE(reader.Open(test_zip_file_)); + EXPECT_TRUE(reader.ok()); +} + +TEST_F(ZipReaderTest, Open_ValidZipPlatformFile) { + ZipReader reader; + EXPECT_FALSE(reader.ok()); + FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); + EXPECT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); + EXPECT_TRUE(reader.ok()); +} + +TEST_F(ZipReaderTest, Open_NonExistentFile) { + ZipReader reader; + EXPECT_FALSE(reader.ok()); + EXPECT_FALSE(reader.Open(data_dir_.AppendASCII("nonexistent.zip"))); + EXPECT_FALSE(reader.ok()); +} + +TEST_F(ZipReaderTest, Open_ExistentButNonZipFile) { + ZipReader reader; + EXPECT_FALSE(reader.ok()); + EXPECT_FALSE(reader.Open(data_dir_.AppendASCII("create_test_zip.sh"))); + EXPECT_FALSE(reader.ok()); +} + +TEST_F(ZipReaderTest, Open_EmptyFile) { + ZipReader reader; + EXPECT_FALSE(reader.ok()); + EXPECT_FALSE(reader.Open(data_dir_.AppendASCII("empty.zip"))); + EXPECT_FALSE(reader.ok()); +} + +// Iterate through the contents in the test ZIP archive, and compare that the +// contents collected from the ZipReader matches the expected contents. +TEST_F(ZipReaderTest, Iteration) { + Paths actual_contents; + ZipReader reader; + EXPECT_FALSE(reader.ok()); + EXPECT_TRUE(reader.Open(test_zip_file_)); + EXPECT_TRUE(reader.ok()); + while (const ZipReader::Entry* const entry = reader.Next()) { + EXPECT_TRUE(reader.ok()); + actual_contents.push_back(entry->path); + } + + EXPECT_TRUE(reader.ok()); + EXPECT_FALSE(reader.Next()); // Shouldn't go further. + EXPECT_TRUE(reader.ok()); + + EXPECT_THAT(actual_contents, SizeIs(reader.num_entries())); + EXPECT_THAT(actual_contents, ElementsAreArray(test_zip_contents_)); +} + +// Open the test ZIP archive from a file descriptor, iterate through its +// contents, and compare that they match the expected contents. +TEST_F(ZipReaderTest, PlatformFileIteration) { + Paths actual_contents; + ZipReader reader; + FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); + EXPECT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); + EXPECT_TRUE(reader.ok()); + while (const ZipReader::Entry* const entry = reader.Next()) { + EXPECT_TRUE(reader.ok()); + actual_contents.push_back(entry->path); + } + + EXPECT_TRUE(reader.ok()); + EXPECT_FALSE(reader.Next()); // Shouldn't go further. + EXPECT_TRUE(reader.ok()); + + EXPECT_THAT(actual_contents, SizeIs(reader.num_entries())); + EXPECT_THAT(actual_contents, ElementsAreArray(test_zip_contents_)); +} + +TEST_F(ZipReaderTest, RegularFile) { + ZipReader reader; + ASSERT_TRUE(reader.Open(test_zip_file_)); + base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); + + const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path); + ASSERT_TRUE(entry); + + EXPECT_EQ(target_path, entry->path); + EXPECT_EQ(13527, entry->original_size); + EXPECT_EQ("2009-05-29 06:22:20.000", + base::UnlocalizedTimeFormatWithPattern(entry->last_modified, + "y-MM-dd HH:mm:ss.SSS", + icu::TimeZone::getGMT())); + EXPECT_FALSE(entry->is_unsafe); + EXPECT_FALSE(entry->is_directory); +} + +TEST_F(ZipReaderTest, DotDotFile) { + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("evil.zip"))); + base::FilePath target_path(FILE_PATH_LITERAL( + "UP/levilevilevilevilevilevilevilevilevilevilevilevil")); + const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path); + ASSERT_TRUE(entry); + EXPECT_EQ(target_path, entry->path); + EXPECT_FALSE(entry->is_unsafe); + EXPECT_FALSE(entry->is_directory); +} + +TEST_F(ZipReaderTest, InvalidUTF8File) { + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("evil_via_invalid_utf8.zip"))); + base::FilePath target_path = base::FilePath::FromUTF8Unsafe(".�.�evil.txt"); + const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path); + ASSERT_TRUE(entry); + EXPECT_EQ(target_path, entry->path); + EXPECT_FALSE(entry->is_unsafe); + EXPECT_FALSE(entry->is_directory); +} + +// By default, file paths in ZIPs are interpreted as UTF-8. But in this test, +// the ZIP archive contains file paths that are actually encoded in Shift JIS. +// The SJIS-encoded paths are thus wrongly interpreted as UTF-8, resulting in +// garbled paths. Invalid UTF-8 sequences are safely converted to the +// replacement character �. +TEST_F(ZipReaderTest, EncodingSjisAsUtf8) { + EXPECT_THAT( + GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip")), + ElementsAre( + base::FilePath::FromUTF8Unsafe("�V�����t�H���_/SJIS_835C_��.txt"), + base::FilePath::FromUTF8Unsafe( + "�V�����t�H���_/�V�����e�L�X�g �h�L�������g.txt"))); +} + +// In this test, SJIS-encoded paths are interpreted as Code Page 1252. This +// results in garbled paths. Note the presence of C1 control codes U+0090 and +// U+0081 in the garbled paths. +TEST_F(ZipReaderTest, EncodingSjisAs1252) { + EXPECT_THAT( + GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip"), "windows-1252"), + ElementsAre(base::FilePath::FromUTF8Unsafe( + "\u0090V‚µ‚¢ƒtƒHƒ‹ƒ_/SJIS_835C_ƒ�.txt"), + base::FilePath::FromUTF8Unsafe( + "\u0090V‚µ‚¢ƒtƒHƒ‹ƒ_/\u0090V‚µ‚¢ƒeƒLƒXƒg " + "ƒhƒLƒ…ƒ\u0081ƒ“ƒg.txt"))); +} + +// In this test, SJIS-encoded paths are interpreted as Code Page 866. This +// results in garbled paths. +TEST_F(ZipReaderTest, EncodingSjisAsIbm866) { + EXPECT_THAT( + GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip"), "IBM866"), + ElementsAre( + base::FilePath::FromUTF8Unsafe("РVВ╡ВвГtГHГЛГ_/SJIS_835C_Г�.txt"), + base::FilePath::FromUTF8Unsafe( + "РVВ╡ВвГtГHГЛГ_/РVВ╡ВвГeГLГXГg ГhГLГЕГБГУГg.txt"))); +} + +// Tests that SJIS-encoded paths are correctly converted to Unicode. +TEST_F(ZipReaderTest, EncodingSjis) { + EXPECT_THAT( + GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip"), "Shift_JIS"), + ElementsAre( + base::FilePath::FromUTF8Unsafe("新しいフォルダ/SJIS_835C_ソ.txt"), + base::FilePath::FromUTF8Unsafe( + "新しいフォルダ/新しいテキスト ドキュメント.txt"))); +} + +TEST_F(ZipReaderTest, AbsoluteFile) { + ZipReader reader; + ASSERT_TRUE( + reader.Open(data_dir_.AppendASCII("evil_via_absolute_file_name.zip"))); + base::FilePath target_path(FILE_PATH_LITERAL("ROOT/evil.txt")); + const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path); + ASSERT_TRUE(entry); + EXPECT_EQ(target_path, entry->path); + EXPECT_FALSE(entry->is_unsafe); + EXPECT_FALSE(entry->is_directory); +} + +TEST_F(ZipReaderTest, Directory) { + ZipReader reader; + ASSERT_TRUE(reader.Open(test_zip_file_)); + base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/")); + const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path); + ASSERT_TRUE(entry); + EXPECT_EQ(target_path, entry->path); + // The directory size should be zero. + EXPECT_EQ(0, entry->original_size); + EXPECT_EQ("2009-05-31 15:49:52.000", + base::UnlocalizedTimeFormatWithPattern(entry->last_modified, + "y-MM-dd HH:mm:ss.SSS", + icu::TimeZone::getGMT())); + EXPECT_FALSE(entry->is_unsafe); + EXPECT_TRUE(entry->is_directory); +} + +TEST_F(ZipReaderTest, EncryptedFile_WrongPassword) { + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip"))); + reader.SetPassword("wrong password"); + + { + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromASCII("ClearText.txt"), entry->path); + EXPECT_FALSE(entry->is_directory); + EXPECT_FALSE(entry->is_encrypted); + std::string contents = "dummy"; + EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents)); + EXPECT_EQ("This is not encrypted.\n", contents); + } + + for (const base::StringPiece path : { + "Encrypted AES-128.txt", + "Encrypted AES-192.txt", + "Encrypted AES-256.txt", + "Encrypted ZipCrypto.txt", + }) { + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromASCII(path), entry->path); + EXPECT_FALSE(entry->is_directory); + EXPECT_TRUE(entry->is_encrypted); + std::string contents = "dummy"; + EXPECT_FALSE(reader.ExtractCurrentEntryToString(&contents)); + } + + EXPECT_FALSE(reader.Next()); + EXPECT_TRUE(reader.ok()); +} + +TEST_F(ZipReaderTest, EncryptedFile_RightPassword) { + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip"))); + reader.SetPassword("password"); + + { + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromASCII("ClearText.txt"), entry->path); + EXPECT_FALSE(entry->is_directory); + EXPECT_FALSE(entry->is_encrypted); + std::string contents = "dummy"; + EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents)); + EXPECT_EQ("This is not encrypted.\n", contents); + } + + // TODO(crbug.com/1296838) Support AES encryption. + for (const base::StringPiece path : { + "Encrypted AES-128.txt", + "Encrypted AES-192.txt", + "Encrypted AES-256.txt", + }) { + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromASCII(path), entry->path); + EXPECT_FALSE(entry->is_directory); + EXPECT_TRUE(entry->is_encrypted); + std::string contents = "dummy"; + EXPECT_FALSE(reader.ExtractCurrentEntryToString(&contents)); + EXPECT_EQ("", contents); + } + + { + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromASCII("Encrypted ZipCrypto.txt"), + entry->path); + EXPECT_FALSE(entry->is_directory); + EXPECT_TRUE(entry->is_encrypted); + std::string contents = "dummy"; + EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents)); + EXPECT_EQ("This is encrypted with ZipCrypto.\n", contents); + } + + EXPECT_FALSE(reader.Next()); + EXPECT_TRUE(reader.ok()); +} + +// Verifies that the ZipReader class can extract a file from a zip archive +// stored in memory. This test opens a zip archive in a std::string object, +// extracts its content, and verifies the content is the same as the expected +// text. +TEST_F(ZipReaderTest, OpenFromString) { + // A zip archive consisting of one file "test.txt", which is a 16-byte text + // file that contains "This is a test.\n". + const char kTestData[] = + "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\xa4\x66\x24\x41\x13\xe8" + "\xcb\x27\x10\x00\x00\x00\x10\x00\x00\x00\x08\x00\x1c\x00\x74\x65" + "\x73\x74\x2e\x74\x78\x74\x55\x54\x09\x00\x03\x34\x89\x45\x50\x34" + "\x89\x45\x50\x75\x78\x0b\x00\x01\x04\x8e\xf0\x00\x00\x04\x88\x13" + "\x00\x00\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74" + "\x2e\x0a\x50\x4b\x01\x02\x1e\x03\x0a\x00\x00\x00\x00\x00\xa4\x66" + "\x24\x41\x13\xe8\xcb\x27\x10\x00\x00\x00\x10\x00\x00\x00\x08\x00" + "\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xa4\x81\x00\x00\x00\x00" + "\x74\x65\x73\x74\x2e\x74\x78\x74\x55\x54\x05\x00\x03\x34\x89\x45" + "\x50\x75\x78\x0b\x00\x01\x04\x8e\xf0\x00\x00\x04\x88\x13\x00\x00" + "\x50\x4b\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00\x4e\x00\x00\x00" + "\x52\x00\x00\x00\x00\x00"; + std::string data(kTestData, std::size(kTestData)); + ZipReader reader; + ASSERT_TRUE(reader.OpenFromString(data)); + base::FilePath target_path(FILE_PATH_LITERAL("test.txt")); + ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path)); + ASSERT_TRUE(ExtractCurrentEntryToFilePath(&reader, + test_dir_.AppendASCII("test.txt"))); + + std::string actual; + ASSERT_TRUE( + base::ReadFileToString(test_dir_.AppendASCII("test.txt"), &actual)); + EXPECT_EQ(std::string("This is a test.\n"), actual); +} + +// Verifies that the asynchronous extraction to a file works. +TEST_F(ZipReaderTest, ExtractToFileAsync_RegularFile) { + MockUnzipListener listener; + + ZipReader reader; + base::FilePath target_file = test_dir_.AppendASCII("quux.txt"); + base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); + ASSERT_TRUE(reader.Open(test_zip_file_)); + ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path)); + reader.ExtractCurrentEntryToFilePathAsync( + target_file, + base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()), + base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()), + base::BindRepeating(&MockUnzipListener::OnUnzipProgress, + listener.AsWeakPtr())); + + EXPECT_EQ(0, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_EQ(0, listener.progress_calls()); + + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(1, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_LE(1, listener.progress_calls()); + + std::string output; + ASSERT_TRUE( + base::ReadFileToString(test_dir_.AppendASCII("quux.txt"), &output)); + const std::string md5 = base::MD5String(output); + EXPECT_EQ(kQuuxExpectedMD5, md5); + + int64_t file_size = 0; + ASSERT_TRUE(base::GetFileSize(target_file, &file_size)); + + EXPECT_EQ(file_size, listener.current_progress()); +} + +TEST_F(ZipReaderTest, ExtractToFileAsync_Encrypted_NoPassword) { + MockUnzipListener listener; + + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip"))); + ASSERT_TRUE(LocateAndOpenEntry( + &reader, base::FilePath::FromASCII("Encrypted ZipCrypto.txt"))); + const base::FilePath target_path = test_dir_.AppendASCII("extracted"); + reader.ExtractCurrentEntryToFilePathAsync( + target_path, + base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()), + base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()), + base::BindRepeating(&MockUnzipListener::OnUnzipProgress, + listener.AsWeakPtr())); + + EXPECT_EQ(0, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_EQ(0, listener.progress_calls()); + + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(0, listener.success_calls()); + EXPECT_EQ(1, listener.failure_calls()); + EXPECT_LE(1, listener.progress_calls()); + + // The extracted file contains rubbish data. + // We probably shouldn't even look at it. + std::string contents; + ASSERT_TRUE(base::ReadFileToString(target_path, &contents)); + EXPECT_NE("", contents); + EXPECT_EQ(contents.size(), listener.current_progress()); +} + +TEST_F(ZipReaderTest, ExtractToFileAsync_Encrypted_RightPassword) { + MockUnzipListener listener; + + ZipReader reader; + reader.SetPassword("password"); + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip"))); + ASSERT_TRUE(LocateAndOpenEntry( + &reader, base::FilePath::FromASCII("Encrypted ZipCrypto.txt"))); + const base::FilePath target_path = test_dir_.AppendASCII("extracted"); + reader.ExtractCurrentEntryToFilePathAsync( + target_path, + base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()), + base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()), + base::BindRepeating(&MockUnzipListener::OnUnzipProgress, + listener.AsWeakPtr())); + + EXPECT_EQ(0, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_EQ(0, listener.progress_calls()); + + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(1, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_LE(1, listener.progress_calls()); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(target_path, &contents)); + EXPECT_EQ("This is encrypted with ZipCrypto.\n", contents); + EXPECT_EQ(contents.size(), listener.current_progress()); +} + +TEST_F(ZipReaderTest, ExtractToFileAsync_WrongCrc) { + MockUnzipListener listener; + + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Wrong CRC.zip"))); + ASSERT_TRUE( + LocateAndOpenEntry(&reader, base::FilePath::FromASCII("Corrupted.txt"))); + const base::FilePath target_path = test_dir_.AppendASCII("extracted"); + reader.ExtractCurrentEntryToFilePathAsync( + target_path, + base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()), + base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()), + base::BindRepeating(&MockUnzipListener::OnUnzipProgress, + listener.AsWeakPtr())); + + EXPECT_EQ(0, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_EQ(0, listener.progress_calls()); + + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(0, listener.success_calls()); + EXPECT_EQ(1, listener.failure_calls()); + EXPECT_LE(1, listener.progress_calls()); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(target_path, &contents)); + EXPECT_EQ("This file has been changed after its CRC was computed.\n", + contents); + EXPECT_EQ(contents.size(), listener.current_progress()); +} + +// Verifies that the asynchronous extraction to a file works. +TEST_F(ZipReaderTest, ExtractToFileAsync_Directory) { + MockUnzipListener listener; + + ZipReader reader; + base::FilePath target_file = test_dir_.AppendASCII("foo"); + base::FilePath target_path(FILE_PATH_LITERAL("foo/")); + ASSERT_TRUE(reader.Open(test_zip_file_)); + ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path)); + reader.ExtractCurrentEntryToFilePathAsync( + target_file, + base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()), + base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()), + base::BindRepeating(&MockUnzipListener::OnUnzipProgress, + listener.AsWeakPtr())); + + EXPECT_EQ(0, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_EQ(0, listener.progress_calls()); + + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(1, listener.success_calls()); + EXPECT_EQ(0, listener.failure_calls()); + EXPECT_GE(0, listener.progress_calls()); + + ASSERT_TRUE(base::DirectoryExists(target_file)); +} + +TEST_F(ZipReaderTest, ExtractCurrentEntryToString) { + // test_mismatch_size.zip contains files with names from 0.txt to 7.txt with + // sizes from 0 to 7 bytes respectively, being the contents of each file a + // substring of "0123456" starting at '0'. + base::FilePath test_zip_file = + data_dir_.AppendASCII("test_mismatch_size.zip"); + + ZipReader reader; + std::string contents; + ASSERT_TRUE(reader.Open(test_zip_file)); + + for (size_t i = 0; i < 8; i++) { + SCOPED_TRACE(base::StringPrintf("Processing %d.txt", static_cast(i))); + + base::FilePath file_name = base::FilePath::FromUTF8Unsafe( + base::StringPrintf("%d.txt", static_cast(i))); + ASSERT_TRUE(LocateAndOpenEntry(&reader, file_name)); + + if (i > 1) { + // Off by one byte read limit: must fail. + EXPECT_FALSE(reader.ExtractCurrentEntryToString(i - 1, &contents)); + } + + if (i > 0) { + // Exact byte read limit: must pass. + EXPECT_TRUE(reader.ExtractCurrentEntryToString(i, &contents)); + EXPECT_EQ(std::string(base::StringPiece("0123456", i)), contents); + } + + // More than necessary byte read limit: must pass. + EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents)); + EXPECT_EQ(std::string(base::StringPiece("0123456", i)), contents); + } + reader.Close(); +} + +TEST_F(ZipReaderTest, ExtractPartOfCurrentEntry) { + // test_mismatch_size.zip contains files with names from 0.txt to 7.txt with + // sizes from 0 to 7 bytes respectively, being the contents of each file a + // substring of "0123456" starting at '0'. + base::FilePath test_zip_file = + data_dir_.AppendASCII("test_mismatch_size.zip"); + + ZipReader reader; + std::string contents; + ASSERT_TRUE(reader.Open(test_zip_file)); + + base::FilePath file_name0 = base::FilePath::FromUTF8Unsafe("0.txt"); + ASSERT_TRUE(LocateAndOpenEntry(&reader, file_name0)); + EXPECT_TRUE(reader.ExtractCurrentEntryToString(0, &contents)); + EXPECT_EQ("", contents); + EXPECT_TRUE(reader.ExtractCurrentEntryToString(1, &contents)); + EXPECT_EQ("", contents); + + base::FilePath file_name1 = base::FilePath::FromUTF8Unsafe("1.txt"); + ASSERT_TRUE(LocateAndOpenEntry(&reader, file_name1)); + EXPECT_TRUE(reader.ExtractCurrentEntryToString(0, &contents)); + EXPECT_EQ("", contents); + EXPECT_TRUE(reader.ExtractCurrentEntryToString(1, &contents)); + EXPECT_EQ("0", contents); + EXPECT_TRUE(reader.ExtractCurrentEntryToString(2, &contents)); + EXPECT_EQ("0", contents); + + base::FilePath file_name4 = base::FilePath::FromUTF8Unsafe("4.txt"); + ASSERT_TRUE(LocateAndOpenEntry(&reader, file_name4)); + EXPECT_TRUE(reader.ExtractCurrentEntryToString(0, &contents)); + EXPECT_EQ("", contents); + EXPECT_FALSE(reader.ExtractCurrentEntryToString(2, &contents)); + EXPECT_EQ("01", contents); + EXPECT_TRUE(reader.ExtractCurrentEntryToString(4, &contents)); + EXPECT_EQ("0123", contents); + // Checks that entire file is extracted and function returns true when + // |max_read_bytes| is larger than file size. + EXPECT_TRUE(reader.ExtractCurrentEntryToString(5, &contents)); + EXPECT_EQ("0123", contents); + + reader.Close(); +} + +TEST_F(ZipReaderTest, ExtractPosixPermissions) { + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("test_posix_permissions.zip"))); + for (auto entry : {"0.txt", "1.txt", "2.txt", "3.txt"}) { + ASSERT_TRUE(LocateAndOpenEntry(&reader, base::FilePath::FromASCII(entry))); + FilePathWriterDelegate delegate(temp_dir.GetPath().AppendASCII(entry)); + ASSERT_TRUE(reader.ExtractCurrentEntry(&delegate)); + } + reader.Close(); + +#if defined(OS_POSIX) + // This assumes a umask of at least 0400. + int mode = 0; + EXPECT_TRUE(base::GetPosixFilePermissions( + temp_dir.GetPath().AppendASCII("0.txt"), &mode)); + EXPECT_EQ(mode & 0700, 0700); + EXPECT_TRUE(base::GetPosixFilePermissions( + temp_dir.GetPath().AppendASCII("1.txt"), &mode)); + EXPECT_EQ(mode & 0700, 0600); + EXPECT_TRUE(base::GetPosixFilePermissions( + temp_dir.GetPath().AppendASCII("2.txt"), &mode)); + EXPECT_EQ(mode & 0700, 0700); + EXPECT_TRUE(base::GetPosixFilePermissions( + temp_dir.GetPath().AppendASCII("3.txt"), &mode)); + EXPECT_EQ(mode & 0700, 0600); +#endif +} + +// This test exposes http://crbug.com/430959, at least on OS X +TEST_F(ZipReaderTest, DISABLED_LeakDetectionTest) { + for (int i = 0; i < 100000; ++i) { + FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY); + ZipReader reader; + ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file())); + } +} + +// Test that when WriterDelegate::PrepareMock returns false, no other methods on +// the delegate are called and the extraction fails. +TEST_F(ZipReaderTest, ExtractCurrentEntryPrepareFailure) { + testing::StrictMock mock_writer; + + EXPECT_CALL(mock_writer, PrepareOutput()).WillOnce(Return(false)); + + base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); + ZipReader reader; + + ASSERT_TRUE(reader.Open(test_zip_file_)); + ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path)); + ASSERT_FALSE(reader.ExtractCurrentEntry(&mock_writer)); +} + +// Test that when WriterDelegate::WriteBytes returns false, only the OnError +// method on the delegate is called and the extraction fails. +TEST_F(ZipReaderTest, ExtractCurrentEntryWriteBytesFailure) { + testing::StrictMock mock_writer; + + EXPECT_CALL(mock_writer, PrepareOutput()).WillOnce(Return(true)); + EXPECT_CALL(mock_writer, WriteBytes(_, _)).WillOnce(Return(false)); + EXPECT_CALL(mock_writer, OnError()); + + base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); + ZipReader reader; + + ASSERT_TRUE(reader.Open(test_zip_file_)); + ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path)); + ASSERT_FALSE(reader.ExtractCurrentEntry(&mock_writer)); +} + +// Test that extraction succeeds when the writer delegate reports all is well. +TEST_F(ZipReaderTest, ExtractCurrentEntrySuccess) { + testing::StrictMock mock_writer; + + EXPECT_CALL(mock_writer, PrepareOutput()).WillOnce(Return(true)); + EXPECT_CALL(mock_writer, WriteBytes(_, _)).WillRepeatedly(Return(true)); + EXPECT_CALL(mock_writer, SetPosixFilePermissions(_)); + EXPECT_CALL(mock_writer, SetTimeModified(_)); + + base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt")); + ZipReader reader; + + ASSERT_TRUE(reader.Open(test_zip_file_)); + ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path)); + ASSERT_TRUE(reader.ExtractCurrentEntry(&mock_writer)); +} + +TEST_F(ZipReaderTest, WrongCrc) { + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Wrong CRC.zip"))); + + const ZipReader::Entry* const entry = + LocateAndOpenEntry(&reader, base::FilePath::FromASCII("Corrupted.txt")); + ASSERT_TRUE(entry); + + std::string contents = "dummy"; + EXPECT_FALSE(reader.ExtractCurrentEntryToString(&contents)); + EXPECT_EQ("This file has been changed after its CRC was computed.\n", + contents); + + contents = "dummy"; + EXPECT_FALSE( + reader.ExtractCurrentEntryToString(entry->original_size + 1, &contents)); + EXPECT_EQ("This file has been changed after its CRC was computed.\n", + contents); + + contents = "dummy"; + EXPECT_FALSE( + reader.ExtractCurrentEntryToString(entry->original_size, &contents)); + EXPECT_EQ("This file has been changed after its CRC was computed.\n", + contents); + + contents = "dummy"; + EXPECT_FALSE( + reader.ExtractCurrentEntryToString(entry->original_size - 1, &contents)); + EXPECT_EQ("This file has been changed after its CRC was computed.", contents); +} + +class FileWriterDelegateTest : public ::testing::Test { + protected: + void SetUp() override { + ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_)); + file_.Initialize(temp_file_path_, + (base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ | + base::File::FLAG_WRITE | base::File::FLAG_WIN_TEMPORARY | + base::File::FLAG_DELETE_ON_CLOSE)); + ASSERT_TRUE(file_.IsValid()); + } + + base::FilePath temp_file_path_; + base::File file_; +}; + +TEST_F(FileWriterDelegateTest, WriteToEnd) { + const std::string payload = "This is the actualy payload data.\n"; + + { + FileWriterDelegate writer(&file_); + EXPECT_EQ(0, writer.file_length()); + ASSERT_TRUE(writer.PrepareOutput()); + ASSERT_TRUE(writer.WriteBytes(payload.data(), payload.size())); + EXPECT_EQ(payload.size(), writer.file_length()); + } + + EXPECT_EQ(payload.size(), file_.GetLength()); +} + +TEST_F(FileWriterDelegateTest, EmptyOnError) { + const std::string payload = "This is the actualy payload data.\n"; + + { + FileWriterDelegate writer(&file_); + EXPECT_EQ(0, writer.file_length()); + ASSERT_TRUE(writer.PrepareOutput()); + ASSERT_TRUE(writer.WriteBytes(payload.data(), payload.size())); + EXPECT_EQ(payload.size(), writer.file_length()); + EXPECT_EQ(payload.size(), file_.GetLength()); + writer.OnError(); + EXPECT_EQ(0, writer.file_length()); + } + + EXPECT_EQ(0, file_.GetLength()); +} + +} // namespace zip diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc new file mode 100644 index 000000000..d0fc02fd9 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_unittest.cc @@ -0,0 +1,1428 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "base/files/file.h" +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/functional/bind.h" +#include "base/logging.h" +#include "base/path_service.h" +#include "base/strings/strcat.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "base/test/bind.h" +#include "base/time/time.h" +#include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" +#include "third_party/zlib/google/zip.h" +#include "third_party/zlib/google/zip_internal.h" +#include "third_party/zlib/google/zip_reader.h" + +// Convenience macro to create a file path from a string literal. +#define FP(path) base::FilePath(FILE_PATH_LITERAL(path)) + +namespace { + +using testing::UnorderedElementsAre; +using testing::UnorderedElementsAreArray; + +std::vector GetRelativePaths(const base::FilePath& dir, + base::FileEnumerator::FileType type) { + std::vector got_paths; + base::FileEnumerator files(dir, true, type); + for (base::FilePath path = files.Next(); !path.empty(); path = files.Next()) { + base::FilePath relative; + EXPECT_TRUE(dir.AppendRelativePath(path, &relative)); + got_paths.push_back(relative.NormalizePathSeparatorsTo('/').AsUTF8Unsafe()); + } + + EXPECT_EQ(base::File::FILE_OK, files.GetError()); + return got_paths; +} + +bool CreateFile(const std::string& content, + base::FilePath* file_path, + base::File* file) { + if (!base::CreateTemporaryFile(file_path)) + return false; + + if (base::WriteFile(*file_path, content.data(), content.size()) == -1) + return false; + + *file = base::File( + *file_path, base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ); + return file->IsValid(); +} + +// A WriterDelegate that logs progress once per second. +class ProgressWriterDelegate : public zip::WriterDelegate { + public: + explicit ProgressWriterDelegate(int64_t expected_size) + : expected_size_(expected_size) { + CHECK_GT(expected_size_, 0); + } + + bool WriteBytes(const char* data, int num_bytes) override { + received_bytes_ += num_bytes; + LogProgressIfNecessary(); + return true; + } + + void SetTimeModified(const base::Time& time) override { LogProgress(); } + + int64_t received_bytes() const { return received_bytes_; } + + private: + void LogProgressIfNecessary() { + const base::TimeTicks now = base::TimeTicks::Now(); + if (next_progress_report_time_ > now) + return; + + next_progress_report_time_ = now + progress_period_; + LogProgress(); + } + + void LogProgress() const { + LOG(INFO) << "Unzipping... " << std::setw(3) + << (100 * received_bytes_ / expected_size_) << "%"; + } + + const base::TimeDelta progress_period_ = base::Seconds(1); + base::TimeTicks next_progress_report_time_ = + base::TimeTicks::Now() + progress_period_; + const uint64_t expected_size_; + int64_t received_bytes_ = 0; +}; + +// A virtual file system containing: +// /test +// /test/foo.txt +// /test/bar/bar1.txt +// /test/bar/bar2.txt +// Used to test providing a custom zip::FileAccessor when unzipping. +class VirtualFileSystem : public zip::FileAccessor { + public: + static constexpr char kFooContent[] = "This is foo."; + static constexpr char kBar1Content[] = "This is bar."; + static constexpr char kBar2Content[] = "This is bar too."; + + VirtualFileSystem() { + base::FilePath test_dir; + base::FilePath foo_txt_path = test_dir.AppendASCII("foo.txt"); + + base::FilePath file_path; + base::File file; + bool success = CreateFile(kFooContent, &file_path, &file); + DCHECK(success); + files_[foo_txt_path] = std::move(file); + + base::FilePath bar_dir = test_dir.AppendASCII("bar"); + base::FilePath bar1_txt_path = bar_dir.AppendASCII("bar1.txt"); + success = CreateFile(kBar1Content, &file_path, &file); + DCHECK(success); + files_[bar1_txt_path] = std::move(file); + + base::FilePath bar2_txt_path = bar_dir.AppendASCII("bar2.txt"); + success = CreateFile(kBar2Content, &file_path, &file); + DCHECK(success); + files_[bar2_txt_path] = std::move(file); + + file_tree_[base::FilePath()] = {{foo_txt_path}, {bar_dir}}; + file_tree_[bar_dir] = {{bar1_txt_path, bar2_txt_path}}; + file_tree_[foo_txt_path] = {}; + file_tree_[bar1_txt_path] = {}; + file_tree_[bar2_txt_path] = {}; + } + + VirtualFileSystem(const VirtualFileSystem&) = delete; + VirtualFileSystem& operator=(const VirtualFileSystem&) = delete; + + ~VirtualFileSystem() override = default; + + private: + bool Open(const zip::Paths paths, + std::vector* const files) override { + DCHECK(files); + files->reserve(files->size() + paths.size()); + + for (const base::FilePath& path : paths) { + const auto it = files_.find(path); + if (it == files_.end()) { + files->emplace_back(); + } else { + EXPECT_TRUE(it->second.IsValid()); + files->push_back(std::move(it->second)); + } + } + + return true; + } + + bool List(const base::FilePath& path, + std::vector* const files, + std::vector* const subdirs) override { + DCHECK(!path.IsAbsolute()); + DCHECK(files); + DCHECK(subdirs); + + const auto it = file_tree_.find(path); + if (it == file_tree_.end()) + return false; + + for (const base::FilePath& file : it->second.files) { + DCHECK(!file.empty()); + files->push_back(file); + } + + for (const base::FilePath& subdir : it->second.subdirs) { + DCHECK(!subdir.empty()); + subdirs->push_back(subdir); + } + + return true; + } + + bool GetInfo(const base::FilePath& path, Info* const info) override { + DCHECK(!path.IsAbsolute()); + DCHECK(info); + + if (!file_tree_.count(path)) + return false; + + info->is_directory = !files_.count(path); + info->last_modified = + base::Time::FromDoubleT(172097977); // Some random date. + + return true; + } + + struct DirContents { + std::vector files, subdirs; + }; + + std::unordered_map file_tree_; + std::unordered_map files_; +}; + +// static +constexpr char VirtualFileSystem::kFooContent[]; +constexpr char VirtualFileSystem::kBar1Content[]; +constexpr char VirtualFileSystem::kBar2Content[]; + +// Make the test a PlatformTest to setup autorelease pools properly on Mac. +class ZipTest : public PlatformTest { + protected: + enum ValidYearType { VALID_YEAR, INVALID_YEAR }; + + virtual void SetUp() { + PlatformTest::SetUp(); + + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + test_dir_ = temp_dir_.GetPath(); + + base::FilePath zip_path(test_dir_); + zip_contents_.insert(zip_path.AppendASCII("foo.txt")); + zip_path = zip_path.AppendASCII("foo"); + zip_contents_.insert(zip_path); + zip_contents_.insert(zip_path.AppendASCII("bar.txt")); + zip_path = zip_path.AppendASCII("bar"); + zip_contents_.insert(zip_path); + zip_contents_.insert(zip_path.AppendASCII("baz.txt")); + zip_contents_.insert(zip_path.AppendASCII("quux.txt")); + zip_contents_.insert(zip_path.AppendASCII(".hidden")); + + // Include a subset of files in |zip_file_list_| to test ZipFiles(). + zip_file_list_.push_back(FP("foo.txt")); + zip_file_list_.push_back(FP("foo/bar/quux.txt")); + zip_file_list_.push_back(FP("foo/bar/.hidden")); + } + + virtual void TearDown() { PlatformTest::TearDown(); } + + static base::FilePath GetDataDirectory() { + base::FilePath path; + bool success = base::PathService::Get(base::DIR_SOURCE_ROOT, &path); + EXPECT_TRUE(success); + return std::move(path) + .AppendASCII("third_party") + .AppendASCII("zlib") + .AppendASCII("google") + .AppendASCII("test") + .AppendASCII("data"); + } + + void TestUnzipFile(const base::FilePath::StringType& filename, + bool expect_hidden_files) { + TestUnzipFile(GetDataDirectory().Append(filename), expect_hidden_files); + } + + void TestUnzipFile(const base::FilePath& path, bool expect_hidden_files) { + ASSERT_TRUE(base::PathExists(path)) << "no file " << path; + ASSERT_TRUE(zip::Unzip(path, test_dir_)); + + base::FilePath original_dir = GetDataDirectory().AppendASCII("test"); + + base::FileEnumerator files( + test_dir_, true, + base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES); + + size_t count = 0; + for (base::FilePath unzipped_entry_path = files.Next(); + !unzipped_entry_path.empty(); unzipped_entry_path = files.Next()) { + EXPECT_EQ(zip_contents_.count(unzipped_entry_path), 1U) + << "Couldn't find " << unzipped_entry_path; + count++; + + if (base::PathExists(unzipped_entry_path) && + !base::DirectoryExists(unzipped_entry_path)) { + // It's a file, check its contents are what we zipped. + base::FilePath relative_path; + ASSERT_TRUE( + test_dir_.AppendRelativePath(unzipped_entry_path, &relative_path)) + << "Cannot append relative path failed, params: '" << test_dir_ + << "' and '" << unzipped_entry_path << "'"; + base::FilePath original_path = original_dir.Append(relative_path); + EXPECT_TRUE(base::ContentsEqual(original_path, unzipped_entry_path)) + << "Original file '" << original_path << "' and unzipped file '" + << unzipped_entry_path << "' have different contents"; + } + } + EXPECT_EQ(base::File::FILE_OK, files.GetError()); + + size_t expected_count = 0; + for (const base::FilePath& path : zip_contents_) { + if (expect_hidden_files || path.BaseName().value()[0] != '.') + ++expected_count; + } + + EXPECT_EQ(expected_count, count); + } + + // This function does the following: + // 1) Creates a test.txt file with the given last modification timestamp + // 2) Zips test.txt and extracts it back into a different location. + // 3) Confirms that test.txt in the output directory has the specified + // last modification timestamp if it is valid (|valid_year| is true). + // If the timestamp is not supported by the zip format, the last + // modification defaults to the current time. + void TestTimeStamp(const char* date_time, ValidYearType valid_year) { + SCOPED_TRACE(std::string("TestTimeStamp(") + date_time + ")"); + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); + base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input"); + base::FilePath out_dir = temp_dir.GetPath().AppendASCII("output"); + + base::FilePath src_file = src_dir.AppendASCII("test.txt"); + base::FilePath out_file = out_dir.AppendASCII("test.txt"); + + EXPECT_TRUE(base::CreateDirectory(src_dir)); + EXPECT_TRUE(base::CreateDirectory(out_dir)); + + base::Time test_mtime; + ASSERT_TRUE(base::Time::FromString(date_time, &test_mtime)); + + // Adjusting the current timestamp to the resolution that the zip file + // supports, which is 2 seconds. Note that between this call to Time::Now() + // and zip::Zip() the clock can advance a bit, hence the use of EXPECT_GE. + base::Time::Exploded now_parts; + base::Time::Now().UTCExplode(&now_parts); + now_parts.second = now_parts.second & ~1; + now_parts.millisecond = 0; + base::Time now_time; + EXPECT_TRUE(base::Time::FromUTCExploded(now_parts, &now_time)); + + EXPECT_EQ(1, base::WriteFile(src_file, "1", 1)); + EXPECT_TRUE(base::TouchFile(src_file, base::Time::Now(), test_mtime)); + + EXPECT_TRUE(zip::Zip(src_dir, zip_file, true)); + ASSERT_TRUE(zip::Unzip(zip_file, out_dir)); + + base::File::Info file_info; + EXPECT_TRUE(base::GetFileInfo(out_file, &file_info)); + EXPECT_EQ(file_info.size, 1); + + if (valid_year == VALID_YEAR) { + EXPECT_EQ(file_info.last_modified, test_mtime); + } else { + // Invalid date means the modification time will default to 'now'. + EXPECT_GE(file_info.last_modified, now_time); + } + } + + // The path to temporary directory used to contain the test operations. + base::FilePath test_dir_; + + base::ScopedTempDir temp_dir_; + + // Hard-coded contents of a known zip file. + std::unordered_set zip_contents_; + + // Hard-coded list of relative paths for a zip file created with ZipFiles. + std::vector zip_file_list_; +}; + +TEST_F(ZipTest, UnzipNoSuchFile) { + EXPECT_FALSE(zip::Unzip(GetDataDirectory().AppendASCII("No Such File.zip"), + test_dir_)); + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre()); + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES), + UnorderedElementsAre()); +} + +TEST_F(ZipTest, Unzip) { + TestUnzipFile(FILE_PATH_LITERAL("test.zip"), true); +} + +TEST_F(ZipTest, UnzipUncompressed) { + TestUnzipFile(FILE_PATH_LITERAL("test_nocompress.zip"), true); +} + +TEST_F(ZipTest, UnzipEvil) { + base::FilePath path = GetDataDirectory().AppendASCII("evil.zip"); + // Unzip the zip file into a sub directory of test_dir_ so evil.zip + // won't create a persistent file outside test_dir_ in case of a + // failure. + base::FilePath output_dir = test_dir_.AppendASCII("out"); + EXPECT_TRUE(zip::Unzip(path, output_dir)); + EXPECT_TRUE(base::PathExists(output_dir.AppendASCII( + "UP/levilevilevilevilevilevilevilevilevilevilevilevil"))); +} + +TEST_F(ZipTest, UnzipEvil2) { + // The ZIP file contains a file with invalid UTF-8 in its file name. + base::FilePath path = + GetDataDirectory().AppendASCII("evil_via_invalid_utf8.zip"); + // See the comment at UnzipEvil() for why we do this. + base::FilePath output_dir = test_dir_.AppendASCII("out"); + ASSERT_TRUE(zip::Unzip(path, output_dir)); + ASSERT_TRUE(base::PathExists( + output_dir.Append(base::FilePath::FromUTF8Unsafe(".�.�evil.txt")))); + ASSERT_FALSE(base::PathExists(output_dir.AppendASCII("../evil.txt"))); +} + +TEST_F(ZipTest, UnzipWithFilter) { + auto filter = base::BindRepeating([](const base::FilePath& path) { + return path.BaseName().MaybeAsASCII() == "foo.txt"; + }); + ASSERT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("test.zip"), test_dir_, + {.filter = std::move(filter)})); + // Only foo.txt should have been extracted. + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("foo.txt")); + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES), + UnorderedElementsAre()); +} + +TEST_F(ZipTest, UnzipEncryptedWithRightPassword) { + // TODO(crbug.com/1296838) Also check the AES-encrypted files. + auto filter = base::BindRepeating([](const base::FilePath& path) { + return !base::StartsWith(path.MaybeAsASCII(), "Encrypted AES"); + }); + + ASSERT_TRUE(zip::Unzip( + GetDataDirectory().AppendASCII("Different Encryptions.zip"), test_dir_, + {.filter = std::move(filter), .password = "password"})); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"), + &contents)); + EXPECT_EQ("This is not encrypted.\n", contents); + + ASSERT_TRUE(base::ReadFileToString( + test_dir_.AppendASCII("Encrypted ZipCrypto.txt"), &contents)); + EXPECT_EQ("This is encrypted with ZipCrypto.\n", contents); +} + +TEST_F(ZipTest, UnzipEncryptedWithWrongPassword) { + // TODO(crbug.com/1296838) Also check the AES-encrypted files. + auto filter = base::BindRepeating([](const base::FilePath& path) { + return !base::StartsWith(path.MaybeAsASCII(), "Encrypted AES"); + }); + + ASSERT_FALSE(zip::Unzip( + GetDataDirectory().AppendASCII("Different Encryptions.zip"), test_dir_, + {.filter = std::move(filter), .password = "wrong"})); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"), + &contents)); + EXPECT_EQ("This is not encrypted.\n", contents); + + // No rubbish file should be left behind. + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("ClearText.txt")); +} + +TEST_F(ZipTest, UnzipEncryptedWithNoPassword) { + // TODO(crbug.com/1296838) Also check the AES-encrypted files. + auto filter = base::BindRepeating([](const base::FilePath& path) { + return !base::StartsWith(path.MaybeAsASCII(), "Encrypted AES"); + }); + + ASSERT_FALSE( + zip::Unzip(GetDataDirectory().AppendASCII("Different Encryptions.zip"), + test_dir_, {.filter = std::move(filter)})); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"), + &contents)); + EXPECT_EQ("This is not encrypted.\n", contents); + + // No rubbish file should be left behind. + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("ClearText.txt")); +} + +TEST_F(ZipTest, UnzipEncryptedContinueOnError) { + EXPECT_TRUE( + zip::Unzip(GetDataDirectory().AppendASCII("Different Encryptions.zip"), + test_dir_, {.continue_on_error = true})); + + std::string contents; + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"), + &contents)); + EXPECT_EQ("This is not encrypted.\n", contents); + + // No rubbish file should be left behind. + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("ClearText.txt")); +} + +TEST_F(ZipTest, UnzipWrongCrc) { + ASSERT_FALSE( + zip::Unzip(GetDataDirectory().AppendASCII("Wrong CRC.zip"), test_dir_)); + + // No rubbish file should be left behind. + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre()); +} + +TEST_F(ZipTest, UnzipRepeatedDirName) { + EXPECT_TRUE(zip::Unzip( + GetDataDirectory().AppendASCII("Repeated Dir Name.zip"), test_dir_)); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre()); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES), + UnorderedElementsAre("repeated")); +} + +TEST_F(ZipTest, UnzipRepeatedFileName) { + EXPECT_FALSE(zip::Unzip( + GetDataDirectory().AppendASCII("Repeated File Name.zip"), test_dir_)); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("repeated")); + + std::string contents; + EXPECT_TRUE( + base::ReadFileToString(test_dir_.AppendASCII("repeated"), &contents)); + EXPECT_EQ("First file", contents); +} + +TEST_F(ZipTest, UnzipCannotCreateEmptyDir) { + EXPECT_FALSE(zip::Unzip( + GetDataDirectory().AppendASCII("Empty Dir Same Name As File.zip"), + test_dir_)); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("repeated")); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES), + UnorderedElementsAre()); + + std::string contents; + EXPECT_TRUE( + base::ReadFileToString(test_dir_.AppendASCII("repeated"), &contents)); + EXPECT_EQ("First file", contents); +} + +TEST_F(ZipTest, UnzipCannotCreateParentDir) { + EXPECT_FALSE(zip::Unzip( + GetDataDirectory().AppendASCII("Parent Dir Same Name As File.zip"), + test_dir_)); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("repeated")); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES), + UnorderedElementsAre()); + + std::string contents; + EXPECT_TRUE( + base::ReadFileToString(test_dir_.AppendASCII("repeated"), &contents)); + EXPECT_EQ("First file", contents); +} + +// TODO(crbug.com/1311140) Detect and rename reserved file names on Windows. +TEST_F(ZipTest, UnzipWindowsSpecialNames) { + EXPECT_TRUE( + zip::Unzip(GetDataDirectory().AppendASCII("Windows Special Names.zip"), + test_dir_, {.continue_on_error = true})); + + std::unordered_set want_paths = { + "First", + "Last", + "CLOCK$", + " NUL.txt", +#ifndef OS_WIN + "NUL", + "NUL ", + "NUL.", + "NUL .", + "NUL.txt", + "NUL.tar.gz", + "NUL..txt", + "NUL...txt", + "NUL .txt", + "NUL .txt", + "NUL ..txt", +#ifndef OS_APPLE + "Nul.txt", +#endif + "nul.very long extension", + "a/NUL", + "CON", + "PRN", + "AUX", + "COM1", + "COM2", + "COM3", + "COM4", + "COM5", + "COM6", + "COM7", + "COM8", + "COM9", + "LPT1", + "LPT2", + "LPT3", + "LPT4", + "LPT5", + "LPT6", + "LPT7", + "LPT8", + "LPT9", +#endif + }; + + const std::vector got_paths = + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES); + + for (const std::string& path : got_paths) { + const bool ok = want_paths.erase(path); + +#ifdef OS_WIN + if (!ok) { + // See crbug.com/1313991: Different versions of Windows treat these + // filenames differently. No hard error here if there is an unexpected + // file. + LOG(WARNING) << "Found unexpected file: " << std::quoted(path); + continue; + } +#else + EXPECT_TRUE(ok) << "Found unexpected file: " << std::quoted(path); +#endif + + std::string contents; + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII(path), &contents)); + EXPECT_EQ(base::StrCat({"This is: ", path}), contents); + } + + for (const std::string& path : want_paths) { + EXPECT_TRUE(false) << "Cannot find expected file: " << std::quoted(path); + } +} + +TEST_F(ZipTest, UnzipDifferentCases) { +#if defined(OS_WIN) || defined(OS_APPLE) + // Only the first file (with mixed case) is extracted. + EXPECT_FALSE(zip::Unzip(GetDataDirectory().AppendASCII( + "Repeated File Name With Different Cases.zip"), + test_dir_)); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("Case")); + + std::string contents; + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents)); + EXPECT_EQ("Mixed case 111", contents); +#else + // All the files are extracted. + EXPECT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII( + "Repeated File Name With Different Cases.zip"), + test_dir_)); + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("Case", "case", "CASE")); + + std::string contents; + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents)); + EXPECT_EQ("Mixed case 111", contents); + + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("case"), &contents)); + EXPECT_EQ("Lower case 22", contents); + + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("CASE"), &contents)); + EXPECT_EQ("Upper case 3", contents); +#endif +} + +TEST_F(ZipTest, UnzipDifferentCasesContinueOnError) { + EXPECT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII( + "Repeated File Name With Different Cases.zip"), + test_dir_, {.continue_on_error = true})); + + std::string contents; + +#if defined(OS_WIN) || defined(OS_APPLE) + // Only the first file (with mixed case) has been extracted. + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("Case")); + + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents)); + EXPECT_EQ("Mixed case 111", contents); +#else + // All the files have been extracted. + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES), + UnorderedElementsAre("Case", "case", "CASE")); + + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents)); + EXPECT_EQ("Mixed case 111", contents); + + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("case"), &contents)); + EXPECT_EQ("Lower case 22", contents); + + EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("CASE"), &contents)); + EXPECT_EQ("Upper case 3", contents); +#endif +} + +TEST_F(ZipTest, UnzipMixedPaths) { + EXPECT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("Mixed Paths.zip"), + test_dir_, {.continue_on_error = true})); + + std::unordered_set want_paths = { +#ifdef OS_WIN + "Dot", // + "Space→", // +#else + " ", // + "AUX", // Disappears on Windows + "COM1", // Disappears on Windows + "COM2", // Disappears on Windows + "COM3", // Disappears on Windows + "COM4", // Disappears on Windows + "COM5", // Disappears on Windows + "COM6", // Disappears on Windows + "COM7", // Disappears on Windows + "COM8", // Disappears on Windows + "COM9", // Disappears on Windows + "CON", // Disappears on Windows + "Dot .", // + "LPT1", // Disappears on Windows + "LPT2", // Disappears on Windows + "LPT3", // Disappears on Windows + "LPT4", // Disappears on Windows + "LPT5", // Disappears on Windows + "LPT6", // Disappears on Windows + "LPT7", // Disappears on Windows + "LPT8", // Disappears on Windows + "LPT9", // Disappears on Windows + "NUL ..txt", // Disappears on Windows + "NUL .txt", // Disappears on Windows + "NUL ", // Disappears on Windows + "NUL .", // Disappears on Windows + "NUL .txt", // Disappears on Windows + "NUL", // Disappears on Windows + "NUL.", // Disappears on Windows + "NUL...txt", // Disappears on Windows + "NUL..txt", // Disappears on Windows + "NUL.tar.gz", // Disappears on Windows + "NUL.txt", // Disappears on Windows + "PRN", // Disappears on Windows + "Space→ ", // + "c/NUL", // Disappears on Windows + "nul.very long extension", // Disappears on Windows +#ifndef OS_APPLE + "CASE", // Conflicts with "Case" + "case", // Conflicts with "Case" +#endif +#endif + " NUL.txt", // + " ←Space", // + "$HOME", // + "%TMP", // + "-", // + "...Three", // + "..Two", // + ".One", // + "Ampersand &", // + "Angle ��", // + "At @", // + "Backslash1→�", // + "Backslash3→�←Backslash4", // + "Backspace �", // + "Backtick `", // + "Bell �", // + "CLOCK$", // + "Caret ^", // + "Carriage Return �", // + "Case", // + "Colon �", // + "Comma ,", // + "Curly {}", // + "C�", // + "C��", // + "C��Temp", // + "C��Temp�", // + "C��Temp�File", // + "Dash -", // + "Delete \x7F", // + "Dollar $", // + "Double quote �", // + "Equal =", // + "Escape �", // + "Euro €", // + "Exclamation !", // + "FileOrDir", // + "First", // + "Hash #", // + "Last", // + "Line Feed �", // + "Percent %", // + "Pipe �", // + "Plus +", // + "Question �", // + "Quote '", // + "ROOT/At The Top", // + "ROOT/UP/Over The Top", // + "ROOT/dev/null", // + "Round ()", // + "Semicolon ;", // + "Smile \U0001F642", // + "Square []", // + "Star �", // + "String Terminator \u009C", // + "Tab �", // + "Tilde ~", // + "UP/One Level Up", // + "UP/UP/Two Levels Up", // + "Underscore _", // + "a/DOT/b", // + "a/UP/b", // + "u/v/w/x/y/z", // + "~", // + "�←Backslash2", // + "��server�share�file", // + }; + + const std::vector got_paths = + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES); + + for (const std::string& path : got_paths) { + const bool ok = want_paths.erase(path); +#ifdef OS_WIN + // See crbug.com/1313991: Different versions of Windows treat reserved + // Windows filenames differently. No hard error here if there is an + // unexpected file. + LOG_IF(WARNING, !ok) << "Found unexpected file: " << std::quoted(path); +#else + EXPECT_TRUE(ok) << "Found unexpected file: " << std::quoted(path); +#endif + } + + for (const std::string& path : want_paths) { + EXPECT_TRUE(false) << "Cannot find expected file: " << std::quoted(path); + } + + EXPECT_THAT( + GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES), + UnorderedElementsAreArray({ + "Empty", + "ROOT", + "ROOT/Empty", + "ROOT/UP", + "ROOT/dev", + "UP", + "UP/UP", + "a", + "a/DOT", + "a/UP", + "c", + "u", + "u/v", + "u/v/w", + "u/v/w/x", + "u/v/w/x/y", + })); +} + +TEST_F(ZipTest, UnzipWithDelegates) { + auto dir_creator = + base::BindLambdaForTesting([this](const base::FilePath& entry_path) { + return base::CreateDirectory(test_dir_.Append(entry_path)); + }); + auto writer = + base::BindLambdaForTesting([this](const base::FilePath& entry_path) + -> std::unique_ptr { + return std::make_unique( + test_dir_.Append(entry_path)); + }); + + base::File file(GetDataDirectory().AppendASCII("test.zip"), + base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ); + EXPECT_TRUE(zip::Unzip(file.GetPlatformFile(), writer, dir_creator)); + base::FilePath dir = test_dir_; + base::FilePath dir_foo = dir.AppendASCII("foo"); + base::FilePath dir_foo_bar = dir_foo.AppendASCII("bar"); + EXPECT_TRUE(base::PathExists(dir.AppendASCII("foo.txt"))); + EXPECT_TRUE(base::DirectoryExists(dir_foo)); + EXPECT_TRUE(base::PathExists(dir_foo.AppendASCII("bar.txt"))); + EXPECT_TRUE(base::DirectoryExists(dir_foo_bar)); + EXPECT_TRUE(base::PathExists(dir_foo_bar.AppendASCII(".hidden"))); + EXPECT_TRUE(base::PathExists(dir_foo_bar.AppendASCII("baz.txt"))); + EXPECT_TRUE(base::PathExists(dir_foo_bar.AppendASCII("quux.txt"))); +} + +TEST_F(ZipTest, UnzipOnlyDirectories) { + auto dir_creator = + base::BindLambdaForTesting([this](const base::FilePath& entry_path) { + return base::CreateDirectory(test_dir_.Append(entry_path)); + }); + + // Always return a null WriterDelegate. + auto writer = + base::BindLambdaForTesting([](const base::FilePath& entry_path) { + return std::unique_ptr(); + }); + + base::File file(GetDataDirectory().AppendASCII("test.zip"), + base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ); + EXPECT_TRUE(zip::Unzip(file.GetPlatformFile(), writer, dir_creator, + {.continue_on_error = true})); + base::FilePath dir = test_dir_; + base::FilePath dir_foo = dir.AppendASCII("foo"); + base::FilePath dir_foo_bar = dir_foo.AppendASCII("bar"); + EXPECT_FALSE(base::PathExists(dir.AppendASCII("foo.txt"))); + EXPECT_TRUE(base::DirectoryExists(dir_foo)); + EXPECT_FALSE(base::PathExists(dir_foo.AppendASCII("bar.txt"))); + EXPECT_TRUE(base::DirectoryExists(dir_foo_bar)); + EXPECT_FALSE(base::PathExists(dir_foo_bar.AppendASCII(".hidden"))); + EXPECT_FALSE(base::PathExists(dir_foo_bar.AppendASCII("baz.txt"))); + EXPECT_FALSE(base::PathExists(dir_foo_bar.AppendASCII("quux.txt"))); +} + +// Tests that a ZIP archive containing SJIS-encoded file names can be correctly +// extracted if the encoding is specified. +TEST_F(ZipTest, UnzipSjis) { + ASSERT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("SJIS Bug 846195.zip"), + test_dir_, {.encoding = "Shift_JIS"})); + + const base::FilePath dir = + test_dir_.Append(base::FilePath::FromUTF8Unsafe("新しいフォルダ")); + EXPECT_TRUE(base::DirectoryExists(dir)); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString( + dir.Append(base::FilePath::FromUTF8Unsafe("SJIS_835C_ソ.txt")), + &contents)); + EXPECT_EQ( + "This file's name contains 0x5c (backslash) as the 2nd byte of Japanese " + "characater \"\x83\x5c\" when encoded in Shift JIS.", + contents); + + ASSERT_TRUE(base::ReadFileToString(dir.Append(base::FilePath::FromUTF8Unsafe( + "新しいテキスト ドキュメント.txt")), + &contents)); + EXPECT_EQ("This file name is coded in Shift JIS in the archive.", contents); +} + +// Tests that a ZIP archive containing SJIS-encoded file names can be extracted +// even if the encoding is not specified. In this case, file names are +// interpreted as UTF-8, which leads to garbled names where invalid UTF-8 +// sequences are replaced with the character �. Nevertheless, the files are +// safely extracted and readable. +TEST_F(ZipTest, UnzipSjisAsUtf8) { + ASSERT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("SJIS Bug 846195.zip"), + test_dir_)); + + EXPECT_FALSE(base::DirectoryExists( + test_dir_.Append(base::FilePath::FromUTF8Unsafe("新しいフォルダ")))); + + const base::FilePath dir = + test_dir_.Append(base::FilePath::FromUTF8Unsafe("�V�����t�H���_")); + EXPECT_TRUE(base::DirectoryExists(dir)); + + std::string contents; + ASSERT_TRUE(base::ReadFileToString( + dir.Append(base::FilePath::FromUTF8Unsafe("SJIS_835C_��.txt")), + &contents)); + EXPECT_EQ( + "This file's name contains 0x5c (backslash) as the 2nd byte of Japanese " + "characater \"\x83\x5c\" when encoded in Shift JIS.", + contents); + + ASSERT_TRUE(base::ReadFileToString(dir.Append(base::FilePath::FromUTF8Unsafe( + "�V�����e�L�X�g �h�L�������g.txt")), + &contents)); + EXPECT_EQ("This file name is coded in Shift JIS in the archive.", contents); +} + +TEST_F(ZipTest, Zip) { + base::FilePath src_dir = GetDataDirectory().AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); + + EXPECT_TRUE(zip::Zip(src_dir, zip_file, /*include_hidden_files=*/true)); + TestUnzipFile(zip_file, true); +} + +TEST_F(ZipTest, ZipIgnoreHidden) { + base::FilePath src_dir = GetDataDirectory().AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); + + EXPECT_TRUE(zip::Zip(src_dir, zip_file, /*include_hidden_files=*/false)); + TestUnzipFile(zip_file, false); +} + +TEST_F(ZipTest, ZipNonASCIIDir) { + base::FilePath src_dir = GetDataDirectory().AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + // Append 'Тест' (in cyrillic). + base::FilePath src_dir_russian = temp_dir.GetPath().Append( + base::FilePath::FromUTF8Unsafe("\xD0\xA2\xD0\xB5\xD1\x81\xD1\x82")); + base::CopyDirectory(src_dir, src_dir_russian, true); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out_russian.zip"); + + EXPECT_TRUE(zip::Zip(src_dir_russian, zip_file, true)); + TestUnzipFile(zip_file, true); +} + +TEST_F(ZipTest, ZipTimeStamp) { + // The dates tested are arbitrary, with some constraints. The zip format can + // only store years from 1980 to 2107 and an even number of seconds, due to it + // using the ms dos date format. + + // Valid arbitrary date. + TestTimeStamp("23 Oct 1997 23:22:20", VALID_YEAR); + + // Date before 1980, zip format limitation, must default to unix epoch. + TestTimeStamp("29 Dec 1979 21:00:10", INVALID_YEAR); + + // Despite the minizip headers telling the maximum year should be 2044, it + // can actually go up to 2107. Beyond that, the dos date format cannot store + // the year (2107-1980=127). To test that limit, the input file needs to be + // touched, but the code that modifies the file access and modification times + // relies on time_t which is defined as long, therefore being in many + // platforms just a 4-byte integer, like 32-bit Mac OSX or linux. As such, it + // suffers from the year-2038 bug. Therefore 2038 is the highest we can test + // in all platforms reliably. + TestTimeStamp("02 Jan 2038 23:59:58", VALID_YEAR); +} + +#if defined(OS_POSIX) || defined(OS_FUCHSIA) +TEST_F(ZipTest, ZipFiles) { + base::FilePath src_dir = GetDataDirectory().AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_name = temp_dir.GetPath().AppendASCII("out.zip"); + + base::File zip_file(zip_name, + base::File::FLAG_CREATE | base::File::FLAG_WRITE); + ASSERT_TRUE(zip_file.IsValid()); + EXPECT_TRUE( + zip::ZipFiles(src_dir, zip_file_list_, zip_file.GetPlatformFile())); + zip_file.Close(); + + zip::ZipReader reader; + EXPECT_TRUE(reader.Open(zip_name)); + EXPECT_EQ(zip_file_list_.size(), static_cast(reader.num_entries())); + for (size_t i = 0; i < zip_file_list_.size(); ++i) { + const zip::ZipReader::Entry* const entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(entry->path, zip_file_list_[i]); + } +} +#endif // defined(OS_POSIX) || defined(OS_FUCHSIA) + +TEST_F(ZipTest, UnzipFilesWithIncorrectSize) { + // test_mismatch_size.zip contains files with names from 0.txt to 7.txt with + // sizes from 0 to 7 bytes respectively, but the metadata in the zip file says + // the uncompressed size is 3 bytes. The ZipReader and minizip code needs to + // be clever enough to get all the data out. + base::FilePath test_zip_file = + GetDataDirectory().AppendASCII("test_mismatch_size.zip"); + + base::ScopedTempDir scoped_temp_dir; + ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir()); + const base::FilePath& temp_dir = scoped_temp_dir.GetPath(); + + ASSERT_TRUE(zip::Unzip(test_zip_file, temp_dir)); + EXPECT_TRUE(base::DirectoryExists(temp_dir.AppendASCII("d"))); + + for (int i = 0; i < 8; i++) { + SCOPED_TRACE(base::StringPrintf("Processing %d.txt", i)); + base::FilePath file_path = + temp_dir.AppendASCII(base::StringPrintf("%d.txt", i)); + int64_t file_size = -1; + EXPECT_TRUE(base::GetFileSize(file_path, &file_size)); + EXPECT_EQ(static_cast(i), file_size); + } +} + +TEST_F(ZipTest, ZipWithFileAccessor) { + base::FilePath zip_file; + ASSERT_TRUE(base::CreateTemporaryFile(&zip_file)); + VirtualFileSystem file_accessor; + const zip::ZipParams params{.file_accessor = &file_accessor, + .dest_file = zip_file}; + ASSERT_TRUE(zip::Zip(params)); + + base::ScopedTempDir scoped_temp_dir; + ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir()); + const base::FilePath& temp_dir = scoped_temp_dir.GetPath(); + ASSERT_TRUE(zip::Unzip(zip_file, temp_dir)); + base::FilePath bar_dir = temp_dir.AppendASCII("bar"); + EXPECT_TRUE(base::DirectoryExists(bar_dir)); + std::string file_content; + EXPECT_TRUE( + base::ReadFileToString(temp_dir.AppendASCII("foo.txt"), &file_content)); + EXPECT_EQ(VirtualFileSystem::kFooContent, file_content); + EXPECT_TRUE( + base::ReadFileToString(bar_dir.AppendASCII("bar1.txt"), &file_content)); + EXPECT_EQ(VirtualFileSystem::kBar1Content, file_content); + EXPECT_TRUE( + base::ReadFileToString(bar_dir.AppendASCII("bar2.txt"), &file_content)); + EXPECT_EQ(VirtualFileSystem::kBar2Content, file_content); +} + +// Tests progress reporting while zipping files. +TEST_F(ZipTest, ZipProgress) { + base::FilePath src_dir = GetDataDirectory().AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); + + int progress_count = 0; + zip::Progress last_progress; + + zip::ProgressCallback progress_callback = + base::BindLambdaForTesting([&](const zip::Progress& progress) { + progress_count++; + LOG(INFO) << "Progress #" << progress_count << ": " << progress; + + // Progress should only go forwards. + EXPECT_GE(progress.bytes, last_progress.bytes); + EXPECT_GE(progress.files, last_progress.files); + EXPECT_GE(progress.directories, last_progress.directories); + + last_progress = progress; + return true; + }); + + EXPECT_TRUE(zip::Zip({.src_dir = src_dir, + .dest_file = zip_file, + .progress_callback = std::move(progress_callback)})); + + EXPECT_EQ(progress_count, 14); + EXPECT_EQ(last_progress.bytes, 13546); + EXPECT_EQ(last_progress.files, 5); + EXPECT_EQ(last_progress.directories, 2); + + TestUnzipFile(zip_file, true); +} + +// Tests throttling of progress reporting while zipping files. +TEST_F(ZipTest, ZipProgressPeriod) { + base::FilePath src_dir = GetDataDirectory().AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); + + int progress_count = 0; + zip::Progress last_progress; + + zip::ProgressCallback progress_callback = + base::BindLambdaForTesting([&](const zip::Progress& progress) { + progress_count++; + LOG(INFO) << "Progress #" << progress_count << ": " << progress; + + // Progress should only go forwards. + EXPECT_GE(progress.bytes, last_progress.bytes); + EXPECT_GE(progress.files, last_progress.files); + EXPECT_GE(progress.directories, last_progress.directories); + + last_progress = progress; + return true; + }); + + EXPECT_TRUE(zip::Zip({.src_dir = src_dir, + .dest_file = zip_file, + .progress_callback = std::move(progress_callback), + .progress_period = base::Hours(1)})); + + // We expect only 2 progress reports: the first one, and the last one. + EXPECT_EQ(progress_count, 2); + EXPECT_EQ(last_progress.bytes, 13546); + EXPECT_EQ(last_progress.files, 5); + EXPECT_EQ(last_progress.directories, 2); + + TestUnzipFile(zip_file, true); +} + +// Tests cancellation while zipping files. +TEST_F(ZipTest, ZipCancel) { + base::FilePath src_dir = GetDataDirectory().AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip"); + + // First: establish the number of possible interruption points. + int progress_count = 0; + + EXPECT_TRUE(zip::Zip({.src_dir = src_dir, + .dest_file = zip_file, + .progress_callback = base::BindLambdaForTesting( + [&progress_count](const zip::Progress&) { + progress_count++; + return true; + })})); + + EXPECT_EQ(progress_count, 14); + + // Second: exercise each and every interruption point. + for (int i = progress_count; i > 0; i--) { + int j = 0; + EXPECT_FALSE(zip::Zip({.src_dir = src_dir, + .dest_file = zip_file, + .progress_callback = base::BindLambdaForTesting( + [i, &j](const zip::Progress&) { + j++; + // Callback shouldn't be called again after + // having returned false once. + EXPECT_LE(j, i); + return j < i; + })})); + + EXPECT_EQ(j, i); + } +} + +// Tests zip::internal::GetCompressionMethod() +TEST_F(ZipTest, GetCompressionMethod) { + using zip::internal::GetCompressionMethod; + using zip::internal::kDeflated; + using zip::internal::kStored; + + EXPECT_EQ(GetCompressionMethod(FP("")), kDeflated); + EXPECT_EQ(GetCompressionMethod(FP("NoExtension")), kDeflated); + EXPECT_EQ(GetCompressionMethod(FP("Folder.zip").Append(FP("NoExtension"))), + kDeflated); + EXPECT_EQ(GetCompressionMethod(FP("Name.txt")), kDeflated); + EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored); + EXPECT_EQ(GetCompressionMethod(FP("Name....zip")), kStored); + EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored); + EXPECT_EQ(GetCompressionMethod(FP("NAME.ZIP")), kStored); + EXPECT_EQ(GetCompressionMethod(FP("Name.gz")), kStored); + EXPECT_EQ(GetCompressionMethod(FP("Name.tar.gz")), kStored); + EXPECT_EQ(GetCompressionMethod(FP("Name.tar")), kDeflated); + + // This one is controversial. + EXPECT_EQ(GetCompressionMethod(FP(".zip")), kStored); +} + +// Tests that files put inside a ZIP are effectively compressed. +TEST_F(ZipTest, Compressed) { + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + + const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input"); + EXPECT_TRUE(base::CreateDirectory(src_dir)); + + // Create some dummy source files. + for (const base::StringPiece s : {"foo", "bar.txt", ".hidden"}) { + base::File f(src_dir.AppendASCII(s), + base::File::FLAG_CREATE | base::File::FLAG_WRITE); + ASSERT_TRUE(f.SetLength(5000)); + } + + // Zip the source files. + const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip"); + EXPECT_TRUE(zip::Zip({.src_dir = src_dir, + .dest_file = dest_file, + .include_hidden_files = true})); + + // Since the source files compress well, the destination ZIP file should be + // smaller than the source files. + int64_t dest_file_size; + ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size)); + EXPECT_GT(dest_file_size, 300); + EXPECT_LT(dest_file_size, 1000); +} + +// Tests that a ZIP put inside a ZIP is simply stored instead of being +// compressed. +TEST_F(ZipTest, NestedZip) { + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + + const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input"); + EXPECT_TRUE(base::CreateDirectory(src_dir)); + + // Create a dummy ZIP file. This is not a valid ZIP file, but for the purpose + // of this test, it doesn't really matter. + const int64_t src_size = 5000; + + { + base::File f(src_dir.AppendASCII("src.zip"), + base::File::FLAG_CREATE | base::File::FLAG_WRITE); + ASSERT_TRUE(f.SetLength(src_size)); + } + + // Zip the dummy ZIP file. + const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip"); + EXPECT_TRUE(zip::Zip({.src_dir = src_dir, .dest_file = dest_file})); + + // Since the dummy source (inner) ZIP file should simply be stored in the + // destination (outer) ZIP file, the destination file should be bigger than + // the source file, but not much bigger. + int64_t dest_file_size; + ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size)); + EXPECT_GT(dest_file_size, src_size + 100); + EXPECT_LT(dest_file_size, src_size + 300); +} + +// Tests that there is no 2GB or 4GB limits. Tests that big files can be zipped +// (crbug.com/1207737) and that big ZIP files can be created +// (crbug.com/1221447). Tests that the big ZIP can be opened, that its entries +// are correctly enumerated (crbug.com/1298347), and that the big file can be +// extracted. +// +// Because this test is dealing with big files, it tends to take a lot of disk +// space and time (crbug.com/1299736). Therefore, it only gets run on a few bots +// (ChromeOS and Windows). +// +// This test is too slow with TSAN. +// OS Fuchsia does not seem to support large files. +// Some 32-bit Android waterfall and CQ try bots are running out of space when +// performing this test (android-asan, android-11-x86-rel, +// android-marshmallow-x86-rel-non-cq). +// Some Mac, Linux and Debug (dbg) bots tend to time out when performing this +// test (crbug.com/1299736, crbug.com/1300448, crbug.com/1369958). +#if defined(THREAD_SANITIZER) || BUILDFLAG(IS_FUCHSIA) || \ + BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) || !defined(NDEBUG) +TEST_F(ZipTest, DISABLED_BigFile) { +#else +TEST_F(ZipTest, BigFile) { +#endif + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + + const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input"); + EXPECT_TRUE(base::CreateDirectory(src_dir)); + + // Create a big dummy ZIP file. This is not a valid ZIP file, but for the + // purpose of this test, it doesn't really matter. + const int64_t src_size = 5'000'000'000; + + const base::FilePath src_file = src_dir.AppendASCII("src.zip"); + LOG(INFO) << "Creating big file " << src_file; + { + base::File f(src_file, base::File::FLAG_CREATE | base::File::FLAG_WRITE); + ASSERT_TRUE(f.SetLength(src_size)); + } + + // Zip the dummy ZIP file. + const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip"); + LOG(INFO) << "Zipping big file into " << dest_file; + zip::ProgressCallback progress_callback = + base::BindLambdaForTesting([&](const zip::Progress& progress) { + LOG(INFO) << "Zipping... " << std::setw(3) + << (100 * progress.bytes / src_size) << "%"; + return true; + }); + EXPECT_TRUE(zip::Zip({.src_dir = src_dir, + .dest_file = dest_file, + .progress_callback = std::move(progress_callback), + .progress_period = base::Seconds(1)})); + + // Since the dummy source (inner) ZIP file should simply be stored in the + // destination (outer) ZIP file, the destination file should be bigger than + // the source file, but not much bigger. + int64_t dest_file_size; + ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size)); + EXPECT_GT(dest_file_size, src_size + 100); + EXPECT_LT(dest_file_size, src_size + 300); + + LOG(INFO) << "Reading big ZIP " << dest_file; + zip::ZipReader reader; + ASSERT_TRUE(reader.Open(dest_file)); + + const zip::ZipReader::Entry* const entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(FP("src.zip"), entry->path); + EXPECT_EQ(src_size, entry->original_size); + EXPECT_FALSE(entry->is_directory); + EXPECT_FALSE(entry->is_encrypted); + + ProgressWriterDelegate writer(src_size); + EXPECT_TRUE(reader.ExtractCurrentEntry(&writer, + std::numeric_limits::max())); + EXPECT_EQ(src_size, writer.received_bytes()); + + EXPECT_FALSE(reader.Next()); + EXPECT_TRUE(reader.ok()); +} + +} // namespace diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.cc b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.cc new file mode 100644 index 000000000..31161ae86 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.cc @@ -0,0 +1,308 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/zlib/google/zip_writer.h" + +#include + +#include "base/files/file.h" +#include "base/logging.h" +#include "base/strings/strcat.h" +#include "base/strings/string_util.h" +#include "third_party/zlib/google/redact.h" +#include "third_party/zlib/google/zip_internal.h" + +namespace zip { +namespace internal { + +bool ZipWriter::ShouldContinue() { + if (!progress_callback_) + return true; + + const base::TimeTicks now = base::TimeTicks::Now(); + if (next_progress_report_time_ > now) + return true; + + next_progress_report_time_ = now + progress_period_; + if (progress_callback_.Run(progress_)) + return true; + + LOG(ERROR) << "Cancelling ZIP creation"; + return false; +} + +bool ZipWriter::AddFileContent(const base::FilePath& path, base::File file) { + char buf[zip::internal::kZipBufSize]; + + while (ShouldContinue()) { + const int num_bytes = + file.ReadAtCurrentPos(buf, zip::internal::kZipBufSize); + + if (num_bytes < 0) { + PLOG(ERROR) << "Cannot read file " << Redact(path); + return false; + } + + if (num_bytes == 0) + return true; + + if (zipWriteInFileInZip(zip_file_, buf, num_bytes) != ZIP_OK) { + PLOG(ERROR) << "Cannot write data from file " << Redact(path) + << " to ZIP"; + return false; + } + + progress_.bytes += num_bytes; + } + + return false; +} + +bool ZipWriter::OpenNewFileEntry(const base::FilePath& path, + bool is_directory, + base::Time last_modified) { + std::string str_path = path.AsUTF8Unsafe(); + +#if defined(OS_WIN) + base::ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/"); +#endif + + Compression compression = kDeflated; + + if (is_directory) { + str_path += "/"; + } else { + compression = GetCompressionMethod(path); + } + + return zip::internal::ZipOpenNewFileInZip(zip_file_, str_path, last_modified, + compression); +} + +bool ZipWriter::CloseNewFileEntry() { + return zipCloseFileInZip(zip_file_) == ZIP_OK; +} + +bool ZipWriter::AddFileEntry(const base::FilePath& path, base::File file) { + base::File::Info info; + if (!file.GetInfo(&info)) + return false; + + if (!OpenNewFileEntry(path, /*is_directory=*/false, info.last_modified)) + return false; + + if (!AddFileContent(path, std::move(file))) + return false; + + progress_.files++; + return CloseNewFileEntry(); +} + +bool ZipWriter::AddDirectoryEntry(const base::FilePath& path) { + FileAccessor::Info info; + if (!file_accessor_->GetInfo(path, &info) || !info.is_directory) { + LOG(ERROR) << "Not a directory: " << Redact(path); + progress_.errors++; + return continue_on_error_; + } + + if (!OpenNewFileEntry(path, /*is_directory=*/true, info.last_modified)) + return false; + + if (!CloseNewFileEntry()) + return false; + + progress_.directories++; + if (!ShouldContinue()) + return false; + + if (!recursive_) + return true; + + return AddDirectoryContents(path); +} + +#if defined(OS_POSIX) || defined(OS_FUCHSIA) +// static +std::unique_ptr ZipWriter::CreateWithFd( + int zip_file_fd, + FileAccessor* file_accessor) { + DCHECK(zip_file_fd != base::kInvalidPlatformFile); + zipFile zip_file = + internal::OpenFdForZipping(zip_file_fd, APPEND_STATUS_CREATE); + + if (!zip_file) { + DLOG(ERROR) << "Cannot create ZIP file for FD " << zip_file_fd; + return nullptr; + } + + return std::unique_ptr(new ZipWriter(zip_file, file_accessor)); +} +#endif + +// static +std::unique_ptr ZipWriter::Create( + const base::FilePath& zip_file_path, + FileAccessor* file_accessor) { + DCHECK(!zip_file_path.empty()); + zipFile zip_file = internal::OpenForZipping(zip_file_path.AsUTF8Unsafe(), + APPEND_STATUS_CREATE); + + if (!zip_file) { + PLOG(ERROR) << "Cannot create ZIP file " << Redact(zip_file_path); + return nullptr; + } + + return std::unique_ptr(new ZipWriter(zip_file, file_accessor)); +} + +ZipWriter::ZipWriter(zipFile zip_file, FileAccessor* file_accessor) + : zip_file_(zip_file), file_accessor_(file_accessor) {} + +ZipWriter::~ZipWriter() { + if (zip_file_) + zipClose(zip_file_, nullptr); +} + +bool ZipWriter::Close() { + const bool success = zipClose(zip_file_, nullptr) == ZIP_OK; + zip_file_ = nullptr; + + // Call the progress callback one last time with the final progress status. + if (progress_callback_ && !progress_callback_.Run(progress_)) { + LOG(ERROR) << "Cancelling ZIP creation at the end"; + return false; + } + + return success; +} + +bool ZipWriter::AddMixedEntries(Paths paths) { + // Pointers to directory paths in |paths|. + std::vector directories; + + // Declared outside loop to reuse internal buffer. + std::vector files; + + // First pass. We don't know which paths are files and which ones are + // directories, and we want to avoid making a call to file_accessor_ for each + // path. Try to open all of the paths as files. We'll get invalid file + // descriptors for directories, and we'll process these directories in the + // second pass. + while (!paths.empty()) { + // Work with chunks of 50 paths at most. + const size_t n = std::min(paths.size(), 50); + const Paths relative_paths = paths.subspan(0, n); + paths = paths.subspan(n, paths.size() - n); + + files.clear(); + if (!file_accessor_->Open(relative_paths, &files) || files.size() != n) + return false; + + for (size_t i = 0; i < n; i++) { + const base::FilePath& relative_path = relative_paths[i]; + DCHECK(!relative_path.empty()); + base::File& file = files[i]; + + if (file.IsValid()) { + // It's a file. + if (!AddFileEntry(relative_path, std::move(file))) + return false; + } else { + // It's probably a directory. Remember its path for the second pass. + directories.push_back(&relative_path); + } + } + } + + // Second pass for directories discovered during the first pass. + for (const base::FilePath* const path : directories) { + DCHECK(path); + if (!AddDirectoryEntry(*path)) + return false; + } + + return true; +} + +bool ZipWriter::AddFileEntries(Paths paths) { + // Declared outside loop to reuse internal buffer. + std::vector files; + + while (!paths.empty()) { + // Work with chunks of 50 paths at most. + const size_t n = std::min(paths.size(), 50); + const Paths relative_paths = paths.subspan(0, n); + paths = paths.subspan(n, paths.size() - n); + + DCHECK_EQ(relative_paths.size(), n); + + files.clear(); + if (!file_accessor_->Open(relative_paths, &files) || files.size() != n) + return false; + + for (size_t i = 0; i < n; i++) { + const base::FilePath& relative_path = relative_paths[i]; + DCHECK(!relative_path.empty()); + base::File& file = files[i]; + + if (!file.IsValid()) { + LOG(ERROR) << "Cannot open " << Redact(relative_path); + progress_.errors++; + + if (continue_on_error_) + continue; + + return false; + } + + if (!AddFileEntry(relative_path, std::move(file))) + return false; + } + } + + return true; +} + +bool ZipWriter::AddDirectoryEntries(Paths paths) { + for (const base::FilePath& path : paths) { + if (!AddDirectoryEntry(path)) + return false; + } + + return true; +} + +bool ZipWriter::AddDirectoryContents(const base::FilePath& path) { + std::vector files, subdirs; + + if (!file_accessor_->List(path, &files, &subdirs)) { + progress_.errors++; + return continue_on_error_; + } + + Filter(&files); + Filter(&subdirs); + + if (!AddFileEntries(files)) + return false; + + return AddDirectoryEntries(subdirs); +} + +void ZipWriter::Filter(std::vector* const paths) { + DCHECK(paths); + + if (!filter_callback_) + return; + + const auto end = std::remove_if(paths->begin(), paths->end(), + [this](const base::FilePath& path) { + return !filter_callback_.Run(path); + }); + paths->erase(end, paths->end()); +} + +} // namespace internal +} // namespace zip diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.h new file mode 100644 index 000000000..dd109293d --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/google/zip_writer.h @@ -0,0 +1,154 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_ +#define THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_ + +#include +#include + +#include "base/files/file_path.h" +#include "base/time/time.h" +#include "build/build_config.h" +#include "third_party/zlib/google/zip.h" + +#if defined(USE_SYSTEM_MINIZIP) +#include +#include +#else +#include "third_party/zlib/contrib/minizip/unzip.h" +#include "third_party/zlib/contrib/minizip/zip.h" +#endif + +namespace zip { +namespace internal { + +// A class used to write entries to a ZIP file and buffering the reading of +// files to limit the number of calls to the FileAccessor. This is for +// performance reasons as these calls may be expensive when IPC based). +// This class is so far internal and only used by zip.cc, but could be made +// public if needed. +// +// All methods returning a bool return true on success and false on error. +class ZipWriter { + public: +// Creates a writer that will write a ZIP file to |zip_file_fd| or |zip_file| +// and which entries are relative to |file_accessor|'s source directory. +// All file reads are performed using |file_accessor|. +#if defined(OS_POSIX) || defined(OS_FUCHSIA) + static std::unique_ptr CreateWithFd(int zip_file_fd, + FileAccessor* file_accessor); +#endif + + static std::unique_ptr Create(const base::FilePath& zip_file, + FileAccessor* file_accessor); + + ZipWriter(const ZipWriter&) = delete; + ZipWriter& operator=(const ZipWriter&) = delete; + + ~ZipWriter(); + + // Sets the optional progress callback. The callback is called once for each + // time |period|. The final callback is always called when the ZIP operation + // completes. + void SetProgressCallback(ProgressCallback callback, base::TimeDelta period) { + progress_callback_ = std::move(callback); + progress_period_ = std::move(period); + } + + // Should ignore missing files and directories? + void ContinueOnError(bool continue_on_error) { + continue_on_error_ = continue_on_error; + } + + // Sets the recursive flag, indicating whether the contents of subdirectories + // should be included. + void SetRecursive(bool b) { recursive_ = b; } + + // Sets the filter callback. + void SetFilterCallback(FilterCallback callback) { + filter_callback_ = std::move(callback); + } + + // Adds the contents of a directory. If the recursive flag is set, the + // contents of subdirectories are also added. + bool AddDirectoryContents(const base::FilePath& path); + + // Adds the entries at |paths| to the ZIP file. These can be a mixed bag of + // files and directories. If the recursive flag is set, the contents of + // subdirectories is also added. + bool AddMixedEntries(Paths paths); + + // Closes the ZIP file. + bool Close(); + + private: + // Takes ownership of |zip_file|. + ZipWriter(zipFile zip_file, FileAccessor* file_accessor); + + // Regularly called during processing to check whether zipping should continue + // or should be cancelled. + bool ShouldContinue(); + + // Adds file content to currently open file entry. + bool AddFileContent(const base::FilePath& path, base::File file); + + // Adds a file entry (including file contents). + bool AddFileEntry(const base::FilePath& path, base::File file); + + // Adds file entries. All the paths should be existing files. + bool AddFileEntries(Paths paths); + + // Adds a directory entry. If the recursive flag is set, the contents of this + // directory are also added. + bool AddDirectoryEntry(const base::FilePath& path); + + // Adds directory entries. All the paths should be existing directories. If + // the recursive flag is set, the contents of these directories are also + // added. + bool AddDirectoryEntries(Paths paths); + + // Opens a file or directory entry. + bool OpenNewFileEntry(const base::FilePath& path, + bool is_directory, + base::Time last_modified); + + // Closes the currently open entry. + bool CloseNewFileEntry(); + + // Filters entries. + void Filter(std::vector* paths); + + // The actual zip file. + zipFile zip_file_; + + // Abstraction over file access methods used to read files. + FileAccessor* const file_accessor_; + + // Progress stats. + Progress progress_; + + // Optional progress callback. + ProgressCallback progress_callback_; + + // Optional progress reporting period. + base::TimeDelta progress_period_; + + // Next time to report progress. + base::TimeTicks next_progress_report_time_ = base::TimeTicks::Now(); + + // Filter used to exclude files from the ZIP file. + FilterCallback filter_callback_; + + // Should recursively add directories? + bool recursive_ = false; + + // Should ignore missing files and directories? + bool continue_on_error_ = false; +}; + +} // namespace internal +} // namespace zip + +#endif // THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzclose.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzclose.c similarity index 93% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/gzclose.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzclose.c index caeb99a31..48d6a86f0 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzclose.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzclose.c @@ -8,9 +8,7 @@ /* gzclose() is in a separate file so that it is linked in only if it is used. That way the other gzclose functions can be used instead to avoid linking in unneeded compression or decompression routines. */ -int ZEXPORT gzclose(file) - gzFile file; -{ +int ZEXPORT gzclose(gzFile file) { #ifndef NO_GZCOMPRESS gz_statep state; diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzguts.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzguts.h similarity index 91% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/gzguts.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzguts.h index 990a4d251..e23f831f5 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzguts.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -39,7 +39,7 @@ # include #endif -#if defined(_WIN32) || defined(__CYGWIN__) +#if defined(_WIN32) # define WIDECHAR #endif @@ -119,8 +119,8 @@ /* gz* functions always use library allocation functions */ #ifndef STDC - extern voidp malloc OF((uInt size)); - extern void free OF((voidpf ptr)); + extern voidp malloc(uInt size); + extern void free(voidpf ptr); #endif /* get errno and strerror definition */ @@ -138,10 +138,10 @@ /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); #endif /* default memLevel */ @@ -190,6 +190,7 @@ typedef struct { /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ + int reset; /* true if a reset is pending after a Z_FINISH */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ @@ -202,9 +203,9 @@ typedef struct { typedef gz_state FAR *gz_statep; /* shared functions */ -void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +void ZLIB_INTERNAL gz_error(gz_statep, int, const char *); #if defined UNDER_CE -char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +char ZLIB_INTERNAL *gz_strwinerror(DWORD error); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t @@ -213,6 +214,6 @@ char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); #ifdef INT_MAX # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) #else -unsigned ZLIB_INTERNAL gz_intmax OF((void)); +unsigned ZLIB_INTERNAL gz_intmax(void); # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) #endif diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzlib.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzlib.c similarity index 89% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/gzlib.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzlib.c index 4105e6aff..9810e3553 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzlib.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzlib.c @@ -1,24 +1,23 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +#if defined(_WIN32) && !defined(__BORLANDC__) # define LSEEK _lseeki64 +# define OPEN open #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 # define LSEEK lseek64 +# define OPEN open64 #else # define LSEEK lseek +# define OPEN open #endif #endif -/* Local functions */ -local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const void *, int, const char *)); - #if defined UNDER_CE /* Map the Windows error number in ERROR to a locale-dependent error message @@ -30,9 +29,7 @@ local gzFile gz_open OF((const void *, int, const char *)); The gz_strwinerror function does not change the current setting of GetLastError. */ -char ZLIB_INTERNAL *gz_strwinerror (error) - DWORD error; -{ +char ZLIB_INTERNAL *gz_strwinerror(DWORD error) { static char buf[1024]; wchar_t *msgbuf; @@ -72,15 +69,15 @@ char ZLIB_INTERNAL *gz_strwinerror (error) #endif /* UNDER_CE */ /* Reset gzip file state */ -local void gz_reset(state) - gz_statep state; -{ +local void gz_reset(gz_statep state) { state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ state->eof = 0; /* not at end of file */ state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ } + else /* for writing ... */ + state->reset = 0; /* no deflateReset pending */ state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->x.pos = 0; /* no uncompressed data yet */ @@ -88,11 +85,7 @@ local void gz_reset(state) } /* Open a gzip file either by name or file descriptor. */ -local gzFile gz_open(path, fd, mode) - const void *path; - int fd; - const char *mode; -{ +local gzFile gz_open(const void *path, int fd, const char *mode) { gz_statep state; z_size_t len; int oflag; @@ -242,7 +235,7 @@ local gzFile gz_open(path, fd, mode) #ifdef WIDECHAR fd == -2 ? _wopen(path, oflag, 0666) : #endif - open((const char *)path, oflag, 0666)); + OPEN((const char *)path, oflag, 0666)); if (state->fd == -1) { free(state->path); free(state); @@ -267,26 +260,17 @@ local gzFile gz_open(path, fd, mode) } /* -- see zlib.h -- */ -gzFile ZEXPORT gzopen(path, mode) - const char *path; - const char *mode; -{ +gzFile ZEXPORT gzopen(const char *path, const char *mode) { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ -gzFile ZEXPORT gzopen64(path, mode) - const char *path; - const char *mode; -{ +gzFile ZEXPORT gzopen64(const char *path, const char *mode) { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ -gzFile ZEXPORT gzdopen(fd, mode) - int fd; - const char *mode; -{ +gzFile ZEXPORT gzdopen(int fd, const char *mode) { char *path; /* identifier for error messages */ gzFile gz; @@ -304,19 +288,13 @@ gzFile ZEXPORT gzdopen(fd, mode) /* -- see zlib.h -- */ #ifdef WIDECHAR -gzFile ZEXPORT gzopen_w(path, mode) - const wchar_t *path; - const char *mode; -{ +gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) { return gz_open(path, -2, mode); } #endif /* -- see zlib.h -- */ -int ZEXPORT gzbuffer(file, size) - gzFile file; - unsigned size; -{ +int ZEXPORT gzbuffer(gzFile file, unsigned size) { gz_statep state; /* get internal structure and check integrity */ @@ -340,9 +318,7 @@ int ZEXPORT gzbuffer(file, size) } /* -- see zlib.h -- */ -int ZEXPORT gzrewind(file) - gzFile file; -{ +int ZEXPORT gzrewind(gzFile file) { gz_statep state; /* get internal structure */ @@ -363,11 +339,7 @@ int ZEXPORT gzrewind(file) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gzseek64(file, offset, whence) - gzFile file; - z_off64_t offset; - int whence; -{ +z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) { unsigned n; z_off64_t ret; gz_statep state; @@ -397,7 +369,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && state->x.pos + offset >= 0) { - ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR); if (ret == -1) return -1; state->x.have = 0; @@ -440,11 +412,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gzseek(file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ +z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) { z_off64_t ret; ret = gzseek64(file, (z_off64_t)offset, whence); @@ -452,9 +420,7 @@ z_off_t ZEXPORT gzseek(file, offset, whence) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gztell64(file) - gzFile file; -{ +z_off64_t ZEXPORT gztell64(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -469,9 +435,7 @@ z_off64_t ZEXPORT gztell64(file) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gztell(file) - gzFile file; -{ +z_off_t ZEXPORT gztell(gzFile file) { z_off64_t ret; ret = gztell64(file); @@ -479,9 +443,7 @@ z_off_t ZEXPORT gztell(file) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gzoffset64(file) - gzFile file; -{ +z_off64_t ZEXPORT gzoffset64(gzFile file) { z_off64_t offset; gz_statep state; @@ -502,9 +464,7 @@ z_off64_t ZEXPORT gzoffset64(file) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gzoffset(file) - gzFile file; -{ +z_off_t ZEXPORT gzoffset(gzFile file) { z_off64_t ret; ret = gzoffset64(file); @@ -512,9 +472,7 @@ z_off_t ZEXPORT gzoffset(file) } /* -- see zlib.h -- */ -int ZEXPORT gzeof(file) - gzFile file; -{ +int ZEXPORT gzeof(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -529,10 +487,7 @@ int ZEXPORT gzeof(file) } /* -- see zlib.h -- */ -const char * ZEXPORT gzerror(file, errnum) - gzFile file; - int *errnum; -{ +const char * ZEXPORT gzerror(gzFile file, int *errnum) { gz_statep state; /* get internal structure and check integrity */ @@ -550,9 +505,7 @@ const char * ZEXPORT gzerror(file, errnum) } /* -- see zlib.h -- */ -void ZEXPORT gzclearerr(file) - gzFile file; -{ +void ZEXPORT gzclearerr(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -576,11 +529,7 @@ void ZEXPORT gzclearerr(file) memory). Simply save the error message as a static string. If there is an allocation failure constructing the error message, then convert the error to out of memory. */ -void ZLIB_INTERNAL gz_error(state, err, msg) - gz_statep state; - int err; - const char *msg; -{ +void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != Z_MEM_ERROR) @@ -622,8 +571,7 @@ void ZLIB_INTERNAL gz_error(state, err, msg) available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ -unsigned ZLIB_INTERNAL gz_intmax() -{ +unsigned ZLIB_INTERNAL gz_intmax(void) { unsigned p, q; p = 1; diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzread.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzread.c similarity index 91% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/gzread.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzread.c index 832d3ef98..9a9f7847c 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzread.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzread.c @@ -1,29 +1,16 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -/* Local functions */ -local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); -local int gz_avail OF((gz_statep)); -local int gz_look OF((gz_statep)); -local int gz_decomp OF((gz_statep)); -local int gz_fetch OF((gz_statep)); -local int gz_skip OF((gz_statep, z_off64_t)); -local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); - /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. This function needs to loop on read(), since read() is not guaranteed to read the number of bytes requested, depending on the type of descriptor. */ -local int gz_load(state, buf, len, have) - gz_statep state; - unsigned char *buf; - unsigned len; - unsigned *have; -{ +local int gz_load(gz_statep state, unsigned char *buf, unsigned len, + unsigned *have) { int ret; unsigned get, max = ((unsigned)-1 >> 2) + 1; @@ -53,9 +40,7 @@ local int gz_load(state, buf, len, have) If strm->avail_in != 0, then the current data is moved to the beginning of the input buffer, and then the remainder of the buffer is loaded with the available data from the input file. */ -local int gz_avail(state) - gz_statep state; -{ +local int gz_avail(gz_statep state) { unsigned got; z_streamp strm = &(state->strm); @@ -88,9 +73,7 @@ local int gz_avail(state) case, all further file reads will be directly to either the output buffer or a user buffer. If decompressing, the inflate state will be initialized. gz_look() will return 0 on success or -1 on failure. */ -local int gz_look(state) - gz_statep state; -{ +local int gz_look(gz_statep state) { z_streamp strm = &(state->strm); /* allocate read buffers and inflate memory */ @@ -157,11 +140,9 @@ local int gz_look(state) the output buffer is larger than the input buffer, which also assures space for gzungetc() */ state->x.next = state->out; - if (strm->avail_in) { - memcpy(state->x.next, strm->next_in, strm->avail_in); - state->x.have = strm->avail_in; - strm->avail_in = 0; - } + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; state->how = COPY; state->direct = 1; return 0; @@ -172,9 +153,7 @@ local int gz_look(state) data. If the gzip stream completes, state->how is reset to LOOK to look for the next gzip stream or raw data, once state->x.have is depleted. Returns 0 on success, -1 on failure. */ -local int gz_decomp(state) - gz_statep state; -{ +local int gz_decomp(gz_statep state) { int ret = Z_OK; unsigned had; z_streamp strm = &(state->strm); @@ -226,9 +205,7 @@ local int gz_decomp(state) looked for to determine whether to copy or decompress. Returns -1 on error, otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the end of the input file has been reached and all data has been processed. */ -local int gz_fetch(state) - gz_statep state; -{ +local int gz_fetch(gz_statep state) { z_streamp strm = &(state->strm); do { @@ -256,10 +233,7 @@ local int gz_fetch(state) } /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ -local int gz_skip(state, len) - gz_statep state; - z_off64_t len; -{ +local int gz_skip(gz_statep state, z_off64_t len) { unsigned n; /* skip over len bytes or reach end-of-file, whichever comes first */ @@ -291,11 +265,7 @@ local int gz_skip(state, len) input. Return the number of bytes read. If zero is returned, either the end of file was reached, or there was an error. state->err must be consulted in that case to determine which. */ -local z_size_t gz_read(state, buf, len) - gz_statep state; - voidp buf; - z_size_t len; -{ +local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) { z_size_t got; unsigned n; @@ -314,9 +284,9 @@ local z_size_t gz_read(state, buf, len) got = 0; do { /* set n to the maximum amount of len that fits in an unsigned int */ - n = -1; + n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; /* first just try copying data from the output buffer */ if (state->x.have) { @@ -372,11 +342,7 @@ local z_size_t gz_read(state, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzread(file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ +int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) { gz_statep state; /* get internal structure */ @@ -397,7 +363,7 @@ int ZEXPORT gzread(file, buf, len) } /* read len or fewer bytes to buf */ - len = gz_read(state, buf, len); + len = (unsigned)gz_read(state, buf, len); /* check for an error */ if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) @@ -408,12 +374,7 @@ int ZEXPORT gzread(file, buf, len) } /* -- see zlib.h -- */ -z_size_t ZEXPORT gzfread(buf, size, nitems, file) - voidp buf; - z_size_t size; - z_size_t nitems; - gzFile file; -{ +z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) { z_size_t len; gz_statep state; @@ -448,10 +409,7 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) # endif #endif -int ZEXPORT gzgetc(file) - gzFile file; -{ - int ret; +int ZEXPORT gzgetc(gzFile file) { unsigned char buf[1]; gz_statep state; @@ -473,21 +431,15 @@ int ZEXPORT gzgetc(file) } /* nothing there -- try gz_read() */ - ret = gz_read(state, buf, 1); - return ret < 1 ? -1 : buf[0]; + return gz_read(state, buf, 1) < 1 ? -1 : buf[0]; } -int ZEXPORT gzgetc_(file) -gzFile file; -{ +int ZEXPORT gzgetc_(gzFile file) { return gzgetc(file); } /* -- see zlib.h -- */ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ +int ZEXPORT gzungetc(int c, gzFile file) { gz_statep state; /* get internal structure */ @@ -544,11 +496,7 @@ int ZEXPORT gzungetc(c, file) } /* -- see zlib.h -- */ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ +char * ZEXPORT gzgets(gzFile file, char *buf, int len) { unsigned left, n; char *str; unsigned char *eol; @@ -608,9 +556,7 @@ char * ZEXPORT gzgets(file, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzdirect(file) - gzFile file; -{ +int ZEXPORT gzdirect(gzFile file) { gz_statep state; /* get internal structure */ @@ -628,9 +574,7 @@ int ZEXPORT gzdirect(file) } /* -- see zlib.h -- */ -int ZEXPORT gzclose_r(file) - gzFile file; -{ +int ZEXPORT gzclose_r(gzFile file) { int ret, err; gz_statep state; diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzwrite.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzwrite.c similarity index 90% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/gzwrite.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzwrite.c index c7b5651d7..435b4621b 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/gzwrite.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/gzwrite.c @@ -1,22 +1,14 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -/* Local functions */ -local int gz_init OF((gz_statep)); -local int gz_comp OF((gz_statep, int)); -local int gz_zero OF((gz_statep, z_off64_t)); -local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); - /* Initialize state for writing a gzip file. Mark initialization by setting state->size to non-zero. Return -1 on a memory allocation failure, or 0 on success. */ -local int gz_init(state) - gz_statep state; -{ +local int gz_init(gz_statep state) { int ret; z_streamp strm = &(state->strm); @@ -70,10 +62,7 @@ local int gz_init(state) deflate() flush value. If flush is Z_FINISH, then the deflate() state is reset to start a new gzip stream. If gz->direct is true, then simply write to the output file without compressing, and ignore flush. */ -local int gz_comp(state, flush) - gz_statep state; - int flush; -{ +local int gz_comp(gz_statep state, int flush) { int ret, writ; unsigned have, put, max = ((unsigned)-1 >> 2) + 1; z_streamp strm = &(state->strm); @@ -97,6 +86,15 @@ local int gz_comp(state, flush) return 0; } + /* check for a pending reset */ + if (state->reset) { + /* don't start a new gzip member unless there is data to write */ + if (strm->avail_in == 0) + return 0; + deflateReset(strm); + state->reset = 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -134,7 +132,7 @@ local int gz_comp(state, flush) /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) - deflateReset(strm); + state->reset = 1; /* all done, no errors */ return 0; @@ -142,10 +140,7 @@ local int gz_comp(state, flush) /* Compress len zeros to output. Return -1 on a write error or memory allocation failure by gz_comp(), or 0 on success. */ -local int gz_zero(state, len) - gz_statep state; - z_off64_t len; -{ +local int gz_zero(gz_statep state, z_off64_t len) { int first; unsigned n; z_streamp strm = &(state->strm); @@ -175,11 +170,7 @@ local int gz_zero(state, len) /* Write len bytes from buf to file. Return the number of bytes written. If the returned value is less than len, then there was an error. */ -local z_size_t gz_write(state, buf, len) - gz_statep state; - voidpc buf; - z_size_t len; -{ +local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) { z_size_t put = len; /* if len is zero, avoid unnecessary operations */ @@ -209,7 +200,7 @@ local z_size_t gz_write(state, buf, len) state->in); copy = state->size - have; if (copy > len) - copy = len; + copy = (unsigned)len; memcpy(state->in + have, buf, copy); state->strm.avail_in += copy; state->x.pos += copy; @@ -229,7 +220,7 @@ local z_size_t gz_write(state, buf, len) do { unsigned n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; state->strm.avail_in = n; state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) @@ -243,11 +234,7 @@ local z_size_t gz_write(state, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzwrite(file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ +int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) { gz_statep state; /* get internal structure */ @@ -271,12 +258,8 @@ int ZEXPORT gzwrite(file, buf, len) } /* -- see zlib.h -- */ -z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) - voidpc buf; - z_size_t size; - z_size_t nitems; - gzFile file; -{ +z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems, + gzFile file) { z_size_t len; gz_statep state; @@ -301,10 +284,7 @@ z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) } /* -- see zlib.h -- */ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ +int ZEXPORT gzputc(gzFile file, int c) { unsigned have; unsigned char buf[1]; gz_statep state; @@ -349,12 +329,8 @@ int ZEXPORT gzputc(file, c) } /* -- see zlib.h -- */ -int ZEXPORT gzputs(file, str) - gzFile file; - const char *str; -{ - int ret; - z_size_t len; +int ZEXPORT gzputs(gzFile file, const char *s) { + z_size_t len, put; gz_statep state; /* get internal structure */ @@ -367,17 +343,20 @@ int ZEXPORT gzputs(file, str) return -1; /* write string */ - len = strlen(str); - ret = gz_write(state, str, len); - return ret == 0 && len != 0 ? -1 : ret; + len = strlen(s); + if ((int)len < 0 || (unsigned)len != len) { + gz_error(state, Z_STREAM_ERROR, "string length does not fit in int"); + return -1; + } + put = gz_write(state, s, len); + return put < len ? -1 : (int)len; } #if defined(STDC) || defined(Z_HAVE_STDARG_H) #include /* -- see zlib.h -- */ -int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) -{ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { int len; unsigned left; char *next; @@ -441,15 +420,14 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } return len; } -int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) -{ +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) { va_list va; int ret; @@ -462,13 +440,10 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) #else /* !STDC && !Z_HAVE_STDARG_H */ /* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ +int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3, + int a4, int a5, int a6, int a7, int a8, int a9, int a10, + int a11, int a12, int a13, int a14, int a15, int a16, + int a17, int a18, int a19, int a20) { unsigned len, left; char *next; gz_statep state; @@ -540,7 +515,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } @@ -550,10 +525,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, #endif /* -- see zlib.h -- */ -int ZEXPORT gzflush(file, flush) - gzFile file; - int flush; -{ +int ZEXPORT gzflush(gzFile file, int flush) { gz_statep state; /* get internal structure */ @@ -582,11 +554,7 @@ int ZEXPORT gzflush(file, flush) } /* -- see zlib.h -- */ -int ZEXPORT gzsetparams(file, level, strategy) - gzFile file; - int level; - int strategy; -{ +int ZEXPORT gzsetparams(gzFile file, int level, int strategy) { gz_statep state; z_streamp strm; @@ -597,7 +565,7 @@ int ZEXPORT gzsetparams(file, level, strategy) strm = &(state->strm); /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) + if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct) return Z_STREAM_ERROR; /* if no change is requested, then do nothing */ @@ -624,9 +592,7 @@ int ZEXPORT gzsetparams(file, level, strategy) } /* -- see zlib.h -- */ -int ZEXPORT gzclose_w(file) - gzFile file; -{ +int ZEXPORT gzclose_w(gzFile file) { int ret = Z_OK; gz_statep state; diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/infback.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/infback.c similarity index 95% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/infback.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/infback.c index 59679ecbf..9bfc30fe5 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/infback.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,9 +15,6 @@ #include "inflate.h" #include "inffast.h" -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); - /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. @@ -25,13 +22,9 @@ local void fixedtables OF((struct inflate_state FAR *state)); windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ -int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) -z_streamp strm; -int windowBits; -unsigned char FAR *window; -const char *version; -int stream_size; -{ +int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, const char *version, + int stream_size) { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || @@ -66,6 +59,7 @@ int stream_size; state->window = window; state->wnext = 0; state->whave = 0; + state->sane = 1; return Z_OK; } @@ -79,9 +73,7 @@ int stream_size; used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ +local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; @@ -247,13 +239,8 @@ struct inflate_state FAR *state; inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ -int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) -z_streamp strm; -in_func in; -void FAR *in_desc; -out_func out; -void FAR *out_desc; -{ +int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -454,11 +441,11 @@ void FAR *out_desc; } /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h + values here (10 and 9) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; + state->lenbits = 10; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { @@ -467,7 +454,7 @@ void FAR *out_desc; break; } state->distcode = (code const FAR *)(state->next); - state->distbits = 6; + state->distbits = 9; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { @@ -477,10 +464,12 @@ void FAR *out_desc; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; + /* fallthrough */ case LEN: /* use inflate_fast() if we have enough input and output */ - if (have >= 6 && left >= 258) { + if (have >= INFLATE_FAST_MIN_INPUT && + left >= INFLATE_FAST_MIN_OUTPUT) { RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; @@ -604,33 +593,33 @@ void FAR *out_desc; break; case DONE: - /* inflate stream terminated properly -- write leftover output */ + /* inflate stream terminated properly */ ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; - default: /* can't happen, but makes compilers happy */ + default: + /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } - /* Return unused input */ + /* Write leftover output and return unused input */ inf_leave: + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left) && + ret == Z_STREAM_END) + ret = Z_BUF_ERROR; + } strm->next_in = next; strm->avail_in = have; return ret; } -int ZEXPORT inflateBackEnd(strm) -z_streamp strm; -{ +int ZEXPORT inflateBackEnd(z_streamp strm) { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/inffast.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffast.c similarity index 89% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/inffast.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffast.c index 0dbd1dbc0..52ed8ca2d 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/inffast.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffast.c @@ -18,13 +18,13 @@ available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. + inflate() execution time is spent in this routine. Entry assumptions: state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 + strm->avail_in >= INFLATE_FAST_MIN_INPUT (6 bytes) + strm->avail_out >= INFLATE_FAST_MIN_OUTPUT (258 bytes) start >= strm->avail_out state->bits < 8 @@ -36,21 +36,22 @@ Notes: + INFLATE_FAST_MIN_INPUT: 6 bytes + - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. + INFLATE_FAST_MIN_OUTPUT: 258 bytes + - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for - output space. + available output space while decoding. */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) { struct inflate_state FAR *state; z_const unsigned char FAR *in; /* local strm->next_in */ z_const unsigned char FAR *last; /* have enough input while in < last */ @@ -70,7 +71,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ + code const *here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ @@ -80,10 +81,10 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in; - last = in + (strm->avail_in - 5); + last = in + (strm->avail_in - (INFLATE_FAST_MIN_INPUT - 1)); out = strm->next_out; beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); + end = out + (strm->avail_out - (INFLATE_FAST_MIN_OUTPUT - 1)); #ifdef INFLATE_STRICT dmax = state->dmax; #endif @@ -107,20 +108,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = lcode[hold & lmask]; + here = lcode + (hold & lmask); dolen: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - *out++ = (unsigned char)(here.val); + "inflate: literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); } else if (op & 16) { /* length base */ - len = (unsigned)(here.val); + len = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { @@ -138,14 +139,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = dcode[hold & dmask]; + here = dcode + (hold & dmask); dodist: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); + dist = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(*in++) << bits; @@ -264,7 +265,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; + here = dcode + here->val + (hold & ((1U << op) - 1)); goto dodist; } else { @@ -274,7 +275,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; + here = lcode + here->val + (hold & ((1U << op) - 1)); goto dolen; } else if (op & 32) { /* end-of-block */ @@ -298,9 +299,12 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ /* update state and return */ strm->next_in = in; strm->next_out = out; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_in = (unsigned)(in < last ? + (INFLATE_FAST_MIN_INPUT - 1) + (last - in) : + (INFLATE_FAST_MIN_INPUT - 1) - (in - last)); strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); + (INFLATE_FAST_MIN_OUTPUT - 1) + (end - out) : + (INFLATE_FAST_MIN_OUTPUT - 1) - (out - end)); state->hold = hold; state->bits = bits; return; diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffast.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffast.h new file mode 100644 index 000000000..9ff6ce3b6 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffast.h @@ -0,0 +1,26 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* INFLATE_FAST_MIN_INPUT: the minimum number of input bytes needed so that + we can safely call inflate_fast() with only one up-front bounds check. One + length/distance code pair (15 bits for the length code, 5 bits for length + extra, 15 bits for the distance code, 13 bits for distance extra) requires + reading up to 48 input bits (6 bytes). +*/ +#define INFLATE_FAST_MIN_INPUT 6 + +/* INFLATE_FAST_MIN_OUTPUT: the minimum number of output bytes needed so that + we can safely call inflate_fast() with only one up-front bounds check. One + length/distance code pair can output up to 258 bytes, which is the maximum + length that can be coded. + */ +#define INFLATE_FAST_MIN_OUTPUT 258 + +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start); diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/inffixed.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffixed.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/inffixed.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/inffixed.h diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/inflate.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inflate.c similarity index 93% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/inflate.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/inflate.c index ac333e8c2..5abbd0746 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/inflate.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -91,20 +91,7 @@ # endif #endif -/* function prototypes */ -local int inflateStateCheck OF((z_streamp strm)); -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, - unsigned copy)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, - unsigned len)); - -local int inflateStateCheck(strm) -z_streamp strm; -{ +local int inflateStateCheck(z_streamp strm) { struct inflate_state FAR *state; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -116,9 +103,7 @@ z_streamp strm; return 0; } -int ZEXPORT inflateResetKeep(strm) -z_streamp strm; -{ +int ZEXPORT inflateResetKeep(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -130,6 +115,7 @@ z_streamp strm; state->mode = HEAD; state->last = 0; state->havedict = 0; + state->flags = -1; state->dmax = 32768U; state->head = Z_NULL; state->hold = 0; @@ -141,9 +127,7 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ +int ZEXPORT inflateReset(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -154,10 +138,7 @@ z_streamp strm; return inflateResetKeep(strm); } -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ +int ZEXPORT inflateReset2(z_streamp strm, int windowBits) { int wrap; struct inflate_state FAR *state; @@ -167,6 +148,8 @@ int windowBits; /* extract wrap request from windowBits parameter */ if (windowBits < 0) { + if (windowBits < -15) + return Z_STREAM_ERROR; wrap = 0; windowBits = -windowBits; } @@ -192,12 +175,8 @@ int windowBits; return inflateReset(strm); } -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size) { int ret; struct inflate_state FAR *state; @@ -228,6 +207,7 @@ int stream_size; state->strm = strm; state->window = Z_NULL; state->mode = HEAD; /* to pass state test in inflateReset2() */ + state->check = 1L; /* 1L is the result of adler32() zero length data */ ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { ZFREE(strm, state); @@ -236,22 +216,17 @@ int stream_size; return ret; } -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit_(z_streamp strm, const char *version, + int stream_size) { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ +int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + if (bits == 0) + return Z_OK; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; @@ -275,9 +250,7 @@ int value; used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ +local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; @@ -339,7 +312,7 @@ struct inflate_state FAR *state; a.out > inffixed.h */ -void makefixed() +void makefixed(void) { unsigned low, size; struct inflate_state state; @@ -393,11 +366,7 @@ void makefixed() output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ -local int updatewindow(strm, end, copy) -z_streamp strm; -const Bytef *end; -unsigned copy; -{ +local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) { struct inflate_state FAR *state; unsigned dist; @@ -447,10 +416,10 @@ unsigned copy; /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP -# define UPDATE(check, buf, len) \ +# define UPDATE_CHECK(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else -# define UPDATE(check, buf, len) adler32(check, buf, len) +# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ @@ -619,10 +588,7 @@ unsigned copy; will return Z_BUF_ERROR if it has not reached the end of the stream. */ -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ +int ZEXPORT inflate(z_streamp strm, int flush) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -670,7 +636,6 @@ int flush; state->mode = FLAGS; break; } - state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ @@ -697,6 +662,7 @@ int flush; break; } state->dmax = 1U << len; + state->flags = 0; /* indicate zlib header */ Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; @@ -722,6 +688,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = TIME; + /* fallthrough */ case TIME: NEEDBITS(32); if (state->head != Z_NULL) @@ -730,6 +697,7 @@ int flush; CRC4(state->check, hold); INITBITS(); state->mode = OS; + /* fallthrough */ case OS: NEEDBITS(16); if (state->head != Z_NULL) { @@ -740,6 +708,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; + /* fallthrough */ case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); @@ -753,14 +722,16 @@ int flush; else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; + /* fallthrough */ case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; + state->head->extra != Z_NULL && + (len = state->head->extra_len - state->length) < + state->head->extra_max) { zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); @@ -775,6 +746,7 @@ int flush; } state->length = 0; state->mode = NAME; + /* fallthrough */ case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; @@ -796,6 +768,7 @@ int flush; state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; + /* fallthrough */ case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; @@ -816,6 +789,7 @@ int flush; else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; + /* fallthrough */ case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); @@ -839,6 +813,7 @@ int flush; strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; + /* fallthrough */ case DICT: if (state->havedict == 0) { RESTORE(); @@ -846,8 +821,10 @@ int flush; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; + /* fallthrough */ case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + /* fallthrough */ case TYPEDO: if (state->last) { BYTEBITS(); @@ -898,8 +875,10 @@ int flush; INITBITS(); state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case COPY_: state->mode = COPY; + /* fallthrough */ case COPY: copy = state->length; if (copy) { @@ -935,6 +914,7 @@ int flush; Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; + /* fallthrough */ case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); @@ -956,6 +936,7 @@ int flush; Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; + /* fallthrough */ case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { @@ -1015,11 +996,11 @@ int flush; } /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h + values here (10 and 9) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (const code FAR *)(state->next); - state->lenbits = 9; + state->lenbits = 10; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { @@ -1028,7 +1009,7 @@ int flush; break; } state->distcode = (const code FAR *)(state->next); - state->distbits = 6; + state->distbits = 9; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { @@ -1039,10 +1020,13 @@ int flush; Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case LEN_: state->mode = LEN; + /* fallthrough */ case LEN: - if (have >= 6 && left >= 258) { + if (have >= INFLATE_FAST_MIN_INPUT && + left >= INFLATE_FAST_MIN_OUTPUT) { RESTORE(); inflate_fast(strm, out); LOAD(); @@ -1090,6 +1074,7 @@ int flush; } state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; + /* fallthrough */ case LENEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1100,6 +1085,7 @@ int flush; Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; + /* fallthrough */ case DIST: for (;;) { here = state->distcode[BITS(state->distbits)]; @@ -1127,6 +1113,7 @@ int flush; state->offset = (unsigned)here.val; state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; + /* fallthrough */ case DISTEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1143,6 +1130,7 @@ int flush; #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; + /* fallthrough */ case MATCH: if (left == 0) goto inf_leave; copy = out - left; @@ -1202,7 +1190,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, put - out, out); + UPDATE_CHECK(state->check, put - out, out); out = left; if ((state->wrap & 4) && ( #ifdef GUNZIP @@ -1218,10 +1206,11 @@ int flush; } #ifdef GUNZIP state->mode = LENGTH; + /* fallthrough */ case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { + if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; @@ -1231,6 +1220,7 @@ int flush; } #endif state->mode = DONE; + /* fallthrough */ case DONE: ret = Z_STREAM_END; goto inf_leave; @@ -1240,6 +1230,7 @@ int flush; case MEM: return Z_MEM_ERROR; case SYNC: + /* fallthrough */ default: return Z_STREAM_ERROR; } @@ -1265,7 +1256,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); + UPDATE_CHECK(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); @@ -1274,9 +1265,7 @@ int flush; return ret; } -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ +int ZEXPORT inflateEnd(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1288,11 +1277,8 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) -z_streamp strm; -Bytef *dictionary; -uInt *dictLength; -{ +int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { struct inflate_state FAR *state; /* check state */ @@ -1311,11 +1297,8 @@ uInt *dictLength; return Z_OK; } -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ +int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { struct inflate_state FAR *state; unsigned long dictid; int ret; @@ -1346,10 +1329,7 @@ uInt dictLength; return Z_OK; } -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ +int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) { struct inflate_state FAR *state; /* check state */ @@ -1374,11 +1354,8 @@ gz_headerp head; called again with more data and the *have state. *have is initialized to zero for the first call. */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -const unsigned char FAR *buf; -unsigned len; -{ +local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf, + unsigned len) { unsigned got; unsigned next; @@ -1397,10 +1374,9 @@ unsigned len; return next; } -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ +int ZEXPORT inflateSync(z_streamp strm) { unsigned len; /* number of bytes to look at or looked at */ + int flags; /* temporary to save header status */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; @@ -1433,9 +1409,15 @@ z_streamp strm; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; + if (state->flags == -1) + state->wrap = 0; /* if no header yet, treat as raw */ + else + state->wrap &= ~4; /* no point in computing a check value now */ + flags = state->flags; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; + state->flags = flags; state->mode = TYPE; return Z_OK; } @@ -1448,9 +1430,7 @@ z_streamp strm; block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ +int ZEXPORT inflateSyncPoint(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1458,10 +1438,7 @@ z_streamp strm; return state->mode == STORED && state->bits == 0; } -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ +int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; @@ -1505,10 +1482,7 @@ z_streamp source; return Z_OK; } -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ +int ZEXPORT inflateUndermine(z_streamp strm, int subvert) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1523,24 +1497,19 @@ int subvert; #endif } -int ZEXPORT inflateValidate(strm, check) -z_streamp strm; -int check; -{ +int ZEXPORT inflateValidate(z_streamp strm, int check) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - if (check) + if (check && state->wrap) state->wrap |= 4; else state->wrap &= ~4; return Z_OK; } -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ +long ZEXPORT inflateMark(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) @@ -1551,9 +1520,7 @@ z_streamp strm; (state->mode == MATCH ? state->was - state->length : 0)); } -unsigned long ZEXPORT inflateCodesUsed(strm) -z_streamp strm; -{ +unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return (unsigned long)-1; state = (struct inflate_state FAR *)strm->state; diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/inflate.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inflate.h similarity index 97% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/inflate.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/inflate.h index a46cce6b6..f127b6b1f 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/inflate.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -86,7 +86,8 @@ struct inflate_state { int wrap; /* bit 0 true for zlib, bit 1 true for gzip, bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ + int flags; /* gzip header method and flags, 0 if zlib, or + -1 if raw or no header yet */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/inftrees.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inftrees.c similarity index 97% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/inftrees.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/inftrees.c index 2ea08fc13..afc4c4212 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/inftrees.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2017 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; + " inflate 1.2.13.1 Copyright 1995-2022 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,14 +29,9 @@ const char inflate_copyright[] = table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work) { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ @@ -62,7 +57,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 76}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/inftrees.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inftrees.h similarity index 78% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/inftrees.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/inftrees.h index baa53a0b1..f11f29c07 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/inftrees.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/inftrees.h @@ -36,17 +36,17 @@ typedef struct { */ /* Maximum size of the dynamic table. The maximum number of code structures is - 1444, which is the sum of 852 for literal/length codes and 592 for distance + 1924, which is the sum of 1332 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that + examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the - maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the + maximum bit length of a code. "enough 286 10 15" for literal/length codes + returns returns 1332, and "enough 30 9 15" for distance codes returns 592. + The initial root table size (10 or 9) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ -#define ENOUGH_LENS 852 +#define ENOUGH_LENS 1332 #define ENOUGH_DISTS 592 #define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) @@ -57,6 +57,6 @@ typedef enum { DISTS } codetype; -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work); diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0000-build.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0000-build.patch new file mode 100644 index 000000000..6119f09c0 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0000-build.patch @@ -0,0 +1,160 @@ +diff --git a/contrib/minizip/iowin32.c b/contrib/minizip/iowin32.c +index 274f39eb1dd2..246ceb91a139 100644 +--- a/contrib/minizip/iowin32.c ++++ b/contrib/minizip/iowin32.c +@@ -26,12 +26,19 @@ + #endif + + ++#ifdef _WIN32_WINNT ++#undef _WIN32_WINNT ++#define _WIN32_WINNT 0x601 ++#endif ++ ++#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 + // see Include/shared/winapifamily.h in the Windows Kit + #if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) + #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) + #define IOWIN32_USING_WINRT_API 1 + #endif + #endif ++#endif + + voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); + uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +diff --git a/contrib/minizip/unzip.c b/contrib/minizip/unzip.c +index bcfb9416ec35..199b4723fcfc 100644 +--- a/contrib/minizip/unzip.c ++++ b/contrib/minizip/unzip.c +@@ -1705,11 +1705,6 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + +- if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && +- (!(pfile_in_zip_read_info->raw))) +- pfile_in_zip_read_info->stream.avail_out = +- (uInt)pfile_in_zip_read_info->rest_read_uncompressed; +- + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) +diff --git a/gzread.c b/gzread.c +index 956b91ea7d9e..832d3ef98c59 100644 +--- a/gzread.c ++++ b/gzread.c +@@ -443,7 +443,11 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) + # undef z_gzgetc + #else + # undef gzgetc ++# ifdef Z_CR_PREFIX_SET ++# define gzgetc Cr_z_gzgetc ++# endif + #endif ++ + int ZEXPORT gzgetc(file) + gzFile file; + { +diff --git a/zconf.h b/zconf.h +index 5e1d68a004e9..a7a815f575a7 100644 +--- a/zconf.h ++++ b/zconf.h +@@ -8,6 +8,10 @@ + #ifndef ZCONF_H + #define ZCONF_H + ++/* ++ * This library is also built as a part of AOSP, which does not need to include ++ * chromeconf.h. This config does not want chromeconf.h, so it can set this ++ * macro to opt out. While this works today, there's no guarantee that building ++ * zlib outside of Chromium keeps working in the future. ++ */ ++#if !defined(CHROMIUM_ZLIB_NO_CHROMECONF) ++/* This include does prefixing as below, but with an updated set of names. Also ++ * sets up export macros in component builds. */ ++#include "chromeconf.h" ++#endif ++ + /* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. +@@ -431,7 +434,7 @@ typedef uLong FAR uLongf; + typedef unsigned long z_crc_t; + #endif + +-#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ ++#if !defined(_WIN32) + # define Z_HAVE_UNISTD_H + #endif + +diff --git a/zlib.h b/zlib.h +index f09cdaf1e054..99fd467f6b1a 100644 +--- a/zlib.h ++++ b/zlib.h +@@ -1824,6 +1824,11 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ + # undef z_gzgetc + # define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) ++#elif defined(Z_CR_PREFIX_SET) ++# undef gzgetc ++# define gzgetc(g) \ ++ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) \ ++ : (Cr_z_gzgetc)(g)) + #else + # define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +@@ -1853,11 +1858,29 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ + # define z_adler32_combine z_adler32_combine64 + # define z_crc32_combine z_crc32_combine64 + # else ++# ifdef gzopen ++# undef gzopen ++# endif + # define gzopen gzopen64 ++# ifdef gzseek ++# undef gzseek ++# endif + # define gzseek gzseek64 ++# ifdef gztell ++# undef gztell ++# endif + # define gztell gztell64 ++# ifdef gzoffset ++# undef gzoffset ++# endif + # define gzoffset gzoffset64 ++# ifdef adler32_combine ++# undef adler32_combine ++# endif + # define adler32_combine adler32_combine64 ++# ifdef crc32_combine ++# undef crc32_combine ++# endif + # define crc32_combine crc32_combine64 + # endif + # ifndef Z_LARGE64 +diff --git a/zutil.h b/zutil.h +index b079ea6a80f5..80375b8b6109 100644 +--- a/zutil.h ++++ b/zutil.h +@@ -28,6 +28,21 @@ + # include + # include + #endif ++#ifdef NO_ERRNO_H ++# ifdef _WIN32_WCE ++ /* The Microsoft C Run-Time Library for Windows CE doesn't have ++ * errno. We define it as a global variable to simplify porting. ++ * Its value is always 0 and should not be used. We rename it to ++ * avoid conflict with other libraries that use the same workaround. ++ */ ++# define errno z_errno ++# endif ++ extern int errno; ++#else ++# ifndef _WIN32_WCE ++# include ++# endif ++#endif + + #ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/simd.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0001-simd.patch similarity index 97% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/simd.patch rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0001-simd.patch index 75828d26e..9434ca0cc 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/simd.patch +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0001-simd.patch @@ -559,7 +559,7 @@ index 1ec761448de9..aa0c9c67a6dc 100644 local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); -local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -+unsigned ZLIB_INTERNAL read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); ++unsigned ZLIB_INTERNAL deflate_read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV # pragma message("Assembler code may have bugs -- use at your own risk") void match_init OF((void)); /* asm code initialization */ @@ -703,7 +703,7 @@ index 1ec761448de9..aa0c9c67a6dc 100644 * (See also flush_pending()). */ -local unsigned read_buf(strm, buf, size) -+ZLIB_INTERNAL unsigned read_buf(strm, buf, size) ++ZLIB_INTERNAL unsigned deflate_read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; @@ -859,7 +859,7 @@ new file mode 100644 index 000000000000..949ccce1ba9c --- /dev/null +++ b/fill_window_sse.c -@@ -0,0 +1,175 @@ +@@ -0,0 +1,177 @@ +/* + * Fill Window with SSE2-optimized hash shifting + * @@ -888,7 +888,7 @@ index 000000000000..949ccce1ba9c + }\ + }\ + -+extern int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); ++extern int deflate_read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); + +void fill_window_sse(deflate_state *s) +{ @@ -979,7 +979,9 @@ index 000000000000..949ccce1ba9c + */ + Assert(more >= 2, "more < 2"); + -+ n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); ++ n = deflate_read_buf(s->strm, ++ s->window + s->strstart + s->lookahead, ++ more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ @@ -1035,27 +1037,6 @@ index 000000000000..949ccce1ba9c + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} -diff --git a/names.h b/names.h -index f18df5684dc5..3436baa4eb57 100644 ---- a/names.h -+++ b/names.h -@@ -152,4 +152,16 @@ - /* An exported symbol that isn't handled by Z_PREFIX in zconf.h */ - #define z_errmsg Cr_z_z_errmsg - -+/* Symbols added in simd.patch */ -+#define copy_with_crc Cr_z_copy_with_crc -+#define crc_finalize Cr_z_crc_finalize -+#define crc_fold_512to32 Cr_z_crc_fold_512to32 -+#define crc_fold_copy Cr_z_crc_fold_copy -+#define crc_fold_init Cr_z_crc_fold_init -+#define crc_reset Cr_z_crc_reset -+#define fill_window_sse Cr_z_fill_window_sse -+#define read_buf Cr_z_read_buf -+#define x86_check_features Cr_z_x86_check_features -+#define x86_cpu_enable_simd Cr_z_x86_cpu_enable_simd -+ - #endif /* THIRD_PARTY_ZLIB_NAMES_H_ */ diff --git a/simd_stub.c b/simd_stub.c new file mode 100644 index 000000000000..c6d46051498f diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0002-uninitializedcheck.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0002-uninitializedcheck.patch new file mode 100644 index 000000000..7c497839d --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0002-uninitializedcheck.patch @@ -0,0 +1,27 @@ +From 1a03e7aec95d89c659fd91f195b99893b6458cd7 Mon Sep 17 00:00:00 2001 +From: Adenilson Cavalcanti +Date: Wed, 27 Sep 2017 13:59:04 -0700 +Subject: [PATCH] Zlib patch: prevent uninitialized use of state->check + +No need to call the Adler32 checksum function, just set +the struct field to the expected value. + +Upstream bug: madler/zlib#245 +--- + third_party/zlib/inflate.c | 2 +- + 1 files changed, 1 insertion(+), 1 deletions(-) + delete mode 100644 third_party/zlib/patches/0002-uninitializedcheck.patch + +diff --git a/third_party/zlib/inflate.c b/third_party/zlib/inflate.c +index bec9497..5c40cf1 100644 +--- a/third_party/zlib/inflate.c ++++ b/third_party/zlib/inflate.c +@@ -228,7 +228,7 @@ int stream_size; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ +- state->check = adler32(0L, Z_NULL, 0); ++ state->check = 1L; /* 1L is the result of adler32() zero length data */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0003-uninitializedjump.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0003-uninitializedjump.patch new file mode 100644 index 000000000..7aae3238a --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0003-uninitializedjump.patch @@ -0,0 +1,15 @@ +diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c +index a39e62787862..c6053fd1c7ea 100644 +--- a/third_party/zlib/deflate.c ++++ b/third_party/zlib/deflate.c +@@ -318,6 +318,10 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + s->w_size + window_padding, + 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); ++ /* Avoid use of uninitialized value, see: ++ * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360 ++ */ ++ zmemzero(s->prev, s->w_size * sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0004-fix-uwp.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0004-fix-uwp.patch new file mode 100644 index 000000000..23145a7ae --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0004-fix-uwp.patch @@ -0,0 +1,22 @@ +diff --git a/third_party/zlib/contrib/minizip/iowin32.c b/third_party/zlib/contrib/minizip/iowin32.c +index 246ceb91a139..c6bc314b3c28 100644 +--- a/third_party/zlib/contrib/minizip/iowin32.c ++++ b/third_party/zlib/contrib/minizip/iowin32.c +@@ -31,14 +31,12 @@ + #define _WIN32_WINNT 0x601 + #endif + +-#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 +-// see Include/shared/winapifamily.h in the Windows Kit +-#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) +-#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) ++#if !defined(IOWIN32_USING_WINRT_API) ++#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) ++// Windows Store or Universal Windows Platform + #define IOWIN32_USING_WINRT_API 1 + #endif + #endif +-#endif + + voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); + uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0005-infcover-gtest.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0005-infcover-gtest.patch new file mode 100644 index 000000000..f5443bd7d --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0005-infcover-gtest.patch @@ -0,0 +1,405 @@ +From 409594639f15d825202971db7a275023e05772ff Mon Sep 17 00:00:00 2001 +From: Adenilson Cavalcanti +Date: Tue, 28 Apr 2020 10:48:01 -0700 +Subject: [PATCH] Local Changes: - make C tests build as C++ code so we can + use gtest. - use gtest EXPECT_TRUE instead of C assert. - replace C + streams for C++ (portability issues). + +--- + test/infcover.c | 167 ++++++++++++++++++++++++++---------------------- + 1 file changed, 90 insertions(+), 77 deletions(-) + +diff --git a/test/infcover.c b/test/infcover.c +index 2be0164..a8c51c7 100644 +--- a/test/infcover.c ++++ b/test/infcover.c +@@ -4,11 +4,12 @@ + */ + + /* to use, do: ./configure --cover && make cover */ +- ++// clang-format off ++#include "infcover.h" + #include + #include + #include +-#include ++ + #include "zlib.h" + + /* get definition of internal structure so we can mess with it (see pull()), +@@ -17,8 +18,22 @@ + #include "inftrees.h" + #include "inflate.h" + ++/* XXX: use C++ streams instead of printf/fputs/etc due to portability ++ * as type sizes can vary between platforms. ++ */ ++#include + #define local static + ++/* XXX: hacking C assert and plugging into GTest. */ ++#include "gtest.h" ++#if defined(assert) ++#undef assert ++#define assert EXPECT_TRUE ++#endif ++ ++/* XXX: handle what is a reserved word in C++. */ ++#define try try_f ++ + /* -- memory tracking routines -- */ + + /* +@@ -72,7 +87,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size) + { + void *ptr; + struct mem_item *item; +- struct mem_zone *zone = mem; ++ struct mem_zone *zone = static_cast(mem); + size_t len = count * (size_t)size; + + /* induced allocation failure */ +@@ -87,7 +102,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size) + memset(ptr, 0xa5, len); + + /* create a new item for the list */ +- item = malloc(sizeof(struct mem_item)); ++ item = static_cast(malloc(sizeof(struct mem_item))); + if (item == NULL) { + free(ptr); + return NULL; +@@ -112,7 +127,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size) + local void mem_free(void *mem, void *ptr) + { + struct mem_item *item, *next; +- struct mem_zone *zone = mem; ++ struct mem_zone *zone = static_cast(mem); + + /* if no zone, just do a free */ + if (zone == NULL) { +@@ -159,7 +174,7 @@ local void mem_setup(z_stream *strm) + { + struct mem_zone *zone; + +- zone = malloc(sizeof(struct mem_zone)); ++ zone = static_cast(malloc(sizeof(struct mem_zone))); + assert(zone != NULL); + zone->first = NULL; + zone->total = 0; +@@ -175,33 +190,33 @@ local void mem_setup(z_stream *strm) + /* set a limit on the total memory allocation, or 0 to remove the limit */ + local void mem_limit(z_stream *strm, size_t limit) + { +- struct mem_zone *zone = strm->opaque; ++ struct mem_zone *zone = static_cast(strm->opaque); + + zone->limit = limit; + } + + /* show the current total requested allocations in bytes */ +-local void mem_used(z_stream *strm, char *prefix) ++local void mem_used(z_stream *strm, const char *prefix) + { +- struct mem_zone *zone = strm->opaque; ++ struct mem_zone *zone = static_cast(strm->opaque); + +- fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total); ++ std::cout << prefix << ": " << zone->total << " allocated" << std::endl; + } + + /* show the high water allocation in bytes */ +-local void mem_high(z_stream *strm, char *prefix) ++local void mem_high(z_stream *strm, const char *prefix) + { +- struct mem_zone *zone = strm->opaque; ++ struct mem_zone *zone = static_cast(strm->opaque); + +- fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater); ++ std::cout << prefix << ": " << zone->highwater << " high water mark" << std::endl; + } + + /* release the memory allocation zone -- if there are any surprises, notify */ +-local void mem_done(z_stream *strm, char *prefix) ++local void mem_done(z_stream *strm, const char *prefix) + { + int count = 0; + struct mem_item *item, *next; +- struct mem_zone *zone = strm->opaque; ++ struct mem_zone *zone = static_cast(strm->opaque); + + /* show high water mark */ + mem_high(strm, prefix); +@@ -218,13 +233,20 @@ local void mem_done(z_stream *strm, char *prefix) + + /* issue alerts about anything unexpected */ + if (count || zone->total) +- fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n", +- prefix, zone->total, count); ++ std::cout << "** " << prefix << ": " ++ << zone->total << " bytes in " ++ << count << " blocks not freed" ++ << std::endl; ++ + if (zone->notlifo) +- fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo); ++ std::cout << "** " << prefix << ": " ++ << zone->notlifo << " frees not LIFO" ++ << std::endl; ++ + if (zone->rogue) +- fprintf(stderr, "** %s: %d frees not recognized\n", +- prefix, zone->rogue); ++ std::cout << "** " << prefix << ": " ++ << zone->rogue << " frees not recognized" ++ << std::endl; + + /* free the zone and delete from the stream */ + free(zone); +@@ -247,7 +269,7 @@ local unsigned char *h2b(const char *hex, unsigned *len) + unsigned char *in, *re; + unsigned next, val; + +- in = malloc((strlen(hex) + 1) >> 1); ++ in = static_cast(malloc((strlen(hex) + 1) >> 1)); + if (in == NULL) + return NULL; + next = 0; +@@ -268,7 +290,7 @@ local unsigned char *h2b(const char *hex, unsigned *len) + } while (*hex++); /* go through the loop with the terminating null */ + if (len != NULL) + *len = next; +- re = realloc(in, next); ++ re = static_cast(realloc(in, next)); + return re == NULL ? in : re; + } + +@@ -281,7 +303,7 @@ local unsigned char *h2b(const char *hex, unsigned *len) + header information is collected with inflateGetHeader(). If a zlib stream + is looking for a dictionary, then an empty dictionary is provided. + inflate() is run until all of the input data is consumed. */ +-local void inf(char *hex, char *what, unsigned step, int win, unsigned len, ++local void inf(const char *hex, const char *what, unsigned step, int win, unsigned len, + int err) + { + int ret; +@@ -298,7 +320,7 @@ local void inf(char *hex, char *what, unsigned step, int win, unsigned len, + mem_done(&strm, what); + return; + } +- out = malloc(len); assert(out != NULL); ++ out = static_cast(malloc(len)); assert(out != NULL); + if (win == 47) { + head.extra = out; + head.extra_max = len; +@@ -347,7 +369,7 @@ local void inf(char *hex, char *what, unsigned step, int win, unsigned len, + } + + /* cover all of the lines in inflate.c up to inflate() */ +-local void cover_support(void) ++void cover_support(void) + { + int ret; + z_stream strm; +@@ -381,11 +403,11 @@ local void cover_support(void) + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); +- fputs("inflate built-in memory routines\n", stderr); ++ std::cout << "inflate built-in memory routines" << std::endl;; + } + + /* cover all inflate() header and trailer cases and code after inflate() */ +-local void cover_wrap(void) ++void cover_wrap(void) + { + int ret; + z_stream strm, copy; +@@ -394,7 +416,7 @@ local void cover_wrap(void) + ret = inflate(Z_NULL, 0); assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + ret = inflateCopy(Z_NULL, Z_NULL); assert(ret == Z_STREAM_ERROR); +- fputs("inflate bad parameters\n", stderr); ++ std::cout << "inflate bad parameters" << std::endl; + + inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR); + inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR); +@@ -415,9 +437,9 @@ local void cover_wrap(void) + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -8); + strm.avail_in = 2; +- strm.next_in = (void *)"\x63"; ++ strm.next_in = (Bytef *)"\x63"; + strm.avail_out = 1; +- strm.next_out = (void *)&ret; ++ strm.next_out = (Bytef *)&ret; + mem_limit(&strm, 1); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); +@@ -428,11 +450,11 @@ local void cover_wrap(void) + mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256); + ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK); + strm.avail_in = 2; +- strm.next_in = (void *)"\x80"; ++ strm.next_in = (Bytef *)"\x80"; + ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); + strm.avail_in = 4; +- strm.next_in = (void *)"\0\0\xff\xff"; ++ strm.next_in = (Bytef *)"\0\0\xff\xff"; + ret = inflateSync(&strm); assert(ret == Z_OK); + (void)inflateSyncPoint(&strm); + ret = inflateCopy(©, &strm); assert(ret == Z_MEM_ERROR); +@@ -454,7 +476,7 @@ local unsigned pull(void *desc, unsigned char **buf) + next = 0; + return 0; /* no input (already provided at next_in) */ + } +- state = (void *)((z_stream *)desc)->state; ++ state = reinterpret_cast(((z_stream *)desc)->state); + if (state != Z_NULL) + state->mode = SYNC; /* force an otherwise impossible situation */ + return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0; +@@ -467,7 +489,7 @@ local int push(void *desc, unsigned char *buf, unsigned len) + } + + /* cover inflateBack() up to common deflate data cases and after those */ +-local void cover_back(void) ++void cover_back(void) + { + int ret; + z_stream strm; +@@ -479,17 +501,17 @@ local void cover_back(void) + ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); +- fputs("inflateBack bad parameters\n", stderr); ++ std::cout << "inflateBack bad parameters" << std::endl;; + + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + strm.avail_in = 2; +- strm.next_in = (void *)"\x03"; ++ strm.next_in = (Bytef *)"\x03"; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret == Z_STREAM_END); + /* force output error */ + strm.avail_in = 3; +- strm.next_in = (void *)"\x63\x00"; ++ strm.next_in = (Bytef *)"\x63\x00"; + ret = inflateBack(&strm, pull, Z_NULL, push, &strm); + assert(ret == Z_BUF_ERROR); + /* force mode error by mucking with state */ +@@ -500,11 +522,11 @@ local void cover_back(void) + + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); +- fputs("inflateBack built-in memory routines\n", stderr); ++ std::cout << "inflateBack built-in memory routines" << std::endl;; + } + + /* do a raw inflate of data in hexadecimal with both inflate and inflateBack */ +-local int try(char *hex, char *id, int err) ++local int try(const char *hex, const char *id, int err) + { + int ret; + unsigned len, size; +@@ -518,11 +540,11 @@ local int try(char *hex, char *id, int err) + + /* allocate work areas */ + size = len << 3; +- out = malloc(size); ++ out = static_cast(malloc(size)); + assert(out != NULL); +- win = malloc(32768); ++ win = static_cast(malloc(32768)); + assert(win != NULL); +- prefix = malloc(strlen(id) + 6); ++ prefix = static_cast(malloc(strlen(id) + 6)); + assert(prefix != NULL); + + /* first with inflate */ +@@ -578,7 +600,7 @@ local int try(char *hex, char *id, int err) + } + + /* cover deflate data cases in both inflate() and inflateBack() */ +-local void cover_inflate(void) ++void cover_inflate(void) + { + try("0 0 0 0 0", "invalid stored block lengths", 1); + try("3 0", "fixed", 0); +@@ -613,32 +635,33 @@ local void cover_inflate(void) + inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK); + } + ++/* XXX(cavalcantii): fix linking error due inflate_table. */ + /* cover remaining lines in inftrees.c */ +-local void cover_trees(void) +-{ +- int ret; +- unsigned bits; +- unsigned short lens[16], work[16]; +- code *next, table[ENOUGH_DISTS]; +- +- /* we need to call inflate_table() directly in order to manifest not- +- enough errors, since zlib insures that enough is always enough */ +- for (bits = 0; bits < 15; bits++) +- lens[bits] = (unsigned short)(bits + 1); +- lens[15] = 15; +- next = table; +- bits = 15; +- ret = inflate_table(DISTS, lens, 16, &next, &bits, work); +- assert(ret == 1); +- next = table; +- bits = 1; +- ret = inflate_table(DISTS, lens, 16, &next, &bits, work); +- assert(ret == 1); +- fputs("inflate_table not enough errors\n", stderr); +-} ++/* void cover_trees(void) */ ++/* { */ ++/* int ret; */ ++/* unsigned bits; */ ++/* unsigned short lens[16], work[16]; */ ++/* code *next, table[ENOUGH_DISTS]; */ ++ ++/* /\* we need to call inflate_table() directly in order to manifest not- */ ++/* enough errors, since zlib insures that enough is always enough *\/ */ ++/* for (bits = 0; bits < 15; bits++) */ ++/* lens[bits] = (unsigned short)(bits + 1); */ ++/* lens[15] = 15; */ ++/* next = table; */ ++/* bits = 15; */ ++/* ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */ ++/* assert(ret == 1); */ ++/* next = table; */ ++/* bits = 1; */ ++/* ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */ ++/* assert(ret == 1); */ ++/* fputs("inflate_table not enough errors\n", stderr); */ ++/* } */ + + /* cover remaining inffast.c decoding and window copying */ +-local void cover_fast(void) ++void cover_fast(void) + { + inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68" + " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR); +@@ -658,14 +681,4 @@ local void cover_fast(void) + Z_STREAM_END); + } + +-int main(void) +-{ +- fprintf(stderr, "%s\n", zlibVersion()); +- cover_support(); +- cover_wrap(); +- cover_back(); +- cover_inflate(); +- cover_trees(); +- cover_fast(); +- return 0; +-} ++// clang-format on +-- +2.21.1 (Apple Git-122.3) + diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0006-fix-check_match.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0006-fix-check_match.patch new file mode 100644 index 000000000..b21c363b1 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0006-fix-check_match.patch @@ -0,0 +1,42 @@ +From 8304bdda5293ffd5b3efce8e4f54904b387029d6 Mon Sep 17 00:00:00 2001 +From: Hans Wennborg +Date: Wed, 23 Sep 2020 16:36:38 +0200 +Subject: [PATCH] Avoid crashing in check_match when prev_match == -1 + +prev_match can be set to -1 after sliding the window. In that case, the +window has slid past the first byte of the last match, which means it +cannot be compared in check_match. + +This would cause zlib to crash on some inputs to deflate when built +with ZLIB_DEBUG enabled. + +Check for this situation and avoid crashing by not trying to compare +the first byte. + +Bug: 1113142 +--- + third_party/zlib/deflate.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c +index cfdd2f46b230..d70732ec6fc2 100644 +--- a/third_party/zlib/deflate.c ++++ b/third_party/zlib/deflate.c +@@ -2060,7 +2060,13 @@ local block_state deflate_slow(s, flush) + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + +- check_match(s, s->strstart-1, s->prev_match, s->prev_length); ++ if (s->prev_match == -1) { ++ /* The window has slid one byte past the previous match, ++ * so the first byte cannot be compared. */ ++ check_match(s, s->strstart, s->prev_match+1, s->prev_length-1); ++ } else { ++ check_match(s, s->strstart-1, s->prev_match, s->prev_length); ++ } + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); +-- +2.28.0.681.g6f77f65b4e-goog + diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0007-zero-init-deflate-window.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0007-zero-init-deflate-window.patch new file mode 100644 index 000000000..9dbbf53a8 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0007-zero-init-deflate-window.patch @@ -0,0 +1,40 @@ +From 92537ee19784e0e545f06d89b7d89ab532a18cff Mon Sep 17 00:00:00 2001 +From: Hans Wennborg +Date: Tue, 3 Nov 2020 15:54:09 +0100 +Subject: [PATCH] [zlib] Zero-initialize the window used for deflation + +Otherwise MSan complains about use-of-uninitialized values in the +window. +This happens in both regular deflate's longest_match and deflate_rle. + +Before crrev.com/822755 we used to suppress those reports, but it seems +better to fix it properly. That will also allow us to catch other +potential issues with MSan in these functions. + +The instances of this that we've seen only reproduce with +fill_window_sse(), not with the regular fill_window() function. Since +the former doesn't exist in upstream zlib, I'm not planning to send this +patch upstream. + +Bug: 1137613, 1144420 +--- + third_party/zlib/deflate.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c +index 8bf93e524875..fc7ae45905ff 100644 +--- a/third_party/zlib/deflate.c ++++ b/third_party/zlib/deflate.c +@@ -321,6 +321,9 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + s->window = (Bytef *) ZALLOC(strm, + s->w_size + window_padding, + 2*sizeof(Byte)); ++ /* Avoid use of unitialized values in the window, see crbug.com/1137613 and ++ * crbug.com/1144420 */ ++ zmemzero(s->window, (s->w_size + window_padding) * (2 * sizeof(Byte))); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + /* Avoid use of uninitialized value, see: + * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360 +-- +2.29.1.341.ge80a0c044ae-goog + diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0008-minizip-zip-unzip-tools.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0008-minizip-zip-unzip-tools.patch new file mode 100644 index 000000000..48ceb02d4 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0008-minizip-zip-unzip-tools.patch @@ -0,0 +1,98 @@ +From 0c7de17000659f4f79de878296892c46be0aff77 Mon Sep 17 00:00:00 2001 +From: Noel Gordon +Date: Wed, 26 May 2021 21:57:43 +1000 +Subject: [PATCH] Build minizip zip and unzip tools + +--- + third_party/zlib/contrib/minizip/miniunz.c | 13 ++++++------- + third_party/zlib/contrib/minizip/minizip.c | 7 +++---- + 2 files changed, 9 insertions(+), 11 deletions(-) + +diff --git a/third_party/zlib/contrib/minizip/miniunz.c b/third_party/zlib/contrib/minizip/miniunz.c +index 3d65401be5cd..08737f689a96 100644 +--- a/third_party/zlib/contrib/minizip/miniunz.c ++++ b/third_party/zlib/contrib/minizip/miniunz.c +@@ -12,7 +12,7 @@ + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + */ + +-#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) ++#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif +@@ -27,7 +27,7 @@ + #endif + #endif + +-#ifdef __APPLE__ ++#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) + // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions + #define FOPEN_FUNC(filename, mode) fopen(filename, mode) + #define FTELLO_FUNC(stream) ftello(stream) +@@ -45,6 +45,7 @@ + #include + #include + #include ++#include + + #ifdef _WIN32 + # include +@@ -97,7 +98,7 @@ void change_file_date(filename,dosdate,tmu_date) + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); + #else +-#ifdef unix || __APPLE__ ++#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; +@@ -125,11 +126,9 @@ int mymkdir(dirname) + const char* dirname; + { + int ret=0; +-#ifdef _WIN32 ++#if defined(_WIN32) + ret = _mkdir(dirname); +-#elif unix +- ret = mkdir (dirname,0775); +-#elif __APPLE__ ++#elif defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) + ret = mkdir (dirname,0775); + #endif + return ret; +diff --git a/third_party/zlib/contrib/minizip/minizip.c b/third_party/zlib/contrib/minizip/minizip.c +index 4288962ecef0..b794953c5c23 100644 +--- a/third_party/zlib/contrib/minizip/minizip.c ++++ b/third_party/zlib/contrib/minizip/minizip.c +@@ -12,8 +12,7 @@ + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + */ + +- +-#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) ++#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif +@@ -28,7 +27,7 @@ + #endif + #endif + +-#ifdef __APPLE__ ++#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) + // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions + #define FOPEN_FUNC(filename, mode) fopen(filename, mode) + #define FTELLO_FUNC(stream) ftello(stream) +@@ -94,7 +93,7 @@ uLong filetime(f, tmzip, dt) + return ret; + } + #else +-#ifdef unix || __APPLE__ ++#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__) + uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ +-- +2.31.1.818.g46aad6cb9e-goog + diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0009-infcover-oob.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0009-infcover-oob.patch new file mode 100644 index 000000000..648360f33 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0009-infcover-oob.patch @@ -0,0 +1,24 @@ +From 75690b2683667be5535ac6243438115dc9c40f6a Mon Sep 17 00:00:00 2001 +From: Florian Mayer +Date: Wed, 16 Mar 2022 16:38:36 -0700 +Subject: [PATCH] Fix out of bounds in infcover.c. + +--- + test/infcover.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/test/infcover.c b/test/infcover.c +index 2be01646c..a6d83693c 100644 +--- a/test/infcover.c ++++ b/test/infcover.c +@@ -373,7 +373,9 @@ local void cover_support(void) + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; +- ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); ++ char versioncpy[] = ZLIB_VERSION; ++ versioncpy[0] -= 1; ++ ret = inflateInit_(&strm, versioncpy, (int)sizeof(z_stream)); + assert(ret == Z_VERSION_ERROR); + mem_done(&strm, "wrong version"); + diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0010-cmake-enable-simd.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0010-cmake-enable-simd.patch new file mode 100644 index 000000000..3893101b7 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0010-cmake-enable-simd.patch @@ -0,0 +1,96 @@ +diff --git a/third_party/zlib/CMakeLists.txt b/third_party/zlib/CMakeLists.txt +index b412dc7feb732..0431278405046 100644 +--- a/third_party/zlib/CMakeLists.txt ++++ b/third_party/zlib/CMakeLists.txt +@@ -1,4 +1,4 @@ +-cmake_minimum_required(VERSION 2.4.4) ++cmake_minimum_required(VERSION 3.0) + set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) + + project(zlib C) +@@ -21,6 +21,26 @@ check_include_file(sys/types.h HAVE_SYS_TYPES_H) + check_include_file(stdint.h HAVE_STDINT_H) + check_include_file(stddef.h HAVE_STDDEF_H) + ++option(ENABLE_SIMD_OPTIMIZATIONS "Enable all SIMD optimizations" OFF) ++ ++# TODO(cavalcantii): add support for other OSes (e.g. Android, fuchsia, osx) ++# and architectures (e.g. Arm). ++if (ENABLE_SIMD_OPTIMIZATIONS) ++ add_definitions(-DINFLATE_CHUNK_SIMD_SSE2) ++ add_definitions(-DADLER32_SIMD_SSSE3) ++ add_definitions(-DINFLATE_CHUNK_READ_64LE) ++ add_definitions(-DCRC32_SIMD_SSE42_PCLMUL) ++ add_definitions(-DDEFLATE_SLIDE_HASH_SSE2) ++ add_compile_options(-msse4.2 -mpclmul) ++ # Required by CPU features detection code. ++ add_definitions(-DX86_NOT_WINDOWS) ++ # Apparently some environments (e.g. CentOS) require to explicitly link ++ # with pthread and that is required by the CPU features detection code. ++ find_package (Threads REQUIRED) ++ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") ++ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") ++endif() ++ + # + # Check to see if we have large file support + # +@@ -120,10 +140,25 @@ set(ZLIB_SRCS + zutil.c + ) + +-if(NOT MINGW) +- set(ZLIB_DLL_SRCS +- win32/zlib1.rc # If present will override custom build rule below. +- ) ++ ++#============================================================================ ++# Update list of source files if optimizations were enabled ++#============================================================================ ++if (ENABLE_SIMD_OPTIMIZATIONS) ++ list(REMOVE_ITEM ZLIB_SRCS inflate.c) ++ ++ list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.h) ++ list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/chunkcopy.h) ++ list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inffast_chunk.h) ++ list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.h) ++ list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/crc32_simd.h) ++ ++ list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.c) ++ list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inffast_chunk.c) ++ list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inflate.c) ++ list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.c) ++ list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crc32_simd.c) ++ list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crc_folding.c) + endif() + + # parse the full version number from zlib.h and include in ZLIB_FULL_VERSION +@@ -191,23 +226,9 @@ if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + endif() + + #============================================================================ +-# Example binaries ++# Benchmarker + #============================================================================ +- +-add_executable(example test/example.c) +-target_link_libraries(example zlib) +-add_test(example example) +- +-add_executable(minigzip test/minigzip.c) +-target_link_libraries(minigzip zlib) +- +-if(HAVE_OFF64_T) +- add_executable(example64 test/example.c) +- target_link_libraries(example64 zlib) +- set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") +- add_test(example64 example64) +- +- add_executable(minigzip64 test/minigzip.c) +- target_link_libraries(minigzip64 zlib) +- set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") +-endif() ++enable_language(CXX) ++set(CMAKE_CXX_STANDARD 14) # workaround for older compilers (e.g. g++ 5.4). ++add_executable(zlib_bench contrib/bench/zlib_bench.cc) ++target_link_libraries(zlib_bench zlib) diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0011-avx512.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0011-avx512.patch new file mode 100644 index 000000000..6d409b773 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0011-avx512.patch @@ -0,0 +1,357 @@ +From 87fc8e3e38323cfdabf8da3927488e3e57073b02 Mon Sep 17 00:00:00 2001 +From: Jia Liu +Date: Thu, 30 Mar 2023 11:13:16 +0800 +Subject: [PATCH] Enabled AVX512 for CRC32 + +Enabled AVX512 for CRC32 that provide best of known performance +beyond current SSE SIMD optimization. It enables multiple folding +operations and AVX512 new instructions, providing ~3.5X CRC32 +performance and ~3.7% gain on Zlib_bench gzip performance. +--- + CMakeLists.txt | 8 +- + cpu_features.c | 9 +++ + cpu_features.h | 1 + + crc32.c | 14 +++- + crc32_simd.c | 198 ++++++++++++++++++++++++++++++++++++++++++++++++- + crc32_simd.h | 6 ++ + 6 files changed, 230 insertions(+), 6 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f06e193..d45b902 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -22,6 +22,7 @@ check_include_file(stdint.h HAVE_STDINT_H) + check_include_file(stddef.h HAVE_STDDEF_H) + + option(ENABLE_SIMD_OPTIMIZATIONS "Enable all SIMD optimizations" OFF) ++option(ENABLE_SIMD_AVX512 "Enable SIMD AXV512 optimizations" OFF) + + # TODO(cavalcantii): add support for other OSes (e.g. Android, fuchsia, osx) + # and architectures (e.g. Arm). +@@ -30,8 +31,13 @@ if (ENABLE_SIMD_OPTIMIZATIONS) + add_definitions(-DADLER32_SIMD_SSSE3) + add_definitions(-DINFLATE_CHUNK_READ_64LE) + add_definitions(-DCRC32_SIMD_SSE42_PCLMUL) ++ if (ENABLE_SIMD_AVX512) ++ add_definitions(-DCRC32_SIMD_AVX512_PCLMUL) ++ add_compile_options(-mvpclmulqdq -msse2 -mavx512f -mpclmul) ++ else() ++ add_compile_options(-msse4.2 -mpclmul) ++ endif() + add_definitions(-DDEFLATE_SLIDE_HASH_SSE2) +- add_compile_options(-msse4.2 -mpclmul) + # Required by CPU features detection code. + add_definitions(-DX86_NOT_WINDOWS) + # Apparently some environments (e.g. CentOS) require to explicitly link +diff --git a/cpu_features.c b/cpu_features.c +index 877d5f2..ac6ee88 100644 +--- a/cpu_features.c ++++ b/cpu_features.c +@@ -31,6 +31,7 @@ int ZLIB_INTERNAL arm_cpu_enable_pmull = 0; + int ZLIB_INTERNAL x86_cpu_enable_sse2 = 0; + int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0; + int ZLIB_INTERNAL x86_cpu_enable_simd = 0; ++int ZLIB_INTERNAL x86_cpu_enable_avx512 = 0; + + #ifndef CPU_NO_SIMD + +@@ -138,6 +139,10 @@ static void _cpu_check_features(void) + /* On x86 we simply use a instruction to check the CPU features. + * (i.e. CPUID). + */ ++#ifdef CRC32_SIMD_AVX512_PCLMUL ++#include ++#include ++#endif + static void _cpu_check_features(void) + { + int x86_cpu_has_sse2; +@@ -164,6 +169,10 @@ static void _cpu_check_features(void) + x86_cpu_enable_simd = x86_cpu_has_sse2 && + x86_cpu_has_sse42 && + x86_cpu_has_pclmulqdq; ++ ++#ifdef CRC32_SIMD_AVX512_PCLMUL ++ x86_cpu_enable_avx512 = _xgetbv(0) & 0x00000040; ++#endif + } + #endif + #endif +diff --git a/cpu_features.h b/cpu_features.h +index 279246c..aed3e83 100644 +--- a/cpu_features.h ++++ b/cpu_features.h +@@ -14,5 +14,6 @@ extern int arm_cpu_enable_pmull; + extern int x86_cpu_enable_sse2; + extern int x86_cpu_enable_ssse3; + extern int x86_cpu_enable_simd; ++extern int x86_cpu_enable_avx512; + + void cpu_check_features(void); +diff --git a/crc32.c b/crc32.c +index 4486098..acb6972 100644 +--- a/crc32.c ++++ b/crc32.c +@@ -773,7 +773,19 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) + } + + #endif +-#if defined(CRC32_SIMD_SSE42_PCLMUL) ++#if defined(CRC32_SIMD_AVX512_PCLMUL) ++ if (x86_cpu_enable_avx512 && len >= Z_CRC32_AVX512_MINIMUM_LENGTH) { ++ /* crc32 64-byte chunks */ ++ z_size_t chunk_size = len & ~Z_CRC32_AVX512_CHUNKSIZE_MASK; ++ crc = ~crc32_avx512_simd_(buf, chunk_size, ~(uint32_t)crc); ++ /* check remaining data */ ++ len -= chunk_size; ++ if (!len) ++ return crc; ++ /* Fall into the default crc32 for the remaining data. */ ++ buf += chunk_size; ++ } ++#elif defined(CRC32_SIMD_SSE42_PCLMUL) + if (x86_cpu_enable_simd && len >= Z_CRC32_SSE42_MINIMUM_LENGTH) { + /* crc32 16-byte chunks */ + z_size_t chunk_size = len & ~Z_CRC32_SSE42_CHUNKSIZE_MASK; +diff --git a/crc32_simd.c b/crc32_simd.c +index d80beba..7428270 100644 +--- a/crc32_simd.c ++++ b/crc32_simd.c +@@ -6,17 +6,207 @@ + */ + + #include "crc32_simd.h" +- +-#if defined(CRC32_SIMD_SSE42_PCLMUL) ++#if defined(CRC32_SIMD_AVX512_PCLMUL) + + /* +- * crc32_sse42_simd_(): compute the crc32 of the buffer, where the buffer +- * length must be at least 64, and a multiple of 16. Based on: ++ * crc32_avx512_simd_(): compute the crc32 of the buffer, where the buffer ++ * length must be at least 256, and a multiple of 64. Based on: + * + * "Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction" + * V. Gopal, E. Ozturk, et al., 2009, http://intel.ly/2ySEwL0 + */ + ++#include ++#include ++#include ++#include ++ ++uint32_t ZLIB_INTERNAL crc32_avx512_simd_( /* AVX512+PCLMUL */ ++ const unsigned char *buf, ++ z_size_t len, ++ uint32_t crc) ++{ ++ /* ++ * Definitions of the bit-reflected domain constants k1,k2,k3,k4 ++ * are similar to those given at the end of the paper, and remaining ++ * constants and CRC32+Barrett polynomials remain unchanged. ++ * ++ * Replace the index of x from 128 to 512. As follows: ++ * k1 = ( x ^ ( 512 * 4 + 32 ) mod P(x) << 32 )' << 1 = 0x011542778a ++ * k2 = ( x ^ ( 512 * 4 - 32 ) mod P(x) << 32 )' << 1 = 0x01322d1430 ++ * k3 = ( x ^ ( 512 + 32 ) mod P(x) << 32 )' << 1 = 0x0154442bd4 ++ * k4 = ( x ^ ( 512 - 32 ) mod P(x) << 32 )' << 1 = 0x01c6e41596 ++ */ ++ static const uint64_t zalign(64) k1k2[] = { 0x011542778a, 0x01322d1430, ++ 0x011542778a, 0x01322d1430, ++ 0x011542778a, 0x01322d1430, ++ 0x011542778a, 0x01322d1430 }; ++ static const uint64_t zalign(64) k3k4[] = { 0x0154442bd4, 0x01c6e41596, ++ 0x0154442bd4, 0x01c6e41596, ++ 0x0154442bd4, 0x01c6e41596, ++ 0x0154442bd4, 0x01c6e41596 }; ++ static const uint64_t zalign(16) k5k6[] = { 0x01751997d0, 0x00ccaa009e }; ++ static const uint64_t zalign(16) k7k8[] = { 0x0163cd6124, 0x0000000000 }; ++ static const uint64_t zalign(16) poly[] = { 0x01db710641, 0x01f7011641 }; ++ __m512i x0, x1, x2, x3, x4, x5, x6, x7, x8, y5, y6, y7, y8; ++ __m128i a0, a1, a2, a3; ++ ++ /* ++ * There's at least one block of 256. ++ */ ++ x1 = _mm512_loadu_si512((__m512i *)(buf + 0x00)); ++ x2 = _mm512_loadu_si512((__m512i *)(buf + 0x40)); ++ x3 = _mm512_loadu_si512((__m512i *)(buf + 0x80)); ++ x4 = _mm512_loadu_si512((__m512i *)(buf + 0xC0)); ++ ++ x1 = _mm512_xor_si512(x1, _mm512_castsi128_si512(_mm_cvtsi32_si128(crc))); ++ ++ x0 = _mm512_load_si512((__m512i *)k1k2); ++ ++ buf += 256; ++ len -= 256; ++ ++ /* ++ * Parallel fold blocks of 256, if any. ++ */ ++ while (len >= 256) ++ { ++ x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); ++ x6 = _mm512_clmulepi64_epi128(x2, x0, 0x00); ++ x7 = _mm512_clmulepi64_epi128(x3, x0, 0x00); ++ x8 = _mm512_clmulepi64_epi128(x4, x0, 0x00); ++ ++ ++ x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); ++ x2 = _mm512_clmulepi64_epi128(x2, x0, 0x11); ++ x3 = _mm512_clmulepi64_epi128(x3, x0, 0x11); ++ x4 = _mm512_clmulepi64_epi128(x4, x0, 0x11); ++ ++ y5 = _mm512_loadu_si512((__m512i *)(buf + 0x00)); ++ y6 = _mm512_loadu_si512((__m512i *)(buf + 0x40)); ++ y7 = _mm512_loadu_si512((__m512i *)(buf + 0x80)); ++ y8 = _mm512_loadu_si512((__m512i *)(buf + 0xC0)); ++ ++ x1 = _mm512_xor_si512(x1, x5); ++ x2 = _mm512_xor_si512(x2, x6); ++ x3 = _mm512_xor_si512(x3, x7); ++ x4 = _mm512_xor_si512(x4, x8); ++ ++ x1 = _mm512_xor_si512(x1, y5); ++ x2 = _mm512_xor_si512(x2, y6); ++ x3 = _mm512_xor_si512(x3, y7); ++ x4 = _mm512_xor_si512(x4, y8); ++ ++ buf += 256; ++ len -= 256; ++ } ++ ++ /* ++ * Fold into 512-bits. ++ */ ++ x0 = _mm512_load_si512((__m512i *)k3k4); ++ ++ x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); ++ x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); ++ x1 = _mm512_xor_si512(x1, x2); ++ x1 = _mm512_xor_si512(x1, x5); ++ ++ x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); ++ x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); ++ x1 = _mm512_xor_si512(x1, x3); ++ x1 = _mm512_xor_si512(x1, x5); ++ ++ x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); ++ x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); ++ x1 = _mm512_xor_si512(x1, x4); ++ x1 = _mm512_xor_si512(x1, x5); ++ ++ /* ++ * Single fold blocks of 64, if any. ++ */ ++ while (len >= 64) ++ { ++ x2 = _mm512_loadu_si512((__m512i *)buf); ++ ++ x5 = _mm512_clmulepi64_epi128(x1, x0, 0x00); ++ x1 = _mm512_clmulepi64_epi128(x1, x0, 0x11); ++ x1 = _mm512_xor_si512(x1, x2); ++ x1 = _mm512_xor_si512(x1, x5); ++ ++ buf += 64; ++ len -= 64; ++ } ++ ++ /* ++ * Fold 512-bits to 384-bits. ++ */ ++ a0 = _mm_load_si128((__m128i *)k5k6); ++ ++ a1 = _mm512_extracti32x4_epi32(x1, 0); ++ a2 = _mm512_extracti32x4_epi32(x1, 1); ++ ++ a3 = _mm_clmulepi64_si128(a1, a0, 0x00); ++ a1 = _mm_clmulepi64_si128(a1, a0, 0x11); ++ ++ a1 = _mm_xor_si128(a1, a3); ++ a1 = _mm_xor_si128(a1, a2); ++ ++ /* ++ * Fold 384-bits to 256-bits. ++ */ ++ a2 = _mm512_extracti32x4_epi32(x1, 2); ++ a3 = _mm_clmulepi64_si128(a1, a0, 0x00); ++ a1 = _mm_clmulepi64_si128(a1, a0, 0x11); ++ a1 = _mm_xor_si128(a1, a3); ++ a1 = _mm_xor_si128(a1, a2); ++ ++ /* ++ * Fold 256-bits to 128-bits. ++ */ ++ a2 = _mm512_extracti32x4_epi32(x1, 3); ++ a3 = _mm_clmulepi64_si128(a1, a0, 0x00); ++ a1 = _mm_clmulepi64_si128(a1, a0, 0x11); ++ a1 = _mm_xor_si128(a1, a3); ++ a1 = _mm_xor_si128(a1, a2); ++ ++ /* ++ * Fold 128-bits to 64-bits. ++ */ ++ a2 = _mm_clmulepi64_si128(a1, a0, 0x10); ++ a3 = _mm_setr_epi32(~0, 0, ~0, 0); ++ a1 = _mm_srli_si128(a1, 8); ++ a1 = _mm_xor_si128(a1, a2); ++ ++ a0 = _mm_loadl_epi64((__m128i*)k7k8); ++ a2 = _mm_srli_si128(a1, 4); ++ a1 = _mm_and_si128(a1, a3); ++ a1 = _mm_clmulepi64_si128(a1, a0, 0x00); ++ a1 = _mm_xor_si128(a1, a2); ++ ++ /* ++ * Barret reduce to 32-bits. ++ */ ++ a0 = _mm_load_si128((__m128i*)poly); ++ ++ a2 = _mm_and_si128(a1, a3); ++ a2 = _mm_clmulepi64_si128(a2, a0, 0x10); ++ a2 = _mm_and_si128(a2, a3); ++ a2 = _mm_clmulepi64_si128(a2, a0, 0x00); ++ a1 = _mm_xor_si128(a1, a2); ++ ++ /* ++ * Return the crc32. ++ */ ++ return _mm_extract_epi32(a1, 1); ++} ++ ++#elif defined(CRC32_SIMD_SSE42_PCLMUL) ++ ++/* ++ * crc32_sse42_simd_(): compute the crc32 of the buffer, where the buffer ++ * length must be at least 64, and a multiple of 16. ++ */ ++ + #include + #include + #include +diff --git a/crc32_simd.h b/crc32_simd.h +index c0346dc..8462464 100644 +--- a/crc32_simd.h ++++ b/crc32_simd.h +@@ -19,12 +19,18 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(const unsigned char* buf, + z_size_t len, + uint32_t crc); + ++uint32_t ZLIB_INTERNAL crc32_avx512_simd_(const unsigned char* buf, ++ z_size_t len, ++ uint32_t crc); ++ + /* + * crc32_sse42_simd_ buffer size constraints: see the use in zlib/crc32.c + * for computing the crc32 of an arbitrary length buffer. + */ + #define Z_CRC32_SSE42_MINIMUM_LENGTH 64 + #define Z_CRC32_SSE42_CHUNKSIZE_MASK 15 ++#define Z_CRC32_AVX512_MINIMUM_LENGTH 256 ++#define Z_CRC32_AVX512_CHUNKSIZE_MASK 63 + + /* + * CRC32 checksums using ARMv8-a crypto instructions. +-- +2.34.1 + diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0012-lfs-open64.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0012-lfs-open64.patch new file mode 100644 index 000000000..70e7b687a --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0012-lfs-open64.patch @@ -0,0 +1,40 @@ +From 6f21cb4b209d750486ede5472fdf7e35cf5ac3aa Mon Sep 17 00:00:00 2001 +From: Ramin Halavati +Date: Wed, 17 May 2023 15:21:43 +0200 +Subject: [PATCH] Add open64 for Large File System support to gzlib. + +--- + third_party/zlib/gzlib.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/third_party/zlib/gzlib.c b/third_party/zlib/gzlib.c +index 55da46a453fd1..bbdb797e8079d 100644 +--- a/third_party/zlib/gzlib.c ++++ b/third_party/zlib/gzlib.c +@@ -7,11 +7,14 @@ + + #if defined(_WIN32) && !defined(__BORLANDC__) + # define LSEEK _lseeki64 ++# define OPEN open + #else + #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 + # define LSEEK lseek64 ++# define OPEN open64 + #else + # define LSEEK lseek ++# define OPEN open + #endif + #endif + +@@ -244,7 +247,7 @@ local gzFile gz_open(path, fd, mode) + #ifdef WIDECHAR + fd == -2 ? _wopen(path, oflag, 0666) : + #endif +- open((const char *)path, oflag, 0666)); ++ OPEN((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); +-- +2.40.1.606.ga4b1b128d6-goog + diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0013-cpu-feature-detection-for-arm.patch b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0013-cpu-feature-detection-for-arm.patch new file mode 100644 index 000000000..0547851fe --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/0013-cpu-feature-detection-for-arm.patch @@ -0,0 +1,30 @@ +From c43ba7a55f091c0dcbfd8d89f7a5121269ce1b81 Mon Sep 17 00:00:00 2001 +From: Ho Cheung +Date: Thu, 27 Jul 2023 09:47:52 +0800 +Subject: [PATCH] [zlib] Perform CPU feature detection for ARM inside adler32() + +Perform CPU feature detection for ARM within adler32() to have the same +behavior as x86. + +--- + third_party/zlib/adler32.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/third_party/zlib/adler32.c b/third_party/zlib/adler32.c +index 81c584f68e233..99a294496f7eb 100644 +--- a/third_party/zlib/adler32.c ++++ b/third_party/zlib/adler32.c +@@ -90,9 +90,9 @@ uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) { + return adler | (sum2 << 16); + } + +-#if defined(ADLER32_SIMD_SSSE3) ++#if defined(ADLER32_SIMD_SSSE3) || defined(ADLER32_SIMD_NEON) + /* +- * Use SSSE3 to compute the adler32. Since this routine can be ++ * Use SIMD to compute the adler32. Since this function can be + * freely used, check CPU features here. zlib convention is to + * call adler32(0, NULL, 0), before making calls to adler32(). + * So this is a good early (and infrequent) place to cache CPU +-- +2.41.0.windows.3 diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/README b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/README new file mode 100644 index 000000000..b21d309ff --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/patches/README @@ -0,0 +1,43 @@ +== Patches applied on top of zlib == + + - 0000-build.patch: changes from the upstream version, mostly related to the + build. + - 0001-simd.patch: integrate Intel SIMD optimizations from + https://github.com/jtkukunas/zlib/ + - 0002-uninitializedcheck.patch: prevent uninitialized use of state->check + +== Procedure to create a patch file == + + Assuming you are working in a new feature branch: + - git format-patch master --stdout > foo.patch # where naming follows a growing + # number plus patch description. + - git add foo.patch + - git commit -a -m "Local patch." + - git rebase -i HEAD~2 # Squashing the second commit + + As patches created in this way will feature a ChangeLog, there is no longer +the need to append this file with a description of what the patch does. This +should help to solve frequent conflicts in pending new patches on +Chromium's zlib. + + The plan for the near future is to better insulate the platform specific +changes to ease update adoption with new releases of zlib. This insulation +happens by making changes inside contrib/ rather than the root directory +(where conflicts can happen). + + If a change modifies enough things inside the root directory that the +intention is not immediately clear, generate a .patch file to go with your +change. If the change's modifications in the root directory are small, like: + +#ifdef FEATURE_FLAG +use_special_feature(); +#elif +use_default_behavior(); +#endif + + then the intent is clear and a .patch file doesn't need to be generated (since +it would not provide much value). + + Ideally local changes should have a merge request featured in either: + - canonical zlib: https://github.com/madler/zlib/ + - zlib-ng: https://github.com/Dead2/zlib-ng diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/slide_hash_simd.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/slide_hash_simd.h new file mode 100644 index 000000000..1000b774c --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/slide_hash_simd.h @@ -0,0 +1,116 @@ +/* slide_hash_simd.h + * + * Copyright 2022 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the Chromium source repository LICENSE file. + */ + +#ifndef SLIDE_HASH_SIMD_H +#define SLIDE_HASH_SIMD_H + +#include "deflate.h" + +#ifndef INLINE +#if defined(_MSC_VER) && !defined(__clang__) +#define INLINE __inline +#else +#define INLINE inline +#endif +#endif + +#if defined(CPU_NO_SIMD) + +#error SIMD has been disabled for your build target + +#elif defined(DEFLATE_SLIDE_HASH_SSE2) + +#include /* SSE2 */ + +#define Z_SLIDE_INIT_SIMD(wsize) _mm_set1_epi16((ush)(wsize)) + +#define Z_SLIDE_HASH_SIMD(table, size, vector_wsize) \ + for (const Posf* const end = table + size; table != end;) { \ + __m128i vO = _mm_loadu_si128((__m128i *)(table + 0)); \ + vO = _mm_subs_epu16(vO, vector_wsize); \ + _mm_storeu_si128((__m128i *)(table + 0), vO); \ + table += 8; \ + } + +typedef __m128i z_vec128i_u16x8_t; + +#elif defined(DEFLATE_SLIDE_HASH_NEON) + +#include /* NEON */ + +#define Z_SLIDE_INIT_SIMD(wsize) vdupq_n_u16((ush)(wsize)) + +#define Z_SLIDE_HASH_SIMD(table, size, vector_wsize) \ + for (const Posf* const end = table + size; table != end;) { \ + uint16x8_t vO = vld1q_u16(table + 0); \ + uint16x8_t v8 = vld1q_u16(table + 8); \ + vO = vqsubq_u16(vO, vector_wsize); \ + v8 = vqsubq_u16(v8, vector_wsize); \ + vst1q_u16(table + 0, vO); \ + vst1q_u16(table + 8, v8); \ + table += 8 + 8; \ + } + +typedef uint16x8_t z_vec128i_u16x8_t; + +#else + +#error slide_hash_simd is not defined for your build target + +#endif + +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +local INLINE void slide_hash_simd( + Posf *head, Posf *prev, const uInt w_size, const uInt hash_size) { + /* + * The SIMD implementation of the hash table slider assumes: + * + * 1. hash chain offset is 2 bytes. Should be true as Pos is "ush" type. + */ + Assert(sizeof(Pos) == 2, "Pos type size error: should be 2 bytes"); + Assert(sizeof(ush) == 2, "ush type size error: should be 2 bytes"); + + Assert(hash_size <= (1 << 16), "Hash table maximum size error"); + Assert(hash_size >= (1 << 8), "Hash table minimum size error"); + Assert(w_size == (ush)w_size, "Prev table size error"); + + /* + * 2. The hash & prev table sizes are a multiple of 32 bytes (256 bits), + * since the NEON table slider moves two 128-bit items per loop (loop is + * unrolled on NEON for performance, see http://crbug.com/863257). + */ + Assert(!((hash_size * sizeof(head[0])) & (32 - 1)), + "Hash table size error: should be a multiple of 32 bytes"); + Assert(!((w_size * sizeof(prev[0])) & (32 - 1)), + "Prev table size error: should be a multiple of 32 bytes"); + + /* + * Duplicate (ush)w_size in each uint16_t component of a 128-bit vector. + */ + const z_vec128i_u16x8_t vec_wsize = Z_SLIDE_INIT_SIMD(w_size); + + /* + * Slide {head,prev} hash chain values: subtracts (ush)w_size from every + * value with a saturating SIMD subtract, to clamp the result to 0(NIL), + * to implement slide_hash() `(m >= wsize ? m - wsize : NIL);` code. + */ + Z_SLIDE_HASH_SIMD(head, hash_size, vec_wsize); +#ifndef FASTEST + Z_SLIDE_HASH_SIMD(prev, w_size, vec_wsize); +#endif + +} + +#undef z_vec128i_u16x8_t +#undef Z_SLIDE_HASH_SIMD +#undef Z_SLIDE_INIT_SIMD + +#endif /* SLIDE_HASH_SIMD_H */ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/trees.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/trees.c similarity index 79% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/trees.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/trees.c index 50cf4b457..8dbdc40ba 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/trees.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2017 Jean-loup Gailly + * Copyright (C) 1995-2021 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -122,39 +122,116 @@ struct static_tree_desc_s { int max_length; /* max bit length for the codes */ }; -local const static_tree_desc static_l_desc = +#ifdef NO_INIT_GLOBAL_POINTERS +# define TCONST +#else +# define TCONST const +#endif + +local TCONST static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; -local const static_tree_desc static_d_desc = +local TCONST static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; -local const static_tree_desc static_bl_desc = +local TCONST static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== - * Local (static) routines in this file. + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, const ct_data *ltree, - const ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(unsigned code, int len) { + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(deflate_state *s) { + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(deflate_state *s) { + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent + 7) & ~7; +#endif +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) { + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits - 1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, + "inconsistent bit counts"); + Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); + + for (n = 0; n <= max_code; n++) { + int len = tree[n].Len; + if (len == 0) continue; + /* Now reverse the bits */ + tree[n].Code = (ush)bi_reverse(next_code[len]++, len); + + Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", + n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); + } +} #ifdef GEN_TREES_H -local void gen_trees_header OF((void)); +local void gen_trees_header(void); #endif #ifndef ZLIB_DEBUG @@ -167,33 +244,18 @@ local void gen_trees_header OF((void)); send_bits(s, tree[c].Code, tree[c].Len); } #endif -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef ZLIB_DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ +local void send_bits(deflate_state *s, int value, int length) { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * (16 - bi_valid) bits from value, leaving (width - (16 - bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { @@ -229,8 +291,7 @@ local void send_bits(s, value, length) /* =========================================================================== * Initialize the various 'constant' tables. */ -local void tr_static_init() -{ +local void tr_static_init(void) { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ @@ -256,7 +317,7 @@ local void tr_static_init() length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { _dist_code[256 + dist++] = (uch)code; } } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); + Assert (dist == 256, "tr_static_init: 256 + dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; @@ -312,7 +373,7 @@ local void tr_static_init() } /* =========================================================================== - * Genererate the file trees.h describing the static trees. + * Generate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef ZLIB_DEBUG @@ -321,10 +382,9 @@ local void tr_static_init() # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) + ((i) % (width) == (width) - 1 ? ",\n" : ", ")) -void gen_trees_header() -{ +void gen_trees_header(void) { FILE *header = fopen("trees.h", "w"); int i; @@ -373,12 +433,26 @@ void gen_trees_header() } #endif /* GEN_TREES_H */ +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(deflate_state *s) { + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->sym_next = s->matches = 0; +} + /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ -void ZLIB_INTERNAL _tr_init(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_init(deflate_state *s) { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; @@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s) init_block(s); } -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ @@ -448,17 +504,13 @@ local void init_block(s) * when the heap property is re-established (each father smaller than its * two sons). */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ +local void pqdownheap(deflate_state *s, ct_data *tree, int k) { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ @@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k) * The length opt_len is updated; static_len is also updated if stree is * not null. */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void gen_bitlen(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; @@ -507,7 +556,7 @@ local void gen_bitlen(s, desc) */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + for (h = s->heap_max + 1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; @@ -518,7 +567,7 @@ local void gen_bitlen(s, desc) s->bl_count[bits]++; xbits = 0; - if (n >= base) xbits = extra[n-base]; + if (n >= base) xbits = extra[n - base]; f = tree[n].Freq; s->opt_len += (ulg)f * (unsigned)(bits + xbits); if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); @@ -530,10 +579,10 @@ local void gen_bitlen(s, desc) /* Find the first bit length which could increase: */ do { - bits = max_length-1; + bits = max_length - 1; while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits + 1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] @@ -561,48 +610,9 @@ local void gen_bitlen(s, desc) } } -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - unsigned code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits-1]) << 1; - next_code[bits] = (ush)code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1< +#endif /* =========================================================================== * Construct one Huffman tree and assigns the code bit strings and lengths. @@ -612,10 +622,7 @@ local void gen_codes (tree, max_code, bl_count) * and corresponding code. The length opt_len is updated; static_len is * also updated if stree is not null. The field max_code is set. */ -local void build_tree(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void build_tree(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; @@ -624,7 +631,7 @@ local void build_tree(s, desc) int node; /* new node being created */ /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n + 1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; @@ -652,7 +659,7 @@ local void build_tree(s, desc) } desc->max_code = max_code; - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + /* The elements heap[heap_len/2 + 1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); @@ -700,11 +707,7 @@ local void build_tree(s, desc) * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void scan_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -714,10 +717,10 @@ local void scan_tree (s, tree, max_code) int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ + tree[max_code + 1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -745,11 +748,7 @@ local void scan_tree (s, tree, max_code) * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void send_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -758,11 +757,11 @@ local void send_tree (s, tree, max_code) int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ - /* tree[max_code+1].Len = -1; */ /* guard already set */ + /* tree[max_code + 1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -773,13 +772,13 @@ local void send_tree (s, tree, max_code) send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count - 3, 2); } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count - 3, 3); } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { @@ -796,9 +795,7 @@ local void send_tree (s, tree, max_code) * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ -local int build_bl_tree(s) - deflate_state *s; -{ +local int build_bl_tree(deflate_state *s) { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ @@ -807,8 +804,8 @@ local int build_bl_tree(s) /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + /* opt_len now includes the length of the tree representations, except the + * lengths of the bit lengths codes and the 5 + 5 + 4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format @@ -819,7 +816,7 @@ local int build_bl_tree(s) if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); @@ -831,61 +828,54 @@ local int build_bl_tree(s) * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ +local void send_all_trees(deflate_state *s, int lcodes, int dcodes, + int blcodes) { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { + send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); put_short(s, (ush)~stored_len); - zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + if (stored_len) + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); s->pending += stored_len; #ifdef ZLIB_DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; s->bits_sent += 2*16; - s->bits_sent += stored_len<<3; + s->bits_sent += stored_len << 3; #endif } /* =========================================================================== * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) */ -void ZLIB_INTERNAL _tr_flush_bits(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) { bi_flush(s); } @@ -893,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s) * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. */ -void ZLIB_INTERNAL _tr_align(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_align(deflate_state *s) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef ZLIB_DEBUG @@ -904,16 +892,99 @@ void ZLIB_INTERNAL _tr_align(s) bi_flush(s); } +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(deflate_state *s, const ct_data *ltree, + const ct_data *dtree) { + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned sx = 0; /* running index in sym_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->sym_next != 0) do { + dist = s->sym_buf[sx++] & 0xff; + dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; + lc = s->sym_buf[sx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and sym_buf is ok: */ + Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); + + } while (sx < s->sym_next); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "block list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(deflate_state *s) { + /* block_mask is the bit mask of block-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long block_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>= 1) + if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("allow-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "block-listed" or "allow-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and write out the encoded block. */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ @@ -942,14 +1013,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; + opt_lenb = (s->opt_len + 3 + 7) >> 3; + static_lenb = (s->static_len + 3 + 7) >> 3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); + s->sym_next / 3)); - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; +#ifndef FORCE_STATIC + if (static_lenb <= opt_lenb || s->strategy == Z_FIXED) +#endif + opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); @@ -959,7 +1033,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { + if (stored_len + 4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. @@ -970,21 +1044,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) */ _tr_stored_block(s, buf, stored_len, last); -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+last, 3); + } else if (static_lenb == opt_lenb) { + send_bits(s, (STATIC_TREES<<1) + last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); #ifdef ZLIB_DEBUG s->compressed_len += 3 + s->static_len; #endif } else { - send_bits(s, (DYN_TREES<<1)+last, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); + send_bits(s, (DYN_TREES<<1) + last, 3); + send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1, + max_blindex + 1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); #ifdef ZLIB_DEBUG @@ -1003,21 +1073,18 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) s->compressed_len += 7; /* align on byte boundary */ #endif } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*last)); + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3, + s->compressed_len - 7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -int ZLIB_INTERNAL _tr_tally (s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { + s->sym_buf[s->sym_next++] = (uch)dist; + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); + s->sym_buf[s->sym_next++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1029,175 +1096,8 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - const ct_data *ltree; /* literal tree */ - const ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= (unsigned)base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) - deflate_state *s; -{ - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long black_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("white-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif + return (s->sym_next == s->sym_end); } diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/trees.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/trees.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/trees.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/trees.h diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/uncompr.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/uncompr.c similarity index 90% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/uncompr.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/uncompr.c index f03a1a865..5e256663b 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/uncompr.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/uncompr.c @@ -24,12 +24,8 @@ Z_DATA_ERROR if the input data was corrupted, including if the input data is an incomplete zlib stream. */ -int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong *sourceLen; -{ +int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -83,11 +79,7 @@ int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) err; } -int ZEXPORT uncompress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return uncompress2(dest, destLen, source, &sourceLen); } diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/zconf.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h similarity index 93% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/zconf.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h index a7a815f57..55fe101da 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/zconf.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h @@ -8,8 +8,17 @@ #ifndef ZCONF_H #define ZCONF_H -/* This include does prefixing as below, but with an updated set of names */ -#include "names.h" +/* + * This library is also built as a part of AOSP, which does not need to include + * chromeconf.h. This config does not want chromeconf.h, so it can set this + * macro to opt out. While this works today, there's no guarantee that building + * zlib outside of Chromium keeps working in the future. + */ +#if !defined(CHROMIUM_ZLIB_NO_CHROMECONF) +/* This include does prefixing as below, but with an updated set of names. Also + * sets up export macros in component builds. */ +#include "chromeconf.h" +#endif /* * If you *really* need a unique prefix for all types and library functions, @@ -41,6 +50,9 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound @@ -241,7 +253,11 @@ #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -352,6 +368,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -389,6 +408,9 @@ #ifndef FAR # define FAR #endif +#ifndef far +# define far +#endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ @@ -470,11 +492,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ @@ -510,7 +539,7 @@ typedef uLong FAR uLongf; #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# if defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.cmakein b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.cmakein new file mode 100644 index 000000000..310c43928 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.cmakein @@ -0,0 +1,553 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H +#cmakedefine Z_PREFIX +#cmakedefine Z_HAVE_UNISTD_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.in b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.in new file mode 100644 index 000000000..fb76ffe31 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zconf.h.in @@ -0,0 +1,551 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.3 b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.3 new file mode 100644 index 000000000..e733b5ab6 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.3 @@ -0,0 +1,149 @@ +.TH ZLIB 3 "xx Oct 2022" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe, assuming that the standard library functions +used are thread safe, such as memory allocation routines. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms may be added later +with the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +The library does not install any signal handler. +The decoder checks the consistency of the compressed data, +so the library should never crash even in the case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I test/example.c +and +.IR test/minigzip.c, +as well as other examples in the +.IR examples/ +directory. +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source. +.LP +.I zlib +is built in to many languages and operating systems, including but not limited to +Java, Python, .NET, PHP, Perl, Ruby, Swift, and Go. +.LP +An experimental package to read and write files in the .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/minizip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +source distribution. +.SH "SEE ALSO" +The +.I zlib +web site can be found at: +.IP +http://zlib.net/ +.LP +The data format used by the +.I zlib +library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) +.br +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) +.br +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) +.LP +Mark Nelson wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://marknelson.us/1997/01/01/zlib-engine/ +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://zlib.net/zlib_faq.html +.LP +before asking for help. +Send questions and/or comments to zlib@gzip.org, +or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). +.SH AUTHORS AND LICENSE +Version 1.2.13.1 +.LP +Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler +.LP +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +.LP +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +.LP +.nr step 1 1 +.IP \n[step]. 3 +The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +.IP \n+[step]. +Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +.IP \n+[step]. +This notice may not be removed or altered from any source distribution. +.LP +Jean-loup Gailly Mark Adler +.br +jloup@gzip.org madler@alumni.caltech.edu +.LP +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/zlib.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.h similarity index 81% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/zlib.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.h index 99fd467f6..014331fc8 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/zlib.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 + version 1.2.13.1, October xxth, 2022 - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,12 +37,12 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VERSION "1.2.13.1-motley" +#define ZLIB_VERNUM 0x12d1 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 -#define ZLIB_VER_SUBREVISION 0 +#define ZLIB_VER_REVISION 13 +#define ZLIB_VER_SUBREVISION 1 /* The 'zlib' compression library provides in-memory compression and @@ -78,8 +78,8 @@ extern "C" { even in the case of corrupted input. */ -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); +typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size); +typedef void (*free_func)(voidpf opaque, voidpf address); struct internal_state; @@ -217,7 +217,7 @@ typedef gz_header FAR *gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +ZEXTERN const char * ZEXPORT zlibVersion(void); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check @@ -225,7 +225,7 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); */ /* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); +ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If @@ -247,7 +247,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); */ -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -276,7 +276,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput + which can be used if desired to determine whether or not there is more output in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to @@ -359,8 +359,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); continue compressing. */ - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -375,7 +374,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateInit(z_streamp strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -397,7 +396,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); */ -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -517,7 +516,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -535,16 +534,15 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); */ /* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); +ZEXTERN int ZEXPORT deflateInit2(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. + fields zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. @@ -608,9 +606,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this @@ -652,16 +650,16 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If deflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. deflateGetDictionary() may return a length less than the window size, even when more than the window size in input has been provided. It may return up @@ -674,8 +672,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT deflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -692,7 +690,7 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateReset(z_streamp strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream @@ -703,20 +701,21 @@ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); +ZEXTERN int ZEXPORT deflateParams(z_streamp strm, + int level, + int strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). + strategy is changed, and if there have been any deflate() calls since the + state was initialized or reset, then the input available so far is + compressed with the old level and strategy using deflate(strm, Z_BLOCK). + There are three approaches for the compression levels 0, 1..3, and 4..9 + respectively. The new level and strategy will take effect at the next call + of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not @@ -729,7 +728,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Then no more input data should be provided before the deflateParams() call. If this is done, the old level and strategy will be applied to the data compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). + applied to the data compressed after deflateParams(). deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if @@ -740,11 +739,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, retried with more output space. */ -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); +ZEXTERN int ZEXPORT deflateTune(z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -757,8 +756,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); +ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, + uLong sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -772,9 +771,9 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, than Z_FINISH or Z_NO_FLUSH are used. */ -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); +ZEXTERN int ZEXPORT deflatePending(z_streamp strm, + unsigned *pending, + int *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -787,9 +786,9 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT deflatePrime(z_streamp strm, + int bits, + int value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -804,8 +803,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm, + gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -829,8 +828,8 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, */ /* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateInit2(z_streamp strm, + int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -865,9 +864,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. + below), inflate() will *not* automatically decode concatenated gzip members. + inflate() will return Z_STREAM_END at the end of the gzip member. The state + would need to be reset to continue decoding a subsequent gzip member. This + *must* be done if there is more data after a gzip member, in order for the + decompression to be compliant with the gzip standard (RFC 1952). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -881,9 +882,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, deferred until inflate() is called. */ -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -904,22 +905,22 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflate(). */ -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. */ -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateSync(z_streamp strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -938,8 +939,8 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); input each time, until success or end of the input data. */ -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -954,7 +955,7 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateReset(z_streamp strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The @@ -964,8 +965,8 @@ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateReset2(z_streamp strm, + int windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -978,9 +979,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT inflatePrime(z_streamp strm, + int bits, + int value); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the @@ -999,7 +1000,7 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +ZEXTERN long ZEXPORT inflateMark(z_streamp strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -1027,8 +1028,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm, + gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after @@ -1068,8 +1069,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, */ /* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); +ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits, + unsigned char FAR *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1089,13 +1090,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); +typedef unsigned (*in_func)(void FAR *, + z_const unsigned char FAR * FAR *); +typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned); -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack(z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1163,7 +1164,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, cannot return Z_OK. */ -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm); /* All memory allocated by inflateBackInit() is freed. @@ -1171,7 +1172,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); state was inconsistent. */ -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +ZEXTERN uLong ZEXPORT zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1224,8 +1225,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); you need special options. */ -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1239,9 +1240,9 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, buffer. */ -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); +ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte @@ -1255,15 +1256,15 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1280,8 +1281,8 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); +ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of @@ -1300,16 +1301,16 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. + Open the gzip (.gz) file at path for reading and decompressing, or + compressing and writing. The mode parameter is as in fopen ("rb" or "wb") + but can also include a compression level ("wb9") or a strategy: 'f' for + filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", + 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression + as in "wb9F". (See the description of deflateInit2 for more information + about the strategy parameter.) 'T' will request transparent writing or + appending with no compression and not using the gzip format. "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since @@ -1337,11 +1338,11 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); file could not be opened. */ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); /* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. + Associate a gzFile with the file descriptor fd. File descriptors are + obtained from calls like open, dup, creat, pipe or fileno (if the file has + been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor @@ -1360,15 +1361,15 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); /* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). + Set the internal buffer size used by this library's functions for file to + size. The default buffer size is 8192 bytes. This function must be called + after gzopen() or gzdopen(), and before any other calls that read or write + the file. The buffer memory allocation is always deferred to the first read + or write. Three times that size in buffer space is allocated. A larger + buffer size of, for example, 64K or 128K bytes will noticeably increase the + speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1376,20 +1377,20 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); too late. */ -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); /* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. + Dynamically update the compression level and strategy for file. See the + description of deflateInit2 for the meaning of these parameters. Previously + provided data is flushed before applying the parameter changes. gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not opened for writing, Z_ERRNO if there is an error writing the flushed data, or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len); /* - Reads the given number of uncompressed bytes from the compressed file. If + Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. @@ -1417,14 +1418,14 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); Z_STREAM_ERROR. */ -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, + gzFile file); /* - Read up to nitems items of size size from file to buf, otherwise operating - as gzread() does. This duplicates the interface of stdio's fread(), with - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. + Read and decompress up to nitems items of size size from file into buf, + otherwise operating as gzread() does. This duplicates the interface of + stdio's fread(), with size_t request and return types. If the library + defines size_t, then z_size_t is identical to size_t. If not, then z_size_t + is an unsigned integer type that can contain a pointer. gzfread() returns the number of full items read of size size, or zero if the end of the file was reached and a full item could not be read, or if @@ -1435,26 +1436,24 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, In the event that the end of file is reached and only a partial item is available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf + multiple of size, then the final partial item is nevertheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior is the same as the behavior of fread() implementations in common libraries, but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. + file, resetting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len); /* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. + Compress and write the len uncompressed bytes at buf to file. gzwrite + returns the number of uncompressed bytes written or 0 in case of error. */ -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, + z_size_t nitems, gzFile file); /* - gzfwrite() writes nitems items of size size from buf to file, duplicating + Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. @@ -1465,61 +1464,62 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, is returned, and the error state is set to Z_STREAM_ERROR. */ -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); /* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of + Convert, format, compress, and write the arguments (...) to file under + control of the string format, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or a negative zlib error code in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() + zlib was compiled with the insecure functions sprintf() or vsprintf(), because the secure snprintf() or vsnprintf() functions were not available. This can be determined using zlibCompileFlags(). */ -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); /* - Writes the given null-terminated string to the compressed file, excluding + Compress and write the given null-terminated string s to file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); /* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. + Read and decompress bytes from file into buf, until len-1 characters are + read, or until a newline character is read and transferred to buf, or an + end-of-file condition is encountered. If any characters are read or if len + is one, the string is terminated with a null character. If no characters + are read due to an end-of-file or len is less than one, then the buffer is + left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL for end-of-file or in case of error. If there was an error, the contents at buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc(gzFile file, int c); /* - Writes c, converted to an unsigned char, into the compressed file. gzputc + Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc(gzFile file); /* - Reads one byte from the compressed file. gzgetc returns this byte or -1 + Read and decompress one byte from file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. As such, it does not do all of the checking the other functions do. I.e. it does not check to see if file is NULL, nor whether the structure file points to has been clobbered or not. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); /* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. + Push c back onto the stream for file to be read as the first character on + the next read. At least one character of push-back is always allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the @@ -1528,11 +1528,11 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); /* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. + Flush all pending output to file. The parameter flush is as in the + deflate() function. The return value is the zlib error number (see function + gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new @@ -1544,11 +1544,11 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); */ /* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); +ZEXTERN z_off_t ZEXPORT gzseek(gzFile file, + z_off_t offset, int whence); - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the + Set the starting position to offset relative to whence for the next gzread + or gzwrite on file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. @@ -1563,52 +1563,52 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +ZEXTERN int ZEXPORT gzrewind(gzFile file); /* - Rewinds the given file. This function is supported only for reading. + Rewind file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). */ /* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gztell(gzFile file); - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). + Return the starting position for the next gzread or gzwrite on file. + This position represents a number of bytes in the uncompressed data stream, + and is zero when starting, even if appending or reading a gzip stream from + the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ /* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. + Return the current compressed (actual) read or write offset of file. This + offset includes the count of bytes that precede the gzip stream, for example + when appending or when using gzdopen() for reading. When reading, the + offset does not include as yet unused buffered input. This information can + be used for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +ZEXTERN int ZEXPORT gzeof(gzFile file); /* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. + Return true (1) if the end-of-file indicator for file has been set while + reading, false (0) otherwise. Note that the end-of-file indicator is set + only if the read tried to go past the end of the input, but came up short. + Therefore, just like feof(), gzeof() may return false even if there is no + more data to read, in the event that the last read request was for the exact + number of bytes remaining in the input file. This will happen if the input + file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +ZEXTERN int ZEXPORT gzdirect(gzFile file); /* - Returns true (1) if file is being copied directly while reading, or false + Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input @@ -1627,10 +1627,10 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose(gzFile file); /* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you + Flush all pending output for file, if necessary, close file and + deallocate the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. @@ -1640,8 +1640,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r(gzFile file); +ZEXTERN int ZEXPORT gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1652,12 +1652,12 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); zlib library. */ -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); /* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. + Return the error message for the last error which occurred on file. + errnum is set to zlib error number. If an error occurred in the file system + and not in the compression library, errnum is set to Z_ERRNO and the + application may consult errno to get the exact error code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is @@ -1668,9 +1668,9 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +ZEXTERN void ZEXPORT gzclearerr(gzFile file); /* - Clears the error and end-of-file flags for file. This is analogous to the + Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ @@ -1685,11 +1685,12 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); library. */ -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. + return the updated checksum. An Adler-32 value is in the range of a 32-bit + unsigned integer. If buf is Z_NULL, this function returns the required + initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. @@ -1704,15 +1705,15 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, + z_size_t len); /* Same as adler32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); +ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, + z_off_t len2); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for @@ -1722,12 +1723,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. + If buf is Z_NULL, this function returns the required initial value for the + crc. Pre- and post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the application. Usage example: @@ -1739,14 +1741,14 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf, + z_size_t len); /* Same as crc32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were @@ -1755,26 +1757,40 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); len2. */ +/* +ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); + + Return the operator corresponding to length len2, to be used with + crc32_combine_op(). +*/ + +ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); +/* + Give the same result as crc32_combine(), using op in place of len2. op is + is generated from len2 by crc32_combine_gen(). This will be faster than + crc32_combine() if the generated op is used more than once. +*/ + /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); +ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateInit_(z_streamp strm, + const char *version, int stream_size); +ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size); +ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size); #ifdef Z_PREFIX_SET # define z_deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) @@ -1819,7 +1835,7 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ @@ -1841,12 +1857,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1857,6 +1874,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 +# define z_crc32_combine_gen z_crc32_combine_gen64 # else # ifdef gzopen # undef gzopen @@ -1881,50 +1899,61 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # ifdef crc32_combine # undef crc32_combine # endif -# define crc32_combine crc32_combine64 +# ifdef crc32_combine64 +# undef crc32_combine64 +# endif +# ifdef crc32_combine_gen +# undef crc32_combine_gen +# endif +# ifdef crc32_combine_op +# undef crc32_combine_op +# endif # endif # ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); # endif #else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif #else /* Z_SOLO */ - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif /* !Z_SOLO */ /* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); +ZEXTERN const char * ZEXPORT zError(int); +ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void); +ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int); +ZEXTERN int ZEXPORT inflateValidate(z_streamp, int); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp); +ZEXTERN int ZEXPORT inflateResetKeep(z_streamp); +ZEXTERN int ZEXPORT deflateResetKeep(z_streamp); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path, + const char *mode); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); +ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, + const char *format, + va_list va); # endif #endif diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.map b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.map new file mode 100644 index 000000000..b330b606f --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.map @@ -0,0 +1,100 @@ +ZLIB_1.2.0 { + global: + compressBound; + deflateBound; + inflateBack; + inflateBackEnd; + inflateBackInit_; + inflateCopy; + local: + deflate_copyright; + inflate_copyright; + inflate_fast; + inflate_table; + zcalloc; + zcfree; + z_errmsg; + gz_error; + gz_intmax; + _*; +}; + +ZLIB_1.2.0.2 { + gzclearerr; + gzungetc; + zlibCompileFlags; +} ZLIB_1.2.0; + +ZLIB_1.2.0.8 { + deflatePrime; +} ZLIB_1.2.0.2; + +ZLIB_1.2.2 { + adler32_combine; + crc32_combine; + deflateSetHeader; + inflateGetHeader; +} ZLIB_1.2.0.8; + +ZLIB_1.2.2.3 { + deflateTune; + gzdirect; +} ZLIB_1.2.2; + +ZLIB_1.2.2.4 { + inflatePrime; +} ZLIB_1.2.2.3; + +ZLIB_1.2.3.3 { + adler32_combine64; + crc32_combine64; + gzopen64; + gzseek64; + gztell64; + inflateUndermine; +} ZLIB_1.2.2.4; + +ZLIB_1.2.3.4 { + inflateReset2; + inflateMark; +} ZLIB_1.2.3.3; + +ZLIB_1.2.3.5 { + gzbuffer; + gzoffset; + gzoffset64; + gzclose_r; + gzclose_w; +} ZLIB_1.2.3.4; + +ZLIB_1.2.5.1 { + deflatePending; +} ZLIB_1.2.3.5; + +ZLIB_1.2.5.2 { + deflateResetKeep; + gzgetc_; + inflateResetKeep; +} ZLIB_1.2.5.1; + +ZLIB_1.2.7.1 { + inflateGetDictionary; + gzvprintf; +} ZLIB_1.2.5.2; + +ZLIB_1.2.9 { + inflateCodesUsed; + inflateValidate; + uncompress2; + gzfread; + gzfwrite; + deflateGetDictionary; + adler32_z; + crc32_z; +} ZLIB_1.2.7.1; + +ZLIB_1.2.12 { + crc32_combine_gen; + crc32_combine_gen64; + crc32_combine_op; +} ZLIB_1.2.9; diff --git a/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.pc.cmakein b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.pc.cmakein new file mode 100644 index 000000000..a5e642938 --- /dev/null +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zlib.pc.cmakein @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@INSTALL_LIB_DIR@ +sharedlibdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ + +Name: zlib +Description: zlib compression library +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/zutil.c b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zutil.c similarity index 84% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/zutil.c rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/zutil.c index a76c6b0c7..b1c5d2d3c 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/zutil.c +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zutil.c @@ -24,13 +24,11 @@ z_const char * const z_errmsg[10] = { }; -const char * ZEXPORT zlibVersion() -{ +const char * ZEXPORT zlibVersion(void) { return ZLIB_VERSION; } -uLong ZEXPORT zlibCompileFlags() -{ +uLong ZEXPORT zlibCompileFlags(void) { uLong flags; flags = 0; @@ -61,9 +59,11 @@ uLong ZEXPORT zlibCompileFlags() #ifdef ZLIB_DEBUG flags += 1 << 8; #endif + /* #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif + */ #ifdef ZLIB_WINAPI flags += 1 << 10; #endif @@ -119,9 +119,7 @@ uLong ZEXPORT zlibCompileFlags() # endif int ZLIB_INTERNAL z_verbose = verbose; -void ZLIB_INTERNAL z_error (m) - char *m; -{ +void ZLIB_INTERNAL z_error(char *m) { fprintf(stderr, "%s\n", m); exit(1); } @@ -130,14 +128,12 @@ void ZLIB_INTERNAL z_error (m) /* exported to allow conversion of error code to string for compress() and * uncompress() */ -const char * ZEXPORT zError(err) - int err; -{ +const char * ZEXPORT zError(int err) { return ERR_MSG(err); } -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have +#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 + /* The older Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ @@ -146,22 +142,14 @@ const char * ZEXPORT zError(err) #ifndef HAVE_MEMCPY -void ZLIB_INTERNAL zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ +void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } -int ZLIB_INTERNAL zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ +int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) { uInt j; for (j = 0; j < len; j++) { @@ -170,10 +158,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len) return 0; } -void ZLIB_INTERNAL zmemzero(dest, len) - Bytef* dest; - uInt len; -{ +void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ @@ -214,8 +199,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { voidpf buf; ulg bsize = (ulg)items*size; @@ -240,8 +224,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) return buf; } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { int n; (void)opaque; @@ -277,14 +260,12 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) { (void)opaque; return _halloc((long)items, size); } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; _hfree(ptr); } @@ -297,25 +278,18 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); +extern voidp malloc(uInt size); +extern voidp calloc(uInt items, uInt size); +extern void free(voidpf ptr); #endif -voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { (void)opaque; return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } -void ZLIB_INTERNAL zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; free(ptr); } diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib/zutil.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zutil.h similarity index 87% rename from shared/sentry/external/crashpad/third_party/zlib/zlib/zutil.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib/zutil.h index 4425bcf75..6980a5f4e 100644 --- a/shared/sentry/external/crashpad/third_party/zlib/zlib/zutil.h +++ b/shared/sentry/src/external/crashpad/third_party/zlib/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -44,10 +44,6 @@ # endif #endif -#ifdef Z_SOLO - typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ -#endif - #ifndef local # define local static #endif @@ -61,6 +57,17 @@ typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; +#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC) +# include +# if (ULONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long +# elif (ULLONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long long +# elif (UINT_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned +# endif +#endif + extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ @@ -185,10 +192,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif @@ -203,8 +206,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* provide prototypes for these when building zlib without LFS */ #if !defined(_WIN32) && \ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); #endif /* common defaults */ @@ -243,16 +247,16 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else - void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); + void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len); + int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len); + void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len); #endif /* Diagnostic functions */ #ifdef ZLIB_DEBUG # include extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error OF((char *m)); + extern void ZLIB_INTERNAL z_error(char *m); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} @@ -269,9 +273,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif #ifndef Z_SOLO - voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); - void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); + voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, + unsigned size); + void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr); #endif #define ZALLOC(strm, items, size) \ diff --git a/shared/sentry/external/crashpad/third_party/zlib/zlib_crashpad.h b/shared/sentry/src/external/crashpad/third_party/zlib/zlib_crashpad.h similarity index 100% rename from shared/sentry/external/crashpad/third_party/zlib/zlib_crashpad.h rename to shared/sentry/src/external/crashpad/third_party/zlib/zlib_crashpad.h diff --git a/shared/sentry/external/crashpad/tools/BUILD.gn b/shared/sentry/src/external/crashpad/tools/BUILD.gn similarity index 90% rename from shared/sentry/external/crashpad/tools/BUILD.gn rename to shared/sentry/src/external/crashpad/tools/BUILD.gn index 4c5d446bb..157ee9291 100644 --- a/shared/sentry/external/crashpad/tools/BUILD.gn +++ b/shared/sentry/src/external/crashpad/tools/BUILD.gn @@ -25,16 +25,31 @@ source_set("tool_support") { deps = [ "$mini_chromium_source_parent:base" ] } -if (!crashpad_is_ios) { +crashpad_executable("dump_minidump_annotations") { + sources = [ "dump_minidump_annotations.cc" ] + + deps = [ + ":tool_support", + "../client", + "../snapshot", + "../util", + ] + + if (crashpad_is_win) { + cflags = [ "/wd4201" ] # nonstandard extension used : nameless struct/union + } +} + +if (!crashpad_is_ios && !crashpad_is_fuchsia) { crashpad_executable("crashpad_database_util") { sources = [ "crashpad_database_util.cc" ] deps = [ ":tool_support", + "$mini_chromium_source_parent:base", "../build:default_exe_manifest_win", "../client", "../compat", - "$mini_chromium_source_parent:base", "../util", ] } @@ -44,9 +59,9 @@ if (!crashpad_is_ios) { deps = [ ":tool_support", + "$mini_chromium_source_parent:base", "../build:default_exe_manifest_win", "../compat", - "$mini_chromium_source_parent:base", "../util", "../util:net", ] @@ -57,8 +72,8 @@ crashpad_executable("base94_encoder") { sources = [ "base94_encoder.cc" ] deps = [ ":tool_support", - "../build:default_exe_manifest_win", "$mini_chromium_source_parent:base", + "../build:default_exe_manifest_win", "../util", ] } @@ -69,11 +84,11 @@ if (!crashpad_is_fuchsia && !crashpad_is_ios) { deps = [ ":tool_support", + "$mini_chromium_source_parent:base", "../build:default_exe_manifest_win", "../compat", "../minidump", "../snapshot", - "$mini_chromium_source_parent:base", "../util", ] @@ -103,9 +118,9 @@ if (crashpad_is_mac || crashpad_is_fuchsia) { deps = [ ":tool_support", + "$mini_chromium_source_parent:base", "../client", "../compat", - "$mini_chromium_source_parent:base", "../util", ] } @@ -117,8 +132,8 @@ if (crashpad_is_mac) { deps = [ ":tool_support", - "../compat", "$mini_chromium_source_parent:base", + "../compat", "../util", ] } @@ -138,8 +153,8 @@ if (crashpad_is_mac) { deps = [ ":tool_support", - "../compat", "$mini_chromium_source_parent:base", + "../compat", "../util", ] } @@ -154,8 +169,9 @@ if (crashpad_is_mac) { deps = [ ":tool_support", - "../compat", "$mini_chromium_source_parent:base", + "../build:apple_enable_arc", + "../compat", "../util", ] } diff --git a/shared/sentry/external/crashpad/tools/CMakeLists.txt b/shared/sentry/src/external/crashpad/tools/CMakeLists.txt similarity index 60% rename from shared/sentry/external/crashpad/tools/CMakeLists.txt rename to shared/sentry/src/external/crashpad/tools/CMakeLists.txt index 5ad79d5d5..4dfd7b2f6 100644 --- a/shared/sentry/external/crashpad/tools/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/tools/CMakeLists.txt @@ -12,6 +12,27 @@ add_library(crashpad::tools ALIAS crashpad_tools) crashpad_install_target(crashpad_tools) if(CRASHPAD_BUILD_TOOLS) + add_executable(dump_minidump_annotations + dump_minidump_annotations.cc + ) + target_link_libraries(dump_minidump_annotations PRIVATE + crashpad_client + crashpad_snapshot + crashpad_util + crashpad_getopt + crashpad_tools + ) + if(MSVC) + target_compile_options(dump_minidump_annotations PRIVATE + $<$:/wd4201> # nonstandard extension used : nameless struct/union + ) + target_compile_definitions(dump_minidump_annotations PRIVATE + WIN32_LEAN_AND_MEAN + NOMINMAX + ) + endif() + crashpad_install_target(dump_minidump_annotations) + add_executable(crashpad_database_util crashpad_database_util.cc ) @@ -21,6 +42,12 @@ if(CRASHPAD_BUILD_TOOLS) crashpad_getopt crashpad_tools ) + if(MSVC) + target_compile_definitions(crashpad_database_util PRIVATE + WIN32_LEAN_AND_MEAN + NOMINMAX + ) + endif() crashpad_install_target(crashpad_database_util) add_executable(crashpad_http_upload @@ -34,6 +61,12 @@ if(CRASHPAD_BUILD_TOOLS) crashpad_zlib mini_chromium ) + if(MSVC) + target_compile_definitions(crashpad_http_upload PRIVATE + WIN32_LEAN_AND_MEAN + NOMINMAX + ) + endif() crashpad_install_target(crashpad_http_upload) add_executable(crashpad_generate_dump @@ -46,16 +79,24 @@ if(CRASHPAD_BUILD_TOOLS) crashpad_tools mini_chromium ) - if(APPLE) - # FIXME: cmake 3.13 added target_link_options - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -sectcreate __TEXT __info_plist \"${CMAKE_CURRENT_SOURCE_DIR}/mac/sectaskaccess_info.plist\"") + if(MSVC) + target_compile_definitions(crashpad_generate_dump PRIVATE + WIN32_LEAN_AND_MEAN + NOMINMAX + ) endif() crashpad_install_target(crashpad_generate_dump) if(APPLE) + function(setup_apple_tool target) + target_link_options(${target} PRIVATE LINKER:-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/mac/sectaskaccess_info.plist) + target_include_directories(${target} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..") + endfunction() + add_executable(run_with_crashpad run_with_crashpad.cc ) + setup_apple_tool(run_with_crashpad) target_link_libraries(run_with_crashpad PRIVATE crashpad_client crashpad_compat @@ -68,6 +109,7 @@ if(CRASHPAD_BUILD_TOOLS) add_executable(catch_exception_tool mac/catch_exception_tool.cc ) + setup_apple_tool(catch_exception_tool) target_link_libraries(catch_exception_tool PRIVATE crashpad_compat crashpad_tools @@ -79,22 +121,21 @@ if(CRASHPAD_BUILD_TOOLS) add_executable(exception_port_tool mac/exception_port_tool.cc ) + setup_apple_tool(exception_port_tool) target_link_libraries(exception_port_tool PRIVATE crashpad_compat crashpad_tools crashpad_util mini_chromium ) - # FIXME: cmake 3.13 added target_link_options - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -sectcreate __TEXT __info_plist \"${CMAKE_CURRENT_SOURCE_DIR}/mac/sectaskaccess_info.plist\"") - crashpad_install_target(exception_port_tool) add_executable(on_demand_service_tool mac/on_demand_service_tool.mm ) + setup_apple_tool(on_demand_service_tool) target_link_libraries(on_demand_service_tool PRIVATE - -framework CoreFoundation - -framework Foundation + "-framework CoreFoundation" + "-framework Foundation" crashpad_compat crashpad_tools crashpad_util diff --git a/shared/sentry/external/crashpad/tools/base94_encoder.cc b/shared/sentry/src/external/crashpad/tools/base94_encoder.cc similarity index 100% rename from shared/sentry/external/crashpad/tools/base94_encoder.cc rename to shared/sentry/src/external/crashpad/tools/base94_encoder.cc diff --git a/shared/sentry/external/crashpad/tools/base94_encoder.md b/shared/sentry/src/external/crashpad/tools/base94_encoder.md similarity index 100% rename from shared/sentry/external/crashpad/tools/base94_encoder.md rename to shared/sentry/src/external/crashpad/tools/base94_encoder.md diff --git a/shared/sentry/external/crashpad/tools/crashpad_database_util.cc b/shared/sentry/src/external/crashpad/tools/crashpad_database_util.cc similarity index 100% rename from shared/sentry/external/crashpad/tools/crashpad_database_util.cc rename to shared/sentry/src/external/crashpad/tools/crashpad_database_util.cc diff --git a/shared/sentry/external/crashpad/tools/crashpad_database_util.md b/shared/sentry/src/external/crashpad/tools/crashpad_database_util.md similarity index 100% rename from shared/sentry/external/crashpad/tools/crashpad_database_util.md rename to shared/sentry/src/external/crashpad/tools/crashpad_database_util.md diff --git a/shared/sentry/external/crashpad/tools/crashpad_http_upload.cc b/shared/sentry/src/external/crashpad/tools/crashpad_http_upload.cc similarity index 100% rename from shared/sentry/external/crashpad/tools/crashpad_http_upload.cc rename to shared/sentry/src/external/crashpad/tools/crashpad_http_upload.cc diff --git a/shared/sentry/external/crashpad/tools/crashpad_http_upload.md b/shared/sentry/src/external/crashpad/tools/crashpad_http_upload.md similarity index 100% rename from shared/sentry/external/crashpad/tools/crashpad_http_upload.md rename to shared/sentry/src/external/crashpad/tools/crashpad_http_upload.md diff --git a/shared/sentry/src/external/crashpad/tools/dump_minidump_annotations.cc b/shared/sentry/src/external/crashpad/tools/dump_minidump_annotations.cc new file mode 100644 index 000000000..1c26c1b3d --- /dev/null +++ b/shared/sentry/src/external/crashpad/tools/dump_minidump_annotations.cc @@ -0,0 +1,147 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "base/files/file_path.h" +#include "client/annotation.h" +#include "util/file/file_reader.h" +#include "snapshot/minidump/process_snapshot_minidump.h" +#include "tools/tool_support.h" + +namespace crashpad { +namespace { + +void Usage(const base::FilePath& me) { + // clang-format off + fprintf(stderr, +"Usage: %" PRFilePath " [OPTION]... PATH\n" +"Dump annotations from minidumps.\n" +"\n" +" --help display this help and exit\n" +" --version output version information and exit\n", + me.value().c_str()); + // clang-format on + ToolSupport::UsageTail(me); +} + +struct Options { + const char* minidump; +}; + +int DumpMinidumpAnnotationsMain(int argc, char* argv[]) { + const base::FilePath argv0( + ToolSupport::CommandLineArgumentToFilePathStringType(argv[0])); + const base::FilePath me(argv0.BaseName()); + + enum OptionFlags { + // Long options without short equivalents. + kOptionLastChar = 255, + kOptionMinidump, + + // Standard options. + kOptionHelp = -2, + kOptionVersion = -3, + }; + + static constexpr option long_options[] = { + {"minidump", required_argument, nullptr, kOptionMinidump}, + {"help", no_argument, nullptr, kOptionHelp}, + {"version", no_argument, nullptr, kOptionVersion}, + {nullptr, 0, nullptr, 0}, + }; + + Options options = {}; + + int opt; + while ((opt = getopt_long(argc, argv, "", long_options, nullptr)) != -1) { + switch (opt) { + case kOptionMinidump: { + options.minidump = optarg; + break; + } + case kOptionHelp: { + Usage(me); + return EXIT_SUCCESS; + } + case kOptionVersion: { + ToolSupport::Version(me); + return EXIT_SUCCESS; + } + default: { + ToolSupport::UsageHint(me, nullptr); + return EXIT_FAILURE; + } + } + } + argc -= optind; + argv += optind; + + if (!options.minidump) { + ToolSupport::UsageHint(me, "--minidump is required"); + return EXIT_FAILURE; + } + + FileReader reader; + if (!reader.Open(base::FilePath( + ToolSupport::CommandLineArgumentToFilePathStringType( + options.minidump)))) { + return EXIT_FAILURE; + } + + ProcessSnapshotMinidump snapshot; + if (!snapshot.Initialize(&reader)) { + return EXIT_FAILURE; + } + + for (const ModuleSnapshot* module : snapshot.Modules()) { + printf("Module: %s\n", module->Name().c_str()); + printf(" Simple Annotations\n"); + for (const auto& kv : module->AnnotationsSimpleMap()) { + printf(" simple_annotations[\"%s\"] = %s\n", + kv.first.c_str(), kv.second.c_str()); + } + + printf(" Vectored Annotations\n"); + int index = 0; + for (const std::string& annotation : module->AnnotationsVector()) { + printf(" vectored_annotations[%d] = %s\n", index, annotation.c_str()); + index++; + } + + printf(" Annotation Objects\n"); + for (const AnnotationSnapshot& annotation : module->AnnotationObjects()) { + printf(" annotation_objects[\"%s\"] = ", annotation.name.c_str()); + if (annotation.type != static_cast(Annotation::Type::kString)) { + + printf("\n"); + continue; + } + + std::string value(reinterpret_cast(annotation.value.data()), + annotation.value.size()); + + printf("%s\n", value.c_str()); + } + } + + return EXIT_SUCCESS; +} + +} // namespace +} // namespace crashpad + +int main(int argc, char* argv[]) { + return crashpad::DumpMinidumpAnnotationsMain(argc, argv); +} diff --git a/shared/sentry/external/crashpad/tools/generate_dump.cc b/shared/sentry/src/external/crashpad/tools/generate_dump.cc similarity index 98% rename from shared/sentry/external/crashpad/tools/generate_dump.cc rename to shared/sentry/src/external/crashpad/tools/generate_dump.cc index f0aad1ba2..75e0e5351 100644 --- a/shared/sentry/external/crashpad/tools/generate_dump.cc +++ b/shared/sentry/src/external/crashpad/tools/generate_dump.cc @@ -38,7 +38,7 @@ #if BUILDFLAG(IS_APPLE) #include -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "snapshot/mac/process_snapshot_mac.h" #include "util/mach/scoped_task_suspend.h" #include "util/mach/task_for_pid.h" @@ -144,7 +144,7 @@ int GenerateDumpMain(int argc, char* argv[]) { if (task == TASK_NULL) { return EXIT_FAILURE; } - base::mac::ScopedMachSendRight task_owner(task); + base::apple::ScopedMachSendRight task_owner(task); // This tool may have been installed as a setuid binary so that TaskForPID() // could succeed. Drop any privileges now that they’re no longer necessary. diff --git a/shared/sentry/external/crashpad/tools/generate_dump.md b/shared/sentry/src/external/crashpad/tools/generate_dump.md similarity index 100% rename from shared/sentry/external/crashpad/tools/generate_dump.md rename to shared/sentry/src/external/crashpad/tools/generate_dump.md diff --git a/shared/sentry/external/crashpad/tools/mac/catch_exception_tool.cc b/shared/sentry/src/external/crashpad/tools/mac/catch_exception_tool.cc similarity index 98% rename from shared/sentry/external/crashpad/tools/mac/catch_exception_tool.cc rename to shared/sentry/src/external/crashpad/tools/mac/catch_exception_tool.cc index 8d71a3372..3f2265972 100644 --- a/shared/sentry/external/crashpad/tools/mac/catch_exception_tool.cc +++ b/shared/sentry/src/external/crashpad/tools/mac/catch_exception_tool.cc @@ -24,9 +24,9 @@ #include #include +#include "base/apple/mach_logging.h" #include "base/files/scoped_file.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "tools/tool_support.h" #include "util/mach/bootstrap.h" #include "util/mach/exc_server_variants.h" @@ -267,8 +267,8 @@ int CatchExceptionToolMain(int argc, char* argv[]) { return EXIT_FAILURE; } - base::mac::ScopedMachReceiveRight - service_port(BootstrapCheckIn(options.mach_service)); + base::apple::ScopedMachReceiveRight service_port( + BootstrapCheckIn(options.mach_service)); if (service_port == kMachPortNull) { return EXIT_FAILURE; } diff --git a/shared/sentry/external/crashpad/tools/mac/catch_exception_tool.md b/shared/sentry/src/external/crashpad/tools/mac/catch_exception_tool.md similarity index 100% rename from shared/sentry/external/crashpad/tools/mac/catch_exception_tool.md rename to shared/sentry/src/external/crashpad/tools/mac/catch_exception_tool.md diff --git a/shared/sentry/external/crashpad/tools/mac/exception_port_tool.cc b/shared/sentry/src/external/crashpad/tools/mac/exception_port_tool.cc similarity index 98% rename from shared/sentry/external/crashpad/tools/mac/exception_port_tool.cc rename to shared/sentry/src/external/crashpad/tools/mac/exception_port_tool.cc index 0c0a2aa8d..437c15f48 100644 --- a/shared/sentry/external/crashpad/tools/mac/exception_port_tool.cc +++ b/shared/sentry/src/external/crashpad/tools/mac/exception_port_tool.cc @@ -25,8 +25,8 @@ #include #include -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" #include "tools/tool_support.h" #include "util/mach/bootstrap.h" #include "util/mach/exception_ports.h" @@ -43,7 +43,7 @@ namespace { //! destruction. //! //! This class effectively implements what a vector of -//! base::mac::ScopedMachSendRight objects would be. +//! base::apple::ScopedMachSendRight objects would be. //! //! The various “show” operations performed by this program display Mach ports //! by their names as they are known in this task. For this to be useful, rights @@ -191,7 +191,7 @@ bool ParseHandlerString(const char* handler_string_ro, // |mach_send_right_pool|. void ShowBootstrapService(const std::string& service_name, MachSendRightPool* mach_send_right_pool) { - base::mac::ScopedMachSendRight service_port(BootstrapLookUp(service_name)); + base::apple::ScopedMachSendRight service_port(BootstrapLookUp(service_name)); if (service_port == kMachPortNull) { return; } @@ -283,7 +283,7 @@ void ShowExceptionPorts(const ExceptionPorts& exception_ports, // desired. bool SetExceptionPort(const ExceptionHandlerDescription* description, mach_port_t target_port) { - base::mac::ScopedMachSendRight service_port; + base::apple::ScopedMachSendRight service_port; if (description->handler.compare( 0, strlen(kHandlerBootstrapColon), kHandlerBootstrapColon) == 0) { const char* service_name = @@ -490,7 +490,7 @@ int ExceptionPortToolMain(int argc, char* argv[]) { return kExitFailure; } - base::mac::ScopedMachSendRight alternate_task_owner; + base::apple::ScopedMachSendRight alternate_task_owner; if (options.pid) { if (argc) { ToolSupport::UsageHint(me, "cannot combine -p with COMMAND"); diff --git a/shared/sentry/external/crashpad/tools/mac/exception_port_tool.md b/shared/sentry/src/external/crashpad/tools/mac/exception_port_tool.md similarity index 100% rename from shared/sentry/external/crashpad/tools/mac/exception_port_tool.md rename to shared/sentry/src/external/crashpad/tools/mac/exception_port_tool.md diff --git a/shared/sentry/external/crashpad/tools/mac/on_demand_service_tool.md b/shared/sentry/src/external/crashpad/tools/mac/on_demand_service_tool.md similarity index 100% rename from shared/sentry/external/crashpad/tools/mac/on_demand_service_tool.md rename to shared/sentry/src/external/crashpad/tools/mac/on_demand_service_tool.md diff --git a/shared/sentry/external/crashpad/tools/mac/on_demand_service_tool.mm b/shared/sentry/src/external/crashpad/tools/mac/on_demand_service_tool.mm similarity index 97% rename from shared/sentry/external/crashpad/tools/mac/on_demand_service_tool.mm rename to shared/sentry/src/external/crashpad/tools/mac/on_demand_service_tool.mm index 41896ff8f..05ddae1d4 100644 --- a/shared/sentry/external/crashpad/tools/mac/on_demand_service_tool.mm +++ b/shared/sentry/src/external/crashpad/tools/mac/on_demand_service_tool.mm @@ -24,7 +24,7 @@ #include #include -#include "base/mac/foundation_util.h" +#include "base/apple/bridging.h" #include "base/strings/sys_string_conversions.h" #include "tools/tool_support.h" #include "util/mac/service_management.h" @@ -158,13 +158,13 @@ int OnDemandServiceToolMain(int argc, char* argv[]) { } NSMutableDictionary* mutable_job_dictionary = - [[job_dictionary mutableCopy] autorelease]; + [job_dictionary mutableCopy]; mutable_job_dictionary[@LAUNCH_JOBKEY_MACHSERVICES] = mach_services; job_dictionary = mutable_job_dictionary; } CFDictionaryRef job_dictionary_cf = - base::mac::NSToCFCast(job_dictionary); + base::apple::NSToCFPtrCast(job_dictionary); if (!ServiceManagementSubmitJob(job_dictionary_cf)) { fprintf(stderr, "%s: failed to submit job\n", me.c_str()); return EXIT_FAILURE; diff --git a/shared/sentry/external/crashpad/tools/mac/sectaskaccess_info.plist b/shared/sentry/src/external/crashpad/tools/mac/sectaskaccess_info.plist similarity index 100% rename from shared/sentry/external/crashpad/tools/mac/sectaskaccess_info.plist rename to shared/sentry/src/external/crashpad/tools/mac/sectaskaccess_info.plist diff --git a/shared/sentry/external/crashpad/tools/run_with_crashpad.cc b/shared/sentry/src/external/crashpad/tools/run_with_crashpad.cc similarity index 96% rename from shared/sentry/external/crashpad/tools/run_with_crashpad.cc rename to shared/sentry/src/external/crashpad/tools/run_with_crashpad.cc index 1f60081d6..59abff1e9 100644 --- a/shared/sentry/external/crashpad/tools/run_with_crashpad.cc +++ b/shared/sentry/src/external/crashpad/tools/run_with_crashpad.cc @@ -102,6 +102,7 @@ int RunWithCrashpadMain(int argc, char* argv[]) { kOptionAnnotation, kOptionDatabase, kOptionURL, + kOptionHTTPProxy, // Standard options. kOptionHelp = -2, @@ -113,6 +114,7 @@ int RunWithCrashpadMain(int argc, char* argv[]) { {"annotation", required_argument, nullptr, kOptionAnnotation}, {"database", required_argument, nullptr, kOptionDatabase}, {"url", required_argument, nullptr, kOptionURL}, + {"http-proxy", optional_argument, nullptr, kOptionHTTPProxy}, {"argument", required_argument, nullptr, kOptionArgument}, {"help", no_argument, nullptr, kOptionHelp}, {"version", no_argument, nullptr, kOptionVersion}, @@ -124,6 +126,7 @@ int RunWithCrashpadMain(int argc, char* argv[]) { std::map annotations; std::string database; std::string url; + std::string httpProxy; std::vector arguments; } options = {}; options.handler = "crashpad_handler"; @@ -158,6 +161,10 @@ int RunWithCrashpadMain(int argc, char* argv[]) { options.url = optarg; break; } + case kOptionHTTPProxy: { + options.httpProxy = optarg; + break; + } case kOptionArgument: { options.arguments.push_back(optarg); break; @@ -190,6 +197,7 @@ int RunWithCrashpadMain(int argc, char* argv[]) { base::FilePath(options.database), base::FilePath(), options.url, + options.httpProxy, options.annotations, options.arguments, false, diff --git a/shared/sentry/external/crashpad/tools/run_with_crashpad.md b/shared/sentry/src/external/crashpad/tools/run_with_crashpad.md similarity index 94% rename from shared/sentry/external/crashpad/tools/run_with_crashpad.md rename to shared/sentry/src/external/crashpad/tools/run_with_crashpad.md index 7210c1d41..69302eef8 100644 --- a/shared/sentry/external/crashpad/tools/run_with_crashpad.md +++ b/shared/sentry/src/external/crashpad/tools/run_with_crashpad.md @@ -27,7 +27,7 @@ run_with_crashpad—Run a program with a Crashpad exception handler ## Description Starts a Crashpad exception handler server such as -[crashpad_handler(8)](../../handler/crashpad_handler.md) and becomes its client, +[crashpad_handler(8)](../handler/crashpad_handler.md) and becomes its client, setting an exception port referencing the handler. Then, executes _COMMAND_ along with any arguments specified (_ARG…_) with the new exception port in effect. @@ -88,7 +88,7 @@ Illegal instruction: 4 ``` Starts a Crashpad exception handler server at a nonstandard path, and runs -[exception_port_tool(1)](exception_port_tool.md) to show the task-level +[exception_port_tool(1)](mac/exception_port_tool.md) to show the task-level exception ports. ``` @@ -118,8 +118,8 @@ task exception port 0, mask 0x1c00 (CRASH|RESOURCE|GUARD), port 0x30b, behavior ## See Also -[crashpad_handler(8)](../../handler/crashpad_handler.md), -[exception_port_tool(1)](exception_port_tool.md) +[crashpad_handler(8)](../handler/crashpad_handler.md), +[exception_port_tool(1)](mac/exception_port_tool.md) ## Resources diff --git a/shared/sentry/external/crashpad/tools/tool_support.cc b/shared/sentry/src/external/crashpad/tools/tool_support.cc similarity index 100% rename from shared/sentry/external/crashpad/tools/tool_support.cc rename to shared/sentry/src/external/crashpad/tools/tool_support.cc diff --git a/shared/sentry/external/crashpad/tools/tool_support.h b/shared/sentry/src/external/crashpad/tools/tool_support.h similarity index 100% rename from shared/sentry/external/crashpad/tools/tool_support.h rename to shared/sentry/src/external/crashpad/tools/tool_support.h diff --git a/shared/sentry/external/crashpad/util/BUILD.gn b/shared/sentry/src/external/crashpad/util/BUILD.gn similarity index 96% rename from shared/sentry/external/crashpad/util/BUILD.gn rename to shared/sentry/src/external/crashpad/util/BUILD.gn index e1ecd39fb..7e06fcdac 100644 --- a/shared/sentry/external/crashpad/util/BUILD.gn +++ b/shared/sentry/src/external/crashpad/util/BUILD.gn @@ -19,7 +19,7 @@ if (crashpad_is_in_chromium) { import("//build/config/sanitizers/sanitizers.gni") } -if (crashpad_is_mac || crashpad_is_ios) { +if (crashpad_is_apple) { if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { import("//build/config/sysroot.gni") } else { @@ -267,6 +267,7 @@ crashpad_static_library("util") { "stream/zlib_output_stream.h", "string/split_string.cc", "string/split_string.h", + "synchronization/scoped_spin_guard.h", "synchronization/semaphore.h", "thread/stoppable.h", "thread/thread.cc", @@ -316,7 +317,7 @@ crashpad_static_library("util") { } } - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { sources += [ "mac/xattr.cc", "mac/xattr.h", @@ -400,6 +401,8 @@ crashpad_static_library("util") { "ios/raw_logging.h", "ios/scoped_background_task.h", "ios/scoped_background_task.mm", + "ios/scoped_vm_map.cc", + "ios/scoped_vm_map.h", "ios/scoped_vm_read.cc", "ios/scoped_vm_read.h", ] @@ -429,6 +432,8 @@ crashpad_static_library("util") { "linux/exception_information.h", "linux/memory_map.cc", "linux/memory_map.h", + "linux/pac_helper.cc", + "linux/pac_helper.h", "linux/proc_stat_reader.cc", "linux/proc_stat_reader.h", "linux/proc_task_reader.cc", @@ -550,18 +555,20 @@ crashpad_static_library("util") { "fuchsia/scoped_task_suspend.cc", "fuchsia/scoped_task_suspend.h", "fuchsia/traits.h", - "misc/capture_context_fuchsia.S", "misc/paths_fuchsia.cc", "process/process_memory_fuchsia.cc", "process/process_memory_fuchsia.h", ] + + sources -= [ "misc/capture_context.h" ] } public_configs = [ "..:crashpad_config" ] # Include generated files starting with "util". if (crashpad_is_in_fuchsia) { - include_dirs = [ "$root_gen_dir/third_party/crashpad" ] + include_dirs = + [ "$root_gen_dir/" + rebase_path(fuchsia_crashpad_root, "//") ] } else { include_dirs = [ "$root_gen_dir/third_party/crashpad/crashpad" ] } @@ -577,13 +584,14 @@ crashpad_static_library("util") { "$mini_chromium_source_parent:chromeos_buildflags", ] - if (crashpad_is_mac || crashpad_is_ios) { - include_dirs += [ "$root_gen_dir" ] - deps += [ ":mig_output" ] - } + configs = [ "../build:flock_always_supported_defines" ] - if (crashpad_is_ios) { - deps += [ "../build:ios_enable_arc" ] + if (crashpad_is_apple) { + include_dirs += [ "$root_gen_dir" ] + deps += [ + ":mig_output", + "../build:apple_enable_arc", + ] } if (crashpad_is_mac && !crashpad_is_in_fuchsia) { @@ -644,6 +652,10 @@ crashpad_static_library("net") { "$mini_chromium_source_parent:base", ] + if (crashpad_is_apple) { + deps += [ "../build:apple_enable_arc" ] + } + if (crashpad_is_mac && !crashpad_is_in_fuchsia) { sources += [ "net/http_transport_mac.mm" ] } @@ -773,6 +785,7 @@ source_set("util_test") { "stream/test_output_stream.h", "stream/zlib_output_stream_test.cc", "string/split_string_test.cc", + "synchronization/scoped_spin_guard_test.cc", "synchronization/semaphore_test.cc", "thread/thread_log_messages_test.cc", "thread/thread_test.cc", @@ -795,7 +808,7 @@ source_set("util_test") { sources += [ "posix/scoped_mmap_test.cc" ] } - if (crashpad_is_mac || crashpad_is_ios) { + if (crashpad_is_apple) { sources += [ "mac/xattr_test.cc", "mach/composite_mach_message_server_test.cc", @@ -831,6 +844,7 @@ source_set("util_test") { sources += [ "ios/ios_intermediate_dump_reader_test.cc", "ios/ios_intermediate_dump_writer_test.cc", + "ios/scoped_vm_map_test.cc", "ios/scoped_vm_read_test.cc", ] @@ -856,7 +870,10 @@ source_set("util_test") { } if (crashpad_is_fuchsia) { - sources += [ "misc/capture_context_test_util_fuchsia.cc" ] + sources -= [ + "misc/capture_context_test.cc", + "misc/capture_context_test_util.h", + ] } if (crashpad_is_win) { @@ -909,6 +926,10 @@ source_set("util_test") { } } + if (crashpad_is_apple) { + deps += [ "../build:apple_enable_arc" ] + } + if (crashpad_is_mac) { frameworks = [ "Foundation.framework" ] } diff --git a/shared/sentry/external/crashpad/util/CMakeLists.txt b/shared/sentry/src/external/crashpad/util/CMakeLists.txt similarity index 90% rename from shared/sentry/external/crashpad/util/CMakeLists.txt rename to shared/sentry/src/external/crashpad/util/CMakeLists.txt index 4c1d0e6f9..02ff865a4 100644 --- a/shared/sentry/external/crashpad/util/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/util/CMakeLists.txt @@ -104,6 +104,7 @@ add_library(crashpad_util STATIC stream/zlib_output_stream.h string/split_string.cc string/split_string.h + synchronization/scoped_spin_guard.h synchronization/semaphore.h thread/stoppable.h thread/thread.cc @@ -225,6 +226,8 @@ if(APPLE) ios/scoped_background_task.mm ios/scoped_vm_read.cc ios/scoped_vm_read.h + ios/scoped_vm_map.cc + ios/scoped_vm_map.h ) # This specific file requires ARC support, while other parts do not # build when ARC is enabled. @@ -245,8 +248,34 @@ if(ANDROID) endif() if(LINUX OR ANDROID) + if (LINUX) + if(NOT CURL_FOUND) # Some other lib might bring libcurl already + find_package(CURL REQUIRED) + endif() + + if(TARGET CURL::libcurl) # Only available in cmake 3.12+ + target_link_libraries(crashpad_util PRIVATE CURL::libcurl) + else() + # Needed for cmake < 3.12 support (cmake 3.12 introduced the target CURL::libcurl) + target_include_directories(crashpad_util PRIVATE ${CURL_INCLUDE_DIR}) + # The exported sentry target must not contain any path of the build machine, therefore use generator expressions + string(REPLACE ";" "$" GENEX_CURL_LIBRARIES "${CURL_LIBRARIES}") + string(REPLACE ";" "$" GENEX_CURL_COMPILE_DEFINITIONS "${CURL_COMPILE_DEFINITIONS}") + target_link_libraries(crashpad_util PRIVATE $) + target_compile_definitions(crashpad_util PRIVATE $) + endif() + + SET(HTTP_TRANSPORT_IMPL net/http_transport_libcurl.cc) + else() + find_package(OpenSSL) + if(OPENSSL_FOUND) + set(CRASHPAD_USE_BORINGSSL ON) + endif() + SET(HTTP_TRANSPORT_IMPL net/http_transport_socket.cc) + endif() + target_sources(crashpad_util PRIVATE - net/http_transport_socket.cc + ${HTTP_TRANSPORT_IMPL} linux/address_types.h linux/auxiliary_vector.cc linux/auxiliary_vector.h @@ -260,6 +289,8 @@ if(LINUX OR ANDROID) linux/exception_information.h linux/memory_map.cc linux/memory_map.h + linux/pac_helper.cc + linux/pac_helper.h linux/proc_stat_reader.cc linux/proc_stat_reader.h linux/proc_task_reader.cc @@ -354,7 +385,7 @@ if(WIN32) win/traits.h win/xp_compat.h ) - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") + if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm|ARM64") target_sources(crashpad_util PRIVATE misc/capture_context_win_arm64.asm ) @@ -495,7 +526,9 @@ endif() if(WIN32) target_link_libraries(crashpad_util PRIVATE user32 version winhttp) if(MSVC) - target_compile_options(crashpad_util PRIVATE "/wd4201") + target_compile_options(crashpad_util PRIVATE + $<$:/wd4201> # nonstandard extension used : nameless struct/union. + ) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(CMAKE_ASM_MASM_FLAGS "${CMAKE_ASM_MASM_FLAGS} /safeseh") endif() diff --git a/shared/sentry/external/crashpad/util/file/delimited_file_reader.cc b/shared/sentry/src/external/crashpad/util/file/delimited_file_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/delimited_file_reader.cc rename to shared/sentry/src/external/crashpad/util/file/delimited_file_reader.cc diff --git a/shared/sentry/external/crashpad/util/file/delimited_file_reader.h b/shared/sentry/src/external/crashpad/util/file/delimited_file_reader.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/delimited_file_reader.h rename to shared/sentry/src/external/crashpad/util/file/delimited_file_reader.h diff --git a/shared/sentry/external/crashpad/util/file/delimited_file_reader_test.cc b/shared/sentry/src/external/crashpad/util/file/delimited_file_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/delimited_file_reader_test.cc rename to shared/sentry/src/external/crashpad/util/file/delimited_file_reader_test.cc diff --git a/shared/sentry/external/crashpad/util/file/directory_reader.h b/shared/sentry/src/external/crashpad/util/file/directory_reader.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/directory_reader.h rename to shared/sentry/src/external/crashpad/util/file/directory_reader.h diff --git a/shared/sentry/external/crashpad/util/file/directory_reader_posix.cc b/shared/sentry/src/external/crashpad/util/file/directory_reader_posix.cc similarity index 98% rename from shared/sentry/external/crashpad/util/file/directory_reader_posix.cc rename to shared/sentry/src/external/crashpad/util/file/directory_reader_posix.cc index d046eb114..352991d61 100644 --- a/shared/sentry/external/crashpad/util/file/directory_reader_posix.cc +++ b/shared/sentry/src/external/crashpad/util/file/directory_reader_posix.cc @@ -19,6 +19,7 @@ #include #include +#include "base/check.h" #include "base/logging.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/util/file/directory_reader_test.cc b/shared/sentry/src/external/crashpad/util/file/directory_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/directory_reader_test.cc rename to shared/sentry/src/external/crashpad/util/file/directory_reader_test.cc diff --git a/shared/sentry/external/crashpad/util/file/directory_reader_win.cc b/shared/sentry/src/external/crashpad/util/file/directory_reader_win.cc similarity index 98% rename from shared/sentry/external/crashpad/util/file/directory_reader_win.cc rename to shared/sentry/src/external/crashpad/util/file/directory_reader_win.cc index e1bb38ec7..952511831 100644 --- a/shared/sentry/external/crashpad/util/file/directory_reader_win.cc +++ b/shared/sentry/src/external/crashpad/util/file/directory_reader_win.cc @@ -16,6 +16,7 @@ #include +#include "base/check.h" #include "base/logging.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/util/file/file_helper.cc b/shared/sentry/src/external/crashpad/util/file/file_helper.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_helper.cc rename to shared/sentry/src/external/crashpad/util/file/file_helper.cc diff --git a/shared/sentry/external/crashpad/util/file/file_helper.h b/shared/sentry/src/external/crashpad/util/file/file_helper.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_helper.h rename to shared/sentry/src/external/crashpad/util/file/file_helper.h diff --git a/shared/sentry/external/crashpad/util/file/file_io.cc b/shared/sentry/src/external/crashpad/util/file/file_io.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_io.cc rename to shared/sentry/src/external/crashpad/util/file/file_io.cc diff --git a/shared/sentry/external/crashpad/util/file/file_io.h b/shared/sentry/src/external/crashpad/util/file/file_io.h similarity index 99% rename from shared/sentry/external/crashpad/util/file/file_io.h rename to shared/sentry/src/external/crashpad/util/file/file_io.h index a63015ea0..607cd1eb5 100644 --- a/shared/sentry/external/crashpad/util/file/file_io.h +++ b/shared/sentry/src/external/crashpad/util/file/file_io.h @@ -461,7 +461,7 @@ FileHandle LoggingOpenFileForReadAndWrite(const base::FilePath& path, // Fuchsia does not currently support any sort of file locking. See // https://crashpad.chromium.org/bug/196 and // https://crashpad.chromium.org/bug/217. -#if !BUILDFLAG(IS_FUCHSIA) +#if CRASHPAD_FLOCK_ALWAYS_SUPPORTED //! \brief Locks the given \a file using `flock()` on POSIX or `LockFileEx()` on //! Windows. @@ -500,7 +500,7 @@ FileLockingResult LoggingLockFile(FileHandle file, //! \return `true` on success, or `false` and a message will be logged. bool LoggingUnlockFile(FileHandle file); -#endif // !BUILDFLAG(IS_FUCHSIA) +#endif // CRASHPAD_FLOCK_ALWAYS_SUPPORTED //! \brief Wraps `lseek()` or `SetFilePointerEx()`. Logs an error if the //! operation fails. diff --git a/shared/sentry/external/crashpad/util/file/file_io_posix.cc b/shared/sentry/src/external/crashpad/util/file/file_io_posix.cc similarity index 98% rename from shared/sentry/external/crashpad/util/file/file_io_posix.cc rename to shared/sentry/src/external/crashpad/util/file/file_io_posix.cc index e53645e25..6d02462bd 100644 --- a/shared/sentry/external/crashpad/util/file/file_io_posix.cc +++ b/shared/sentry/src/external/crashpad/util/file/file_io_posix.cc @@ -24,6 +24,7 @@ #include #include +#include "base/check_op.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/notreached.h" @@ -208,7 +209,7 @@ FileHandle LoggingOpenFileForReadAndWrite(const base::FilePath& path, return fd; } -#if !BUILDFLAG(IS_FUCHSIA) +#if CRASHPAD_FLOCK_ALWAYS_SUPPORTED FileLockingResult LoggingLockFile(FileHandle file, FileLocking locking, @@ -234,7 +235,7 @@ bool LoggingUnlockFile(FileHandle file) { return rv == 0; } -#endif // !BUILDFLAG(IS_FUCHSIA) +#endif // CRASHPAD_FLOCK_ALWAYS_SUPPORTED FileOffset LoggingSeekFile(FileHandle file, FileOffset offset, int whence) { off_t rv = lseek(file, offset, whence); diff --git a/shared/sentry/external/crashpad/util/file/file_io_test.cc b/shared/sentry/src/external/crashpad/util/file/file_io_test.cc similarity index 99% rename from shared/sentry/external/crashpad/util/file/file_io_test.cc rename to shared/sentry/src/external/crashpad/util/file/file_io_test.cc index eda916e4c..253f6a03a 100644 --- a/shared/sentry/external/crashpad/util/file/file_io_test.cc +++ b/shared/sentry/src/external/crashpad/util/file/file_io_test.cc @@ -546,7 +546,9 @@ TEST(FileIO, FileShareMode_Write_Write) { // Fuchsia does not currently support any sort of file locking. See // https://crashpad.chromium.org/bug/196 and // https://crashpad.chromium.org/bug/217. -#if !BUILDFLAG(IS_FUCHSIA) +// Android can conditionally not support file locking depending on what type of +// filesystem is being used to store settings.dat. +#if CRASHPAD_FLOCK_ALWAYS_SUPPORTED TEST(FileIO, MultipleSharedLocks) { ScopedTempDir temp_dir; @@ -721,7 +723,7 @@ TEST(FileIO, ExclusiveVsExclusivesNonBlocking) { EXPECT_TRUE(LoggingUnlockFile(handle2.get())); } -#endif // !BUILDFLAG(IS_FUCHSIA) +#endif // CRASHPAD_FLOCK_ALWAYS_SUPPORTED TEST(FileIO, FileSizeByHandle) { EXPECT_EQ(LoggingFileSizeByHandle(kInvalidFileHandle), -1); diff --git a/shared/sentry/external/crashpad/util/file/file_io_win.cc b/shared/sentry/src/external/crashpad/util/file/file_io_win.cc similarity index 99% rename from shared/sentry/external/crashpad/util/file/file_io_win.cc rename to shared/sentry/src/external/crashpad/util/file/file_io_win.cc index 595e35794..cb9ea1474 100644 --- a/shared/sentry/external/crashpad/util/file/file_io_win.cc +++ b/shared/sentry/src/external/crashpad/util/file/file_io_win.cc @@ -17,6 +17,7 @@ #include #include +#include "base/check_op.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/notreached.h" diff --git a/shared/sentry/external/crashpad/util/file/file_reader.cc b/shared/sentry/src/external/crashpad/util/file/file_reader.cc similarity index 99% rename from shared/sentry/external/crashpad/util/file/file_reader.cc rename to shared/sentry/src/external/crashpad/util/file/file_reader.cc index b4e895634..f8fcf818f 100644 --- a/shared/sentry/external/crashpad/util/file/file_reader.cc +++ b/shared/sentry/src/external/crashpad/util/file/file_reader.cc @@ -14,6 +14,7 @@ #include "util/file/file_reader.h" +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "build/build_config.h" diff --git a/shared/sentry/external/crashpad/util/file/file_reader.h b/shared/sentry/src/external/crashpad/util/file/file_reader.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_reader.h rename to shared/sentry/src/external/crashpad/util/file/file_reader.h diff --git a/shared/sentry/external/crashpad/util/file/file_reader_test.cc b/shared/sentry/src/external/crashpad/util/file/file_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_reader_test.cc rename to shared/sentry/src/external/crashpad/util/file/file_reader_test.cc diff --git a/shared/sentry/external/crashpad/util/file/file_seeker.cc b/shared/sentry/src/external/crashpad/util/file/file_seeker.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_seeker.cc rename to shared/sentry/src/external/crashpad/util/file/file_seeker.cc diff --git a/shared/sentry/external/crashpad/util/file/file_seeker.h b/shared/sentry/src/external/crashpad/util/file/file_seeker.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_seeker.h rename to shared/sentry/src/external/crashpad/util/file/file_seeker.h diff --git a/shared/sentry/external/crashpad/util/file/file_writer.cc b/shared/sentry/src/external/crashpad/util/file/file_writer.cc similarity index 99% rename from shared/sentry/external/crashpad/util/file/file_writer.cc rename to shared/sentry/src/external/crashpad/util/file/file_writer.cc index 74c55d64c..a5bfa0811 100644 --- a/shared/sentry/external/crashpad/util/file/file_writer.cc +++ b/shared/sentry/src/external/crashpad/util/file/file_writer.cc @@ -20,6 +20,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "build/build_config.h" diff --git a/shared/sentry/external/crashpad/util/file/file_writer.h b/shared/sentry/src/external/crashpad/util/file/file_writer.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/file_writer.h rename to shared/sentry/src/external/crashpad/util/file/file_writer.h diff --git a/shared/sentry/external/crashpad/util/file/filesystem.h b/shared/sentry/src/external/crashpad/util/file/filesystem.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/filesystem.h rename to shared/sentry/src/external/crashpad/util/file/filesystem.h diff --git a/shared/sentry/external/crashpad/util/file/filesystem_posix.cc b/shared/sentry/src/external/crashpad/util/file/filesystem_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/filesystem_posix.cc rename to shared/sentry/src/external/crashpad/util/file/filesystem_posix.cc diff --git a/shared/sentry/external/crashpad/util/file/filesystem_test.cc b/shared/sentry/src/external/crashpad/util/file/filesystem_test.cc similarity index 97% rename from shared/sentry/external/crashpad/util/file/filesystem_test.cc rename to shared/sentry/src/external/crashpad/util/file/filesystem_test.cc index eb492cdfc..bff3e3235 100644 --- a/shared/sentry/external/crashpad/util/file/filesystem_test.cc +++ b/shared/sentry/src/external/crashpad/util/file/filesystem_test.cc @@ -487,6 +487,10 @@ TEST(Filesystem, GetFileSize) { EXPECT_EQ(filesize, sizeof(kTestFileContent)); #if !BUILDFLAG(IS_FUCHSIA) + if (!CanCreateSymbolicLinks()) { + GTEST_SKIP(); + } + // Create a link to a file. base::FilePath link(temp_dir.path().Append(FILE_PATH_LITERAL("link"))); ASSERT_TRUE(CreateSymbolicLink(filepath, link)); @@ -517,13 +521,15 @@ TEST(Filesystem, GetDirectorySize) { writer2.Close(); #if !BUILDFLAG(IS_FUCHSIA) - // Create a link to a file. - base::FilePath link(dir.Append(FILE_PATH_LITERAL("link"))); - ASSERT_TRUE(CreateSymbolicLink(filepath2, link)); - - // Create a link to a dir. - base::FilePath linkdir(temp_dir.path().Append(FILE_PATH_LITERAL("link"))); - ASSERT_TRUE(CreateSymbolicLink(dir, linkdir)); + if (CanCreateSymbolicLinks()) { + // Create a link to a file. + base::FilePath link(dir.Append(FILE_PATH_LITERAL("link"))); + ASSERT_TRUE(CreateSymbolicLink(filepath2, link)); + + // Create a link to a dir. + base::FilePath linkdir(temp_dir.path().Append(FILE_PATH_LITERAL("link"))); + ASSERT_TRUE(CreateSymbolicLink(dir, linkdir)); + } #endif // !BUILDFLAG(IS_FUCHSIA) uint64_t filesize = GetDirectorySize(temp_dir.path()); diff --git a/shared/sentry/external/crashpad/util/file/filesystem_win.cc b/shared/sentry/src/external/crashpad/util/file/filesystem_win.cc similarity index 84% rename from shared/sentry/external/crashpad/util/file/filesystem_win.cc rename to shared/sentry/src/external/crashpad/util/file/filesystem_win.cc index 510d8e447..b6454b3ab 100644 --- a/shared/sentry/external/crashpad/util/file/filesystem_win.cc +++ b/shared/sentry/src/external/crashpad/util/file/filesystem_win.cc @@ -18,7 +18,6 @@ #include #include "base/logging.h" -#include "base/strings/utf_string_conversions.h" #include "util/file/directory_reader.h" #include "util/misc/time.h" @@ -35,7 +34,7 @@ bool IsSymbolicLink(const base::FilePath& path) { nullptr, 0)); if (!handle.is_valid()) { - PLOG(ERROR) << "FindFirstFileEx " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "FindFirstFileEx " << path; return false; } @@ -45,7 +44,7 @@ bool IsSymbolicLink(const base::FilePath& path) { bool LoggingRemoveDirectoryImpl(const base::FilePath& path) { if (!RemoveDirectory(path.value().c_str())) { - PLOG(ERROR) << "RemoveDirectory " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "RemoveDirectory " << path; return false; } return true; @@ -69,13 +68,13 @@ bool FileModificationTime(const base::FilePath& path, timespec* mtime) { flags, nullptr)); if (!handle.is_valid()) { - PLOG(ERROR) << "CreateFile " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "CreateFile " << path; return false; } FILETIME file_mtime; if (!GetFileTime(handle.get(), nullptr, nullptr, &file_mtime)) { - PLOG(ERROR) << "GetFileTime " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "GetFileTime " << path; return false; } *mtime = FiletimeToTimespecEpoch(file_mtime); @@ -90,12 +89,12 @@ bool LoggingCreateDirectory(const base::FilePath& path, } if (may_reuse && GetLastError() == ERROR_ALREADY_EXISTS) { if (!IsDirectory(path, true)) { - LOG(ERROR) << base::WideToUTF8(path.value()) << " not a directory"; + LOG(ERROR) << path << " not a directory"; return false; } return true; } - PLOG(ERROR) << "CreateDirectory " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "CreateDirectory " << path; return false; } @@ -104,8 +103,7 @@ bool MoveFileOrDirectory(const base::FilePath& source, if (!MoveFileEx(source.value().c_str(), dest.value().c_str(), IsDirectory(source, false) ? 0 : MOVEFILE_REPLACE_EXISTING)) { - PLOG(ERROR) << "MoveFileEx" << base::WideToUTF8(source.value()) << ", " - << base::WideToUTF8(dest.value()); + PLOG(ERROR) << "MoveFileEx" << source << ", " << dest; return false; } return true; @@ -114,7 +112,7 @@ bool MoveFileOrDirectory(const base::FilePath& source, bool IsRegularFile(const base::FilePath& path) { DWORD fileattr = GetFileAttributes(path.value().c_str()); if (fileattr == INVALID_FILE_ATTRIBUTES) { - PLOG(ERROR) << "GetFileAttributes " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "GetFileAttributes " << path; return false; } if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0 || @@ -127,7 +125,7 @@ bool IsRegularFile(const base::FilePath& path) { bool IsDirectory(const base::FilePath& path, bool allow_symlinks) { DWORD fileattr = GetFileAttributes(path.value().c_str()); if (fileattr == INVALID_FILE_ATTRIBUTES) { - PLOG(ERROR) << "GetFileAttributes " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "GetFileAttributes " << path; return false; } if (!allow_symlinks && (fileattr & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { @@ -146,7 +144,7 @@ bool LoggingRemoveFile(const base::FilePath& path) { } if (!DeleteFile(path.value().c_str())) { - PLOG(ERROR) << "DeleteFile " << base::WideToUTF8(path.value()); + PLOG(ERROR) << "DeleteFile " << path; return false; } return true; @@ -154,7 +152,7 @@ bool LoggingRemoveFile(const base::FilePath& path) { bool LoggingRemoveDirectory(const base::FilePath& path) { if (IsSymbolicLink(path)) { - LOG(ERROR) << "Not a directory " << base::WideToUTF8(path.value()); + LOG(ERROR) << "Not a directory " << path; return false; } return LoggingRemoveDirectoryImpl(path); @@ -169,7 +167,7 @@ uint64_t GetFileSize(const base::FilePath& filepath) { if (ret_value == 0) { return statbuf.st_size; } - PLOG(ERROR) << "stat " << filepath.value().c_str(); + PLOG(ERROR) << "stat " << filepath; return 0; } diff --git a/shared/sentry/external/crashpad/util/file/output_stream_file_writer.cc b/shared/sentry/src/external/crashpad/util/file/output_stream_file_writer.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/output_stream_file_writer.cc rename to shared/sentry/src/external/crashpad/util/file/output_stream_file_writer.cc diff --git a/shared/sentry/external/crashpad/util/file/output_stream_file_writer.h b/shared/sentry/src/external/crashpad/util/file/output_stream_file_writer.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/output_stream_file_writer.h rename to shared/sentry/src/external/crashpad/util/file/output_stream_file_writer.h diff --git a/shared/sentry/external/crashpad/util/file/scoped_remove_file.cc b/shared/sentry/src/external/crashpad/util/file/scoped_remove_file.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/scoped_remove_file.cc rename to shared/sentry/src/external/crashpad/util/file/scoped_remove_file.cc diff --git a/shared/sentry/external/crashpad/util/file/scoped_remove_file.h b/shared/sentry/src/external/crashpad/util/file/scoped_remove_file.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/scoped_remove_file.h rename to shared/sentry/src/external/crashpad/util/file/scoped_remove_file.h diff --git a/shared/sentry/external/crashpad/util/file/string_file.cc b/shared/sentry/src/external/crashpad/util/file/string_file.cc similarity index 99% rename from shared/sentry/external/crashpad/util/file/string_file.cc rename to shared/sentry/src/external/crashpad/util/file/string_file.cc index 93a4f3209..959d04740 100644 --- a/shared/sentry/external/crashpad/util/file/string_file.cc +++ b/shared/sentry/src/external/crashpad/util/file/string_file.cc @@ -19,6 +19,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_math.h" #include "util/misc/implicit_cast.h" diff --git a/shared/sentry/external/crashpad/util/file/string_file.h b/shared/sentry/src/external/crashpad/util/file/string_file.h similarity index 100% rename from shared/sentry/external/crashpad/util/file/string_file.h rename to shared/sentry/src/external/crashpad/util/file/string_file.h diff --git a/shared/sentry/external/crashpad/util/file/string_file_test.cc b/shared/sentry/src/external/crashpad/util/file/string_file_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/file/string_file_test.cc rename to shared/sentry/src/external/crashpad/util/file/string_file_test.cc diff --git a/shared/sentry/external/crashpad/util/fuchsia/koid_utilities.cc b/shared/sentry/src/external/crashpad/util/fuchsia/koid_utilities.cc similarity index 100% rename from shared/sentry/external/crashpad/util/fuchsia/koid_utilities.cc rename to shared/sentry/src/external/crashpad/util/fuchsia/koid_utilities.cc diff --git a/shared/sentry/external/crashpad/util/fuchsia/koid_utilities.h b/shared/sentry/src/external/crashpad/util/fuchsia/koid_utilities.h similarity index 100% rename from shared/sentry/external/crashpad/util/fuchsia/koid_utilities.h rename to shared/sentry/src/external/crashpad/util/fuchsia/koid_utilities.h diff --git a/shared/sentry/external/crashpad/util/fuchsia/scoped_task_suspend.cc b/shared/sentry/src/external/crashpad/util/fuchsia/scoped_task_suspend.cc similarity index 98% rename from shared/sentry/external/crashpad/util/fuchsia/scoped_task_suspend.cc rename to shared/sentry/src/external/crashpad/util/fuchsia/scoped_task_suspend.cc index 0dd542518..ef057ae3c 100644 --- a/shared/sentry/external/crashpad/util/fuchsia/scoped_task_suspend.cc +++ b/shared/sentry/src/external/crashpad/util/fuchsia/scoped_task_suspend.cc @@ -21,6 +21,7 @@ #include +#include "base/check_op.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/logging.h" #include "util/fuchsia/koid_utilities.h" diff --git a/shared/sentry/external/crashpad/util/fuchsia/scoped_task_suspend.h b/shared/sentry/src/external/crashpad/util/fuchsia/scoped_task_suspend.h similarity index 100% rename from shared/sentry/external/crashpad/util/fuchsia/scoped_task_suspend.h rename to shared/sentry/src/external/crashpad/util/fuchsia/scoped_task_suspend.h diff --git a/shared/sentry/external/crashpad/util/fuchsia/traits.h b/shared/sentry/src/external/crashpad/util/fuchsia/traits.h similarity index 100% rename from shared/sentry/external/crashpad/util/fuchsia/traits.h rename to shared/sentry/src/external/crashpad/util/fuchsia/traits.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_data.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_data.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_data.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_data.cc diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_data.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_data.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_data.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_data.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_format.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_format.h similarity index 99% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_format.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_format.h index f8b7bdf76..9fe7ccf9a 100644 --- a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_format.h +++ b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_format.h @@ -85,6 +85,7 @@ namespace internal { TD(kFree, 5017) \ TD(kInactive, 5018) \ TD(kWired, 5019) \ + TD(kAddressMask, 5020) \ TD(kThreads, 6000) \ TD(kDebugState, 6001) \ TD(kFloatState, 6002) \ @@ -103,7 +104,6 @@ namespace internal { TD(kMaxValue, 65535) \ // clang-format on - //! \brief They key for items in the intermediate dump file. //! //! These values are persisted to the intermediate crash dump file. Entries diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_interface.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_interface.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_interface.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_interface.cc diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_interface.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_interface.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_interface.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_interface.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_list.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_list.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_list.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_list.cc diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_list.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_list.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_list.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_list.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_map.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_map.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_map.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_map.cc diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_map.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_map.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_map.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_map.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_object.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_object.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_object.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_object.cc diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_object.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_object.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_object.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_object.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_reader.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_reader.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_reader.cc diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_reader.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_reader.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_reader.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_reader.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_reader_test.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_reader_test.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_reader_test.cc diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer.cc similarity index 98% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer.cc index bccd1539c..67d804b30 100644 --- a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer.cc +++ b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer.cc @@ -23,6 +23,7 @@ #include #include "base/check.h" +#include "base/check_op.h" #include "base/posix/eintr_wrapper.h" #include "build/build_config.h" #include "util/ios/raw_logging.h" @@ -83,12 +84,10 @@ bool IOSIntermediateDumpWriter::Close() { if (fd_ < 0) { return true; } - if (!FlushWriteBuffer()) { - return false; - } - int fd = fd_; + const bool flushed = FlushWriteBuffer(); + const bool closed = RawLoggingCloseFile(fd_); fd_ = -1; - return RawLoggingCloseFile(fd); + return flushed && closed; } bool IOSIntermediateDumpWriter::AddPropertyCString(IntermediateDumpKey key, diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer.h b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer.h rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer.h diff --git a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer_test.cc b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer_test.cc similarity index 97% rename from shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer_test.cc rename to shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer_test.cc index d1eb583e5..2bf2b780e 100644 --- a/shared/sentry/external/crashpad/util/ios/ios_intermediate_dump_writer_test.cc +++ b/shared/sentry/src/external/crashpad/util/ios/ios_intermediate_dump_writer_test.cc @@ -17,8 +17,8 @@ #include #include +#include "base/apple/scoped_mach_vm.h" #include "base/files/scoped_file.h" -#include "base/mac/scoped_mach_vm.h" #include "base/posix/eintr_wrapper.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -141,8 +141,8 @@ TEST_F(IOSIntermediateDumpWriterTest, MissingPropertyString) { region_size, VM_FLAGS_ANYWHERE), 0); - base::mac::ScopedMachVM vm_owner(reinterpret_cast(region), - region_size); + base::apple::ScopedMachVM vm_owner(reinterpret_cast(region), + region_size); // Fill first page with 'A' and second with 'B'. memset(region, 'A', page_size); diff --git a/shared/sentry/external/crashpad/util/ios/ios_system_data_collector.h b/shared/sentry/src/external/crashpad/util/ios/ios_system_data_collector.h similarity index 97% rename from shared/sentry/external/crashpad/util/ios/ios_system_data_collector.h rename to shared/sentry/src/external/crashpad/util/ios/ios_system_data_collector.h index 4c252f2d1..2dfc373a1 100644 --- a/shared/sentry/external/crashpad/util/ios/ios_system_data_collector.h +++ b/shared/sentry/src/external/crashpad/util/ios/ios_system_data_collector.h @@ -43,6 +43,7 @@ class IOSSystemDataCollector { const std::string& StandardName() const { return standard_name_; } const std::string& DaylightName() const { return daylight_name_; } bool IsApplicationActive() const { return active_; } + uint64_t AddressMask() const { return address_mask_; } // Currently unused by minidump. int Orientation() const { return orientation_; } @@ -80,6 +81,7 @@ class IOSSystemDataCollector { std::string standard_name_; std::string daylight_name_; ActiveApplicationCallback active_application_callback_; + uint64_t address_mask_; }; } // namespace internal diff --git a/shared/sentry/external/crashpad/util/ios/ios_system_data_collector.mm b/shared/sentry/src/external/crashpad/util/ios/ios_system_data_collector.mm similarity index 95% rename from shared/sentry/external/crashpad/util/ios/ios_system_data_collector.mm rename to shared/sentry/src/external/crashpad/util/ios/ios_system_data_collector.mm index 747100288..28ede1824 100644 --- a/shared/sentry/external/crashpad/util/ios/ios_system_data_collector.mm +++ b/shared/sentry/src/external/crashpad/util/ios/ios_system_data_collector.mm @@ -21,7 +21,7 @@ #include #import -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" #include "base/numerics/safe_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" @@ -102,6 +102,16 @@ void AddObserver(CFStringRef notification_name, T* observer) { #if defined(ARCH_CPU_X86_64) cpu_vendor_ = ReadStringSysctlByName("machdep.cpu.vendor"); #endif + uint32_t addressable_bits = 0; + size_t len = sizeof(uint32_t); + // `machdep.virtual_address_size` is the number of addressable bits in + // userspace virtual addresses + if (sysctlbyname( + "machdep.virtual_address_size", &addressable_bits, &len, NULL, 0) != + 0) { + addressable_bits = 0; + } + address_mask_ = ~((1UL << addressable_bits) - 1); #if TARGET_OS_SIMULATOR // TODO(justincohen): Consider adding board and model information to diff --git a/shared/sentry/external/crashpad/util/ios/raw_logging.cc b/shared/sentry/src/external/crashpad/util/ios/raw_logging.cc similarity index 100% rename from shared/sentry/external/crashpad/util/ios/raw_logging.cc rename to shared/sentry/src/external/crashpad/util/ios/raw_logging.cc diff --git a/shared/sentry/external/crashpad/util/ios/raw_logging.h b/shared/sentry/src/external/crashpad/util/ios/raw_logging.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/raw_logging.h rename to shared/sentry/src/external/crashpad/util/ios/raw_logging.h diff --git a/shared/sentry/external/crashpad/util/ios/scoped_background_task.h b/shared/sentry/src/external/crashpad/util/ios/scoped_background_task.h similarity index 100% rename from shared/sentry/external/crashpad/util/ios/scoped_background_task.h rename to shared/sentry/src/external/crashpad/util/ios/scoped_background_task.h diff --git a/shared/sentry/external/crashpad/util/ios/scoped_background_task.mm b/shared/sentry/src/external/crashpad/util/ios/scoped_background_task.mm similarity index 95% rename from shared/sentry/external/crashpad/util/ios/scoped_background_task.mm rename to shared/sentry/src/external/crashpad/util/ios/scoped_background_task.mm index b4900963e..2af7bb8e5 100644 --- a/shared/sentry/external/crashpad/util/ios/scoped_background_task.mm +++ b/shared/sentry/src/external/crashpad/util/ios/scoped_background_task.mm @@ -16,10 +16,6 @@ #import -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace crashpad { namespace internal { diff --git a/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.cc b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.cc new file mode 100644 index 000000000..e52b8778a --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.cc @@ -0,0 +1,86 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/ios/scoped_vm_map.h" + +#include "util/ios/raw_logging.h" + +namespace crashpad { +namespace internal { + +ScopedVMMapInternal::ScopedVMMapInternal() + : data_(0), + region_start_(0), + region_size_(0), + cur_protection_(VM_PROT_NONE) {} + +ScopedVMMapInternal::~ScopedVMMapInternal() { + Reset(); +} + +bool ScopedVMMapInternal::Map(const void* data, const size_t data_length) { + Reset(); + + vm_address_t data_address = reinterpret_cast(data); + vm_address_t page_region_address = trunc_page(data_address); + region_size_ = round_page(data_address - page_region_address + data_length); + if (region_size_ < data_length) { + CRASHPAD_RAW_LOG("ScopedVMMap data_length overflow"); + return false; + } + + // Since region_start_ is 0, vm_remap() will choose an address to which the + // memory will be mapped and store the mapped address in region_start_ on + // success. + vm_prot_t max_protection; + kern_return_t kr = vm_remap(mach_task_self(), + ®ion_start_, + region_size_, + 0, + TRUE, + mach_task_self(), + page_region_address, + FALSE, + &cur_protection_, + &max_protection, + VM_INHERIT_DEFAULT); + if (kr != KERN_SUCCESS) { + // It's expected that this will sometimes fail. Don't log here. + return false; + } + + data_ = region_start_ + (data_address - page_region_address); + return true; +} + +void ScopedVMMapInternal::Reset() { + if (!region_start_) { + return; + } + + kern_return_t kr = + vm_deallocate(mach_task_self(), region_start_, region_size_); + + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "vm_deallocate"); + } + + data_ = 0; + region_start_ = 0; + region_size_ = 0; + cur_protection_ = VM_PROT_NONE; +} + +} // namespace internal +} // namespace crashpad diff --git a/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.h b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.h new file mode 100644 index 000000000..d918d2e91 --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map.h @@ -0,0 +1,125 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_IOS_SCOPED_VM_MAP_H_ +#define CRASHPAD_UTIL_IOS_SCOPED_VM_MAP_H_ + +#include + +namespace crashpad { +namespace internal { + +//! \brief Non-templated internal class to be used by ScopedVMMap. +//! +//! Note: RUNS-DURING-CRASH. +class ScopedVMMapInternal { + public: + ScopedVMMapInternal(); + + ScopedVMMapInternal(const ScopedVMMapInternal&) = delete; + ScopedVMMapInternal& operator=(const ScopedVMMapInternal&) = delete; + + ~ScopedVMMapInternal(); + + //! \brief Releases any previously mapped data and vm_remaps \a data. Logs an + //! error on failure. + //! + //! \param[in] data Memory to be mapped by vm_remap. + //! \param[in] data_length Length of \a data. + //! + //! \return `true` if all the data was mapped. Logs an error and returns false + //! on failure. + bool Map(const void* data, size_t data_length); + + //! \brief Returns the current protection for the memory in the region. + vm_prot_t CurrentProtection() const { return cur_protection_; } + + vm_address_t data() const { return data_; } + + private: + //! \brief Deallocates any resources allocated by this object and resets it + //! to its original state. + void Reset(); + + // The address within region_start_ at which the mapped data is available. + vm_address_t data_; + + // The region returned by vm_remap(). + vm_address_t region_start_; + + // The size of the region returned by vm_remap(). + vm_size_t region_size_; + + // The current protection for the memory region. + vm_prot_t cur_protection_; +}; + +//! \brief A scoped wrapper for calls to `vm_remap` and `vm_deallocate`. Allows +//! in-process handler to safely read and write memory (modulo its +//! protection level) for the intermediate dump. +//! +//! Note: RUNS-DURING-CRASH. +template +class ScopedVMMap { + public: + ScopedVMMap() : internal_() {} + + ScopedVMMap(const ScopedVMMap&) = delete; + ScopedVMMap& operator=(const ScopedVMMap&) = delete; + + ~ScopedVMMap() {} + + //! \brief Releases any previously mapped data and vm_remaps data. + //! + //! \param[in] data Memory to be mapped by vm_remap. + //! \param[in] count Length of \a data. + //! + //! \return `true` if all \a data was mapped. Returns false on failure. + bool Map(const void* data, size_t count = 1) { + size_t data_length = count * sizeof(T); + return internal_.Map(data, data_length); + } + + //! \brief Releases any previously mapped data and vm_remaps address. + //! + //! Before reading or writing the memory, check `CurrentProtection()` to + //! ensure the data is readable or writable. + //! + //! \param[in] address Address of memory to be mapped by vm_remap. + //! \param[in] count Length of \a data. + //! + //! \return `true` if all of \a address was mapped. Returns false on failure. + bool Map(vm_address_t address, size_t count = 1) { + return Map(reinterpret_cast(address), count); + } + + //! \brief Returns the pointer to memory safe to read and write (respecting + //! the CurrentProtection() level) during the in-process crash handler. + T* operator->() const { return get(); } + + //! \brief Returns the pointer to memory safe to read and write (respecting + //! the CurrentProtection() level) during the in-process crash handler. + T* get() const { return reinterpret_cast(internal_.data()); } + + //! \brief Returns the current protection level of the mapped memory. + vm_prot_t CurrentProtection() const { return internal_.CurrentProtection(); } + + private: + ScopedVMMapInternal internal_; +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_SCOPED_VM_MAP_H_ diff --git a/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map_test.cc b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map_test.cc new file mode 100644 index 000000000..6a6b3ebc9 --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_map_test.cc @@ -0,0 +1,94 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/ios/scoped_vm_map.h" + +#include + +#include "base/apple/scoped_mach_vm.h" +#include "gtest/gtest.h" +#include "test/mac/mach_errors.h" + +namespace crashpad { +namespace test { +namespace { + +TEST(ScopedVMMapTest, BasicFunctionality) { + // bad data or count. + internal::ScopedVMMap vmmap_bad; + EXPECT_FALSE(vmmap_bad.Map(nullptr, 100)); + EXPECT_FALSE(vmmap_bad.Map(reinterpret_cast(0x1000), 100)); + vm_address_t invalid_address = 1; + EXPECT_FALSE(vmmap_bad.Map(&invalid_address, 1000000000)); + EXPECT_FALSE(vmmap_bad.Map(&invalid_address, -1)); + + vm_address_t valid_address = reinterpret_cast(this); + EXPECT_FALSE(vmmap_bad.Map(&valid_address, 1000000000)); + EXPECT_FALSE(vmmap_bad.Map(&valid_address, -1)); + + // array + static constexpr char map_me[] = "map me"; + internal::ScopedVMMap vmmap_string; + ASSERT_TRUE(vmmap_string.Map(map_me, strlen(map_me))); + EXPECT_STREQ(vmmap_string.get(), map_me); + EXPECT_TRUE(vmmap_string.CurrentProtection() & VM_PROT_READ); + + // struct + timeval time_of_day; + EXPECT_TRUE(gettimeofday(&time_of_day, nullptr) == 0); + internal::ScopedVMMap vmmap_time; + ASSERT_TRUE(vmmap_time.Map(&time_of_day)); + constexpr vm_prot_t kReadWrite = VM_PROT_READ | VM_PROT_WRITE; + EXPECT_EQ(vmmap_time.CurrentProtection() & kReadWrite, kReadWrite); + EXPECT_EQ(vmmap_time->tv_sec, time_of_day.tv_sec); + EXPECT_EQ(vmmap_time->tv_usec, time_of_day.tv_usec); + + // reset. + timeval time_of_day2; + EXPECT_TRUE(gettimeofday(&time_of_day2, nullptr) == 0); + ASSERT_TRUE(vmmap_time.Map(&time_of_day2)); + EXPECT_EQ(vmmap_time.CurrentProtection() & kReadWrite, kReadWrite); + EXPECT_EQ(vmmap_time->tv_sec, time_of_day2.tv_sec); + EXPECT_EQ(vmmap_time->tv_usec, time_of_day2.tv_usec); +} + +TEST(ScopedVMMapTest, MissingMiddleVM) { + char* region; + vm_size_t page_size = getpagesize(); + vm_size_t region_size = page_size * 3; + kern_return_t kr = vm_allocate(mach_task_self(), + reinterpret_cast(®ion), + region_size, + VM_FLAGS_ANYWHERE); + ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate"); + + base::apple::ScopedMachVM vm_owner(reinterpret_cast(region), + region_size); + + internal::ScopedVMMap vmmap_missing_middle; + ASSERT_TRUE(vmmap_missing_middle.Map(region, region_size)); + + // Dealloc middle page. + kr = vm_deallocate(mach_task_self(), + reinterpret_cast(region + page_size), + page_size); + ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_deallocate"); + + EXPECT_FALSE(vmmap_missing_middle.Map(region, region_size)); + ASSERT_TRUE(vmmap_missing_middle.Map(region, page_size)); +} + +} // namespace +} // namespace test +} // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/ios/scoped_vm_read.cc b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_read.cc similarity index 69% rename from shared/sentry/external/crashpad/util/ios/scoped_vm_read.cc rename to shared/sentry/src/external/crashpad/util/ios/scoped_vm_read.cc index 73585fd53..ba3b69401 100644 --- a/shared/sentry/external/crashpad/util/ios/scoped_vm_read.cc +++ b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_read.cc @@ -20,25 +20,15 @@ namespace crashpad { namespace internal { ScopedVMReadInternal::ScopedVMReadInternal() - : data_(0), vm_read_data_(0), vm_read_data_count_(0) {} + : data_(0), region_start_(0), region_size_(0) {} ScopedVMReadInternal::~ScopedVMReadInternal() { - if (data_) { - kern_return_t kr = - vm_deallocate(mach_task_self(), vm_read_data_, vm_read_data_count_); - if (kr != KERN_SUCCESS) - CRASHPAD_RAW_LOG_ERROR(kr, "vm_deallocate"); - } + Reset(); } bool ScopedVMReadInternal::Read(const void* data, const size_t data_length) { - if (data_) { - kern_return_t kr = - vm_deallocate(mach_task_self(), vm_read_data_, vm_read_data_count_); - if (kr != KERN_SUCCESS) - CRASHPAD_RAW_LOG_ERROR(kr, "vm_deallocate"); - data_ = 0; - } + Reset(); + vm_address_t data_address = reinterpret_cast(data); vm_address_t page_region_address = trunc_page(data_address); vm_size_t page_region_size = @@ -50,16 +40,30 @@ bool ScopedVMReadInternal::Read(const void* data, const size_t data_length) { kern_return_t kr = vm_read(mach_task_self(), page_region_address, page_region_size, - &vm_read_data_, - &vm_read_data_count_); + ®ion_start_, + ®ion_size_); - if (kr == KERN_SUCCESS) { - data_ = vm_read_data_ + (data_address - page_region_address); - return true; - } else { + if (kr != KERN_SUCCESS) { // It's expected that this will sometimes fail. Don't log here. return false; } + + data_ = region_start_ + (data_address - page_region_address); + return true; +} + +void ScopedVMReadInternal::Reset() { + if (!region_start_) { + return; + } + kern_return_t kr = + vm_deallocate(mach_task_self(), region_start_, region_size_); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "vm_deallocate"); + } + region_start_ = 0; + region_size_ = 0; + data_ = 0; } } // namespace internal diff --git a/shared/sentry/external/crashpad/util/ios/scoped_vm_read.h b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_read.h similarity index 89% rename from shared/sentry/external/crashpad/util/ios/scoped_vm_read.h rename to shared/sentry/src/external/crashpad/util/ios/scoped_vm_read.h index ef6316f0d..0c956a2ff 100644 --- a/shared/sentry/external/crashpad/util/ios/scoped_vm_read.h +++ b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_read.h @@ -46,14 +46,18 @@ class ScopedVMReadInternal { vm_address_t data() const { return data_; } private: - // The address of the requested data. + //! \brief Deallocates any resources allocated by this object and resets it + //! to its original state. + void Reset(); + + // The address within region_start_ at which the the data is available. vm_address_t data_; - // The rounded down page boundary of the requested data. - vm_address_t vm_read_data_; + // The region returned by vm_read(). + vm_address_t region_start_; - // The size of the pages that were actually read. - mach_msg_type_number_t vm_read_data_count_; + // The size of the region returned by vm_read(). + mach_msg_type_number_t region_size_; }; //! \brief A scoped wrapper for calls to `vm_read` and `vm_deallocate`. Allows diff --git a/shared/sentry/external/crashpad/util/ios/scoped_vm_read_test.cc b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_read_test.cc similarity index 54% rename from shared/sentry/external/crashpad/util/ios/scoped_vm_read_test.cc rename to shared/sentry/src/external/crashpad/util/ios/scoped_vm_read_test.cc index 135443b86..29e5c232e 100644 --- a/shared/sentry/external/crashpad/util/ios/scoped_vm_read_test.cc +++ b/shared/sentry/src/external/crashpad/util/ios/scoped_vm_read_test.cc @@ -16,8 +16,9 @@ #include -#include "base/mac/scoped_mach_vm.h" +#include "base/apple/scoped_mach_vm.h" #include "gtest/gtest.h" +#include "test/mac/mach_errors.h" namespace crashpad { namespace test { @@ -26,56 +27,60 @@ namespace { TEST(ScopedVMReadTest, BasicFunctionality) { // bad data or count. internal::ScopedVMRead vmread_bad; - ASSERT_FALSE(vmread_bad.Read(nullptr, 100)); - ASSERT_FALSE(vmread_bad.Read(reinterpret_cast(0x1000), 100)); - vm_address_t address = 1; - ASSERT_FALSE(vmread_bad.Read(&address, 1000000000)); - ASSERT_FALSE(vmread_bad.Read(&address, -1)); + EXPECT_FALSE(vmread_bad.Read(nullptr, 100)); + EXPECT_FALSE(vmread_bad.Read(reinterpret_cast(0x1000), 100)); + vm_address_t invalid_address = 1; + EXPECT_FALSE(vmread_bad.Read(&invalid_address, 1000000000)); + EXPECT_FALSE(vmread_bad.Read(&invalid_address, -1)); + vm_address_t valid_address = reinterpret_cast(this); + EXPECT_FALSE(vmread_bad.Read(&valid_address, 1000000000)); + EXPECT_FALSE(vmread_bad.Read(&valid_address, -1)); // array constexpr char read_me[] = "read me"; internal::ScopedVMRead vmread_string; ASSERT_TRUE(vmread_string.Read(read_me, strlen(read_me))); - EXPECT_STREQ(read_me, vmread_string.get()); + EXPECT_STREQ(vmread_string.get(), read_me); // struct timeval time_of_day; EXPECT_TRUE(gettimeofday(&time_of_day, nullptr) == 0); internal::ScopedVMRead vmread_time; ASSERT_TRUE(vmread_time.Read(&time_of_day)); - EXPECT_EQ(time_of_day.tv_sec, vmread_time->tv_sec); - EXPECT_EQ(time_of_day.tv_usec, vmread_time->tv_usec); + EXPECT_EQ(vmread_time->tv_sec, time_of_day.tv_sec); + EXPECT_EQ(vmread_time->tv_usec, time_of_day.tv_usec); // reset. timeval time_of_day2; EXPECT_TRUE(gettimeofday(&time_of_day2, nullptr) == 0); ASSERT_TRUE(vmread_time.Read(&time_of_day2)); - EXPECT_EQ(time_of_day2.tv_sec, vmread_time->tv_sec); - EXPECT_EQ(time_of_day2.tv_usec, vmread_time->tv_usec); + EXPECT_EQ(vmread_time->tv_sec, time_of_day2.tv_sec); + EXPECT_EQ(vmread_time->tv_usec, time_of_day2.tv_usec); } TEST(ScopedVMReadTest, MissingMiddleVM) { char* region; vm_size_t page_size = getpagesize(); vm_size_t region_size = page_size * 3; - ASSERT_EQ(vm_allocate(mach_task_self(), - reinterpret_cast(®ion), - region_size, - VM_FLAGS_ANYWHERE), - 0); - base::mac::ScopedMachVM vm_owner(reinterpret_cast(region), - region_size); + kern_return_t kr = vm_allocate(mach_task_self(), + reinterpret_cast(®ion), + region_size, + VM_FLAGS_ANYWHERE); + ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate"); + + base::apple::ScopedMachVM vm_owner(reinterpret_cast(region), + region_size); internal::ScopedVMRead vmread_missing_middle; ASSERT_TRUE(vmread_missing_middle.Read(region, region_size)); // Dealloc middle page. - ASSERT_EQ(vm_deallocate(mach_task_self(), - reinterpret_cast(region + page_size), - page_size), - 0); + kr = vm_deallocate(mach_task_self(), + reinterpret_cast(region + page_size), + page_size); + ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_deallocate"); - ASSERT_FALSE(vmread_missing_middle.Read(region, region_size)); + EXPECT_FALSE(vmread_missing_middle.Read(region, region_size)); ASSERT_TRUE(vmread_missing_middle.Read(region, page_size)); } diff --git a/shared/sentry/external/crashpad/util/linux/address_types.h b/shared/sentry/src/external/crashpad/util/linux/address_types.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/address_types.h rename to shared/sentry/src/external/crashpad/util/linux/address_types.h diff --git a/shared/sentry/external/crashpad/util/linux/auxiliary_vector.cc b/shared/sentry/src/external/crashpad/util/linux/auxiliary_vector.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/auxiliary_vector.cc rename to shared/sentry/src/external/crashpad/util/linux/auxiliary_vector.cc diff --git a/shared/sentry/external/crashpad/util/linux/auxiliary_vector.h b/shared/sentry/src/external/crashpad/util/linux/auxiliary_vector.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/auxiliary_vector.h rename to shared/sentry/src/external/crashpad/util/linux/auxiliary_vector.h diff --git a/shared/sentry/external/crashpad/util/linux/auxiliary_vector_test.cc b/shared/sentry/src/external/crashpad/util/linux/auxiliary_vector_test.cc similarity index 97% rename from shared/sentry/external/crashpad/util/linux/auxiliary_vector_test.cc rename to shared/sentry/src/external/crashpad/util/linux/auxiliary_vector_test.cc index 045549740..0c97781fa 100644 --- a/shared/sentry/external/crashpad/util/linux/auxiliary_vector_test.cc +++ b/shared/sentry/src/external/crashpad/util/linux/auxiliary_vector_test.cc @@ -96,10 +96,15 @@ void TestAgainstCloneOrSelf(pid_t pid) { ProcessMemoryLinux memory(&connection); +// AT_PLATFORM is null for RISC-V: +// https://elixir.bootlin.com/linux/v6.4-rc4/C/ident/ELF_PLATFORM +#if !defined(ARCH_CPU_RISCV64) LinuxVMAddress platform_addr; ASSERT_TRUE(aux.GetValue(AT_PLATFORM, &platform_addr)); std::string platform; ASSERT_TRUE(memory.ReadCStringSizeLimited(platform_addr, 10, &platform)); +#endif // ARCH_CPU_RISCV64 + #if defined(ARCH_CPU_X86) EXPECT_STREQ(platform.c_str(), "i686"); #elif defined(ARCH_CPU_X86_64) diff --git a/shared/sentry/external/crashpad/util/linux/checked_linux_address_range.h b/shared/sentry/src/external/crashpad/util/linux/checked_linux_address_range.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/checked_linux_address_range.h rename to shared/sentry/src/external/crashpad/util/linux/checked_linux_address_range.h diff --git a/shared/sentry/external/crashpad/util/linux/direct_ptrace_connection.cc b/shared/sentry/src/external/crashpad/util/linux/direct_ptrace_connection.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/direct_ptrace_connection.cc rename to shared/sentry/src/external/crashpad/util/linux/direct_ptrace_connection.cc diff --git a/shared/sentry/external/crashpad/util/linux/direct_ptrace_connection.h b/shared/sentry/src/external/crashpad/util/linux/direct_ptrace_connection.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/direct_ptrace_connection.h rename to shared/sentry/src/external/crashpad/util/linux/direct_ptrace_connection.h diff --git a/shared/sentry/external/crashpad/util/linux/exception_handler_client.cc b/shared/sentry/src/external/crashpad/util/linux/exception_handler_client.cc similarity index 99% rename from shared/sentry/external/crashpad/util/linux/exception_handler_client.cc rename to shared/sentry/src/external/crashpad/util/linux/exception_handler_client.cc index cef493df7..68dc67eff 100644 --- a/shared/sentry/external/crashpad/util/linux/exception_handler_client.cc +++ b/shared/sentry/src/external/crashpad/util/linux/exception_handler_client.cc @@ -20,6 +20,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/posix/eintr_wrapper.h" #include "build/build_config.h" diff --git a/shared/sentry/external/crashpad/util/linux/exception_handler_client.h b/shared/sentry/src/external/crashpad/util/linux/exception_handler_client.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/exception_handler_client.h rename to shared/sentry/src/external/crashpad/util/linux/exception_handler_client.h diff --git a/shared/sentry/external/crashpad/util/linux/exception_handler_protocol.cc b/shared/sentry/src/external/crashpad/util/linux/exception_handler_protocol.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/exception_handler_protocol.cc rename to shared/sentry/src/external/crashpad/util/linux/exception_handler_protocol.cc diff --git a/shared/sentry/external/crashpad/util/linux/exception_handler_protocol.h b/shared/sentry/src/external/crashpad/util/linux/exception_handler_protocol.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/exception_handler_protocol.h rename to shared/sentry/src/external/crashpad/util/linux/exception_handler_protocol.h diff --git a/shared/sentry/external/crashpad/util/linux/exception_information.h b/shared/sentry/src/external/crashpad/util/linux/exception_information.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/exception_information.h rename to shared/sentry/src/external/crashpad/util/linux/exception_information.h diff --git a/shared/sentry/external/crashpad/util/linux/initial_signal_dispositions.cc b/shared/sentry/src/external/crashpad/util/linux/initial_signal_dispositions.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/initial_signal_dispositions.cc rename to shared/sentry/src/external/crashpad/util/linux/initial_signal_dispositions.cc diff --git a/shared/sentry/external/crashpad/util/linux/initial_signal_dispositions.h b/shared/sentry/src/external/crashpad/util/linux/initial_signal_dispositions.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/initial_signal_dispositions.h rename to shared/sentry/src/external/crashpad/util/linux/initial_signal_dispositions.h diff --git a/shared/sentry/external/crashpad/util/linux/memory_map.cc b/shared/sentry/src/external/crashpad/util/linux/memory_map.cc similarity index 99% rename from shared/sentry/external/crashpad/util/linux/memory_map.cc rename to shared/sentry/src/external/crashpad/util/linux/memory_map.cc index 2c18f30b6..58de835ed 100644 --- a/shared/sentry/external/crashpad/util/linux/memory_map.cc +++ b/shared/sentry/src/external/crashpad/util/linux/memory_map.cc @@ -19,6 +19,7 @@ #include #include "base/bit_cast.h" +#include "base/check_op.h" #include "base/files/file_path.h" #include "base/logging.h" #include "build/build_config.h" diff --git a/shared/sentry/external/crashpad/util/linux/memory_map.h b/shared/sentry/src/external/crashpad/util/linux/memory_map.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/memory_map.h rename to shared/sentry/src/external/crashpad/util/linux/memory_map.h diff --git a/shared/sentry/external/crashpad/util/linux/memory_map_test.cc b/shared/sentry/src/external/crashpad/util/linux/memory_map_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/memory_map_test.cc rename to shared/sentry/src/external/crashpad/util/linux/memory_map_test.cc diff --git a/shared/sentry/src/external/crashpad/util/linux/pac_helper.cc b/shared/sentry/src/external/crashpad/util/linux/pac_helper.cc new file mode 100644 index 000000000..a9d5f0456 --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/linux/pac_helper.cc @@ -0,0 +1,44 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/linux/pac_helper.h" + +#if defined(__has_feature) +#define CRASHPAD_HAS_FEATURE(x) __has_feature(x) +#else +#define CRASHPAD_HAS_FEATURE(x) 0 +#endif + +#if CRASHPAD_HAS_FEATURE(ptrauth_intrinsics) + #include +#endif + +#include "util/misc/address_types.h" + +namespace crashpad { + +VMAddress StripPACBits(VMAddress address) { +#if CRASHPAD_HAS_FEATURE(ptrauth_intrinsics) + address = ptrauth_strip(address, ptrauth_key_function_pointer); +#elif defined(ARCH_CPU_ARM64) + // Strip any pointer authentication bits that are assigned to the address. + register uintptr_t x30 __asm("x30") = address; + asm("xpaclri" : "+r"(x30)); + address = x30; +#endif + return address; +} + +} // namespace crashpad + diff --git a/shared/sentry/src/external/crashpad/util/linux/pac_helper.h b/shared/sentry/src/external/crashpad/util/linux/pac_helper.h new file mode 100644 index 000000000..6fcea652a --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/linux/pac_helper.h @@ -0,0 +1,29 @@ +// Copyright 2023 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_LINUX_PAC_HELPER_H_ +#define CRASHPAD_UTIL_LINUX_PAC_HELPER_H_ + +#include "util/misc/address_types.h" + +namespace crashpad { + +//! \brief Strips PAC bits from an address +VMAddress StripPACBits(VMAddress address); + +} // namespace crashpad + + +#endif // CRASHPAD_UTIL_LINUX_PAC_HELPER_H_ + diff --git a/shared/sentry/external/crashpad/util/linux/proc_stat_reader.cc b/shared/sentry/src/external/crashpad/util/linux/proc_stat_reader.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/proc_stat_reader.cc rename to shared/sentry/src/external/crashpad/util/linux/proc_stat_reader.cc diff --git a/shared/sentry/external/crashpad/util/linux/proc_stat_reader.h b/shared/sentry/src/external/crashpad/util/linux/proc_stat_reader.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/proc_stat_reader.h rename to shared/sentry/src/external/crashpad/util/linux/proc_stat_reader.h diff --git a/shared/sentry/external/crashpad/util/linux/proc_stat_reader_test.cc b/shared/sentry/src/external/crashpad/util/linux/proc_stat_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/proc_stat_reader_test.cc rename to shared/sentry/src/external/crashpad/util/linux/proc_stat_reader_test.cc diff --git a/shared/sentry/external/crashpad/util/linux/proc_task_reader.cc b/shared/sentry/src/external/crashpad/util/linux/proc_task_reader.cc similarity index 98% rename from shared/sentry/external/crashpad/util/linux/proc_task_reader.cc rename to shared/sentry/src/external/crashpad/util/linux/proc_task_reader.cc index ee8422beb..159d8cac9 100644 --- a/shared/sentry/external/crashpad/util/linux/proc_task_reader.cc +++ b/shared/sentry/src/external/crashpad/util/linux/proc_task_reader.cc @@ -18,6 +18,7 @@ #include +#include "base/check_op.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" diff --git a/shared/sentry/external/crashpad/util/linux/proc_task_reader.h b/shared/sentry/src/external/crashpad/util/linux/proc_task_reader.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/proc_task_reader.h rename to shared/sentry/src/external/crashpad/util/linux/proc_task_reader.h diff --git a/shared/sentry/external/crashpad/util/linux/proc_task_reader_test.cc b/shared/sentry/src/external/crashpad/util/linux/proc_task_reader_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/proc_task_reader_test.cc rename to shared/sentry/src/external/crashpad/util/linux/proc_task_reader_test.cc diff --git a/shared/sentry/external/crashpad/util/linux/ptrace_broker.cc b/shared/sentry/src/external/crashpad/util/linux/ptrace_broker.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/ptrace_broker.cc rename to shared/sentry/src/external/crashpad/util/linux/ptrace_broker.cc diff --git a/shared/sentry/external/crashpad/util/linux/ptrace_broker.h b/shared/sentry/src/external/crashpad/util/linux/ptrace_broker.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/ptrace_broker.h rename to shared/sentry/src/external/crashpad/util/linux/ptrace_broker.h diff --git a/shared/sentry/external/crashpad/util/linux/ptrace_broker_test.cc b/shared/sentry/src/external/crashpad/util/linux/ptrace_broker_test.cc similarity index 97% rename from shared/sentry/external/crashpad/util/linux/ptrace_broker_test.cc rename to shared/sentry/src/external/crashpad/util/linux/ptrace_broker_test.cc index 0b9e917c9..11f1684ab 100644 --- a/shared/sentry/external/crashpad/util/linux/ptrace_broker_test.cc +++ b/shared/sentry/src/external/crashpad/util/linux/ptrace_broker_test.cc @@ -277,7 +277,10 @@ class SameBitnessTest : public Multiprocess { ScopedMmap mapping_; }; -TEST(PtraceBroker, SameBitness) { +// TODO(https://crbug.com/1459865): This test consistently fails on ASAN/LSAN +// but it's not clear if this test is correct in the general case (see comment 2 +// on that issue). +TEST(PtraceBroker, DISABLED_SameBitness) { SameBitnessTest test; test.Run(); } diff --git a/shared/sentry/external/crashpad/util/linux/ptrace_client.cc b/shared/sentry/src/external/crashpad/util/linux/ptrace_client.cc similarity index 98% rename from shared/sentry/external/crashpad/util/linux/ptrace_client.cc rename to shared/sentry/src/external/crashpad/util/linux/ptrace_client.cc index be5df2a4e..56bc55568 100644 --- a/shared/sentry/external/crashpad/util/linux/ptrace_client.cc +++ b/shared/sentry/src/external/crashpad/util/linux/ptrace_client.cc @@ -21,6 +21,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "util/file/file_io.h" @@ -331,6 +332,11 @@ ssize_t PtraceClient::ReadUpTo(VMAddress address, size_t size, void* buffer) { return total_read; } + if (static_cast(bytes_read) > size) { + LOG(ERROR) << "invalid size " << bytes_read; + return -1; + } + if (!LoggingReadFileExactly(sock_, buffer_c, bytes_read)) { return -1; } diff --git a/shared/sentry/external/crashpad/util/linux/ptrace_client.h b/shared/sentry/src/external/crashpad/util/linux/ptrace_client.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/ptrace_client.h rename to shared/sentry/src/external/crashpad/util/linux/ptrace_client.h diff --git a/shared/sentry/external/crashpad/util/linux/ptrace_connection.h b/shared/sentry/src/external/crashpad/util/linux/ptrace_connection.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/ptrace_connection.h rename to shared/sentry/src/external/crashpad/util/linux/ptrace_connection.h diff --git a/shared/sentry/external/crashpad/util/linux/ptracer.cc b/shared/sentry/src/external/crashpad/util/linux/ptracer.cc similarity index 94% rename from shared/sentry/external/crashpad/util/linux/ptracer.cc rename to shared/sentry/src/external/crashpad/util/linux/ptracer.cc index 25c89ea95..a985cb1d1 100644 --- a/shared/sentry/external/crashpad/util/linux/ptracer.cc +++ b/shared/sentry/src/external/crashpad/util/linux/ptracer.cc @@ -20,6 +20,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "build/build_config.h" #include "util/misc/from_pointer_cast.h" @@ -398,6 +399,37 @@ bool GetThreadArea64(pid_t tid, return true; } +#elif defined(ARCH_CPU_RISCV64) + +bool GetFloatingPointRegisters64(pid_t tid, + FloatContext* context, + bool can_log) { + iovec iov; + iov.iov_base = context; + iov.iov_len = sizeof(*context); + if (ptrace( + PTRACE_GETREGSET, tid, reinterpret_cast(NT_PRFPREG), &iov) != + 0) { + PLOG_IF(ERROR, can_log) << "ptrace"; + return false; + } + if (iov.iov_len != sizeof(context->f64)) { + LOG_IF(ERROR, can_log) << "Unexpected registers size " << iov.iov_len + << " != " << sizeof(context->f64); + return false; + } + return true; +} + +bool GetThreadArea64(pid_t tid, + const ThreadContext& context, + LinuxVMAddress* address, + bool can_log) { + // Thread pointer register + *address = context.t64.regs[3]; + return true; +} + #else #error Port. #endif // ARCH_CPU_X86_FAMILY @@ -426,6 +458,7 @@ size_t GetGeneralPurposeRegistersAndLength(pid_t tid, return iov.iov_len; } +#if !defined(ARCH_CPU_RISCV64) bool GetGeneralPurposeRegisters32(pid_t tid, ThreadContext* context, bool can_log) { @@ -437,6 +470,7 @@ bool GetGeneralPurposeRegisters32(pid_t tid, } return true; } +#endif bool GetGeneralPurposeRegisters64(pid_t tid, ThreadContext* context, @@ -500,12 +534,16 @@ bool Ptracer::GetThreadInfo(pid_t tid, ThreadInfo* info) { can_log_); } +#if !defined(ARCH_CPU_RISCV64) return GetGeneralPurposeRegisters32(tid, &info->thread_context, can_log_) && GetFloatingPointRegisters32(tid, &info->float_context, can_log_) && GetThreadArea32(tid, info->thread_context, &info->thread_specific_data_address, can_log_); +#else + return false; +#endif } ssize_t Ptracer::ReadUpTo(pid_t pid, diff --git a/shared/sentry/external/crashpad/util/linux/ptracer.h b/shared/sentry/src/external/crashpad/util/linux/ptracer.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/ptracer.h rename to shared/sentry/src/external/crashpad/util/linux/ptracer.h diff --git a/shared/sentry/external/crashpad/util/linux/ptracer_test.cc b/shared/sentry/src/external/crashpad/util/linux/ptracer_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/ptracer_test.cc rename to shared/sentry/src/external/crashpad/util/linux/ptracer_test.cc diff --git a/shared/sentry/external/crashpad/util/linux/scoped_pr_set_dumpable.cc b/shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_dumpable.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/scoped_pr_set_dumpable.cc rename to shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_dumpable.cc diff --git a/shared/sentry/external/crashpad/util/linux/scoped_pr_set_dumpable.h b/shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_dumpable.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/scoped_pr_set_dumpable.h rename to shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_dumpable.h diff --git a/shared/sentry/external/crashpad/util/linux/scoped_pr_set_ptracer.cc b/shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_ptracer.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/scoped_pr_set_ptracer.cc rename to shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_ptracer.cc diff --git a/shared/sentry/external/crashpad/util/linux/scoped_pr_set_ptracer.h b/shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_ptracer.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/scoped_pr_set_ptracer.h rename to shared/sentry/src/external/crashpad/util/linux/scoped_pr_set_ptracer.h diff --git a/shared/sentry/external/crashpad/util/linux/scoped_ptrace_attach.cc b/shared/sentry/src/external/crashpad/util/linux/scoped_ptrace_attach.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/scoped_ptrace_attach.cc rename to shared/sentry/src/external/crashpad/util/linux/scoped_ptrace_attach.cc diff --git a/shared/sentry/external/crashpad/util/linux/scoped_ptrace_attach.h b/shared/sentry/src/external/crashpad/util/linux/scoped_ptrace_attach.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/scoped_ptrace_attach.h rename to shared/sentry/src/external/crashpad/util/linux/scoped_ptrace_attach.h diff --git a/shared/sentry/external/crashpad/util/linux/scoped_ptrace_attach_test.cc b/shared/sentry/src/external/crashpad/util/linux/scoped_ptrace_attach_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/scoped_ptrace_attach_test.cc rename to shared/sentry/src/external/crashpad/util/linux/scoped_ptrace_attach_test.cc diff --git a/shared/sentry/external/crashpad/util/linux/socket.cc b/shared/sentry/src/external/crashpad/util/linux/socket.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/socket.cc rename to shared/sentry/src/external/crashpad/util/linux/socket.cc diff --git a/shared/sentry/external/crashpad/util/linux/socket.h b/shared/sentry/src/external/crashpad/util/linux/socket.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/socket.h rename to shared/sentry/src/external/crashpad/util/linux/socket.h diff --git a/shared/sentry/external/crashpad/util/linux/socket_test.cc b/shared/sentry/src/external/crashpad/util/linux/socket_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/socket_test.cc rename to shared/sentry/src/external/crashpad/util/linux/socket_test.cc diff --git a/shared/sentry/external/crashpad/util/linux/thread_info.cc b/shared/sentry/src/external/crashpad/util/linux/thread_info.cc similarity index 100% rename from shared/sentry/external/crashpad/util/linux/thread_info.cc rename to shared/sentry/src/external/crashpad/util/linux/thread_info.cc diff --git a/shared/sentry/external/crashpad/util/linux/thread_info.h b/shared/sentry/src/external/crashpad/util/linux/thread_info.h similarity index 90% rename from shared/sentry/external/crashpad/util/linux/thread_info.h rename to shared/sentry/src/external/crashpad/util/linux/thread_info.h index 8b94effef..808b35a3a 100644 --- a/shared/sentry/external/crashpad/util/linux/thread_info.h +++ b/shared/sentry/src/external/crashpad/util/linux/thread_info.h @@ -15,6 +15,7 @@ #ifndef CRASHPAD_UTIL_LINUX_THREAD_INFO_H_ #define CRASHPAD_UTIL_LINUX_THREAD_INFO_H_ +#include #include #include @@ -28,6 +29,11 @@ #include #endif +// x86_64 has compilation errors if asm/ptrace.h is #included. +#if defined(ARCH_CPU_RISCV64) +#include +#endif + namespace crashpad { //! \brief The set of general purpose registers for an architecture family. @@ -79,6 +85,8 @@ union ThreadContext { uint32_t cp0_status; uint32_t cp0_cause; uint32_t padding1_; +#elif defined(ARCH_CPU_RISCV64) + // 32 bit RISC-V not supported #else #error Port. #endif // ARCH_CPU_X86_FAMILY @@ -132,12 +140,17 @@ union ThreadContext { uint64_t cp0_badvaddr; uint64_t cp0_status; uint64_t cp0_cause; +#elif defined(ARCH_CPU_RISCV64) + // Reflects user_regs_struct in asm/ptrace.h. + uint64_t pc; + uint64_t regs[31]; #else #error Port. #endif // ARCH_CPU_X86_FAMILY } t64; -#if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM64) +#if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM64) || \ + defined(ARCH_CPU_RISCV64) using NativeThreadContext = user_regs_struct; #elif defined(ARCH_CPU_ARMEL) using NativeThreadContext = user_regs; @@ -145,7 +158,7 @@ union ThreadContext { // No appropriate NativeThreadsContext type available for MIPS #else #error Port. -#endif // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64 +#endif // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64 || ARCH_CPU_RISCV64 #if !defined(ARCH_CPU_MIPS_FAMILY) #if defined(ARCH_CPU_32_BITS) @@ -218,6 +231,8 @@ union FloatContext { } fpregs[32]; uint32_t fpcsr; uint32_t fpu_id; +#elif defined(ARCH_CPU_RISCV64) + // 32 bit RISC-V not supported #else #error Port. #endif // ARCH_CPU_X86_FAMILY @@ -252,6 +267,10 @@ union FloatContext { double fpregs[32]; uint32_t fpcsr; uint32_t fpu_id; +#elif defined(ARCH_CPU_RISCV64) + // Reflects __riscv_d_ext_state in asm/ptrace.h + uint64_t fpregs[32]; + uint64_t fcsr; #else #error Port. #endif // ARCH_CPU_X86_FAMILY @@ -274,13 +293,15 @@ union FloatContext { "Size mismatch"); #elif defined(ARCH_CPU_ARMEL) static_assert(sizeof(f32_t::fpregs) == sizeof(user_fpregs), "Size mismatch"); -#if !defined(__GLIBC__) +#if defined(__BIONIC__) static_assert(sizeof(f32_t::vfp) == sizeof(user_vfp), "Size mismatch"); #endif #elif defined(ARCH_CPU_ARM64) static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch"); #elif defined(ARCH_CPU_MIPS_FAMILY) // No appropriate floating point context native type for available MIPS. +#elif defined(ARCH_CPU_RISCV64) + static_assert(sizeof(f64) == sizeof(__riscv_d_ext_state), "Size mismatch"); #else #error Port. #endif // ARCH_CPU_X86 diff --git a/shared/sentry/external/crashpad/util/linux/traits.h b/shared/sentry/src/external/crashpad/util/linux/traits.h similarity index 100% rename from shared/sentry/external/crashpad/util/linux/traits.h rename to shared/sentry/src/external/crashpad/util/linux/traits.h diff --git a/shared/sentry/external/crashpad/util/mac/checked_mach_address_range.h b/shared/sentry/src/external/crashpad/util/mac/checked_mach_address_range.h similarity index 100% rename from shared/sentry/external/crashpad/util/mac/checked_mach_address_range.h rename to shared/sentry/src/external/crashpad/util/mac/checked_mach_address_range.h diff --git a/shared/sentry/external/crashpad/util/mac/checked_mach_address_range_test.cc b/shared/sentry/src/external/crashpad/util/mac/checked_mach_address_range_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mac/checked_mach_address_range_test.cc rename to shared/sentry/src/external/crashpad/util/mac/checked_mach_address_range_test.cc diff --git a/shared/sentry/external/crashpad/util/mac/launchd.h b/shared/sentry/src/external/crashpad/util/mac/launchd.h similarity index 100% rename from shared/sentry/external/crashpad/util/mac/launchd.h rename to shared/sentry/src/external/crashpad/util/mac/launchd.h diff --git a/shared/sentry/external/crashpad/util/mac/launchd.mm b/shared/sentry/src/external/crashpad/util/mac/launchd.mm similarity index 79% rename from shared/sentry/external/crashpad/util/mac/launchd.mm rename to shared/sentry/src/external/crashpad/util/mac/launchd.mm index eb94ff37d..e2ced32de 100644 --- a/shared/sentry/external/crashpad/util/mac/launchd.mm +++ b/shared/sentry/src/external/crashpad/util/mac/launchd.mm @@ -16,9 +16,10 @@ #import -#include "base/mac/foundation_util.h" +#include "base/apple/bridging.h" +#include "base/apple/foundation_util.h" +#include "base/apple/scoped_cftyperef.h" #include "base/mac/scoped_launch_data.h" -#include "base/mac/scoped_cftyperef.h" #include "base/strings/sys_string_conversions.h" #include "util/misc/implicit_cast.h" @@ -34,8 +35,8 @@ launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) { CFTypeID type_id_cf = CFGetTypeID(property_cf); if (type_id_cf == CFDictionaryGetTypeID()) { - NSDictionary* dictionary_ns = base::mac::CFToNSCast( - base::mac::CFCastStrict(property_cf)); + NSDictionary* dictionary_ns = base::apple::CFToNSPtrCast( + base::apple::CFCastStrict(property_cf)); base::mac::ScopedLaunchData dictionary_launch( LaunchDataAlloc(LAUNCH_DATA_DICTIONARY)); @@ -45,7 +46,7 @@ launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) { } CFPropertyListRef value_cf = - implicit_cast(dictionary_ns[key]); + (__bridge CFPropertyListRef)dictionary_ns[key]; launch_data_t value_launch = CFPropertyToLaunchData(value_cf); if (!value_launch) { return nullptr; @@ -58,15 +59,14 @@ launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) { data_launch = dictionary_launch.release(); } else if (type_id_cf == CFArrayGetTypeID()) { - NSArray* array_ns = base::mac::CFToNSCast( - base::mac::CFCastStrict(property_cf)); + NSArray* array_ns = base::apple::CFToNSPtrCast( + base::apple::CFCastStrict(property_cf)); base::mac::ScopedLaunchData array_launch( LaunchDataAlloc(LAUNCH_DATA_ARRAY)); size_t index = 0; for (id element_ns in array_ns) { - CFPropertyListRef element_cf = - implicit_cast(element_ns); + CFPropertyListRef element_cf = (__bridge CFPropertyListRef)element_ns; launch_data_t element_launch = CFPropertyToLaunchData(element_cf); if (!element_launch) { return nullptr; @@ -78,8 +78,9 @@ launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) { data_launch = array_launch.release(); } else if (type_id_cf == CFNumberGetTypeID()) { - CFNumberRef number_cf = base::mac::CFCastStrict(property_cf); - NSNumber* number_ns = base::mac::CFToNSCast(number_cf); + CFNumberRef number_cf = + base::apple::CFCastStrict(property_cf); + NSNumber* number_ns = base::apple::CFToNSPtrCast(number_cf); switch (CFNumberGetType(number_cf)) { case kCFNumberSInt8Type: case kCFNumberSInt16Type: @@ -109,12 +110,12 @@ launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) { } else if (type_id_cf == CFBooleanGetTypeID()) { CFBooleanRef boolean_cf = - base::mac::CFCastStrict(property_cf); + base::apple::CFCastStrict(property_cf); data_launch = LaunchDataNewBool(CFBooleanGetValue(boolean_cf)); } else if (type_id_cf == CFStringGetTypeID()) { - NSString* string_ns = base::mac::CFToNSCast( - base::mac::CFCastStrict(property_cf)); + NSString* string_ns = base::apple::CFToNSPtrCast( + base::apple::CFCastStrict(property_cf)); // -fileSystemRepresentation might be more correct than -UTF8String, // because these strings can hold paths. The analogous function in @@ -125,14 +126,14 @@ launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) { data_launch = LaunchDataNewString([string_ns UTF8String]); } else if (type_id_cf == CFDataGetTypeID()) { - NSData* data_ns = base::mac::CFToNSCast( - base::mac::CFCastStrict(property_cf)); + NSData* data_ns = base::apple::CFToNSPtrCast( + base::apple::CFCastStrict(property_cf)); data_launch = LaunchDataNewOpaque([data_ns bytes], [data_ns length]); } else { - base::ScopedCFTypeRef type_name_cf( + base::apple::ScopedCFTypeRef type_name_cf( CFCopyTypeIDDescription(type_id_cf)); DLOG(ERROR) << "unable to convert CFTypeID " << type_id_cf << " (" - << base::SysCFStringRefToUTF8(type_name_cf) << ")"; + << base::SysCFStringRefToUTF8(type_name_cf.get()) << ")"; } return data_launch; diff --git a/shared/sentry/external/crashpad/util/mac/launchd_test.mm b/shared/sentry/src/external/crashpad/util/mac/launchd_test.mm similarity index 87% rename from shared/sentry/external/crashpad/util/mac/launchd_test.mm rename to shared/sentry/src/external/crashpad/util/mac/launchd_test.mm index 5949594ca..27e0bdeaf 100644 --- a/shared/sentry/external/crashpad/util/mac/launchd_test.mm +++ b/shared/sentry/src/external/crashpad/util/mac/launchd_test.mm @@ -23,6 +23,7 @@ #include #include +#include "base/apple/bridging.h" #include "base/mac/scoped_launch_data.h" #include "gtest/gtest.h" #include "util/stdlib/objc.h" @@ -60,7 +61,8 @@ for (size_t index = 0; index < std::size(integer_nses); ++index) { NSNumber* integer_ns = integer_nses[index]; - launch_data.reset(CFPropertyToLaunchData(integer_ns)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(integer_ns))); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_INTEGER); EXPECT_EQ(LaunchDataGetInteger(launch_data.get()), @@ -90,7 +92,8 @@ for (size_t index = 0; index < std::size(double_nses); ++index) { NSNumber* double_ns = double_nses[index]; - launch_data.reset(CFPropertyToLaunchData(double_ns)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(double_ns))); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_REAL); double expected_double_value = [double_ns doubleValue]; @@ -109,17 +112,19 @@ @autoreleasepool { base::mac::ScopedLaunchData launch_data; - NSNumber* bool_nses[] = { - @NO, - @YES, + // Use CFBooleanRefs here because calling NSToCFPtrCast on an NSNumber + // boolean can fail. Casting an NSNumber expects a CFNumberRef as a result + // but a cast boolean will end up as a CFBooleanRef. + CFBooleanRef bools[] = { + kCFBooleanFalse, + kCFBooleanTrue, }; - for (size_t index = 0; index < std::size(bool_nses); ++index) { - NSNumber* bool_ns = bool_nses[index]; - launch_data.reset(CFPropertyToLaunchData(bool_ns)); + for (CFBooleanRef bool_cf : bools) { + launch_data.reset(CFPropertyToLaunchData(bool_cf)); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_BOOL); - if ([bool_ns boolValue]) { + if (CFBooleanGetValue(bool_cf)) { EXPECT_TRUE(LaunchDataGetBool(launch_data.get())); } else { EXPECT_FALSE(LaunchDataGetBool(launch_data.get())); @@ -140,7 +145,8 @@ for (size_t index = 0; index < std::size(string_nses); ++index) { NSString* string_ns = string_nses[index]; - launch_data.reset(CFPropertyToLaunchData(string_ns)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(string_ns))); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_STRING); EXPECT_STREQ([string_ns UTF8String], @@ -156,7 +162,8 @@ static constexpr uint8_t data_c[] = { 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 6, 5, 4, 3, 2}; NSData* data_ns = [NSData dataWithBytes:data_c length:sizeof(data_c)]; - launch_data.reset(CFPropertyToLaunchData(data_ns)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(data_ns))); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_OPAQUE); EXPECT_EQ(LaunchDataGetOpaqueSize(launch_data.get()), sizeof(data_c)); @@ -174,7 +181,8 @@ @"key" : @"value", }; - launch_data.reset(CFPropertyToLaunchData(dictionary_ns)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(dictionary_ns))); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_DICTIONARY); EXPECT_EQ(LaunchDataDictGetCount(launch_data.get()), [dictionary_ns count]); @@ -193,7 +201,8 @@ NSArray* array_ns = @[ @"element_1", @"element_2", ]; - launch_data.reset(CFPropertyToLaunchData(array_ns)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(array_ns))); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_ARRAY); EXPECT_EQ(LaunchDataArrayGetCount(launch_data.get()), [array_ns count]); @@ -219,18 +228,20 @@ base::mac::ScopedLaunchData launch_data; NSDate* date = [NSDate date]; - launch_data.reset(CFPropertyToLaunchData(date)); + launch_data.reset(CFPropertyToLaunchData(base::apple::NSToCFPtrCast(date))); EXPECT_FALSE(launch_data.get()); NSDictionary* date_dictionary = @{ @"key" : @"value", @"date" : date, }; - launch_data.reset(CFPropertyToLaunchData(date_dictionary)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(date_dictionary))); EXPECT_FALSE(launch_data.get()); NSArray* date_array = @[ @"string_1", date, @"string_2", ]; - launch_data.reset(CFPropertyToLaunchData(date_array)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(date_array))); EXPECT_FALSE(launch_data.get()); } } @@ -249,7 +260,8 @@ }, }; - launch_data.reset(CFPropertyToLaunchData(job_dictionary)); + launch_data.reset( + CFPropertyToLaunchData(base::apple::NSToCFPtrCast(job_dictionary))); ASSERT_TRUE(launch_data.get()); ASSERT_EQ(LaunchDataGetType(launch_data.get()), LAUNCH_DATA_DICTIONARY); EXPECT_EQ(LaunchDataDictGetCount(launch_data.get()), 4u); diff --git a/shared/sentry/external/crashpad/util/mac/mac_util.cc b/shared/sentry/src/external/crashpad/util/mac/mac_util.cc similarity index 87% rename from shared/sentry/external/crashpad/util/mac/mac_util.cc rename to shared/sentry/src/external/crashpad/util/mac/mac_util.cc index a13823435..cef238729 100644 --- a/shared/sentry/external/crashpad/util/mac/mac_util.cc +++ b/shared/sentry/src/external/crashpad/util/mac/mac_util.cc @@ -21,10 +21,10 @@ #include #include +#include "base/apple/foundation_util.h" +#include "base/apple/scoped_cftyperef.h" #include "base/check_op.h" #include "base/logging.h" -#include "base/mac/foundation_util.h" -#include "base/mac/scoped_cftyperef.h" #include "base/mac/scoped_ioobject.h" #include "base/notreached.h" #include "base/strings/string_number_conversions.h" @@ -45,7 +45,6 @@ extern "C" { // TryCFCopy*VersionDictionary() helpers to account for the possibility that // they may not be present at runtime. CFDictionaryRef _CFCopySystemVersionDictionary() WEAK_IMPORT; -CFDictionaryRef _CFCopyServerVersionDictionary() WEAK_IMPORT; // Don’t use these constants with CFDictionaryGetValue() directly, use them with // the TryCFDictionaryGetValue() wrapper to account for the possibility that @@ -85,8 +84,8 @@ int DarwinMajorVersion() { int rv = uname(&uname_info); PCHECK(rv == 0) << "uname"; - DCHECK_EQ(strcmp(uname_info.sysname, "Darwin"), 0) << "unexpected sysname " - << uname_info.sysname; + DCHECK_EQ(strcmp(uname_info.sysname, "Darwin"), 0) + << "unexpected sysname " << uname_info.sysname; char* dot = strchr(uname_info.release, '.'); CHECK(dot); @@ -109,13 +108,6 @@ CFDictionaryRef TryCFCopySystemVersionDictionary() { return nullptr; } -CFDictionaryRef TryCFCopyServerVersionDictionary() { - if (_CFCopyServerVersionDictionary) { - return _CFCopyServerVersionDictionary(); - } - return nullptr; -} - const void* TryCFDictionaryGetValue(CFDictionaryRef dictionary, const void* value) { if (value) { @@ -174,9 +166,9 @@ bool StringToVersionNumbers(const std::string& version, std::string IORegistryEntryDataPropertyAsString(io_registry_entry_t entry, CFStringRef key) { - base::ScopedCFTypeRef property( + base::apple::ScopedCFTypeRef property( IORegistryEntryCreateCFProperty(entry, key, kCFAllocatorDefault, 0)); - CFDataRef data = base::mac::CFCast(property); + CFDataRef data = base::apple::CFCast(property.get()); if (data && CFDataGetLength(data) > 0) { return reinterpret_cast(CFDataGetBytePtr(data)); } @@ -242,25 +234,19 @@ bool MacOSVersionComponents(int* major, int* minor, int* bugfix, std::string* build, - bool* server, std::string* version_string) { - base::ScopedCFTypeRef dictionary( - TryCFCopyServerVersionDictionary()); - if (dictionary) { - *server = true; - } else { - dictionary.reset(TryCFCopySystemVersionDictionary()); - if (!dictionary) { - LOG(ERROR) << "_CFCopySystemVersionDictionary failed"; - return false; - } - *server = false; + base::apple::ScopedCFTypeRef dictionary( + TryCFCopySystemVersionDictionary()); + if (!dictionary) { + LOG(ERROR) << "_CFCopySystemVersionDictionary failed"; + return false; } bool success = true; - CFStringRef version_cf = base::mac::CFCast( - TryCFDictionaryGetValue(dictionary, _kCFSystemVersionProductVersionKey)); + CFStringRef version_cf = + base::apple::CFCast(TryCFDictionaryGetValue( + dictionary.get(), _kCFSystemVersionProductVersionKey)); std::string version; if (!version_cf) { LOG(ERROR) << "version_cf not found"; @@ -279,8 +265,9 @@ bool MacOSVersionComponents(int* major, } } - CFStringRef build_cf = base::mac::CFCast( - TryCFDictionaryGetValue(dictionary, _kCFSystemVersionBuildVersionKey)); + CFStringRef build_cf = + base::apple::CFCast(TryCFDictionaryGetValue( + dictionary.get(), _kCFSystemVersionBuildVersionKey)); if (!build_cf) { LOG(ERROR) << "build_cf not found"; success = false; @@ -288,8 +275,9 @@ bool MacOSVersionComponents(int* major, build->assign(base::SysCFStringRefToUTF8(build_cf)); } - CFStringRef product_cf = base::mac::CFCast( - TryCFDictionaryGetValue(dictionary, _kCFSystemVersionProductNameKey)); + CFStringRef product_cf = + base::apple::CFCast(TryCFDictionaryGetValue( + dictionary.get(), _kCFSystemVersionProductNameKey)); std::string product; if (!product_cf) { LOG(ERROR) << "product_cf not found"; @@ -299,8 +287,9 @@ bool MacOSVersionComponents(int* major, } // This key is not required, and in fact is normally not present. - CFStringRef extra_cf = base::mac::CFCast(TryCFDictionaryGetValue( - dictionary, _kCFSystemVersionProductVersionExtraKey)); + CFStringRef extra_cf = + base::apple::CFCast(TryCFDictionaryGetValue( + dictionary.get(), _kCFSystemVersionProductVersionExtraKey)); std::string extra; if (extra_cf) { extra = base::SysCFStringRefToUTF8(extra_cf); @@ -327,8 +316,8 @@ void MacModelAndBoard(std::string* model, std::string* board_id) { IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))); if (platform_expert) { - model->assign( - IORegistryEntryDataPropertyAsString(platform_expert, CFSTR("model"))); + model->assign(IORegistryEntryDataPropertyAsString(platform_expert.get(), + CFSTR("model"))); #if defined(ARCH_CPU_X86_FAMILY) CFStringRef kBoardProperty = CFSTR("board-id"); #elif defined(ARCH_CPU_ARM64) @@ -338,7 +327,7 @@ void MacModelAndBoard(std::string* model, std::string* board_id) { // alternative. CFStringRef kBoardProperty = CFSTR("target-type"); #endif - board_id->assign(IORegistryEntryDataPropertyAsString(platform_expert, + board_id->assign(IORegistryEntryDataPropertyAsString(platform_expert.get(), kBoardProperty)); } else { model->clear(); diff --git a/shared/sentry/external/crashpad/util/mac/mac_util.h b/shared/sentry/src/external/crashpad/util/mac/mac_util.h similarity index 98% rename from shared/sentry/external/crashpad/util/mac/mac_util.h rename to shared/sentry/src/external/crashpad/util/mac/mac_util.h index c6215e0d8..7a32b5f9e 100644 --- a/shared/sentry/external/crashpad/util/mac/mac_util.h +++ b/shared/sentry/src/external/crashpad/util/mac/mac_util.h @@ -65,7 +65,6 @@ bool MacOSVersionComponents(int* major, int* minor, int* bugfix, std::string* build, - bool* server, std::string* version_string); //! \brief Returns the model name and board ID of the running system. diff --git a/shared/sentry/external/crashpad/util/mac/mac_util_test.mm b/shared/sentry/src/external/crashpad/util/mac/mac_util_test.mm similarity index 82% rename from shared/sentry/external/crashpad/util/mac/mac_util_test.mm rename to shared/sentry/src/external/crashpad/util/mac/mac_util_test.mm index 6a799bf71..e1cc3ad73 100644 --- a/shared/sentry/external/crashpad/util/mac/mac_util_test.mm +++ b/shared/sentry/src/external/crashpad/util/mac/mac_util_test.mm @@ -19,21 +19,9 @@ #include -#include "base/mac/scoped_nsobject.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" -#ifdef __GLIBCXX__ -// When C++ exceptions are disabled, libstdc++ from GCC 4.2 defines |try| and -// |catch| so as to allow exception-expecting C++ code to build properly when -// language support for exceptions is not present. These macros interfere with -// the use of |@try| and |@catch| in Objective-C files such as this one. -// Undefine these macros here, after everything has been #included, since there -// will be no C++ uses and only Objective-C uses from this point on. -#undef try -#undef catch -#endif - namespace crashpad { namespace test { namespace { @@ -44,8 +32,8 @@ // check for with ASSERT_NO_FATAL_FAILURE() or testing::Test::HasFatalFailure(). void SwVers(NSString* argument, std::string* output) { @autoreleasepool { - base::scoped_nsobject pipe([[NSPipe alloc] init]); - base::scoped_nsobject task([[NSTask alloc] init]); + NSPipe* pipe = [[NSPipe alloc] init]; + NSTask* task = [[NSTask alloc] init]; [task setStandardOutput:pipe]; [task setLaunchPath:@"/usr/bin/sw_vers"]; [task setArguments:@[ argument ]]; @@ -76,10 +64,9 @@ void SwVers(NSString* argument, std::string* output) { int minor; int bugfix; std::string build; - bool server; std::string version_string; - ASSERT_TRUE(MacOSVersionComponents( - &major, &minor, &bugfix, &build, &server, &version_string)); + ASSERT_TRUE( + MacOSVersionComponents(&major, &minor, &bugfix, &build, &version_string)); EXPECT_GE(major, 10); EXPECT_LE(major, 99); @@ -127,10 +114,9 @@ void SwVers(NSString* argument, std::string* output) { int minor; int bugfix; std::string build; - bool server; std::string version_string; - ASSERT_TRUE(MacOSVersionComponents( - &major, &minor, &bugfix, &build, &server, &version_string)); + ASSERT_TRUE( + MacOSVersionComponents(&major, &minor, &bugfix, &build, &version_string)); EXPECT_EQ(macos_version_number, major * 1'00'00 + minor * 1'00 + diff --git a/shared/sentry/external/crashpad/util/mac/service_management.cc b/shared/sentry/src/external/crashpad/util/mac/service_management.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mac/service_management.cc rename to shared/sentry/src/external/crashpad/util/mac/service_management.cc diff --git a/shared/sentry/external/crashpad/util/mac/service_management.h b/shared/sentry/src/external/crashpad/util/mac/service_management.h similarity index 100% rename from shared/sentry/external/crashpad/util/mac/service_management.h rename to shared/sentry/src/external/crashpad/util/mac/service_management.h diff --git a/shared/sentry/external/crashpad/util/mac/service_management_test.mm b/shared/sentry/src/external/crashpad/util/mac/service_management_test.mm similarity index 97% rename from shared/sentry/external/crashpad/util/mac/service_management_test.mm rename to shared/sentry/src/external/crashpad/util/mac/service_management_test.mm index 461228d8c..26c96049c 100644 --- a/shared/sentry/external/crashpad/util/mac/service_management_test.mm +++ b/shared/sentry/src/external/crashpad/util/mac/service_management_test.mm @@ -20,8 +20,8 @@ #include #include -#include "base/mac/foundation_util.h" -#include "base/mac/scoped_cftyperef.h" +#include "base/apple/bridging.h" +#include "base/apple/scoped_cftyperef.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "gtest/gtest.h" @@ -124,7 +124,7 @@ void ExpectProcessIsNotRunning(pid_t pid, std::string& last_arg) { @[ @"/bin/sh", @"-c", shell_script_ns, ], }; CFDictionaryRef job_dictionary_cf = - base::mac::NSToCFCast(job_dictionary_ns); + base::apple::NSToCFPtrCast(job_dictionary_ns); // The job may be left over from a failed previous run. if (ServiceManagementIsJobLoaded(kJobLabel)) { diff --git a/shared/sentry/external/crashpad/util/mac/sysctl.cc b/shared/sentry/src/external/crashpad/util/mac/sysctl.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mac/sysctl.cc rename to shared/sentry/src/external/crashpad/util/mac/sysctl.cc diff --git a/shared/sentry/external/crashpad/util/mac/sysctl.h b/shared/sentry/src/external/crashpad/util/mac/sysctl.h similarity index 100% rename from shared/sentry/external/crashpad/util/mac/sysctl.h rename to shared/sentry/src/external/crashpad/util/mac/sysctl.h diff --git a/shared/sentry/external/crashpad/util/mac/sysctl_test.cc b/shared/sentry/src/external/crashpad/util/mac/sysctl_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mac/sysctl_test.cc rename to shared/sentry/src/external/crashpad/util/mac/sysctl_test.cc diff --git a/shared/sentry/external/crashpad/util/mac/xattr.cc b/shared/sentry/src/external/crashpad/util/mac/xattr.cc similarity index 99% rename from shared/sentry/external/crashpad/util/mac/xattr.cc rename to shared/sentry/src/external/crashpad/util/mac/xattr.cc index ae3555d7a..6c12e9136 100644 --- a/shared/sentry/external/crashpad/util/mac/xattr.cc +++ b/shared/sentry/src/external/crashpad/util/mac/xattr.cc @@ -19,6 +19,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_number_conversions.h" diff --git a/shared/sentry/external/crashpad/util/mac/xattr.h b/shared/sentry/src/external/crashpad/util/mac/xattr.h similarity index 100% rename from shared/sentry/external/crashpad/util/mac/xattr.h rename to shared/sentry/src/external/crashpad/util/mac/xattr.h diff --git a/shared/sentry/external/crashpad/util/mac/xattr_test.cc b/shared/sentry/src/external/crashpad/util/mac/xattr_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mac/xattr_test.cc rename to shared/sentry/src/external/crashpad/util/mac/xattr_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/bootstrap.cc b/shared/sentry/src/external/crashpad/util/mach/bootstrap.cc similarity index 91% rename from shared/sentry/external/crashpad/util/mach/bootstrap.cc rename to shared/sentry/src/external/crashpad/util/mach/bootstrap.cc index be2769b2c..f369f7f30 100644 --- a/shared/sentry/external/crashpad/util/mach/bootstrap.cc +++ b/shared/sentry/src/external/crashpad/util/mach/bootstrap.cc @@ -17,7 +17,7 @@ #include #include -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" namespace { @@ -26,7 +26,7 @@ namespace { // and the right type returned. struct BootstrapCheckInTraits { - using Type = base::mac::ScopedMachReceiveRight; + using Type = base::apple::ScopedMachReceiveRight; static kern_return_t Call(mach_port_t bootstrap_port, const char* service_name, mach_port_t* service_port) { @@ -37,7 +37,7 @@ struct BootstrapCheckInTraits { constexpr char BootstrapCheckInTraits::kName[]; struct BootstrapLookUpTraits { - using Type = base::mac::ScopedMachSendRight; + using Type = base::apple::ScopedMachSendRight; static kern_return_t Call(mach_port_t bootstrap_port, const char* service_name, mach_port_t* service_port) { @@ -73,14 +73,14 @@ typename Traits::Type BootstrapCheckInOrLookUp( namespace crashpad { -base::mac::ScopedMachReceiveRight BootstrapCheckIn( +base::apple::ScopedMachReceiveRight BootstrapCheckIn( const std::string& service_name) { return BootstrapCheckInOrLookUp(service_name); } -base::mac::ScopedMachSendRight BootstrapLookUp( +base::apple::ScopedMachSendRight BootstrapLookUp( const std::string& service_name) { - base::mac::ScopedMachSendRight send( + base::apple::ScopedMachSendRight send( BootstrapCheckInOrLookUp(service_name)); // It’s possible to race the bootstrap server when the receive right @@ -102,7 +102,7 @@ base::mac::ScopedMachSendRight BootstrapLookUp( return send; } -base::mac::ScopedMachSendRight SystemCrashReporterHandler() { +base::apple::ScopedMachSendRight SystemCrashReporterHandler() { return BootstrapLookUp("com.apple.ReportCrash"); } diff --git a/shared/sentry/external/crashpad/util/mach/bootstrap.h b/shared/sentry/src/external/crashpad/util/mach/bootstrap.h similarity index 90% rename from shared/sentry/external/crashpad/util/mach/bootstrap.h rename to shared/sentry/src/external/crashpad/util/mach/bootstrap.h index 362627ebd..35004c329 100644 --- a/shared/sentry/external/crashpad/util/mach/bootstrap.h +++ b/shared/sentry/src/external/crashpad/util/mach/bootstrap.h @@ -17,7 +17,7 @@ #include -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" namespace crashpad { @@ -30,7 +30,7 @@ namespace crashpad { //! //! \return On success, a receive right to the service port. On failure, //! `MACH_PORT_NULL` with a message logged. -base::mac::ScopedMachReceiveRight BootstrapCheckIn( +base::apple::ScopedMachReceiveRight BootstrapCheckIn( const std::string& service_name); //! \brief Makes a `boostrap_look_up()` call to the process’ bootstrap server. @@ -42,7 +42,8 @@ base::mac::ScopedMachReceiveRight BootstrapCheckIn( //! //! \return On success, a send right to the service port. On failure, //! `MACH_PORT_NULL` with a message logged. -base::mac::ScopedMachSendRight BootstrapLookUp(const std::string& service_name); +base::apple::ScopedMachSendRight BootstrapLookUp( + const std::string& service_name); //! \brief Obtains the system’s default Mach exception handler for crash-type //! exceptions. @@ -56,7 +57,7 @@ base::mac::ScopedMachSendRight BootstrapLookUp(const std::string& service_name); //! \return On success, a send right to an `exception_handler_t` corresponding //! to the system’s default crash reporter. On failure, `MACH_PORT_NULL`, //! with a message logged. -base::mac::ScopedMachSendRight SystemCrashReporterHandler(); +base::apple::ScopedMachSendRight SystemCrashReporterHandler(); } // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/mach/bootstrap_test.cc b/shared/sentry/src/external/crashpad/util/mach/bootstrap_test.cc similarity index 78% rename from shared/sentry/external/crashpad/util/mach/bootstrap_test.cc rename to shared/sentry/src/external/crashpad/util/mach/bootstrap_test.cc index a4089bf1d..196f59491 100644 --- a/shared/sentry/external/crashpad/util/mach/bootstrap_test.cc +++ b/shared/sentry/src/external/crashpad/util/mach/bootstrap_test.cc @@ -14,7 +14,7 @@ #include "util/mach/bootstrap.h" -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "gtest/gtest.h" #include "util/mach/mach_extensions.h" #include "util/misc/random_string.h" @@ -25,7 +25,7 @@ namespace { TEST(Bootstrap, BootstrapCheckInAndLookUp) { // This should always exist. - base::mac::ScopedMachSendRight report_crash( + base::apple::ScopedMachSendRight report_crash( BootstrapLookUp("com.apple.ReportCrash")); EXPECT_NE(report_crash, kMachPortNull); @@ -34,11 +34,11 @@ TEST(Bootstrap, BootstrapCheckInAndLookUp) { { // The new service hasn’t checked in yet, so this should fail. - base::mac::ScopedMachSendRight send(BootstrapLookUp(service_name)); + base::apple::ScopedMachSendRight send(BootstrapLookUp(service_name)); EXPECT_EQ(send, kMachPortNull); // Check it in. - base::mac::ScopedMachReceiveRight receive(BootstrapCheckIn(service_name)); + base::apple::ScopedMachReceiveRight receive(BootstrapCheckIn(service_name)); EXPECT_NE(receive, kMachPortNull); // Now it should be possible to look up the new service. @@ -46,21 +46,22 @@ TEST(Bootstrap, BootstrapCheckInAndLookUp) { EXPECT_NE(send, kMachPortNull); // It shouldn’t be possible to check the service in while it’s active. - base::mac::ScopedMachReceiveRight receive_2(BootstrapCheckIn(service_name)); + base::apple::ScopedMachReceiveRight receive_2( + BootstrapCheckIn(service_name)); EXPECT_EQ(receive_2, kMachPortNull); } // The new service should be gone now. - base::mac::ScopedMachSendRight send(BootstrapLookUp(service_name)); + base::apple::ScopedMachSendRight send(BootstrapLookUp(service_name)); EXPECT_EQ(send, kMachPortNull); // It should be possible to check it in again. - base::mac::ScopedMachReceiveRight receive(BootstrapCheckIn(service_name)); + base::apple::ScopedMachReceiveRight receive(BootstrapCheckIn(service_name)); EXPECT_NE(receive, kMachPortNull); } TEST(Bootstrap, SystemCrashReporterHandler) { - base::mac::ScopedMachSendRight system_crash_reporter_handler( + base::apple::ScopedMachSendRight system_crash_reporter_handler( SystemCrashReporterHandler()); EXPECT_TRUE(system_crash_reporter_handler.is_valid()); } diff --git a/shared/sentry/external/crashpad/util/mach/child_port.defs b/shared/sentry/src/external/crashpad/util/mach/child_port.defs similarity index 100% rename from shared/sentry/external/crashpad/util/mach/child_port.defs rename to shared/sentry/src/external/crashpad/util/mach/child_port.defs diff --git a/shared/sentry/external/crashpad/util/mach/child_port_handshake.cc b/shared/sentry/src/external/crashpad/util/mach/child_port_handshake.cc similarity index 98% rename from shared/sentry/external/crashpad/util/mach/child_port_handshake.cc rename to shared/sentry/src/external/crashpad/util/mach/child_port_handshake.cc index 6277a144d..afbf55f19 100644 --- a/shared/sentry/external/crashpad/util/mach/child_port_handshake.cc +++ b/shared/sentry/src/external/crashpad/util/mach/child_port_handshake.cc @@ -27,10 +27,10 @@ #include #include +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" #include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" #include "base/notreached.h" #include "base/posix/eintr_wrapper.h" #include "base/rand_util.h" @@ -113,7 +113,8 @@ mach_port_t ChildPortHandshakeServer::RunServer( // Check the new service in with the bootstrap server, obtaining a receive // right for it. - base::mac::ScopedMachReceiveRight server_port(BootstrapCheckIn(service_name)); + base::apple::ScopedMachReceiveRight server_port( + BootstrapCheckIn(service_name)); CHECK(server_port.is_valid()); // Share the service name with the client via the pipe. @@ -137,7 +138,7 @@ mach_port_t ChildPortHandshakeServer::RunServer( // MACH_PORT_RIGHT_PORT_SET, to 10.12.0 xnu-3789.1.32/osfmk/ipc/ipc_pset.c // filt_machportattach(), which also handles MACH_PORT_TYPE_RECEIVE. Create a // new port set and add the receive right to it. - base::mac::ScopedMachPortSet server_port_set( + base::apple::ScopedMachPortSet server_port_set( NewMachPort(MACH_PORT_RIGHT_PORT_SET)); CHECK(server_port_set.is_valid()); @@ -442,7 +443,7 @@ bool ChildPortHandshake::RunClientInternal_SendCheckIn( mach_msg_type_name_t right_type) { // Get a send right to the server by looking up the service with the bootstrap // server by name. - base::mac::ScopedMachSendRight server_port(BootstrapLookUp(service_name)); + base::apple::ScopedMachSendRight server_port(BootstrapLookUp(service_name)); if (server_port == kMachPortNull) { return false; } diff --git a/shared/sentry/external/crashpad/util/mach/child_port_handshake.h b/shared/sentry/src/external/crashpad/util/mach/child_port_handshake.h similarity index 98% rename from shared/sentry/external/crashpad/util/mach/child_port_handshake.h rename to shared/sentry/src/external/crashpad/util/mach/child_port_handshake.h index 77a177143..9a0b8e104 100644 --- a/shared/sentry/external/crashpad/util/mach/child_port_handshake.h +++ b/shared/sentry/src/external/crashpad/util/mach/child_port_handshake.h @@ -107,7 +107,7 @@ class ChildPortHandshakeTest; //! server_write_fd.reset(); //! //! // Make a new Mach receive right. -//! base::mac::ScopedMachReceiveRight +//! base::apple::ScopedMachReceiveRight //! receive_right(NewMachPort(MACH_PORT_RIGHT_RECEIVE)); //! //! // Make a send right corresponding to the receive right. @@ -118,7 +118,7 @@ class ChildPortHandshakeTest; //! MACH_MSG_TYPE_MAKE_SEND, //! &send_right, //! &send_right_type); -//! base::mac::ScopedMachSendRight send_right_owner(send_right); +//! base::apple::ScopedMachSendRight send_right_owner(send_right); //! //! // Send the receive right to the child process, retaining the send right //! // for use in the parent process. @@ -136,7 +136,7 @@ class ChildPortHandshakeTest; //! base::ScopedFD server_write_fd(atoi(argv[1])); //! //! // Obtain a receive right from the parent process. -//! base::mac::ScopedMachReceiveRight receive_right( +//! base::apple::ScopedMachReceiveRight receive_right( //! ChildPortHandshake::RunServerForFD( //! std::move(server_write_fd), //! ChildPortHandshake::PortRightType::kReceiveRight)); diff --git a/shared/sentry/external/crashpad/util/mach/child_port_handshake_test.cc b/shared/sentry/src/external/crashpad/util/mach/child_port_handshake_test.cc similarity index 97% rename from shared/sentry/external/crashpad/util/mach/child_port_handshake_test.cc rename to shared/sentry/src/external/crashpad/util/mach/child_port_handshake_test.cc index fc85f5590..e8fe91b72 100644 --- a/shared/sentry/external/crashpad/util/mach/child_port_handshake_test.cc +++ b/shared/sentry/src/external/crashpad/util/mach/child_port_handshake_test.cc @@ -14,7 +14,7 @@ #include "util/mach/child_port_handshake.h" -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "gtest/gtest.h" #include "test/multiprocess.h" #include "util/mach/child_port_types.h" @@ -99,8 +99,8 @@ class ChildPortHandshakeTest : public Multiprocess { return; } - base::mac::ScopedMachReceiveRight receive_right; - base::mac::ScopedMachSendRight send_right; + base::apple::ScopedMachReceiveRight receive_right; + base::apple::ScopedMachSendRight send_right; if (test_type_ == TestType::kClientChecksIn_ReceiveRight) { receive_right.reset(child_port_handshake_.RunServer( ChildPortHandshake::PortRightType::kReceiveRight)); @@ -152,7 +152,7 @@ class ChildPortHandshakeTest : public Multiprocess { } case TestType::kClientChecksIn_SendOnceRight: { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(child_port_handshake_.RunClient( receive_right.get(), MACH_MSG_TYPE_MAKE_SEND_ONCE)); @@ -372,7 +372,7 @@ TEST(ChildPortHandshake, NoClient) { // is similar to kClientDoesNotCheckIn, but because there’s no client at all, // the server is guaranteed to see that its pipe partner is gone. ChildPortHandshake child_port_handshake; - base::mac::ScopedMachSendRight child_port(child_port_handshake.RunServer( + base::apple::ScopedMachSendRight child_port(child_port_handshake.RunServer( ChildPortHandshake::PortRightType::kSendRight)); EXPECT_FALSE(child_port.is_valid()); } diff --git a/shared/sentry/external/crashpad/util/mach/child_port_server.cc b/shared/sentry/src/external/crashpad/util/mach/child_port_server.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/child_port_server.cc rename to shared/sentry/src/external/crashpad/util/mach/child_port_server.cc diff --git a/shared/sentry/external/crashpad/util/mach/child_port_server.h b/shared/sentry/src/external/crashpad/util/mach/child_port_server.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/child_port_server.h rename to shared/sentry/src/external/crashpad/util/mach/child_port_server.h diff --git a/shared/sentry/external/crashpad/util/mach/child_port_server_test.cc b/shared/sentry/src/external/crashpad/util/mach/child_port_server_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/child_port_server_test.cc rename to shared/sentry/src/external/crashpad/util/mach/child_port_server_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/child_port_types.h b/shared/sentry/src/external/crashpad/util/mach/child_port_types.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/child_port_types.h rename to shared/sentry/src/external/crashpad/util/mach/child_port_types.h diff --git a/shared/sentry/external/crashpad/util/mach/composite_mach_message_server.cc b/shared/sentry/src/external/crashpad/util/mach/composite_mach_message_server.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/composite_mach_message_server.cc rename to shared/sentry/src/external/crashpad/util/mach/composite_mach_message_server.cc diff --git a/shared/sentry/external/crashpad/util/mach/composite_mach_message_server.h b/shared/sentry/src/external/crashpad/util/mach/composite_mach_message_server.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/composite_mach_message_server.h rename to shared/sentry/src/external/crashpad/util/mach/composite_mach_message_server.h diff --git a/shared/sentry/external/crashpad/util/mach/composite_mach_message_server_test.cc b/shared/sentry/src/external/crashpad/util/mach/composite_mach_message_server_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/composite_mach_message_server_test.cc rename to shared/sentry/src/external/crashpad/util/mach/composite_mach_message_server_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/exc_client_variants.cc b/shared/sentry/src/external/crashpad/util/mach/exc_client_variants.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exc_client_variants.cc rename to shared/sentry/src/external/crashpad/util/mach/exc_client_variants.cc diff --git a/shared/sentry/external/crashpad/util/mach/exc_client_variants.h b/shared/sentry/src/external/crashpad/util/mach/exc_client_variants.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exc_client_variants.h rename to shared/sentry/src/external/crashpad/util/mach/exc_client_variants.h diff --git a/shared/sentry/external/crashpad/util/mach/exc_client_variants_test.cc b/shared/sentry/src/external/crashpad/util/mach/exc_client_variants_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exc_client_variants_test.cc rename to shared/sentry/src/external/crashpad/util/mach/exc_client_variants_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/exc_server_variants.cc b/shared/sentry/src/external/crashpad/util/mach/exc_server_variants.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exc_server_variants.cc rename to shared/sentry/src/external/crashpad/util/mach/exc_server_variants.cc diff --git a/shared/sentry/external/crashpad/util/mach/exc_server_variants.h b/shared/sentry/src/external/crashpad/util/mach/exc_server_variants.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exc_server_variants.h rename to shared/sentry/src/external/crashpad/util/mach/exc_server_variants.h diff --git a/shared/sentry/external/crashpad/util/mach/exc_server_variants_test.cc b/shared/sentry/src/external/crashpad/util/mach/exc_server_variants_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exc_server_variants_test.cc rename to shared/sentry/src/external/crashpad/util/mach/exc_server_variants_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/exception_behaviors.cc b/shared/sentry/src/external/crashpad/util/mach/exception_behaviors.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exception_behaviors.cc rename to shared/sentry/src/external/crashpad/util/mach/exception_behaviors.cc diff --git a/shared/sentry/external/crashpad/util/mach/exception_behaviors.h b/shared/sentry/src/external/crashpad/util/mach/exception_behaviors.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exception_behaviors.h rename to shared/sentry/src/external/crashpad/util/mach/exception_behaviors.h diff --git a/shared/sentry/external/crashpad/util/mach/exception_behaviors_test.cc b/shared/sentry/src/external/crashpad/util/mach/exception_behaviors_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exception_behaviors_test.cc rename to shared/sentry/src/external/crashpad/util/mach/exception_behaviors_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/exception_ports.cc b/shared/sentry/src/external/crashpad/util/mach/exception_ports.cc similarity index 99% rename from shared/sentry/external/crashpad/util/mach/exception_ports.cc rename to shared/sentry/src/external/crashpad/util/mach/exception_ports.cc index 1184045c3..b983cc6c5 100644 --- a/shared/sentry/external/crashpad/util/mach/exception_ports.cc +++ b/shared/sentry/src/external/crashpad/util/mach/exception_ports.cc @@ -14,8 +14,8 @@ #include "util/mach/exception_ports.h" +#include "base/apple/mach_logging.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "base/notreached.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/util/mach/exception_ports.h b/shared/sentry/src/external/crashpad/util/mach/exception_ports.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exception_ports.h rename to shared/sentry/src/external/crashpad/util/mach/exception_ports.h diff --git a/shared/sentry/external/crashpad/util/mach/exception_ports_test.cc b/shared/sentry/src/external/crashpad/util/mach/exception_ports_test.cc similarity index 98% rename from shared/sentry/external/crashpad/util/mach/exception_ports_test.cc rename to shared/sentry/src/external/crashpad/util/mach/exception_ports_test.cc index f6a886727..b37a99a24 100644 --- a/shared/sentry/external/crashpad/util/mach/exception_ports_test.cc +++ b/shared/sentry/src/external/crashpad/util/mach/exception_ports_test.cc @@ -19,9 +19,9 @@ #include #include +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" #include "base/check.h" -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" #include "base/notreached.h" #include "build/build_config.h" #include "gtest/gtest.h" @@ -444,8 +444,8 @@ class TestExceptionPorts : public MachMultiprocess, ScopedForbidReturn threads_need_owners; ASSERT_EQ(thread_count, 2u); - base::mac::ScopedMachSendRight main_thread(threads[0]); - base::mac::ScopedMachSendRight other_thread(threads[1]); + base::apple::ScopedMachSendRight main_thread(threads[0]); + base::apple::ScopedMachSendRight other_thread(threads[1]); threads_need_owners.Disarm(); ExceptionPorts main_thread_ports(ExceptionPorts::kTargetTypeThread, @@ -467,7 +467,7 @@ class TestExceptionPorts : public MachMultiprocess, mach_task_self(), local_port, local_port, MACH_MSG_TYPE_MAKE_SEND); ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "mach_port_insert_right"); - base::mac::ScopedMachSendRight send_owner(local_port); + base::apple::ScopedMachSendRight send_owner(local_port); switch (set_or_swap_) { case kSetExceptionPort: { @@ -819,7 +819,7 @@ TEST(ExceptionPorts, HostExceptionPorts) { const bool expect_success = geteuid() == 0; - base::mac::ScopedMachSendRight host(mach_host_self()); + base::apple::ScopedMachSendRight host(mach_host_self()); ExceptionPorts explicit_host_ports(ExceptionPorts::kTargetTypeHost, host.get()); EXPECT_STREQ("host", explicit_host_ports.TargetTypeName()); diff --git a/shared/sentry/external/crashpad/util/mach/exception_types.cc b/shared/sentry/src/external/crashpad/util/mach/exception_types.cc similarity index 99% rename from shared/sentry/external/crashpad/util/mach/exception_types.cc rename to shared/sentry/src/external/crashpad/util/mach/exception_types.cc index c050b2856..e73b7c8be 100644 --- a/shared/sentry/external/crashpad/util/mach/exception_types.cc +++ b/shared/sentry/src/external/crashpad/util/mach/exception_types.cc @@ -21,9 +21,9 @@ #include #include +#include "base/apple/mach_logging.h" #include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "util/mac/mac_util.h" #include "util/mach/mach_extensions.h" #include "util/misc/no_cfi_icall.h" diff --git a/shared/sentry/external/crashpad/util/mach/exception_types.h b/shared/sentry/src/external/crashpad/util/mach/exception_types.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exception_types.h rename to shared/sentry/src/external/crashpad/util/mach/exception_types.h diff --git a/shared/sentry/external/crashpad/util/mach/exception_types_test.cc b/shared/sentry/src/external/crashpad/util/mach/exception_types_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/exception_types_test.cc rename to shared/sentry/src/external/crashpad/util/mach/exception_types_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/mach_extensions.cc b/shared/sentry/src/external/crashpad/util/mach/mach_extensions.cc similarity index 99% rename from shared/sentry/external/crashpad/util/mach/mach_extensions.cc rename to shared/sentry/src/external/crashpad/util/mach/mach_extensions.cc index 885d6074a..463d364a0 100644 --- a/shared/sentry/external/crashpad/util/mach/mach_extensions.cc +++ b/shared/sentry/src/external/crashpad/util/mach/mach_extensions.cc @@ -17,7 +17,7 @@ #include #include -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" #include "build/build_config.h" #include "util/mac/mac_util.h" diff --git a/shared/sentry/external/crashpad/util/mach/mach_extensions.h b/shared/sentry/src/external/crashpad/util/mach/mach_extensions.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/mach_extensions.h rename to shared/sentry/src/external/crashpad/util/mach/mach_extensions.h diff --git a/shared/sentry/external/crashpad/util/mach/mach_extensions_test.cc b/shared/sentry/src/external/crashpad/util/mach/mach_extensions_test.cc similarity index 92% rename from shared/sentry/external/crashpad/util/mach/mach_extensions_test.cc rename to shared/sentry/src/external/crashpad/util/mach/mach_extensions_test.cc index 0314b6989..31042f7ca 100644 --- a/shared/sentry/external/crashpad/util/mach/mach_extensions_test.cc +++ b/shared/sentry/src/external/crashpad/util/mach/mach_extensions_test.cc @@ -14,7 +14,7 @@ #include "util/mach/mach_extensions.h" -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "test/mac/mach_errors.h" @@ -25,12 +25,13 @@ namespace test { namespace { TEST(MachExtensions, MachThreadSelf) { - base::mac::ScopedMachSendRight thread_self(mach_thread_self()); + base::apple::ScopedMachSendRight thread_self(mach_thread_self()); EXPECT_EQ(MachThreadSelf(), thread_self); } TEST(MachExtensions, NewMachPort_Receive) { - base::mac::ScopedMachReceiveRight port(NewMachPort(MACH_PORT_RIGHT_RECEIVE)); + base::apple::ScopedMachReceiveRight port( + NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_NE(port, kMachPortNull); mach_port_type_t type; @@ -41,7 +42,7 @@ TEST(MachExtensions, NewMachPort_Receive) { } TEST(MachExtensions, NewMachPort_PortSet) { - base::mac::ScopedMachPortSet port(NewMachPort(MACH_PORT_RIGHT_PORT_SET)); + base::apple::ScopedMachPortSet port(NewMachPort(MACH_PORT_RIGHT_PORT_SET)); ASSERT_NE(port, kMachPortNull); mach_port_type_t type; @@ -52,7 +53,7 @@ TEST(MachExtensions, NewMachPort_PortSet) { } TEST(MachExtensions, NewMachPort_DeadName) { - base::mac::ScopedMachSendRight port(NewMachPort(MACH_PORT_RIGHT_DEAD_NAME)); + base::apple::ScopedMachSendRight port(NewMachPort(MACH_PORT_RIGHT_DEAD_NAME)); ASSERT_NE(port, kMachPortNull); mach_port_type_t type; diff --git a/shared/sentry/external/crashpad/util/mach/mach_message.cc b/shared/sentry/src/external/crashpad/util/mach/mach_message.cc similarity index 99% rename from shared/sentry/external/crashpad/util/mach/mach_message.cc rename to shared/sentry/src/external/crashpad/util/mach/mach_message.cc index 008724fb4..28e422791 100644 --- a/shared/sentry/external/crashpad/util/mach/mach_message.cc +++ b/shared/sentry/src/external/crashpad/util/mach/mach_message.cc @@ -18,8 +18,8 @@ #include +#include "base/apple/mach_logging.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "build/build_config.h" #include "util/misc/clock.h" #include "util/misc/implicit_cast.h" diff --git a/shared/sentry/external/crashpad/util/mach/mach_message.h b/shared/sentry/src/external/crashpad/util/mach/mach_message.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/mach_message.h rename to shared/sentry/src/external/crashpad/util/mach/mach_message.h diff --git a/shared/sentry/external/crashpad/util/mach/mach_message_server.cc b/shared/sentry/src/external/crashpad/util/mach/mach_message_server.cc similarity index 98% rename from shared/sentry/external/crashpad/util/mach/mach_message_server.cc rename to shared/sentry/src/external/crashpad/util/mach/mach_message_server.cc index e1529c66a..b4509a9a3 100644 --- a/shared/sentry/external/crashpad/util/mach/mach_message_server.cc +++ b/shared/sentry/src/external/crashpad/util/mach/mach_message_server.cc @@ -18,9 +18,10 @@ #include +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_vm.h" +#include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_vm.h" #include "util/mach/mach_message.h" namespace crashpad { @@ -83,7 +84,7 @@ class MachMessageBuffer { } private: - base::mac::ScopedMachVM vm_; + base::apple::ScopedMachVM vm_; }; // Wraps MachMessageWithDeadline(), using a MachMessageBuffer argument which diff --git a/shared/sentry/external/crashpad/util/mach/mach_message_server.h b/shared/sentry/src/external/crashpad/util/mach/mach_message_server.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/mach_message_server.h rename to shared/sentry/src/external/crashpad/util/mach/mach_message_server.h diff --git a/shared/sentry/external/crashpad/util/mach/mach_message_server_test.cc b/shared/sentry/src/external/crashpad/util/mach/mach_message_server_test.cc similarity index 99% rename from shared/sentry/external/crashpad/util/mach/mach_message_server_test.cc rename to shared/sentry/src/external/crashpad/util/mach/mach_message_server_test.cc index dd6c1b2c3..335aa7bfd 100644 --- a/shared/sentry/external/crashpad/util/mach/mach_message_server_test.cc +++ b/shared/sentry/src/external/crashpad/util/mach/mach_message_server_test.cc @@ -22,7 +22,7 @@ #include #include -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "gtest/gtest.h" #include "test/mac/mach_errors.h" #include "test/mac/mach_multiprocess.h" @@ -445,7 +445,7 @@ class TestMachMessageServer : public MachMessageServer::Interface, // local_receive_port_owner will the receive right that is created in this // scope and intended to be destroyed when leaving this scope, after it has // been carried in a Mach message. - base::mac::ScopedMachReceiveRight local_receive_port_owner; + base::apple::ScopedMachReceiveRight local_receive_port_owner; // A LargeRequestMessage is always allocated, but the message that will be // sent will be a normal RequestMessage due to the msgh_size field @@ -582,7 +582,7 @@ class TestMachMessageServer : public MachMessageServer::Interface, // A receive right allocated in the child process. A send right will be // created from this right and sent to the parent parent process in the // request message. - base::mac::ScopedMachReceiveRight child_complex_message_port_; + base::apple::ScopedMachReceiveRight child_complex_message_port_; // The send right received in the parent process. This right is stored in a // member variable to test that resources carried in complex messages are diff --git a/shared/sentry/external/crashpad/util/mach/mach_message_test.cc b/shared/sentry/src/external/crashpad/util/mach/mach_message_test.cc similarity index 97% rename from shared/sentry/external/crashpad/util/mach/mach_message_test.cc rename to shared/sentry/src/external/crashpad/util/mach/mach_message_test.cc index b77781325..5698179ea 100644 --- a/shared/sentry/external/crashpad/util/mach/mach_message_test.cc +++ b/shared/sentry/src/external/crashpad/util/mach/mach_message_test.cc @@ -18,7 +18,7 @@ #include -#include "base/mac/scoped_mach_port.h" +#include "base/apple/scoped_mach_port.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "test/mac/mach_errors.h" @@ -116,7 +116,7 @@ TEST(MachMessage, MachMessageDestroyReceivedPort) { ASSERT_NE(port, kMachPortNull); EXPECT_TRUE(MachMessageDestroyReceivedPort(port, MACH_MSG_TYPE_PORT_RECEIVE)); - base::mac::ScopedMachReceiveRight receive( + base::apple::ScopedMachReceiveRight receive( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); mach_msg_type_name_t right_type; kern_return_t kr = mach_port_extract_right(mach_task_self(), @@ -163,7 +163,8 @@ TEST(MachMessage, MachMessageDestroyReceivedPort) { #if BUILDFLAG(IS_MAC) TEST(MachMessage, AuditPIDFromMachMessageTrailer) { - base::mac::ScopedMachReceiveRight port(NewMachPort(MACH_PORT_RIGHT_RECEIVE)); + base::apple::ScopedMachReceiveRight port( + NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_NE(port, kMachPortNull); mach_msg_empty_send_t send = {}; diff --git a/shared/sentry/external/crashpad/util/mach/mig.py b/shared/sentry/src/external/crashpad/util/mach/mig.py similarity index 100% rename from shared/sentry/external/crashpad/util/mach/mig.py rename to shared/sentry/src/external/crashpad/util/mach/mig.py diff --git a/shared/sentry/external/crashpad/util/mach/mig_fix.py b/shared/sentry/src/external/crashpad/util/mach/mig_fix.py similarity index 100% rename from shared/sentry/external/crashpad/util/mach/mig_fix.py rename to shared/sentry/src/external/crashpad/util/mach/mig_fix.py diff --git a/shared/sentry/external/crashpad/util/mach/mig_gen.py b/shared/sentry/src/external/crashpad/util/mach/mig_gen.py similarity index 100% rename from shared/sentry/external/crashpad/util/mach/mig_gen.py rename to shared/sentry/src/external/crashpad/util/mach/mig_gen.py diff --git a/shared/sentry/external/crashpad/util/mach/notify_server.cc b/shared/sentry/src/external/crashpad/util/mach/notify_server.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/notify_server.cc rename to shared/sentry/src/external/crashpad/util/mach/notify_server.cc diff --git a/shared/sentry/external/crashpad/util/mach/notify_server.h b/shared/sentry/src/external/crashpad/util/mach/notify_server.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/notify_server.h rename to shared/sentry/src/external/crashpad/util/mach/notify_server.h diff --git a/shared/sentry/external/crashpad/util/mach/notify_server_test.cc b/shared/sentry/src/external/crashpad/util/mach/notify_server_test.cc similarity index 95% rename from shared/sentry/external/crashpad/util/mach/notify_server_test.cc rename to shared/sentry/src/external/crashpad/util/mach/notify_server_test.cc index 324439ed7..2c9e7e6ad 100644 --- a/shared/sentry/external/crashpad/util/mach/notify_server_test.cc +++ b/shared/sentry/src/external/crashpad/util/mach/notify_server_test.cc @@ -16,8 +16,8 @@ #include +#include "base/apple/scoped_mach_port.h" #include "base/compiler_specific.h" -#include "base/mac/scoped_mach_port.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "test/mac/mach_errors.h" @@ -234,7 +234,7 @@ class NotifyServerTestBase : public testing::Test, return false; } - base::mac::ScopedMachSendRight previous_owner(previous); + base::apple::ScopedMachSendRight previous_owner(previous); EXPECT_EQ(previous, kMachPortNull); return true; @@ -284,7 +284,7 @@ class NotifyServerTestBase : public testing::Test, void TearDown() override { server_port_.reset(); } private: - base::mac::ScopedMachReceiveRight server_port_; + base::apple::ScopedMachReceiveRight server_port_; }; using NotifyServerTest = StrictMock; @@ -319,11 +319,11 @@ TEST_F(NotifyServerTest, NoNotification) { // When a send-once right with a dead-name notification request is deallocated, // a port-deleted notification should be generated. TEST_F(NotifyServerTest, MachNotifyPortDeleted) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); - base::mac::ScopedMachSendRight send_once_right( + base::apple::ScopedMachSendRight send_once_right( SendOnceRightFromReceiveRight(receive_right.get())); ASSERT_TRUE(send_once_right.is_valid()); @@ -346,7 +346,7 @@ TEST_F(NotifyServerTest, MachNotifyPortDeleted) { // When a receive right with a port-destroyed notification request is destroyed, // a port-destroyed notification should be generated. TEST_F(NotifyServerTest, MachNotifyPortDestroyed) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); @@ -370,7 +370,7 @@ TEST_F(NotifyServerTest, MachNotifyPortDestroyed) { // When a receive right with a port-destroyed notification request is not // destroyed, no port-destroyed notification should be generated. TEST_F(NotifyServerTest, MachNotifyPortDestroyed_NoNotification) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); @@ -383,7 +383,7 @@ TEST_F(NotifyServerTest, MachNotifyPortDestroyed_NoNotification) { // When a no-senders notification request is registered for a receive right with // no senders, a no-senders notification should be generated. TEST_F(NotifyServerTest, MachNotifyNoSenders_NoSendRight) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); @@ -403,11 +403,11 @@ TEST_F(NotifyServerTest, MachNotifyNoSenders_NoSendRight) { // notification request is deallocated, a no-senders notification should be // generated. TEST_F(NotifyServerTest, MachNotifyNoSenders_SendRightDeallocated) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); - base::mac::ScopedMachSendRight send_right( + base::apple::ScopedMachSendRight send_right( SendRightFromReceiveRight(receive_right.get())); ASSERT_TRUE(send_right.is_valid()); @@ -428,15 +428,15 @@ TEST_F(NotifyServerTest, MachNotifyNoSenders_SendRightDeallocated) { // When the a receive right with a no-senders notification request never loses // all senders, no no-senders notification should be generated. TEST_F(NotifyServerTest, MachNotifyNoSenders_NoNotification) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); - base::mac::ScopedMachSendRight send_right_0( + base::apple::ScopedMachSendRight send_right_0( SendRightFromReceiveRight(receive_right.get())); ASSERT_TRUE(send_right_0.is_valid()); - base::mac::ScopedMachSendRight send_right_1( + base::apple::ScopedMachSendRight send_right_1( SendRightFromReceiveRight(receive_right.get())); ASSERT_TRUE(send_right_1.is_valid()); @@ -454,7 +454,7 @@ TEST_F(NotifyServerTest, MachNotifyNoSenders_NoNotification) { // When a send-once right is deallocated without being used, a send-once // notification notification should be sent via the send-once right. TEST_F(NotifyServerTest, MachNotifySendOnce_ExplicitDeallocation) { - base::mac::ScopedMachSendRight send_once_right( + base::apple::ScopedMachSendRight send_once_right( SendOnceRightFromReceiveRight(ServerPort())); ASSERT_TRUE(send_once_right.is_valid()); @@ -473,7 +473,7 @@ TEST_F(NotifyServerTest, MachNotifySendOnce_ExplicitDeallocation) { // the send-once right is destroyed, and a send-once notification should appear // on the reply port. TEST_F(NotifyServerTest, MachNotifySendOnce_ImplicitDeallocation) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); @@ -507,11 +507,11 @@ TEST_F(NotifyServerTest, MachNotifySendOnce_ImplicitDeallocation) { // notification request is destroyed, a dead-name notification should be // generated. TEST_F(NotifyServerTest, MachNotifyDeadName) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); - base::mac::ScopedMachSendRight send_once_right( + base::apple::ScopedMachSendRight send_once_right( SendOnceRightFromReceiveRight(receive_right.get())); ASSERT_TRUE(send_once_right.is_valid()); @@ -546,11 +546,11 @@ TEST_F(NotifyServerTest, MachNotifyDeadName) { // notification request is not destroyed, no dead-name notification should be // generated. TEST_F(NotifyServerTest, MachNotifyDeadName_NoNotification) { - base::mac::ScopedMachReceiveRight receive_right( + base::apple::ScopedMachReceiveRight receive_right( NewMachPort(MACH_PORT_RIGHT_RECEIVE)); ASSERT_TRUE(receive_right.is_valid()); - base::mac::ScopedMachSendRight send_once_right( + base::apple::ScopedMachSendRight send_once_right( SendOnceRightFromReceiveRight(receive_right.get())); ASSERT_TRUE(send_once_right.is_valid()); diff --git a/shared/sentry/external/crashpad/util/mach/scoped_task_suspend.cc b/shared/sentry/src/external/crashpad/util/mach/scoped_task_suspend.cc similarity index 96% rename from shared/sentry/external/crashpad/util/mach/scoped_task_suspend.cc rename to shared/sentry/src/external/crashpad/util/mach/scoped_task_suspend.cc index b91a16a60..67cad4f1e 100644 --- a/shared/sentry/external/crashpad/util/mach/scoped_task_suspend.cc +++ b/shared/sentry/src/external/crashpad/util/mach/scoped_task_suspend.cc @@ -14,9 +14,9 @@ #include "util/mach/scoped_task_suspend.h" +#include "base/apple/mach_logging.h" #include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/util/mach/scoped_task_suspend.h b/shared/sentry/src/external/crashpad/util/mach/scoped_task_suspend.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/scoped_task_suspend.h rename to shared/sentry/src/external/crashpad/util/mach/scoped_task_suspend.h diff --git a/shared/sentry/external/crashpad/util/mach/scoped_task_suspend_test.cc b/shared/sentry/src/external/crashpad/util/mach/scoped_task_suspend_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/scoped_task_suspend_test.cc rename to shared/sentry/src/external/crashpad/util/mach/scoped_task_suspend_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/symbolic_constants_mach.cc b/shared/sentry/src/external/crashpad/util/mach/symbolic_constants_mach.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/symbolic_constants_mach.cc rename to shared/sentry/src/external/crashpad/util/mach/symbolic_constants_mach.cc diff --git a/shared/sentry/external/crashpad/util/mach/symbolic_constants_mach.h b/shared/sentry/src/external/crashpad/util/mach/symbolic_constants_mach.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/symbolic_constants_mach.h rename to shared/sentry/src/external/crashpad/util/mach/symbolic_constants_mach.h diff --git a/shared/sentry/external/crashpad/util/mach/symbolic_constants_mach_test.cc b/shared/sentry/src/external/crashpad/util/mach/symbolic_constants_mach_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/mach/symbolic_constants_mach_test.cc rename to shared/sentry/src/external/crashpad/util/mach/symbolic_constants_mach_test.cc diff --git a/shared/sentry/external/crashpad/util/mach/task_for_pid.cc b/shared/sentry/src/external/crashpad/util/mach/task_for_pid.cc similarity index 97% rename from shared/sentry/external/crashpad/util/mach/task_for_pid.cc rename to shared/sentry/src/external/crashpad/util/mach/task_for_pid.cc index 08e031d70..5827dc45e 100644 --- a/shared/sentry/external/crashpad/util/mach/task_for_pid.cc +++ b/shared/sentry/src/external/crashpad/util/mach/task_for_pid.cc @@ -21,8 +21,8 @@ #include #include -#include "base/mac/mach_logging.h" -#include "base/mac/scoped_mach_port.h" +#include "base/apple/mach_logging.h" +#include "base/apple/scoped_mach_port.h" #include "util/posix/process_info.h" namespace crashpad { @@ -154,7 +154,7 @@ task_t TaskForPID(pid_t pid) { return TASK_NULL; } - base::mac::ScopedMachSendRight task_owner(task); + base::apple::ScopedMachSendRight task_owner(task); if (!TaskForPIDCheck(task)) { return TASK_NULL; diff --git a/shared/sentry/external/crashpad/util/mach/task_for_pid.h b/shared/sentry/src/external/crashpad/util/mach/task_for_pid.h similarity index 100% rename from shared/sentry/external/crashpad/util/mach/task_for_pid.h rename to shared/sentry/src/external/crashpad/util/mach/task_for_pid.h diff --git a/shared/sentry/external/crashpad/util/misc/address_sanitizer.h b/shared/sentry/src/external/crashpad/util/misc/address_sanitizer.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/address_sanitizer.h rename to shared/sentry/src/external/crashpad/util/misc/address_sanitizer.h diff --git a/shared/sentry/external/crashpad/util/misc/address_types.h b/shared/sentry/src/external/crashpad/util/misc/address_types.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/address_types.h rename to shared/sentry/src/external/crashpad/util/misc/address_types.h diff --git a/shared/sentry/external/crashpad/util/misc/arm64_pac_bti.S b/shared/sentry/src/external/crashpad/util/misc/arm64_pac_bti.S similarity index 100% rename from shared/sentry/external/crashpad/util/misc/arm64_pac_bti.S rename to shared/sentry/src/external/crashpad/util/misc/arm64_pac_bti.S diff --git a/shared/sentry/external/crashpad/util/misc/arraysize.h b/shared/sentry/src/external/crashpad/util/misc/arraysize.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/arraysize.h rename to shared/sentry/src/external/crashpad/util/misc/arraysize.h diff --git a/shared/sentry/external/crashpad/util/misc/arraysize_test.cc b/shared/sentry/src/external/crashpad/util/misc/arraysize_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/arraysize_test.cc rename to shared/sentry/src/external/crashpad/util/misc/arraysize_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/as_underlying_type.h b/shared/sentry/src/external/crashpad/util/misc/as_underlying_type.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/as_underlying_type.h rename to shared/sentry/src/external/crashpad/util/misc/as_underlying_type.h diff --git a/shared/sentry/external/crashpad/util/misc/capture_context.h b/shared/sentry/src/external/crashpad/util/misc/capture_context.h similarity index 91% rename from shared/sentry/external/crashpad/util/misc/capture_context.h rename to shared/sentry/src/external/crashpad/util/misc/capture_context.h index a5503d682..ac7707b48 100644 --- a/shared/sentry/external/crashpad/util/misc/capture_context.h +++ b/shared/sentry/src/external/crashpad/util/misc/capture_context.h @@ -23,8 +23,6 @@ #include #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) #include -#elif BUILDFLAG(IS_FUCHSIA) -#include #endif // BUILDFLAG(IS_APPLE) namespace crashpad { @@ -37,8 +35,7 @@ using NativeCPUContext = arm_unified_thread_state; #endif #elif BUILDFLAG(IS_WIN) using NativeCPUContext = CONTEXT; -#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \ - BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) +#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) using NativeCPUContext = ucontext_t; #endif // BUILDFLAG(IS_APPLE) @@ -57,6 +54,9 @@ using NativeCPUContext = ucontext_t; //! `RtlCaptureContext()` capture only the state of the integer registers, //! ignoring floating-point and vector state. //! +//! CaptureContext isn't used on Fuchsia, nor does a concept of `ucontext_t` +//! exist on Fuchsia. +//! //! \param[out] cpu_context The structure to store the context in. //! //! \note The ABI may require that this function's argument is passed by @@ -66,9 +66,10 @@ using NativeCPUContext = ucontext_t; //! OS | Architecture | Register //! --------------------|--------------|--------- //! Win | x86_64 | `%%rcx` -//! macOS/Linux/Fuchsia | x86_64 | `%%rdi` +//! macOS/Linux | x86_64 | `%%rdi` //! Linux | ARM/ARM64 | `r0`/`x0` //! Linux | MIPS/MIPS64 | `$a0` +//! Linux | RISCV64 | `a0` //! //! Additionally, the value `LR` on ARM/ARM64 will be the return address of //! this function. diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_linux.S b/shared/sentry/src/external/crashpad/util/misc/capture_context_linux.S similarity index 82% rename from shared/sentry/external/crashpad/util/misc/capture_context_linux.S rename to shared/sentry/src/external/crashpad/util/misc/capture_context_linux.S index 9c3a72638..cfad85738 100644 --- a/shared/sentry/external/crashpad/util/misc/capture_context_linux.S +++ b/shared/sentry/src/external/crashpad/util/misc/capture_context_linux.S @@ -36,6 +36,8 @@ .type CAPTURECONTEXT_SYMBOL2, %function #elif defined(__mips__) .balign 4, 0x0 +#elif defined(__riscv) + .balign 4, 0x0 #endif CAPTURECONTEXT_SYMBOL: @@ -427,4 +429,85 @@ CAPTURECONTEXT_SYMBOL2: jr $ra .set at + +#elif defined(__riscv) + + #define MCONTEXT_GREGS_OFFSET 176 + + // x1/ra is the return address. Store it as the pc. + // The original x10/a0 can't be recovered. + sd x1, (0 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x1, (1 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x2, (2 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x3, (3 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x4, (4 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x5, (5 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x6, (6 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x7, (7 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x8, (8 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x9, (9 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x10, (10 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x11, (11 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x12, (12 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x13, (13 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x14, (14 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x15, (15 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x16, (16 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x17, (17 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x18, (18 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x19, (19 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x20, (20 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x21, (21 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x22, (22 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x23, (23 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x24, (24 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x25, (25 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x26, (26 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x27, (27 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x28, (28 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x29, (29 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x30, (30 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + sd x31, (31 * 8 + MCONTEXT_GREGS_OFFSET)(a0) + + #define MCONTEXT_FPREGS_OFFSET MCONTEXT_GREGS_OFFSET + 32*8 + + // Use x31/t6 as scratch register. + frcsr x31 + sw x31, (32 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + + fsd f0, (0 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f1, (1 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f2, (2 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f3, (3 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f4, (4 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f5, (5 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f6, (6 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f7, (7 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f8, (8 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f9, (9 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f10, (10 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f11, (11 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f12, (12 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f13, (13 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f14, (14 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f15, (15 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f16, (16 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f17, (17 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f18, (18 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f19, (19 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f20, (20 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f21, (21 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f22, (22 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f23, (23 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f24, (24 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f25, (25 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f26, (26 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f27, (27 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f28, (28 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f29, (29 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f30, (30 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + fsd f31, (31 * 8 + MCONTEXT_FPREGS_OFFSET)(a0) + + ret + #endif // __i386__ diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_mac.S b/shared/sentry/src/external/crashpad/util/misc/capture_context_mac.S similarity index 100% rename from shared/sentry/external/crashpad/util/misc/capture_context_mac.S rename to shared/sentry/src/external/crashpad/util/misc/capture_context_mac.S diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_test.cc b/shared/sentry/src/external/crashpad/util/misc/capture_context_test.cc similarity index 89% rename from shared/sentry/external/crashpad/util/misc/capture_context_test.cc rename to shared/sentry/src/external/crashpad/util/misc/capture_context_test.cc index f353aebe6..2cd92c841 100644 --- a/shared/sentry/external/crashpad/util/misc/capture_context_test.cc +++ b/shared/sentry/src/external/crashpad/util/misc/capture_context_test.cc @@ -28,15 +28,6 @@ namespace crashpad { namespace test { namespace { -#if BUILDFLAG(IS_FUCHSIA) -// Fuchsia uses -fsanitize=safe-stack by default, which splits local variables -// and the call stack into separate regions (see -// https://clang.llvm.org/docs/SafeStack.html). Because this test would like to -// find an approximately valid stack pointer by comparing locals to the -// captured one, disable safe-stack for this function. -__attribute__((no_sanitize("safe-stack"))) -#endif // BUILDFLAG(IS_FUCHSIA) - #if defined(MEMORY_SANITIZER) // CaptureContext() calls inline assembly and is incompatible with MSan. __attribute__((no_sanitize("memory"))) diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_test_util.h b/shared/sentry/src/external/crashpad/util/misc/capture_context_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/capture_context_test_util.h rename to shared/sentry/src/external/crashpad/util/misc/capture_context_test_util.h diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_test_util_linux.cc b/shared/sentry/src/external/crashpad/util/misc/capture_context_test_util_linux.cc similarity index 89% rename from shared/sentry/external/crashpad/util/misc/capture_context_test_util_linux.cc rename to shared/sentry/src/external/crashpad/util/misc/capture_context_test_util_linux.cc index 35751bf8b..55820b9ee 100644 --- a/shared/sentry/external/crashpad/util/misc/capture_context_test_util_linux.cc +++ b/shared/sentry/src/external/crashpad/util/misc/capture_context_test_util_linux.cc @@ -35,6 +35,9 @@ void SanityCheckContext(const NativeCPUContext& context) { EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast(&context)); #elif defined(ARCH_CPU_MIPS_FAMILY) EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast(&context)); +#elif defined(ARCH_CPU_RISCV64) + EXPECT_EQ(context.uc_mcontext.__gregs[10], + FromPointerCast(&context)); #endif } @@ -49,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) { return context.uc_mcontext.pc; #elif defined(ARCH_CPU_MIPS_FAMILY) return context.uc_mcontext.pc; +#elif defined(ARCH_CPU_RISCV64) + return context.uc_mcontext.__gregs[0]; #endif } @@ -63,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) { return context.uc_mcontext.sp; #elif defined(ARCH_CPU_MIPS_FAMILY) return context.uc_mcontext.gregs[29]; +#elif defined(ARCH_CPU_RISCV64) + return context.uc_mcontext.__gregs[2]; #endif } diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_test_util_mac.cc b/shared/sentry/src/external/crashpad/util/misc/capture_context_test_util_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/capture_context_test_util_mac.cc rename to shared/sentry/src/external/crashpad/util/misc/capture_context_test_util_mac.cc diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_test_util_win.cc b/shared/sentry/src/external/crashpad/util/misc/capture_context_test_util_win.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/capture_context_test_util_win.cc rename to shared/sentry/src/external/crashpad/util/misc/capture_context_test_util_win.cc diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_win.asm b/shared/sentry/src/external/crashpad/util/misc/capture_context_win.asm similarity index 100% rename from shared/sentry/external/crashpad/util/misc/capture_context_win.asm rename to shared/sentry/src/external/crashpad/util/misc/capture_context_win.asm diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_win_arm64.asm b/shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.asm similarity index 100% rename from shared/sentry/external/crashpad/util/misc/capture_context_win_arm64.asm rename to shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.asm diff --git a/shared/sentry/external/crashpad/util/misc/capture_context_win_arm64.obj b/shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.obj similarity index 100% rename from shared/sentry/external/crashpad/util/misc/capture_context_win_arm64.obj rename to shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.obj diff --git a/shared/sentry/external/crashpad/util/misc/clock.h b/shared/sentry/src/external/crashpad/util/misc/clock.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/clock.h rename to shared/sentry/src/external/crashpad/util/misc/clock.h diff --git a/shared/sentry/external/crashpad/util/misc/clock_mac.cc b/shared/sentry/src/external/crashpad/util/misc/clock_mac.cc similarity index 97% rename from shared/sentry/external/crashpad/util/misc/clock_mac.cc rename to shared/sentry/src/external/crashpad/util/misc/clock_mac.cc index e2142ed40..81e53170b 100644 --- a/shared/sentry/external/crashpad/util/misc/clock_mac.cc +++ b/shared/sentry/src/external/crashpad/util/misc/clock_mac.cc @@ -16,7 +16,7 @@ #include -#include "base/mac/mach_logging.h" +#include "base/apple/mach_logging.h" namespace { diff --git a/shared/sentry/external/crashpad/util/misc/clock_posix.cc b/shared/sentry/src/external/crashpad/util/misc/clock_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/clock_posix.cc rename to shared/sentry/src/external/crashpad/util/misc/clock_posix.cc diff --git a/shared/sentry/external/crashpad/util/misc/clock_test.cc b/shared/sentry/src/external/crashpad/util/misc/clock_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/clock_test.cc rename to shared/sentry/src/external/crashpad/util/misc/clock_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/clock_win.cc b/shared/sentry/src/external/crashpad/util/misc/clock_win.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/clock_win.cc rename to shared/sentry/src/external/crashpad/util/misc/clock_win.cc diff --git a/shared/sentry/external/crashpad/util/misc/elf_note_types.h b/shared/sentry/src/external/crashpad/util/misc/elf_note_types.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/elf_note_types.h rename to shared/sentry/src/external/crashpad/util/misc/elf_note_types.h diff --git a/shared/sentry/external/crashpad/util/misc/from_pointer_cast.h b/shared/sentry/src/external/crashpad/util/misc/from_pointer_cast.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/from_pointer_cast.h rename to shared/sentry/src/external/crashpad/util/misc/from_pointer_cast.h diff --git a/shared/sentry/external/crashpad/util/misc/from_pointer_cast_test.cc b/shared/sentry/src/external/crashpad/util/misc/from_pointer_cast_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/from_pointer_cast_test.cc rename to shared/sentry/src/external/crashpad/util/misc/from_pointer_cast_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/implicit_cast.h b/shared/sentry/src/external/crashpad/util/misc/implicit_cast.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/implicit_cast.h rename to shared/sentry/src/external/crashpad/util/misc/implicit_cast.h diff --git a/shared/sentry/external/crashpad/util/misc/initialization_state.h b/shared/sentry/src/external/crashpad/util/misc/initialization_state.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/initialization_state.h rename to shared/sentry/src/external/crashpad/util/misc/initialization_state.h diff --git a/shared/sentry/external/crashpad/util/misc/initialization_state_dcheck.cc b/shared/sentry/src/external/crashpad/util/misc/initialization_state_dcheck.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/initialization_state_dcheck.cc rename to shared/sentry/src/external/crashpad/util/misc/initialization_state_dcheck.cc diff --git a/shared/sentry/external/crashpad/util/misc/initialization_state_dcheck.h b/shared/sentry/src/external/crashpad/util/misc/initialization_state_dcheck.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/initialization_state_dcheck.h rename to shared/sentry/src/external/crashpad/util/misc/initialization_state_dcheck.h diff --git a/shared/sentry/external/crashpad/util/misc/initialization_state_dcheck_test.cc b/shared/sentry/src/external/crashpad/util/misc/initialization_state_dcheck_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/initialization_state_dcheck_test.cc rename to shared/sentry/src/external/crashpad/util/misc/initialization_state_dcheck_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/initialization_state_test.cc b/shared/sentry/src/external/crashpad/util/misc/initialization_state_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/initialization_state_test.cc rename to shared/sentry/src/external/crashpad/util/misc/initialization_state_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/lexing.cc b/shared/sentry/src/external/crashpad/util/misc/lexing.cc similarity index 96% rename from shared/sentry/external/crashpad/util/misc/lexing.cc rename to shared/sentry/src/external/crashpad/util/misc/lexing.cc index b65bdf141..36d239c95 100644 --- a/shared/sentry/external/crashpad/util/misc/lexing.cc +++ b/shared/sentry/src/external/crashpad/util/misc/lexing.cc @@ -14,7 +14,6 @@ #include "util/misc/lexing.h" -#include #include #include #include @@ -23,6 +22,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" +#include "base/strings/string_util.h" namespace crashpad { @@ -55,7 +55,7 @@ bool AdvancePastNumber(const char** input, T* value) { if (std::numeric_limits::is_signed && **input == '-') { ++length; } - while (isdigit((*input)[length])) { + while (base::IsAsciiDigit((*input)[length])) { ++length; } bool success = diff --git a/shared/sentry/external/crashpad/util/misc/lexing.h b/shared/sentry/src/external/crashpad/util/misc/lexing.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/lexing.h rename to shared/sentry/src/external/crashpad/util/misc/lexing.h diff --git a/shared/sentry/external/crashpad/util/misc/memory_sanitizer.h b/shared/sentry/src/external/crashpad/util/misc/memory_sanitizer.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/memory_sanitizer.h rename to shared/sentry/src/external/crashpad/util/misc/memory_sanitizer.h diff --git a/shared/sentry/external/crashpad/util/misc/metrics.cc b/shared/sentry/src/external/crashpad/util/misc/metrics.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/metrics.cc rename to shared/sentry/src/external/crashpad/util/misc/metrics.cc diff --git a/shared/sentry/external/crashpad/util/misc/metrics.h b/shared/sentry/src/external/crashpad/util/misc/metrics.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/metrics.h rename to shared/sentry/src/external/crashpad/util/misc/metrics.h diff --git a/shared/sentry/external/crashpad/util/misc/no_cfi_icall.h b/shared/sentry/src/external/crashpad/util/misc/no_cfi_icall.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/no_cfi_icall.h rename to shared/sentry/src/external/crashpad/util/misc/no_cfi_icall.h diff --git a/shared/sentry/external/crashpad/util/misc/no_cfi_icall_test.cc b/shared/sentry/src/external/crashpad/util/misc/no_cfi_icall_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/no_cfi_icall_test.cc rename to shared/sentry/src/external/crashpad/util/misc/no_cfi_icall_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/paths.h b/shared/sentry/src/external/crashpad/util/misc/paths.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/paths.h rename to shared/sentry/src/external/crashpad/util/misc/paths.h diff --git a/shared/sentry/external/crashpad/util/misc/paths_fuchsia.cc b/shared/sentry/src/external/crashpad/util/misc/paths_fuchsia.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/paths_fuchsia.cc rename to shared/sentry/src/external/crashpad/util/misc/paths_fuchsia.cc diff --git a/shared/sentry/external/crashpad/util/misc/paths_linux.cc b/shared/sentry/src/external/crashpad/util/misc/paths_linux.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/paths_linux.cc rename to shared/sentry/src/external/crashpad/util/misc/paths_linux.cc diff --git a/shared/sentry/external/crashpad/util/misc/paths_mac.cc b/shared/sentry/src/external/crashpad/util/misc/paths_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/paths_mac.cc rename to shared/sentry/src/external/crashpad/util/misc/paths_mac.cc diff --git a/shared/sentry/external/crashpad/util/misc/paths_test.cc b/shared/sentry/src/external/crashpad/util/misc/paths_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/paths_test.cc rename to shared/sentry/src/external/crashpad/util/misc/paths_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/paths_win.cc b/shared/sentry/src/external/crashpad/util/misc/paths_win.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/paths_win.cc rename to shared/sentry/src/external/crashpad/util/misc/paths_win.cc diff --git a/shared/sentry/external/crashpad/util/misc/pdb_structures.cc b/shared/sentry/src/external/crashpad/util/misc/pdb_structures.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/pdb_structures.cc rename to shared/sentry/src/external/crashpad/util/misc/pdb_structures.cc diff --git a/shared/sentry/external/crashpad/util/misc/pdb_structures.h b/shared/sentry/src/external/crashpad/util/misc/pdb_structures.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/pdb_structures.h rename to shared/sentry/src/external/crashpad/util/misc/pdb_structures.h diff --git a/shared/sentry/external/crashpad/util/misc/random_string.cc b/shared/sentry/src/external/crashpad/util/misc/random_string.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/random_string.cc rename to shared/sentry/src/external/crashpad/util/misc/random_string.cc diff --git a/shared/sentry/external/crashpad/util/misc/random_string.h b/shared/sentry/src/external/crashpad/util/misc/random_string.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/random_string.h rename to shared/sentry/src/external/crashpad/util/misc/random_string.h diff --git a/shared/sentry/external/crashpad/util/misc/random_string_test.cc b/shared/sentry/src/external/crashpad/util/misc/random_string_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/random_string_test.cc rename to shared/sentry/src/external/crashpad/util/misc/random_string_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/range_set.cc b/shared/sentry/src/external/crashpad/util/misc/range_set.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/range_set.cc rename to shared/sentry/src/external/crashpad/util/misc/range_set.cc diff --git a/shared/sentry/external/crashpad/util/misc/range_set.h b/shared/sentry/src/external/crashpad/util/misc/range_set.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/range_set.h rename to shared/sentry/src/external/crashpad/util/misc/range_set.h diff --git a/shared/sentry/external/crashpad/util/misc/range_set_test.cc b/shared/sentry/src/external/crashpad/util/misc/range_set_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/range_set_test.cc rename to shared/sentry/src/external/crashpad/util/misc/range_set_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/reinterpret_bytes.cc b/shared/sentry/src/external/crashpad/util/misc/reinterpret_bytes.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/reinterpret_bytes.cc rename to shared/sentry/src/external/crashpad/util/misc/reinterpret_bytes.cc diff --git a/shared/sentry/external/crashpad/util/misc/reinterpret_bytes.h b/shared/sentry/src/external/crashpad/util/misc/reinterpret_bytes.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/reinterpret_bytes.h rename to shared/sentry/src/external/crashpad/util/misc/reinterpret_bytes.h diff --git a/shared/sentry/external/crashpad/util/misc/reinterpret_bytes_test.cc b/shared/sentry/src/external/crashpad/util/misc/reinterpret_bytes_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/reinterpret_bytes_test.cc rename to shared/sentry/src/external/crashpad/util/misc/reinterpret_bytes_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/scoped_forbid_return.cc b/shared/sentry/src/external/crashpad/util/misc/scoped_forbid_return.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/scoped_forbid_return.cc rename to shared/sentry/src/external/crashpad/util/misc/scoped_forbid_return.cc diff --git a/shared/sentry/external/crashpad/util/misc/scoped_forbid_return.h b/shared/sentry/src/external/crashpad/util/misc/scoped_forbid_return.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/scoped_forbid_return.h rename to shared/sentry/src/external/crashpad/util/misc/scoped_forbid_return.h diff --git a/shared/sentry/external/crashpad/util/misc/scoped_forbid_return_test.cc b/shared/sentry/src/external/crashpad/util/misc/scoped_forbid_return_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/scoped_forbid_return_test.cc rename to shared/sentry/src/external/crashpad/util/misc/scoped_forbid_return_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/symbolic_constants_common.h b/shared/sentry/src/external/crashpad/util/misc/symbolic_constants_common.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/symbolic_constants_common.h rename to shared/sentry/src/external/crashpad/util/misc/symbolic_constants_common.h diff --git a/shared/sentry/external/crashpad/util/misc/time.cc b/shared/sentry/src/external/crashpad/util/misc/time.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/time.cc rename to shared/sentry/src/external/crashpad/util/misc/time.cc diff --git a/shared/sentry/external/crashpad/util/misc/time.h b/shared/sentry/src/external/crashpad/util/misc/time.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/time.h rename to shared/sentry/src/external/crashpad/util/misc/time.h diff --git a/shared/sentry/external/crashpad/util/misc/time_linux.cc b/shared/sentry/src/external/crashpad/util/misc/time_linux.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/time_linux.cc rename to shared/sentry/src/external/crashpad/util/misc/time_linux.cc diff --git a/shared/sentry/external/crashpad/util/misc/time_test.cc b/shared/sentry/src/external/crashpad/util/misc/time_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/time_test.cc rename to shared/sentry/src/external/crashpad/util/misc/time_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/time_win.cc b/shared/sentry/src/external/crashpad/util/misc/time_win.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/time_win.cc rename to shared/sentry/src/external/crashpad/util/misc/time_win.cc diff --git a/shared/sentry/external/crashpad/util/misc/tri_state.h b/shared/sentry/src/external/crashpad/util/misc/tri_state.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/tri_state.h rename to shared/sentry/src/external/crashpad/util/misc/tri_state.h diff --git a/shared/sentry/external/crashpad/util/misc/uuid.cc b/shared/sentry/src/external/crashpad/util/misc/uuid.cc similarity index 96% rename from shared/sentry/external/crashpad/util/misc/uuid.cc rename to shared/sentry/src/external/crashpad/util/misc/uuid.cc index 3c4bd482d..15870709e 100644 --- a/shared/sentry/external/crashpad/util/misc/uuid.cc +++ b/shared/sentry/src/external/crashpad/util/misc/uuid.cc @@ -23,6 +23,7 @@ #include #include +#include #include #include "base/rand_util.h" @@ -89,8 +90,8 @@ bool UUID::InitializeFromString(const base::StringPiece& string) { } #if BUILDFLAG(IS_WIN) -bool UUID::InitializeFromString(const base::WStringPiece& string) { - return InitializeFromString(WideToUTF8(string)); +bool UUID::InitializeFromString(const std::wstring_view& string) { + return InitializeFromString(base::WideToUTF8(string)); } #endif diff --git a/shared/sentry/external/crashpad/util/misc/uuid.h b/shared/sentry/src/external/crashpad/util/misc/uuid.h similarity index 97% rename from shared/sentry/external/crashpad/util/misc/uuid.h rename to shared/sentry/src/external/crashpad/util/misc/uuid.h index be005aaf7..3e401ab00 100644 --- a/shared/sentry/external/crashpad/util/misc/uuid.h +++ b/shared/sentry/src/external/crashpad/util/misc/uuid.h @@ -18,6 +18,7 @@ #include #include +#include #include "base/strings/string_piece.h" #include "build/build_config.h" @@ -64,7 +65,7 @@ struct UUID { //! parsed, with the object state untouched. bool InitializeFromString(const base::StringPiece& string); #if BUILDFLAG(IS_WIN) || DOXYGEN - bool InitializeFromString(const base::WStringPiece& string); + bool InitializeFromString(const std::wstring_view& string); #endif // BUILDFLAG(IS_WIN) //! \brief Initializes the %UUID using a standard system facility to generate diff --git a/shared/sentry/external/crashpad/util/misc/uuid_test.cc b/shared/sentry/src/external/crashpad/util/misc/uuid_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/uuid_test.cc rename to shared/sentry/src/external/crashpad/util/misc/uuid_test.cc diff --git a/shared/sentry/external/crashpad/util/misc/zlib.cc b/shared/sentry/src/external/crashpad/util/misc/zlib.cc similarity index 100% rename from shared/sentry/external/crashpad/util/misc/zlib.cc rename to shared/sentry/src/external/crashpad/util/misc/zlib.cc diff --git a/shared/sentry/external/crashpad/util/misc/zlib.h b/shared/sentry/src/external/crashpad/util/misc/zlib.h similarity index 100% rename from shared/sentry/external/crashpad/util/misc/zlib.h rename to shared/sentry/src/external/crashpad/util/misc/zlib.h diff --git a/shared/sentry/external/crashpad/util/net/generate_test_server_key.py b/shared/sentry/src/external/crashpad/util/net/generate_test_server_key.py similarity index 100% rename from shared/sentry/external/crashpad/util/net/generate_test_server_key.py rename to shared/sentry/src/external/crashpad/util/net/generate_test_server_key.py diff --git a/shared/sentry/external/crashpad/util/net/http_body.cc b/shared/sentry/src/external/crashpad/util/net/http_body.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_body.cc rename to shared/sentry/src/external/crashpad/util/net/http_body.cc diff --git a/shared/sentry/external/crashpad/util/net/http_body.h b/shared/sentry/src/external/crashpad/util/net/http_body.h similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_body.h rename to shared/sentry/src/external/crashpad/util/net/http_body.h diff --git a/shared/sentry/external/crashpad/util/net/http_body_gzip.cc b/shared/sentry/src/external/crashpad/util/net/http_body_gzip.cc similarity index 99% rename from shared/sentry/external/crashpad/util/net/http_body_gzip.cc rename to shared/sentry/src/external/crashpad/util/net/http_body_gzip.cc index bd0ec5f88..a7882ea82 100644 --- a/shared/sentry/external/crashpad/util/net/http_body_gzip.cc +++ b/shared/sentry/src/external/crashpad/util/net/http_body_gzip.cc @@ -16,6 +16,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "third_party/zlib/zlib_crashpad.h" diff --git a/shared/sentry/external/crashpad/util/net/http_body_gzip.h b/shared/sentry/src/external/crashpad/util/net/http_body_gzip.h similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_body_gzip.h rename to shared/sentry/src/external/crashpad/util/net/http_body_gzip.h diff --git a/shared/sentry/external/crashpad/util/net/http_body_gzip_test.cc b/shared/sentry/src/external/crashpad/util/net/http_body_gzip_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_body_gzip_test.cc rename to shared/sentry/src/external/crashpad/util/net/http_body_gzip_test.cc diff --git a/shared/sentry/external/crashpad/util/net/http_body_test.cc b/shared/sentry/src/external/crashpad/util/net/http_body_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_body_test.cc rename to shared/sentry/src/external/crashpad/util/net/http_body_test.cc diff --git a/shared/sentry/external/crashpad/util/net/http_body_test_util.cc b/shared/sentry/src/external/crashpad/util/net/http_body_test_util.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_body_test_util.cc rename to shared/sentry/src/external/crashpad/util/net/http_body_test_util.cc diff --git a/shared/sentry/external/crashpad/util/net/http_body_test_util.h b/shared/sentry/src/external/crashpad/util/net/http_body_test_util.h similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_body_test_util.h rename to shared/sentry/src/external/crashpad/util/net/http_body_test_util.h diff --git a/shared/sentry/external/crashpad/util/net/http_headers.h b/shared/sentry/src/external/crashpad/util/net/http_headers.h similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_headers.h rename to shared/sentry/src/external/crashpad/util/net/http_headers.h diff --git a/shared/sentry/external/crashpad/util/net/http_multipart_builder.cc b/shared/sentry/src/external/crashpad/util/net/http_multipart_builder.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_multipart_builder.cc rename to shared/sentry/src/external/crashpad/util/net/http_multipart_builder.cc diff --git a/shared/sentry/external/crashpad/util/net/http_multipart_builder.h b/shared/sentry/src/external/crashpad/util/net/http_multipart_builder.h similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_multipart_builder.h rename to shared/sentry/src/external/crashpad/util/net/http_multipart_builder.h diff --git a/shared/sentry/external/crashpad/util/net/http_multipart_builder_test.cc b/shared/sentry/src/external/crashpad/util/net/http_multipart_builder_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_multipart_builder_test.cc rename to shared/sentry/src/external/crashpad/util/net/http_multipart_builder_test.cc diff --git a/shared/sentry/external/crashpad/util/net/http_transport.cc b/shared/sentry/src/external/crashpad/util/net/http_transport.cc similarity index 93% rename from shared/sentry/external/crashpad/util/net/http_transport.cc rename to shared/sentry/src/external/crashpad/util/net/http_transport.cc index dcc8d80a5..6c1a9b087 100644 --- a/shared/sentry/external/crashpad/util/net/http_transport.cc +++ b/shared/sentry/src/external/crashpad/util/net/http_transport.cc @@ -35,6 +35,10 @@ void HTTPTransport::SetURL(const std::string& url) { url_ = url; } +void HTTPTransport::SetHTTPProxy(const std::string& http_proxy) { + http_proxy_ = http_proxy; +} + void HTTPTransport::SetMethod(const std::string& method) { method_ = method; } diff --git a/shared/sentry/external/crashpad/util/net/http_transport.h b/shared/sentry/src/external/crashpad/util/net/http_transport.h similarity index 93% rename from shared/sentry/external/crashpad/util/net/http_transport.h rename to shared/sentry/src/external/crashpad/util/net/http_transport.h index b046173b6..49742b85c 100644 --- a/shared/sentry/external/crashpad/util/net/http_transport.h +++ b/shared/sentry/src/external/crashpad/util/net/http_transport.h @@ -50,6 +50,11 @@ class HTTPTransport { //! \param[in] url The request URL. void SetURL(const std::string& url); + //! \brief Sets the optional HTTP proxy through which to send the request + //! + //! \param[in] http_proxy the fully specified URL + void SetHTTPProxy(const std::string& http_proxy); + //! \brief Sets the HTTP method to execute. E.g., GET, POST, etc. The default //! method is `"POST"`. //! @@ -99,6 +104,7 @@ class HTTPTransport { HTTPTransport(); const std::string& url() const { return url_; } + const std::string& http_proxy() const { return http_proxy_; } const std::string& method() const { return method_; } const HTTPHeaders& headers() const { return headers_; } HTTPBodyStream* body_stream() const { return body_stream_.get(); } @@ -109,6 +115,7 @@ class HTTPTransport { private: std::string url_; + std::string http_proxy_; std::string method_; base::FilePath root_ca_certificate_path_; HTTPHeaders headers_; diff --git a/shared/sentry/external/crashpad/util/net/http_transport_libcurl.cc b/shared/sentry/src/external/crashpad/util/net/http_transport_libcurl.cc similarity index 97% rename from shared/sentry/external/crashpad/util/net/http_transport_libcurl.cc rename to shared/sentry/src/external/crashpad/util/net/http_transport_libcurl.cc index f9f14c05e..ba31d6a9b 100644 --- a/shared/sentry/external/crashpad/util/net/http_transport_libcurl.cc +++ b/shared/sentry/src/external/crashpad/util/net/http_transport_libcurl.cc @@ -237,6 +237,8 @@ std::string UserAgent() { #elif defined(ARCH_CPU_BIG_ENDIAN) static constexpr char arch[] = "aarch64_be"; #endif +#elif defined (ARCH_CPU_RISCV64) + static constexpr char arch[] = "riscv64"; #else #error Port #endif @@ -456,6 +458,9 @@ bool HTTPTransportLibcurl::ExecuteSynchronously(std::string* response_body) { TRY_CURL_EASY_SETOPT(curl.get(), CURLOPT_READDATA, this); TRY_CURL_EASY_SETOPT(curl.get(), CURLOPT_WRITEFUNCTION, WriteResponseBody); TRY_CURL_EASY_SETOPT(curl.get(), CURLOPT_WRITEDATA, response_body); + if (!http_proxy().empty()) { + TRY_CURL_EASY_SETOPT(curl.get(), CURLOPT_PROXY, http_proxy().c_str()); + } #undef TRY_CURL_EASY_SETOPT #undef TRY_CURL_SLIST_APPEND @@ -480,7 +485,8 @@ bool HTTPTransportLibcurl::ExecuteSynchronously(std::string* response_body) { } if (status != 200) { - LOG(ERROR) << base::StringPrintf("HTTP status %ld", status); + LOG(ERROR) << base::StringPrintf( + "HTTP status %ld, response = \"%s\"", status, response_body->c_str()); return false; } @@ -522,6 +528,10 @@ size_t HTTPTransportLibcurl::WriteResponseBody(char* buffer, size_t size, size_t nitems, void* userdata) { +#if defined(MEMORY_SANITIZER) + // Work around an MSAN false-positive in passing `userdata`. + __msan_unpoison(&userdata, sizeof(userdata)); +#endif std::string* response_body = reinterpret_cast(userdata); // This libcurl callback mimics the silly stdio-style fread() interface: size diff --git a/shared/sentry/external/crashpad/util/net/http_transport_mac.mm b/shared/sentry/src/external/crashpad/util/net/http_transport_mac.mm similarity index 64% rename from shared/sentry/external/crashpad/util/net/http_transport_mac.mm rename to shared/sentry/src/external/crashpad/util/net/http_transport_mac.mm index 04f5c3479..8b5ef4902 100644 --- a/shared/sentry/external/crashpad/util/net/http_transport_mac.mm +++ b/shared/sentry/src/external/crashpad/util/net/http_transport_mac.mm @@ -17,23 +17,23 @@ #import #include -#include "base/mac/foundation_util.h" -#import "base/mac/scoped_nsobject.h" +#include "base/apple/bridging.h" +#include "base/apple/foundation_util.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "build/build_config.h" #include "package.h" -#include "util/file/file_io.h" #include "util/misc/implicit_cast.h" #include "util/misc/metrics.h" #include "util/net/http_body.h" +#include "util/net/url.h" // An implementation of NSInputStream that reads from a // crashpad::HTTPBodyStream. @interface CrashpadHTTPBodyStreamTransport : NSInputStream { @private NSStreamStatus _streamStatus; - id _delegate; + id __strong _delegate; crashpad::HTTPBodyStream* _bodyStream; // weak } - (instancetype)initWithBodyStream:(crashpad::HTTPBodyStream*)bodyStream; @@ -153,13 +153,14 @@ - (BOOL)setProperty:(id)property forKey:(NSStreamPropertyKey)key { // Expected to be CFNetwork. NSBundle* nsurl_bundle = [NSBundle bundleForClass:[NSURLRequest class]]; - NSString* bundle_name = base::mac::ObjCCast([nsurl_bundle - objectForInfoDictionaryKey:base::mac::CFToNSCast(kCFBundleNameKey)]); + NSString* bundle_name = base::apple::ObjCCast([nsurl_bundle + objectForInfoDictionaryKey:base::apple::CFToNSPtrCast(kCFBundleNameKey)]); if (bundle_name) { user_agent = AppendEscapedFormat(user_agent, @" %@", bundle_name); - NSString* bundle_version = base::mac::ObjCCast([nsurl_bundle - objectForInfoDictionaryKey:base::mac::CFToNSCast(kCFBundleVersionKey)]); + NSString* bundle_version = base::apple::ObjCCast( + [nsurl_bundle objectForInfoDictionaryKey:base::apple::CFToNSPtrCast( + kCFBundleVersionKey)]); if (bundle_version) { user_agent = AppendEscapedFormat(user_agent, @"/%@", bundle_version); } @@ -208,43 +209,22 @@ - (BOOL)setProperty:(id)property forKey:(NSStreamPropertyKey)key { ~HTTPTransportMac() override; bool ExecuteSynchronously(std::string* response_body) override; -}; -HTTPTransportMac::HTTPTransportMac() : HTTPTransport() { -} + private: + static bool ExecuteNormalRequest(NSMutableURLRequest* request, + std::string* response_body); + static bool ExecuteProxyRequest(NSMutableURLRequest* request, + const std::string& proxy, + std::string* response_body); +}; -HTTPTransportMac::~HTTPTransportMac() { -} +HTTPTransportMac::HTTPTransportMac() : HTTPTransport() {} -bool HTTPTransportMac::ExecuteSynchronously(std::string* response_body) { - DCHECK(body_stream()); +HTTPTransportMac::~HTTPTransportMac() = default; +bool HTTPTransportMac::ExecuteNormalRequest(NSMutableURLRequest* request, + std::string* response_body) { @autoreleasepool { - NSString* url_ns_string = base::SysUTF8ToNSString(url()); - NSURL* url = [NSURL URLWithString:url_ns_string]; - NSMutableURLRequest* request = - [NSMutableURLRequest requestWithURL:url - cachePolicy:NSURLRequestUseProtocolCachePolicy - timeoutInterval:timeout()]; - [request setHTTPMethod:base::SysUTF8ToNSString(method())]; - - // If left to its own devices, CFNetwork would build a user-agent string - // based on keys in the main bundle’s Info.plist, giving ugly results if - // there is no Info.plist. Provide a User-Agent string similar to the one - // that CFNetwork would use, but with appropriate values in place of the - // Info.plist-derived strings. - [request setValue:UserAgentString() forHTTPHeaderField:@"User-Agent"]; - - for (const auto& pair : headers()) { - [request setValue:base::SysUTF8ToNSString(pair.second) - forHTTPHeaderField:base::SysUTF8ToNSString(pair.first)]; - } - - base::scoped_nsobject input_stream( - [[CrashpadHTTPBodyStreamTransport alloc] - initWithBodyStream:body_stream()]); - [request setHTTPBodyStream:input_stream.get()]; - NSURLResponse* response = nil; NSError* error = nil; #pragma clang diagnostic push @@ -267,8 +247,7 @@ - (BOOL)setProperty:(id)property forKey:(NSStreamPropertyKey)key { LOG(ERROR) << "no response"; return false; } - NSHTTPURLResponse* http_response = - base::mac::ObjCCast(response); + auto http_response = base::apple::ObjCCast(response); if (!http_response) { LOG(ERROR) << "no http_response"; return false; @@ -289,6 +268,117 @@ - (BOOL)setProperty:(id)property forKey:(NSStreamPropertyKey)key { } } +bool HTTPTransportMac::ExecuteProxyRequest(NSMutableURLRequest* request, + const std::string& proxy, + std::string* response_body) { + __block bool sync_rv = false; + @autoreleasepool { + NSURLSessionConfiguration* sessionConfig = + [NSURLSessionConfiguration ephemeralSessionConfiguration]; + + std::string scheme, host, port, rest_ignored; + CrackURL(proxy, &scheme, &host, &port, &rest_ignored); + NSString* schemeNS = base::SysUTF8ToNSString(scheme); + NSString* hostNS = base::SysUTF8ToNSString(host); + NSNumber* proxy_port = @(std::stoi(port)); + + NSDictionary* proxyDict = @{ + (__bridge id)kCFNetworkProxiesHTTPEnable : @YES, + (__bridge id)kCFNetworkProxiesHTTPPort : proxy_port, + (__bridge id)kCFNetworkProxiesHTTPProxy : hostNS, + @"HTTPSEnable" : @YES, + @"HTTPSPort" : proxy_port, + @"HTTPSProxy" : hostNS, + }; + sessionConfig.connectionProxyDictionary = proxyDict; + NSURLSession* session = + [NSURLSession sessionWithConfiguration:sessionConfig]; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [[session dataTaskWithRequest:request + completionHandler:^( + NSData* body, NSURLResponse* response, NSError* error) { + if (error) { + Metrics::CrashUploadErrorCode(error.code); + LOG(ERROR) << [[error localizedDescription] UTF8String] + << " (" << [[error domain] UTF8String] << " " + << [error code] << ")"; + sync_rv = false; + dispatch_semaphore_signal(semaphore); + return; + } + if (!response) { + LOG(ERROR) << "no response"; + sync_rv = false; + dispatch_semaphore_signal(semaphore); + return; + } + auto http_response = + base::apple::ObjCCast(response); + if (!http_response) { + LOG(ERROR) << "no http_response"; + sync_rv = false; + dispatch_semaphore_signal(semaphore); + return; + } + NSInteger http_status = [http_response statusCode]; + if (http_status < 200 || http_status > 203) { + LOG(ERROR) << base::StringPrintf( + "HTTP status %ld", implicit_cast(http_status)); + sync_rv = false; + dispatch_semaphore_signal(semaphore); + return; + } + + if (response_body) { + response_body->assign( + static_cast([body bytes]), [body length]); + } + sync_rv = true; + dispatch_semaphore_signal(semaphore); + }] resume]; + + dispatch_semaphore_wait(semaphore, (dispatch_time_t)(10 * NSEC_PER_SEC)); + } + return sync_rv; +} + +bool HTTPTransportMac::ExecuteSynchronously(std::string* response_body) { + DCHECK(body_stream()); + + @autoreleasepool { + NSString* url_ns_string = base::SysUTF8ToNSString(url()); + NSURL* url = [NSURL URLWithString:url_ns_string]; + NSMutableURLRequest* request = + [NSMutableURLRequest requestWithURL:url + cachePolicy:NSURLRequestUseProtocolCachePolicy + timeoutInterval:timeout()]; + [request setHTTPMethod:base::SysUTF8ToNSString(method())]; + + // If left to its own devices, CFNetwork would build a user-agent string + // based on keys in the main bundle’s Info.plist, giving ugly results if + // there is no Info.plist. Provide a User-Agent string similar to the one + // that CFNetwork would use, but with appropriate values in place of the + // Info.plist-derived strings. + [request setValue:UserAgentString() forHTTPHeaderField:@"User-Agent"]; + + for (const auto& pair : headers()) { + [request setValue:base::SysUTF8ToNSString(pair.second) + forHTTPHeaderField:base::SysUTF8ToNSString(pair.first)]; + } + + NSInputStream* input_stream = [[CrashpadHTTPBodyStreamTransport alloc] + initWithBodyStream:body_stream()]; + [request setHTTPBodyStream:input_stream]; + + if (http_proxy().empty()) { + return ExecuteNormalRequest(request, response_body); + } else { + std::string proxy = http_proxy() + "/"; + return ExecuteProxyRequest(request, proxy, response_body); + } + } +} + } // namespace // static diff --git a/shared/sentry/external/crashpad/util/net/http_transport_socket.cc b/shared/sentry/src/external/crashpad/util/net/http_transport_socket.cc similarity index 99% rename from shared/sentry/external/crashpad/util/net/http_transport_socket.cc rename to shared/sentry/src/external/crashpad/util/net/http_transport_socket.cc index aba801542..100abba5d 100644 --- a/shared/sentry/external/crashpad/util/net/http_transport_socket.cc +++ b/shared/sentry/src/external/crashpad/util/net/http_transport_socket.cc @@ -20,6 +20,7 @@ #include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/posix/eintr_wrapper.h" diff --git a/shared/sentry/external/crashpad/util/net/http_transport_test.cc b/shared/sentry/src/external/crashpad/util/net/http_transport_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_transport_test.cc rename to shared/sentry/src/external/crashpad/util/net/http_transport_test.cc diff --git a/shared/sentry/external/crashpad/util/net/http_transport_test_server.cc b/shared/sentry/src/external/crashpad/util/net/http_transport_test_server.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/http_transport_test_server.cc rename to shared/sentry/src/external/crashpad/util/net/http_transport_test_server.cc diff --git a/shared/sentry/external/crashpad/util/net/http_transport_win.cc b/shared/sentry/src/external/crashpad/util/net/http_transport_win.cc similarity index 88% rename from shared/sentry/external/crashpad/util/net/http_transport_win.cc rename to shared/sentry/src/external/crashpad/util/net/http_transport_win.cc index 6bc2481d7..15be3cd04 100644 --- a/shared/sentry/external/crashpad/util/net/http_transport_win.cc +++ b/shared/sentry/src/external/crashpad/util/net/http_transport_win.cc @@ -23,7 +23,9 @@ #include #include +#include +#include "base/check_op.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/scoped_generic.h" @@ -115,9 +117,7 @@ std::string WinHttpMessage(const char* extra) { } struct ScopedHINTERNETTraits { - static HINTERNET InvalidValue() { - return nullptr; - } + static HINTERNET InvalidValue() { return nullptr; } static void Free(HINTERNET handle) { if (handle) { if (!WinHttpCloseHandle(handle)) { @@ -141,18 +141,46 @@ class HTTPTransportWin final : public HTTPTransport { bool ExecuteSynchronously(std::string* response_body) override; }; -HTTPTransportWin::HTTPTransportWin() : HTTPTransport() { -} +HTTPTransportWin::HTTPTransportWin() : HTTPTransport() {} -HTTPTransportWin::~HTTPTransportWin() { -} +HTTPTransportWin::~HTTPTransportWin() {} bool HTTPTransportWin::ExecuteSynchronously(std::string* response_body) { - ScopedHINTERNET session(WinHttpOpen(base::UTF8ToWide(UserAgent()).c_str(), + // ensure the proxy starts with `http://`, otherwise ignore it + const char proto[] = "http://"; + ScopedHINTERNET session; + if (http_proxy().rfind(proto, 0) == 0) { + size_t proto_len = sizeof(proto) - 1; + size_t next_slash_pos = http_proxy().find('/', proto_len); + std::string proxy = http_proxy().substr(proto_len, + next_slash_pos != std::string::npos + ? next_slash_pos - proto_len + : std::string::npos); + session = ScopedHINTERNET(WinHttpOpen(base::UTF8ToWide(UserAgent()).c_str(), + WINHTTP_ACCESS_TYPE_NAMED_PROXY, + base::UTF8ToWide(proxy).c_str(), + WINHTTP_NO_PROXY_BYPASS, + 0)); + } else { +#if _WIN32_WINNT >= 0x0603 + session = ScopedHINTERNET(WinHttpOpen(base::UTF8ToWide(UserAgent()).c_str(), + WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY, + WINHTTP_NO_PROXY_NAME, + WINHTTP_NO_PROXY_BYPASS, + 0)); +#endif + // On Windows 8.0 or lower, WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY does + // not work on error we fall back to WINHTTP_ACCESS_TYPE_DEFAULT_PROXY + if (!session.get()) { + session = + ScopedHINTERNET(WinHttpOpen(base::UTF8ToWide(UserAgent()).c_str(), WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0)); + } + } + if (!session.get()) { LOG(ERROR) << WinHttpMessage("WinHttpOpen"); return false; @@ -175,8 +203,7 @@ bool HTTPTransportWin::ExecuteSynchronously(std::string* response_body) { url_components.dwExtraInfoLength = 1; std::wstring url_wide(base::UTF8ToWide(url())); // dwFlags = ICU_REJECT_USERPWD fails on XP. - if (!WinHttpCrackUrl( - url_wide.c_str(), 0, 0, &url_components)) { + if (!WinHttpCrackUrl(url_wide.c_str(), 0, 0, &url_components)) { LOG(ERROR) << WinHttpMessage("WinHttpCrackUrl"); return false; } @@ -412,7 +439,7 @@ bool HTTPTransportWin::ExecuteSynchronously(std::string* response_body) { // static std::unique_ptr HTTPTransport::Create() { - return std::unique_ptr(new HTTPTransportWin); + return std::make_unique(); } } // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/net/testdata/ascii_http_body.txt b/shared/sentry/src/external/crashpad/util/net/testdata/ascii_http_body.txt similarity index 100% rename from shared/sentry/external/crashpad/util/net/testdata/ascii_http_body.txt rename to shared/sentry/src/external/crashpad/util/net/testdata/ascii_http_body.txt diff --git a/shared/sentry/external/crashpad/util/net/testdata/binary_http_body.dat b/shared/sentry/src/external/crashpad/util/net/testdata/binary_http_body.dat similarity index 100% rename from shared/sentry/external/crashpad/util/net/testdata/binary_http_body.dat rename to shared/sentry/src/external/crashpad/util/net/testdata/binary_http_body.dat diff --git a/shared/sentry/external/crashpad/util/net/testdata/crashpad_util_test_cert.pem b/shared/sentry/src/external/crashpad/util/net/testdata/crashpad_util_test_cert.pem similarity index 100% rename from shared/sentry/external/crashpad/util/net/testdata/crashpad_util_test_cert.pem rename to shared/sentry/src/external/crashpad/util/net/testdata/crashpad_util_test_cert.pem diff --git a/shared/sentry/external/crashpad/util/net/testdata/crashpad_util_test_key.pem b/shared/sentry/src/external/crashpad/util/net/testdata/crashpad_util_test_key.pem similarity index 100% rename from shared/sentry/external/crashpad/util/net/testdata/crashpad_util_test_key.pem rename to shared/sentry/src/external/crashpad/util/net/testdata/crashpad_util_test_key.pem diff --git a/shared/sentry/external/crashpad/util/net/tls.gni b/shared/sentry/src/external/crashpad/util/net/tls.gni similarity index 100% rename from shared/sentry/external/crashpad/util/net/tls.gni rename to shared/sentry/src/external/crashpad/util/net/tls.gni diff --git a/shared/sentry/external/crashpad/util/net/url.cc b/shared/sentry/src/external/crashpad/util/net/url.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/url.cc rename to shared/sentry/src/external/crashpad/util/net/url.cc diff --git a/shared/sentry/external/crashpad/util/net/url.h b/shared/sentry/src/external/crashpad/util/net/url.h similarity index 100% rename from shared/sentry/external/crashpad/util/net/url.h rename to shared/sentry/src/external/crashpad/util/net/url.h diff --git a/shared/sentry/external/crashpad/util/net/url_test.cc b/shared/sentry/src/external/crashpad/util/net/url_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/net/url_test.cc rename to shared/sentry/src/external/crashpad/util/net/url_test.cc diff --git a/shared/sentry/external/crashpad/util/numeric/checked_address_range.cc b/shared/sentry/src/external/crashpad/util/numeric/checked_address_range.cc similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/checked_address_range.cc rename to shared/sentry/src/external/crashpad/util/numeric/checked_address_range.cc diff --git a/shared/sentry/external/crashpad/util/numeric/checked_address_range.h b/shared/sentry/src/external/crashpad/util/numeric/checked_address_range.h similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/checked_address_range.h rename to shared/sentry/src/external/crashpad/util/numeric/checked_address_range.h diff --git a/shared/sentry/external/crashpad/util/numeric/checked_address_range_test.cc b/shared/sentry/src/external/crashpad/util/numeric/checked_address_range_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/checked_address_range_test.cc rename to shared/sentry/src/external/crashpad/util/numeric/checked_address_range_test.cc diff --git a/shared/sentry/external/crashpad/util/numeric/checked_range.h b/shared/sentry/src/external/crashpad/util/numeric/checked_range.h similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/checked_range.h rename to shared/sentry/src/external/crashpad/util/numeric/checked_range.h diff --git a/shared/sentry/external/crashpad/util/numeric/checked_range_test.cc b/shared/sentry/src/external/crashpad/util/numeric/checked_range_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/checked_range_test.cc rename to shared/sentry/src/external/crashpad/util/numeric/checked_range_test.cc diff --git a/shared/sentry/external/crashpad/util/numeric/checked_vm_address_range.h b/shared/sentry/src/external/crashpad/util/numeric/checked_vm_address_range.h similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/checked_vm_address_range.h rename to shared/sentry/src/external/crashpad/util/numeric/checked_vm_address_range.h diff --git a/shared/sentry/external/crashpad/util/numeric/in_range_cast.h b/shared/sentry/src/external/crashpad/util/numeric/in_range_cast.h similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/in_range_cast.h rename to shared/sentry/src/external/crashpad/util/numeric/in_range_cast.h diff --git a/shared/sentry/external/crashpad/util/numeric/in_range_cast_test.cc b/shared/sentry/src/external/crashpad/util/numeric/in_range_cast_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/in_range_cast_test.cc rename to shared/sentry/src/external/crashpad/util/numeric/in_range_cast_test.cc diff --git a/shared/sentry/external/crashpad/util/numeric/int128.h b/shared/sentry/src/external/crashpad/util/numeric/int128.h similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/int128.h rename to shared/sentry/src/external/crashpad/util/numeric/int128.h diff --git a/shared/sentry/external/crashpad/util/numeric/int128_test.cc b/shared/sentry/src/external/crashpad/util/numeric/int128_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/int128_test.cc rename to shared/sentry/src/external/crashpad/util/numeric/int128_test.cc diff --git a/shared/sentry/external/crashpad/util/numeric/safe_assignment.h b/shared/sentry/src/external/crashpad/util/numeric/safe_assignment.h similarity index 100% rename from shared/sentry/external/crashpad/util/numeric/safe_assignment.h rename to shared/sentry/src/external/crashpad/util/numeric/safe_assignment.h diff --git a/shared/sentry/external/crashpad/util/posix/close_multiple.cc b/shared/sentry/src/external/crashpad/util/posix/close_multiple.cc similarity index 99% rename from shared/sentry/external/crashpad/util/posix/close_multiple.cc rename to shared/sentry/src/external/crashpad/util/posix/close_multiple.cc index 628beeab5..8c94e7501 100644 --- a/shared/sentry/external/crashpad/util/posix/close_multiple.cc +++ b/shared/sentry/src/external/crashpad/util/posix/close_multiple.cc @@ -23,6 +23,7 @@ #include #include +#include "base/check_op.h" #include "base/files/scoped_file.h" #include "base/logging.h" #include "base/posix/eintr_wrapper.h" diff --git a/shared/sentry/external/crashpad/util/posix/close_multiple.h b/shared/sentry/src/external/crashpad/util/posix/close_multiple.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/close_multiple.h rename to shared/sentry/src/external/crashpad/util/posix/close_multiple.h diff --git a/shared/sentry/external/crashpad/util/posix/close_stdio.cc b/shared/sentry/src/external/crashpad/util/posix/close_stdio.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/close_stdio.cc rename to shared/sentry/src/external/crashpad/util/posix/close_stdio.cc diff --git a/shared/sentry/external/crashpad/util/posix/close_stdio.h b/shared/sentry/src/external/crashpad/util/posix/close_stdio.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/close_stdio.h rename to shared/sentry/src/external/crashpad/util/posix/close_stdio.h diff --git a/shared/sentry/external/crashpad/util/posix/drop_privileges.cc b/shared/sentry/src/external/crashpad/util/posix/drop_privileges.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/drop_privileges.cc rename to shared/sentry/src/external/crashpad/util/posix/drop_privileges.cc diff --git a/shared/sentry/external/crashpad/util/posix/drop_privileges.h b/shared/sentry/src/external/crashpad/util/posix/drop_privileges.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/drop_privileges.h rename to shared/sentry/src/external/crashpad/util/posix/drop_privileges.h diff --git a/shared/sentry/external/crashpad/util/posix/process_info.h b/shared/sentry/src/external/crashpad/util/posix/process_info.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/process_info.h rename to shared/sentry/src/external/crashpad/util/posix/process_info.h diff --git a/shared/sentry/external/crashpad/util/posix/process_info_linux.cc b/shared/sentry/src/external/crashpad/util/posix/process_info_linux.cc similarity index 99% rename from shared/sentry/external/crashpad/util/posix/process_info_linux.cc rename to shared/sentry/src/external/crashpad/util/posix/process_info_linux.cc index 27387616e..1aca699c5 100644 --- a/shared/sentry/external/crashpad/util/posix/process_info_linux.cc +++ b/shared/sentry/src/external/crashpad/util/posix/process_info_linux.cc @@ -16,6 +16,7 @@ #include +#include "base/check.h" #include "base/files/file_path.h" #include "base/logging.h" #include "util/file/delimited_file_reader.h" diff --git a/shared/sentry/external/crashpad/util/posix/process_info_mac.cc b/shared/sentry/src/external/crashpad/util/posix/process_info_mac.cc similarity index 99% rename from shared/sentry/external/crashpad/util/posix/process_info_mac.cc rename to shared/sentry/src/external/crashpad/util/posix/process_info_mac.cc index 23f8b72f2..cf615194a 100644 --- a/shared/sentry/external/crashpad/util/posix/process_info_mac.cc +++ b/shared/sentry/src/external/crashpad/util/posix/process_info_mac.cc @@ -18,8 +18,9 @@ #include +#include "base/apple/mach_logging.h" +#include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/util/posix/process_info_test.cc b/shared/sentry/src/external/crashpad/util/posix/process_info_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/process_info_test.cc rename to shared/sentry/src/external/crashpad/util/posix/process_info_test.cc diff --git a/shared/sentry/external/crashpad/util/posix/scoped_dir.cc b/shared/sentry/src/external/crashpad/util/posix/scoped_dir.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/scoped_dir.cc rename to shared/sentry/src/external/crashpad/util/posix/scoped_dir.cc diff --git a/shared/sentry/external/crashpad/util/posix/scoped_dir.h b/shared/sentry/src/external/crashpad/util/posix/scoped_dir.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/scoped_dir.h rename to shared/sentry/src/external/crashpad/util/posix/scoped_dir.h diff --git a/shared/sentry/external/crashpad/util/posix/scoped_mmap.cc b/shared/sentry/src/external/crashpad/util/posix/scoped_mmap.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/scoped_mmap.cc rename to shared/sentry/src/external/crashpad/util/posix/scoped_mmap.cc diff --git a/shared/sentry/external/crashpad/util/posix/scoped_mmap.h b/shared/sentry/src/external/crashpad/util/posix/scoped_mmap.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/scoped_mmap.h rename to shared/sentry/src/external/crashpad/util/posix/scoped_mmap.h diff --git a/shared/sentry/external/crashpad/util/posix/scoped_mmap_test.cc b/shared/sentry/src/external/crashpad/util/posix/scoped_mmap_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/scoped_mmap_test.cc rename to shared/sentry/src/external/crashpad/util/posix/scoped_mmap_test.cc diff --git a/shared/sentry/external/crashpad/util/posix/signals.cc b/shared/sentry/src/external/crashpad/util/posix/signals.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/signals.cc rename to shared/sentry/src/external/crashpad/util/posix/signals.cc diff --git a/shared/sentry/external/crashpad/util/posix/signals.h b/shared/sentry/src/external/crashpad/util/posix/signals.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/signals.h rename to shared/sentry/src/external/crashpad/util/posix/signals.h diff --git a/shared/sentry/external/crashpad/util/posix/signals_test.cc b/shared/sentry/src/external/crashpad/util/posix/signals_test.cc similarity index 98% rename from shared/sentry/external/crashpad/util/posix/signals_test.cc rename to shared/sentry/src/external/crashpad/util/posix/signals_test.cc index de8deb22c..15c449955 100644 --- a/shared/sentry/external/crashpad/util/posix/signals_test.cc +++ b/shared/sentry/src/external/crashpad/util/posix/signals_test.cc @@ -164,9 +164,12 @@ void CauseSignal(int sig, int code) { * Arm architecture. */ #if defined(ARCH_CPU_X86_FAMILY) - [[maybe_unused]] volatile int a = 42; - volatile int b = 0; - a = a / b; + // Dividing by zero is undefined in C, so the compiler is permitted to + // optimize out the division. Instead, divide using inline assembly. As + // this instruction will trap anyway, we skip declaring any clobbers or + // output registers. + int a = 42, b = 0; + asm volatile("idivl %2" : : "a"(0), "d"(a), "r"(b)); #endif break; } diff --git a/shared/sentry/external/crashpad/util/posix/spawn_subprocess.cc b/shared/sentry/src/external/crashpad/util/posix/spawn_subprocess.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/spawn_subprocess.cc rename to shared/sentry/src/external/crashpad/util/posix/spawn_subprocess.cc diff --git a/shared/sentry/external/crashpad/util/posix/spawn_subprocess.h b/shared/sentry/src/external/crashpad/util/posix/spawn_subprocess.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/spawn_subprocess.h rename to shared/sentry/src/external/crashpad/util/posix/spawn_subprocess.h diff --git a/shared/sentry/external/crashpad/util/posix/symbolic_constants_posix.cc b/shared/sentry/src/external/crashpad/util/posix/symbolic_constants_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/symbolic_constants_posix.cc rename to shared/sentry/src/external/crashpad/util/posix/symbolic_constants_posix.cc diff --git a/shared/sentry/external/crashpad/util/posix/symbolic_constants_posix.h b/shared/sentry/src/external/crashpad/util/posix/symbolic_constants_posix.h similarity index 100% rename from shared/sentry/external/crashpad/util/posix/symbolic_constants_posix.h rename to shared/sentry/src/external/crashpad/util/posix/symbolic_constants_posix.h diff --git a/shared/sentry/external/crashpad/util/posix/symbolic_constants_posix_test.cc b/shared/sentry/src/external/crashpad/util/posix/symbolic_constants_posix_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/posix/symbolic_constants_posix_test.cc rename to shared/sentry/src/external/crashpad/util/posix/symbolic_constants_posix_test.cc diff --git a/shared/sentry/external/crashpad/util/process/process_id.h b/shared/sentry/src/external/crashpad/util/process/process_id.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_id.h rename to shared/sentry/src/external/crashpad/util/process/process_id.h diff --git a/shared/sentry/external/crashpad/util/process/process_memory.cc b/shared/sentry/src/external/crashpad/util/process/process_memory.cc similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory.cc diff --git a/shared/sentry/external/crashpad/util/process/process_memory.h b/shared/sentry/src/external/crashpad/util/process/process_memory.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory.h rename to shared/sentry/src/external/crashpad/util/process/process_memory.h diff --git a/shared/sentry/external/crashpad/util/process/process_memory_fuchsia.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_fuchsia.cc similarity index 98% rename from shared/sentry/external/crashpad/util/process/process_memory_fuchsia.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_fuchsia.cc index 7129f8a75..a14c2ac68 100644 --- a/shared/sentry/external/crashpad/util/process/process_memory_fuchsia.cc +++ b/shared/sentry/src/external/crashpad/util/process/process_memory_fuchsia.cc @@ -16,8 +16,9 @@ #include -#include "base/logging.h" +#include "base/check_op.h" #include "base/fuchsia/fuchsia_logging.h" +#include "base/logging.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/util/process/process_memory_fuchsia.h b/shared/sentry/src/external/crashpad/util/process/process_memory_fuchsia.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_fuchsia.h rename to shared/sentry/src/external/crashpad/util/process/process_memory_fuchsia.h diff --git a/shared/sentry/external/crashpad/util/process/process_memory_linux.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_linux.cc similarity index 98% rename from shared/sentry/external/crashpad/util/process/process_memory_linux.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_linux.cc index 1e9002d79..9c2edea30 100644 --- a/shared/sentry/external/crashpad/util/process/process_memory_linux.cc +++ b/shared/sentry/src/external/crashpad/util/process/process_memory_linux.cc @@ -22,6 +22,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/posix/eintr_wrapper.h" #include "build/build_config.h" diff --git a/shared/sentry/external/crashpad/util/process/process_memory_linux.h b/shared/sentry/src/external/crashpad/util/process/process_memory_linux.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_linux.h rename to shared/sentry/src/external/crashpad/util/process/process_memory_linux.h diff --git a/shared/sentry/external/crashpad/util/process/process_memory_mac.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_mac.cc similarity index 98% rename from shared/sentry/external/crashpad/util/process/process_memory_mac.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_mac.cc index fc8719b49..a972401dc 100644 --- a/shared/sentry/external/crashpad/util/process/process_memory_mac.cc +++ b/shared/sentry/src/external/crashpad/util/process/process_memory_mac.cc @@ -19,8 +19,9 @@ #include +#include "base/apple/mach_logging.h" +#include "base/check_op.h" #include "base/logging.h" -#include "base/mac/mach_logging.h" #include "base/strings/stringprintf.h" #include "util/stdlib/strnlen.h" diff --git a/shared/sentry/external/crashpad/util/process/process_memory_mac.h b/shared/sentry/src/external/crashpad/util/process/process_memory_mac.h similarity index 98% rename from shared/sentry/external/crashpad/util/process/process_memory_mac.h rename to shared/sentry/src/external/crashpad/util/process/process_memory_mac.h index 6c76e3d23..9803daf9d 100644 --- a/shared/sentry/external/crashpad/util/process/process_memory_mac.h +++ b/shared/sentry/src/external/crashpad/util/process/process_memory_mac.h @@ -21,7 +21,7 @@ #include #include -#include "base/mac/scoped_mach_vm.h" +#include "base/apple/scoped_mach_vm.h" #include "util/misc/address_types.h" #include "util/misc/initialization_state_dcheck.h" #include "util/process/process_memory.h" @@ -82,7 +82,7 @@ class ProcessMemoryMac : public ProcessMemory { size_t user_offset, size_t user_size); - base::mac::ScopedMachVM vm_; + base::apple::ScopedMachVM vm_; const void* data_; size_t user_size_; diff --git a/shared/sentry/external/crashpad/util/process/process_memory_mac_test.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_mac_test.cc similarity index 97% rename from shared/sentry/external/crashpad/util/process/process_memory_mac_test.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_mac_test.cc index 9e2b7b060..296b536df 100644 --- a/shared/sentry/external/crashpad/util/process/process_memory_mac_test.cc +++ b/shared/sentry/src/external/crashpad/util/process/process_memory_mac_test.cc @@ -21,8 +21,8 @@ #include #include -#include "base/mac/scoped_mach_port.h" -#include "base/mac/scoped_mach_vm.h" +#include "base/apple/scoped_mach_port.h" +#include "base/apple/scoped_mach_vm.h" #include "gtest/gtest.h" #include "test/mac/mach_errors.h" #include "util/misc/from_pointer_cast.h" @@ -37,7 +37,7 @@ TEST(ProcessMemoryMac, ReadMappedSelf) { kern_return_t kr = vm_allocate(mach_task_self(), &address, kSize, VM_FLAGS_ANYWHERE); ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate"); - base::mac::ScopedMachVM vm_owner(address, mach_vm_round_page(kSize)); + base::apple::ScopedMachVM vm_owner(address, mach_vm_round_page(kSize)); char* region = reinterpret_cast(address); for (size_t index = 0; index < kSize; ++index) { @@ -92,7 +92,7 @@ TEST(ProcessMemoryMac, ReadSelfUnmapped) { kern_return_t kr = vm_allocate(mach_task_self(), &address, kSize, VM_FLAGS_ANYWHERE); ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate"); - base::mac::ScopedMachVM vm_owner(address, mach_vm_round_page(kSize)); + base::apple::ScopedMachVM vm_owner(address, mach_vm_round_page(kSize)); char* region = reinterpret_cast(address); for (size_t index = 0; index < kSize; ++index) { @@ -154,7 +154,7 @@ TEST(ProcessMemoryMac, ReadCStringSelfUnmapped) { kern_return_t kr = vm_allocate(mach_task_self(), &address, kSize, VM_FLAGS_ANYWHERE); ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate"); - base::mac::ScopedMachVM vm_owner(address, mach_vm_round_page(kSize)); + base::apple::ScopedMachVM vm_owner(address, mach_vm_round_page(kSize)); char* region = reinterpret_cast(address); for (size_t index = 0; index < kSize; ++index) { @@ -219,7 +219,7 @@ bool IsAddressMapped(vm_address_t address) { // |object| will be MACH_PORT_NULL (10.9.4 xnu-2422.110.17/osfmk/vm/vm_map.c // vm_map_region()), but the interface acts as if it might carry a send // right, so treat it as documented. - base::mac::ScopedMachSendRight object_owner(object); + base::apple::ScopedMachSendRight object_owner(object); return address >= region_address && address <= region_address + region_size; } diff --git a/shared/sentry/external/crashpad/util/process/process_memory_native.h b/shared/sentry/src/external/crashpad/util/process/process_memory_native.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_native.h rename to shared/sentry/src/external/crashpad/util/process/process_memory_native.h diff --git a/shared/sentry/external/crashpad/util/process/process_memory_range.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_range.cc similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_range.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_range.cc diff --git a/shared/sentry/external/crashpad/util/process/process_memory_range.h b/shared/sentry/src/external/crashpad/util/process/process_memory_range.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_range.h rename to shared/sentry/src/external/crashpad/util/process/process_memory_range.h diff --git a/shared/sentry/external/crashpad/util/process/process_memory_range_test.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_range_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_range_test.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_range_test.cc diff --git a/shared/sentry/external/crashpad/util/process/process_memory_sanitized.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_sanitized.cc similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_sanitized.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_sanitized.cc diff --git a/shared/sentry/external/crashpad/util/process/process_memory_sanitized.h b/shared/sentry/src/external/crashpad/util/process/process_memory_sanitized.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_sanitized.h rename to shared/sentry/src/external/crashpad/util/process/process_memory_sanitized.h diff --git a/shared/sentry/external/crashpad/util/process/process_memory_sanitized_test.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_sanitized_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_sanitized_test.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_sanitized_test.cc diff --git a/shared/sentry/external/crashpad/util/process/process_memory_test.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_test.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_test.cc diff --git a/shared/sentry/external/crashpad/util/process/process_memory_win.cc b/shared/sentry/src/external/crashpad/util/process/process_memory_win.cc similarity index 99% rename from shared/sentry/external/crashpad/util/process/process_memory_win.cc rename to shared/sentry/src/external/crashpad/util/process/process_memory_win.cc index 8c5a1679e..c120827ad 100644 --- a/shared/sentry/external/crashpad/util/process/process_memory_win.cc +++ b/shared/sentry/src/external/crashpad/util/process/process_memory_win.cc @@ -19,6 +19,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/memory/page_size.h" #include "base/numerics/safe_conversions.h" diff --git a/shared/sentry/external/crashpad/util/process/process_memory_win.h b/shared/sentry/src/external/crashpad/util/process/process_memory_win.h similarity index 100% rename from shared/sentry/external/crashpad/util/process/process_memory_win.h rename to shared/sentry/src/external/crashpad/util/process/process_memory_win.h diff --git a/shared/sentry/external/crashpad/util/stdlib/aligned_allocator.cc b/shared/sentry/src/external/crashpad/util/stdlib/aligned_allocator.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/aligned_allocator.cc rename to shared/sentry/src/external/crashpad/util/stdlib/aligned_allocator.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/aligned_allocator.h b/shared/sentry/src/external/crashpad/util/stdlib/aligned_allocator.h similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/aligned_allocator.h rename to shared/sentry/src/external/crashpad/util/stdlib/aligned_allocator.h diff --git a/shared/sentry/external/crashpad/util/stdlib/aligned_allocator_test.cc b/shared/sentry/src/external/crashpad/util/stdlib/aligned_allocator_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/aligned_allocator_test.cc rename to shared/sentry/src/external/crashpad/util/stdlib/aligned_allocator_test.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/map_insert.h b/shared/sentry/src/external/crashpad/util/stdlib/map_insert.h similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/map_insert.h rename to shared/sentry/src/external/crashpad/util/stdlib/map_insert.h diff --git a/shared/sentry/external/crashpad/util/stdlib/map_insert_test.cc b/shared/sentry/src/external/crashpad/util/stdlib/map_insert_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/map_insert_test.cc rename to shared/sentry/src/external/crashpad/util/stdlib/map_insert_test.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/objc.h b/shared/sentry/src/external/crashpad/util/stdlib/objc.h similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/objc.h rename to shared/sentry/src/external/crashpad/util/stdlib/objc.h diff --git a/shared/sentry/external/crashpad/util/stdlib/string_number_conversion.cc b/shared/sentry/src/external/crashpad/util/stdlib/string_number_conversion.cc similarity index 98% rename from shared/sentry/external/crashpad/util/stdlib/string_number_conversion.cc rename to shared/sentry/src/external/crashpad/util/stdlib/string_number_conversion.cc index 91a6abe47..1be546876 100644 --- a/shared/sentry/external/crashpad/util/stdlib/string_number_conversion.cc +++ b/shared/sentry/src/external/crashpad/util/stdlib/string_number_conversion.cc @@ -14,7 +14,6 @@ #include "util/stdlib/string_number_conversion.h" -#include #include #include #include @@ -22,6 +21,7 @@ #include +#include "base/strings/string_util.h" namespace { @@ -141,7 +141,7 @@ bool StringToIntegerInternal(const std::string& string, Traits::TypeCheck(); - if (string.empty() || isspace(string[0])) { + if (string.empty() || base::IsAsciiWhitespace(string[0])) { return false; } diff --git a/shared/sentry/external/crashpad/util/stdlib/string_number_conversion.h b/shared/sentry/src/external/crashpad/util/stdlib/string_number_conversion.h similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/string_number_conversion.h rename to shared/sentry/src/external/crashpad/util/stdlib/string_number_conversion.h diff --git a/shared/sentry/external/crashpad/util/stdlib/string_number_conversion_test.cc b/shared/sentry/src/external/crashpad/util/stdlib/string_number_conversion_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/string_number_conversion_test.cc rename to shared/sentry/src/external/crashpad/util/stdlib/string_number_conversion_test.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/strlcpy.cc b/shared/sentry/src/external/crashpad/util/stdlib/strlcpy.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/strlcpy.cc rename to shared/sentry/src/external/crashpad/util/stdlib/strlcpy.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/strlcpy.h b/shared/sentry/src/external/crashpad/util/stdlib/strlcpy.h similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/strlcpy.h rename to shared/sentry/src/external/crashpad/util/stdlib/strlcpy.h diff --git a/shared/sentry/external/crashpad/util/stdlib/strlcpy_test.cc b/shared/sentry/src/external/crashpad/util/stdlib/strlcpy_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/strlcpy_test.cc rename to shared/sentry/src/external/crashpad/util/stdlib/strlcpy_test.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/strnlen.cc b/shared/sentry/src/external/crashpad/util/stdlib/strnlen.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/strnlen.cc rename to shared/sentry/src/external/crashpad/util/stdlib/strnlen.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/strnlen.h b/shared/sentry/src/external/crashpad/util/stdlib/strnlen.h similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/strnlen.h rename to shared/sentry/src/external/crashpad/util/stdlib/strnlen.h diff --git a/shared/sentry/external/crashpad/util/stdlib/strnlen_test.cc b/shared/sentry/src/external/crashpad/util/stdlib/strnlen_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/strnlen_test.cc rename to shared/sentry/src/external/crashpad/util/stdlib/strnlen_test.cc diff --git a/shared/sentry/external/crashpad/util/stdlib/thread_safe_vector.h b/shared/sentry/src/external/crashpad/util/stdlib/thread_safe_vector.h similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/thread_safe_vector.h rename to shared/sentry/src/external/crashpad/util/stdlib/thread_safe_vector.h diff --git a/shared/sentry/external/crashpad/util/stdlib/thread_safe_vector_test.cc b/shared/sentry/src/external/crashpad/util/stdlib/thread_safe_vector_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stdlib/thread_safe_vector_test.cc rename to shared/sentry/src/external/crashpad/util/stdlib/thread_safe_vector_test.cc diff --git a/shared/sentry/external/crashpad/util/stream/base94_output_stream.cc b/shared/sentry/src/external/crashpad/util/stream/base94_output_stream.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/base94_output_stream.cc rename to shared/sentry/src/external/crashpad/util/stream/base94_output_stream.cc diff --git a/shared/sentry/external/crashpad/util/stream/base94_output_stream.h b/shared/sentry/src/external/crashpad/util/stream/base94_output_stream.h similarity index 100% rename from shared/sentry/external/crashpad/util/stream/base94_output_stream.h rename to shared/sentry/src/external/crashpad/util/stream/base94_output_stream.h diff --git a/shared/sentry/external/crashpad/util/stream/base94_output_stream_test.cc b/shared/sentry/src/external/crashpad/util/stream/base94_output_stream_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/base94_output_stream_test.cc rename to shared/sentry/src/external/crashpad/util/stream/base94_output_stream_test.cc diff --git a/shared/sentry/external/crashpad/util/stream/file_encoder.cc b/shared/sentry/src/external/crashpad/util/stream/file_encoder.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/file_encoder.cc rename to shared/sentry/src/external/crashpad/util/stream/file_encoder.cc diff --git a/shared/sentry/external/crashpad/util/stream/file_encoder.h b/shared/sentry/src/external/crashpad/util/stream/file_encoder.h similarity index 100% rename from shared/sentry/external/crashpad/util/stream/file_encoder.h rename to shared/sentry/src/external/crashpad/util/stream/file_encoder.h diff --git a/shared/sentry/external/crashpad/util/stream/file_encoder_test.cc b/shared/sentry/src/external/crashpad/util/stream/file_encoder_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/file_encoder_test.cc rename to shared/sentry/src/external/crashpad/util/stream/file_encoder_test.cc diff --git a/shared/sentry/external/crashpad/util/stream/file_output_stream.cc b/shared/sentry/src/external/crashpad/util/stream/file_output_stream.cc similarity index 98% rename from shared/sentry/external/crashpad/util/stream/file_output_stream.cc rename to shared/sentry/src/external/crashpad/util/stream/file_output_stream.cc index 91aed9043..a3633f9de 100644 --- a/shared/sentry/external/crashpad/util/stream/file_output_stream.cc +++ b/shared/sentry/src/external/crashpad/util/stream/file_output_stream.cc @@ -14,6 +14,7 @@ #include "util/stream/file_output_stream.h" +#include "base/check.h" #include "base/logging.h" namespace crashpad { diff --git a/shared/sentry/external/crashpad/util/stream/file_output_stream.h b/shared/sentry/src/external/crashpad/util/stream/file_output_stream.h similarity index 100% rename from shared/sentry/external/crashpad/util/stream/file_output_stream.h rename to shared/sentry/src/external/crashpad/util/stream/file_output_stream.h diff --git a/shared/sentry/external/crashpad/util/stream/log_output_stream.cc b/shared/sentry/src/external/crashpad/util/stream/log_output_stream.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/log_output_stream.cc rename to shared/sentry/src/external/crashpad/util/stream/log_output_stream.cc diff --git a/shared/sentry/external/crashpad/util/stream/log_output_stream.h b/shared/sentry/src/external/crashpad/util/stream/log_output_stream.h similarity index 100% rename from shared/sentry/external/crashpad/util/stream/log_output_stream.h rename to shared/sentry/src/external/crashpad/util/stream/log_output_stream.h diff --git a/shared/sentry/external/crashpad/util/stream/log_output_stream_test.cc b/shared/sentry/src/external/crashpad/util/stream/log_output_stream_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/log_output_stream_test.cc rename to shared/sentry/src/external/crashpad/util/stream/log_output_stream_test.cc diff --git a/shared/sentry/external/crashpad/util/stream/output_stream_interface.h b/shared/sentry/src/external/crashpad/util/stream/output_stream_interface.h similarity index 100% rename from shared/sentry/external/crashpad/util/stream/output_stream_interface.h rename to shared/sentry/src/external/crashpad/util/stream/output_stream_interface.h diff --git a/shared/sentry/external/crashpad/util/stream/test_output_stream.cc b/shared/sentry/src/external/crashpad/util/stream/test_output_stream.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/test_output_stream.cc rename to shared/sentry/src/external/crashpad/util/stream/test_output_stream.cc diff --git a/shared/sentry/external/crashpad/util/stream/test_output_stream.h b/shared/sentry/src/external/crashpad/util/stream/test_output_stream.h similarity index 100% rename from shared/sentry/external/crashpad/util/stream/test_output_stream.h rename to shared/sentry/src/external/crashpad/util/stream/test_output_stream.h diff --git a/shared/sentry/external/crashpad/util/stream/zlib_output_stream.cc b/shared/sentry/src/external/crashpad/util/stream/zlib_output_stream.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/zlib_output_stream.cc rename to shared/sentry/src/external/crashpad/util/stream/zlib_output_stream.cc diff --git a/shared/sentry/external/crashpad/util/stream/zlib_output_stream.h b/shared/sentry/src/external/crashpad/util/stream/zlib_output_stream.h similarity index 100% rename from shared/sentry/external/crashpad/util/stream/zlib_output_stream.h rename to shared/sentry/src/external/crashpad/util/stream/zlib_output_stream.h diff --git a/shared/sentry/external/crashpad/util/stream/zlib_output_stream_test.cc b/shared/sentry/src/external/crashpad/util/stream/zlib_output_stream_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/stream/zlib_output_stream_test.cc rename to shared/sentry/src/external/crashpad/util/stream/zlib_output_stream_test.cc diff --git a/shared/sentry/external/crashpad/util/string/split_string.cc b/shared/sentry/src/external/crashpad/util/string/split_string.cc similarity index 100% rename from shared/sentry/external/crashpad/util/string/split_string.cc rename to shared/sentry/src/external/crashpad/util/string/split_string.cc diff --git a/shared/sentry/external/crashpad/util/string/split_string.h b/shared/sentry/src/external/crashpad/util/string/split_string.h similarity index 100% rename from shared/sentry/external/crashpad/util/string/split_string.h rename to shared/sentry/src/external/crashpad/util/string/split_string.h diff --git a/shared/sentry/external/crashpad/util/string/split_string_test.cc b/shared/sentry/src/external/crashpad/util/string/split_string_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/string/split_string_test.cc rename to shared/sentry/src/external/crashpad/util/string/split_string_test.cc diff --git a/shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard.h b/shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard.h new file mode 100644 index 000000000..f924d991a --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard.h @@ -0,0 +1,122 @@ +// Copyright 2022 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_SYNCHRONIZATION_SCOPED_SPIN_GUARD_H_ +#define CRASHPAD_UTIL_SYNCHRONIZATION_SCOPED_SPIN_GUARD_H_ + +#include +#include +#include + +#include "base/check.h" +#include "base/notreached.h" +#include "util/misc/clock.h" + +namespace crashpad { + +//! \brief Spinlock state for `ScopedSpinGuard`. +struct SpinGuardState final { + //! \brief A `ScopedSpinGuard` in an unlocked state. + constexpr SpinGuardState() : locked(false) {} + + SpinGuardState(const SpinGuardState&) = delete; + SpinGuardState& operator=(const SpinGuardState&) = delete; + + //! \brief `true` if the `ScopedSpinGuard` is locked, `false` otherwise. + std::atomic locked; + static_assert(std::atomic::is_always_lock_free, + "std::atomic may not be signal-safe"); + static_assert(sizeof(std::atomic) == sizeof(bool), + "std::atomic adds size to bool"); +}; + +//! \brief A scoped mutual-exclusion guard wrapping a `SpinGuardState` with RAII +//! semantics. +class ScopedSpinGuard final { + //! \brief The duration in nanoseconds between attempts to lock the spinlock. + static constexpr uint64_t kSpinGuardSleepTimeNanos = 10; + + public: + ScopedSpinGuard(const ScopedSpinGuard&) = delete; + ScopedSpinGuard& operator=(const ScopedSpinGuard&) = delete; + ScopedSpinGuard(ScopedSpinGuard&& other) noexcept : state_(nullptr) { + std::swap(state_, other.state_); + } + ScopedSpinGuard& operator=(ScopedSpinGuard&& other) { + std::swap(state_, other.state_); + return *this; + } + + //! \brief Spins up to `timeout_nanos` nanoseconds trying to lock `state`. + //! \param[in] timeout_nanos The timeout in nanoseconds after which this gives + //! up trying to lock the spinlock and returns `std::nullopt`. + //! \param[in,out] state The spinlock state to attempt to lock. This method + //! holds a pointer to `state`, so `state` must outlive the lifetime of + //! this object. + //! \return The locked `ScopedSpinGuard` on success, or `std::nullopt` on + //! timeout. + static std::optional TryCreateScopedSpinGuard( + uint64_t timeout_nanos, + SpinGuardState& state) { + const uint64_t clock_end_time_nanos = + ClockMonotonicNanoseconds() + timeout_nanos; + while (true) { + bool expected_current_value = false; + if (state.locked.compare_exchange_weak(expected_current_value, + true, + std::memory_order_acquire, + std::memory_order_relaxed)) { + return std::make_optional(state); + } + if (ClockMonotonicNanoseconds() >= clock_end_time_nanos) { + return std::nullopt; + } + SleepNanoseconds(kSpinGuardSleepTimeNanos); + } + + NOTREACHED(); + } + + ~ScopedSpinGuard() { + if (state_) { +#ifdef NDEBUG + state_->locked.store(false, std::memory_order_release); +#else + bool old = state_->locked.exchange(false, std::memory_order_release); + DCHECK(old); +#endif + } + } + + //! \brief A `ScopedSpinGuard` wrapping a locked `SpinGuardState`. + //! \param[in,out] locked_state A locked `SpinGuardState`. This method + //! holds a pointer to `state`, so `state` must outlive the lifetime of + //! this object. + ScopedSpinGuard(SpinGuardState& locked_state) : state_(&locked_state) { + DCHECK(locked_state.locked); + } + + private: + // \brief Optional spinlock state, unlocked when this object goes out of + // scope. + // + // If this is `nullptr`, then this object has been moved from, and the state + // is no longer valid. In that case, nothing will be unlocked when this object + // is destroyed. + SpinGuardState* state_; +}; + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_SYNCHRONIZATION_SCOPED_SPIN_GUARD_H_ diff --git a/shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard_test.cc b/shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard_test.cc new file mode 100644 index 000000000..9980d50df --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/synchronization/scoped_spin_guard_test.cc @@ -0,0 +1,109 @@ +// Copyright 2022 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/synchronization/scoped_spin_guard.h" + +#include +#include + +#include "gtest/gtest.h" +#include "util/misc/clock.h" + +namespace crashpad { +namespace test { +namespace { + +TEST(ScopedSpinGuard, TryCreateScopedSpinGuardShouldLockStateWhileInScope) { + SpinGuardState s; + EXPECT_FALSE(s.locked); + { + std::optional guard = + ScopedSpinGuard::TryCreateScopedSpinGuard(/*timeout_nanos=*/0, s); + EXPECT_NE(std::nullopt, guard); + EXPECT_TRUE(s.locked); + } + EXPECT_FALSE(s.locked); +} + +TEST( + ScopedSpinGuard, + TryCreateScopedSpinGuardWithZeroTimeoutShouldFailImmediatelyIfStateLocked) { + SpinGuardState s; + s.locked = true; + std::optional guard = + ScopedSpinGuard::TryCreateScopedSpinGuard(/*timeout_nanos=*/0, s); + EXPECT_EQ(std::nullopt, guard); + EXPECT_TRUE(s.locked); +} + +TEST( + ScopedSpinGuard, + TryCreateScopedSpinGuardWithNonZeroTimeoutShouldSucceedIfStateUnlockedDuringTimeout) { + SpinGuardState s; + s.locked = true; + std::thread unlock_thread([&s] { + constexpr uint64_t kUnlockThreadSleepTimeNanos = 10000; // 10 us + EXPECT_TRUE(s.locked); + SleepNanoseconds(kUnlockThreadSleepTimeNanos); + s.locked = false; + }); + constexpr uint64_t kLockThreadTimeoutNanos = 180000000000ULL; // 3 minutes + std::optional guard = + ScopedSpinGuard::TryCreateScopedSpinGuard(kLockThreadTimeoutNanos, s); + EXPECT_NE(std::nullopt, guard); + EXPECT_TRUE(s.locked); + unlock_thread.join(); +} + +TEST(ScopedSpinGuard, SwapShouldMaintainSpinLock) { + SpinGuardState s; + std::optional outer_guard; + EXPECT_EQ(std::nullopt, outer_guard); + { + std::optional inner_guard = + ScopedSpinGuard::TryCreateScopedSpinGuard(/*timeout_nanos=*/0, s); + EXPECT_NE(std::nullopt, inner_guard); + EXPECT_TRUE(s.locked); + // If the move-assignment operator for `ScopedSpinGuard` is implemented + // incorrectly (e.g., the `= default` implementation), `inner_guard` + // will incorrectly think it still "owns" the spinlock after the swap, + // and when it falls out of scope, it will release the lock prematurely + // when it destructs. + // + // Confirm that the spinlock stays locked even after the swap. + std::swap(outer_guard, inner_guard); + EXPECT_TRUE(s.locked); + EXPECT_EQ(std::nullopt, inner_guard); + } + EXPECT_NE(std::nullopt, outer_guard); + EXPECT_TRUE(s.locked); +} + +TEST(ScopedSpinGuard, MoveAssignmentShouldMaintainSpinLock) { + SpinGuardState s; + std::optional outer_guard; + EXPECT_EQ(std::nullopt, outer_guard); + { + outer_guard = + ScopedSpinGuard::TryCreateScopedSpinGuard(/*timeout_nanos=*/0, s); + EXPECT_NE(std::nullopt, outer_guard); + EXPECT_TRUE(s.locked); + } + EXPECT_NE(std::nullopt, outer_guard); + EXPECT_TRUE(s.locked); +} + +} // namespace +} // namespace test +} // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/synchronization/semaphore.h b/shared/sentry/src/external/crashpad/util/synchronization/semaphore.h similarity index 100% rename from shared/sentry/external/crashpad/util/synchronization/semaphore.h rename to shared/sentry/src/external/crashpad/util/synchronization/semaphore.h diff --git a/shared/sentry/external/crashpad/util/synchronization/semaphore_mac.cc b/shared/sentry/src/external/crashpad/util/synchronization/semaphore_mac.cc similarity index 100% rename from shared/sentry/external/crashpad/util/synchronization/semaphore_mac.cc rename to shared/sentry/src/external/crashpad/util/synchronization/semaphore_mac.cc diff --git a/shared/sentry/external/crashpad/util/synchronization/semaphore_posix.cc b/shared/sentry/src/external/crashpad/util/synchronization/semaphore_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/util/synchronization/semaphore_posix.cc rename to shared/sentry/src/external/crashpad/util/synchronization/semaphore_posix.cc diff --git a/shared/sentry/external/crashpad/util/synchronization/semaphore_test.cc b/shared/sentry/src/external/crashpad/util/synchronization/semaphore_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/synchronization/semaphore_test.cc rename to shared/sentry/src/external/crashpad/util/synchronization/semaphore_test.cc diff --git a/shared/sentry/external/crashpad/util/synchronization/semaphore_win.cc b/shared/sentry/src/external/crashpad/util/synchronization/semaphore_win.cc similarity index 100% rename from shared/sentry/external/crashpad/util/synchronization/semaphore_win.cc rename to shared/sentry/src/external/crashpad/util/synchronization/semaphore_win.cc diff --git a/shared/sentry/external/crashpad/util/thread/stoppable.h b/shared/sentry/src/external/crashpad/util/thread/stoppable.h similarity index 100% rename from shared/sentry/external/crashpad/util/thread/stoppable.h rename to shared/sentry/src/external/crashpad/util/thread/stoppable.h diff --git a/shared/sentry/external/crashpad/util/thread/thread.cc b/shared/sentry/src/external/crashpad/util/thread/thread.cc similarity index 100% rename from shared/sentry/external/crashpad/util/thread/thread.cc rename to shared/sentry/src/external/crashpad/util/thread/thread.cc diff --git a/shared/sentry/external/crashpad/util/thread/thread.h b/shared/sentry/src/external/crashpad/util/thread/thread.h similarity index 100% rename from shared/sentry/external/crashpad/util/thread/thread.h rename to shared/sentry/src/external/crashpad/util/thread/thread.h diff --git a/shared/sentry/src/external/crashpad/util/thread/thread_log_messages.cc b/shared/sentry/src/external/crashpad/util/thread/thread_log_messages.cc new file mode 100644 index 000000000..efc6e2e11 --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/thread/thread_log_messages.cc @@ -0,0 +1,55 @@ +// Copyright 2015 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/thread/thread_log_messages.h" + +#include + +#include "base/check_op.h" +#include "base/logging.h" + +namespace crashpad { + +namespace { + +thread_local std::vector* thread_local_log_messages; + +bool LogMessageHandler(logging::LogSeverity severity, + const char* file_path, + int line, + size_t message_start, + const std::string& string) { + if (thread_local_log_messages) { + thread_local_log_messages->push_back(string); + } + + // Don’t consume the message. Allow it to be logged as if nothing was set as + // the log message handler. + return false; +} + +} // namespace + +ThreadLogMessages::ThreadLogMessages() + : log_messages_(), + reset_thread_local_log_messages_(&thread_local_log_messages, + &log_messages_) { + [[maybe_unused]] static bool initialized = [] { + DCHECK(!logging::GetLogMessageHandler()); + logging::SetLogMessageHandler(LogMessageHandler); + return true; + }(); +} + +} // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/thread/thread_log_messages.h b/shared/sentry/src/external/crashpad/util/thread/thread_log_messages.h similarity index 91% rename from shared/sentry/external/crashpad/util/thread/thread_log_messages.h rename to shared/sentry/src/external/crashpad/util/thread/thread_log_messages.h index 0136f6f2a..43e3cd0df 100644 --- a/shared/sentry/external/crashpad/util/thread/thread_log_messages.h +++ b/shared/sentry/src/external/crashpad/util/thread/thread_log_messages.h @@ -18,6 +18,7 @@ #include #include +#include "base/auto_reset.h" namespace crashpad { @@ -34,7 +35,7 @@ class ThreadLogMessages { ThreadLogMessages(const ThreadLogMessages&) = delete; ThreadLogMessages& operator=(const ThreadLogMessages&) = delete; - ~ThreadLogMessages(); + ~ThreadLogMessages() = default; //! \return The log messages collected on the thread that this object was //! created on since the time it was created. @@ -42,6 +43,8 @@ class ThreadLogMessages { private: std::vector log_messages_; + const base::AutoReset*> + reset_thread_local_log_messages_; }; } // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/thread/thread_log_messages_test.cc b/shared/sentry/src/external/crashpad/util/thread/thread_log_messages_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/thread/thread_log_messages_test.cc rename to shared/sentry/src/external/crashpad/util/thread/thread_log_messages_test.cc diff --git a/shared/sentry/external/crashpad/util/thread/thread_posix.cc b/shared/sentry/src/external/crashpad/util/thread/thread_posix.cc similarity index 100% rename from shared/sentry/external/crashpad/util/thread/thread_posix.cc rename to shared/sentry/src/external/crashpad/util/thread/thread_posix.cc diff --git a/shared/sentry/external/crashpad/util/thread/thread_test.cc b/shared/sentry/src/external/crashpad/util/thread/thread_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/thread/thread_test.cc rename to shared/sentry/src/external/crashpad/util/thread/thread_test.cc diff --git a/shared/sentry/external/crashpad/util/thread/thread_win.cc b/shared/sentry/src/external/crashpad/util/thread/thread_win.cc similarity index 100% rename from shared/sentry/external/crashpad/util/thread/thread_win.cc rename to shared/sentry/src/external/crashpad/util/thread/thread_win.cc diff --git a/shared/sentry/external/crashpad/util/thread/worker_thread.cc b/shared/sentry/src/external/crashpad/util/thread/worker_thread.cc similarity index 100% rename from shared/sentry/external/crashpad/util/thread/worker_thread.cc rename to shared/sentry/src/external/crashpad/util/thread/worker_thread.cc diff --git a/shared/sentry/external/crashpad/util/thread/worker_thread.h b/shared/sentry/src/external/crashpad/util/thread/worker_thread.h similarity index 100% rename from shared/sentry/external/crashpad/util/thread/worker_thread.h rename to shared/sentry/src/external/crashpad/util/thread/worker_thread.h diff --git a/shared/sentry/external/crashpad/util/thread/worker_thread_test.cc b/shared/sentry/src/external/crashpad/util/thread/worker_thread_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/thread/worker_thread_test.cc rename to shared/sentry/src/external/crashpad/util/thread/worker_thread_test.cc diff --git a/shared/sentry/external/crashpad/util/win/address_types.h b/shared/sentry/src/external/crashpad/util/win/address_types.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/address_types.h rename to shared/sentry/src/external/crashpad/util/win/address_types.h diff --git a/shared/sentry/external/crashpad/util/win/checked_win_address_range.h b/shared/sentry/src/external/crashpad/util/win/checked_win_address_range.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/checked_win_address_range.h rename to shared/sentry/src/external/crashpad/util/win/checked_win_address_range.h diff --git a/shared/sentry/external/crashpad/util/win/command_line.cc b/shared/sentry/src/external/crashpad/util/win/command_line.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/command_line.cc rename to shared/sentry/src/external/crashpad/util/win/command_line.cc diff --git a/shared/sentry/external/crashpad/util/win/command_line.h b/shared/sentry/src/external/crashpad/util/win/command_line.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/command_line.h rename to shared/sentry/src/external/crashpad/util/win/command_line.h diff --git a/shared/sentry/external/crashpad/util/win/command_line_test.cc b/shared/sentry/src/external/crashpad/util/win/command_line_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/command_line_test.cc rename to shared/sentry/src/external/crashpad/util/win/command_line_test.cc diff --git a/shared/sentry/external/crashpad/util/win/context_wrappers.h b/shared/sentry/src/external/crashpad/util/win/context_wrappers.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/context_wrappers.h rename to shared/sentry/src/external/crashpad/util/win/context_wrappers.h diff --git a/shared/sentry/external/crashpad/util/win/critical_section_with_debug_info.cc b/shared/sentry/src/external/crashpad/util/win/critical_section_with_debug_info.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/critical_section_with_debug_info.cc rename to shared/sentry/src/external/crashpad/util/win/critical_section_with_debug_info.cc diff --git a/shared/sentry/external/crashpad/util/win/critical_section_with_debug_info.h b/shared/sentry/src/external/crashpad/util/win/critical_section_with_debug_info.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/critical_section_with_debug_info.h rename to shared/sentry/src/external/crashpad/util/win/critical_section_with_debug_info.h diff --git a/shared/sentry/external/crashpad/util/win/critical_section_with_debug_info_test.cc b/shared/sentry/src/external/crashpad/util/win/critical_section_with_debug_info_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/critical_section_with_debug_info_test.cc rename to shared/sentry/src/external/crashpad/util/win/critical_section_with_debug_info_test.cc diff --git a/shared/sentry/external/crashpad/util/win/exception_codes.h b/shared/sentry/src/external/crashpad/util/win/exception_codes.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/exception_codes.h rename to shared/sentry/src/external/crashpad/util/win/exception_codes.h diff --git a/shared/sentry/external/crashpad/util/win/exception_handler_server.cc b/shared/sentry/src/external/crashpad/util/win/exception_handler_server.cc similarity index 99% rename from shared/sentry/external/crashpad/util/win/exception_handler_server.cc rename to shared/sentry/src/external/crashpad/util/win/exception_handler_server.cc index ba938ec93..e641c7fb9 100644 --- a/shared/sentry/external/crashpad/util/win/exception_handler_server.cc +++ b/shared/sentry/src/external/crashpad/util/win/exception_handler_server.cc @@ -21,6 +21,7 @@ #include #include +#include "base/check.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/rand_util.h" diff --git a/shared/sentry/external/crashpad/util/win/exception_handler_server.h b/shared/sentry/src/external/crashpad/util/win/exception_handler_server.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/exception_handler_server.h rename to shared/sentry/src/external/crashpad/util/win/exception_handler_server.h diff --git a/shared/sentry/external/crashpad/util/win/exception_handler_server_test.cc b/shared/sentry/src/external/crashpad/util/win/exception_handler_server_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/exception_handler_server_test.cc rename to shared/sentry/src/external/crashpad/util/win/exception_handler_server_test.cc diff --git a/shared/sentry/external/crashpad/util/win/get_function.cc b/shared/sentry/src/external/crashpad/util/win/get_function.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/get_function.cc rename to shared/sentry/src/external/crashpad/util/win/get_function.cc diff --git a/shared/sentry/external/crashpad/util/win/get_function.h b/shared/sentry/src/external/crashpad/util/win/get_function.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/get_function.h rename to shared/sentry/src/external/crashpad/util/win/get_function.h diff --git a/shared/sentry/external/crashpad/util/win/get_function_test.cc b/shared/sentry/src/external/crashpad/util/win/get_function_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/get_function_test.cc rename to shared/sentry/src/external/crashpad/util/win/get_function_test.cc diff --git a/shared/sentry/external/crashpad/util/win/get_module_information.cc b/shared/sentry/src/external/crashpad/util/win/get_module_information.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/get_module_information.cc rename to shared/sentry/src/external/crashpad/util/win/get_module_information.cc diff --git a/shared/sentry/external/crashpad/util/win/get_module_information.h b/shared/sentry/src/external/crashpad/util/win/get_module_information.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/get_module_information.h rename to shared/sentry/src/external/crashpad/util/win/get_module_information.h diff --git a/shared/sentry/external/crashpad/util/win/handle.cc b/shared/sentry/src/external/crashpad/util/win/handle.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/handle.cc rename to shared/sentry/src/external/crashpad/util/win/handle.cc diff --git a/shared/sentry/external/crashpad/util/win/handle.h b/shared/sentry/src/external/crashpad/util/win/handle.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/handle.h rename to shared/sentry/src/external/crashpad/util/win/handle.h diff --git a/shared/sentry/external/crashpad/util/win/handle_test.cc b/shared/sentry/src/external/crashpad/util/win/handle_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/handle_test.cc rename to shared/sentry/src/external/crashpad/util/win/handle_test.cc diff --git a/shared/sentry/external/crashpad/util/win/initial_client_data.cc b/shared/sentry/src/external/crashpad/util/win/initial_client_data.cc similarity index 96% rename from shared/sentry/external/crashpad/util/win/initial_client_data.cc rename to shared/sentry/src/external/crashpad/util/win/initial_client_data.cc index c119ad954..d74d66c26 100644 --- a/shared/sentry/external/crashpad/util/win/initial_client_data.cc +++ b/shared/sentry/src/external/crashpad/util/win/initial_client_data.cc @@ -16,6 +16,7 @@ #include +#include "base/format_macros.h" #include "base/logging.h" #include "base/strings/stringprintf.h" #include "util/stdlib/string_number_conversion.h" @@ -99,7 +100,8 @@ bool InitialClientData::InitializeFromString(const std::string& str) { } std::string InitialClientData::StringRepresentation() const { - return base::StringPrintf("0x%x,0x%x,0x%x,0x%x,0x%x,0x%I64x,0x%I64x,0x%I64x", + return base::StringPrintf("0x%x,0x%x,0x%x,0x%x,0x%x,0x%" PRIx64 ",0x%" PRIx64 + ",0x%" PRIx64, HandleToInt(request_crash_dump_), HandleToInt(request_non_crash_dump_), HandleToInt(non_crash_dump_completed_), diff --git a/shared/sentry/external/crashpad/util/win/initial_client_data.h b/shared/sentry/src/external/crashpad/util/win/initial_client_data.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/initial_client_data.h rename to shared/sentry/src/external/crashpad/util/win/initial_client_data.h diff --git a/shared/sentry/external/crashpad/util/win/initial_client_data_test.cc b/shared/sentry/src/external/crashpad/util/win/initial_client_data_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/initial_client_data_test.cc rename to shared/sentry/src/external/crashpad/util/win/initial_client_data_test.cc diff --git a/shared/sentry/external/crashpad/util/win/loader_lock.cc b/shared/sentry/src/external/crashpad/util/win/loader_lock.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/loader_lock.cc rename to shared/sentry/src/external/crashpad/util/win/loader_lock.cc diff --git a/shared/sentry/external/crashpad/util/win/loader_lock.h b/shared/sentry/src/external/crashpad/util/win/loader_lock.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/loader_lock.h rename to shared/sentry/src/external/crashpad/util/win/loader_lock.h diff --git a/shared/sentry/external/crashpad/util/win/loader_lock_test.cc b/shared/sentry/src/external/crashpad/util/win/loader_lock_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/loader_lock_test.cc rename to shared/sentry/src/external/crashpad/util/win/loader_lock_test.cc diff --git a/shared/sentry/external/crashpad/util/win/loader_lock_test_dll.cc b/shared/sentry/src/external/crashpad/util/win/loader_lock_test_dll.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/loader_lock_test_dll.cc rename to shared/sentry/src/external/crashpad/util/win/loader_lock_test_dll.cc diff --git a/shared/sentry/external/crashpad/util/win/module_version.cc b/shared/sentry/src/external/crashpad/util/win/module_version.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/module_version.cc rename to shared/sentry/src/external/crashpad/util/win/module_version.cc diff --git a/shared/sentry/external/crashpad/util/win/module_version.h b/shared/sentry/src/external/crashpad/util/win/module_version.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/module_version.h rename to shared/sentry/src/external/crashpad/util/win/module_version.h diff --git a/shared/sentry/external/crashpad/util/win/nt_internals.cc b/shared/sentry/src/external/crashpad/util/win/nt_internals.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/nt_internals.cc rename to shared/sentry/src/external/crashpad/util/win/nt_internals.cc diff --git a/shared/sentry/external/crashpad/util/win/nt_internals.h b/shared/sentry/src/external/crashpad/util/win/nt_internals.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/nt_internals.h rename to shared/sentry/src/external/crashpad/util/win/nt_internals.h diff --git a/shared/sentry/external/crashpad/util/win/ntstatus_logging.cc b/shared/sentry/src/external/crashpad/util/win/ntstatus_logging.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/ntstatus_logging.cc rename to shared/sentry/src/external/crashpad/util/win/ntstatus_logging.cc diff --git a/shared/sentry/external/crashpad/util/win/ntstatus_logging.h b/shared/sentry/src/external/crashpad/util/win/ntstatus_logging.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/ntstatus_logging.h rename to shared/sentry/src/external/crashpad/util/win/ntstatus_logging.h diff --git a/shared/sentry/external/crashpad/util/win/process_info.cc b/shared/sentry/src/external/crashpad/util/win/process_info.cc similarity index 99% rename from shared/sentry/external/crashpad/util/win/process_info.cc rename to shared/sentry/src/external/crashpad/util/win/process_info.cc index 85653885b..6c23cd009 100644 --- a/shared/sentry/external/crashpad/util/win/process_info.cc +++ b/shared/sentry/src/external/crashpad/util/win/process_info.cc @@ -23,6 +23,7 @@ #include #include +#include "base/check_op.h" #include "base/logging.h" #include "base/memory/free_deleter.h" #include "base/process/memory.h" diff --git a/shared/sentry/external/crashpad/util/win/process_info.h b/shared/sentry/src/external/crashpad/util/win/process_info.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/process_info.h rename to shared/sentry/src/external/crashpad/util/win/process_info.h diff --git a/shared/sentry/external/crashpad/util/win/process_info_test.cc b/shared/sentry/src/external/crashpad/util/win/process_info_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/process_info_test.cc rename to shared/sentry/src/external/crashpad/util/win/process_info_test.cc diff --git a/shared/sentry/external/crashpad/util/win/process_info_test_child.cc b/shared/sentry/src/external/crashpad/util/win/process_info_test_child.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/process_info_test_child.cc rename to shared/sentry/src/external/crashpad/util/win/process_info_test_child.cc diff --git a/shared/sentry/external/crashpad/util/win/process_structs.h b/shared/sentry/src/external/crashpad/util/win/process_structs.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/process_structs.h rename to shared/sentry/src/external/crashpad/util/win/process_structs.h diff --git a/shared/sentry/external/crashpad/util/win/registration_protocol_win.cc b/shared/sentry/src/external/crashpad/util/win/registration_protocol_win.cc similarity index 99% rename from shared/sentry/external/crashpad/util/win/registration_protocol_win.cc rename to shared/sentry/src/external/crashpad/util/win/registration_protocol_win.cc index d71c56030..95111f9c5 100644 --- a/shared/sentry/external/crashpad/util/win/registration_protocol_win.cc +++ b/shared/sentry/src/external/crashpad/util/win/registration_protocol_win.cc @@ -21,6 +21,7 @@ #include +#include "base/check.h" #include "base/logging.h" #include "util/win/exception_handler_server.h" #include "util/win/loader_lock.h" diff --git a/shared/sentry/external/crashpad/util/win/registration_protocol_win.h b/shared/sentry/src/external/crashpad/util/win/registration_protocol_win.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/registration_protocol_win.h rename to shared/sentry/src/external/crashpad/util/win/registration_protocol_win.h diff --git a/shared/sentry/external/crashpad/util/win/registration_protocol_win_structs.h b/shared/sentry/src/external/crashpad/util/win/registration_protocol_win_structs.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/registration_protocol_win_structs.h rename to shared/sentry/src/external/crashpad/util/win/registration_protocol_win_structs.h diff --git a/shared/sentry/external/crashpad/util/win/registration_protocol_win_test.cc b/shared/sentry/src/external/crashpad/util/win/registration_protocol_win_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/registration_protocol_win_test.cc rename to shared/sentry/src/external/crashpad/util/win/registration_protocol_win_test.cc diff --git a/shared/sentry/external/crashpad/util/win/safe_terminate_process.asm b/shared/sentry/src/external/crashpad/util/win/safe_terminate_process.asm similarity index 100% rename from shared/sentry/external/crashpad/util/win/safe_terminate_process.asm rename to shared/sentry/src/external/crashpad/util/win/safe_terminate_process.asm diff --git a/shared/sentry/external/crashpad/util/win/safe_terminate_process.h b/shared/sentry/src/external/crashpad/util/win/safe_terminate_process.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/safe_terminate_process.h rename to shared/sentry/src/external/crashpad/util/win/safe_terminate_process.h diff --git a/shared/sentry/external/crashpad/util/win/safe_terminate_process_test.cc b/shared/sentry/src/external/crashpad/util/win/safe_terminate_process_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/safe_terminate_process_test.cc rename to shared/sentry/src/external/crashpad/util/win/safe_terminate_process_test.cc diff --git a/shared/sentry/external/crashpad/util/win/safe_terminate_process_test_child.cc b/shared/sentry/src/external/crashpad/util/win/safe_terminate_process_test_child.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/safe_terminate_process_test_child.cc rename to shared/sentry/src/external/crashpad/util/win/safe_terminate_process_test_child.cc diff --git a/shared/sentry/external/crashpad/util/win/scoped_handle.cc b/shared/sentry/src/external/crashpad/util/win/scoped_handle.cc similarity index 89% rename from shared/sentry/external/crashpad/util/win/scoped_handle.cc rename to shared/sentry/src/external/crashpad/util/win/scoped_handle.cc index e9f7a9a73..b979134a2 100644 --- a/shared/sentry/external/crashpad/util/win/scoped_handle.cc +++ b/shared/sentry/src/external/crashpad/util/win/scoped_handle.cc @@ -32,5 +32,9 @@ void ScopedSearchHANDLECloseTraits::Free(HANDLE handle) { PCHECK(FindClose(handle)) << "FindClose"; } +void ScopedVectoredExceptionRegistrationCloseTraits::Free(PVOID handle) { + PCHECK(::RemoveVectoredExceptionHandler(handle)); +} + } // namespace internal } // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/win/scoped_handle.h b/shared/sentry/src/external/crashpad/util/win/scoped_handle.h similarity index 84% rename from shared/sentry/external/crashpad/util/win/scoped_handle.h rename to shared/sentry/src/external/crashpad/util/win/scoped_handle.h index 5d629104f..62e7e8075 100644 --- a/shared/sentry/external/crashpad/util/win/scoped_handle.h +++ b/shared/sentry/src/external/crashpad/util/win/scoped_handle.h @@ -38,6 +38,11 @@ struct ScopedSearchHANDLECloseTraits { static void Free(HANDLE handle); }; +struct ScopedVectoredExceptionRegistrationCloseTraits { + static PVOID InvalidValue() { return nullptr; } + static void Free(PVOID handle); +}; + } // namespace internal using ScopedFileHANDLE = @@ -46,6 +51,9 @@ using ScopedKernelHANDLE = base::ScopedGeneric; using ScopedSearchHANDLE = base::ScopedGeneric; +using ScopedVectoredExceptionRegistration = base::ScopedGeneric< + PVOID, + internal::ScopedVectoredExceptionRegistrationCloseTraits>; } // namespace crashpad diff --git a/shared/sentry/external/crashpad/util/win/scoped_local_alloc.cc b/shared/sentry/src/external/crashpad/util/win/scoped_local_alloc.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_local_alloc.cc rename to shared/sentry/src/external/crashpad/util/win/scoped_local_alloc.cc diff --git a/shared/sentry/external/crashpad/util/win/scoped_local_alloc.h b/shared/sentry/src/external/crashpad/util/win/scoped_local_alloc.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_local_alloc.h rename to shared/sentry/src/external/crashpad/util/win/scoped_local_alloc.h diff --git a/shared/sentry/external/crashpad/util/win/scoped_process_suspend.cc b/shared/sentry/src/external/crashpad/util/win/scoped_process_suspend.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_process_suspend.cc rename to shared/sentry/src/external/crashpad/util/win/scoped_process_suspend.cc diff --git a/shared/sentry/external/crashpad/util/win/scoped_process_suspend.h b/shared/sentry/src/external/crashpad/util/win/scoped_process_suspend.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_process_suspend.h rename to shared/sentry/src/external/crashpad/util/win/scoped_process_suspend.h diff --git a/shared/sentry/external/crashpad/util/win/scoped_process_suspend_test.cc b/shared/sentry/src/external/crashpad/util/win/scoped_process_suspend_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_process_suspend_test.cc rename to shared/sentry/src/external/crashpad/util/win/scoped_process_suspend_test.cc diff --git a/shared/sentry/external/crashpad/util/win/scoped_registry_key.h b/shared/sentry/src/external/crashpad/util/win/scoped_registry_key.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_registry_key.h rename to shared/sentry/src/external/crashpad/util/win/scoped_registry_key.h diff --git a/shared/sentry/external/crashpad/util/win/scoped_set_event.cc b/shared/sentry/src/external/crashpad/util/win/scoped_set_event.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_set_event.cc rename to shared/sentry/src/external/crashpad/util/win/scoped_set_event.cc diff --git a/shared/sentry/external/crashpad/util/win/scoped_set_event.h b/shared/sentry/src/external/crashpad/util/win/scoped_set_event.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/scoped_set_event.h rename to shared/sentry/src/external/crashpad/util/win/scoped_set_event.h diff --git a/shared/sentry/external/crashpad/util/win/session_end_watcher.cc b/shared/sentry/src/external/crashpad/util/win/session_end_watcher.cc similarity index 99% rename from shared/sentry/external/crashpad/util/win/session_end_watcher.cc rename to shared/sentry/src/external/crashpad/util/win/session_end_watcher.cc index d685a995f..ead6b7fc6 100644 --- a/shared/sentry/external/crashpad/util/win/session_end_watcher.cc +++ b/shared/sentry/src/external/crashpad/util/win/session_end_watcher.cc @@ -14,6 +14,7 @@ #include "util/win/session_end_watcher.h" +#include "base/check.h" #include "base/logging.h" #include "base/scoped_generic.h" #include "util/win/scoped_set_event.h" diff --git a/shared/sentry/external/crashpad/util/win/session_end_watcher.h b/shared/sentry/src/external/crashpad/util/win/session_end_watcher.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/session_end_watcher.h rename to shared/sentry/src/external/crashpad/util/win/session_end_watcher.h diff --git a/shared/sentry/external/crashpad/util/win/session_end_watcher_test.cc b/shared/sentry/src/external/crashpad/util/win/session_end_watcher_test.cc similarity index 100% rename from shared/sentry/external/crashpad/util/win/session_end_watcher_test.cc rename to shared/sentry/src/external/crashpad/util/win/session_end_watcher_test.cc diff --git a/shared/sentry/external/crashpad/util/win/termination_codes.h b/shared/sentry/src/external/crashpad/util/win/termination_codes.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/termination_codes.h rename to shared/sentry/src/external/crashpad/util/win/termination_codes.h diff --git a/shared/sentry/external/crashpad/util/win/traits.h b/shared/sentry/src/external/crashpad/util/win/traits.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/traits.h rename to shared/sentry/src/external/crashpad/util/win/traits.h diff --git a/shared/sentry/external/crashpad/util/win/xp_compat.h b/shared/sentry/src/external/crashpad/util/win/xp_compat.h similarity index 100% rename from shared/sentry/external/crashpad/util/win/xp_compat.h rename to shared/sentry/src/external/crashpad/util/win/xp_compat.h diff --git a/shared/sentry/external/libunwindstack-ndk/.github/workflows/build.yml b/shared/sentry/src/external/libunwindstack-ndk/.github/workflows/build.yml similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/.github/workflows/build.yml rename to shared/sentry/src/external/libunwindstack-ndk/.github/workflows/build.yml diff --git a/shared/sentry/external/libunwindstack-ndk/.gitignore b/shared/sentry/src/external/libunwindstack-ndk/.gitignore similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/.gitignore rename to shared/sentry/src/external/libunwindstack-ndk/.gitignore diff --git a/shared/sentry/external/libunwindstack-ndk/ArmExidx.cpp b/shared/sentry/src/external/libunwindstack-ndk/ArmExidx.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/ArmExidx.cpp rename to shared/sentry/src/external/libunwindstack-ndk/ArmExidx.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/ArmExidx.h b/shared/sentry/src/external/libunwindstack-ndk/ArmExidx.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/ArmExidx.h rename to shared/sentry/src/external/libunwindstack-ndk/ArmExidx.h diff --git a/shared/sentry/external/libunwindstack-ndk/AsmGetRegsX86.S b/shared/sentry/src/external/libunwindstack-ndk/AsmGetRegsX86.S similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/AsmGetRegsX86.S rename to shared/sentry/src/external/libunwindstack-ndk/AsmGetRegsX86.S diff --git a/shared/sentry/external/libunwindstack-ndk/AsmGetRegsX86_64.S b/shared/sentry/src/external/libunwindstack-ndk/AsmGetRegsX86_64.S similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/AsmGetRegsX86_64.S rename to shared/sentry/src/external/libunwindstack-ndk/AsmGetRegsX86_64.S diff --git a/shared/sentry/external/libunwindstack-ndk/Check.h b/shared/sentry/src/external/libunwindstack-ndk/Check.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/Check.h rename to shared/sentry/src/external/libunwindstack-ndk/Check.h diff --git a/shared/sentry/src/external/libunwindstack-ndk/Demangle.cpp b/shared/sentry/src/external/libunwindstack-ndk/Demangle.cpp new file mode 100644 index 000000000..d7ca4856a --- /dev/null +++ b/shared/sentry/src/external/libunwindstack-ndk/Demangle.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include + +#ifdef SENTRY_REMOVED +#include +#endif //SENTRY_REMOVED + +#include + +namespace unwindstack { + +std::string DemangleNameIfNeeded(const std::string& name) { + if (name.length() < 2 || name[0] != '_') { + return name; + } + + char* demangled_str = nullptr; + if (name[1] == 'Z') { + // Try to demangle C++ name. + demangled_str = abi::__cxa_demangle(name.c_str(), nullptr, nullptr, nullptr); +#ifdef SENTRY_REMOVED + } else if (name[1] == 'R') { + // Try to demangle rust name. + demangled_str = rustc_demangle(name.c_str(), nullptr, nullptr, nullptr); +#endif //SENTRY_REMOVED + } + + if (demangled_str == nullptr) { + return name; + } + + std::string demangled_name(demangled_str); + free(demangled_str); + return demangled_name; +} + +} // namespace unwindstack diff --git a/shared/sentry/external/libunwindstack-ndk/DexFiles.cpp b/shared/sentry/src/external/libunwindstack-ndk/DexFiles.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DexFiles.cpp rename to shared/sentry/src/external/libunwindstack-ndk/DexFiles.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfCfa.cpp b/shared/sentry/src/external/libunwindstack-ndk/DwarfCfa.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfCfa.cpp rename to shared/sentry/src/external/libunwindstack-ndk/DwarfCfa.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfCfa.h b/shared/sentry/src/external/libunwindstack-ndk/DwarfCfa.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfCfa.h rename to shared/sentry/src/external/libunwindstack-ndk/DwarfCfa.h diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfDebugFrame.h b/shared/sentry/src/external/libunwindstack-ndk/DwarfDebugFrame.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfDebugFrame.h rename to shared/sentry/src/external/libunwindstack-ndk/DwarfDebugFrame.h diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfEhFrame.h b/shared/sentry/src/external/libunwindstack-ndk/DwarfEhFrame.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfEhFrame.h rename to shared/sentry/src/external/libunwindstack-ndk/DwarfEhFrame.h diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfEhFrameWithHdr.cpp b/shared/sentry/src/external/libunwindstack-ndk/DwarfEhFrameWithHdr.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfEhFrameWithHdr.cpp rename to shared/sentry/src/external/libunwindstack-ndk/DwarfEhFrameWithHdr.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfEhFrameWithHdr.h b/shared/sentry/src/external/libunwindstack-ndk/DwarfEhFrameWithHdr.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfEhFrameWithHdr.h rename to shared/sentry/src/external/libunwindstack-ndk/DwarfEhFrameWithHdr.h diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfEncoding.h b/shared/sentry/src/external/libunwindstack-ndk/DwarfEncoding.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfEncoding.h rename to shared/sentry/src/external/libunwindstack-ndk/DwarfEncoding.h diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfMemory.cpp b/shared/sentry/src/external/libunwindstack-ndk/DwarfMemory.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfMemory.cpp rename to shared/sentry/src/external/libunwindstack-ndk/DwarfMemory.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfOp.cpp b/shared/sentry/src/external/libunwindstack-ndk/DwarfOp.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfOp.cpp rename to shared/sentry/src/external/libunwindstack-ndk/DwarfOp.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfOp.h b/shared/sentry/src/external/libunwindstack-ndk/DwarfOp.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/DwarfOp.h rename to shared/sentry/src/external/libunwindstack-ndk/DwarfOp.h diff --git a/shared/sentry/external/libunwindstack-ndk/DwarfSection.cpp b/shared/sentry/src/external/libunwindstack-ndk/DwarfSection.cpp similarity index 99% rename from shared/sentry/external/libunwindstack-ndk/DwarfSection.cpp rename to shared/sentry/src/external/libunwindstack-ndk/DwarfSection.cpp index 34d37b090..7c99bde2c 100644 --- a/shared/sentry/external/libunwindstack-ndk/DwarfSection.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/DwarfSection.cpp @@ -16,6 +16,12 @@ #include +#include +#include +#include +#include +#include + #include #include #include diff --git a/shared/sentry/external/libunwindstack-ndk/Elf.cpp b/shared/sentry/src/external/libunwindstack-ndk/Elf.cpp similarity index 99% rename from shared/sentry/external/libunwindstack-ndk/Elf.cpp rename to shared/sentry/src/external/libunwindstack-ndk/Elf.cpp index ac17f56c3..23eeb18ca 100644 --- a/shared/sentry/external/libunwindstack-ndk/Elf.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/Elf.cpp @@ -319,6 +319,10 @@ ElfInterface* Elf::CreateInterfaceFromMemory(Memory* memory) { arch_ = ARCH_ARM64; } else if (e_machine == EM_X86_64) { arch_ = ARCH_X86_64; +#ifdef SENTRY_REMOVED + } else if (e_machine == EM_RISCV) { + arch_ = ARCH_RISCV64; +#endif // SENTRY_REMOVED } else { // Unsupported. return nullptr; diff --git a/shared/sentry/external/libunwindstack-ndk/ElfInterface.cpp b/shared/sentry/src/external/libunwindstack-ndk/ElfInterface.cpp similarity index 96% rename from shared/sentry/external/libunwindstack-ndk/ElfInterface.cpp rename to shared/sentry/src/external/libunwindstack-ndk/ElfInterface.cpp index fbc5a4811..9ff23d32c 100644 --- a/shared/sentry/external/libunwindstack-ndk/ElfInterface.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/ElfInterface.cpp @@ -528,12 +528,33 @@ template void ElfInterfaceImpl::GetMaxSize(Memory* memory, uint64_t* size) { EhdrType ehdr; if (!memory->ReadFully(0, &ehdr, sizeof(ehdr))) { + *size = 0; return; } - if (ehdr.e_shnum == 0) { - return; + + // If this winds up as zero, the PT_LOAD reading will get a better value. + uint64_t elf_size = ehdr.e_shoff + ehdr.e_shentsize * ehdr.e_shnum; + + // Search through the PT_LOAD values and if any result in a larger elf + // size, use that. + uint64_t offset = ehdr.e_phoff; + for (size_t i = 0; i < ehdr.e_phnum; i++, offset += ehdr.e_phentsize) { + PhdrType phdr; + if (!memory->ReadFully(offset, &phdr, sizeof(phdr))) { + break; + } + if (phdr.p_type == PT_LOAD) { + uint64_t end_offset; + if (__builtin_add_overflow(phdr.p_offset, phdr.p_memsz, &end_offset)) { + continue; + } + if (end_offset > elf_size) { + elf_size = end_offset; + } + } } - *size = ehdr.e_shoff + ehdr.e_shentsize * ehdr.e_shnum; + + *size = elf_size; } template diff --git a/shared/sentry/external/libunwindstack-ndk/ElfInterfaceArm.cpp b/shared/sentry/src/external/libunwindstack-ndk/ElfInterfaceArm.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/ElfInterfaceArm.cpp rename to shared/sentry/src/external/libunwindstack-ndk/ElfInterfaceArm.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/ElfInterfaceArm.h b/shared/sentry/src/external/libunwindstack-ndk/ElfInterfaceArm.h similarity index 92% rename from shared/sentry/external/libunwindstack-ndk/ElfInterfaceArm.h rename to shared/sentry/src/external/libunwindstack-ndk/ElfInterfaceArm.h index 6ee6dc984..d8cad48f5 100644 --- a/shared/sentry/external/libunwindstack-ndk/ElfInterfaceArm.h +++ b/shared/sentry/src/external/libunwindstack-ndk/ElfInterfaceArm.h @@ -19,7 +19,6 @@ #include #include -#include #include #include @@ -32,8 +31,14 @@ class ElfInterfaceArm : public ElfInterface32 { ElfInterfaceArm(Memory* memory) : ElfInterface32(memory) {} virtual ~ElfInterfaceArm() = default; - class iterator : public std::iterator { + class iterator { public: + using iterator_category = std::bidirectional_iterator_tag; + using value_type = uint32_t; + using difference_type = std::ptrdiff_t; + using pointer = uint32_t*; + using reference = uint32_t&; + iterator(ElfInterfaceArm* interface, size_t index) : interface_(interface), index_(index) { } iterator& operator++() { index_++; return *this; } diff --git a/shared/sentry/external/libunwindstack-ndk/Global.cpp b/shared/sentry/src/external/libunwindstack-ndk/Global.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/Global.cpp rename to shared/sentry/src/external/libunwindstack-ndk/Global.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/GlobalDebugImpl.h b/shared/sentry/src/external/libunwindstack-ndk/GlobalDebugImpl.h similarity index 99% rename from shared/sentry/external/libunwindstack-ndk/GlobalDebugImpl.h rename to shared/sentry/src/external/libunwindstack-ndk/GlobalDebugImpl.h index f83a2c661..93bc8cfa8 100644 --- a/shared/sentry/external/libunwindstack-ndk/GlobalDebugImpl.h +++ b/shared/sentry/src/external/libunwindstack-ndk/GlobalDebugImpl.h @@ -419,6 +419,9 @@ std::unique_ptr> CreateGlobalDebugImpl( } case ARCH_ARM64: case ARCH_X86_64: { +#ifdef SENTRY_REMOVED + case ARCH_RISCV64: { +#endif // SENTRY_REMOVED using Impl = GlobalDebugImpl; static_assert(offsetof(typename Impl::JITCodeEntry, symfile_size) == 24, "layout"); static_assert(offsetof(typename Impl::JITCodeEntry, seqlock) == 40, "layout"); diff --git a/shared/sentry/external/libunwindstack-ndk/JitDebug.cpp b/shared/sentry/src/external/libunwindstack-ndk/JitDebug.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/JitDebug.cpp rename to shared/sentry/src/external/libunwindstack-ndk/JitDebug.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/LICENSE b/shared/sentry/src/external/libunwindstack-ndk/LICENSE similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/LICENSE rename to shared/sentry/src/external/libunwindstack-ndk/LICENSE diff --git a/shared/sentry/external/libunwindstack-ndk/LogAndroid.cpp b/shared/sentry/src/external/libunwindstack-ndk/LogAndroid.cpp similarity index 74% rename from shared/sentry/external/libunwindstack-ndk/LogAndroid.cpp rename to shared/sentry/src/external/libunwindstack-ndk/LogAndroid.cpp index 9e40949bc..70ed0d80d 100644 --- a/shared/sentry/external/libunwindstack-ndk/LogAndroid.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/LogAndroid.cpp @@ -21,8 +21,15 @@ #include #define LOG_TAG "unwind" +#ifndef SENTRY_MODIFIED #include +#endif // SENTRY_MODIFIED +#ifdef SENTRY_REMOVED +#if defined(__BIONIC__) +#include +#endif +#endif // SENTRY_REMOVED #include #include @@ -39,7 +46,9 @@ static void LogWithPriority(int priority, uint8_t indent, const char* format, va } else { real_format = format; } +#ifndef SENTRY_MODIFIED __android_log_vprint(priority, LOG_TAG, real_format.c_str(), args); +#endif // SENTRY_MODIFIED } void Info(const char* format, ...) { @@ -64,6 +73,24 @@ void Error(const char* format, ...) { } void AsyncSafe(const char*, ...) {} +#ifdef SENTRY_REMOVED +#if defined(__BIONIC__) +void AsyncSafe(const char* format, ...) { + va_list args; + va_start(args, format); + async_safe_format_log_va_list(ANDROID_LOG_ERROR, "libunwindstack", format, args); + va_end(args); +} +#else +void AsyncSafe(const char* format, ...) { + va_list args; + va_start(args, format); + vprintf(format, args); + printf("\n"); + va_end(args); +} +#endif +#endif // SENTRY_REMOVED } // namespace Log diff --git a/shared/sentry/external/libunwindstack-ndk/LogStdout.cpp b/shared/sentry/src/external/libunwindstack-ndk/LogStdout.cpp similarity index 85% rename from shared/sentry/external/libunwindstack-ndk/LogStdout.cpp rename to shared/sentry/src/external/libunwindstack-ndk/LogStdout.cpp index 6ce06f882..ac879a89c 100644 --- a/shared/sentry/external/libunwindstack-ndk/LogStdout.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/LogStdout.cpp @@ -63,6 +63,16 @@ void Error(const char* format, ...) { // Do nothing for async safe. void AsyncSafe(const char*, ...) {} +#ifdef SENTRY_REMOVED +void AsyncSafe(const char* format, ...) { + va_list args; + va_start(args, format); + // Only call vprintf to avoid allocating as much as possible, PrintToStdout uses a std::string. + vprintf(format, args); + printf("\n"); + va_end(args); +} +#endif // SENTRY_REMOVED } // namespace Log diff --git a/shared/sentry/external/libunwindstack-ndk/MapInfo.cpp b/shared/sentry/src/external/libunwindstack-ndk/MapInfo.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MapInfo.cpp rename to shared/sentry/src/external/libunwindstack-ndk/MapInfo.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/Maps.cpp b/shared/sentry/src/external/libunwindstack-ndk/Maps.cpp similarity index 99% rename from shared/sentry/external/libunwindstack-ndk/Maps.cpp rename to shared/sentry/src/external/libunwindstack-ndk/Maps.cpp index 9527176c2..36f9d4c0a 100644 --- a/shared/sentry/external/libunwindstack-ndk/Maps.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/Maps.cpp @@ -183,7 +183,7 @@ bool LocalUpdatableMaps::Reparse(/*out*/ bool* any_changed) { uint64_t start = new_map_info->start(); uint64_t end = new_map_info->end(); uint64_t flags = new_map_info->flags(); - const std::string& name = new_map_info->name(); + const SharedString& name = new_map_info->name(); for (size_t old_map_idx = search_map_idx; old_map_idx < last_map_idx; old_map_idx++) { auto& info = maps_[old_map_idx]; if (start == info->start() && end == info->end() && flags == info->flags() && diff --git a/shared/sentry/external/libunwindstack-ndk/Memory.cpp b/shared/sentry/src/external/libunwindstack-ndk/Memory.cpp similarity index 71% rename from shared/sentry/external/libunwindstack-ndk/Memory.cpp rename to shared/sentry/src/external/libunwindstack-ndk/Memory.cpp index a80ea1313..1585bd94e 100644 --- a/shared/sentry/external/libunwindstack-ndk/Memory.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/Memory.cpp @@ -1,22 +1,24 @@ /* -* Copyright (C) 2016 The Android Open Source Project -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SENTRY_ADDED #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif +#endif // SENTRY_ADDED #include #include #include @@ -27,8 +29,10 @@ #include #include #include +#ifndef SENTRY_ADDED #include "unistdfix.h" #include +#endif // SENTRY_ADDED #include #include @@ -50,6 +54,7 @@ #include "MemoryRange.h" #include "MemoryRemote.h" +#ifndef SENTRY_ADDED #if defined(__ANDROID_API__) && __ANDROID_API__ < 23 static ssize_t process_vm_readv(pid_t __pid, const struct iovec *__local_iov, @@ -60,150 +65,151 @@ process_vm_readv(pid_t __pid, const struct iovec *__local_iov, __remote_iov, __remote_iov_count, __flags); } #endif +#endif // SENTRY_ADDED namespace unwindstack { static size_t ProcessVmRead(pid_t pid, uint64_t remote_src, void* dst, size_t len) { - // Split up the remote read across page boundaries. - // From the manpage: - // A partial read/write may result if one of the remote_iov elements points to an invalid - // memory region in the remote process. - // - // Partial transfers apply at the granularity of iovec elements. These system calls won't - // perform a partial transfer that splits a single iovec element. - constexpr size_t kMaxIovecs = 64; - struct iovec src_iovs[kMaxIovecs]; - - uint64_t cur = remote_src; - size_t total_read = 0; - while (len > 0) { - struct iovec dst_iov = { - .iov_base = &reinterpret_cast(dst)[total_read], .iov_len = len, - }; - - size_t iovecs_used = 0; - while (len > 0) { - if (iovecs_used == kMaxIovecs) { - break; - } - - // struct iovec uses void* for iov_base. - if (cur >= UINTPTR_MAX) { - errno = EFAULT; - return total_read; - } - - src_iovs[iovecs_used].iov_base = reinterpret_cast(cur); - - uintptr_t misalignment = cur & (getpagesize() - 1); - size_t iov_len = getpagesize() - misalignment; - iov_len = std::min(iov_len, len); - - len -= iov_len; - if (__builtin_add_overflow(cur, iov_len, &cur)) { - errno = EFAULT; - return total_read; - } - - src_iovs[iovecs_used].iov_len = iov_len; - ++iovecs_used; - } - - ssize_t rc = process_vm_readv(pid, &dst_iov, 1, src_iovs, iovecs_used, 0); - if (rc == -1) { - return total_read; - } - total_read += rc; - } - return total_read; + // Split up the remote read across page boundaries. + // From the manpage: + // A partial read/write may result if one of the remote_iov elements points to an invalid + // memory region in the remote process. + // + // Partial transfers apply at the granularity of iovec elements. These system calls won't + // perform a partial transfer that splits a single iovec element. + constexpr size_t kMaxIovecs = 64; + struct iovec src_iovs[kMaxIovecs]; + + uint64_t cur = remote_src; + size_t total_read = 0; + while (len > 0) { + struct iovec dst_iov = { + .iov_base = &reinterpret_cast(dst)[total_read], .iov_len = len, + }; + + size_t iovecs_used = 0; + while (len > 0) { + if (iovecs_used == kMaxIovecs) { + break; + } + + // struct iovec uses void* for iov_base. + if (cur >= UINTPTR_MAX) { + errno = EFAULT; + return total_read; + } + + src_iovs[iovecs_used].iov_base = reinterpret_cast(cur); + + uintptr_t misalignment = cur & (getpagesize() - 1); + size_t iov_len = getpagesize() - misalignment; + iov_len = std::min(iov_len, len); + + len -= iov_len; + if (__builtin_add_overflow(cur, iov_len, &cur)) { + errno = EFAULT; + return total_read; + } + + src_iovs[iovecs_used].iov_len = iov_len; + ++iovecs_used; + } + + ssize_t rc = process_vm_readv(pid, &dst_iov, 1, src_iovs, iovecs_used, 0); + if (rc == -1) { + return total_read; + } + total_read += rc; + } + return total_read; } static bool PtraceReadLong(pid_t pid, uint64_t addr, long* value) { - // ptrace() returns -1 and sets errno when the operation fails. - // To disambiguate -1 from a valid result, we clear errno beforehand. - errno = 0; - *value = ptrace(PTRACE_PEEKTEXT, pid, reinterpret_cast(addr), nullptr); - if (*value == -1 && errno) { - return false; - } - return true; + // ptrace() returns -1 and sets errno when the operation fails. + // To disambiguate -1 from a valid result, we clear errno beforehand. + errno = 0; + *value = ptrace(PTRACE_PEEKTEXT, pid, reinterpret_cast(addr), nullptr); + if (*value == -1 && errno) { + return false; + } + return true; } static size_t PtraceRead(pid_t pid, uint64_t addr, void* dst, size_t bytes) { - // Make sure that there is no overflow. - uint64_t max_size; - if (__builtin_add_overflow(addr, bytes, &max_size)) { - return 0; - } + // Make sure that there is no overflow. + uint64_t max_size; + if (__builtin_add_overflow(addr, bytes, &max_size)) { + return 0; + } - size_t bytes_read = 0; - long data; - size_t align_bytes = addr & (sizeof(long) - 1); - if (align_bytes != 0) { - if (!PtraceReadLong(pid, addr & ~(sizeof(long) - 1), &data)) { - return 0; - } - size_t copy_bytes = std::min(sizeof(long) - align_bytes, bytes); - memcpy(dst, reinterpret_cast(&data) + align_bytes, copy_bytes); - addr += copy_bytes; - dst = reinterpret_cast(reinterpret_cast(dst) + copy_bytes); - bytes -= copy_bytes; - bytes_read += copy_bytes; - } + size_t bytes_read = 0; + long data; + size_t align_bytes = addr & (sizeof(long) - 1); + if (align_bytes != 0) { + if (!PtraceReadLong(pid, addr & ~(sizeof(long) - 1), &data)) { + return 0; + } + size_t copy_bytes = std::min(sizeof(long) - align_bytes, bytes); + memcpy(dst, reinterpret_cast(&data) + align_bytes, copy_bytes); + addr += copy_bytes; + dst = reinterpret_cast(reinterpret_cast(dst) + copy_bytes); + bytes -= copy_bytes; + bytes_read += copy_bytes; + } - for (size_t i = 0; i < bytes / sizeof(long); i++) { - if (!PtraceReadLong(pid, addr, &data)) { - return bytes_read; - } - memcpy(dst, &data, sizeof(long)); - dst = reinterpret_cast(reinterpret_cast(dst) + sizeof(long)); - addr += sizeof(long); - bytes_read += sizeof(long); - } + for (size_t i = 0; i < bytes / sizeof(long); i++) { + if (!PtraceReadLong(pid, addr, &data)) { + return bytes_read; + } + memcpy(dst, &data, sizeof(long)); + dst = reinterpret_cast(reinterpret_cast(dst) + sizeof(long)); + addr += sizeof(long); + bytes_read += sizeof(long); + } - size_t left_over = bytes & (sizeof(long) - 1); - if (left_over) { - if (!PtraceReadLong(pid, addr, &data)) { - return bytes_read; - } - memcpy(dst, &data, left_over); - bytes_read += left_over; - } - return bytes_read; + size_t left_over = bytes & (sizeof(long) - 1); + if (left_over) { + if (!PtraceReadLong(pid, addr, &data)) { + return bytes_read; + } + memcpy(dst, &data, left_over); + bytes_read += left_over; + } + return bytes_read; } bool Memory::ReadFully(uint64_t addr, void* dst, size_t size) { - size_t rc = Read(addr, dst, size); - return rc == size; + size_t rc = Read(addr, dst, size); + return rc == size; } bool Memory::ReadString(uint64_t addr, std::string* dst, size_t max_read) { - char buffer[256]; // Large enough for 99% of symbol names. - size_t size = 0; // Number of bytes which were read into the buffer. - for (size_t offset = 0; offset < max_read; offset += size) { - // Look for null-terminator first, so we can allocate string of exact size. - // If we know the end of valid memory range, do the reads in larger blocks. - size_t read = std::min(sizeof(buffer), max_read - offset); - size = Read(addr + offset, buffer, read); - if (size == 0) { - return false; // We have not found end of string yet and we can not read more data. - } - size_t length = strnlen(buffer, size); // Index of the null-terminator. - if (length < size) { - // We found the null-terminator. Allocate the string and set its content. - if (offset == 0) { - // We did just single read, so the buffer already contains the whole string. - dst->assign(buffer, length); - return true; - } else { - // The buffer contains only the last block. Read the whole string again. - dst->assign(offset + length, '\0'); - return ReadFully(addr, dst->data(), dst->size()); - } - } - } - return false; + char buffer[256]; // Large enough for 99% of symbol names. + size_t size = 0; // Number of bytes which were read into the buffer. + for (size_t offset = 0; offset < max_read; offset += size) { + // Look for null-terminator first, so we can allocate string of exact size. + // If we know the end of valid memory range, do the reads in larger blocks. + size_t read = std::min(sizeof(buffer), max_read - offset); + size = Read(addr + offset, buffer, read); + if (size == 0) { + return false; // We have not found end of string yet and we can not read more data. + } + size_t length = strnlen(buffer, size); // Index of the null-terminator. + if (length < size) { + // We found the null-terminator. Allocate the string and set its content. + if (offset == 0) { + // We did just single read, so the buffer already contains the whole string. + dst->assign(buffer, length); + return true; + } else { + // The buffer contains only the last block. Read the whole string again. + dst->assign(offset + length, '\0'); + return ReadFully(addr, dst->data(), dst->size()); + } + } + } + return false; } std::unique_ptr Memory::CreateFileMemory(const std::string& path, uint64_t offset, @@ -359,6 +365,7 @@ size_t MemoryRemote::Read(uint64_t addr, void* dst, size_t size) { } size_t MemoryLocal::Read(uint64_t addr, void* dst, size_t size) { +#ifndef SENTRY_MODIFIED errno = 0; size_t rv = ProcessVmRead(getpid(), addr, dst, size); // The syscall is only available in Linux 3.2, meaning Android 17. @@ -370,6 +377,7 @@ size_t MemoryLocal::Read(uint64_t addr, void* dst, size_t size) { } #endif return rv; +#endif // SENTRY_MODIFIED } MemoryRange::MemoryRange(const std::shared_ptr& memory, uint64_t begin, uint64_t length, diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryBuffer.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryBuffer.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryBuffer.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryBuffer.h diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryCache.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryCache.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryCache.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryCache.h diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryFileAtOffset.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryFileAtOffset.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryFileAtOffset.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryFileAtOffset.h diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryLocal.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryLocal.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryLocal.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryLocal.h diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryMte.cpp b/shared/sentry/src/external/libunwindstack-ndk/MemoryMte.cpp similarity index 67% rename from shared/sentry/external/libunwindstack-ndk/MemoryMte.cpp rename to shared/sentry/src/external/libunwindstack-ndk/MemoryMte.cpp index bb85c1d50..4b5ca3125 100644 --- a/shared/sentry/external/libunwindstack-ndk/MemoryMte.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/MemoryMte.cpp @@ -17,6 +17,16 @@ #include #include +#ifdef SENTRY_REMOVED +// #if defined(__BIONIC__) +// #include +// #else +#endif // SENTRY_REMOVED +#define mte_supported() false +#ifdef SENTRY_REMOVED +// #endif +#endif // SENTRY_REMOVED + #include "MemoryLocal.h" #include "MemoryRemote.h" @@ -38,8 +48,20 @@ long MemoryRemote::ReadTag(uint64_t addr) { } long MemoryLocal::ReadTag(uint64_t addr) { +#if defined(__aarch64__) + // Check that the memory is readable first. This is racy with the ldg but there's not much + // we can do about it. + char data; + if (!mte_supported() || !Read(addr, &data, 1)) { + return -1; + } + + __asm__ __volatile__(".arch_extension mte; ldg %0, [%0]" : "+r"(addr) : : "memory"); + return (addr >> 56) & 0xf; +#else (void)addr; return -1; +#endif } } // namespace unwindstack diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryOffline.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryOffline.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryOffline.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryOffline.h diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryOfflineBuffer.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryOfflineBuffer.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryOfflineBuffer.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryOfflineBuffer.h diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryRange.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryRange.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryRange.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryRange.h diff --git a/shared/sentry/external/libunwindstack-ndk/MemoryRemote.h b/shared/sentry/src/external/libunwindstack-ndk/MemoryRemote.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/MemoryRemote.h rename to shared/sentry/src/external/libunwindstack-ndk/MemoryRemote.h diff --git a/shared/sentry/external/libunwindstack-ndk/OWNERS b/shared/sentry/src/external/libunwindstack-ndk/OWNERS similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/OWNERS rename to shared/sentry/src/external/libunwindstack-ndk/OWNERS diff --git a/shared/sentry/external/libunwindstack-ndk/README.md b/shared/sentry/src/external/libunwindstack-ndk/README.md similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/README.md rename to shared/sentry/src/external/libunwindstack-ndk/README.md diff --git a/shared/sentry/external/libunwindstack-ndk/Regs.cpp b/shared/sentry/src/external/libunwindstack-ndk/Regs.cpp similarity index 84% rename from shared/sentry/external/libunwindstack-ndk/Regs.cpp rename to shared/sentry/src/external/libunwindstack-ndk/Regs.cpp index 78f6eb996..9c99d730f 100644 --- a/shared/sentry/external/libunwindstack-ndk/Regs.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/Regs.cpp @@ -14,7 +14,9 @@ * limitations under the License. */ +#include #include +#include #include #include @@ -27,16 +29,25 @@ #include #include #include +#ifdef SENTRY_REMOVED +#include +#endif // SENTRY_REMOVED #include #include #include #include +#ifdef SENTRY_REMOVED +#include +#endif // SENTRY_REMOVED #include #include namespace unwindstack { // The largest user structure. +#ifdef SENTRY_REMOVED +// constexpr size_t MAX_USER_REGS_SIZE = sizeof(mips64_user_regs) + 10; +#endif // SENTRY_REMOVED static constexpr size_t kMaxUserRegsSize = std::max( sizeof(arm_user_regs), std::max(sizeof(arm64_user_regs), std::max(sizeof(x86_user_regs), sizeof(x86_64_user_regs)))); @@ -68,6 +79,10 @@ Regs* Regs::RemoteGet(pid_t pid, ErrorCode* error_code) { return RegsArm::Read(buffer.data()); case sizeof(arm64_user_regs): return RegsArm64::Read(buffer.data()); +#ifdef SENTRY_REMOVED + case sizeof(riscv64_user_regs): + return RegsRiscv64::Read(buffer.data()); +#endif // SENTRY_REMOVED } Log::Error("No matching size of user regs structure for pid %d: size %zu", pid, io.iov_len); @@ -102,6 +117,10 @@ ArchEnum Regs::RemoteGetArch(pid_t pid, ErrorCode* error_code) { return ARCH_ARM; case sizeof(arm64_user_regs): return ARCH_ARM64; +#ifdef SENTRY_REMOVED + case sizeof(riscv64_user_regs): + return ARCH_RISCV64; +#endif // SENTRY_REMOVED } Log::Error("No matching size of user regs structure for pid %d: size %zu", pid, io.iov_len); @@ -121,6 +140,11 @@ Regs* Regs::CreateFromUcontext(ArchEnum arch, void* ucontext) { return RegsArm::CreateFromUcontext(ucontext); case ARCH_ARM64: return RegsArm64::CreateFromUcontext(ucontext); +#ifdef SENTRY_REMOVED + case ARCH_RISCV64: + return RegsRiscv64::CreateFromUcontext(ucontext); +#endif // SENTRY_REMOVED + case ARCH_UNKNOWN: default: return nullptr; } @@ -135,6 +159,10 @@ ArchEnum Regs::CurrentArch() { return ARCH_X86; #elif defined(__x86_64__) return ARCH_X86_64; +#ifdef SENTRY_REMOVED +//#elif defined(__riscv) + return ARCH_RISCV64; +#endif // SENTRY_REMOVED #else abort(); #endif @@ -150,6 +178,10 @@ Regs* Regs::CreateFromLocal() { regs = new RegsX86(); #elif defined(__x86_64__) regs = new RegsX86_64(); +#ifdef SENTRY_REMOVED +//#elif defined(__riscv) + regs = new RegsRiscv64(); +#endif // SENTRY_REMOVED #else abort(); #endif @@ -188,11 +220,14 @@ uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf, ArchEnum arch) { } return 4; } - case ARCH_ARM64: { - if (rel_pc < 4) { - return 0; - } - return 4; + case ARCH_ARM64: { +#ifdef SENTRY_REMOVED + case ARCH_RISCV64: { +#endif // SENTRY_REMOVED + if (rel_pc < 4) { + return 0; + } + return 4; } case ARCH_X86: case ARCH_X86_64: { diff --git a/shared/sentry/external/libunwindstack-ndk/RegsArm.cpp b/shared/sentry/src/external/libunwindstack-ndk/RegsArm.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/RegsArm.cpp rename to shared/sentry/src/external/libunwindstack-ndk/RegsArm.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/RegsArm64.cpp b/shared/sentry/src/external/libunwindstack-ndk/RegsArm64.cpp similarity index 96% rename from shared/sentry/external/libunwindstack-ndk/RegsArm64.cpp rename to shared/sentry/src/external/libunwindstack-ndk/RegsArm64.cpp index 0af9a1e39..29c3bd7e1 100644 --- a/shared/sentry/external/libunwindstack-ndk/RegsArm64.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/RegsArm64.cpp @@ -19,6 +19,12 @@ #include +#ifdef SENTRY_REMOVED +#if defined(__BIONIC__) +#include +#endif +#endif // SENTRY_REMOVED + #include #include #include @@ -55,6 +61,12 @@ static uint64_t strip_pac(uint64_t pc, uint64_t mask) { // pre-Armv8.3-A architectures. if (mask) { pc &= ~mask; + } else { +#ifdef SENTRY_REMOVED +#if defined(__BIONIC__) + pc = __bionic_clear_pac_bits(pc); +#endif +#endif // SENTRY_REMOVED } return pc; } diff --git a/shared/sentry/external/libunwindstack-ndk/RegsInfo.h b/shared/sentry/src/external/libunwindstack-ndk/RegsInfo.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/RegsInfo.h rename to shared/sentry/src/external/libunwindstack-ndk/RegsInfo.h diff --git a/shared/sentry/external/libunwindstack-ndk/RegsX86.cpp b/shared/sentry/src/external/libunwindstack-ndk/RegsX86.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/RegsX86.cpp rename to shared/sentry/src/external/libunwindstack-ndk/RegsX86.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/RegsX86_64.cpp b/shared/sentry/src/external/libunwindstack-ndk/RegsX86_64.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/RegsX86_64.cpp rename to shared/sentry/src/external/libunwindstack-ndk/RegsX86_64.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/Symbols.cpp b/shared/sentry/src/external/libunwindstack-ndk/Symbols.cpp similarity index 78% rename from shared/sentry/external/libunwindstack-ndk/Symbols.cpp rename to shared/sentry/src/external/libunwindstack-ndk/Symbols.cpp index 499cc3115..67c9d0b0b 100644 --- a/shared/sentry/external/libunwindstack-ndk/Symbols.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/Symbols.cpp @@ -32,10 +32,20 @@ namespace unwindstack { Symbols::Symbols(uint64_t offset, uint64_t size, uint64_t entry_size, uint64_t str_offset, uint64_t str_size) : offset_(offset), - count_(entry_size != 0 ? size / entry_size : 0), + count_(entry_size != 0 ? ((size / entry_size > kMaxSymbols) ? kMaxSymbols : size / entry_size) + : 0), entry_size_(entry_size), - str_offset_(str_offset), - str_end_(str_offset_ + str_size) {} + str_offset_(str_offset) { + if (__builtin_add_overflow(str_offset_, str_size, &str_end_)) { + // Set to the max so that the code will still try to get symbol names. + // Any reads that might be invalid will simply return no data, so + // this will not result in crashes. + // The assumption is that this value might have been corrupted, but + // enough of the elf data is valid such that the code can still + // get symbol information. + str_end_ = UINT64_MAX; + } +} template static bool IsFunc(const SymType* entry) { @@ -66,8 +76,13 @@ Symbols::Info* Symbols::BinarySearch(uint64_t addr, Memory* elf_memory, uint64_t while (first < last) { uint32_t current = first + (last - first) / 2; uint32_t symbol_index = RemapIndices ? remap_.value()[current] : current; + uint64_t offset = symbol_index * entry_size_; + if (__builtin_add_overflow(offset, offset_, &offset)) { + // The elf data might be malformed. + return nullptr; + } SymType sym; - if (!elf_memory->ReadFully(offset_ + symbol_index * entry_size_, &sym, sizeof(sym))) { + if (!elf_memory->ReadFully(offset, &sym, sizeof(sym))) { return nullptr; } // There shouldn't be multiple symbols with same end address, but in case there are, @@ -96,13 +111,21 @@ void Symbols::BuildRemapTable(Memory* elf_memory) { for (size_t symbol_idx = 0; symbol_idx < count_;) { // Read symbols from memory. We intentionally bypass the cache to save memory. // Do the reads in batches so that we minimize the number of memory read calls. + uint64_t read_bytes = (count_ - symbol_idx) * entry_size_; uint8_t buffer[1024]; - size_t read = std::min(sizeof(buffer), (count_ - symbol_idx) * entry_size_); - size_t size = elf_memory->Read(offset_ + symbol_idx * entry_size_, buffer, read); - if (size < sizeof(SymType)) { - break; // Stop processing, something looks like it is corrupted. + read_bytes = std::min(sizeof(buffer), read_bytes); + uint64_t offset = symbol_idx * entry_size_; + if (__builtin_add_overflow(offset, offset_, &offset)) { + // The elf data might be malformed. + break; + } + read_bytes = elf_memory->Read(offset, buffer, read_bytes); + if (read_bytes < sizeof(SymType)) { + // The elf data might be malformed. + break; } - for (size_t offset = 0; offset + sizeof(SymType) <= size; offset += entry_size_, symbol_idx++) { + for (uint64_t offset = 0; offset <= read_bytes - sizeof(SymType); + offset += entry_size_, symbol_idx++) { SymType sym; memcpy(&sym, &buffer[offset], sizeof(SymType)); // Copy to ensure alignment. addrs.push_back(sym.st_value); // Always insert so it is indexable by symbol index. @@ -146,7 +169,12 @@ bool Symbols::GetName(uint64_t addr, Memory* elf_memory, SharedString* name, if (info->name.is_null()) { SymType sym; uint32_t symbol_index = remap_.has_value() ? remap_.value()[info->index] : info->index; - if (!elf_memory->ReadFully(offset_ + symbol_index * entry_size_, &sym, sizeof(sym))) { + uint64_t offset = symbol_index * entry_size_; + if (__builtin_add_overflow(offset, offset_, &offset)) { + // The elf data might be malformed. + return false; + } + if (!elf_memory->ReadFully(offset, &sym, sizeof(sym))) { return false; } std::string symbol_name; @@ -177,14 +205,23 @@ bool Symbols::GetGlobal(Memory* elf_memory, const std::string& name, uint64_t* m // Linear scan of all symbols. for (uint32_t i = 0; i < count_; i++) { + uint64_t offset = i * entry_size_; + if (__builtin_add_overflow(offset_, offset, &offset)) { + // The elf data might be malformed. + return false; + } SymType entry; - if (!elf_memory->ReadFully(offset_ + i * entry_size_, &entry, sizeof(entry))) { + if (!elf_memory->ReadFully(offset, &entry, sizeof(entry))) { return false; } if (entry.st_shndx != SHN_UNDEF && ELF32_ST_TYPE(entry.st_info) == STT_OBJECT && ELF32_ST_BIND(entry.st_info) == STB_GLOBAL) { uint64_t str_offset = str_offset_ + entry.st_name; + if (__builtin_add_overflow(str_offset_, entry.st_name, &str_offset)) { + // The elf data might be malformed. + return false; + } if (str_offset < str_end_) { std::string symbol; if (elf_memory->ReadString(str_offset, &symbol, str_end_ - str_offset) && symbol == name) { diff --git a/shared/sentry/external/libunwindstack-ndk/Symbols.h b/shared/sentry/src/external/libunwindstack-ndk/Symbols.h similarity index 94% rename from shared/sentry/external/libunwindstack-ndk/Symbols.h rename to shared/sentry/src/external/libunwindstack-ndk/Symbols.h index 0b467518d..999c710f5 100644 --- a/shared/sentry/external/libunwindstack-ndk/Symbols.h +++ b/shared/sentry/src/external/libunwindstack-ndk/Symbols.h @@ -64,13 +64,16 @@ class Symbols { const uint64_t count_; const uint64_t entry_size_; const uint64_t str_offset_; - const uint64_t str_end_; + uint64_t str_end_; std::map symbols_; // Cache of read symbols (keyed by function *end* address). std::optional> remap_; // Indices of function symbols sorted by address. // Cache of global data (non-function) symbols. std::unordered_map> global_variables_; + + // Do not allow the total number of symbols to go above this. + constexpr static size_t kMaxSymbols = 1000000; }; } // namespace unwindstack diff --git a/shared/sentry/external/libunwindstack-ndk/ThreadEntry.cpp b/shared/sentry/src/external/libunwindstack-ndk/ThreadEntry.cpp similarity index 88% rename from shared/sentry/external/libunwindstack-ndk/ThreadEntry.cpp rename to shared/sentry/src/external/libunwindstack-ndk/ThreadEntry.cpp index db34df0ff..0e62f09d1 100644 --- a/shared/sentry/external/libunwindstack-ndk/ThreadEntry.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/ThreadEntry.cpp @@ -74,13 +74,24 @@ ThreadEntry::~ThreadEntry() { } } +const char* ThreadEntry::GetWaitTypeName(WaitType type) { + switch (type) { + case WAIT_FOR_UCONTEXT: + return "ucontext"; + case WAIT_FOR_UNWIND_TO_COMPLETE: + return "unwind to complete"; + case WAIT_FOR_THREAD_TO_RESTART: + return "thread to restart"; + } +} + bool ThreadEntry::Wait(WaitType type) { static const std::chrono::duration wait_time(std::chrono::seconds(10)); std::unique_lock lock(wait_mutex_); if (wait_cond_.wait_for(lock, wait_time, [this, type] { return wait_value_ == type; })) { return true; } else { - Log::AsyncSafe("pthread_cond_timedwait for value %d failed", type); + Log::AsyncSafe("Timeout waiting for %s", GetWaitTypeName(type)); return false; } } diff --git a/shared/sentry/external/libunwindstack-ndk/ThreadEntry.h b/shared/sentry/src/external/libunwindstack-ndk/ThreadEntry.h similarity index 96% rename from shared/sentry/external/libunwindstack-ndk/ThreadEntry.h rename to shared/sentry/src/external/libunwindstack-ndk/ThreadEntry.h index 2f8e88d62..32501e2b5 100644 --- a/shared/sentry/external/libunwindstack-ndk/ThreadEntry.h +++ b/shared/sentry/src/external/libunwindstack-ndk/ThreadEntry.h @@ -70,6 +70,8 @@ class ThreadEntry { static std::mutex entries_mutex_; static std::map entries_; + + static const char* GetWaitTypeName(WaitType type); }; } // namespace unwindstack diff --git a/shared/sentry/external/libunwindstack-ndk/ThreadUnwinder.cpp b/shared/sentry/src/external/libunwindstack-ndk/ThreadUnwinder.cpp similarity index 92% rename from shared/sentry/external/libunwindstack-ndk/ThreadUnwinder.cpp rename to shared/sentry/src/external/libunwindstack-ndk/ThreadUnwinder.cpp index 7b452610f..71835db6c 100644 --- a/shared/sentry/external/libunwindstack-ndk/ThreadUnwinder.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/ThreadUnwinder.cpp @@ -63,10 +63,8 @@ static void SignalHandler(int, siginfo_t*, void* sigcontext) { // Do not remove the entry here because that can result in a deadlock // if the code cannot properly send a signal to the thread under test. entry->Wake(); - } else { - // At this point, it is possible that entry has been freed, so just exit. - Log::AsyncSafe("Timed out waiting for unwind thread to indicate it completed."); } + // If the wait fails, the entry might have been freed, so only exit. } ThreadUnwinder::ThreadUnwinder(size_t max_frames, Maps* maps) @@ -141,7 +139,6 @@ ThreadEntry* ThreadUnwinder::SendSignalToThread(int signal, pid_t tid) { last_error_.code = ERROR_THREAD_DOES_NOT_EXIST; } else { last_error_.code = ERROR_THREAD_TIMEOUT; - Log::AsyncSafe("Timed out waiting for signal handler to get ucontext data."); } ThreadEntry::Remove(entry); @@ -178,10 +175,8 @@ void ThreadUnwinder::UnwindWithSignal(int signal, pid_t tid, std::unique_ptrWake(); // Wait for the thread to indicate it is done with the ThreadEntry. - if (!entry->Wait(WAIT_FOR_THREAD_TO_RESTART)) { - // Send a warning, but do not mark as a failure to unwind. - Log::AsyncSafe("Timed out waiting for signal handler to indicate it finished."); - } + // If this fails, the Wait command will log an error message. + entry->Wait(WAIT_FOR_THREAD_TO_RESTART); ThreadEntry::Remove(entry); } diff --git a/shared/sentry/external/libunwindstack-ndk/Unwinder.cpp b/shared/sentry/src/external/libunwindstack-ndk/Unwinder.cpp similarity index 96% rename from shared/sentry/external/libunwindstack-ndk/Unwinder.cpp rename to shared/sentry/src/external/libunwindstack-ndk/Unwinder.cpp index facff86d6..64ad92dfa 100644 --- a/shared/sentry/external/libunwindstack-ndk/Unwinder.cpp +++ b/shared/sentry/src/external/libunwindstack-ndk/Unwinder.cpp @@ -25,10 +25,14 @@ #include #include +#include #include #include +#ifdef SENTRY_REMOVED +#include +#endif // SENTRY_REMOVED #include #include #include @@ -39,8 +43,10 @@ #include "Check.h" +#ifndef SENTRY_ADDED // Use the demangler from libc++. extern "C" char* __cxa_demangle(const char*, char*, size_t*, int* status); +#endif // SENTRY_ADDED namespace unwindstack { @@ -326,6 +332,7 @@ std::string Unwinder::FormatFrame(ArchEnum arch, const FrameData& frame, bool di } if (!frame.function_name.empty()) { +#ifndef SENTRY_MODIFIED char* demangled_name = __cxa_demangle(frame.function_name.c_str(), nullptr, nullptr, nullptr); if (demangled_name == nullptr) { data += " ("; @@ -335,6 +342,7 @@ std::string Unwinder::FormatFrame(ArchEnum arch, const FrameData& frame, bool di data += demangled_name; free(demangled_name); } +#endif // SENTRY_MODIFIED if (frame.function_offset != 0) { data += android::base::StringPrintf("+%" PRId64, frame.function_offset); } @@ -398,13 +406,17 @@ bool UnwinderFromPid::Init() { } } - jit_debug_ptr_ = CreateJitDebug(arch_, process_memory_); - jit_debug_ = jit_debug_ptr_.get(); - SetJitDebug(jit_debug_); + // jit_debug_ and dex_files_ may have already been set, for example in + // AndroidLocalUnwinder::InternalUnwind. + if (jit_debug_ == nullptr) { + jit_debug_ptr_ = CreateJitDebug(arch_, process_memory_); + SetJitDebug(jit_debug_ptr_.get()); + } #if defined(DEXFILE_SUPPORT) - dex_files_ptr_ = CreateDexFiles(arch_, process_memory_); - dex_files_ = dex_files_ptr_.get(); - SetDexFiles(dex_files_); + if (dex_files_ == nullptr) { + dex_files_ptr_ = CreateDexFiles(arch_, process_memory_); + SetDexFiles(dex_files_ptr_.get()); + } #endif return true; diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/README.md b/shared/sentry/src/external/libunwindstack-ndk/android-base/README.md similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/README.md rename to shared/sentry/src/external/libunwindstack-ndk/android-base/README.md diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/errno_restorer.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/errno_restorer.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/errno_restorer.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/errno_restorer.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/file.cpp b/shared/sentry/src/external/libunwindstack-ndk/android-base/file.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/file.cpp rename to shared/sentry/src/external/libunwindstack-ndk/android-base/file.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/file.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/file.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/file.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/file.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/log_main.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/log_main.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/log_main.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/log_main.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/logging.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/logging.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/logging.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/logging.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/macros.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/macros.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/macros.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/macros.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/off64_t.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/off64_t.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/off64_t.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/off64_t.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/parseint.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/parseint.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/parseint.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/parseint.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/stringprintf.cpp b/shared/sentry/src/external/libunwindstack-ndk/android-base/stringprintf.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/stringprintf.cpp rename to shared/sentry/src/external/libunwindstack-ndk/android-base/stringprintf.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/stringprintf.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/stringprintf.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/stringprintf.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/stringprintf.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/strings.cpp b/shared/sentry/src/external/libunwindstack-ndk/android-base/strings.cpp similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/strings.cpp rename to shared/sentry/src/external/libunwindstack-ndk/android-base/strings.cpp diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/strings.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/strings.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/strings.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/strings.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/threads.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/threads.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/threads.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/threads.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/unique_fd.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/unique_fd.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/unique_fd.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/unique_fd.h diff --git a/shared/sentry/external/libunwindstack-ndk/android-base/utf8.h b/shared/sentry/src/external/libunwindstack-ndk/android-base/utf8.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/android-base/utf8.h rename to shared/sentry/src/external/libunwindstack-ndk/android-base/utf8.h diff --git a/shared/sentry/external/libunwindstack-ndk/cmake/CMakeLists.txt b/shared/sentry/src/external/libunwindstack-ndk/cmake/CMakeLists.txt similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/cmake/CMakeLists.txt rename to shared/sentry/src/external/libunwindstack-ndk/cmake/CMakeLists.txt diff --git a/shared/sentry/external/libunwindstack-ndk/compat/string.h b/shared/sentry/src/external/libunwindstack-ndk/compat/string.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/compat/string.h rename to shared/sentry/src/external/libunwindstack-ndk/compat/string.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/GlobalDebugInterface.h b/shared/sentry/src/external/libunwindstack-ndk/include/GlobalDebugInterface.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/GlobalDebugInterface.h rename to shared/sentry/src/external/libunwindstack-ndk/include/GlobalDebugInterface.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/AndroidUnwinder.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/AndroidUnwinder.h similarity index 99% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/AndroidUnwinder.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/AndroidUnwinder.h index de5579df6..1d8ff339f 100644 --- a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/AndroidUnwinder.h +++ b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/AndroidUnwinder.h @@ -100,6 +100,7 @@ class AndroidUnwinder { std::vector initial_map_names_to_skip_; std::vector map_suffixes_to_ignore_; std::once_flag initialize_; + bool initialize_status_ = false; ArchEnum arch_ = ARCH_UNKNOWN; diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Arch.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Arch.h similarity index 93% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Arch.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Arch.h index dd0aa59ad..44d0de026 100644 --- a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Arch.h +++ b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Arch.h @@ -26,6 +26,9 @@ enum ArchEnum : uint8_t { ARCH_ARM64, ARCH_X86, ARCH_X86_64, +#ifdef SENTRY_REMOVED + ARCH_RISCV64, +#endif // SENTRY_REMOVED }; static inline bool ArchIs32Bit(ArchEnum arch) { diff --git a/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Demangle.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Demangle.h new file mode 100644 index 000000000..8ea51bc0b --- /dev/null +++ b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Demangle.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +namespace unwindstack { + +std::string DemangleNameIfNeeded(const std::string& name); + +} // namespace unwindstack diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/DexFiles.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DexFiles.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/DexFiles.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DexFiles.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfError.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfError.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfError.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfError.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfLocation.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfLocation.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfLocation.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfLocation.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfMemory.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfMemory.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfMemory.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfMemory.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfSection.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfSection.h similarity index 95% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfSection.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfSection.h index 33435b22a..2318f2f3f 100644 --- a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfSection.h +++ b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfSection.h @@ -18,7 +18,6 @@ #include -#include #include #include #include @@ -42,8 +41,14 @@ class DwarfSection { DwarfSection(Memory* memory); virtual ~DwarfSection() = default; - class iterator : public std::iterator { + class iterator { public: + using iterator_category = std::bidirectional_iterator_tag; + using value_type = DwarfFde*; + using difference_type = std::ptrdiff_t; + using pointer = DwarfFde**; + using reference = DwarfFde*&; + iterator(DwarfSection* section, size_t index) : index_(index) { section->GetFdes(&fdes_); if (index_ == static_cast(-1)) { diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfStructs.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfStructs.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/DwarfStructs.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/DwarfStructs.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Elf.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Elf.h similarity index 97% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Elf.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Elf.h index 0985042ce..a38323fa4 100644 --- a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Elf.h +++ b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Elf.h @@ -33,6 +33,12 @@ #define EM_AARCH64 183 #endif +#ifdef SENTRY_REMOVED +#if !defined(EM_RISCV) +#define EM_RISCV 243 +#endif +#endif // SENTRY_REMOVED + namespace unwindstack { // Forward declaration. diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/ElfInterface.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/ElfInterface.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/ElfInterface.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/ElfInterface.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Error.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Error.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Error.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Error.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Global.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Global.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Global.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Global.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/JitDebug.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/JitDebug.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/JitDebug.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/JitDebug.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Log.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Log.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Log.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Log.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineArm.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineArm.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineArm.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineArm.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineArm64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineArm64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineArm64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineArm64.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineX86.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineX86.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineX86.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineX86.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineX86_64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineX86_64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/MachineX86_64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MachineX86_64.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/MapInfo.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MapInfo.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/MapInfo.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/MapInfo.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Maps.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Maps.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Maps.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Maps.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Memory.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Memory.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Memory.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Memory.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Regs.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Regs.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Regs.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Regs.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsArm.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsArm.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsArm.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsArm.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsArm64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsArm64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsArm64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsArm64.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsGetLocal.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsGetLocal.h similarity index 72% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsGetLocal.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsGetLocal.h index bf3f767cb..3a90514e0 100644 --- a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsGetLocal.h +++ b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsGetLocal.h @@ -80,6 +80,51 @@ inline __attribute__((__always_inline__)) void AsmGetRegs(void* reg_data) { : "x12", "x13", "memory"); } +#ifdef SENTRY_REMOVED + +inline __attribute__((__always_inline__)) void AsmGetRegs(void* reg_data) { + asm volatile( + "1:\n" + "sd ra, 8(%[base])\n" + "sd sp, 16(%[base])\n" + "sd gp, 24(%[base])\n" + "sd tp, 32(%[base])\n" + "sd t0, 40(%[base])\n" + "sd t1, 48(%[base])\n" + "sd t2, 56(%[base])\n" + "sd s0, 64(%[base])\n" + "sd s1, 72(%[base])\n" + "sd a0, 80(%[base])\n" + "sd a1, 88(%[base])\n" + "sd a2, 96(%[base])\n" + "sd a3, 104(%[base])\n" + "sd a4, 112(%[base])\n" + "sd a5, 120(%[base])\n" + "sd a6, 128(%[base])\n" + "sd a7, 136(%[base])\n" + "sd s2, 144(%[base])\n" + "sd s3, 152(%[base])\n" + "sd s4, 160(%[base])\n" + "sd s5, 168(%[base])\n" + "sd s6, 176(%[base])\n" + "sd s7, 184(%[base])\n" + "sd s8, 192(%[base])\n" + "sd s9, 200(%[base])\n" + "sd s10, 208(%[base])\n" + "sd s11, 216(%[base])\n" + "sd t3, 224(%[base])\n" + "sd t4, 232(%[base])\n" + "sd t5, 240(%[base])\n" + "sd t6, 248(%[base])\n" + "la t1, 1b\n" + "sd t1, 0(%[base])\n" + : [base] "+r"(reg_data) + : + : "t1", "memory"); +} + +#endif // SENTRY_REMOVED + #elif defined(__i386__) || defined(__x86_64__) extern "C" void AsmGetRegs(void* regs); diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsX86.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsX86.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsX86.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsX86.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsX86_64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsX86_64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/RegsX86_64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/RegsX86_64.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/SharedString.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/SharedString.h similarity index 89% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/SharedString.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/SharedString.h index 1eb4e21de..bdf709ed8 100644 --- a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/SharedString.h +++ b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/SharedString.h @@ -18,6 +18,7 @@ #include #include +#include namespace unwindstack { @@ -46,7 +47,8 @@ class SharedString { std::shared_ptr data_; }; -static inline bool operator==(const SharedString& a, SharedString& b) { +template >> +static inline bool operator==(const T& a, const T& b) { return static_cast(a) == static_cast(b); } static inline bool operator==(const SharedString& a, std::string_view b) { @@ -55,7 +57,8 @@ static inline bool operator==(const SharedString& a, std::string_view b) { static inline bool operator==(std::string_view a, const SharedString& b) { return a == static_cast(b); } -static inline bool operator!=(const SharedString& a, SharedString& b) { +template >> +static inline bool operator!=(const T& a, const T& b) { return !(a == b); } static inline bool operator!=(const SharedString& a, std::string_view b) { diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextArm.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextArm.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextArm.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextArm.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextArm64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextArm64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextArm64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextArm64.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextX86.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextX86.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextX86.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextX86.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextX86_64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextX86_64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UcontextX86_64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UcontextX86_64.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/Unwinder.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Unwinder.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/Unwinder.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/Unwinder.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserArm.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserArm.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserArm.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserArm.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserArm64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserArm64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserArm64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserArm64.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserX86.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserX86.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserX86.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserX86.h diff --git a/shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserX86_64.h b/shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserX86_64.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/include/unwindstack/UserX86_64.h rename to shared/sentry/src/external/libunwindstack-ndk/include/unwindstack/UserX86_64.h diff --git a/shared/sentry/external/libunwindstack-ndk/procinfo/README.md b/shared/sentry/src/external/libunwindstack-ndk/procinfo/README.md similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/procinfo/README.md rename to shared/sentry/src/external/libunwindstack-ndk/procinfo/README.md diff --git a/shared/sentry/external/libunwindstack-ndk/procinfo/process.h b/shared/sentry/src/external/libunwindstack-ndk/procinfo/process.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/procinfo/process.h rename to shared/sentry/src/external/libunwindstack-ndk/procinfo/process.h diff --git a/shared/sentry/external/libunwindstack-ndk/procinfo/process_map.h b/shared/sentry/src/external/libunwindstack-ndk/procinfo/process_map.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/procinfo/process_map.h rename to shared/sentry/src/external/libunwindstack-ndk/procinfo/process_map.h diff --git a/shared/sentry/external/libunwindstack-ndk/unistdfix.h b/shared/sentry/src/external/libunwindstack-ndk/unistdfix.h similarity index 100% rename from shared/sentry/external/libunwindstack-ndk/unistdfix.h rename to shared/sentry/src/external/libunwindstack-ndk/unistdfix.h diff --git a/shared/sentry/external/third_party/lss/.gitignore b/shared/sentry/src/external/third_party/lss/.gitignore similarity index 100% rename from shared/sentry/external/third_party/lss/.gitignore rename to shared/sentry/src/external/third_party/lss/.gitignore diff --git a/shared/sentry/src/external/third_party/lss/DIR_METADATA b/shared/sentry/src/external/third_party/lss/DIR_METADATA new file mode 100644 index 000000000..eccfd35fa --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/DIR_METADATA @@ -0,0 +1,12 @@ +# Metadata information for this directory. +# +# For more information on DIR_METADATA files, see: +# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md +# +# For the schema of this file, see Metadata message: +# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto + +os: LINUX +monorail { + project: "linux-syscall-support" +} diff --git a/shared/sentry/src/external/third_party/lss/LICENSE b/shared/sentry/src/external/third_party/lss/LICENSE new file mode 100644 index 000000000..b66a6b273 --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/LICENSE @@ -0,0 +1,27 @@ +Copyright 2005-2011 Google LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/shared/sentry/src/external/third_party/lss/OWNERS b/shared/sentry/src/external/third_party/lss/OWNERS new file mode 100644 index 000000000..29b02fa11 --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/OWNERS @@ -0,0 +1,2 @@ +mseaborn@chromium.org +vapier@chromium.org diff --git a/shared/sentry/external/third_party/lss/README.md b/shared/sentry/src/external/third_party/lss/README.md similarity index 99% rename from shared/sentry/external/third_party/lss/README.md rename to shared/sentry/src/external/third_party/lss/README.md index 70cbc8531..e25abdd21 100644 --- a/shared/sentry/external/third_party/lss/README.md +++ b/shared/sentry/src/external/third_party/lss/README.md @@ -39,6 +39,7 @@ the header itself as this list might be out of date. * MIPS 32-bit o32 ABI * MIPS 32-bit n32 ABI * MIPS 64-bit n64 ABI +* LOONGARCH 64-bit ABI ## API @@ -130,7 +131,7 @@ It only compiles things (does not execute at all). If you commit a change to LSS, please also commit a Chromium change to update `lss_revision` in -[Chromium's DEPS](https://chromium.googlesource.com/chromium/src/+/master/DEPS) +[Chromium's DEPS](https://chromium.googlesource.com/chromium/src/+/HEAD/DEPS) file. This ensures that the LSS change gets tested, so that people who commit later diff --git a/shared/sentry/external/third_party/lss/codereview.settings b/shared/sentry/src/external/third_party/lss/codereview.settings similarity index 100% rename from shared/sentry/external/third_party/lss/codereview.settings rename to shared/sentry/src/external/third_party/lss/codereview.settings diff --git a/shared/sentry/external/third_party/lss/linux_syscall_support.h b/shared/sentry/src/external/third_party/lss/linux_syscall_support.h similarity index 81% rename from shared/sentry/external/third_party/lss/linux_syscall_support.h rename to shared/sentry/src/external/third_party/lss/linux_syscall_support.h index be7ea9d50..aab95e698 100644 --- a/shared/sentry/external/third_party/lss/linux_syscall_support.h +++ b/shared/sentry/src/external/third_party/lss/linux_syscall_support.h @@ -1,5 +1,4 @@ -/* Copyright (c) 2005-2011, Google Inc. - * All rights reserved. +/* Copyright 2005-2011 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -11,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * @@ -47,7 +46,7 @@ * the necessary definitions. * * SYS_ERRNO: - * All system calls will update "errno" unless overriden by setting the + * All system calls will update "errno" unless overridden by setting the * SYS_ERRNO macro prior to including this file. SYS_ERRNO should be * an l-value. * @@ -88,7 +87,8 @@ */ #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ defined(__mips__) || defined(__PPC__) || defined(__ARM_EABI__) || \ - defined(__aarch64__) || defined(__s390__)) \ + defined(__aarch64__) || defined(__s390__) || defined(__e2k__) || \ + (defined(__riscv) && __riscv_xlen == 64) || defined(__loongarch_lp64)) \ && (defined(__linux) || defined(__ANDROID__)) #ifndef SYS_CPLUSPLUS @@ -142,11 +142,13 @@ extern "C" { #pragma push_macro("lstat64") #pragma push_macro("pread64") #pragma push_macro("pwrite64") +#pragma push_macro("getdents64") #undef stat64 #undef fstat64 #undef lstat64 #undef pread64 #undef pwrite64 +#undef getdents64 #if defined(__ANDROID__) && defined(__x86_64__) // A number of x86_64 syscalls are blocked by seccomp on recent Android; @@ -264,6 +266,12 @@ struct kernel_timeval { long tv_usec; }; +/* include/linux/time.h */ +struct kernel_itimerval { + struct kernel_timeval it_interval; + struct kernel_timeval it_value; +}; + /* include/linux/resource.h */ struct kernel_rusage { struct kernel_timeval ru_utime; @@ -285,7 +293,8 @@ struct kernel_rusage { }; #if defined(__i386__) || defined(__ARM_EABI__) || defined(__ARM_ARCH_3__) \ - || defined(__PPC__) || (defined(__s390__) && !defined(__s390x__)) + || defined(__PPC__) || (defined(__s390__) && !defined(__s390x__)) \ + || defined(__e2k__) /* include/asm-{arm,i386,mips,ppc}/signal.h */ struct kernel_old_sigaction { @@ -299,8 +308,8 @@ struct kernel_old_sigaction { } __attribute__((packed,aligned(4))); #elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) #define kernel_old_sigaction kernel_sigaction -#elif defined(__aarch64__) - // No kernel_old_sigaction defined for arm64. +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) + // No kernel_old_sigaction defined for arm64 riscv and loongarch64. #endif /* Some kernel functions (e.g. sigaction() in 2.6.23) require that the @@ -339,7 +348,9 @@ struct kernel_sigaction { void (*sa_sigaction_)(int, siginfo_t *, void *); }; unsigned long sa_flags; +#if !defined(__riscv) && !defined(__loongarch_lp64) void (*sa_restorer)(void); +#endif struct kernel_sigset_t sa_mask; #endif }; @@ -353,6 +364,16 @@ struct kernel_sockaddr { /* include/asm-{arm,aarch64,i386,mips,ppc,s390}/stat.h */ #ifdef __mips__ #if _MIPS_SIM == _MIPS_SIM_ABI64 +typedef unsigned long long kernel_blkcnt_t; +typedef unsigned kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned long long kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef unsigned kernel_nlink_t; +typedef long long kernel_off_t; +typedef unsigned kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { #else struct kernel_stat64 { @@ -399,6 +420,28 @@ struct kernel_stat64 { unsigned long __unused4; unsigned long __unused5; }; +#elif defined(__e2k__) +struct kernel_stat64 { + unsigned long long st_dev; + unsigned long long st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + unsigned long long st_rdev; + long long st_size; + int st_blksize; + int __pad2; + unsigned long long st_blocks; + int st_atime_; + unsigned int st_atime_nsec_; + int st_mtime_; + unsigned int st_mtime_nsec_; + int st_ctime_; + unsigned int st_ctime_nsec_; + unsigned int __unused4; + unsigned int __unused5; +}; #else struct kernel_stat64 { unsigned long long st_dev; @@ -425,165 +468,264 @@ struct kernel_stat64 { /* include/asm-{arm,aarch64,i386,mips,x86_64,ppc,s390}/stat.h */ #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) +typedef unsigned kernel_blkcnt_t; +typedef unsigned kernel_blksize_t; +typedef unsigned short kernel_dev_t; +typedef unsigned short kernel_gid_t; +typedef unsigned kernel_ino_t; +typedef unsigned short kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef unsigned kernel_off_t; +typedef unsigned kernel_time_t; +typedef unsigned short kernel_uid_t; struct kernel_stat { /* The kernel headers suggest that st_dev and st_rdev should be 32bit * quantities encoding 12bit major and 20bit minor numbers in an interleaved * format. In reality, we do not see useful data in the top bits. So, * we'll leave the padding in here, until we find a better solution. */ - unsigned short st_dev; + kernel_dev_t st_dev; short pad1; - unsigned st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; short pad2; - unsigned st_size; - unsigned st_blksize; - unsigned st_blocks; - unsigned st_atime_; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned st_atime_nsec_; - unsigned st_mtime_; + kernel_time_t st_mtime_; unsigned st_mtime_nsec_; - unsigned st_ctime_; + kernel_time_t st_ctime_; unsigned st_ctime_nsec_; unsigned __unused4; unsigned __unused5; }; #elif defined(__x86_64__) +typedef int64_t kernel_blkcnt_t; +typedef int64_t kernel_blksize_t; +typedef uint64_t kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef uint64_t kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef uint64_t kernel_nlink_t; +typedef int64_t kernel_off_t; +typedef uint64_t kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { - uint64_t st_dev; - uint64_t st_ino; - uint64_t st_nlink; - unsigned st_mode; - unsigned st_uid; - unsigned st_gid; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_nlink_t st_nlink; + kernel_mode_t st_mode; + kernel_uid_t st_uid; + kernel_gid_t st_gid; unsigned __pad0; - uint64_t st_rdev; - int64_t st_size; - int64_t st_blksize; - int64_t st_blocks; - uint64_t st_atime_; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; uint64_t st_atime_nsec_; - uint64_t st_mtime_; + kernel_time_t st_mtime_; uint64_t st_mtime_nsec_; - uint64_t st_ctime_; + kernel_time_t st_ctime_; uint64_t st_ctime_nsec_; int64_t __unused4[3]; }; #elif defined(__PPC__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned long kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { - unsigned st_dev; - unsigned long st_ino; // ino_t - unsigned long st_mode; // mode_t - unsigned short st_nlink; // nlink_t - unsigned st_uid; // uid_t - unsigned st_gid; // gid_t - unsigned st_rdev; - long st_size; // off_t - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime_; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_gid_t st_uid; + kernel_uid_t st_gid; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - unsigned long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - unsigned long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; unsigned long __unused4; unsigned long __unused5; }; #elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) +typedef int kernel_blkcnt_t; +typedef int kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef unsigned kernel_nlink_t; +typedef long kernel_off_t; +typedef long kernel_time_t; +typedef unsigned kernel_uid_t; struct kernel_stat { - unsigned st_dev; + kernel_dev_t st_dev; int st_pad1[3]; - unsigned st_ino; - unsigned st_mode; - unsigned st_nlink; - unsigned st_uid; - unsigned st_gid; - unsigned st_rdev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; int st_pad2[2]; - long st_size; + kernel_off_t st_size; int st_pad3; - long st_atime_; + kernel_time_t st_atime_; long st_atime_nsec_; - long st_mtime_; + kernel_time_t st_mtime_; long st_mtime_nsec_; - long st_ctime_; + kernel_time_t st_ctime_; long st_ctime_nsec_; - int st_blksize; - int st_blocks; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; int st_pad4[14]; }; -#elif defined(__aarch64__) +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) +typedef long kernel_blkcnt_t; +typedef int kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned int kernel_nlink_t; +typedef long kernel_off_t; +typedef long kernel_time_t; +typedef unsigned int kernel_uid_t; struct kernel_stat { - unsigned long st_dev; - unsigned long st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - unsigned long st_rdev; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; unsigned long __pad1; - long st_size; - int st_blksize; + kernel_off_t st_size; + kernel_blksize_t st_blksize; int __pad2; - long st_blocks; - long st_atime_; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; unsigned int __unused4; unsigned int __unused5; }; #elif defined(__s390x__) +typedef long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned long kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned int kernel_uid_t; struct kernel_stat { - unsigned long st_dev; - unsigned long st_ino; - unsigned long st_nlink; - unsigned int st_mode; - unsigned int st_uid; - unsigned int st_gid; + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_nlink_t st_nlink; + kernel_mode_t st_mode; + kernel_uid_t st_uid; + kernel_gid_t st_gid; unsigned int __pad1; - unsigned long st_rdev; - unsigned long st_size; - unsigned long st_atime_; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - unsigned long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - unsigned long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; - unsigned long st_blksize; - long st_blocks; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; unsigned long __unused[3]; }; #elif defined(__s390__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned short kernel_dev_t; +typedef unsigned short kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned short kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned short kernel_uid_t; struct kernel_stat { - unsigned short st_dev; + kernel_dev_t st_dev; unsigned short __pad1; - unsigned long st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; unsigned short __pad2; - unsigned long st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime_; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; unsigned long st_atime_nsec_; - unsigned long st_mtime_; + kernel_time_t st_mtime_; unsigned long st_mtime_nsec_; - unsigned long st_ctime_; + kernel_time_t st_ctime_; unsigned long st_ctime_nsec_; unsigned long __unused4; unsigned long __unused5; }; +#elif defined(__e2k__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned long kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned int kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; + unsigned long st_atime_nsec_; + kernel_time_t st_mtime_; + unsigned long st_mtime_nsec_; + kernel_time_t st_ctime_; + unsigned long st_ctime_nsec_; +}; #endif /* include/asm-{arm,aarch64,i386,mips,x86_64,ppc,s390}/statfs.h */ @@ -699,6 +841,37 @@ struct kernel_statfs { }; #endif +struct kernel_statx_timestamp { + int64_t tv_sec; + uint32_t tv_nsec; + int32_t __reserved; +}; + +struct kernel_statx { + uint32_t stx_mask; + uint32_t stx_blksize; + uint64_t stx_attributes; + uint32_t stx_nlink; + uint32_t stx_uid; + uint32_t stx_gid; + uint16_t stx_mode; + uint16_t __spare0[1]; + uint64_t stx_ino; + uint64_t stx_size; + uint64_t stx_blocks; + uint64_t stx_attributes_mask; + struct kernel_statx_timestamp stx_atime; + struct kernel_statx_timestamp stx_btime; + struct kernel_statx_timestamp stx_ctime; + struct kernel_statx_timestamp stx_mtime; + uint32_t stx_rdev_major; + uint32_t stx_rdev_minor; + uint32_t stx_dev_major; + uint32_t stx_dev_minor; + uint64_t stx_mnt_id; + uint64_t __spare2; + uint64_t __spare3[12]; +}; /* Definitions missing from the standard header files */ #ifndef O_DIRECTORY @@ -735,6 +908,18 @@ struct kernel_statfs { #ifndef AT_REMOVEDIR #define AT_REMOVEDIR 0x200 #endif +#ifndef AT_NO_AUTOMOUNT +#define AT_NO_AUTOMOUNT 0x800 +#endif +#ifndef AT_EMPTY_PATH +#define AT_EMPTY_PATH 0x1000 +#endif +#ifndef STATX_BASIC_STATS +#define STATX_BASIC_STATS 0x000007ffU +#endif +#ifndef AT_STATX_SYNC_AS_STAT +#define AT_STATX_SYNC_AS_STAT 0x0000 +#endif #ifndef MREMAP_FIXED #define MREMAP_FIXED 2 #endif @@ -952,6 +1137,9 @@ struct kernel_statfs { #ifndef __NR_fallocate #define __NR_fallocate 324 #endif +#ifndef __NR_getrandom +#define __NR_getrandom 355 +#endif /* End of i386 definitions */ #elif defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) #ifndef __NR_setresuid @@ -1050,14 +1238,20 @@ struct kernel_statfs { #ifndef __NR_ioprio_get #define __NR_ioprio_get (__NR_SYSCALL_BASE + 315) #endif +#ifndef __NR_fstatat64 +#define __NR_fstatat64 (__NR_SYSCALL_BASE + 327) +#endif #ifndef __NR_move_pages #define __NR_move_pages (__NR_SYSCALL_BASE + 344) #endif #ifndef __NR_getcpu #define __NR_getcpu (__NR_SYSCALL_BASE + 345) #endif +#ifndef __NR_getrandom +#define __NR_getrandom (__NR_SYSCALL_BASE + 384) +#endif /* End of ARM 3/EABI definitions */ -#elif defined(__aarch64__) +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) #ifndef __NR_setxattr #define __NR_setxattr 5 #endif @@ -1113,9 +1307,11 @@ struct kernel_statfs { #ifndef __NR_readlinkat #define __NR_readlinkat 78 #endif +#if !defined(__loongarch_lp64) #ifndef __NR_newfstatat #define __NR_newfstatat 79 #endif +#endif #ifndef __NR_set_tid_address #define __NR_set_tid_address 96 #endif @@ -1153,7 +1349,12 @@ struct kernel_statfs { #ifndef __NR_move_pages #define __NR_move_pages 239 #endif -/* End of aarch64 definitions */ +#ifndef __NR_getrandom +#define __NR_getrandom 278 +#endif +#ifndef __NR_statx +#define __NR_statx 291 +#endif #elif defined(__x86_64__) #ifndef __NR_pread64 #define __NR_pread64 17 @@ -1244,6 +1445,9 @@ struct kernel_statfs { #ifndef __NR_fallocate #define __NR_fallocate 285 #endif +#ifndef __NR_getrandom +#define __NR_getrandom 318 +#endif /* End of x86-64 definitions */ #elif defined(__mips__) #if _MIPS_SIM == _MIPS_SIM_ABI32 @@ -1345,6 +1549,9 @@ struct kernel_statfs { #ifndef __NR_ioprio_get #define __NR_ioprio_get (__NR_Linux + 315) #endif +#ifndef __NR_getrandom +#define __NR_getrandom (__NR_Linux + 353) +#endif /* End of MIPS (old 32bit API) definitions */ #elif _MIPS_SIM == _MIPS_SIM_ABI64 #ifndef __NR_pread64 @@ -1423,6 +1630,9 @@ struct kernel_statfs { #ifndef __NR_ioprio_get #define __NR_ioprio_get (__NR_Linux + 274) #endif +#ifndef __NR_getrandom +#define __NR_getrandom (__NR_Linux + 313) +#endif /* End of MIPS (64bit API) definitions */ #else #ifndef __NR_setresuid @@ -1613,7 +1823,7 @@ struct kernel_statfs { #ifndef __NR_getcpu #define __NR_getcpu 302 #endif -/* End of powerpc defininitions */ +/* End of powerpc definitions */ #elif defined(__s390__) #ifndef __NR_quotactl #define __NR_quotactl 131 @@ -1859,15 +2069,16 @@ struct kernel_statfs { #endif #undef LSS_RETURN - #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \ - || defined(__ARM_EABI__) || defined(__aarch64__) || defined(__s390__)) + #if defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \ + || defined(__ARM_EABI__) || defined(__aarch64__) || defined(__s390__) \ + || defined(__e2k__) || defined(__riscv) || defined(__loongarch_lp64) /* Failing system calls return a negative result in the range of * -1..-4095. These are "errno" values with the sign inverted. */ #define LSS_RETURN(type, res) \ do { \ if ((unsigned long)(res) >= (unsigned long)(-4095)) { \ - LSS_ERRNO = -(res); \ + LSS_ERRNO = (int)(-(res)); \ res = -1; \ } \ return (type) (res); \ @@ -1960,7 +2171,7 @@ struct kernel_statfs { LSS_ENTRYPOINT \ "pop %%ebx" \ args \ - : "esp", "memory"); \ + : "memory"); \ LSS_RETURN(type,__res) #undef _syscall0 #define _syscall0(type,name) \ @@ -2017,7 +2228,7 @@ struct kernel_statfs { : "i" (__NR_##name), "ri" ((long)(arg1)), \ "c" ((long)(arg2)), "d" ((long)(arg3)), \ "S" ((long)(arg4)), "D" ((long)(arg5)) \ - : "esp", "memory"); \ + : "memory"); \ LSS_RETURN(type,__res); \ } #undef _syscall6 @@ -2039,7 +2250,7 @@ struct kernel_statfs { : "i" (__NR_##name), "0" ((long)(&__s)), \ "c" ((long)(arg2)), "d" ((long)(arg3)), \ "S" ((long)(arg4)), "D" ((long)(arg5)) \ - : "esp", "memory"); \ + : "memory"); \ LSS_RETURN(type,__res); \ } LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, @@ -2125,7 +2336,7 @@ struct kernel_statfs { : "0"(-EINVAL), "i"(__NR_clone), "m"(fn), "m"(child_stack), "m"(flags), "m"(arg), "m"(parent_tidptr), "m"(newtls), "m"(child_tidptr) - : "esp", "memory", "ecx", "edx", "esi", "edi"); + : "memory", "ecx", "edx", "esi", "edi"); LSS_RETURN(int, __res); } @@ -2221,7 +2432,7 @@ struct kernel_statfs { #define _LSS_RETURN(type, res, cast) \ do { \ if ((uint64_t)(res) >= (uint64_t)(-4095)) { \ - LSS_ERRNO = -(res); \ + LSS_ERRNO = (int)(-(res)); \ res = -1; \ } \ return (type)(cast)(res); \ @@ -2770,7 +2981,7 @@ struct kernel_statfs { void *newtls, int *child_tidptr) { int64_t __res; { - register uint64_t __flags __asm__("x0") = flags; + register uint64_t __flags __asm__("x0") = (uint64_t)flags; register void *__stack __asm__("x1") = child_stack; register void *__ptid __asm__("x2") = parent_tidptr; register void *__tls __asm__("x3") = newtls; @@ -3353,6 +3564,503 @@ struct kernel_statfs { } LSS_RETURN(int, __ret); } + #elif defined(__riscv) && __riscv_xlen == 64 + #undef LSS_REG + #define LSS_REG(r,a) register int64_t __r##r __asm__("a"#r) = (int64_t)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register int64_t __res_a0 __asm__("a0"); \ + register int64_t __a7 __asm__("a7") = __NR_##name; \ + int64_t __res; \ + __asm__ __volatile__ ("scall\n" \ + : "=r"(__res_a0) \ + : "r"(__a7) , ## args \ + : "memory"); \ + __res = __res_a0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + int64_t __res; + { + register int64_t __res_a0 __asm__("a0"); + register uint64_t __flags __asm__("a0") = flags; + register void *__stack __asm__("a1") = child_stack; + register void *__ptid __asm__("a2") = parent_tidptr; + register void *__tls __asm__("a3") = newtls; + register int *__ctid __asm__("a4") = child_tidptr; + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "addi %2,%2,-16\n" + "sd %1, 0(%2)\n" + "sd %4, 8(%2)\n" + + /* %a0 = syscall(%a0 = flags, + * %a1 = child_stack, + * %a2 = parent_tidptr, + * %a3 = newtls, + * %a4 = child_tidptr) + */ + "li a7, %8\n" + "scall\n" + + /* if (%a0 != 0) + * return %a0; + */ + "bnez %0, 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ld a1, 0(sp)\n" + "ld a0, 8(sp)\n" + "jalr a1\n" + + /* Call _exit(%a0). + */ + "li a7, %9\n" + "scall\n" + "1:\n" + : "=r" (__res_a0) + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "cc", "memory"); + __res = __res_a0; + } + LSS_RETURN(int, __res); + } + #elif defined(__e2k__) + + #undef _LSS_BODY + #define _LSS_BODY(nr, type, name, ...) \ + register unsigned long long __res; \ + __asm__ __volatile__ \ + ( \ + "{\n\t" \ + " sdisp %%ctpr1, 0x3\n\t" \ + " addd, s 0x0, %[sys_num], %%b[0]\n\t" \ + LSS_BODY_ASM##nr \ + "}\n\t" \ + "{\n\t" \ + " call %%ctpr1, wbs = %#\n\t" \ + "}\n\t" \ + "{\n\t" \ + " addd, s 0x0, %%b[0], %[res]\n\t" \ + "}\n\t" \ + : [res] "=r" (__res) \ + : \ + LSS_BODY_ARG##nr(__VA_ARGS__) \ + [sys_num] "ri" (__NR_##name) \ + : "ctpr1", "ctpr2", "ctpr3", \ + "b[0]", "b[1]", "b[2]", "b[3]", \ + "b[4]", "b[5]", "b[6]", "b[7]" \ + ); \ + LSS_RETURN(type, __res); + + #undef LSS_BODY + #define LSS_BODY(nr, type, name, args...) \ + _LSS_BODY(nr, type, name, ## args) + + #undef LSS_BODY_ASM0 + #undef LSS_BODY_ASM1 + #undef LSS_BODY_ASM2 + #undef LSS_BODY_ASM3 + #undef LSS_BODY_ASM4 + #undef LSS_BODY_ASM5 + #undef LSS_BODY_ASM6 + + #define LSS_BODY_ASM0 + #define LSS_BODY_ASM1 LSS_BODY_ASM0 \ + " addd, s 0x0, %[arg1], %%b[1]\n\t" + #define LSS_BODY_ASM2 LSS_BODY_ASM1 \ + " addd, s 0x0, %[arg2], %%b[2]\n\t" + #define LSS_BODY_ASM3 LSS_BODY_ASM2 \ + " addd, s 0x0, %[arg3], %%b[3]\n\t" + #define LSS_BODY_ASM4 LSS_BODY_ASM3 \ + " addd, s 0x0, %[arg4], %%b[4]\n\t" + #define LSS_BODY_ASM5 LSS_BODY_ASM4 \ + " addd, s 0x0, %[arg5], %%b[5]\n\t" + #define LSS_BODY_ASM6 LSS_BODY_ASM5 \ + "}\n\t" \ + "{\n\t" \ + " addd, s 0x0, %[arg6], %%b[6]\n\t" + + #undef LSS_SYSCALL_ARG + #define LSS_SYSCALL_ARG(a) ((unsigned long long)(uintptr_t)(a)) + + #undef LSS_BODY_ARG0 + #undef LSS_BODY_ARG1 + #undef LSS_BODY_ARG2 + #undef LSS_BODY_ARG3 + #undef LSS_BODY_ARG4 + #undef LSS_BODY_ARG5 + #undef LSS_BODY_ARG6 + + #define LSS_BODY_ARG0() + #define LSS_BODY_ARG1(_arg1) \ + [arg1] "ri" LSS_SYSCALL_ARG(_arg1), + #define LSS_BODY_ARG2(_arg1, _arg2) \ + LSS_BODY_ARG1(_arg1) \ + [arg2] "ri" LSS_SYSCALL_ARG(_arg2), + #define LSS_BODY_ARG3(_arg1, _arg2, _arg3) \ + LSS_BODY_ARG2(_arg1, _arg2) \ + [arg3] "ri" LSS_SYSCALL_ARG(_arg3), + #define LSS_BODY_ARG4(_arg1, _arg2, _arg3, _arg4) \ + LSS_BODY_ARG3(_arg1, _arg2, _arg3) \ + [arg4] "ri" LSS_SYSCALL_ARG(_arg4), + #define LSS_BODY_ARG5(_arg1, _arg2, _arg3, _arg4, _arg5) \ + LSS_BODY_ARG4(_arg1, _arg2, _arg3, _arg4) \ + [arg5] "ri" LSS_SYSCALL_ARG(_arg5), + #define LSS_BODY_ARG6(_arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \ + LSS_BODY_ARG5(_arg1, _arg2, _arg3, _arg4, _arg5) \ + [arg6] "ri" LSS_SYSCALL_ARG(_arg6), + + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(0, type, name); \ + } + + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(1, type, name, arg1) \ + } + + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_BODY(2, type, name, arg1, arg2) \ + } + + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_BODY(3, type, name, arg1, arg2, arg3) \ + } + + #undef _syscall4 + #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_BODY(4, type, name, arg1, arg2, arg3, arg4) \ + } + + #undef _syscall5 + #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5) \ + } + + #undef _syscall6 + #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5, type6, arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6) \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + unsigned long long __res; + + __asm__ __volatile__ ( + "{\n\t" + " addd,s 0x0, %[nr_clone], %%b[0]\n\t" + " addd,s 0x0, %[flags], %%db[1]\n\t" + " addd,s 0x0, %[child_stack], %%db[2]\n\t" + " addd,s 0x0, %[parent_tidptr], %%db[3]\n\t" + " addd,s 0x0, %[child_tidptr], %%db[4]\n\t" + " addd,s 0x0, %[newtls], %%db[5]\n\t" + "}\n\t" + /* if (fn == NULL) + * return -EINVAL; + */ + + "{\n\t" + " disp %%ctpr1, .L1\n\t" + "}\n\t" + "{\n\t" + " cmpesb,s 0x0, %[fn], %%pred0\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1 ? %%pred0\n\t" + "}\n\t" + + /* if (child_stack == NULL) + * return -EINVAL; + */ + "{\n\t" + " cmpesb,s 0x0, %%db[2], %%pred0\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1 ? %%pred0\n\t" + "}\n\t" + + /* b[0] = syscall(%b[0] = __NR_clone, + * %db[1] = flags, + * %db[2] = child_stack, + * %db[3] = parent_tidptr, + * %db[4] = child_tidptr, + * %db[5] = newtls) + */ + "{\n\t" + " sdisp %%ctpr1, 0x3\n\t" + "}\n\t" + "{\n\t" + " call %%ctpr1, wbs = %#\n\t" + "}\n\t" + + /* if (%[b0] != 0) + * return %b[0]; + */ + "{\n\t" + " disp %%ctpr1, .L2\n\t" + " cmpesb,s 0x0, %%b[0], %%pred0\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1 ? ~%%pred0\n\t" + "}\n\t" + /* In the child, now. Call "fn(arg)". + */ + + "{\n\t" + " movtd,s %[fn], %%ctpr1\n\t" + "}\n\t" + "{\n\t" + " addd,s 0x0, %[arg], %%db[0]\n\t" + "}\n\t" + "{\n\t" + " call %%ctpr1, wbs = %#\n\t" + "}\n\t" + /* Call _exit(%b[0]). + */ + + "{\n\t" + " sdisp %%ctpr1, 0x3\n\t" + " addd,s 0x0, %%b[0], %%b[1]\n\t" + "}\n\t" + "{\n\t" + " addd,s 0x0, %[nr_exit], %%b[0]\n\t" + "}\n\t" + "{\n\t" + " call %%ctpr1, wbs = %#\n\t" + "}\n\t" + "{\n\t" + " disp %%ctpr1, .L2\n\t" + " adds,s 0x0, 0x0, %%b[0]\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1\n\t" + "}\n\t" + ".L1:\n\t" + "{\n\t" + " addd,s 0x0, %[einval], %%b[0]\n\t" + "}\n\t" + ".L2:\n\t" + "{\n\t" + " addd,s 0x0, %%b[0], %[res]\n\t" + "}\n\t" + : [res] "=r" LSS_SYSCALL_ARG(__res) + : [nr_clone] "ri" LSS_SYSCALL_ARG(__NR_clone) + [arg] "ri" LSS_SYSCALL_ARG(arg) + [nr_exit] "ri" LSS_SYSCALL_ARG(__NR_exit) + [flags] "ri" LSS_SYSCALL_ARG(flags) + [child_stack] "ri" LSS_SYSCALL_ARG(child_stack) + [parent_tidptr] "ri" + LSS_SYSCALL_ARG(parent_tidptr) + [newtls] "ri" LSS_SYSCALL_ARG(newtls) + [child_tidptr] "ri" + LSS_SYSCALL_ARG(child_tidptr) + [fn] "ri" LSS_SYSCALL_ARG(fn) + [einval] "ri" LSS_SYSCALL_ARG(-EINVAL) + : "ctpr1", "b[0]", "b[1]", "b[2]", "b[3]", + "b[4]", "b[5]", "pred0"); + LSS_RETURN(int, __res); + } + #elif defined(__loongarch_lp64) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(ar,a) register int64_t __r##ar __asm__("a"#ar) = (int64_t)a + /* syscall is like subroutine calls, all caller-saved registers may be + * clobbered, we should add them to the |Clobbers| list. + * a0 is not included because it's in the output list. + */ + #define LSS_SYSCALL_CLOBBERS "t0", "t1", "t2", "t3", "t4", "t5", "t6", \ + "t7", "t8", "memory" + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register int64_t __res_a0 __asm__("a0"); \ + register int64_t __a7 __asm__("a7") = __NR_##name; \ + int64_t __res; \ + __asm__ __volatile__ ("syscall 0x0\n" \ + : "=r"(__res_a0) \ + : "r"(__a7), ## args \ + : LSS_SYSCALL_CLOBBERS); \ + __res = __res_a0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + int64_t __res; + { + register int64_t __res_a0 __asm__("a0"); + register uint64_t __flags __asm__("a0") = flags; + register void *__stack __asm__("a1") = child_stack; + register void *__ptid __asm__("a2") = parent_tidptr; + register void *__tls __asm__("a3") = newtls; + register int *__ctid __asm__("a4") = child_tidptr; + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "addi.d %2, %2, -16\n" + "st.d %1, %2, 8\n" + "st.d %4, %2, 0\n" + + /* %a0 = syscall(%a0 = flags, + * %a1 = child_stack, + * %a2 = parent_tidptr, + * %a3 = newtls, + * %a4 = child_tidptr) + */ + "li.d $a7, %8\n" + "syscall 0x0\n" + + /* if (%a0 != 0) + * return %a0; + */ + "bnez $a0, 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ld.d $a0, $sp, 0\n" + "ld.d $a1, $sp, 8\n" + "addi.d $sp, $sp, 16\n" + "jirl $ra, $a1, 0\n" + + /* Call _exit(%a0). + */ + "li.d $a7, %9\n" + "syscall 0x0\n" + "1:\n" + : "=r" (__res_a0) + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "a7", LSS_SYSCALL_CLOBBERS); + __res = __res_a0; + } + LSS_RETURN(int, __res); + } + #endif #define __NR__exit __NR_exit #define __NR__gettid __NR_gettid @@ -3383,8 +4091,10 @@ struct kernel_statfs { // fork is polyfilled below when not available. LSS_INLINE _syscall0(pid_t, fork) #endif + #if defined(__NR_fstat) LSS_INLINE _syscall2(int, fstat, int, f, struct kernel_stat*, b) + #endif LSS_INLINE _syscall2(int, fstatfs, int, f, struct kernel_statfs*, b) #if defined(__x86_64__) @@ -3406,6 +4116,8 @@ struct kernel_statfs { struct kernel_dirent64*, d, int, c) LSS_INLINE _syscall0(gid_t, getegid) LSS_INLINE _syscall0(uid_t, geteuid) + LSS_INLINE _syscall2(int, getitimer, int, w, + struct kernel_itimerval*, c) #if defined(__NR_getpgrp) LSS_INLINE _syscall0(pid_t, getpgrp) #endif @@ -3417,10 +4129,10 @@ struct kernel_statfs { gid_t *, e, gid_t *, s) LSS_INLINE _syscall3(int, getresuid, uid_t *, r, uid_t *, e, uid_t *, s) -#if !defined(__ARM_EABI__) + #if defined(__NR_getrlimit) LSS_INLINE _syscall2(int, getrlimit, int, r, struct kernel_rlimit*, l) -#endif + #endif LSS_INLINE _syscall1(pid_t, getsid, pid_t, p) LSS_INLINE _syscall0(pid_t, _gettid) LSS_INLINE _syscall2(pid_t, gettimeofday, struct kernel_timeval*, t, @@ -3527,6 +4239,9 @@ struct kernel_statfs { LSS_INLINE _syscall1(int, setfsuid, uid_t, u) LSS_INLINE _syscall1(int, setuid, uid_t, u) LSS_INLINE _syscall1(int, setgid, gid_t, g) + LSS_INLINE _syscall3(int, setitimer, int, w, + const struct kernel_itimerval*, n, + struct kernel_itimerval*, o) LSS_INLINE _syscall2(int, setpgid, pid_t, p, pid_t, g) LSS_INLINE _syscall3(int, setpriority, int, a, @@ -3535,8 +4250,10 @@ struct kernel_statfs { gid_t, e, gid_t, s) LSS_INLINE _syscall3(int, setresuid, uid_t, r, uid_t, e, uid_t, s) + #if defined(__NR_setrlimit) LSS_INLINE _syscall2(int, setrlimit, int, r, const struct kernel_rlimit*, l) + #endif LSS_INLINE _syscall0(pid_t, setsid) LSS_INLINE _syscall2(int, sigaltstack, const stack_t*, s, const stack_t*, o) @@ -3544,10 +4261,14 @@ struct kernel_statfs { LSS_INLINE _syscall1(int, sigreturn, unsigned long, u) #endif #if defined(__NR_stat) - // stat is polyfilled below when not available. + // stat and lstat are polyfilled below when not available. LSS_INLINE _syscall2(int, stat, const char*, f, struct kernel_stat*, b) #endif + #if defined(__NR_lstat) + LSS_INLINE _syscall2(int, lstat, const char*, f, + struct kernel_stat*, b) + #endif LSS_INLINE _syscall2(int, statfs, const char*, f, struct kernel_statfs*, b) LSS_INLINE _syscall3(int, tgkill, pid_t, p, @@ -3566,23 +4287,6 @@ struct kernel_statfs { LSS_INLINE _syscall3(long, getcpu, unsigned *, cpu, unsigned *, node, void *, unused) #endif - #if defined(__x86_64__) || \ - (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) - LSS_INLINE _syscall3(int, recvmsg, int, s, - struct kernel_msghdr*, m, int, f) - LSS_INLINE _syscall3(int, sendmsg, int, s, - const struct kernel_msghdr*, m, int, f) - LSS_INLINE _syscall6(int, sendto, int, s, - const void*, m, size_t, l, - int, f, - const struct kernel_sockaddr*, a, int, t) - LSS_INLINE _syscall2(int, shutdown, int, s, - int, h) - LSS_INLINE _syscall3(int, socket, int, d, - int, t, int, p) - LSS_INLINE _syscall4(int, socketpair, int, d, - int, t, int, p, int*, s) - #endif #if defined(__NR_fadvise64) #if defined(__x86_64__) /* Need to make sure loff_t isn't truncated to 32-bits under x32. */ @@ -3656,11 +4360,21 @@ struct kernel_statfs { int, f, int, mode, loff_t, offset, loff_t, len) #endif #endif + #if defined(__NR_getrandom) + LSS_INLINE _syscall3(ssize_t, getrandom, void*, buffer, size_t, length, + unsigned int, flags) + #endif #if defined(__NR_newfstatat) LSS_INLINE _syscall4(int, newfstatat, int, d, const char *, p, struct kernel_stat*, b, int, f) #endif + #if defined(__NR_statx) + LSS_INLINE _syscall5(int, statx, int, d, + const char *, p, + int, f, int, m, + struct kernel_statx*, b) + #endif #if defined(__x86_64__) || defined(__s390x__) LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid, gid_t *egid, @@ -3867,43 +4581,43 @@ struct kernel_statfs { LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set, int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { LSS_ERRNO = EINVAL; return -1; } else { - set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] - |= 1UL << ((signum - 1) % (8*sizeof(set->sig[0]))); + set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] + |= 1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0]))); return 0; } } LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set, int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { LSS_ERRNO = EINVAL; return -1; } else { - set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] - &= ~(1UL << ((signum - 1) % (8*sizeof(set->sig[0])))); + set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] + &= ~(1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0])))); return 0; } } LSS_INLINE int LSS_NAME(sigismember)(struct kernel_sigset_t *set, int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { LSS_ERRNO = EINVAL; return -1; } else { - return !!(set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] & - (1UL << ((signum - 1) % (8*sizeof(set->sig[0]))))); + return !!(set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] & + (1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0]))))); } } #if defined(__i386__) || \ defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \ (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ defined(__PPC__) || \ - (defined(__s390__) && !defined(__s390x__)) + (defined(__s390__) && !defined(__s390x__)) || defined(__e2k__) #define __NR__sigaction __NR_sigaction #define __NR__sigpending __NR_sigpending #define __NR__sigsuspend __NR_sigsuspend @@ -4157,23 +4871,31 @@ struct kernel_statfs { LSS_SC_BODY(4, int, 8, d, type, protocol, sv); } #endif - #if defined(__ARM_EABI__) || defined (__aarch64__) + #if defined(__NR_recvmsg) LSS_INLINE _syscall3(ssize_t, recvmsg, int, s, struct kernel_msghdr*, msg, int, flags) + #endif + #if defined(__NR_sendmsg) LSS_INLINE _syscall3(ssize_t, sendmsg, int, s, const struct kernel_msghdr*, msg, int, flags) + #endif + #if defined(__NR_sendto) LSS_INLINE _syscall6(ssize_t, sendto, int, s, const void*, buf, size_t,len, int, flags, const struct kernel_sockaddr*, to, unsigned int, tolen) + #endif + #if defined(__NR_shutdown) LSS_INLINE _syscall2(int, shutdown, int, s, int, how) + #endif + #if defined(__NR_socket) LSS_INLINE _syscall3(int, socket, int, domain, int, type, int, protocol) + #endif + #if defined(__NR_socketpair) LSS_INLINE _syscall4(int, socketpair, int, d, int, type, int, protocol, int*, sv) #endif - #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ - (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ - defined(__s390__) - #define __NR__socketcall __NR_socketcall + + #if defined(__NR_socketcall) LSS_INLINE _syscall2(int, _socketcall, int, c, va_list, a) LSS_INLINE int LSS_NAME(socketcall)(int op, ...) { @@ -4185,36 +4907,43 @@ struct kernel_statfs { return rc; } + # if !defined(__NR_recvmsg) LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, int flags){ return (ssize_t)LSS_NAME(socketcall)(17, s, msg, flags); } - + # endif + # if !defined(__NR_sendmsg) LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, const struct kernel_msghdr *msg, int flags) { return (ssize_t)LSS_NAME(socketcall)(16, s, msg, flags); } - + # endif + # if !defined(__NR_sendto) LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, int flags, const struct kernel_sockaddr *to, unsigned int tolen) { return (ssize_t)LSS_NAME(socketcall)(11, s, buf, len, flags, to, tolen); } - + # endif + # if !defined(__NR_shutdown) LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { return LSS_NAME(socketcall)(13, s, how); } - + # endif + # if !defined(__NR_socket) LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { return LSS_NAME(socketcall)(1, domain, type, protocol); } - + # endif + # if !defined(__NR_socketpair) LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, int sv[2]) { return LSS_NAME(socketcall)(8, d, type, protocol, sv); } + # endif #endif #if defined(__NR_fstatat64) LSS_INLINE _syscall4(int, fstatat64, int, d, @@ -4296,12 +5025,12 @@ struct kernel_statfs { va_start(ap, flags); new_address = va_arg(ap, void *); rc = LSS_NAME(_mremap)(old_address, old_size, new_size, - flags, new_address); + (unsigned long)flags, new_address); va_end(ap); return rc; } - LSS_INLINE int LSS_NAME(ptrace_detach)(pid_t pid) { + LSS_INLINE long LSS_NAME(ptrace_detach)(pid_t pid) { /* PTRACE_DETACH can sometimes forget to wake up the tracee and it * then sends job control signals to the real parent, rather than to * the tracer. We reduce the risk of this happening by starting a @@ -4312,7 +5041,8 @@ struct kernel_statfs { * detached. Large multi threaded apps can take a long time in the kernel * processing SIGCONT. */ - int rc, err; + long rc; + int err; LSS_NAME(sched_yield)(); rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0); err = LSS_ERRNO; @@ -4345,7 +5075,7 @@ struct kernel_statfs { LSS_SYSCALL_ARG(c), (uint64_t)(o)); } - LSS_INLINE int LSS_NAME(readahead)(int f, loff_t o, unsigned c) { + LSS_INLINE int LSS_NAME(readahead)(int f, loff_t o, size_t c) { LSS_BODY(3, int, readahead, LSS_SYSCALL_ARG(f), (uint64_t)(o), LSS_SYSCALL_ARG(c)); } @@ -4384,7 +5114,7 @@ struct kernel_statfs { unsigned, o2) LSS_INLINE _syscall5(ssize_t, _pwrite64, int, f, const void *, b, size_t, c, unsigned, o1, - long, o2) + unsigned, o2) LSS_INLINE _syscall4(int, _readahead, int, f, unsigned, o1, unsigned, o2, size_t, c) #endif @@ -4405,9 +5135,9 @@ struct kernel_statfs { return LSS_NAME(_pwrite64)(fd, buf, count, LSS_LLARG_PAD o.arg[0], o.arg[1]); } - LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, int len) { + LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, size_t count) { union { loff_t off; unsigned arg[2]; } o = { off }; - return LSS_NAME(_readahead)(fd, LSS_LLARG_PAD o.arg[0], o.arg[1], len); + return LSS_NAME(_readahead)(fd, LSS_LLARG_PAD o.arg[0], o.arg[1], count); } #endif #endif @@ -4462,10 +5192,79 @@ struct kernel_statfs { } #endif +#if defined(__NR_statx) + /* copy the contents of kernel_statx to the kernel_stat structure. */ + LSS_INLINE void LSS_NAME(cp_stat_statx)(struct kernel_stat *to, + struct kernel_statx *from) { + memset(to, 0, sizeof(struct kernel_stat)); + to->st_dev = (kernel_dev_t)((from->stx_dev_minor & 0xff) | + ((from->stx_dev_major & 0xfff) << 8) | + ((from->stx_dev_minor & ~0xffu) << 12)); + to->st_rdev = (kernel_dev_t)((from->stx_rdev_minor & 0xff) | + ((from->stx_rdev_major & 0xfff) << 8) | + ((from->stx_rdev_minor & ~0xffu) << 12)); + to->st_ino = (kernel_ino_t)from->stx_ino; + to->st_mode = (kernel_mode_t)from->stx_mode; + to->st_nlink = (kernel_nlink_t)from->stx_nlink; + to->st_uid = (kernel_uid_t)from->stx_uid; + to->st_gid = (kernel_gid_t)from->stx_gid; + to->st_atime_ = (kernel_time_t)(from->stx_atime.tv_sec); + to->st_atime_nsec_ = from->stx_atime.tv_nsec; + to->st_mtime_ = (kernel_time_t)(from->stx_mtime.tv_sec); + to->st_mtime_nsec_ = from->stx_mtime.tv_nsec; + to->st_ctime_ = (kernel_time_t)(from->stx_ctime.tv_sec); + to->st_ctime_nsec_ = from->stx_ctime.tv_nsec; + to->st_size = (kernel_off_t)(from->stx_size); + to->st_blocks = (kernel_blkcnt_t)(from->stx_blocks); + to->st_blksize = (kernel_blksize_t)from->stx_blksize; + } +#endif + +#if !defined(__NR_fstat) + LSS_INLINE int LSS_NAME(fstat)(int fd, + struct kernel_stat *buf) { + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(fd, "", buf, AT_EMPTY_PATH); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_EMPTY_PATH; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(fd, "", flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif + } +#endif + #if !defined(__NR_stat) LSS_INLINE int LSS_NAME(stat)(const char *pathname, struct kernel_stat *buf) { - return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, 0); + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, 0); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_STATX_SYNC_AS_STAT; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(AT_FDCWD, pathname, flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif + } +#endif + +#if !defined(__NR_lstat) + LSS_INLINE int LSS_NAME(lstat)(const char *pathname, + struct kernel_stat *buf) { + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, AT_SYMLINK_NOFOLLOW); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(AT_FDCWD, pathname, flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif } #endif @@ -4479,7 +5278,7 @@ struct kernel_statfs { // TODO: define this in an arch-independant way instead of inlining the clone // syscall body. -# if defined(__aarch64__) +# if defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) LSS_INLINE pid_t LSS_NAME(fork)(void) { // No fork syscall on aarch64 - implement by means of the clone syscall. // Note that this does not reset glibc's cached view of the PID/TID, so @@ -4524,6 +5323,7 @@ struct kernel_statfs { #pragma pop_macro("lstat64") #pragma pop_macro("pread64") #pragma pop_macro("pwrite64") +#pragma pop_macro("getdents64") #if defined(__cplusplus) && !defined(SYS_CPLUSPLUS) } diff --git a/shared/sentry/external/third_party/lss/tests/.gitignore b/shared/sentry/src/external/third_party/lss/tests/.gitignore similarity index 100% rename from shared/sentry/external/third_party/lss/tests/.gitignore rename to shared/sentry/src/external/third_party/lss/tests/.gitignore diff --git a/shared/sentry/external/third_party/lss/tests/Makefile b/shared/sentry/src/external/third_party/lss/tests/Makefile similarity index 87% rename from shared/sentry/external/third_party/lss/tests/Makefile rename to shared/sentry/src/external/third_party/lss/tests/Makefile index 5e37345f1..a4e2f3873 100644 --- a/shared/sentry/external/third_party/lss/tests/Makefile +++ b/shared/sentry/src/external/third_party/lss/tests/Makefile @@ -1,4 +1,4 @@ -# Copyright 2018, Google Inc. All rights reserved. +# Copyright 2018 Google LLC # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. -# * Neither the name of Google Inc. nor the names of its +# * Neither the name of Google LLC nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # @@ -41,7 +41,13 @@ LDFLAGS += -static TESTS = \ fallocate \ + getitimer \ + getrandom \ + lstat \ + setitimer \ + sigaction \ sigtimedwait \ + stat \ unlink \ all: check @@ -49,22 +55,31 @@ all: check %_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< +# Force building C as C++ code to improve compile-time coverage. +%_cc_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + %_test: %.cc test_skel.h $(top_srcdir)/linux_syscall_support.h $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< %_run: %_test @t=$(@:_run=_test); \ echo "./$$t"; \ - if ! env -i ./$$t; then \ + env -i ./$$t; \ + exit_status=$$?; \ + if [ $$exit_status = 77 ]; then \ + echo "SKIP: $$t"; \ + elif [ $$exit_status != 0 ]; then \ + echo "FAIL: $$t"; \ env -i strace -f -v ./$$t; \ echo "TRY: gdb -q -ex r -ex bt ./$$t"; \ exit 1; \ fi -ALL_TEST_TARGETS = $(TESTS:=_test) +ALL_TEST_TARGETS = $(TESTS:=_test) $(TESTS:=_cc_test) compile_tests: $(ALL_TEST_TARGETS) -ALL_RUN_TARGETS = $(TESTS:=_run) +ALL_RUN_TARGETS = $(TESTS:=_run) $(TESTS:=_cc_run) check: $(ALL_RUN_TARGETS) # The "tempfile" targets are the names we use with temp files. @@ -105,6 +120,7 @@ cross: "mips64-unknown-linux-gnu-gcc -mabi=n32" \ "s390-ibm-linux-gnu-gcc" \ "s390x-ibm-linux-gnu-gcc" \ + "loongarch64-unknown-linux-gnu-gcc" \ ; do \ cxx=`echo "$$cc" | sed 's:-gcc:-g++:'`; \ $(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \ diff --git a/shared/sentry/external/third_party/lss/tests/README.md b/shared/sentry/src/external/third_party/lss/tests/README.md similarity index 100% rename from shared/sentry/external/third_party/lss/tests/README.md rename to shared/sentry/src/external/third_party/lss/tests/README.md diff --git a/shared/sentry/external/third_party/lss/tests/fallocate.c b/shared/sentry/src/external/third_party/lss/tests/fallocate.c similarity index 95% rename from shared/sentry/external/third_party/lss/tests/fallocate.c rename to shared/sentry/src/external/third_party/lss/tests/fallocate.c index c156e5898..1a26fed55 100644 --- a/shared/sentry/external/third_party/lss/tests/fallocate.c +++ b/shared/sentry/src/external/third_party/lss/tests/fallocate.c @@ -1,4 +1,4 @@ -/* Copyright 2019, Google Inc. All rights reserved. +/* Copyright 2019 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * @@ -63,5 +63,7 @@ int main(int argc, char *argv[]) { #endif assert(st.st_size == offset + len); + sys_unlink(filename); + return 0; } diff --git a/shared/sentry/src/external/third_party/lss/tests/getitimer.c b/shared/sentry/src/external/third_party/lss/tests/getitimer.c new file mode 100644 index 000000000..860538a0f --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/tests/getitimer.c @@ -0,0 +1,84 @@ +/* Copyright 2022 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // We need an invalid timer value. The assert()'s below should + // be static asserts but it is not available in older C versions. +#define kInvalidTimer 9999 + assert(kInvalidTimer != ITIMER_REAL); + assert(kInvalidTimer != ITIMER_VIRTUAL); + assert(kInvalidTimer != ITIMER_PROF); + + // This should fail with EINVAL. + struct kernel_itimerval curr_itimer; + assert(sys_getitimer(kInvalidTimer, &curr_itimer) == -1); + assert(errno == EINVAL); + + // Create a read-only page. + size_t page_size = getpagesize(); + void* read_only_page = sys_mmap(NULL, page_size, PROT_READ, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(read_only_page != MAP_FAILED); + + // This should fail with EFAULT. + assert(sys_getitimer(ITIMER_REAL, + (struct kernel_itimerval*) read_only_page) == -1); + assert(errno == EFAULT); + + // This should complete without an error. + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + + // Set up a real time timer with very long interval and value so that + // we do not need to handle SIGALARM in test. + struct kernel_itimerval new_itimer; + const time_t kIntervalSec = 60 * 60 * 24 * 365; // One year. + const long kIntervalUSec = 123; + new_itimer.it_interval.tv_sec = kIntervalSec; + new_itimer.it_interval.tv_usec = kIntervalUSec; + new_itimer.it_value = new_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0); + + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + assert(kernel_timeval_eq(&curr_itimer.it_interval, &new_itimer.it_interval)); + + // Disable timer. + struct kernel_itimerval empty_itimer; + empty_itimer.it_interval.tv_sec = 0; + empty_itimer.it_interval.tv_usec = 0; + empty_itimer.it_value = empty_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &empty_itimer, NULL) == 0); + + // We should read back an empty itimer. + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + assert(kernel_itimerval_eq(&curr_itimer, &empty_itimer)); + + return 0; +} diff --git a/shared/sentry/src/external/third_party/lss/tests/getrandom.c b/shared/sentry/src/external/third_party/lss/tests/getrandom.c new file mode 100644 index 000000000..0ec38b3c9 --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/tests/getrandom.c @@ -0,0 +1,59 @@ +/* Copyright 2020 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +#define BUFFER_SIZE 256 + +int main(int argc, char *argv[]) { + char buffer[BUFFER_SIZE]; + // Zero it out so we can check later that it's at least not all 0s. + memset(buffer, 0, BUFFER_SIZE); + bool buffer_contains_all_zeros = true; + + // Don't bother passing any flags. (If we're using lss, we might not have the + // right header files with the flags defined anyway, and we'd have to copy + // this in here too, and risk getting out of sync in yet another way.) + const ssize_t r = sys_getrandom(buffer, BUFFER_SIZE, 0); + + // Make sure it either worked, or that it's just not supported. + assert(r == BUFFER_SIZE || errno == ENOSYS); + + if (r == BUFFER_SIZE) { + // If all the bytes are 0, it didn't really work. + for (size_t i = 0; i < BUFFER_SIZE; ++i) { + if (buffer[i] != 0) { + buffer_contains_all_zeros = false; + } + } + assert(!buffer_contains_all_zeros); + } + + return 0; +} diff --git a/shared/sentry/src/external/third_party/lss/tests/lstat.c b/shared/sentry/src/external/third_party/lss/tests/lstat.c new file mode 100644 index 000000000..816ba9faa --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/tests/lstat.c @@ -0,0 +1,97 @@ +/* Copyright 2021 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + int exit_status = 0; + + // Get two unique paths to play with. + char foo[] = "tempfile.XXXXXX"; + char bar[] = "tempfile.XXXXXX"; + int fd_foo = mkstemp(foo); + int fd_bar = mkstemp(bar); + assert(fd_foo != -1); + assert(fd_bar != -1); + + // Then delete foo. + assert(sys_unlink(foo) == 0); + + // Now make foo a symlink to bar. + assert(symlink(bar, foo) == 0); + + // Make sure sys_stat() and sys_lstat() implementation return different + // information. + + // We need to check our stat syscalls for EOVERFLOW, as sometimes the integer + // types used in the stat structures are too small to fit the actual value. + // E.g. on some systems st_ino is 32-bit, but some filesystems have 64-bit + // inodes. + + struct kernel_stat lstat_info; + int rc = sys_lstat(foo, &lstat_info); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + struct kernel_stat stat_info; + rc = sys_stat(foo, &stat_info); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + struct kernel_stat bar_stat_info; + rc = sys_stat(bar, &bar_stat_info); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + // lstat should produce information about a symlink. + assert((lstat_info.st_mode & S_IFMT) == S_IFLNK); + + // stat-ing foo and bar should produce the same inode. + assert(stat_info.st_ino == bar_stat_info.st_ino); + + // lstat-ing foo should give a different inode than stat-ing foo. + assert(stat_info.st_ino != lstat_info.st_ino); + +cleanup: + sys_unlink(foo); + sys_unlink(bar); + return exit_status; +} diff --git a/shared/sentry/src/external/third_party/lss/tests/setitimer.c b/shared/sentry/src/external/third_party/lss/tests/setitimer.c new file mode 100644 index 000000000..dd2ccfe5c --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/tests/setitimer.c @@ -0,0 +1,90 @@ +/* Copyright 2022 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // We need an invalid timer value. The assert()'s below should + // be static asserts but it is not avalible in older C versions. +#define kInvalidTimer 9999 + assert(kInvalidTimer != ITIMER_REAL); + assert(kInvalidTimer != ITIMER_VIRTUAL); + assert(kInvalidTimer != ITIMER_PROF); + + // Invalid timer returns EINVAL. + assert(sys_setitimer(kInvalidTimer, NULL, NULL) == -1); + assert(errno == EINVAL); + + const int kSignal = SIGALRM; + const size_t kSigsetSize = sizeof(struct kernel_sigset_t); + + // Block SIGALRM. + struct kernel_sigset_t sigalarm_only; + struct kernel_sigset_t old_sigset; + assert(sys_sigemptyset(&sigalarm_only) == 0); + assert(sys_sigaddset(&sigalarm_only, kSignal) == 0); + assert(sys_rt_sigprocmask(SIG_BLOCK, &sigalarm_only, &old_sigset, + kSigsetSize) == 0); + + // Set up a real time timer. + struct kernel_itimerval new_itimer = {}; + const long kIntervalUSec = 123; + new_itimer.it_interval.tv_sec = 0; + new_itimer.it_interval.tv_usec = kIntervalUSec; + new_itimer.it_value = new_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0); + + // Wait for alarm. + struct timespec timeout; + const unsigned long kNanoSecsPerSec = 1000000000; + const unsigned long kNanoSecsPerMicroSec = 1000; + + // Use a timeout 3 times of the timer interval. + unsigned long duration_ns = kIntervalUSec * kNanoSecsPerMicroSec * 3; + timeout.tv_sec = duration_ns / kNanoSecsPerSec ; + timeout.tv_nsec = duration_ns % kNanoSecsPerSec; + + int sig; + do { + sig = sys_sigtimedwait(&sigalarm_only, NULL, &timeout); + } while (sig == -1 && errno == EINTR); + assert(sig == kSignal); + + // Disable timer, check saving of old timer value. + struct kernel_itimerval empty_itimer = {}; + struct kernel_itimerval old_itimer; + empty_itimer.it_interval.tv_sec = 0; + empty_itimer.it_interval.tv_usec = 0; + empty_itimer.it_value = empty_itimer.it_interval; + + assert(sys_setitimer(ITIMER_REAL, &empty_itimer, &old_itimer) == 0); + assert(kernel_timeval_eq(&old_itimer.it_interval, &new_itimer.it_interval)); + + return 0; +} diff --git a/shared/sentry/src/external/third_party/lss/tests/sigaction.c b/shared/sentry/src/external/third_party/lss/tests/sigaction.c new file mode 100644 index 000000000..db3658f40 --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/tests/sigaction.c @@ -0,0 +1,54 @@ +/* Copyright 2020 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +void test_handler(int sig) {} + +int main(int argc, char *argv[]) { + const size_t kSigsetSize = sizeof(struct kernel_sigset_t); + struct kernel_sigaction action = {}; + // Invalid signal returns EINVAL. + assert(sys_rt_sigaction(SIGKILL, &action, NULL, kSigsetSize) == -1); + assert(errno == EINVAL); + + // Set an action. + action.sa_handler_ = test_handler; + action.sa_flags = SA_SIGINFO; + assert(sys_sigemptyset(&action.sa_mask) == 0); + assert(sys_sigaddset(&action.sa_mask, SIGPIPE) == 0); + assert(sys_rt_sigaction(SIGSEGV, &action, NULL, kSigsetSize) == 0); + + // Retrieve the action. + struct kernel_sigaction old_action = {}; + assert(sys_rt_sigaction(SIGSEGV, NULL, &old_action, kSigsetSize) == 0); + assert(memcmp(&action, &old_action, sizeof(action)) == 0); + + return 0; +} diff --git a/shared/sentry/external/third_party/lss/tests/sigtimedwait.c b/shared/sentry/src/external/third_party/lss/tests/sigtimedwait.c similarity index 95% rename from shared/sentry/external/third_party/lss/tests/sigtimedwait.c rename to shared/sentry/src/external/third_party/lss/tests/sigtimedwait.c index ee2f740fe..d56d30460 100644 --- a/shared/sentry/external/third_party/lss/tests/sigtimedwait.c +++ b/shared/sentry/src/external/third_party/lss/tests/sigtimedwait.c @@ -1,4 +1,4 @@ -/* Copyright 2019, Google Inc. All rights reserved. +/* Copyright 2019 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/src/external/third_party/lss/tests/stat.c b/shared/sentry/src/external/third_party/lss/tests/stat.c new file mode 100644 index 000000000..5ae66852d --- /dev/null +++ b/shared/sentry/src/external/third_party/lss/tests/stat.c @@ -0,0 +1,67 @@ +/* Copyright 2021 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + int exit_status = 0; + + // Get two unique paths to play with. + char foo[] = "tempfile.XXXXXX"; + int fd_foo = mkstemp(foo); + assert(fd_foo != -1); + + // Make sure it exists. + assert(access(foo, F_OK) == 0); + + // Make sure sys_stat() and a libc stat() implementation return the same + // information. + struct stat libc_stat; + assert(stat(foo, &libc_stat) == 0); + + struct kernel_stat raw_stat; + // We need to check our stat syscall for EOVERFLOW, as sometimes the integer + // types used in the stat structures are too small to fit the actual value. + // E.g. on some systems st_ino is 32-bit, but some filesystems have 64-bit + // inodes. + int rc = sys_stat(foo, &raw_stat); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + assert(libc_stat.st_ino == raw_stat.st_ino); + + +cleanup: + sys_unlink(foo); + return exit_status; +} diff --git a/shared/sentry/external/third_party/lss/tests/test_skel.h b/shared/sentry/src/external/third_party/lss/tests/test_skel.h similarity index 75% rename from shared/sentry/external/third_party/lss/tests/test_skel.h rename to shared/sentry/src/external/third_party/lss/tests/test_skel.h index 9ff0eb371..89077c95d 100644 --- a/shared/sentry/external/third_party/lss/tests/test_skel.h +++ b/shared/sentry/src/external/third_party/lss/tests/test_skel.h @@ -1,4 +1,4 @@ -/* Copyright 2018, Google Inc. All rights reserved. +/* Copyright 2018 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * @@ -44,19 +44,24 @@ #include #include #include +#include #include #include #include +#include #include #include #include #include #include +#include #include #include "linux_syscall_support.h" +#define SKIP_TEST_EXIT_STATUS 77 + void assert_buffers_eq_len(const void *buf1, const void *buf2, size_t len) { const uint8_t *u8_1 = (const uint8_t *)buf1; const uint8_t *u8_2 = (const uint8_t *)buf2; @@ -68,3 +73,17 @@ void assert_buffers_eq_len(const void *buf1, const void *buf2, size_t len) { } } #define assert_buffers_eq(obj1, obj2) assert_buffers_eq_len(obj1, obj2, sizeof(*obj1)) + +// Returns true iff pointed timevals are equal. +static inline bool kernel_timeval_eq(const struct kernel_timeval* lhs, + const struct kernel_timeval* rhs) { + return (lhs->tv_sec == rhs->tv_sec) && (lhs->tv_usec == rhs->tv_usec); +} + +// Returns true iff pointed itimervals are equal. +static inline bool kernel_itimerval_eq(const struct kernel_itimerval* lhs, + const struct kernel_itimerval* rhs) { + return kernel_timeval_eq(&lhs->it_interval, &rhs->it_interval) && + kernel_timeval_eq(&lhs->it_value, &rhs->it_value); +} + diff --git a/shared/sentry/external/third_party/lss/tests/unlink.c b/shared/sentry/src/external/third_party/lss/tests/unlink.c similarity index 94% rename from shared/sentry/external/third_party/lss/tests/unlink.c rename to shared/sentry/src/external/third_party/lss/tests/unlink.c index 70c8bc9a5..191e36792 100644 --- a/shared/sentry/external/third_party/lss/tests/unlink.c +++ b/shared/sentry/src/external/third_party/lss/tests/unlink.c @@ -1,4 +1,4 @@ -/* Copyright 2018, Google Inc. All rights reserved. +/* Copyright 2018 Google LLC * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. - * * Neither the name of Google Inc. nor the names of its + * * Neither the name of Google LLC nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * diff --git a/shared/sentry/fuzzing-examples/macos-event.json b/shared/sentry/src/fuzzing-examples/macos-event.json similarity index 100% rename from shared/sentry/fuzzing-examples/macos-event.json rename to shared/sentry/src/fuzzing-examples/macos-event.json diff --git a/shared/sentry/fuzzing-examples/macos-session.json b/shared/sentry/src/fuzzing-examples/macos-session.json similarity index 100% rename from shared/sentry/fuzzing-examples/macos-session.json rename to shared/sentry/src/fuzzing-examples/macos-session.json diff --git a/shared/sentry/include/sentry.h b/shared/sentry/src/include/sentry.h similarity index 88% rename from shared/sentry/include/sentry.h rename to shared/sentry/src/include/sentry.h index af94c7849..bba0dd0e7 100644 --- a/shared/sentry/include/sentry.h +++ b/shared/sentry/src/include/sentry.h @@ -30,7 +30,7 @@ extern "C" { # define SENTRY_SDK_NAME "sentry.native" # endif #endif -#define SENTRY_SDK_VERSION "0.5.2" +#define SENTRY_SDK_VERSION "0.7.0" #define SENTRY_SDK_USER_AGENT SENTRY_SDK_NAME "/" SENTRY_SDK_VERSION /* common platform detection */ @@ -90,7 +90,7 @@ extern "C" { /* context type dependencies */ #ifdef _WIN32 -# include +# include #else # include #endif @@ -207,6 +207,8 @@ SENTRY_API sentry_value_t sentry_value_new_bool(int value); * Creates a new null terminated string. */ SENTRY_API sentry_value_t sentry_value_new_string(const char *value); +SENTRY_API sentry_value_t sentry_value_new_string_n( + const char *value, size_t value_len); /** * Creates a new list value. @@ -232,10 +234,15 @@ SENTRY_API sentry_value_type_t sentry_value_get_type(sentry_value_t value); SENTRY_API int sentry_value_set_by_key( sentry_value_t value, const char *k, sentry_value_t v); +SENTRY_API int sentry_value_set_by_key_n( + sentry_value_t value, const char *k, size_t k_len, sentry_value_t v); + /** * This removes a value from the map by key. */ SENTRY_API int sentry_value_remove_by_key(sentry_value_t value, const char *k); +SENTRY_API int sentry_value_remove_by_key_n( + sentry_value_t value, const char *k, size_t k_len); /** * Appends a value to a list. @@ -268,6 +275,8 @@ SENTRY_API int sentry_value_remove_by_index(sentry_value_t value, size_t index); */ SENTRY_API sentry_value_t sentry_value_get_by_key( sentry_value_t value, const char *k); +SENTRY_API sentry_value_t sentry_value_get_by_key_n( + sentry_value_t value, const char *k, size_t k_len); /** * Looks up a value in a map by key. If missing a null value is returned. @@ -278,6 +287,8 @@ SENTRY_API sentry_value_t sentry_value_get_by_key( */ SENTRY_API sentry_value_t sentry_value_get_by_key_owned( sentry_value_t value, const char *k); +SENTRY_API sentry_value_t sentry_value_get_by_key_owned_n( + sentry_value_t value, const char *k, size_t k_len); /** * Looks up a value in a list by index. If missing a null value is returned. @@ -365,6 +376,8 @@ SENTRY_API sentry_value_t sentry_value_new_event(void); */ SENTRY_API sentry_value_t sentry_value_new_message_event( sentry_level_t level, const char *logger, const char *text); +SENTRY_API sentry_value_t sentry_value_new_message_event_n(sentry_level_t level, + const char *logger, size_t logger_len, const char *text, size_t text_len); /** * Creates a new Breadcrumb with a specific type and message. @@ -375,6 +388,8 @@ SENTRY_API sentry_value_t sentry_value_new_message_event( */ SENTRY_API sentry_value_t sentry_value_new_breadcrumb( const char *type, const char *message); +SENTRY_API sentry_value_t sentry_value_new_breadcrumb_n( + const char *type, size_t type_len, const char *message, size_t message_len); /** * Creates a new Exception value. @@ -390,6 +405,8 @@ SENTRY_API sentry_value_t sentry_value_new_breadcrumb( */ SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_exception( const char *type, const char *value); +SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_exception_n( + const char *type, size_t type_len, const char *value, size_t value_len); /** * Creates a new Thread value. @@ -403,6 +420,8 @@ SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_exception( */ SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_thread( uint64_t id, const char *name); +SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_thread_n( + uint64_t id, const char *name, size_t name_len); /** * Creates a new Stack Trace conforming to the Stack Trace Interface. @@ -534,6 +553,8 @@ SENTRY_API sentry_uuid_t sentry_uuid_new_v4(void); * Parses a uuid from a string. */ SENTRY_API sentry_uuid_t sentry_uuid_from_string(const char *str); +SENTRY_API sentry_uuid_t sentry_uuid_from_string_n( + const char *str, size_t str_len); /** * Creates a uuid from bytes. @@ -603,6 +624,8 @@ SENTRY_API char *sentry_envelope_serialize( */ SENTRY_API int sentry_envelope_write_to_file( const sentry_envelope_t *envelope, const char *path); +SENTRY_API int sentry_envelope_write_to_file_n( + const sentry_envelope_t *envelope, const char *path, size_t path_len); /** * The Sentry Client Options. @@ -866,6 +889,8 @@ SENTRY_API void sentry_options_set_on_crash( * Sets the DSN. */ SENTRY_API void sentry_options_set_dsn(sentry_options_t *opts, const char *dsn); +SENTRY_API void sentry_options_set_dsn_n( + sentry_options_t *opts, const char *dsn, size_t dsn_len); /** * Gets the DSN. @@ -903,6 +928,8 @@ SENTRY_API double sentry_options_get_sample_rate(const sentry_options_t *opts); */ SENTRY_API void sentry_options_set_release( sentry_options_t *opts, const char *release); +SENTRY_API void sentry_options_set_release_n( + sentry_options_t *opts, const char *release, size_t release_len); /** * Gets the release. @@ -914,6 +941,8 @@ SENTRY_API const char *sentry_options_get_release(const sentry_options_t *opts); */ SENTRY_API void sentry_options_set_environment( sentry_options_t *opts, const char *environment); +SENTRY_API void sentry_options_set_environment_n( + sentry_options_t *opts, const char *environment, size_t environment_len); /** * Gets the environment. @@ -926,6 +955,8 @@ SENTRY_API const char *sentry_options_get_environment( */ SENTRY_API void sentry_options_set_dist( sentry_options_t *opts, const char *dist); +SENTRY_API void sentry_options_set_dist_n( + sentry_options_t *opts, const char *dist, size_t dist_len); /** * Gets the dist. @@ -939,6 +970,8 @@ SENTRY_API const char *sentry_options_get_dist(const sentry_options_t *opts); */ SENTRY_API void sentry_options_set_http_proxy( sentry_options_t *opts, const char *proxy); +SENTRY_API void sentry_options_set_http_proxy_n( + sentry_options_t *opts, const char *proxy, size_t proxy_len); /** * Returns the configured http proxy. @@ -952,6 +985,8 @@ SENTRY_API const char *sentry_options_get_http_proxy( */ SENTRY_API void sentry_options_set_ca_certs( sentry_options_t *opts, const char *path); +SENTRY_API void sentry_options_set_ca_certs_n( + sentry_options_t *opts, const char *path, size_t path_len); /** * Returns the configured path for ca certificates. @@ -964,6 +999,8 @@ SENTRY_API const char *sentry_options_get_ca_certs( */ SENTRY_API void sentry_options_set_transport_thread_name( sentry_options_t *opts, const char *name); +SENTRY_API void sentry_options_set_transport_thread_name_n( + sentry_options_t *opts, const char *name, size_t name_len); /** * Returns the configured http transport thread name. @@ -971,6 +1008,32 @@ SENTRY_API void sentry_options_set_transport_thread_name( SENTRY_API const char *sentry_options_get_transport_thread_name( const sentry_options_t *opts); +/* + * Configures the name of the sentry SDK. Returns 0 on success. + */ +SENTRY_API int sentry_options_set_sdk_name( + sentry_options_t *opts, const char *sdk_name); + +/* + * Configures the name of the sentry SDK. Returns 0 on success. + */ +SENTRY_API int sentry_options_set_sdk_name_n( + sentry_options_t *opts, const char *sdk_name, size_t sdk_name_len); + +/** + * Returns the configured sentry SDK name. Unless overwritten this defaults to + * SENTRY_SDK_NAME. + */ +SENTRY_API const char *sentry_options_get_sdk_name( + const sentry_options_t *opts); + +/** + * Returns the user agent. Unless overwritten this defaults to + * "SENTRY_SDK_NAME / SENTRY_SDK_VERSION". + */ +SENTRY_API const char *sentry_options_get_user_agent( + const sentry_options_t *opts); + /** * Enables or disables debug printing mode. */ @@ -1069,6 +1132,8 @@ SENTRY_API int sentry_options_get_symbolize_stacktraces( */ SENTRY_API void sentry_options_add_attachment( sentry_options_t *opts, const char *path); +SENTRY_API void sentry_options_add_attachment_n( + sentry_options_t *opts, const char *path, size_t path_len); /** * Sets the path to the crashpad handler if the crashpad backend is used. @@ -1086,6 +1151,8 @@ SENTRY_API void sentry_options_add_attachment( */ SENTRY_API void sentry_options_set_handler_path( sentry_options_t *opts, const char *path); +SENTRY_API void sentry_options_set_handler_path_n( + sentry_options_t *opts, const char *path, size_t path_len); /** * Sets the path to the Sentry Database Directory. @@ -1118,6 +1185,8 @@ SENTRY_API void sentry_options_set_handler_path( */ SENTRY_API void sentry_options_set_database_path( sentry_options_t *opts, const char *path); +SENTRY_API void sentry_options_set_database_path_n( + sentry_options_t *opts, const char *path, size_t path_len); #ifdef SENTRY_PLATFORM_WINDOWS /** @@ -1125,18 +1194,24 @@ SENTRY_API void sentry_options_set_database_path( */ SENTRY_API void sentry_options_add_attachmentw( sentry_options_t *opts, const wchar_t *path); +SENTRY_API void sentry_options_add_attachmentw_n( + sentry_options_t *opts, const wchar_t *path, size_t path_len); /** * Wide char version of `sentry_options_set_handler_path`. */ SENTRY_API void sentry_options_set_handler_pathw( sentry_options_t *opts, const wchar_t *path); +SENTRY_API void sentry_options_set_handler_pathw_n( + sentry_options_t *opts, const wchar_t *path, size_t path_len); /** * Wide char version of `sentry_options_set_database_path`. */ SENTRY_API void sentry_options_set_database_pathw( sentry_options_t *opts, const wchar_t *path); +SENTRY_API void sentry_options_set_database_pathw_n( + sentry_options_t *opts, const wchar_t *path, size_t path_len); #endif /** @@ -1192,6 +1267,10 @@ SENTRY_API int sentry_init(sentry_options_t *options); * The `timeout` parameter is in milliseconds. * * Returns 0 on success, or a non-zero return value in case the timeout is hit. + * + * Note that this function will block the thread it was called from until the + * sentry background worker has finished its work or it timed out, whichever + * comes first. */ SENTRY_API int sentry_flush(uint64_t timeout); @@ -1199,6 +1278,14 @@ SENTRY_API int sentry_flush(uint64_t timeout); * Shuts down the sentry client and forces transports to flush out. * * Returns 0 on success. + * + * Note that this does not uninstall any crash handler installed by our + * backends, which will still process crashes after `sentry_close()`, except + * when using `crashpad` on Linux or the `inproc` backend. + * + * Further note that this function will block the thread it was called from + * until the sentry background worker has finished its work or it timed out, + * whichever comes first. */ SENTRY_API int sentry_close(void); @@ -1297,31 +1384,40 @@ SENTRY_API void sentry_remove_user(void); * Sets a tag. */ SENTRY_API void sentry_set_tag(const char *key, const char *value); +SENTRY_API void sentry_set_tag_n( + const char *key, size_t key_len, const char *value, size_t value_len); /** * Removes the tag with the specified key. */ SENTRY_API void sentry_remove_tag(const char *key); +SENTRY_API void sentry_remove_tag_n(const char *key, size_t key_len); /** * Sets extra information. */ SENTRY_API void sentry_set_extra(const char *key, sentry_value_t value); +SENTRY_API void sentry_set_extra_n( + const char *key, size_t key_len, sentry_value_t value); /** * Removes the extra with the specified key. */ SENTRY_API void sentry_remove_extra(const char *key); +SENTRY_API void sentry_remove_extra_n(const char *key, size_t key_len); /** * Sets a context object. */ SENTRY_API void sentry_set_context(const char *key, sentry_value_t value); +SENTRY_API void sentry_set_context_n( + const char *key, size_t key_len, sentry_value_t value); /** * Removes the context object with the specified key. */ SENTRY_API void sentry_remove_context(const char *key); +SENTRY_API void sentry_remove_context_n(const char *key, size_t key_len); /** * Sets the event fingerprint. @@ -1330,6 +1426,8 @@ SENTRY_API void sentry_remove_context(const char *key); * trailing `NULL`. */ SENTRY_API void sentry_set_fingerprint(const char *fingerprint, ...); +SENTRY_API void sentry_set_fingerprint_n( + const char *fingerprint, size_t fingerprint_len, ...); /** * Removes the fingerprint. @@ -1340,22 +1438,14 @@ SENTRY_API void sentry_remove_fingerprint(void); * Sets the transaction. */ SENTRY_API void sentry_set_transaction(const char *transaction); +SENTRY_API void sentry_set_transaction_n( + const char *transaction, size_t transaction_len); /** * Sets the event level. */ SENTRY_API void sentry_set_level(sentry_level_t level); -/** - * Starts a new session. - */ -SENTRY_API void sentry_start_session(void); - -/** - * Ends a session. - */ -SENTRY_API void sentry_end_session(void); - /** * Sets the maximum number of spans that can be attached to a * transaction. @@ -1384,6 +1474,31 @@ SENTRY_EXPERIMENTAL_API void sentry_options_set_traces_sample_rate( SENTRY_EXPERIMENTAL_API double sentry_options_get_traces_sample_rate( sentry_options_t *opts); +/* -- Session APIs -- */ + +typedef enum { + SENTRY_SESSION_STATUS_OK, + SENTRY_SESSION_STATUS_CRASHED, + SENTRY_SESSION_STATUS_ABNORMAL, + SENTRY_SESSION_STATUS_EXITED, +} sentry_session_status_t; + +/** + * Starts a new session. + */ +SENTRY_API void sentry_start_session(void); + +/** + * Ends a session. + */ +SENTRY_API void sentry_end_session(void); + +/** + * Ends a session with an explicit `status` code. + */ +SENTRY_EXPERIMENTAL_API void sentry_end_session_with_status( + sentry_session_status_t status); + /* -- Performance Monitoring/Tracing APIs -- */ /** @@ -1433,6 +1548,9 @@ typedef struct sentry_span_s sentry_span_t; */ SENTRY_EXPERIMENTAL_API sentry_transaction_context_t * sentry_transaction_context_new(const char *name, const char *operation); +SENTRY_EXPERIMENTAL_API sentry_transaction_context_t * +sentry_transaction_context_new_n(const char *name, size_t name_len, + const char *operation, size_t operation_len); /** * Sets the `name` on a Transaction Context, which will be used in the @@ -1443,6 +1561,8 @@ sentry_transaction_context_new(const char *name, const char *operation); */ SENTRY_EXPERIMENTAL_API void sentry_transaction_context_set_name( sentry_transaction_context_t *tx_cxt, const char *name); +SENTRY_EXPERIMENTAL_API void sentry_transaction_context_set_name_n( + sentry_transaction_context_t *tx_cxt, const char *name, size_t name_len); /** * Sets the `operation` on a Transaction Context, which will be used in the @@ -1456,6 +1576,9 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_context_set_name( */ SENTRY_EXPERIMENTAL_API void sentry_transaction_context_set_operation( sentry_transaction_context_t *tx_cxt, const char *operation); +SENTRY_EXPERIMENTAL_API void sentry_transaction_context_set_operation_n( + sentry_transaction_context_t *tx_cxt, const char *operation, + size_t operation_len); /** * Sets the `sampled` field on a Transaction Context, which will be used in the @@ -1493,6 +1616,9 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_context_remove_sampled( */ SENTRY_EXPERIMENTAL_API void sentry_transaction_context_update_from_header( sentry_transaction_context_t *tx_cxt, const char *key, const char *value); +SENTRY_EXPERIMENTAL_API void sentry_transaction_context_update_from_header_n( + sentry_transaction_context_t *tx_cxt, const char *key, size_t key_len, + const char *value, size_t value_len); /** * Starts a new Transaction based on the provided context, restored from an @@ -1603,7 +1729,11 @@ SENTRY_EXPERIMENTAL_API void sentry_set_span(sentry_span_t *span); * in a thread-safe way. */ SENTRY_EXPERIMENTAL_API sentry_span_t *sentry_transaction_start_child( - sentry_transaction_t *parent, char *operation, char *description); + sentry_transaction_t *parent, const char *operation, + const char *description); +SENTRY_EXPERIMENTAL_API sentry_span_t *sentry_transaction_start_child_n( + sentry_transaction_t *parent, const char *operation, size_t operation_len, + const char *description, size_t description_len); /** * Starts a new Span. @@ -1636,7 +1766,10 @@ SENTRY_EXPERIMENTAL_API sentry_span_t *sentry_transaction_start_child( * in a thread-safe way. */ SENTRY_EXPERIMENTAL_API sentry_span_t *sentry_span_start_child( - sentry_span_t *parent, char *operation, char *description); + sentry_span_t *parent, const char *operation, const char *description); +SENTRY_EXPERIMENTAL_API sentry_span_t *sentry_span_start_child_n( + sentry_span_t *parent, const char *operation, size_t operation_len, + const char *description, size_t description_len); /** * Finishes a Span. @@ -1660,6 +1793,9 @@ SENTRY_EXPERIMENTAL_API void sentry_span_finish(sentry_span_t *span); */ SENTRY_EXPERIMENTAL_API void sentry_transaction_set_tag( sentry_transaction_t *transaction, const char *tag, const char *value); +SENTRY_EXPERIMENTAL_API void sentry_transaction_set_tag_n( + sentry_transaction_t *transaction, const char *tag, size_t tag_len, + const char *value, size_t value_len); /** * Removes a tag from a Transaction. @@ -1669,6 +1805,8 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_set_tag( */ SENTRY_EXPERIMENTAL_API void sentry_transaction_remove_tag( sentry_transaction_t *transaction, const char *tag); +SENTRY_EXPERIMENTAL_API void sentry_transaction_remove_tag_n( + sentry_transaction_t *transaction, const char *tag, size_t tag_len); /** * Sets the given key in a Transaction's "data" section to the given value. @@ -1678,6 +1816,9 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_remove_tag( */ SENTRY_EXPERIMENTAL_API void sentry_transaction_set_data( sentry_transaction_t *transaction, const char *key, sentry_value_t value); +SENTRY_EXPERIMENTAL_API void sentry_transaction_set_data_n( + sentry_transaction_t *transaction, const char *key, size_t key_len, + sentry_value_t value); /** * Removes a key from a Transaction's "data" section. @@ -1687,6 +1828,8 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_set_data( */ SENTRY_EXPERIMENTAL_API void sentry_transaction_remove_data( sentry_transaction_t *transaction, const char *key); +SENTRY_EXPERIMENTAL_API void sentry_transaction_remove_data_n( + sentry_transaction_t *transaction, const char *key, size_t key_len); /** * Sets a tag on a Span to the given string value. @@ -1698,6 +1841,8 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_remove_data( */ SENTRY_EXPERIMENTAL_API void sentry_span_set_tag( sentry_span_t *span, const char *tag, const char *value); +SENTRY_EXPERIMENTAL_API void sentry_span_set_tag_n(sentry_span_t *span, + const char *tag, size_t tag_len, const char *value, size_t value_len); /** * Removes a tag from a Span. @@ -1707,6 +1852,8 @@ SENTRY_EXPERIMENTAL_API void sentry_span_set_tag( */ SENTRY_EXPERIMENTAL_API void sentry_span_remove_tag( sentry_span_t *span, const char *tag); +SENTRY_EXPERIMENTAL_API void sentry_span_remove_tag_n( + sentry_span_t *span, const char *tag, size_t tag_len); /** * Sets the given key in a Span's "data" section to the given value. @@ -1716,6 +1863,8 @@ SENTRY_EXPERIMENTAL_API void sentry_span_remove_tag( */ SENTRY_EXPERIMENTAL_API void sentry_span_set_data( sentry_span_t *span, const char *key, sentry_value_t value); +SENTRY_EXPERIMENTAL_API void sentry_span_set_data_n( + sentry_span_t *span, const char *key, size_t key_len, sentry_value_t value); /** * Removes a key from a Span's "data" section. @@ -1725,6 +1874,8 @@ SENTRY_EXPERIMENTAL_API void sentry_span_set_data( */ SENTRY_EXPERIMENTAL_API void sentry_span_remove_data( sentry_span_t *span, const char *key); +SENTRY_EXPERIMENTAL_API void sentry_span_remove_data_n( + sentry_span_t *span, const char *key, size_t key_len); /** * Sets a Transaction's name. @@ -1734,6 +1885,8 @@ SENTRY_EXPERIMENTAL_API void sentry_span_remove_data( */ SENTRY_EXPERIMENTAL_API void sentry_transaction_set_name( sentry_transaction_t *transaction, const char *name); +SENTRY_EXPERIMENTAL_API void sentry_transaction_set_name_n( + sentry_transaction_t *transaction, const char *name, size_t name_len); /** * The status of a Span or Transaction. @@ -1846,7 +1999,7 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_iter_headers( * 0 = no crash recognized * -1 = sentry_init() hasn't been called yet */ -SENTRY_EXPERIMENTAL_API int sentry_get_crashed_last_run(); +SENTRY_EXPERIMENTAL_API int sentry_get_crashed_last_run(void); /** * Clear the status of the "crashed-last-run". You should explicitly call @@ -1860,22 +2013,24 @@ SENTRY_EXPERIMENTAL_API int sentry_get_crashed_last_run(); * * Returns 0 on success, 1 on error. */ -SENTRY_EXPERIMENTAL_API int sentry_clear_crashed_last_run(); +SENTRY_EXPERIMENTAL_API int sentry_clear_crashed_last_run(void); /** * Sentry SDK version. */ -SENTRY_EXPERIMENTAL_API const char *sentry_sdk_version(); +SENTRY_EXPERIMENTAL_API const char *sentry_sdk_version(void); /** - * Sentry SDK name. + * Sentry SDK name set during build time. + * Deprecated: Please use sentry_options_get_sdk_name instead. */ -SENTRY_EXPERIMENTAL_API const char *sentry_sdk_name(); +SENTRY_EXPERIMENTAL_API const char *sentry_sdk_name(void); /** - * Sentry SDK User-Agent. + * Sentry SDK User-Agent set during build time. + * Deprecated: Please use sentry_options_get_user_agent instead. */ -SENTRY_EXPERIMENTAL_API const char *sentry_sdk_user_agent(); +SENTRY_EXPERIMENTAL_API const char *sentry_sdk_user_agent(void); #ifdef __cplusplus } diff --git a/shared/sentry/src/sentry-config.cmake.in b/shared/sentry/src/sentry-config.cmake.in new file mode 100644 index 000000000..70ce7d3c5 --- /dev/null +++ b/shared/sentry/src/sentry-config.cmake.in @@ -0,0 +1,33 @@ +@PACKAGE_INIT@ + +set(SENTRY_BACKEND @SENTRY_BACKEND@) +set(SENTRY_TRANSPORT @SENTRY_TRANSPORT@) +set(SENTRY_BUILD_SHARED_LIBS @SENTRY_BUILD_SHARED_LIBS@) +set(SENTRY_LINK_PTHREAD @SENTRY_LINK_PTHREAD@) + +if(SENTRY_BACKEND STREQUAL "crashpad" AND NOT SENTRY_BUILD_SHARED_LIBS) + include("${CMAKE_CURRENT_LIST_DIR}/sentry_crashpad-targets.cmake") + if(NOT MSVC AND NOT SENTRY_BUILD_SHARED_LIBS) + find_package(ZLIB REQUIRED) + endif() +endif() + +if(SENTRY_BACKEND STREQUAL "breakpad" AND NOT SENTRY_BUILD_SHARED_LIBS) + set(SENTRY_BREAKPAD_SYSTEM @SENTRY_BREAKPAD_SYSTEM@) + if(SENTRY_BREAKPAD_SYSTEM) + find_package(PkgConfig REQUIRED) + pkg_check_modules(BREAKPAD REQUIRED IMPORTED_TARGET breakpad-client) + endif() +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/sentry-targets.cmake") + +if(SENTRY_TRANSPORT STREQUAL "curl" AND (NOT @BUILD_SHARED_LIBS@ OR NOT SENTRY_BUILD_SHARED_LIBS)) + find_package(CURL REQUIRED) + set_property(TARGET sentry::sentry APPEND + PROPERTY INTERFACE_LINK_LIBRARIES ${CURL_LIBRARIES}) +endif() + +if(SENTRY_LINK_PTHREAD AND NOT SENTRY_BUILD_SHARED_LIBS) + find_package(Threads REQUIRED) +endif() diff --git a/shared/sentry/src/src/CMakeLists.txt b/shared/sentry/src/src/CMakeLists.txt new file mode 100644 index 000000000..1a7ba5949 --- /dev/null +++ b/shared/sentry/src/src/CMakeLists.txt @@ -0,0 +1,156 @@ +sentry_target_sources_cwd(sentry + sentry_alloc.c + sentry_alloc.h + sentry_backend.c + sentry_backend.h + sentry_boot.h + sentry_core.c + sentry_core.h + sentry_database.c + sentry_database.h + sentry_envelope.c + sentry_envelope.h + sentry_info.c + sentry_json.c + sentry_json.h + sentry_logger.c + sentry_logger.h + sentry_options.c + sentry_options.h + sentry_os.c + sentry_os.h + sentry_path.h + sentry_random.c + sentry_random.h + sentry_ratelimiter.c + sentry_ratelimiter.h + sentry_scope.c + sentry_scope.h + sentry_session.c + sentry_session.h + sentry_slice.c + sentry_slice.h + sentry_string.c + sentry_string.h + sentry_symbolizer.h + sentry_sync.c + sentry_sync.h + sentry_transport.c + sentry_transport.h + sentry_utils.c + sentry_utils.h + sentry_uuid.c + sentry_uuid.h + sentry_value.c + sentry_value.h + sentry_tracing.c + sentry_tracing.h + path/sentry_path.c + transports/sentry_disk_transport.c + transports/sentry_disk_transport.h + transports/sentry_function_transport.c + unwinder/sentry_unwinder.c +) + +# generic platform / path / symbolizer +if(WIN32) + sentry_target_sources_cwd(sentry + sentry_windows_dbghelp.c + sentry_windows_dbghelp.h + path/sentry_path_windows.c + symbolizer/sentry_symbolizer_windows.c + ) +else() + sentry_target_sources_cwd(sentry + sentry_unix_pageallocator.c + sentry_unix_pageallocator.h + sentry_unix_spinlock.h + path/sentry_path_unix.c + symbolizer/sentry_symbolizer_unix.c + ) +endif() + +# module finder +if(WIN32) + sentry_target_sources_cwd(sentry + modulefinder/sentry_modulefinder_windows.c + ) +elseif(APPLE) + sentry_target_sources_cwd(sentry + modulefinder/sentry_modulefinder_apple.c + ) +elseif(LINUX OR ANDROID) + sentry_target_sources_cwd(sentry + modulefinder/sentry_modulefinder_linux.c + ) +elseif(AIX) + sentry_target_sources_cwd(sentry + modulefinder/sentry_modulefinder_aix.c + ) +endif() + +# transport +if(SENTRY_TRANSPORT_CURL) + sentry_target_sources_cwd(sentry + transports/sentry_transport_curl.c + ) +elseif(SENTRY_TRANSPORT_WINHTTP) + sentry_target_sources_cwd(sentry + transports/sentry_transport_winhttp.c + ) +elseif(SENTRY_TRANSPORT_NONE) + sentry_target_sources_cwd(sentry + transports/sentry_transport_none.c + ) +endif() + +# backends +if(SENTRY_BACKEND_CRASHPAD) + target_compile_definitions(sentry PRIVATE SENTRY_BACKEND_CRASHPAD) + sentry_target_sources_cwd(sentry + backends/sentry_backend_crashpad.cpp + ) +elseif(SENTRY_BACKEND_BREAKPAD) + target_compile_definitions(sentry PRIVATE SENTRY_BACKEND_BREAKPAD) + sentry_target_sources_cwd(sentry + backends/sentry_backend_breakpad.cpp + ) +elseif(SENTRY_BACKEND_INPROC) + target_compile_definitions(sentry PRIVATE SENTRY_BACKEND_INPROC) + sentry_target_sources_cwd(sentry + backends/sentry_backend_inproc.c + ) +elseif(SENTRY_BACKEND_NONE) + sentry_target_sources_cwd(sentry + backends/sentry_backend_none.c + ) +endif() + +# unwinder +if(SENTRY_WITH_LIBBACKTRACE) + target_compile_definitions(sentry PRIVATE SENTRY_WITH_UNWINDER_LIBBACKTRACE) + sentry_target_sources_cwd(sentry + unwinder/sentry_unwinder_libbacktrace.c + ) +endif() +if(SENTRY_WITH_LIBUNWINDSTACK) + target_compile_definitions(sentry PRIVATE SENTRY_WITH_UNWINDER_LIBUNWINDSTACK) + sentry_target_sources_cwd(sentry + unwinder/sentry_unwinder_libunwindstack.cpp + ) +endif() +if(WIN32) + target_compile_definitions(sentry PRIVATE SENTRY_WITH_UNWINDER_DBGHELP) + sentry_target_sources_cwd(sentry + unwinder/sentry_unwinder_dbghelp.c + ) +endif() + +# integrations +if(SENTRY_INTEGRATION_QT) + target_compile_definitions(sentry PRIVATE SENTRY_INTEGRATION_QT) + sentry_target_sources_cwd(sentry + integrations/sentry_integration_qt.cpp + integrations/sentry_integration_qt.h + ) +endif() diff --git a/shared/sentry/src/backends/sentry_backend_breakpad.cpp b/shared/sentry/src/src/backends/sentry_backend_breakpad.cpp similarity index 98% rename from shared/sentry/src/backends/sentry_backend_breakpad.cpp rename to shared/sentry/src/src/backends/sentry_backend_breakpad.cpp index 1c22e43e9..40dc6a189 100644 --- a/shared/sentry/src/backends/sentry_backend_breakpad.cpp +++ b/shared/sentry/src/src/backends/sentry_backend_breakpad.cpp @@ -92,6 +92,8 @@ sentry__breakpad_backend_callback( dump_path = sentry__path_new(descriptor.path()); #endif sentry_value_t event = sentry_value_new_event(); + sentry_value_set_by_key( + event, "level", sentry__value_new_level(SENTRY_LEVEL_FATAL)); SENTRY_WITH_OPTIONS (options) { sentry__write_crash_marker(options); @@ -116,9 +118,6 @@ sentry__breakpad_backend_callback( if (should_handle) { sentry_envelope_t *envelope = sentry__prepare_event( options, event, nullptr, !options->on_crash_func); - // the event we just prepared is empty, - // so no error is recorded for it - sentry__record_errors_on_current_session(1); sentry_session_t *session = sentry__end_current_session_with_status( SENTRY_SESSION_STATUS_CRASHED); sentry__envelope_add_session(envelope, session); diff --git a/shared/sentry/src/backends/sentry_backend_crashpad.cpp b/shared/sentry/src/src/backends/sentry_backend_crashpad.cpp similarity index 77% rename from shared/sentry/src/backends/sentry_backend_crashpad.cpp rename to shared/sentry/src/src/backends/sentry_backend_crashpad.cpp index f9f57fc3e..96d961657 100644 --- a/shared/sentry/src/backends/sentry_backend_crashpad.cpp +++ b/shared/sentry/src/src/backends/sentry_backend_crashpad.cpp @@ -33,7 +33,7 @@ extern "C" { #include "client/crashpad_info.h" #include "client/prune_crash_reports.h" #include "client/settings.h" -#if defined(_MSC_VER) +#if defined(_WIN32) # include "util/win/termination_codes.h" #endif @@ -43,6 +43,14 @@ extern "C" { # pragma warning(pop) #endif +template +static void +safe_delete(T *&ptr) +{ + delete ptr; + ptr = nullptr; +} + extern "C" { #ifdef SENTRY_PLATFORM_LINUX @@ -74,16 +82,28 @@ constexpr int g_CrashSignals[] = { typedef struct { crashpad::CrashReportDatabase *db; + crashpad::CrashpadClient *client; sentry_path_t *event_path; sentry_path_t *breadcrumb1_path; sentry_path_t *breadcrumb2_path; size_t num_breadcrumbs; + sentry_value_t crash_event; } crashpad_state_t; +/** + * Correctly destruct C++ members of the crashpad state. + */ +static void +crashpad_state_dtor(crashpad_state_t *state) +{ + safe_delete(state->client); + safe_delete(state->db); +} + static void -sentry__crashpad_backend_user_consent_changed(sentry_backend_t *backend) +crashpad_backend_user_consent_changed(sentry_backend_t *backend) { - crashpad_state_t *data = (crashpad_state_t *)backend->data; + auto *data = static_cast(backend->data); if (!data->db || !data->db->GetSettings()) { return; } @@ -91,18 +111,28 @@ sentry__crashpad_backend_user_consent_changed(sentry_backend_t *backend) } static void -sentry__crashpad_backend_flush_scope( +crashpad_backend_flush_scope( sentry_backend_t *backend, const sentry_options_t *options) { - const crashpad_state_t *data = (crashpad_state_t *)backend->data; + auto *data = static_cast(backend->data); if (!data->event_path) { return; } // This here is an empty object that we copy the scope into. // Even though the API is specific to `event`, an `event` has a few default - // properties that we do not want here. - sentry_value_t event = sentry_value_new_object(); + // properties that we do not want here. But in case of a crash we use the + // crash-event filled in the crash-handler and on_crash/before_send + // respectively. + sentry_value_t event = data->crash_event; + if (sentry_value_is_null(event)) { + event = sentry_value_new_object(); + // FIXME: This should be handled in the FirstChanceHandler but that does + // not exist for macOS just yet. + sentry_value_set_by_key( + event, "level", sentry__value_new_level(SENTRY_LEVEL_FATAL)); + } + SENTRY_WITH_SCOPE (scope) { // we want the scope without any modules or breadcrumbs sentry__scope_apply_to_event(scope, options, event, SENTRY_SCOPE_NONE); @@ -138,9 +168,13 @@ sentry__crashpad_handler(int signum, siginfo_t *info, ucontext_t *user_context) SENTRY_DEBUG("flushing session and queue before crashpad handler"); bool should_dump = true; - sentry_value_t event = sentry_value_new_event(); SENTRY_WITH_OPTIONS (options) { + auto *data = static_cast(options->backend->data); + sentry_value_decref(data->crash_event); + data->crash_event = sentry_value_new_event(); + sentry_value_set_by_key(data->crash_event, "level", + sentry__value_new_level(SENTRY_LEVEL_FATAL)); if (options->on_crash_func) { sentry_ucontext_t uctx; @@ -153,17 +187,18 @@ sentry__crashpad_handler(int signum, siginfo_t *info, ucontext_t *user_context) # endif SENTRY_TRACE("invoking `on_crash` hook"); - event - = options->on_crash_func(&uctx, event, options->on_crash_data); + data->crash_event = options->on_crash_func( + &uctx, data->crash_event, options->on_crash_data); } else if (options->before_send_func) { SENTRY_TRACE("invoking `before_send` hook"); - event = options->before_send_func( - event, nullptr, options->before_send_data); + data->crash_event = options->before_send_func( + data->crash_event, nullptr, options->before_send_data); } - should_dump = !sentry_value_is_null(event); - sentry_value_decref(event); + should_dump = !sentry_value_is_null(data->crash_event); if (should_dump) { + crashpad_backend_flush_scope(options->backend, options); + sentry__write_crash_marker(options); sentry__record_errors_on_current_session(1); @@ -231,10 +266,10 @@ sentry__crashpad_handler(int signum, siginfo_t *info, ucontext_t *user_context) #endif static int -sentry__crashpad_backend_startup( +crashpad_backend_startup( sentry_backend_t *backend, const sentry_options_t *options) { - sentry_path_t *owned_handler_path = NULL; + sentry_path_t *owned_handler_path = nullptr; sentry_path_t *handler_path = options->handler_path; if (!handler_path) { sentry_path_t *current_exe = sentry__path_current_exe(); @@ -272,7 +307,7 @@ sentry__crashpad_backend_startup( "\"%" SENTRY_PATH_PRI "\"", absolute_handler_path->path); sentry_path_t *current_run_folder = options->run->run_path; - crashpad_state_t *data = (crashpad_state_t *)backend->data; + auto *data = static_cast(backend->data); base::FilePath database(options->database_path->path); base::FilePath handler(absolute_handler_path->path); @@ -283,7 +318,7 @@ sentry__crashpad_backend_startup( // register attachments for (sentry_attachment_t *attachment = options->attachments; attachment; attachment = attachment->next) { - attachments.push_back(base::FilePath(attachment->path->path)); + attachments.emplace_back(attachment->path->path); } // and add the serialized event, and two rotating breadcrumb files @@ -299,25 +334,34 @@ sentry__crashpad_backend_startup( sentry__path_touch(data->breadcrumb1_path); sentry__path_touch(data->breadcrumb2_path); - attachments.push_back(base::FilePath(data->event_path->path)); - attachments.push_back(base::FilePath(data->breadcrumb1_path->path)); - attachments.push_back(base::FilePath(data->breadcrumb2_path->path)); + attachments.insert(attachments.end(), + { base::FilePath(data->event_path->path), + base::FilePath(data->breadcrumb1_path->path), + base::FilePath(data->breadcrumb2_path->path) }); - std::vector arguments; - arguments.push_back("--no-rate-limit"); + std::vector arguments { "--no-rate-limit" }; // Initialize database first, flushing the consent later on as part of // `sentry_init` will persist the upload flag. data->db = crashpad::CrashReportDatabase::Initialize(database).release(); - - crashpad::CrashpadClient client; - char *minidump_url = sentry__dsn_get_minidump_url(options->dsn); - SENTRY_TRACEF("using minidump url \"%s\"", minidump_url); - std::string url = minidump_url ? std::string(minidump_url) : std::string(); - sentry_free(minidump_url); - bool success = client.StartHandler(handler, database, database, url, - annotations, arguments, /* restartable */ true, - /* asynchronous_start */ false, attachments); + data->client = new crashpad::CrashpadClient; + bool success; + char *minidump_url + = sentry__dsn_get_minidump_url(options->dsn, options->user_agent); + if (minidump_url) { + SENTRY_TRACEF("using minidump URL \"%s\"", minidump_url); + success = data->client->StartHandler(handler, database, database, + minidump_url, options->http_proxy ? options->http_proxy : "", + annotations, arguments, + /* restartable */ true, + /* asynchronous_start */ false, attachments); + sentry_free(minidump_url); + } else { + SENTRY_WARN( + "failed to construct minidump URL (check DSN or user-agent)"); + crashpad_state_dtor(data); + return 1; + } #ifdef CRASHPAD_WER_ENABLED sentry_path_t *handler_dir = sentry__path_dir(absolute_handler_path); @@ -342,7 +386,7 @@ sentry__crashpad_backend_startup( SENTRY_WARN("registering crashpad WER handler in registry failed"); } else { std::wstring wer_path_string(wer_path->path); - if (!client.RegisterWerModule(wer_path_string)) { + if (!data->client->RegisterWerModule(wer_path_string)) { SENTRY_WARN("registering crashpad WER handler module failed"); } } @@ -360,8 +404,7 @@ sentry__crashpad_backend_startup( } else { SENTRY_WARN("failed to start crashpad client handler"); // not calling `shutdown` - delete data->db; - data->db = nullptr; + crashpad_state_dtor(data); return 1; } @@ -394,7 +437,7 @@ sentry__crashpad_backend_startup( } static void -sentry__crashpad_backend_shutdown(sentry_backend_t *backend) +crashpad_backend_shutdown(sentry_backend_t *backend) { #ifdef SENTRY_PLATFORM_LINUX // restore signal handlers to their default state @@ -405,9 +448,7 @@ sentry__crashpad_backend_shutdown(sentry_backend_t *backend) } #endif - crashpad_state_t *data = (crashpad_state_t *)backend->data; - delete data->db; - data->db = nullptr; + crashpad_state_dtor(static_cast(backend->data)); #ifdef SENTRY_PLATFORM_LINUX g_signal_stack.ss_flags = SS_DISABLE; @@ -418,10 +459,10 @@ sentry__crashpad_backend_shutdown(sentry_backend_t *backend) } static void -sentry__crashpad_backend_add_breadcrumb(sentry_backend_t *backend, +crashpad_backend_add_breadcrumb(sentry_backend_t *backend, sentry_value_t breadcrumb, const sentry_options_t *options) { - crashpad_state_t *data = (crashpad_state_t *)backend->data; + auto *data = static_cast(backend->data); size_t max_breadcrumbs = options->max_breadcrumbs; if (!max_breadcrumbs) { @@ -456,17 +497,18 @@ sentry__crashpad_backend_add_breadcrumb(sentry_backend_t *backend, } static void -sentry__crashpad_backend_free(sentry_backend_t *backend) +crashpad_backend_free(sentry_backend_t *backend) { - crashpad_state_t *data = (crashpad_state_t *)backend->data; + auto *data = static_cast(backend->data); sentry__path_free(data->event_path); sentry__path_free(data->breadcrumb1_path); sentry__path_free(data->breadcrumb2_path); + sentry_value_decref(data->crash_event); sentry_free(data); } static void -sentry__crashpad_backend_except( +crashpad_backend_except( sentry_backend_t *UNUSED(backend), const sentry_ucontext_t *context) { #ifdef SENTRY_PLATFORM_WINDOWS @@ -485,7 +527,7 @@ report_crash_time( { // we do a `+ 1` here, because crashpad timestamps are second resolution, // but our sessions are ms resolution. at least in our integration tests, we - // can have a session that starts at, eg. `0.471`, whereas the crashpad + // can have a session that starts at, e.g. `0.471`, whereas the crashpad // report will be `0`, which would mean our heuristic does not trigger due // to rounding. uint64_t time = ((uint64_t)report.creation_time + 1) * 1000; @@ -495,9 +537,9 @@ report_crash_time( } static uint64_t -sentry__crashpad_backend_last_crash(sentry_backend_t *backend) +crashpad_backend_last_crash(sentry_backend_t *backend) { - crashpad_state_t *data = (crashpad_state_t *)backend->data; + auto *data = static_cast(backend->data); uint64_t crash_time = 0; @@ -513,9 +555,9 @@ sentry__crashpad_backend_last_crash(sentry_backend_t *backend) } static void -sentry__crashpad_backend_prune_database(sentry_backend_t *backend) +crashpad_backend_prune_database(sentry_backend_t *backend) { - crashpad_state_t *data = (crashpad_state_t *)backend->data; + auto *data = static_cast(backend->data); // We want to eagerly clean up reports older than 2 days, and limit the // complete database to a maximum of 8M. That might still be a lot for @@ -531,29 +573,29 @@ sentry__crashpad_backend_prune_database(sentry_backend_t *backend) sentry_backend_t * sentry__backend_new(void) { - sentry_backend_t *backend = SENTRY_MAKE(sentry_backend_t); + auto *backend = SENTRY_MAKE(sentry_backend_t); if (!backend) { - return NULL; + return nullptr; } memset(backend, 0, sizeof(sentry_backend_t)); - crashpad_state_t *data = SENTRY_MAKE(crashpad_state_t); + auto *data = SENTRY_MAKE(crashpad_state_t); if (!data) { sentry_free(backend); - return NULL; + return nullptr; } memset(data, 0, sizeof(crashpad_state_t)); - - backend->startup_func = sentry__crashpad_backend_startup; - backend->shutdown_func = sentry__crashpad_backend_shutdown; - backend->except_func = sentry__crashpad_backend_except; - backend->free_func = sentry__crashpad_backend_free; - backend->flush_scope_func = sentry__crashpad_backend_flush_scope; - backend->add_breadcrumb_func = sentry__crashpad_backend_add_breadcrumb; - backend->user_consent_changed_func - = sentry__crashpad_backend_user_consent_changed; - backend->get_last_crash_func = sentry__crashpad_backend_last_crash; - backend->prune_database_func = sentry__crashpad_backend_prune_database; + data->crash_event = sentry_value_new_null(); + + backend->startup_func = crashpad_backend_startup; + backend->shutdown_func = crashpad_backend_shutdown; + backend->except_func = crashpad_backend_except; + backend->free_func = crashpad_backend_free; + backend->flush_scope_func = crashpad_backend_flush_scope; + backend->add_breadcrumb_func = crashpad_backend_add_breadcrumb; + backend->user_consent_changed_func = crashpad_backend_user_consent_changed; + backend->get_last_crash_func = crashpad_backend_last_crash; + backend->prune_database_func = crashpad_backend_prune_database; backend->data = data; backend->can_capture_after_shutdown = true; diff --git a/shared/sentry/src/backends/sentry_backend_inproc.c b/shared/sentry/src/src/backends/sentry_backend_inproc.c similarity index 91% rename from shared/sentry/src/backends/sentry_backend_inproc.c rename to shared/sentry/src/src/backends/sentry_backend_inproc.c index 32887a033..a18b2944b 100644 --- a/shared/sentry/src/backends/sentry_backend_inproc.c +++ b/shared/sentry/src/src/backends/sentry_backend_inproc.c @@ -13,6 +13,31 @@ #include "transports/sentry_disk_transport.h" #include +/** + * Android's bionic libc seems to allocate alternate signal handler stacks for + * every thread and also references them from their internal maintenance + * structs. + * + * The way we currently set up our sigaltstack seems to interfere with this + * setup and causes crashes whenever an ART signal handler touches the thread + * that called `sentry_init()`. + * + * In addition to this problem, it also means there is no need for our own + * sigaltstack on Android since our signal handler will always be running on + * an alternate stack managed by bionic. + * + * Note: In bionic the sigaltstacks for 32-bit devices have a size of 16KiB and + * on 64-bit devices they have 32KiB. The size of our own was set to 64KiB + * independent of the device. If this is a problem, we need figure out + * together with Google if there is a way in which our configs can coexist. + * + * Both breakpad and crashpad are way more defensive in the setup of their + * signal stacks and take existing stacks into account (or reuse them). + */ +#ifndef SENTRY_PLATFORM_ANDROID +# define SETUP_SIGALTSTACK +#endif + #define SIGNAL_DEF(Sig, Desc) \ { \ Sig, #Sig, Desc \ @@ -32,8 +57,9 @@ struct signal_slot { # define SIGNAL_STACK_SIZE 65536 static struct sigaction g_sigaction; static struct sigaction g_previous_handlers[SIGNAL_COUNT]; +# ifdef SETUP_SIGALTSTACK static stack_t g_signal_stack; - +# endif static const struct signal_slot SIGNAL_DEFINITIONS[SIGNAL_COUNT] = { SIGNAL_DEF(SIGILL, "IllegalInstruction"), SIGNAL_DEF(SIGTRAP, "Trap"), @@ -87,6 +113,7 @@ startup_inproc_backend( } // install our own signal handler +# ifdef SETUP_SIGALTSTACK g_signal_stack.ss_sp = sentry_malloc(SIGNAL_STACK_SIZE); if (!g_signal_stack.ss_sp) { return 1; @@ -94,7 +121,7 @@ startup_inproc_backend( g_signal_stack.ss_size = SIGNAL_STACK_SIZE; g_signal_stack.ss_flags = 0; sigaltstack(&g_signal_stack, 0); - +# endif sigemptyset(&g_sigaction.sa_mask); g_sigaction.sa_sigaction = handle_signal; g_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK; @@ -107,10 +134,12 @@ startup_inproc_backend( static void shutdown_inproc_backend(sentry_backend_t *UNUSED(backend)) { +# ifdef SETUP_SIGALTSTACK g_signal_stack.ss_flags = SS_DISABLE; sigaltstack(&g_signal_stack, 0); sentry_free(g_signal_stack.ss_sp); g_signal_stack.ss_sp = NULL; +# endif reset_signal_handlers(); } @@ -472,6 +501,8 @@ make_signal_event( void *backtrace[MAX_FRAMES]; size_t frame_count = sentry_unwind_stack_from_ucontext(uctx, &backtrace[0], MAX_FRAMES); + SENTRY_TRACEF( + "captured backtrace from ucontext with %lu frames", frame_count); // if unwinding from a ucontext didn't yield any results, try again with a // direct unwind. this is most likely the case when using `libbacktrace`, // since that does not allow to unwind from a ucontext at all. @@ -486,6 +517,14 @@ make_signal_event( sentry_value_t registers = sentry__registers_from_uctx(uctx); sentry_value_set_by_key(stacktrace, "registers", registers); +#ifdef SENTRY_WITH_UNWINDER_LIBUNWINDSTACK + // libunwindstack already adjusts the PC according to `GetPcAdjustment()` + // https://github.com/getsentry/libunwindstack-ndk/blob/1929f7b601797fc8b2cac092d563b31d01d46a76/Regs.cpp#L187 + // so there is no need to adjust the PC in the backend processing. + sentry_value_set_by_key(stacktrace, "instruction_addr_adjustment", + sentry_value_new_string("none")); +#endif + sentry_value_set_by_key(exc, "stacktrace", stacktrace); sentry_event_add_exception(event, exc); diff --git a/shared/sentry/src/backends/sentry_backend_none.c b/shared/sentry/src/src/backends/sentry_backend_none.c similarity index 100% rename from shared/sentry/src/backends/sentry_backend_none.c rename to shared/sentry/src/src/backends/sentry_backend_none.c diff --git a/shared/sentry/src/src/exports.map b/shared/sentry/src/src/exports.map new file mode 100644 index 000000000..a361e4251 --- /dev/null +++ b/shared/sentry/src/src/exports.map @@ -0,0 +1,4 @@ +{ + global: sentry_*; + local: *; +}; diff --git a/shared/sentry/src/integrations/sentry_integration_qt.cpp b/shared/sentry/src/src/integrations/sentry_integration_qt.cpp similarity index 100% rename from shared/sentry/src/integrations/sentry_integration_qt.cpp rename to shared/sentry/src/src/integrations/sentry_integration_qt.cpp diff --git a/shared/sentry/src/integrations/sentry_integration_qt.h b/shared/sentry/src/src/integrations/sentry_integration_qt.h similarity index 100% rename from shared/sentry/src/integrations/sentry_integration_qt.h rename to shared/sentry/src/src/integrations/sentry_integration_qt.h diff --git a/shared/sentry/src/modulefinder/sentry_modulefinder_aix.c b/shared/sentry/src/src/modulefinder/sentry_modulefinder_aix.c similarity index 100% rename from shared/sentry/src/modulefinder/sentry_modulefinder_aix.c rename to shared/sentry/src/src/modulefinder/sentry_modulefinder_aix.c diff --git a/shared/sentry/src/modulefinder/sentry_modulefinder_apple.c b/shared/sentry/src/src/modulefinder/sentry_modulefinder_apple.c similarity index 100% rename from shared/sentry/src/modulefinder/sentry_modulefinder_apple.c rename to shared/sentry/src/src/modulefinder/sentry_modulefinder_apple.c diff --git a/shared/sentry/src/modulefinder/sentry_modulefinder_linux.c b/shared/sentry/src/src/modulefinder/sentry_modulefinder_linux.c similarity index 74% rename from shared/sentry/src/modulefinder/sentry_modulefinder_linux.c rename to shared/sentry/src/src/modulefinder/sentry_modulefinder_linux.c index b37722de4..1d459c12f 100644 --- a/shared/sentry/src/modulefinder/sentry_modulefinder_linux.c +++ b/shared/sentry/src/src/modulefinder/sentry_modulefinder_linux.c @@ -292,7 +292,7 @@ get_code_id_from_notes( } static const uint8_t * -get_code_id_from_elf(const sentry_module_t *module, size_t *size_out) +get_code_id_from_program_header(const sentry_module_t *module, size_t *size_out) { *size_out = 0; @@ -350,68 +350,90 @@ get_code_id_from_elf(const sentry_module_t *module, size_t *size_out) return NULL; } -static sentry_uuid_t -get_code_id_from_text_fallback(const sentry_module_t *module) -{ - const uint8_t *text = NULL; - size_t text_size = 0; - - // iterate over all the program headers, for 32/64 bit separately - unsigned char e_ident[EI_NIDENT]; - ENSURE(sentry__module_read_safely(e_ident, module, 0, EI_NIDENT)); - if (e_ident[EI_CLASS] == ELFCLASS64) { - Elf64_Ehdr elf; - ENSURE(sentry__module_read_safely(&elf, module, 0, sizeof(Elf64_Ehdr))); +#define ELF_SECTION_ITER(INNER) \ + unsigned char e_ident[EI_NIDENT]; \ + ENSURE(sentry__module_read_safely(e_ident, module, 0, EI_NIDENT)); \ + if (e_ident[EI_CLASS] == ELFCLASS64) { \ + Elf64_Ehdr elf; \ + ENSURE( \ + sentry__module_read_safely(&elf, module, 0, sizeof(Elf64_Ehdr))); \ + \ + Elf64_Shdr strheader; \ + ENSURE(sentry__module_read_safely(&strheader, module, \ + elf.e_shoff + elf.e_shentsize * elf.e_shstrndx, \ + sizeof(Elf64_Shdr))); \ + \ + for (int i = 0; i < elf.e_shnum; i++) { \ + Elf64_Shdr header; \ + ENSURE(sentry__module_read_safely(&header, module, \ + elf.e_shoff + elf.e_shentsize * i, sizeof(Elf64_Shdr))); \ + \ + char name[6]; \ + ENSURE(sentry__module_read_safely(name, module, \ + strheader.sh_offset + header.sh_name, sizeof(name))); \ + name[5] = '\0'; \ + \ + INNER \ + } \ + } else { \ + Elf32_Ehdr elf; \ + ENSURE( \ + sentry__module_read_safely(&elf, module, 0, sizeof(Elf32_Ehdr))); \ + \ + Elf32_Shdr strheader; \ + ENSURE(sentry__module_read_safely(&strheader, module, \ + elf.e_shoff + elf.e_shentsize * elf.e_shstrndx, \ + sizeof(Elf32_Shdr))); \ + \ + for (int i = 0; i < elf.e_shnum; i++) { \ + Elf32_Shdr header; \ + ENSURE(sentry__module_read_safely(&header, module, \ + elf.e_shoff + elf.e_shentsize * i, sizeof(Elf32_Shdr))); \ + \ + char name[6]; \ + ENSURE(sentry__module_read_safely(name, module, \ + strheader.sh_offset + header.sh_name, sizeof(name))); \ + name[5] = '\0'; \ + \ + INNER \ + } \ + } - Elf64_Shdr strheader; - ENSURE(sentry__module_read_safely(&strheader, module, - elf.e_shoff + elf.e_shentsize * elf.e_shstrndx, - sizeof(Elf64_Shdr))); +static const uint8_t * +get_code_id_from_note_section(const sentry_module_t *module, size_t *size_out) +{ + *size_out = 0; - for (int i = 0; i < elf.e_shnum; i++) { - Elf64_Shdr header; - ENSURE(sentry__module_read_safely(&header, module, - elf.e_shoff + elf.e_shentsize * i, sizeof(Elf64_Shdr))); - - char name[6]; - ENSURE(sentry__module_read_safely(name, module, - strheader.sh_offset + header.sh_name, sizeof(name))); - name[5] = '\0'; - if (header.sh_type == SHT_PROGBITS && strcmp(name, ".text") == 0) { - text = sentry__module_get_addr( - module, header.sh_offset, header.sh_size); - ENSURE(text); - text_size = header.sh_size; - break; + ELF_SECTION_ITER( + if (header.sh_type == SHT_NOTE && strcmp(name, ".note") == 0) { + void *segment_addr = sentry__module_get_addr( + module, header.sh_offset, header.sh_size); + ENSURE(segment_addr); + const uint8_t *code_id = get_code_id_from_notes(header.sh_addralign, + segment_addr, + (void *)((uintptr_t)segment_addr + header.sh_size), size_out); + if (code_id) { + return code_id; } - } - } else { - Elf32_Ehdr elf; - ENSURE(sentry__module_read_safely(&elf, module, 0, sizeof(Elf32_Ehdr))); + }) +fail: + return NULL; +} - Elf32_Shdr strheader; - ENSURE(sentry__module_read_safely(&strheader, module, - elf.e_shoff + elf.e_shentsize * elf.e_shstrndx, - sizeof(Elf32_Shdr))); +static sentry_uuid_t +get_code_id_from_text_section(const sentry_module_t *module) +{ + const uint8_t *text = NULL; + size_t text_size = 0; - for (int i = 0; i < elf.e_shnum; i++) { - Elf32_Shdr header; - ENSURE(sentry__module_read_safely(&header, module, - elf.e_shoff + elf.e_shentsize * i, sizeof(Elf32_Shdr))); - - char name[6]; - ENSURE(sentry__module_read_safely(name, module, - strheader.sh_offset + header.sh_name, sizeof(name))); - name[5] = '\0'; - if (header.sh_type == SHT_PROGBITS && strcmp(name, ".text") == 0) { - text = sentry__module_get_addr( - module, header.sh_offset, header.sh_size); - ENSURE(text); - text_size = header.sh_size; - break; - } - } - } + ELF_SECTION_ITER( + if (header.sh_type == SHT_PROGBITS && strcmp(name, ".text") == 0) { + text = sentry__module_get_addr( + module, header.sh_offset, header.sh_size); + ENSURE(text); + text_size = header.sh_size; + break; + }) sentry_uuid_t uuid = sentry_uuid_nil(); @@ -427,28 +449,43 @@ get_code_id_from_text_fallback(const sentry_module_t *module) return sentry_uuid_nil(); } +#undef ELF_SECTION_ITER + bool sentry__procmaps_read_ids_from_elf( sentry_value_t value, const sentry_module_t *module) { - // and try to get the debug id from the elf headers of the loaded - // modules + // try to get the debug id from the elf headers of the loaded modules size_t code_id_size; - const uint8_t *code_id = get_code_id_from_elf(module, &code_id_size); + const uint8_t *code_id + = get_code_id_from_program_header(module, &code_id_size); sentry_uuid_t uuid = sentry_uuid_nil(); + if (code_id) { sentry_value_set_by_key(value, "code_id", sentry__value_new_hexstring(code_id, code_id_size)); memcpy(uuid.bytes, code_id, MIN(code_id_size, 16)); } else { - uuid = get_code_id_from_text_fallback(module); + // no code-id found, try the ".note.gnu.build-id" section + code_id = get_code_id_from_note_section(module, &code_id_size); + if (code_id) { + sentry_value_set_by_key(value, "code_id", + sentry__value_new_hexstring(code_id, code_id_size)); + + memcpy(uuid.bytes, code_id, MIN(code_id_size, 16)); + } else { + // We were not able to locate the code-id, so fall back to + // hashing the first page of the ".text" (program code) + // section. + uuid = get_code_id_from_text_section(module); + } } // the usage of these is described here: // https://getsentry.github.io/symbolicator/advanced/symbol-server-compatibility/#identifiers - // in particular, the debug_id is a `little-endian GUID`, so we have to do - // appropriate byte-flipping + // in particular, the debug_id is a `little-endian GUID`, so we have + // to do appropriate byte-flipping char *uuid_bytes = uuid.bytes; uint32_t *a = (uint32_t *)uuid_bytes; *a = htonl(*a); @@ -480,14 +517,15 @@ sentry__procmaps_module_to_value(const sentry_module_t *module) sentry_value_set_by_key( mod_val, "image_size", sentry_value_new_int32(module_size)); - // At least on the android API-16, x86 simulator, the linker apparently - // does not load the complete file into memory. Or at least, the section - // headers which are located at the end of the file are not loaded, and - // we would be poking into invalid memory. To be safe, we mmap the - // complete file from disk, so we have the on-disk layout, and are - // independent of how the runtime linker would load or re-order any - // sections. The exception here is the linux-gate, which is not an - // actual file on disk, so we actually poke at its memory. + // At least on the android API-16, x86 simulator, the linker + // apparently does not load the complete file into memory. Or at + // least, the section headers which are located at the end of the + // file are not loaded, and we would be poking into invalid memory. + // To be safe, we mmap the complete file from disk, so we have the + // on-disk layout, and are independent of how the runtime linker + // would load or re-order any sections. The exception here is the + // linux-gate, which is not an actual file on disk, so we actually + // poke at its memory. if (sentry__slice_eq(module->file, LINUX_GATE)) { sentry__procmaps_read_ids_from_elf(mod_val, module); } else { @@ -617,8 +655,9 @@ load_modules(sentry_value_t modules) uint64_t linux_vdso = get_linux_vdso(); - // we have multiple memory maps per file, and we need to merge their offsets - // based on the filename. Luckily, the maps are ordered by filename, so yay + // we have multiple memory maps per file, and we need to merge their + // offsets based on the filename. Luckily, the maps are ordered by + // filename, so yay sentry_module_t last_module; memset(&last_module, 0, sizeof(sentry_module_t)); while (true) { @@ -649,19 +688,17 @@ load_modules(sentry_value_t modules) } if (is_valid_elf_header((void *)(size_t)module.start)) { - // On android, we sometimes have multiple mappings for the same - // inode at the same offset, such as this, excuse the auto-format - // here: - // 737b5570d000-737b5570e000 r--p 00000000 07:70 34 - // /apex/com.android.runtime/lib64/bionic/libdl.so - // 737b5570e000-737b5570f000 r-xp 00000000 07:70 34 - // /apex/com.android.runtime/lib64/bionic/libdl.so - // 737b5570f000-737b55710000 r--p 00000000 07:70 34 - // /apex/com.android.runtime/lib64/bionic/libdl.so + // clang-format off + // On android, we sometimes have multiple mappings for the + // same inode at the same offset, such as this: + // 737b5570d000-737b5570e000 r--p 00000000 07:70 34 /apex/com.android.runtime/lib64/bionic/libdl.so + // 737b5570e000-737b5570f000 r-xp 00000000 07:70 34 /apex/com.android.runtime/lib64/bionic/libdl.so + // 737b5570f000-737b55710000 r--p 00000000 07:70 34 /apex/com.android.runtime/lib64/bionic/libdl.so + // clang-format on if (!is_duplicated_mapping(&last_module, &module)) { - // try to append the module based on the mappings that we have - // found so far + // try to append the module based on the mappings that + // we have found so far try_append_module(modules, &last_module); // start a new module based on the current mapping diff --git a/shared/sentry/src/modulefinder/sentry_modulefinder_linux.h b/shared/sentry/src/src/modulefinder/sentry_modulefinder_linux.h similarity index 100% rename from shared/sentry/src/modulefinder/sentry_modulefinder_linux.h rename to shared/sentry/src/src/modulefinder/sentry_modulefinder_linux.h diff --git a/shared/sentry/src/modulefinder/sentry_modulefinder_windows.c b/shared/sentry/src/src/modulefinder/sentry_modulefinder_windows.c similarity index 100% rename from shared/sentry/src/modulefinder/sentry_modulefinder_windows.c rename to shared/sentry/src/src/modulefinder/sentry_modulefinder_windows.c diff --git a/shared/sentry/src/path/sentry_path.c b/shared/sentry/src/src/path/sentry_path.c similarity index 100% rename from shared/sentry/src/path/sentry_path.c rename to shared/sentry/src/src/path/sentry_path.c diff --git a/shared/sentry/src/path/sentry_path_unix.c b/shared/sentry/src/src/path/sentry_path_unix.c similarity index 97% rename from shared/sentry/src/path/sentry_path_unix.c rename to shared/sentry/src/src/path/sentry_path_unix.c index 041a23b41..298913996 100644 --- a/shared/sentry/src/path/sentry_path_unix.c +++ b/shared/sentry/src/src/path/sentry_path_unix.c @@ -54,15 +54,7 @@ sentry__filelock_try_lock(sentry_filelock_t *lock) { lock->is_locked = false; - const int oflags = -#ifdef SENTRY_PLATFORM_AIX - // Under AIX, O_TRUNC can only be set if it can be written to, and - // flock (well, fcntl) will return EBADF if the fd is not read-write. - O_RDWR | O_CREAT | O_TRUNC; -#else - O_RDONLY | O_CREAT | O_TRUNC; -#endif - int fd = open(lock->path->path, oflags, + int fd = open(lock->path->path, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (fd < 0) { return false; @@ -177,9 +169,9 @@ sentry__path_dir(const sentry_path_t *path) } sentry_path_t * -sentry__path_from_str(const char *s) +sentry__path_from_str_n(const char *s, size_t s_len) { - char *path = sentry__string_clone(s); + char *path = sentry__string_clone_n(s, s_len); if (!path) { return NULL; } @@ -187,6 +179,12 @@ sentry__path_from_str(const char *s) return sentry__path_from_str_owned(path); } +sentry_path_t * +sentry__path_from_str(const char *s) +{ + return s ? sentry__path_from_str_n(s, strlen(s)) : NULL; +} + sentry_path_t * sentry__path_from_str_owned(char *s) { diff --git a/shared/sentry/src/path/sentry_path_windows.c b/shared/sentry/src/src/path/sentry_path_windows.c similarity index 93% rename from shared/sentry/src/path/sentry_path_windows.c rename to shared/sentry/src/src/path/sentry_path_windows.c index ea2a7097e..b953af9a6 100644 --- a/shared/sentry/src/path/sentry_path_windows.c +++ b/shared/sentry/src/src/path/sentry_path_windows.c @@ -135,16 +135,28 @@ sentry__path_dir(const sentry_path_t *path) } sentry_path_t * -sentry__path_from_wstr(const wchar_t *s) +sentry__path_from_wstr_n(const wchar_t *s, size_t s_len) { - size_t len = wcslen(s) + 1; - sentry_path_t *rv = path_with_len(len); + if (!s) { + return NULL; + } + sentry_path_t *rv = path_with_len(s_len + 1); if (rv) { - memcpy(rv->path, s, len * sizeof(wchar_t)); + memcpy(rv->path, s, s_len * sizeof(wchar_t)); + rv->path[s_len] = 0; } return rv; } +sentry_path_t * +sentry__path_from_wstr(const wchar_t *s) +{ + if (!s) { + return NULL; + } + return sentry__path_from_wstr_n(s, wcslen(s)); +} + sentry_path_t * sentry__path_join_wstr(const sentry_path_t *base, const wchar_t *other) { @@ -189,20 +201,42 @@ sentry__path_join_wstr(const sentry_path_t *base, const wchar_t *other) } sentry_path_t * -sentry__path_from_str(const char *s) +sentry__path_from_str_n(const char *s, size_t s_len) { - size_t len = MultiByteToWideChar(CP_ACP, 0, s, -1, NULL, 0); + if (!s) { + return NULL; + } sentry_path_t *rv = SENTRY_MAKE(sentry_path_t); if (!rv) { return NULL; } - rv->path = sentry_malloc(sizeof(wchar_t) * len); + size_t src_size = sizeof(char) * s_len; + size_t dst_size = sizeof(wchar_t) * (s_len + 1); + rv->path = sentry_malloc(dst_size); if (!rv->path) { - sentry_free(rv); - return NULL; + goto error; + } + int conv_len = MultiByteToWideChar( + CP_ACP, 0, s, (int)src_size, rv->path, (int)s_len); + if (conv_len == 0) { + goto error; } - MultiByteToWideChar(CP_ACP, 0, s, -1, rv->path, (int)len); + rv->path[conv_len] = 0; return rv; + +error: + sentry_free(rv); + return NULL; +} + +sentry_path_t * +sentry__path_from_str(const char *s) +{ + if (!s) { + return NULL; + } + + return sentry__path_from_str_n(s, strlen(s)); } sentry_path_t * diff --git a/shared/sentry/src/sentry_alloc.c b/shared/sentry/src/src/sentry_alloc.c similarity index 100% rename from shared/sentry/src/sentry_alloc.c rename to shared/sentry/src/src/sentry_alloc.c diff --git a/shared/sentry/src/sentry_alloc.h b/shared/sentry/src/src/sentry_alloc.h similarity index 100% rename from shared/sentry/src/sentry_alloc.h rename to shared/sentry/src/src/sentry_alloc.h diff --git a/shared/sentry/src/sentry_backend.c b/shared/sentry/src/src/sentry_backend.c similarity index 100% rename from shared/sentry/src/sentry_backend.c rename to shared/sentry/src/src/sentry_backend.c diff --git a/shared/sentry/src/sentry_backend.h b/shared/sentry/src/src/sentry_backend.h similarity index 100% rename from shared/sentry/src/sentry_backend.h rename to shared/sentry/src/src/sentry_backend.h diff --git a/shared/sentry/src/sentry_boot.h b/shared/sentry/src/src/sentry_boot.h similarity index 100% rename from shared/sentry/src/sentry_boot.h rename to shared/sentry/src/src/sentry_boot.h diff --git a/shared/sentry/src/sentry_core.c b/shared/sentry/src/src/sentry_core.c similarity index 85% rename from shared/sentry/src/sentry_core.c rename to shared/sentry/src/src/sentry_core.c index 669948d2d..24cf52539 100644 --- a/shared/sentry/src/sentry_core.c +++ b/shared/sentry/src/src/sentry_core.c @@ -1,10 +1,8 @@ #include "sentry_boot.h" #include -#include #include -#include "sentry_alloc.h" #include "sentry_backend.h" #include "sentry_core.h" #include "sentry_database.h" @@ -165,11 +163,16 @@ sentry_init(sentry_options_t *options) g_options = options; // *after* setting the global options, trigger a scope and consent flush, - // since at least crashpad needs that. - // the only way to get a reference to the scope is by locking it, the macro - // does all that at once, including invoking the backends scope flush hook + // since at least crashpad needs that. At this point we also freeze the + // `client_sdk` in the `scope` because some downstream SDKs want to override + // it at runtime via the options interface. SENTRY_WITH_SCOPE_MUT (scope) { - (void)scope; + if (options->sdk_name) { + sentry_value_t sdk_name + = sentry_value_new_string(options->sdk_name); + sentry_value_set_by_key(scope->client_sdk, "name", sdk_name); + } + sentry_value_freeze(scope->client_sdk); } if (backend && backend->user_consent_changed_func) { backend->user_consent_changed_func(backend); @@ -289,29 +292,27 @@ set_user_consent(sentry_user_consent_t new_val) { SENTRY_WITH_OPTIONS (options) { if (sentry__atomic_store((long *)&options->user_consent, new_val) - == new_val) { - // nothing was changed - break; // SENTRY_WITH_OPTIONS - } - - if (options->backend && options->backend->user_consent_changed_func) { - options->backend->user_consent_changed_func(options->backend); - } + != new_val) { + if (options->backend + && options->backend->user_consent_changed_func) { + options->backend->user_consent_changed_func(options->backend); + } - sentry_path_t *consent_path - = sentry__path_join_str(options->database_path, "user-consent"); - switch (new_val) { - case SENTRY_USER_CONSENT_GIVEN: - sentry__path_write_buffer(consent_path, "1\n", 2); - break; - case SENTRY_USER_CONSENT_REVOKED: - sentry__path_write_buffer(consent_path, "0\n", 2); - break; - case SENTRY_USER_CONSENT_UNKNOWN: - sentry__path_remove(consent_path); - break; + sentry_path_t *consent_path + = sentry__path_join_str(options->database_path, "user-consent"); + switch (new_val) { + case SENTRY_USER_CONSENT_GIVEN: + sentry__path_write_buffer(consent_path, "1\n", 2); + break; + case SENTRY_USER_CONSENT_REVOKED: + sentry__path_write_buffer(consent_path, "0\n", 2); + break; + case SENTRY_USER_CONSENT_UNKNOWN: + sentry__path_remove(consent_path); + break; + } + sentry__path_free(consent_path); } - sentry__path_free(consent_path); } } @@ -640,6 +641,16 @@ sentry_set_tag(const char *key, const char *value) } } +void +sentry_set_tag_n( + const char *key, size_t key_len, const char *value, size_t value_len) +{ + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_value_set_by_key_n(scope->tags, key, key_len, + sentry_value_new_string_n(value, value_len)); + } +} + void sentry_remove_tag(const char *key) { @@ -648,6 +659,14 @@ sentry_remove_tag(const char *key) } } +void +sentry_remove_tag_n(const char *key, size_t key_len) +{ + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_value_remove_by_key_n(scope->tags, key, key_len); + } +} + void sentry_set_extra(const char *key, sentry_value_t value) { @@ -656,6 +675,14 @@ sentry_set_extra(const char *key, sentry_value_t value) } } +void +sentry_set_extra_n(const char *key, size_t key_len, sentry_value_t value) +{ + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_value_set_by_key_n(scope->extra, key, key_len, value); + } +} + void sentry_remove_extra(const char *key) { @@ -664,6 +691,14 @@ sentry_remove_extra(const char *key) } } +void +sentry_remove_extra_n(const char *key, size_t key_len) +{ + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_value_remove_by_key_n(scope->extra, key, key_len); + } +} + void sentry_set_context(const char *key, sentry_value_t value) { @@ -672,6 +707,14 @@ sentry_set_context(const char *key, sentry_value_t value) } } +void +sentry_set_context_n(const char *key, size_t key_len, sentry_value_t value) +{ + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_value_set_by_key_n(scope->contexts, key, key_len, value); + } +} + void sentry_remove_context(const char *key) { @@ -680,6 +723,33 @@ sentry_remove_context(const char *key) } } +void +sentry_remove_context_n(const char *key, size_t key_len) +{ + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_value_remove_by_key_n(scope->contexts, key, key_len); + } +} + +void +sentry_set_fingerprint_n(const char *fingerprint, size_t fingerprint_len, ...) +{ + sentry_value_t fingerprint_value = sentry_value_new_list(); + + va_list va; + va_start(va, fingerprint_len); + for (; fingerprint; fingerprint = va_arg(va, const char *)) { + sentry_value_append(fingerprint_value, + sentry_value_new_string_n(fingerprint, fingerprint_len)); + } + va_end(va); + + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_value_decref(scope->fingerprint); + scope->fingerprint = fingerprint_value; + } +} + void sentry_set_fingerprint(const char *fingerprint, ...) { @@ -696,7 +766,7 @@ sentry_set_fingerprint(const char *fingerprint, ...) SENTRY_WITH_SCOPE_MUT (scope) { sentry_value_decref(scope->fingerprint); scope->fingerprint = fingerprint_value; - }; + } } void @@ -705,7 +775,7 @@ sentry_remove_fingerprint(void) SENTRY_WITH_SCOPE_MUT (scope) { sentry_value_decref(scope->fingerprint); scope->fingerprint = sentry_value_new_null(); - }; + } } void @@ -721,6 +791,21 @@ sentry_set_transaction(const char *transaction) } } +void +sentry_set_transaction_n(const char *transaction, size_t transaction_len) +{ + SENTRY_WITH_SCOPE_MUT (scope) { + sentry_free(scope->transaction); + scope->transaction + = sentry__string_clone_n(transaction, transaction_len); + + if (scope->transaction_object) { + sentry_transaction_set_name_n( + scope->transaction_object, transaction, transaction_len); + } + } +} + void sentry_set_level(sentry_level_t level) { @@ -870,8 +955,9 @@ sentry_set_span(sentry_span_t *span) } sentry_span_t * -sentry_transaction_start_child( - sentry_transaction_t *opaque_parent, char *operation, char *description) +sentry_transaction_start_child_n(sentry_transaction_t *opaque_parent, + const char *operation, size_t operation_len, const char *description, + size_t description_len) { if (!opaque_parent || sentry_value_is_null(opaque_parent->inner)) { SENTRY_DEBUG("no transaction available to create a child under"); @@ -886,14 +972,25 @@ sentry_transaction_start_child( max_spans = options->max_spans; } - sentry_value_t span - = sentry__value_span_new(max_spans, parent, operation, description); + sentry_value_t span = sentry__value_span_new_n(max_spans, parent, + (sentry_slice_t) { operation, operation_len }, + (sentry_slice_t) { description, description_len }); return sentry__span_new(opaque_parent, span); } sentry_span_t * -sentry_span_start_child( - sentry_span_t *opaque_parent, char *operation, char *description) +sentry_transaction_start_child(sentry_transaction_t *opaque_parent, + const char *operation, const char *description) +{ + const size_t operation_len = operation ? strlen(operation) : 0; + const size_t description_len = description ? strlen(description) : 0; + return sentry_transaction_start_child_n( + opaque_parent, operation, operation_len, description, description_len); +} + +sentry_span_t * +sentry_span_start_child_n(sentry_span_t *opaque_parent, const char *operation, + size_t operation_len, const char *description, size_t description_len) { if (!opaque_parent || sentry_value_is_null(opaque_parent->inner)) { SENTRY_DEBUG("no parent span available to create a child span under"); @@ -912,12 +1009,23 @@ sentry_span_start_child( max_spans = options->max_spans; } - sentry_value_t span - = sentry__value_span_new(max_spans, parent, operation, description); + sentry_value_t span = sentry__value_span_new_n(max_spans, parent, + (sentry_slice_t) { operation, operation_len }, + (sentry_slice_t) { description, description_len }); return sentry__span_new(opaque_parent->transaction, span); } +sentry_span_t * +sentry_span_start_child(sentry_span_t *opaque_parent, const char *operation, + const char *description) +{ + size_t operation_len = operation ? strlen(operation) : 0; + size_t description_len = description ? strlen(description) : 0; + return sentry_span_start_child_n( + opaque_parent, operation, operation_len, description, description_len); +} + void sentry_span_finish(sentry_span_t *opaque_span) { @@ -1010,17 +1118,16 @@ sentry_span_finish(sentry_span_t *opaque_span) fail: sentry__span_decref(opaque_span); - return; } int -sentry_get_crashed_last_run() +sentry_get_crashed_last_run(void) { return g_last_crash; } int -sentry_clear_crashed_last_run() +sentry_clear_crashed_last_run(void) { bool success = false; sentry_options_t *options = sentry__options_lock(); diff --git a/shared/sentry/src/sentry_core.h b/shared/sentry/src/src/sentry_core.h similarity index 100% rename from shared/sentry/src/sentry_core.h rename to shared/sentry/src/src/sentry_core.h diff --git a/shared/sentry/src/sentry_database.c b/shared/sentry/src/src/sentry_database.c similarity index 96% rename from shared/sentry/src/sentry_database.c rename to shared/sentry/src/src/sentry_database.c index 62a619d8a..d9874fcdb 100644 --- a/shared/sentry/src/sentry_database.c +++ b/shared/sentry/src/src/sentry_database.c @@ -4,6 +4,7 @@ #include "sentry_json.h" #include "sentry_options.h" #include "sentry_session.h" +#include #include sentry_run_t * @@ -49,13 +50,20 @@ sentry__run_new(const sentry_path_t *database_path) run->run_path = run_path; run->session_path = session_path; run->lock = sentry__filelock_new(lock_path); - if (!run->lock || !sentry__filelock_try_lock(run->lock)) { - sentry__run_free(run); - return NULL; + if (!run->lock) { + goto error; + } + if (!sentry__filelock_try_lock(run->lock)) { + SENTRY_WARNF("failed to lock file \"%s\" (%s)", lock_path->path, + strerror(errno)); + goto error; } - sentry__path_create_dir_all(run->run_path); return run; + +error: + sentry__run_free(run); + return NULL; } void diff --git a/shared/sentry/src/sentry_database.h b/shared/sentry/src/src/sentry_database.h similarity index 100% rename from shared/sentry/src/sentry_database.h rename to shared/sentry/src/src/sentry_database.h diff --git a/shared/sentry/src/sentry_envelope.c b/shared/sentry/src/src/sentry_envelope.c similarity index 96% rename from shared/sentry/src/sentry_envelope.c rename to shared/sentry/src/src/sentry_envelope.c index cfcf5af82..4b68a2787 100644 --- a/shared/sentry/src/sentry_envelope.c +++ b/shared/sentry/src/src/sentry_envelope.c @@ -322,7 +322,7 @@ sentry__envelope_add_from_buffer(sentry_envelope_t *envelope, const char *buf, // NOTE: function will check for the clone of `buf` internally and free it // on error return envelope_add_from_owned_buffer( - envelope, sentry__string_clonen(buf, buf_len), buf_len, type); + envelope, sentry__string_clone_n(buf, buf_len), buf_len, type); } sentry_envelope_item_t * @@ -459,10 +459,13 @@ sentry_envelope_write_to_path( } int -sentry_envelope_write_to_file( - const sentry_envelope_t *envelope, const char *path) +sentry_envelope_write_to_file_n( + const sentry_envelope_t *envelope, const char *path, size_t path_len) { - sentry_path_t *path_obj = sentry__path_from_str(path); + if (!envelope || !path) { + return 1; + } + sentry_path_t *path_obj = sentry__path_from_str_n(path, path_len); int rv = sentry_envelope_write_to_path(envelope, path_obj); @@ -471,6 +474,17 @@ sentry_envelope_write_to_file( return rv; } +int +sentry_envelope_write_to_file( + const sentry_envelope_t *envelope, const char *path) +{ + if (!envelope || !path) { + return 1; + } + + return sentry_envelope_write_to_file_n(envelope, path, strlen(path)); +} + #ifdef SENTRY_UNITTEST size_t sentry__envelope_get_item_count(const sentry_envelope_t *envelope) diff --git a/shared/sentry/src/sentry_envelope.h b/shared/sentry/src/src/sentry_envelope.h similarity index 100% rename from shared/sentry/src/sentry_envelope.h rename to shared/sentry/src/src/sentry_envelope.h diff --git a/shared/sentry/src/sentry_info.c b/shared/sentry/src/src/sentry_info.c similarity index 69% rename from shared/sentry/src/sentry_info.c rename to shared/sentry/src/src/sentry_info.c index b2918127b..ca2f6387a 100644 --- a/shared/sentry/src/sentry_info.c +++ b/shared/sentry/src/src/sentry_info.c @@ -1,19 +1,19 @@ #include "sentry_boot.h" const char * -sentry_sdk_version() +sentry_sdk_version(void) { return SENTRY_SDK_VERSION; } const char * -sentry_sdk_name() +sentry_sdk_name(void) { return SENTRY_SDK_NAME; } const char * -sentry_sdk_user_agent() +sentry_sdk_user_agent(void) { return SENTRY_SDK_USER_AGENT; } diff --git a/shared/sentry/src/sentry_json.c b/shared/sentry/src/src/sentry_json.c similarity index 98% rename from shared/sentry/src/sentry_json.c rename to shared/sentry/src/src/sentry_json.c index cf02c7f1b..f83cd1886 100644 --- a/shared/sentry/src/sentry_json.c +++ b/shared/sentry/src/src/sentry_json.c @@ -471,8 +471,8 @@ tokens_to_value(jsmntok_t *tokens, size_t token_count, const char *buf, break; } case JSMN_STRING: { - char *string - = sentry__string_clonen(buf + root->start, root->end - root->start); + char *string = sentry__string_clone_n_unchecked( + buf + root->start, root->end - root->start); if (decode_string_inplace(string)) { rv = sentry__value_new_string_owned(string); } else { @@ -492,7 +492,7 @@ tokens_to_value(jsmntok_t *tokens, size_t token_count, const char *buf, sentry_value_t child; NESTED_PARSE(&child); - char *key = sentry__string_clonen( + char *key = sentry__string_clone_n_unchecked( buf + token->start, token->end - token->start); if (decode_string_inplace(key)) { sentry_value_set_by_key(rv, key, child); diff --git a/shared/sentry/src/sentry_json.h b/shared/sentry/src/src/sentry_json.h similarity index 100% rename from shared/sentry/src/sentry_json.h rename to shared/sentry/src/src/sentry_json.h diff --git a/shared/sentry/src/sentry_logger.c b/shared/sentry/src/src/sentry_logger.c similarity index 100% rename from shared/sentry/src/sentry_logger.c rename to shared/sentry/src/src/sentry_logger.c diff --git a/shared/sentry/src/sentry_logger.h b/shared/sentry/src/src/sentry_logger.h similarity index 100% rename from shared/sentry/src/sentry_logger.h rename to shared/sentry/src/src/sentry_logger.h diff --git a/shared/sentry/src/sentry_options.c b/shared/sentry/src/src/sentry_options.c similarity index 71% rename from shared/sentry/src/sentry_options.c rename to shared/sentry/src/src/sentry_options.c index b0a6fe8aa..014ec491f 100644 --- a/shared/sentry/src/sentry_options.c +++ b/shared/sentry/src/src/sentry_options.c @@ -36,6 +36,7 @@ sentry_options_new(void) if (!opts->environment) { opts->environment = sentry__string_clone("production"); } + sentry_options_set_sdk_name(opts, SENTRY_SDK_NAME); opts->max_breadcrumbs = SENTRY_BREADCRUMBS_MAX; opts->user_consent = SENTRY_USER_CONSENT_UNKNOWN; opts->auto_session_tracking = true; @@ -84,6 +85,8 @@ sentry_options_free(sentry_options_t *opts) } sentry__dsn_decref(opts->dsn); sentry_free(opts->release); + sentry_free(opts->sdk_name); + sentry_free(opts->user_agent); sentry_free(opts->environment); sentry_free(opts->dist); sentry_free(opts->http_proxy); @@ -130,6 +133,14 @@ sentry_options_set_on_crash( opts->on_crash_data = data; } +void +sentry_options_set_dsn_n( + sentry_options_t *opts, const char *raw_dsn, size_t raw_dsn_len) +{ + sentry__dsn_decref(opts->dsn); + opts->dsn = sentry__dsn_new_n(raw_dsn, raw_dsn_len); +} + void sentry_options_set_dsn(sentry_options_t *opts, const char *raw_dsn) { @@ -160,6 +171,14 @@ sentry_options_get_sample_rate(const sentry_options_t *opts) return opts->sample_rate; } +void +sentry_options_set_release_n( + sentry_options_t *opts, const char *release, size_t release_len) +{ + sentry_free(opts->release); + opts->release = sentry__string_clone_n(release, release_len); +} + void sentry_options_set_release(sentry_options_t *opts, const char *release) { @@ -173,6 +192,14 @@ sentry_options_get_release(const sentry_options_t *opts) return opts->release; } +void +sentry_options_set_environment_n( + sentry_options_t *opts, const char *environment, size_t environment_len) +{ + sentry_free(opts->environment); + opts->environment = sentry__string_clone_n(environment, environment_len); +} + void sentry_options_set_environment(sentry_options_t *opts, const char *environment) { @@ -186,6 +213,14 @@ sentry_options_get_environment(const sentry_options_t *opts) return opts->environment; } +void +sentry_options_set_dist_n( + sentry_options_t *opts, const char *dist, size_t dist_len) +{ + sentry_free(opts->dist); + opts->dist = sentry__string_clone_n(dist, dist_len); +} + void sentry_options_set_dist(sentry_options_t *opts, const char *dist) { @@ -199,6 +234,14 @@ sentry_options_get_dist(const sentry_options_t *opts) return opts->dist; } +void +sentry_options_set_http_proxy_n( + sentry_options_t *opts, const char *proxy, size_t proxy_len) +{ + sentry_free(opts->http_proxy); + opts->http_proxy = sentry__string_clone_n(proxy, proxy_len); +} + void sentry_options_set_http_proxy(sentry_options_t *opts, const char *proxy) { @@ -219,6 +262,14 @@ sentry_options_set_ca_certs(sentry_options_t *opts, const char *path) opts->ca_certs = sentry__string_clone(path); } +void +sentry_options_set_ca_certs_n( + sentry_options_t *opts, const char *path, size_t path_len) +{ + sentry_free(opts->ca_certs); + opts->ca_certs = sentry__string_clone_n(path, path_len); +} + const char * sentry_options_get_ca_certs(const sentry_options_t *opts) { @@ -233,12 +284,65 @@ sentry_options_set_transport_thread_name( opts->transport_thread_name = sentry__string_clone(name); } +void +sentry_options_set_transport_thread_name_n( + sentry_options_t *opts, const char *name, size_t name_len) +{ + sentry_free(opts->transport_thread_name); + opts->transport_thread_name = sentry__string_clone_n(name, name_len); +} + const char * sentry_options_get_transport_thread_name(const sentry_options_t *opts) { return opts->transport_thread_name; } +int +sentry_options_set_sdk_name(sentry_options_t *opts, const char *sdk_name) +{ + if (!opts || !sdk_name) { + return 1; + } + const size_t sdk_name_len = strlen(sdk_name); + return sentry_options_set_sdk_name_n(opts, sdk_name, sdk_name_len); +} + +int +sentry_options_set_sdk_name_n( + sentry_options_t *opts, const char *sdk_name, size_t sdk_name_len) +{ + if (!opts || !sdk_name) { + return 1; + } + + sentry_free(opts->sdk_name); + opts->sdk_name = sentry__string_clone_n(sdk_name, sdk_name_len); + + sentry_stringbuilder_t sb; + sentry__stringbuilder_init(&sb); + sentry__stringbuilder_append(&sb, opts->sdk_name); + sentry__stringbuilder_append(&sb, "/"); + sentry__stringbuilder_append(&sb, SENTRY_SDK_VERSION); + + sentry_free(opts->user_agent); + opts->user_agent = sentry__stringbuilder_into_string(&sb); + + return 0; +} + +const char * +sentry_options_get_sdk_name(const sentry_options_t *opts) +{ + return opts->sdk_name; +} + +const char * +sentry_options_get_user_agent(const sentry_options_t *opts) +{ + return opts->user_agent; +} + void sentry_options_set_debug(sentry_options_t *opts, int debug) { @@ -350,6 +454,13 @@ sentry_options_add_attachment(sentry_options_t *opts, const char *path) add_attachment(opts, sentry__path_from_str(path)); } +void +sentry_options_add_attachment_n( + sentry_options_t *opts, const char *path, size_t path_len) +{ + add_attachment(opts, sentry__path_from_str_n(path, path_len)); +} + void sentry_options_set_handler_path(sentry_options_t *opts, const char *path) { @@ -357,6 +468,14 @@ sentry_options_set_handler_path(sentry_options_t *opts, const char *path) opts->handler_path = sentry__path_from_str(path); } +void +sentry_options_set_handler_path_n( + sentry_options_t *opts, const char *path, size_t path_len) +{ + sentry__path_free(opts->handler_path); + opts->handler_path = sentry__path_from_str_n(path, path_len); +} + void sentry_options_set_database_path(sentry_options_t *opts, const char *path) { @@ -364,25 +483,57 @@ sentry_options_set_database_path(sentry_options_t *opts, const char *path) opts->database_path = sentry__path_from_str(path); } +void +sentry_options_set_database_path_n( + sentry_options_t *opts, const char *path, size_t path_len) +{ + sentry__path_free(opts->database_path); + opts->database_path = sentry__path_from_str_n(path, path_len); +} + #ifdef SENTRY_PLATFORM_WINDOWS +void +sentry_options_add_attachmentw_n( + sentry_options_t *opts, const wchar_t *path, size_t path_len) +{ + add_attachment(opts, sentry__path_from_wstr_n(path, path_len)); +} + void sentry_options_add_attachmentw(sentry_options_t *opts, const wchar_t *path) { - add_attachment(opts, sentry__path_from_wstr(path)); + size_t path_len = path ? wcslen(path) : 0; + sentry_options_add_attachmentw_n(opts, path, path_len); } void -sentry_options_set_handler_pathw(sentry_options_t *opts, const wchar_t *path) +sentry_options_set_handler_pathw_n( + sentry_options_t *opts, const wchar_t *path, size_t path_len) { sentry__path_free(opts->handler_path); - opts->handler_path = sentry__path_from_wstr(path); + opts->handler_path = sentry__path_from_wstr_n(path, path_len); } void -sentry_options_set_database_pathw(sentry_options_t *opts, const wchar_t *path) +sentry_options_set_handler_pathw(sentry_options_t *opts, const wchar_t *path) +{ + size_t path_len = path ? wcslen(path) : 0; + sentry_options_set_handler_pathw_n(opts, path, path_len); +} + +void +sentry_options_set_database_pathw_n( + sentry_options_t *opts, const wchar_t *path, size_t path_len) { sentry__path_free(opts->database_path); - opts->database_path = sentry__path_from_wstr(path); + opts->database_path = sentry__path_from_wstr_n(path, path_len); +} + +void +sentry_options_set_database_pathw(sentry_options_t *opts, const wchar_t *path) +{ + size_t path_len = path ? wcslen(path) : 0; + sentry_options_set_database_pathw_n(opts, path, path_len); } #endif diff --git a/shared/sentry/src/sentry_options.h b/shared/sentry/src/src/sentry_options.h similarity index 97% rename from shared/sentry/src/sentry_options.h rename to shared/sentry/src/src/sentry_options.h index c6b3c10dc..060b17f70 100644 --- a/shared/sentry/src/sentry_options.h +++ b/shared/sentry/src/src/sentry_options.h @@ -38,6 +38,8 @@ typedef struct sentry_options_s { char *http_proxy; char *ca_certs; char *transport_thread_name; + char *sdk_name; + char *user_agent; sentry_path_t *database_path; sentry_path_t *handler_path; sentry_logger_t logger; diff --git a/shared/sentry/src/sentry_os.c b/shared/sentry/src/src/sentry_os.c similarity index 100% rename from shared/sentry/src/sentry_os.c rename to shared/sentry/src/src/sentry_os.c diff --git a/shared/sentry/src/sentry_os.h b/shared/sentry/src/src/sentry_os.h similarity index 100% rename from shared/sentry/src/sentry_os.h rename to shared/sentry/src/src/sentry_os.h diff --git a/shared/sentry/src/sentry_path.h b/shared/sentry/src/src/sentry_path.h similarity index 97% rename from shared/sentry/src/sentry_path.h rename to shared/sentry/src/src/sentry_path.h index 8cedd1d21..02e42d5fe 100644 --- a/shared/sentry/src/sentry_path.h +++ b/shared/sentry/src/src/sentry_path.h @@ -53,6 +53,7 @@ sentry_path_t *sentry__path_dir(const sentry_path_t *path); * Create a new path from the given string. */ sentry_path_t *sentry__path_from_str(const char *s); +sentry_path_t *sentry__path_from_str_n(const char *s, size_t s_len); /** * Create a new path from the given string. @@ -205,6 +206,7 @@ void sentry__filelock_free(sentry_filelock_t *lock); * Create a new path from a Wide String. */ sentry_path_t *sentry__path_from_wstr(const wchar_t *s); +sentry_path_t *sentry__path_from_wstr_n(const wchar_t *s, size_t s_len); /** * Create another path by appending a new path segment. diff --git a/shared/sentry/src/sentry_random.c b/shared/sentry/src/src/sentry_random.c similarity index 100% rename from shared/sentry/src/sentry_random.c rename to shared/sentry/src/src/sentry_random.c diff --git a/shared/sentry/src/sentry_random.h b/shared/sentry/src/src/sentry_random.h similarity index 100% rename from shared/sentry/src/sentry_random.h rename to shared/sentry/src/src/sentry_random.h diff --git a/shared/sentry/src/sentry_ratelimiter.c b/shared/sentry/src/src/sentry_ratelimiter.c similarity index 100% rename from shared/sentry/src/sentry_ratelimiter.c rename to shared/sentry/src/src/sentry_ratelimiter.c diff --git a/shared/sentry/src/sentry_ratelimiter.h b/shared/sentry/src/src/sentry_ratelimiter.h similarity index 100% rename from shared/sentry/src/sentry_ratelimiter.h rename to shared/sentry/src/src/sentry_ratelimiter.h diff --git a/shared/sentry/src/sentry_scope.c b/shared/sentry/src/src/sentry_scope.c similarity index 97% rename from shared/sentry/src/sentry_scope.c rename to shared/sentry/src/src/sentry_scope.c index 321b8f41e..ba246ab2e 100644 --- a/shared/sentry/src/sentry_scope.c +++ b/shared/sentry/src/src/sentry_scope.c @@ -29,8 +29,9 @@ get_client_sdk(void) { sentry_value_t client_sdk = sentry_value_new_object(); - sentry_value_t name = sentry_value_new_string(SENTRY_SDK_NAME); - sentry_value_set_by_key(client_sdk, "name", name); + // the SDK is not initialized yet, fallback to build-time value + sentry_value_t sdk_name = sentry_value_new_string(SENTRY_SDK_NAME); + sentry_value_set_by_key(client_sdk, "name", sdk_name); sentry_value_t version = sentry_value_new_string(SENTRY_SDK_VERSION); sentry_value_set_by_key(client_sdk, "version", version); @@ -54,7 +55,6 @@ get_client_sdk(void) sentry_value_set_by_key(client_sdk, "integrations", integrations); #endif - sentry_value_freeze(client_sdk); return client_sdk; } @@ -118,7 +118,7 @@ sentry__scope_unlock(void) } void -sentry__scope_flush_unlock() +sentry__scope_flush_unlock(void) { sentry__scope_unlock(); SENTRY_WITH_OPTIONS (options) { @@ -245,7 +245,7 @@ sentry__get_span_or_transaction(const sentry_scope_t *scope) #ifdef SENTRY_UNITTEST sentry_value_t -sentry__scope_get_span_or_transaction() +sentry__scope_get_span_or_transaction(void) { SENTRY_WITH_SCOPE (scope) { return sentry__get_span_or_transaction(scope); diff --git a/shared/sentry/src/sentry_scope.h b/shared/sentry/src/src/sentry_scope.h similarity index 96% rename from shared/sentry/src/sentry_scope.h rename to shared/sentry/src/src/sentry_scope.h index 207b1a995..5b2ba5fe6 100644 --- a/shared/sentry/src/sentry_scope.h +++ b/shared/sentry/src/src/sentry_scope.h @@ -68,7 +68,7 @@ void sentry__scope_cleanup(void); * This function must be called while holding the scope lock, and it will be * unlocked internally. */ -void sentry__scope_flush_unlock(); +void sentry__scope_flush_unlock(void); /** * This will merge the requested data which is in the given `scope` to the given @@ -98,5 +98,5 @@ void sentry__scope_apply_to_event(const sentry_scope_t *scope, // this is only used in unit tests #ifdef SENTRY_UNITTEST -sentry_value_t sentry__scope_get_span_or_transaction(); +sentry_value_t sentry__scope_get_span_or_transaction(void); #endif diff --git a/shared/sentry/src/sentry_session.c b/shared/sentry/src/src/sentry_session.c similarity index 95% rename from shared/sentry/src/sentry_session.c rename to shared/sentry/src/src/sentry_session.c index 1aa7dc796..e782d385f 100644 --- a/shared/sentry/src/sentry_session.c +++ b/shared/sentry/src/src/sentry_session.c @@ -265,6 +265,17 @@ sentry__end_current_session_with_status(sentry_session_status_t status) return session; } +static void +sentry__capture_session(sentry_session_t *session) +{ + sentry_envelope_t *envelope = sentry__envelope_new(); + sentry__envelope_add_session(envelope, session); + + SENTRY_WITH_OPTIONS (options) { + sentry__capture_envelope(options->transport, envelope); + } +} + void sentry_end_session(void) { @@ -273,13 +284,20 @@ sentry_end_session(void) return; } - sentry_envelope_t *envelope = sentry__envelope_new(); - sentry__envelope_add_session(envelope, session); + sentry__capture_session(session); sentry__session_free(session); +} - SENTRY_WITH_OPTIONS (options) { - sentry__capture_envelope(options->transport, envelope); +void +sentry_end_session_with_status(sentry_session_status_t status) +{ + sentry_session_t *session = sentry__end_current_session_with_status(status); + if (!session) { + return; } + + sentry__capture_session(session); + sentry__session_free(session); } void diff --git a/shared/sentry/src/sentry_session.h b/shared/sentry/src/src/sentry_session.h similarity index 90% rename from shared/sentry/src/sentry_session.h rename to shared/sentry/src/src/sentry_session.h index 5ba036cbd..2a18edb4c 100644 --- a/shared/sentry/src/sentry_session.h +++ b/shared/sentry/src/src/sentry_session.h @@ -8,13 +8,6 @@ struct sentry_jsonwriter_s; -typedef enum { - SENTRY_SESSION_STATUS_OK, - SENTRY_SESSION_STATUS_CRASHED, - SENTRY_SESSION_STATUS_ABNORMAL, - SENTRY_SESSION_STATUS_EXITED, -} sentry_session_status_t; - /** * This represents a session, with the number of errors, a status and other * metadata. diff --git a/shared/sentry/src/sentry_slice.c b/shared/sentry/src/src/sentry_slice.c similarity index 96% rename from shared/sentry/src/sentry_slice.c rename to shared/sentry/src/src/sentry_slice.c index 79894b7de..0f68311b2 100644 --- a/shared/sentry/src/sentry_slice.c +++ b/shared/sentry/src/src/sentry_slice.c @@ -15,7 +15,7 @@ sentry__slice_from_str(const char *str) char * sentry__slice_to_owned(sentry_slice_t slice) { - return sentry__string_clonen(slice.ptr, slice.len); + return sentry__string_clone_n_unchecked(slice.ptr, slice.len); } bool diff --git a/shared/sentry/src/sentry_slice.h b/shared/sentry/src/src/sentry_slice.h similarity index 100% rename from shared/sentry/src/sentry_slice.h rename to shared/sentry/src/src/sentry_slice.h diff --git a/shared/sentry/src/sentry_string.c b/shared/sentry/src/src/sentry_string.c similarity index 100% rename from shared/sentry/src/sentry_string.c rename to shared/sentry/src/src/sentry_string.c diff --git a/shared/sentry/src/sentry_string.h b/shared/sentry/src/src/sentry_string.h similarity index 85% rename from shared/sentry/src/sentry_string.h rename to shared/sentry/src/src/sentry_string.h index 255d55d17..95e1e4f61 100644 --- a/shared/sentry/src/sentry_string.h +++ b/shared/sentry/src/src/sentry_string.h @@ -110,10 +110,11 @@ size_t sentry__stringbuilder_len(const sentry_stringbuilder_t *sb); void sentry__stringbuilder_set_len(sentry_stringbuilder_t *sb, size_t len); /** - * Duplicates a zero terminated string with a length limit. + * Duplicates a zero terminated string with a length limit. Does not check + * if `str` is NULL. */ static inline char * -sentry__string_clonen(const char *str, size_t n) +sentry__string_clone_n_unchecked(const char *str, size_t n) { size_t len = n + 1; char *rv = (char *)sentry_malloc(len); @@ -124,13 +125,32 @@ sentry__string_clonen(const char *str, size_t n) return rv; } +/** + * Duplicates a ptr/len string into a zero terminated string. + */ +static inline char * +sentry__string_clone_n(const char *str, size_t n) +{ + return str ? sentry__string_clone_n_unchecked(str, n) : NULL; +} + /** * Duplicates a zero terminated string. */ static inline char * sentry__string_clone(const char *str) { - return str ? sentry__string_clonen(str, strlen(str)) : NULL; + return str ? sentry__string_clone_n_unchecked(str, strlen(str)) : NULL; +} + +static inline char * +sentry__string_clone_max_n(const char *str, size_t str_len, size_t max_len) +{ + if (!str) { + return NULL; + } + size_t min_len = str_len < max_len ? str_len : max_len; + return sentry__string_clone_n_unchecked(str, min_len); } /** diff --git a/shared/sentry/src/sentry_symbolizer.h b/shared/sentry/src/src/sentry_symbolizer.h similarity index 100% rename from shared/sentry/src/sentry_symbolizer.h rename to shared/sentry/src/src/sentry_symbolizer.h diff --git a/shared/sentry/src/sentry_sync.c b/shared/sentry/src/src/sentry_sync.c similarity index 96% rename from shared/sentry/src/sentry_sync.c rename to shared/sentry/src/src/sentry_sync.c index a6b6380a1..bcc44b374 100644 --- a/shared/sentry/src/sentry_sync.c +++ b/shared/sentry/src/src/sentry_sync.c @@ -20,6 +20,12 @@ typedef struct { } THREADNAME_INFO; # pragma pack(pop) +sentry_threadid_t +sentry__thread_get_current_threadid(void) +{ + return GetCurrentThread(); +} + int sentry__thread_setname(sentry_threadid_t thread_id, const char *thread_name) { @@ -61,6 +67,12 @@ sentry__thread_setname(sentry_threadid_t thread_id, const char *thread_name) return 0; } #else +sentry_threadid_t +sentry__thread_get_current_threadid(void) +{ + return pthread_self(); +} + int sentry__thread_setname(sentry_threadid_t thread_id, const char *thread_name) { @@ -218,7 +230,12 @@ worker_thread(void *data) // should be called inside thread itself because of MSVC issues and mac // https://randomascii.wordpress.com/2015/10/26/thread-naming-in-windows-time-for-something-better/ - if (sentry__thread_setname(bgw->thread_id, bgw->thread_name)) { + // Additionally, `bgw->thread_id` cannot be used reliably because it is + // subject to initialization race condition: current thread might be running + // before `bgw->thread_id` is initialized in the thread that started the + // background worker. + if (sentry__thread_setname( + sentry__thread_get_current_threadid(), bgw->thread_name)) { SENTRY_WARN("failed to set background worker thread name"); } diff --git a/shared/sentry/src/sentry_sync.h b/shared/sentry/src/src/sentry_sync.h similarity index 97% rename from shared/sentry/src/sentry_sync.h rename to shared/sentry/src/src/sentry_sync.h index 11915536a..73531235b 100644 --- a/shared/sentry/src/sentry_sync.h +++ b/shared/sentry/src/src/sentry_sync.h @@ -13,7 +13,7 @@ # define THREAD_FUNCTION_API #endif -#if defined(__MINGW32__) && !defined(__MINGW64__) +#if defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__clang__) # define UNSIGNED_MINGW unsigned #else # define UNSIGNED_MINGW @@ -167,7 +167,10 @@ typedef HANDLE sentry_threadid_t; typedef struct sentry__winmutex_s sentry_mutex_t; # define SENTRY__MUTEX_INIT \ { \ - INIT_ONCE_STATIC_INIT, { 0 } \ + INIT_ONCE_STATIC_INIT, \ + { \ + 0 \ + } \ } # define sentry__mutex_init(Lock) sentry__winmutex_init(Lock) # define sentry__mutex_lock(Lock) sentry__winmutex_lock(Lock) diff --git a/shared/sentry/src/sentry_tracing.c b/shared/sentry/src/src/sentry_tracing.c similarity index 68% rename from shared/sentry/src/sentry_tracing.c rename to shared/sentry/src/src/sentry_tracing.c index 9b9139a17..b32c30496 100644 --- a/shared/sentry/src/sentry_tracing.c +++ b/shared/sentry/src/src/sentry_tracing.c @@ -1,17 +1,20 @@ #include "sentry_tracing.h" +#include "sentry.h" #include "sentry_alloc.h" #include "sentry_logger.h" +#include "sentry_slice.h" #include "sentry_string.h" #include "sentry_utils.h" #include "sentry_value.h" #include sentry_value_t -sentry__value_new_span(sentry_value_t parent, const char *operation) +sentry__value_new_span_n(sentry_value_t parent, sentry_slice_t operation) { sentry_value_t span = sentry_value_new_object(); - sentry_value_set_by_key(span, "op", sentry_value_new_string(operation)); + sentry_value_set_by_key( + span, "op", sentry_value_new_string_n(operation.ptr, operation.len)); sentry_uuid_t span_id = sentry_uuid_new_v4(); sentry_value_set_by_key( @@ -32,30 +35,34 @@ sentry__value_new_span(sentry_value_t parent, const char *operation) } sentry_value_t -sentry__value_transaction_context_new(const char *name, const char *operation) +sentry__value_transaction_context_new_n( + sentry_slice_t name, sentry_slice_t operation) { sentry_value_t transaction_context - = sentry__value_new_span(sentry_value_new_null(), operation); + = sentry__value_new_span_n(sentry_value_new_null(), operation); sentry_uuid_t trace_id = sentry_uuid_new_v4(); sentry_value_set_by_key(transaction_context, "trace_id", sentry__value_new_internal_uuid(&trace_id)); - sentry_value_set_by_key( - transaction_context, "transaction", sentry_value_new_string(name)); + sentry_value_set_by_key(transaction_context, "transaction", + sentry_value_new_string_n(name.ptr, name.len)); return transaction_context; } sentry_transaction_context_t * -sentry_transaction_context_new(const char *name, const char *operation) +sentry_transaction_context_new_n(const char *name, size_t name_len, + const char *operation, size_t operation_len) { sentry_transaction_context_t *tx_cxt = SENTRY_MAKE(sentry_transaction_context_t); if (!tx_cxt) { return NULL; } - tx_cxt->inner = sentry__value_transaction_context_new(name, operation); + tx_cxt->inner = sentry__value_transaction_context_new_n( + (sentry_slice_t) { name, name_len }, + (sentry_slice_t) { operation, operation_len }); if (sentry_value_is_null(tx_cxt->inner)) { sentry_free(tx_cxt); @@ -65,6 +72,16 @@ sentry_transaction_context_new(const char *name, const char *operation) return tx_cxt; } +sentry_transaction_context_t * +sentry_transaction_context_new(const char *name, const char *operation) +{ + size_t name_len = name ? strlen(name) : 0; + size_t operation_len = operation ? strlen(operation) : 0; + + return sentry_transaction_context_new_n( + name, name_len, operation, operation_len); +} + void sentry__transaction_context_free(sentry_transaction_context_t *tx_cxt) { @@ -76,7 +93,7 @@ sentry__transaction_context_free(sentry_transaction_context_t *tx_cxt) sentry_free(tx_cxt); } else { sentry_value_decref(tx_cxt->inner); - }; + } } void @@ -89,6 +106,16 @@ sentry_transaction_context_set_name( } } +void +sentry_transaction_context_set_name_n( + sentry_transaction_context_t *tx_cxt, const char *name, size_t name_len) +{ + if (tx_cxt) { + sentry_value_set_by_key(tx_cxt->inner, "transaction", + sentry_value_new_string_n(name, name_len)); + } +} + void sentry_transaction_context_set_operation( sentry_transaction_context_t *tx_cxt, const char *operation) @@ -99,6 +126,16 @@ sentry_transaction_context_set_operation( } } +void +sentry_transaction_context_set_operation_n(sentry_transaction_context_t *tx_cxt, + const char *operation, size_t operation_len) +{ + if (tx_cxt) { + sentry_value_set_by_key(tx_cxt->inner, "op", + sentry_value_new_string_n(operation, operation_len)); + } +} + void sentry_transaction_context_set_sampled( sentry_transaction_context_t *tx_cxt, int sampled) @@ -118,8 +155,9 @@ sentry_transaction_context_remove_sampled(sentry_transaction_context_t *tx_cxt) } void -sentry_transaction_context_update_from_header( - sentry_transaction_context_t *tx_cxt, const char *key, const char *value) +sentry_transaction_context_update_from_header_n( + sentry_transaction_context_t *tx_cxt, const char *key, size_t key_len, + const char *value, size_t value_len) { if (!tx_cxt) { return; @@ -127,7 +165,11 @@ sentry_transaction_context_update_from_header( // do case-insensitive header key comparison const char sentry_trace[] = "sentry-trace"; - for (size_t i = 0; i < sizeof(sentry_trace); i++) { + const size_t sentry_trace_len = sizeof(sentry_trace) - 1; + if (key_len != sentry_trace_len) { + return; + } + for (size_t i = 0; i < sentry_trace_len; i++) { if (tolower(key[i]) != sentry_trace[i]) { return; } @@ -136,7 +178,7 @@ sentry_transaction_context_update_from_header( // https://develop.sentry.dev/sdk/performance/#header-sentry-trace // sentry-trace = traceid-spanid(-sampled)? const char *trace_id_start = value; - const char *trace_id_end = strchr(trace_id_start, '-'); + const char *trace_id_end = memchr(trace_id_start, '-', value_len); if (!trace_id_end) { return; } @@ -144,7 +186,7 @@ sentry_transaction_context_update_from_header( sentry_value_t inner = tx_cxt->inner; char *s - = sentry__string_clonen(trace_id_start, trace_id_end - trace_id_start); + = sentry__string_clone_n(trace_id_start, trace_id_end - trace_id_start); sentry_value_t trace_id = sentry__value_new_string_owned(s); sentry_value_set_by_key(inner, "trace_id", trace_id); @@ -158,7 +200,7 @@ sentry_transaction_context_update_from_header( } // else: we have a sampled flag - s = sentry__string_clonen(span_id_start, span_id_end - span_id_start); + s = sentry__string_clone_n(span_id_start, span_id_end - span_id_start); sentry_value_t parent_span_id = sentry__value_new_string_owned(s); sentry_value_set_by_key(inner, "parent_span_id", parent_span_id); @@ -166,6 +208,17 @@ sentry_transaction_context_update_from_header( sentry_value_set_by_key(inner, "sampled", sentry_value_new_bool(sampled)); } +void +sentry_transaction_context_update_from_header( + sentry_transaction_context_t *tx_cxt, const char *key, const char *value) +{ + size_t key_len = key ? strlen(key) : 0; + size_t value_len = value ? strlen(value) : 0; + + sentry_transaction_context_update_from_header_n( + tx_cxt, key, key_len, value, value_len); +} + sentry_transaction_t * sentry__transaction_new(sentry_value_t inner) { @@ -203,7 +256,7 @@ sentry__transaction_decref(sentry_transaction_t *tx) sentry_free(tx); } else { sentry_value_decref(tx->inner); - }; + } } void @@ -227,7 +280,7 @@ sentry__span_decref(sentry_span_t *span) sentry_free(span); } else { sentry_value_decref(span->inner); - }; + } } sentry_span_t * @@ -251,8 +304,8 @@ sentry__span_new(sentry_transaction_t *tx, sentry_value_t inner) } sentry_value_t -sentry__value_span_new( - size_t max_spans, sentry_value_t parent, char *operation, char *description) +sentry__value_span_new_n(size_t max_spans, sentry_value_t parent, + sentry_slice_t operation, sentry_slice_t description) { if (!sentry_value_is_null(sentry_value_get_by_key(parent, "timestamp"))) { SENTRY_DEBUG("span's parent is already finished, not creating span"); @@ -269,9 +322,9 @@ sentry__value_span_new( goto fail; } - sentry_value_t child = sentry__value_new_span(parent, operation); - sentry_value_set_by_key( - child, "description", sentry_value_new_string(description)); + sentry_value_t child = sentry__value_new_span_n(parent, operation); + sentry_value_set_by_key(child, "description", + sentry_value_new_string_n(description.ptr, description.len)); sentry_value_set_by_key(child, "start_timestamp", sentry__value_new_string_owned( sentry__msec_time_to_iso8601(sentry__msec_time()))); @@ -281,6 +334,17 @@ sentry__value_span_new( return sentry_value_new_null(); } +sentry_value_t +sentry__value_span_new(size_t max_spans, sentry_value_t parent, + const char *operation, const char *description) +{ + const size_t operation_len = operation ? strlen(operation) : 0; + const size_t description_len = description ? strlen(description) : 0; + return sentry__value_span_new_n(max_spans, parent, + (sentry_slice_t) { operation, operation_len }, + (sentry_slice_t) { description, description_len }); +} + sentry_value_t sentry__value_get_trace_context(sentry_value_t span) { @@ -326,21 +390,37 @@ sentry_transaction_set_name(sentry_transaction_t *tx, const char *name) } } +void +sentry_transaction_set_name_n( + sentry_transaction_t *tx, const char *name, size_t name_len) +{ + if (tx) { + sentry_value_set_by_key(tx->inner, "transaction", + sentry_value_new_string_n(name, name_len)); + } +} + static void -set_tag(sentry_value_t item, const char *tag, const char *value) +set_tag_n(sentry_value_t item, sentry_slice_t tag, sentry_slice_t value) { sentry_value_t tags = sentry_value_get_by_key(item, "tags"); if (sentry_value_is_null(tags)) { tags = sentry_value_new_object(); sentry_value_set_by_key(item, "tags", tags); } + char *s = sentry__string_clone_max_n(value.ptr, value.len, 200); + sentry_value_t tag_value + = s ? sentry__value_new_string_owned(s) : sentry_value_new_null(); + sentry_value_set_by_key_n(tags, tag.ptr, tag.len, tag_value); +} - char *s = sentry__string_clonen(value, 200); - if (s) { - sentry_value_set_by_key(tags, tag, sentry__value_new_string_owned(s)); - } else { - sentry_value_set_by_key(tags, tag, sentry_value_new_null()); - } +static void +set_tag(sentry_value_t item, const char *tag, const char *value) +{ + const size_t tag_len = tag ? strlen(tag) : 0; + const size_t value_len = value ? strlen(value) : 0; + set_tag_n(item, (sentry_slice_t) { tag, tag_len }, + (sentry_slice_t) { value, value_len }); } void @@ -352,6 +432,16 @@ sentry_transaction_set_tag( } } +void +sentry_transaction_set_tag_n(sentry_transaction_t *tx, const char *tag, + size_t tag_len, const char *value, size_t value_len) +{ + if (tx) { + set_tag_n(tx->inner, (sentry_slice_t) { tag, tag_len }, + (sentry_slice_t) { value, value_len }); + } +} + void sentry_span_set_tag(sentry_span_t *span, const char *tag, const char *value) { @@ -360,6 +450,16 @@ sentry_span_set_tag(sentry_span_t *span, const char *tag, const char *value) } } +void +sentry_span_set_tag_n(sentry_span_t *span, const char *tag, size_t tag_len, + const char *value, size_t value_len) +{ + if (span) { + set_tag_n(span->inner, (sentry_slice_t) { tag, tag_len }, + (sentry_slice_t) { value, value_len }); + } +} + static void remove_tag(sentry_value_t item, const char *tag) { @@ -369,6 +469,15 @@ remove_tag(sentry_value_t item, const char *tag) } } +static void +remove_tag_n(sentry_value_t item, const char *tag, size_t tag_len) +{ + sentry_value_t tags = sentry_value_get_by_key(item, "tags"); + if (!sentry_value_is_null(tags)) { + sentry_value_remove_by_key_n(tags, tag, tag_len); + } +} + void sentry_transaction_remove_tag(sentry_transaction_t *tx, const char *tag) { @@ -377,6 +486,15 @@ sentry_transaction_remove_tag(sentry_transaction_t *tx, const char *tag) } } +void +sentry_transaction_remove_tag_n( + sentry_transaction_t *tx, const char *tag, size_t tag_len) +{ + if (tx) { + remove_tag_n(tx->inner, tag, tag_len); + } +} + void sentry_span_remove_tag(sentry_span_t *span, const char *tag) { @@ -385,6 +503,14 @@ sentry_span_remove_tag(sentry_span_t *span, const char *tag) } } +void +sentry_span_remove_tag_n(sentry_span_t *span, const char *tag, size_t tag_len) +{ + if (span) { + remove_tag_n(span->inner, tag, tag_len); + } +} + static void set_data(sentry_value_t item, const char *key, sentry_value_t value) { @@ -396,6 +522,18 @@ set_data(sentry_value_t item, const char *key, sentry_value_t value) sentry_value_set_by_key(data, key, value); } +static void +set_data_n( + sentry_value_t item, const char *key, size_t key_len, sentry_value_t value) +{ + sentry_value_t data = sentry_value_get_by_key(item, "data"); + if (sentry_value_is_null(data)) { + data = sentry_value_new_object(); + sentry_value_set_by_key(item, "data", data); + } + sentry_value_set_by_key_n(data, key, key_len, value); +} + void sentry_transaction_set_data( sentry_transaction_t *tx, const char *key, sentry_value_t value) @@ -405,6 +543,15 @@ sentry_transaction_set_data( } } +void +sentry_transaction_set_data_n(sentry_transaction_t *tx, const char *key, + size_t key_len, sentry_value_t value) +{ + if (tx) { + set_data_n(tx->inner, key, key_len, value); + } +} + void sentry_span_set_data(sentry_span_t *span, const char *key, sentry_value_t value) { @@ -413,6 +560,15 @@ sentry_span_set_data(sentry_span_t *span, const char *key, sentry_value_t value) } } +void +sentry_span_set_data_n( + sentry_span_t *span, const char *key, size_t key_len, sentry_value_t value) +{ + if (span) { + set_data_n(span->inner, key, key_len, value); + } +} + static void remove_data(sentry_value_t item, const char *key) { @@ -422,6 +578,15 @@ remove_data(sentry_value_t item, const char *key) } } +static void +remove_data_n(sentry_value_t item, const char *key, size_t key_len) +{ + sentry_value_t data = sentry_value_get_by_key(item, "data"); + if (!sentry_value_is_null(data)) { + sentry_value_remove_by_key_n(data, key, key_len); + } +} + void sentry_transaction_remove_data(sentry_transaction_t *tx, const char *key) { @@ -430,6 +595,15 @@ sentry_transaction_remove_data(sentry_transaction_t *tx, const char *key) } } +void +sentry_transaction_remove_data_n( + sentry_transaction_t *tx, const char *key, size_t key_len) +{ + if (tx) { + remove_data_n(tx->inner, key, key_len); + } +} + void sentry_span_remove_data(sentry_span_t *span, const char *key) { @@ -438,6 +612,14 @@ sentry_span_remove_data(sentry_span_t *span, const char *key) } } +void +sentry_span_remove_data_n(sentry_span_t *span, const char *key, size_t key_len) +{ + if (span) { + remove_data_n(span->inner, key, key_len); + } +} + sentry_value_t sentry_status_to_string(sentry_span_status_t status) { @@ -481,7 +663,7 @@ sentry_status_to_string(sentry_span_status_t status) } } -void +static void set_status(sentry_value_t item, sentry_span_status_t status) { sentry_value_set_by_key(item, "status", sentry_status_to_string(status)); diff --git a/shared/sentry/src/sentry_tracing.h b/shared/sentry/src/src/sentry_tracing.h similarity index 86% rename from shared/sentry/src/sentry_tracing.h rename to shared/sentry/src/src/sentry_tracing.h index e04e5ee2f..d312b1cd4 100644 --- a/shared/sentry/src/sentry_tracing.h +++ b/shared/sentry/src/src/sentry_tracing.h @@ -1,6 +1,7 @@ #ifndef SENTRY_TRACING_H_INCLUDED #define SENTRY_TRACING_H_INCLUDED +#include "sentry_slice.h" #include "sentry_value.h" /** @@ -36,7 +37,10 @@ void sentry__span_incref(sentry_span_t *span); void sentry__span_decref(sentry_span_t *span); sentry_value_t sentry__value_span_new(size_t max_spans, sentry_value_t parent, - char *operation, char *description); + const char *operation, const char *description); +sentry_value_t sentry__value_span_new_n(size_t max_spans, sentry_value_t parent, + sentry_slice_t operation, sentry_slice_t description); + sentry_span_t *sentry__span_new( sentry_transaction_t *parent_tx, sentry_value_t inner); diff --git a/shared/sentry/src/sentry_transport.c b/shared/sentry/src/src/sentry_transport.c similarity index 97% rename from shared/sentry/src/sentry_transport.c rename to shared/sentry/src/src/sentry_transport.c index 4ff909e03..ea62c5620 100644 --- a/shared/sentry/src/sentry_transport.c +++ b/shared/sentry/src/src/sentry_transport.c @@ -150,7 +150,8 @@ sentry_transport_free(sentry_transport_t *transport) sentry_prepared_http_request_t * sentry__prepare_http_request(sentry_envelope_t *envelope, - const sentry_dsn_t *dsn, const sentry_rate_limiter_t *rl) + const sentry_dsn_t *dsn, const sentry_rate_limiter_t *rl, + const char *user_agent) { if (!dsn || !dsn->is_valid) { return NULL; @@ -189,7 +190,7 @@ sentry__prepare_http_request(sentry_envelope_t *envelope, sentry_prepared_http_header_t *h; h = &req->headers[req->headers_len++]; h->key = "x-sentry-auth"; - h->value = sentry__dsn_get_auth_header(dsn); + h->value = sentry__dsn_get_auth_header(dsn, user_agent); h = &req->headers[req->headers_len++]; h->key = "content-type"; diff --git a/shared/sentry/src/sentry_transport.h b/shared/sentry/src/src/sentry_transport.h similarity index 97% rename from shared/sentry/src/sentry_transport.h rename to shared/sentry/src/src/sentry_transport.h index f30788107..e29dc09f5 100644 --- a/shared/sentry/src/sentry_transport.h +++ b/shared/sentry/src/src/sentry_transport.h @@ -82,7 +82,7 @@ typedef struct sentry_prepared_http_request_s { */ sentry_prepared_http_request_t *sentry__prepare_http_request( sentry_envelope_t *envelope, const sentry_dsn_t *dsn, - const sentry_rate_limiter_t *rl); + const sentry_rate_limiter_t *rl, const char *user_agent); /** * Free a previously allocated HTTP request. diff --git a/shared/sentry/src/sentry_unix_pageallocator.c b/shared/sentry/src/src/sentry_unix_pageallocator.c similarity index 100% rename from shared/sentry/src/sentry_unix_pageallocator.c rename to shared/sentry/src/src/sentry_unix_pageallocator.c diff --git a/shared/sentry/src/sentry_unix_pageallocator.h b/shared/sentry/src/src/sentry_unix_pageallocator.h similarity index 100% rename from shared/sentry/src/sentry_unix_pageallocator.h rename to shared/sentry/src/src/sentry_unix_pageallocator.h diff --git a/shared/sentry/src/sentry_unix_spinlock.h b/shared/sentry/src/src/sentry_unix_spinlock.h similarity index 100% rename from shared/sentry/src/sentry_unix_spinlock.h rename to shared/sentry/src/src/sentry_unix_spinlock.h diff --git a/shared/sentry/src/sentry_utils.c b/shared/sentry/src/src/sentry_utils.c similarity index 86% rename from shared/sentry/src/sentry_utils.c rename to shared/sentry/src/src/sentry_utils.c index 569fa0833..45f32081e 100644 --- a/shared/sentry/src/sentry_utils.c +++ b/shared/sentry/src/src/sentry_utils.c @@ -4,7 +4,6 @@ #include "sentry_boot.h" #include "sentry_alloc.h" -#include "sentry_core.h" #include "sentry_string.h" #include "sentry_sync.h" #include "sentry_utils.h" @@ -64,7 +63,7 @@ sentry__url_parse(sentry_url_t *url_out, const char *url) if (!tmp) { goto error; } - url_out->scheme = sentry__string_clonen(ptr, tmp - ptr); + url_out->scheme = sentry__string_clone_n_unchecked(ptr, tmp - ptr); if (!url_out->scheme || !is_scheme_valid(url_out->scheme)) { goto error; @@ -97,13 +96,14 @@ sentry__url_parse(sentry_url_t *url_out, const char *url) tmp = ptr; if (has_username) { SKIP_WHILE_NOT2(tmp, '@', ':'); - url_out->username = sentry__string_clonen(ptr, tmp - ptr); + url_out->username = sentry__string_clone_n_unchecked(ptr, tmp - ptr); ptr = tmp; if (*ptr == ':') { ptr++; tmp = ptr; SKIP_WHILE_NOT(tmp, '@'); - url_out->password = sentry__string_clonen(ptr, tmp - ptr); + url_out->password + = sentry__string_clone_n_unchecked(ptr, tmp - ptr); ptr = tmp; } if (*ptr != '@') { @@ -126,7 +126,7 @@ sentry__url_parse(sentry_url_t *url_out, const char *url) tmp++; } - url_out->host = sentry__string_clonen(ptr, tmp - ptr); + url_out->host = sentry__string_clone_n_unchecked(ptr, tmp - ptr); /* port */ ptr = tmp; @@ -134,7 +134,7 @@ sentry__url_parse(sentry_url_t *url_out, const char *url) ptr++; tmp = ptr; SKIP_WHILE_NOT(tmp, '/'); - aux_buf = sentry__string_clonen(ptr, tmp - ptr); + aux_buf = sentry__string_clone_n_unchecked(ptr, tmp - ptr); char *end; url_out->port = (int)strtol(aux_buf, &end, 10); if (end != aux_buf + strlen(aux_buf)) { @@ -157,7 +157,7 @@ sentry__url_parse(sentry_url_t *url_out, const char *url) /* path */ tmp = ptr; SKIP_WHILE_NOT2(tmp, '#', '?'); - url_out->path = sentry__string_clonen(ptr, tmp - ptr); + url_out->path = sentry__string_clone_n_unchecked(ptr, tmp - ptr); ptr = tmp; /* query */ @@ -165,7 +165,7 @@ sentry__url_parse(sentry_url_t *url_out, const char *url) ptr++; tmp = ptr; SKIP_WHILE_NOT(tmp, '#'); - url_out->query = sentry__string_clonen(ptr, tmp - ptr); + url_out->query = sentry__string_clone_n_unchecked(ptr, tmp - ptr); ptr = tmp; } @@ -174,7 +174,7 @@ sentry__url_parse(sentry_url_t *url_out, const char *url) ptr++; tmp = ptr; SKIP_WHILE_NOT(tmp, 0); - url_out->fragment = sentry__string_clonen(ptr, tmp - ptr); + url_out->fragment = sentry__string_clone_n_unchecked(ptr, tmp - ptr); } if (url_out->port == 0) { @@ -213,7 +213,7 @@ sentry__url_cleanup(sentry_url_t *url) } sentry_dsn_t * -sentry__dsn_new(const char *raw_dsn) +sentry__dsn_new_n(const char *raw_dsn, size_t raw_dsn_len) { sentry_url_t url; memset(&url, 0, sizeof(sentry_url_t)); @@ -227,7 +227,7 @@ sentry__dsn_new(const char *raw_dsn) memset(dsn, 0, sizeof(sentry_dsn_t)); dsn->refcount = 1; - dsn->raw = sentry__string_clone(raw_dsn); + dsn->raw = sentry__string_clone_n(raw_dsn, raw_dsn_len); if (!dsn->raw || !dsn->raw[0] || sentry__url_parse(&url, dsn->raw) != 0) { goto exit; } @@ -274,6 +274,16 @@ sentry__dsn_new(const char *raw_dsn) return dsn; } +sentry_dsn_t * +sentry__dsn_new(const char *raw_dsn) +{ + if (!raw_dsn) { + return NULL; + } + + return sentry__dsn_new_n(raw_dsn, strlen(raw_dsn)); +} + sentry_dsn_t * sentry__dsn_incref(sentry_dsn_t *dsn) { @@ -302,7 +312,7 @@ sentry__dsn_decref(sentry_dsn_t *dsn) } char * -sentry__dsn_get_auth_header(const sentry_dsn_t *dsn) +sentry__dsn_get_auth_header(const sentry_dsn_t *dsn, const char *user_agent) { if (!dsn || !dsn->is_valid) { return NULL; @@ -311,8 +321,14 @@ sentry__dsn_get_auth_header(const sentry_dsn_t *dsn) sentry__stringbuilder_init(&sb); sentry__stringbuilder_append(&sb, "Sentry sentry_key="); sentry__stringbuilder_append(&sb, dsn->public_key); - sentry__stringbuilder_append( - &sb, ", sentry_version=7, sentry_client=" SENTRY_SDK_USER_AGENT); + sentry__stringbuilder_append(&sb, ", sentry_version=7"); + + sentry__stringbuilder_append(&sb, ", sentry_client="); + if (user_agent) { + sentry__stringbuilder_append(&sb, user_agent); + } else { + sentry__stringbuilder_append(&sb, SENTRY_SDK_USER_AGENT); + } return sentry__stringbuilder_into_string(&sb); } @@ -343,15 +359,16 @@ sentry__dsn_get_envelope_url(const sentry_dsn_t *dsn) } char * -sentry__dsn_get_minidump_url(const sentry_dsn_t *dsn) +sentry__dsn_get_minidump_url(const sentry_dsn_t *dsn, const char *user_agent) { - if (!dsn || !dsn->is_valid) { + if (!dsn || !dsn->is_valid || !user_agent) { return NULL; } sentry_stringbuilder_t sb; init_string_builder_for_url(&sb, dsn); - sentry__stringbuilder_append( - &sb, "/minidump/?sentry_client=" SENTRY_SDK_USER_AGENT "&sentry_key="); + sentry__stringbuilder_append(&sb, "/minidump/?sentry_client="); + sentry__stringbuilder_append(&sb, user_agent); + sentry__stringbuilder_append(&sb, "&sentry_key="); sentry__stringbuilder_append(&sb, dsn->public_key); return sentry__stringbuilder_into_string(&sb); } @@ -480,7 +497,7 @@ sentry__iso8601_to_msec(const char *iso) // to ensure the C locale is also used there. #if !defined(SENTRY_PLATFORM_ANDROID) && !defined(SENTRY_PLATFORM_IOS) static sentry__locale_t -c_locale() +c_locale(void) { static long c_locale_initialized = 0; static sentry__locale_t c_locale; @@ -529,3 +546,20 @@ sentry__snprintf_c(char *buf, size_t buf_size, const char *fmt, ...) va_end(args); return rv; } + +bool +sentry__check_min_version(sentry_version_t actual, sentry_version_t expected) +{ + if (actual.major < expected.major) { + return false; + } + if (actual.major == expected.major && actual.minor < expected.minor) { + return false; + } + if (actual.major == expected.major && actual.minor == expected.minor + && actual.patch < expected.patch) { + return false; + } + + return true; +} diff --git a/shared/sentry/src/sentry_utils.h b/shared/sentry/src/src/sentry_utils.h similarity index 89% rename from shared/sentry/src/sentry_utils.h rename to shared/sentry/src/src/sentry_utils.h index 8b19e65c2..b5b8e9d3e 100644 --- a/shared/sentry/src/sentry_utils.h +++ b/shared/sentry/src/src/sentry_utils.h @@ -63,6 +63,7 @@ typedef struct sentry_dsn_s { * DSN has been successfully parsed. */ sentry_dsn_t *sentry__dsn_new(const char *dsn); +sentry_dsn_t *sentry__dsn_new_n(const char *dsn, size_t raw_dsn_len); /** * Increases the reference-count of the DSN. @@ -79,7 +80,8 @@ void sentry__dsn_decref(sentry_dsn_t *dsn); * described here: * https://docs.sentry.io/development/sdk-dev/overview/#authentication */ -char *sentry__dsn_get_auth_header(const sentry_dsn_t *dsn); +char *sentry__dsn_get_auth_header( + const sentry_dsn_t *dsn, const char *user_agent); /** * Returns the envelope endpoint url used for normal uploads as a newly @@ -91,7 +93,8 @@ char *sentry__dsn_get_envelope_url(const sentry_dsn_t *dsn); * Returns the minidump endpoint url used for uploads done by the out-of-process * crashpad backend as a newly allocated string. */ -char *sentry__dsn_get_minidump_url(const sentry_dsn_t *dsn); +char *sentry__dsn_get_minidump_url( + const sentry_dsn_t *dsn, const char *user_agent); /** * Returns the number of milliseconds since the unix epoch. @@ -198,4 +201,20 @@ double sentry__strtod_c(const char *ptr, char **endptr); */ int sentry__snprintf_c(char *buf, size_t buf_size, const char *fmt, ...); +/** + * Represents a version of a software artifact. + */ +typedef struct { + unsigned int major; + unsigned int minor; + unsigned int patch; +} sentry_version_t; + +/** + * Checks whether `actual` is the same or a later version than `expected`. + * Returns `true` if that is the case. + */ +bool sentry__check_min_version( + sentry_version_t actual, sentry_version_t expected); + #endif diff --git a/shared/sentry/src/sentry_uuid.c b/shared/sentry/src/src/sentry_uuid.c similarity index 94% rename from shared/sentry/src/sentry_uuid.c rename to shared/sentry/src/src/sentry_uuid.c index ad5e34999..bd1ee66da 100644 --- a/shared/sentry/src/sentry_uuid.c +++ b/shared/sentry/src/src/sentry_uuid.c @@ -25,13 +25,13 @@ sentry_uuid_new_v4(void) } sentry_uuid_t -sentry_uuid_from_string(const char *str) +sentry_uuid_from_string_n(const char *str, size_t str_len) { sentry_uuid_t rv; memset(&rv, 0, sizeof(rv)); size_t i = 0; - size_t len = strlen(str); + size_t len = str_len; size_t pos = 0; bool is_nibble = true; char nibble = 0; @@ -65,6 +65,12 @@ sentry_uuid_from_string(const char *str) return rv; } +sentry_uuid_t +sentry_uuid_from_string(const char *str) +{ + return str ? sentry_uuid_from_string_n(str, strlen(str)) + : sentry_uuid_nil(); +} sentry_uuid_t sentry_uuid_from_bytes(const char bytes[16]) { diff --git a/shared/sentry/src/sentry_uuid.h b/shared/sentry/src/src/sentry_uuid.h similarity index 100% rename from shared/sentry/src/sentry_uuid.h rename to shared/sentry/src/src/sentry_uuid.h diff --git a/shared/sentry/src/sentry_value.c b/shared/sentry/src/src/sentry_value.c similarity index 89% rename from shared/sentry/src/sentry_value.c rename to shared/sentry/src/src/sentry_value.c index 9d78efd9e..e46eb79f5 100644 --- a/shared/sentry/src/sentry_value.c +++ b/shared/sentry/src/src/sentry_value.c @@ -5,7 +5,6 @@ #include #include #include -#include #if defined(_MSC_VER) # pragma warning(push) @@ -21,6 +20,7 @@ #include "sentry_alloc.h" #include "sentry_core.h" #include "sentry_json.h" +#include "sentry_slice.h" #include "sentry_string.h" #include "sentry_sync.h" #include "sentry_utils.h" @@ -320,15 +320,22 @@ sentry_value_new_bool(int value) } sentry_value_t -sentry_value_new_string(const char *value) +sentry_value_new_string_n(const char *value, size_t value_len) { - char *s = sentry__string_clone(value); + char *s = sentry__string_clone_n(value, value_len); if (!s) { return sentry_value_new_null(); } return sentry__value_new_string_owned(s); } +sentry_value_t +sentry_value_new_string(const char *value) +{ + return value ? sentry_value_new_string_n(value, strlen(value)) + : sentry_value_new_null(); +} + sentry_value_t sentry_value_new_list(void) { @@ -440,8 +447,13 @@ sentry_value_get_type(sentry_value_t value) } int -sentry_value_set_by_key(sentry_value_t value, const char *k, sentry_value_t v) +sentry_value_set_by_key_n( + sentry_value_t value, const char *k, size_t k_len, sentry_value_t v) { + if (!k) { + goto fail; + } + sentry_slice_t k_slice = { k, k_len }; thing_t *thing = value_as_unfrozen_thing(value); if (!thing || thing_get_type(thing) != THING_TYPE_OBJECT) { goto fail; @@ -449,7 +461,7 @@ sentry_value_set_by_key(sentry_value_t value, const char *k, sentry_value_t v) obj_t *o = thing->payload._ptr; for (size_t i = 0; i < o->len; i++) { obj_pair_t *pair = &o->pairs[i]; - if (sentry__string_eq(pair->k, k)) { + if (sentry__slice_eqs(k_slice, pair->k)) { sentry_value_decref(pair->v); pair->v = v; return 0; @@ -462,7 +474,7 @@ sentry_value_set_by_key(sentry_value_t value, const char *k, sentry_value_t v) } obj_pair_t pair; - pair.k = sentry__string_clone(k); + pair.k = sentry__slice_to_owned(k_slice); if (!pair.k) { goto fail; } @@ -476,8 +488,23 @@ sentry_value_set_by_key(sentry_value_t value, const char *k, sentry_value_t v) } int -sentry_value_remove_by_key(sentry_value_t value, const char *k) +sentry_value_set_by_key(sentry_value_t value, const char *k, sentry_value_t v) { + if (k) { + return sentry_value_set_by_key_n(value, k, strlen(k), v); + } + + sentry_value_decref(v); + return 1; +} + +int +sentry_value_remove_by_key_n(sentry_value_t value, const char *k, size_t k_len) +{ + if (!k) { + return 1; + } + sentry_slice_t k_slice = { k, k_len }; thing_t *thing = value_as_unfrozen_thing(value); if (!thing || thing_get_type(thing) != THING_TYPE_OBJECT) { return 1; @@ -485,7 +512,7 @@ sentry_value_remove_by_key(sentry_value_t value, const char *k) obj_t *o = thing->payload._ptr; for (size_t i = 0; i < o->len; i++) { obj_pair_t *pair = &o->pairs[i]; - if (sentry__string_eq(pair->k, k)) { + if (sentry__slice_eqs(k_slice, pair->k)) { sentry_free(pair->k); sentry_value_decref(pair->v); memmove(o->pairs + i, o->pairs + i + 1, @@ -497,6 +524,16 @@ sentry_value_remove_by_key(sentry_value_t value, const char *k) return 1; } +int +sentry_value_remove_by_key(sentry_value_t value, const char *k) +{ + if (k) { + return sentry_value_remove_by_key_n(value, k, strlen(k)); + } + + return 1; +} + int sentry_value_append(sentry_value_t value, sentry_value_t v) { @@ -684,14 +721,17 @@ sentry_value_remove_by_index(sentry_value_t value, size_t index) } sentry_value_t -sentry_value_get_by_key(sentry_value_t value, const char *k) +sentry_value_get_by_key_n(sentry_value_t value, const char *k, size_t k_len) { + if (!k) { + return sentry_value_new_null(); + } const thing_t *thing = value_as_thing(value); if (thing && thing_get_type(thing) == THING_TYPE_OBJECT) { obj_t *o = thing->payload._ptr; for (size_t i = 0; i < o->len; i++) { obj_pair_t *pair = &o->pairs[i]; - if (sentry__string_eq(pair->k, k)) { + if (sentry__slice_eqs((sentry_slice_t) { k, k_len }, pair->k)) { return pair->v; } } @@ -699,10 +739,30 @@ sentry_value_get_by_key(sentry_value_t value, const char *k) return sentry_value_new_null(); } +sentry_value_t +sentry_value_get_by_key(sentry_value_t value, const char *k) +{ + const size_t k_len = k ? strlen(k) : 0; + return sentry_value_get_by_key_n(value, k, k_len); +} + +sentry_value_t +sentry_value_get_by_key_owned_n( + sentry_value_t value, const char *k, size_t k_len) +{ + sentry_value_t rv = sentry_value_get_by_key_n(value, k, k_len); + sentry_value_incref(rv); + return rv; +} + sentry_value_t sentry_value_get_by_key_owned(sentry_value_t value, const char *k) { - sentry_value_t rv = sentry_value_get_by_key(value, k); + if (k) { + return sentry_value_get_by_key_owned_n(value, k, strlen(k)); + } + + sentry_value_t rv = sentry_value_new_null(); sentry_value_incref(rv); return rv; } @@ -1069,52 +1129,90 @@ sentry_value_new_event(void) } sentry_value_t -sentry_value_new_message_event( - sentry_level_t level, const char *logger, const char *text) +sentry_value_new_message_event_n(sentry_level_t level, const char *logger, + size_t logger_len, const char *text, size_t text_len) { sentry_value_t rv = sentry_value_new_event(); sentry_value_set_by_key(rv, "level", sentry__value_new_level(level)); if (logger) { - sentry_value_set_by_key(rv, "logger", sentry_value_new_string(logger)); + sentry_value_set_by_key( + rv, "logger", sentry_value_new_string_n(logger, logger_len)); } if (text) { sentry_value_t container = sentry_value_new_object(); sentry_value_set_by_key( - container, "formatted", sentry_value_new_string(text)); + container, "formatted", sentry_value_new_string_n(text, text_len)); sentry_value_set_by_key(rv, "message", container); } return rv; } sentry_value_t -sentry_value_new_breadcrumb(const char *type, const char *message) +sentry_value_new_message_event( + sentry_level_t level, const char *logger, const char *text) { - sentry_value_t rv = sentry_value_new_object(); - sentry_value_set_by_key(rv, "timestamp", + size_t logger_len = logger ? strlen(logger) : 0; + size_t text_len = text ? strlen(text) : 0; + return sentry_value_new_message_event_n( + level, logger, logger_len, text, text_len); +} + +static void +timestamp_value(sentry_value_t value) +{ + sentry_value_set_by_key(value, "timestamp", sentry__value_new_string_owned( sentry__msec_time_to_iso8601(sentry__msec_time()))); +} + +sentry_value_t +sentry_value_new_breadcrumb_n( + const char *type, size_t type_len, const char *message, size_t message_len) +{ + sentry_value_t rv = sentry_value_new_object(); + timestamp_value(rv); if (type) { - sentry_value_set_by_key(rv, "type", sentry_value_new_string(type)); + sentry_value_set_by_key( + rv, "type", sentry_value_new_string_n(type, type_len)); } if (message) { sentry_value_set_by_key( - rv, "message", sentry_value_new_string(message)); + rv, "message", sentry_value_new_string_n(message, message_len)); } return rv; } sentry_value_t -sentry_value_new_exception(const char *type, const char *value) +sentry_value_new_breadcrumb(const char *type, const char *message) +{ + const size_t type_len = type ? strlen(type) : 0; + const size_t message_len = message ? strlen(message) : 0; + return sentry_value_new_breadcrumb_n(type, type_len, message, message_len); +} + +sentry_value_t +sentry_value_new_exception_n( + const char *type, size_t type_len, const char *value, size_t value_len) { sentry_value_t exc = sentry_value_new_object(); - sentry_value_set_by_key(exc, "type", sentry_value_new_string(type)); - sentry_value_set_by_key(exc, "value", sentry_value_new_string(value)); + sentry_value_set_by_key( + exc, "type", sentry_value_new_string_n(type, type_len)); + sentry_value_set_by_key( + exc, "value", sentry_value_new_string_n(value, value_len)); return exc; } sentry_value_t -sentry_value_new_thread(uint64_t id, const char *name) +sentry_value_new_exception(const char *type, const char *value) +{ + const size_t type_len = type ? strlen(type) : 0; + const size_t value_len = value ? strlen(value) : 0; + return sentry_value_new_exception_n(type, type_len, value, value_len); +} + +sentry_value_t +sentry_value_new_thread_n(uint64_t id, const char *name, size_t name_len) { sentry_value_t thread = sentry_value_new_object(); @@ -1128,12 +1226,20 @@ sentry_value_new_thread(uint64_t id, const char *name) } if (name) { - sentry_value_set_by_key(thread, "name", sentry_value_new_string(name)); + sentry_value_set_by_key( + thread, "name", sentry_value_new_string_n(name, name_len)); } return thread; } +sentry_value_t +sentry_value_new_thread(uint64_t id, const char *name) +{ + const size_t name_len = name ? strlen(name) : 0; + return sentry_value_new_thread_n(id, name, name_len); +} + sentry_value_t sentry_value_new_stacktrace(void **ips, size_t len) { diff --git a/shared/sentry/src/sentry_value.h b/shared/sentry/src/src/sentry_value.h similarity index 100% rename from shared/sentry/src/sentry_value.h rename to shared/sentry/src/src/sentry_value.h diff --git a/shared/sentry/src/sentry_windows_dbghelp.c b/shared/sentry/src/src/sentry_windows_dbghelp.c similarity index 100% rename from shared/sentry/src/sentry_windows_dbghelp.c rename to shared/sentry/src/src/sentry_windows_dbghelp.c diff --git a/shared/sentry/src/sentry_windows_dbghelp.h b/shared/sentry/src/src/sentry_windows_dbghelp.h similarity index 100% rename from shared/sentry/src/sentry_windows_dbghelp.h rename to shared/sentry/src/src/sentry_windows_dbghelp.h diff --git a/shared/sentry/src/symbolizer/sentry_symbolizer_unix.c b/shared/sentry/src/src/symbolizer/sentry_symbolizer_unix.c similarity index 100% rename from shared/sentry/src/symbolizer/sentry_symbolizer_unix.c rename to shared/sentry/src/src/symbolizer/sentry_symbolizer_unix.c diff --git a/shared/sentry/src/symbolizer/sentry_symbolizer_windows.c b/shared/sentry/src/src/symbolizer/sentry_symbolizer_windows.c similarity index 100% rename from shared/sentry/src/symbolizer/sentry_symbolizer_windows.c rename to shared/sentry/src/src/symbolizer/sentry_symbolizer_windows.c diff --git a/shared/sentry/src/transports/sentry_disk_transport.c b/shared/sentry/src/src/transports/sentry_disk_transport.c similarity index 100% rename from shared/sentry/src/transports/sentry_disk_transport.c rename to shared/sentry/src/src/transports/sentry_disk_transport.c diff --git a/shared/sentry/src/transports/sentry_disk_transport.h b/shared/sentry/src/src/transports/sentry_disk_transport.h similarity index 100% rename from shared/sentry/src/transports/sentry_disk_transport.h rename to shared/sentry/src/src/transports/sentry_disk_transport.h diff --git a/shared/sentry/src/transports/sentry_function_transport.c b/shared/sentry/src/src/transports/sentry_function_transport.c similarity index 100% rename from shared/sentry/src/transports/sentry_function_transport.c rename to shared/sentry/src/src/transports/sentry_function_transport.c diff --git a/shared/sentry/src/transports/sentry_transport_curl.c b/shared/sentry/src/src/transports/sentry_transport_curl.c similarity index 82% rename from shared/sentry/src/transports/sentry_transport_curl.c rename to shared/sentry/src/src/transports/sentry_transport_curl.c index 31605073f..11f87e5d2 100644 --- a/shared/sentry/src/transports/sentry_transport_curl.c +++ b/shared/sentry/src/src/transports/sentry_transport_curl.c @@ -11,12 +11,12 @@ #include #include -#include #include typedef struct curl_transport_state_s { sentry_dsn_t *dsn; CURL *curl_handle; + char *user_agent; char *http_proxy; char *ca_certs; sentry_rate_limiter_t *ratelimiter; @@ -48,10 +48,12 @@ sentry__curl_bgworker_state_free(void *_state) curl_bgworker_state_t *state = _state; if (state->curl_handle) { curl_easy_cleanup(state->curl_handle); + curl_global_cleanup(); } sentry__dsn_decref(state->dsn); sentry__rate_limiter_free(state->ratelimiter); sentry_free(state->ca_certs); + sentry_free(state->user_agent); sentry_free(state->http_proxy); sentry_free(state); } @@ -67,6 +69,32 @@ sentry__curl_transport_start( SENTRY_WARNF("`curl_global_init` failed with code `%d`", (int)rv); return 1; } + + curl_version_info_data *version_data + = curl_version_info(CURLVERSION_NOW); + + if (!version_data) { + SENTRY_WARN("Failed to retrieve `curl_version_info`"); + return 1; + } + + sentry_version_t curl_version = { + .major = (version_data->version_num >> 16) & 0xff, + .minor = (version_data->version_num >> 8) & 0xff, + .patch = version_data->version_num & 0xff, + }; + + if (!sentry__check_min_version( + curl_version, (sentry_version_t) { 7, 10, 7 })) { + SENTRY_WARNF("`libcurl` is at unsupported version `%u.%u.%u`", + curl_version.major, curl_version.minor, curl_version.patch); + return 1; + } + + if ((version_data->features & CURL_VERSION_ASYNCHDNS) == 0) { + SENTRY_WARN("`libcurl` was not compiled with feature `AsynchDNS`"); + return 1; + } } sentry_bgworker_t *bgworker = (sentry_bgworker_t *)transport_state; @@ -74,6 +102,7 @@ sentry__curl_transport_start( state->dsn = sentry__dsn_incref(options->dsn); state->http_proxy = sentry__string_clone(options->http_proxy); + state->user_agent = sentry__string_clone(options->user_agent); state->ca_certs = sentry__string_clone(options->ca_certs); state->curl_handle = curl_easy_init(); state->debug = options->debug; @@ -115,7 +144,7 @@ header_callback(char *buffer, size_t size, size_t nitems, void *userdata) { size_t bytes = size * nitems; struct header_info *info = userdata; - char *header = sentry__string_clonen(buffer, bytes); + char *header = sentry__string_clone_n(buffer, bytes); if (!header) { return bytes; } @@ -142,7 +171,7 @@ sentry__curl_send_task(void *_envelope, void *_state) curl_bgworker_state_t *state = (curl_bgworker_state_t *)_state; sentry_prepared_http_request_t *req = sentry__prepare_http_request( - envelope, state->dsn, state->ratelimiter); + envelope, state->dsn, state->ratelimiter, state->user_agent); if (!req) { return; } @@ -150,7 +179,7 @@ sentry__curl_send_task(void *_envelope, void *_state) struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "expect:"); for (size_t i = 0; i < req->headers_len; i++) { - char buf[255]; + char buf[512]; size_t written = (size_t)snprintf(buf, sizeof(buf), "%s:%s", req->headers[i].key, req->headers[i].value); if (written >= sizeof(buf)) { @@ -176,6 +205,10 @@ sentry__curl_send_task(void *_envelope, void *_state) curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)req->body_len); curl_easy_setopt(curl, CURLOPT_USERAGENT, SENTRY_SDK_USER_AGENT); + char error_buf[CURL_ERROR_SIZE]; + error_buf[0] = 0; + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buf); + struct header_info info; info.retry_after = NULL; info.x_sentry_rate_limits = NULL; @@ -205,8 +238,17 @@ sentry__curl_send_task(void *_envelope, void *_state) sentry__rate_limiter_update_from_429(state->ratelimiter); } } else { - SENTRY_WARNF( - "sending via `curl_easy_perform` failed with code `%d`", (int)rv); + size_t len = strlen(error_buf); + if (len) { + if (error_buf[len - 1] == '\n') { + error_buf[len - 1] = 0; + } + SENTRY_WARNF("`curl_easy_perform` failed with code `%d`: %s", + (int)rv, error_buf); + } else { + SENTRY_WARNF("`curl_easy_perform` failed with code `%d`: %s", + (int)rv, curl_easy_strerror(rv)); + } } curl_slist_free_all(headers); diff --git a/shared/sentry/src/transports/sentry_transport_none.c b/shared/sentry/src/src/transports/sentry_transport_none.c similarity index 100% rename from shared/sentry/src/transports/sentry_transport_none.c rename to shared/sentry/src/src/transports/sentry_transport_none.c diff --git a/shared/sentry/src/transports/sentry_transport_winhttp.c b/shared/sentry/src/src/transports/sentry_transport_winhttp.c similarity index 97% rename from shared/sentry/src/transports/sentry_transport_winhttp.c rename to shared/sentry/src/src/transports/sentry_transport_winhttp.c index 9d509f23d..ffb114eb9 100644 --- a/shared/sentry/src/transports/sentry_transport_winhttp.c +++ b/shared/sentry/src/src/transports/sentry_transport_winhttp.c @@ -63,7 +63,7 @@ sentry__winhttp_transport_start( winhttp_bgworker_state_t *state = sentry__bgworker_get_state(bgworker); state->dsn = sentry__dsn_incref(opts->dsn); - state->user_agent = sentry__string_to_wstr(SENTRY_SDK_USER_AGENT); + state->user_agent = sentry__string_to_wstr(opts->user_agent); state->debug = opts->debug; sentry__bgworker_setname(bgworker, opts->transport_thread_name); @@ -74,7 +74,7 @@ sentry__winhttp_transport_start( const char *ptr = opts->http_proxy + 7; const char *slash = strchr(ptr, '/'); if (slash) { - char *copy = sentry__string_clonen(ptr, slash - ptr); + char *copy = sentry__string_clone_n(ptr, slash - ptr); state->proxy = sentry__string_to_wstr(copy); sentry_free(copy); } else { @@ -152,9 +152,11 @@ sentry__winhttp_send_task(void *_envelope, void *_state) uint64_t started = sentry__monotonic_time(); + char *user_agent = sentry__string_from_wstr(state->user_agent); sentry_prepared_http_request_t *req = sentry__prepare_http_request( - envelope, state->dsn, state->ratelimiter); + envelope, state->dsn, state->ratelimiter, user_agent); if (!req) { + sentry_free(user_agent); return; } @@ -283,6 +285,7 @@ sentry__winhttp_send_task(void *_envelope, void *_state) state->request = NULL; WinHttpCloseHandle(request); } + sentry_free(user_agent); sentry_free(url); sentry_free(headers); sentry__prepared_http_request_free(req); diff --git a/shared/sentry/src/unwinder/sentry_unwinder.c b/shared/sentry/src/src/unwinder/sentry_unwinder.c similarity index 100% rename from shared/sentry/src/unwinder/sentry_unwinder.c rename to shared/sentry/src/src/unwinder/sentry_unwinder.c diff --git a/shared/sentry/src/unwinder/sentry_unwinder_dbghelp.c b/shared/sentry/src/src/unwinder/sentry_unwinder_dbghelp.c similarity index 78% rename from shared/sentry/src/unwinder/sentry_unwinder_dbghelp.c rename to shared/sentry/src/src/unwinder/sentry_unwinder_dbghelp.c index fd6ec3b72..7d22728da 100644 --- a/shared/sentry/src/unwinder/sentry_unwinder_dbghelp.c +++ b/shared/sentry/src/src/unwinder/sentry_unwinder_dbghelp.c @@ -43,16 +43,32 @@ sentry__unwind_stack_dbghelp( memset(&stack_frame, 0, sizeof(stack_frame)); size_t size = 0; -#if defined(_WIN64) +#if defined(_M_X64) int machine_type = IMAGE_FILE_MACHINE_AMD64; stack_frame.AddrPC.Offset = ctx.Rip; stack_frame.AddrFrame.Offset = ctx.Rbp; stack_frame.AddrStack.Offset = ctx.Rsp; -#else +#elif defined(_M_IX86) int machine_type = IMAGE_FILE_MACHINE_I386; stack_frame.AddrPC.Offset = ctx.Eip; stack_frame.AddrFrame.Offset = ctx.Ebp; stack_frame.AddrStack.Offset = ctx.Esp; +#elif defined(_M_ARM64) + int machine_type = IMAGE_FILE_MACHINE_ARM64; + stack_frame.AddrPC.Offset = ctx.Pc; +# if defined(NONAMELESSUNION) + stack_frame.AddrFrame.Offset = ctx.DUMMYUNIONNAME.DUMMYSTRUCTNAME.Fp; +# else + stack_frame.AddrFrame.Offset = ctx.Fp; +# endif + stack_frame.AddrStack.Offset = ctx.Sp; +#elif defined(_M_ARM) + int machine_type = IMAGE_FILE_MACHINE_ARM; + stack_frame.AddrPC.Offset = ctx.Pc; + stack_frame.AddrFrame.Offset = ctx.R11; + stack_frame.AddrStack.Offset = ctx.Sp; +#else +# error "Platform not supported!" #endif stack_frame.AddrPC.Mode = AddrModeFlat; stack_frame.AddrFrame.Mode = AddrModeFlat; diff --git a/shared/sentry/src/unwinder/sentry_unwinder_libbacktrace.c b/shared/sentry/src/src/unwinder/sentry_unwinder_libbacktrace.c similarity index 100% rename from shared/sentry/src/unwinder/sentry_unwinder_libbacktrace.c rename to shared/sentry/src/src/unwinder/sentry_unwinder_libbacktrace.c diff --git a/shared/sentry/src/unwinder/sentry_unwinder_libunwindstack.cpp b/shared/sentry/src/src/unwinder/sentry_unwinder_libunwindstack.cpp similarity index 100% rename from shared/sentry/src/unwinder/sentry_unwinder_libunwindstack.cpp rename to shared/sentry/src/src/unwinder/sentry_unwinder_libunwindstack.cpp diff --git a/shared/sentry/tests/__init__.py b/shared/sentry/src/tests/__init__.py similarity index 100% rename from shared/sentry/tests/__init__.py rename to shared/sentry/src/tests/__init__.py diff --git a/shared/sentry/tests/assertions.py b/shared/sentry/src/tests/assertions.py similarity index 76% rename from shared/sentry/tests/assertions.py rename to shared/sentry/src/tests/assertions.py index 04133f742..f12ec9972 100644 --- a/shared/sentry/tests/assertions.py +++ b/shared/sentry/src/tests/assertions.py @@ -1,13 +1,16 @@ -import datetime import email import gzip import platform import re import sys +from dataclasses import dataclass +from datetime import datetime + +import msgpack from .conditions import is_android -VERSION_RE = re.compile(r"(\d+\.\d+\.\d+)(?:[-\.]?)(.*)") +VERSION_RE = re.compile(r"(\d+\.\d+\.\d+)[-.]?(.*)") def matches(actual, expected): @@ -55,9 +58,9 @@ def assert_meta( } expected_sdk = { "name": "sentry.native", - "version": "0.5.2", + "version": "0.7.0", "packages": [ - {"name": "github:getsentry/sentry-native", "version": "0.5.2"}, + {"name": "github:getsentry/sentry-native", "version": "0.7.0"}, ], } if is_android: @@ -95,7 +98,7 @@ def assert_meta( ) assert event["contexts"]["os"]["build"] is not None - if sdk_override != None: + if sdk_override is not None: expected_sdk["name"] = sdk_override assert_matches(event, expected) @@ -161,7 +164,7 @@ def assert_minidump(envelope): assert minidump.payload.bytes.startswith(b"MDMP") -def assert_timestamp(ts, now=datetime.datetime.utcnow()): +def assert_timestamp(ts, now=datetime.utcnow()): assert ts[:11] == now.isoformat()[:11] @@ -176,6 +179,14 @@ def assert_event(envelope): assert_timestamp(event["timestamp"]) +def assert_breakpad_crash(envelope): + event = envelope.get_event() + expected = { + "level": "fatal", + } + assert_matches(event, expected) + + def assert_exception(envelope): event = envelope.get_event() exception = { @@ -186,7 +197,7 @@ def assert_exception(envelope): assert_timestamp(event["timestamp"]) -def assert_crash(envelope): +def assert_inproc_crash(envelope): event = envelope.get_event() assert_matches(event, {"level": "fatal"}) # depending on the unwinder, we currently don’t get any stack frames from @@ -213,16 +224,62 @@ def assert_no_before_send(envelope): assert ("adapted_by", "before_send") not in event.items() +@dataclass(frozen=True) +class CrashpadAttachments: + event: dict + breadcrumb1: list + breadcrumb2: list + + +def _unpack_breadcrumbs(payload): + unpacker = msgpack.Unpacker() + unpacker.feed(payload) + return [unpacked for unpacked in unpacker] + + +def _load_crashpad_attachments(msg): + event = {} + breadcrumb1 = [] + breadcrumb2 = [] + for part in msg.walk(): + match part.get_filename(): + case "__sentry-event": + event = msgpack.unpackb(part.get_payload(decode=True)) + case "__sentry-breadcrumb1": + breadcrumb1 = _unpack_breadcrumbs(part.get_payload(decode=True)) + case "__sentry-breadcrumb2": + breadcrumb2 = _unpack_breadcrumbs(part.get_payload(decode=True)) + + return CrashpadAttachments(event, breadcrumb1, breadcrumb2) + + +def is_valid_timestamp(timestamp): + try: + datetime.fromisoformat(timestamp) + return True + except ValueError: + return False + + +def _validate_breadcrumb_seq(seq, breadcrumb_func): + for i in seq: + breadcrumb = breadcrumb_func(i) + assert breadcrumb["message"] == str(i) + assert is_valid_timestamp(breadcrumb["timestamp"]) + + def assert_crashpad_upload(req): multipart = gzip.decompress(req.get_data()) msg = email.message_from_bytes(bytes(str(req.headers), encoding="utf8") + multipart) - files = [part.get_filename() for part in msg.walk()] + attachments = _load_crashpad_attachments(msg) + + if len(attachments.breadcrumb1) > 3: + _validate_breadcrumb_seq(range(97), lambda i: attachments.breadcrumb1[3 + i]) + _validate_breadcrumb_seq( + range(97, 101), lambda i: attachments.breadcrumb2[i - 97] + ) - # TODO: - # Actually assert that we get a correct event/breadcrumbs payload - assert "__sentry-breadcrumb1" in files - assert "__sentry-breadcrumb2" in files - assert "__sentry-event" in files + assert attachments.event["level"] == "fatal" assert any( b'name="upload_file_minidump"' in part.as_bytes() diff --git a/shared/sentry/tests/cmake.py b/shared/sentry/src/tests/cmake.py similarity index 99% rename from shared/sentry/tests/cmake.py rename to shared/sentry/src/tests/cmake.py index a0566023a..35c48a8b5 100644 --- a/shared/sentry/tests/cmake.py +++ b/shared/sentry/src/tests/cmake.py @@ -143,7 +143,7 @@ def cmake(cwd, targets, options=None): cflags = [] if os.environ.get("ERROR_ON_WARNINGS"): cflags.append("-Werror") - if sys.platform == "win32": + if sys.platform == "win32" and not os.environ.get("TEST_MINGW"): # MP = object level parallelism, WX = warnings as errors cpus = os.cpu_count() cflags.append("/WX /MP{}".format(cpus)) diff --git a/shared/sentry/tests/conditions.py b/shared/sentry/src/tests/conditions.py similarity index 100% rename from shared/sentry/tests/conditions.py rename to shared/sentry/src/tests/conditions.py diff --git a/shared/sentry/tests/conftest.py b/shared/sentry/src/tests/conftest.py similarity index 87% rename from shared/sentry/tests/conftest.py rename to shared/sentry/src/tests/conftest.py index b2ba2e67a..c2f1383c7 100644 --- a/shared/sentry/tests/conftest.py +++ b/shared/sentry/src/tests/conftest.py @@ -43,3 +43,10 @@ def pytest_runtest_setup(item): "--with_crashpad_wer" ): pytest.skip("need --with_crashpad_wer to run this test") + + +def pytest_configure(config): + config.addinivalue_line( + "markers", + "with_crashpad_wer: mark test to only run when WER testing is enabled", + ) diff --git a/shared/sentry/tests/fixtures/README.md b/shared/sentry/src/tests/fixtures/README.md similarity index 100% rename from shared/sentry/tests/fixtures/README.md rename to shared/sentry/src/tests/fixtures/README.md diff --git a/shared/sentry/tests/fixtures/libstdc++.so b/shared/sentry/src/tests/fixtures/libstdc++.so similarity index 100% rename from shared/sentry/tests/fixtures/libstdc++.so rename to shared/sentry/src/tests/fixtures/libstdc++.so diff --git a/shared/sentry/tests/fixtures/sentry_example b/shared/sentry/src/tests/fixtures/sentry_example similarity index 100% rename from shared/sentry/tests/fixtures/sentry_example rename to shared/sentry/src/tests/fixtures/sentry_example diff --git a/shared/sentry/tests/fixtures/test.c b/shared/sentry/src/tests/fixtures/test.c similarity index 100% rename from shared/sentry/tests/fixtures/test.c rename to shared/sentry/src/tests/fixtures/test.c diff --git a/shared/sentry/tests/fixtures/with-buildid.so b/shared/sentry/src/tests/fixtures/with-buildid.so similarity index 100% rename from shared/sentry/tests/fixtures/with-buildid.so rename to shared/sentry/src/tests/fixtures/with-buildid.so diff --git a/shared/sentry/src/tests/fixtures/without-buildid-phdr.so b/shared/sentry/src/tests/fixtures/without-buildid-phdr.so new file mode 100755 index 0000000000000000000000000000000000000000..82dd6a498286adc70e09913bdee3c162afe146f5 GIT binary patch literal 15552 zcmeHOUu+ab7@xaqp&+HGpcRNL#0N-ZK@ccv;rjoYv`|Y)(1_dX-L^e*f10~JZHb9Z z5Cb8YKJuiAG0KYxh8KJ>U=4-`67)%<4~+>4B*qkt1WfGteY@Z9y0^U&^uZW1liYs) zznS^X?C#v%%sU-Do#9YOp+wX^#gehg(?rE^X}2&$qN+*N(X~-M>H5~pn-*|`Vgyx^ zm+PoyZ;^xaFUbT7JIA>x4RHw20a1hcSq}5f>&mjvJJ?L5TyM z6o1eZ~sxliA^bM3-M7yDj+l>5N=@i=pR=+`FVxv<_I{orj^SmeU}Gpg7)Up4)+ zi|9K^k9vtMm&3$8rk1H&0_0LyENdi_%UT5|o_8!uS=|G@R?^PfBdLO8=LdS*(z&cX z5Fbk0o~^pYN{q*?;Z!!BP93wAV;3BiP7Ni@LeAW+x_Y`>+pHbt4s#c3CA_$2j8{m# zN)+Q;T$@_PXeM1N&10E|m~S)UcqE{o5`AOT3xq%9nf;!g$HuGKlW+R;JccNGH3Av|jetf#BcKt`2xtT}0vdt;2Liu0JpE_v_%C&_)3rZrQz~}ik`pdn zj~)NIZrW{N>`e1L)}N{Ujmh4-&Kh$4L|m7ZW*Rn3vg5Q+^1tf(@A`_#mbuue+1TY@ z_s1^Zjl@D%V&Bd=t0_TI64aGuh8s4t&&P9nCYw)?SrvC4jva6AXEt`~hEpFq-8@V} zX-$-_Hxs2&=}PTu#DEU_4VMA1LzFQ;Ydzf-e9i1-sx7_f%AQ|u|_y{ueTc%;0swO-^|*{AxH$k^YyPGo$yTq`p6x$<{WF0lVGSIV(G zD4SN@J?11g%4SvUK|U$=X%p^ZYZANZogqn>kOr%kzTf&W~|tN*O{(?8E{ zdw>IdZFc38V!tP{h?4EUBiP3ttP%TzyV}}bFgCa36Qf2?Dq9>k_L@7*?OUJQ;xWOn z3OPc*Dm3{w4~sQI`TAm5SE;X6z_C)lL;?Rw{ZfT-tklz}%KWR; zFDsvesMIf4n6H(3nmvYJn z_7D^DwFmbP@8b_u!6zem@ccoZ3Dq9rs3e{&26DZa4d`3QDwQ!zX zAbqF`{+C?+!tuRIdc{vA!)3~spNQi;!STB3>KBgt9O=XSlnmfsLmf8A7A(dh`fZEo zyGg$(n1p1T^i|JSB=SzdDbjA8gqlBAVL2Hq!3Qe}%CeFg;dn?XWrywDaK)&d8M&a@J@(o8&Ve?XMhY>FsVKEggTcI${zKYwsr&9S=chSI@!L zmLBV1XXl}g0c)V8wWos;a=rIIQ&Q#l$paiQiAMd0O5F1%$}CJ|ocIt?C-2cwaM_$= znGsTY>~Tk# zE^MYfDv*yR$rF<2>0$4Af~Pd`Oe#TjjS;i8t3vw^DhX zgY`y~betRUjZzWl7}@-VbNEY)1YV;c9`937tk=+f_<{2IDPHqH#(NjkkjjGX7qxqy ziEW6#C>4R86Gzk!{Lud_*||?x*Oi}d@|?r^QPOy42O$vUN#u{mdkgfs&zD(ATh<;U z&L59;0VvkD2;jc@%OnXLkNzuz1TKbqb`*_}H#l!O$(^Huej^U!@CDh} z1@Tx1&1~bSGK`);SHy#UNjiVLii+!Yk7AyQc0v3%WbnshUDYV@s3#Z?`5H0ogZ3Ly z&tfbRFK~EHbp4J#tP}UL9`Qz5<1vW$)AHQ&`9>vSlK}q&**4P${Q)lg{ReILg{$%B cJ?RZpB*uWK_>gF|_@CuS= start_timestamp diff --git a/shared/sentry/tests/test_integration_ratelimits.py b/shared/sentry/src/tests/test_integration_ratelimits.py similarity index 100% rename from shared/sentry/tests/test_integration_ratelimits.py rename to shared/sentry/src/tests/test_integration_ratelimits.py diff --git a/shared/sentry/tests/test_integration_stdout.py b/shared/sentry/src/tests/test_integration_stdout.py similarity index 86% rename from shared/sentry/tests/test_integration_stdout.py rename to shared/sentry/src/tests/test_integration_stdout.py index ecb2c6f95..e44a90ead 100644 --- a/shared/sentry/tests/test_integration_stdout.py +++ b/shared/sentry/src/tests/test_integration_stdout.py @@ -12,12 +12,12 @@ assert_breadcrumb, assert_stacktrace, assert_event, - assert_crash, + assert_inproc_crash, assert_minidump, - assert_timestamp, assert_before_send, assert_no_before_send, assert_crash_timestamp, + assert_breakpad_crash, ) from .conditions import has_breakpad, has_files @@ -46,6 +46,26 @@ def test_capture_stdout(cmake): assert_event(envelope) +def test_dynamic_sdk_name_override(cmake): + tmp_path = cmake( + ["sentry_example"], + { + "SENTRY_BACKEND": "none", + "SENTRY_TRANSPORT": "none", + }, + ) + + output = check_output( + tmp_path, + "sentry_example", + ["stdout", "override-sdk-name", "capture-event"], + ) + envelope = Envelope.deserialize(output) + + assert_meta(envelope, sdk_override="sentry.native.android.flutter") + assert_event(envelope) + + def test_sdk_name_override(cmake): sdk_name = "cUsToM.SDK" tmp_path = cmake( @@ -92,9 +112,9 @@ def test_multi_process(cmake): # while the processes are running, we expect two runs runs = [ - run - for run in os.listdir(os.path.join(cwd, ".sentry-native")) - if run.endswith(".run") + db_run + for db_run in os.listdir(os.path.join(cwd, ".sentry-native")) + if db_run.endswith(".run") ] assert len(runs) == 2 @@ -108,9 +128,9 @@ def test_multi_process(cmake): subprocess.run([cmd], cwd=cwd) runs = [ - run - for run in os.listdir(os.path.join(cwd, ".sentry-native")) - if run.endswith(".run") or run.endswith(".lock") + db_run + for db_run in os.listdir(os.path.join(cwd, ".sentry-native")) + if db_run.endswith(".run") or db_run.endswith(".lock") ] assert len(runs) == 0 @@ -136,7 +156,7 @@ def test_inproc_crash_stdout(cmake): assert_meta(envelope, integration="inproc") assert_breadcrumb(envelope) assert_attachment(envelope) - assert_crash(envelope) + assert_inproc_crash(envelope) def test_inproc_crash_stdout_before_send(cmake): @@ -148,7 +168,7 @@ def test_inproc_crash_stdout_before_send(cmake): assert_meta(envelope, integration="inproc") assert_breadcrumb(envelope) assert_attachment(envelope) - assert_crash(envelope) + assert_inproc_crash(envelope) assert_before_send(envelope) @@ -175,7 +195,7 @@ def test_inproc_crash_stdout_before_send_and_on_crash(cmake): assert_meta(envelope, integration="inproc") assert_breadcrumb(envelope) assert_attachment(envelope) - assert_crash(envelope) + assert_inproc_crash(envelope) @pytest.mark.skipif(not has_breakpad, reason="test needs breakpad backend") @@ -189,6 +209,7 @@ def test_breakpad_crash_stdout(cmake): assert_breadcrumb(envelope) assert_attachment(envelope) assert_minidump(envelope) + assert_breakpad_crash(envelope) @pytest.mark.skipif(not has_breakpad, reason="test needs breakpad backend") @@ -203,6 +224,7 @@ def test_breakpad_crash_stdout_before_send(cmake): assert_attachment(envelope) assert_minidump(envelope) assert_before_send(envelope) + assert_breakpad_crash(envelope) @pytest.mark.skipif(not has_breakpad, reason="test needs breakpad backend") @@ -230,3 +252,4 @@ def test_breakpad_crash_stdout_before_send_and_on_crash(cmake): assert_meta(envelope, integration="breakpad") assert_breadcrumb(envelope) assert_attachment(envelope) + assert_breakpad_crash(envelope) diff --git a/shared/sentry/tests/test_unit.py b/shared/sentry/src/tests/test_unit.py similarity index 100% rename from shared/sentry/tests/test_unit.py rename to shared/sentry/src/tests/test_unit.py diff --git a/shared/sentry/tests/unit/.gitattributes b/shared/sentry/src/tests/unit/.gitattributes similarity index 100% rename from shared/sentry/tests/unit/.gitattributes rename to shared/sentry/src/tests/unit/.gitattributes diff --git a/shared/sentry/tests/unit/CMakeLists.txt b/shared/sentry/src/tests/unit/CMakeLists.txt similarity index 97% rename from shared/sentry/tests/unit/CMakeLists.txt rename to shared/sentry/src/tests/unit/CMakeLists.txt index 7c9dc6d17..840c85561 100644 --- a/shared/sentry/tests/unit/CMakeLists.txt +++ b/shared/sentry/src/tests/unit/CMakeLists.txt @@ -28,6 +28,7 @@ add_executable(sentry_test_unit test_logger.c test_modulefinder.c test_mpack.c + test_options.c test_path.c test_ratelimiter.c test_sampling.c @@ -54,6 +55,7 @@ target_link_libraries(sentry_test_unit PRIVATE ${SENTRY_LINK_LIBRARIES} ${SENTRY_INTERFACE_LINK_LIBRARIES} "$<$:rt>" + "$<$,$>:-Wl,-E,--build-id=sha1>" ) if(MINGW) diff --git a/shared/sentry/tests/unit/fuzz.c b/shared/sentry/src/tests/unit/fuzz.c similarity index 100% rename from shared/sentry/tests/unit/fuzz.c rename to shared/sentry/src/tests/unit/fuzz.c diff --git a/shared/sentry/tests/unit/main.c b/shared/sentry/src/tests/unit/main.c similarity index 100% rename from shared/sentry/tests/unit/main.c rename to shared/sentry/src/tests/unit/main.c diff --git a/shared/sentry/tests/unit/sentry_testsupport.h b/shared/sentry/src/tests/unit/sentry_testsupport.h similarity index 84% rename from shared/sentry/tests/unit/sentry_testsupport.h rename to shared/sentry/src/tests/unit/sentry_testsupport.h index 81927db1b..bd6f112a7 100644 --- a/shared/sentry/tests/unit/sentry_testsupport.h +++ b/shared/sentry/src/tests/unit/sentry_testsupport.h @@ -23,6 +23,13 @@ TEST_MSG("Received: %s", Val); \ } while (0) +#define TEST_CHECK_WSTRING_EQUAL(Val, ReferenceVal) \ + do { \ + TEST_CHECK(wcscmp(Val, ReferenceVal) == 0); \ + TEST_MSG("Expected: %s", ReferenceVal); \ + TEST_MSG("Received: %s", Val); \ + } while (0) + #define TEST_CHECK_JSON_VALUE(Val, ReferenceJson) \ do { \ char *json = sentry_value_to_json(Val); \ diff --git a/shared/sentry/tests/unit/test_attachments.c b/shared/sentry/src/tests/unit/test_attachments.c similarity index 94% rename from shared/sentry/tests/unit/test_attachments.c rename to shared/sentry/src/tests/unit/test_attachments.c index bd4d2d065..62dcf0af7 100644 --- a/shared/sentry/tests/unit/test_attachments.c +++ b/shared/sentry/src/tests/unit/test_attachments.c @@ -35,7 +35,8 @@ SENTRY_TEST(lazy_attachments) sentry_options_set_transport(options, sentry_new_function_transport( send_envelope_test_attachments, &testdata)); - sentry_options_set_release(options, "prod"); + char rel[] = { 't', 'e', 's', 't' }; + sentry_options_set_release_n(options, rel, sizeof(rel)); sentry_options_add_attachment(options, PREFIX ".existing-file-attachment"); sentry_options_add_attachment( @@ -53,6 +54,7 @@ SENTRY_TEST(lazy_attachments) char *serialized = sentry_stringbuilder_take_string(&testdata.serialized_envelope); + TEST_CHECK(strstr(serialized, "\"release\":\"test\"") != NULL); TEST_CHECK(strstr(serialized, "{\"type\":\"attachment\",\"length\":3," "\"filename\":\".existing-file-attachment\"}\n" diff --git a/shared/sentry/tests/unit/test_basic.c b/shared/sentry/src/tests/unit/test_basic.c similarity index 93% rename from shared/sentry/tests/unit/test_basic.c rename to shared/sentry/src/tests/unit/test_basic.c index d8a51e461..fc508bbd2 100644 --- a/shared/sentry/tests/unit/test_basic.c +++ b/shared/sentry/src/tests/unit/test_basic.c @@ -176,14 +176,19 @@ SENTRY_TEST(crashed_last_run) TEST_CHECK_INT_EQUAL(sentry_get_crashed_last_run(), -1); options = sentry_options_new(); - sentry_options_set_dsn(options, "https://foo@sentry.invalid/42"); + const char *dsn_str = "https://foo@sentry.invalid/42"; + const char dsn[] = { 'h', 't', 't', 'p', 's', ':', '/', '/', 'f', 'o', 'o', + '@', 's', 'e', 'n', 't', 'r', 'y', '.', 'i', 'n', 'v', 'a', 'l', 'i', + 'd', '/', '4', '2' }; + sentry_options_set_dsn_n(options, dsn, sizeof(dsn)); + TEST_CHECK_STRING_EQUAL(sentry_options_get_dsn(options), dsn_str); TEST_CHECK_INT_EQUAL(sentry_init(options), 0); sentry_close(); TEST_CHECK_INT_EQUAL(sentry_get_crashed_last_run(), 0); options = sentry_options_new(); - sentry_options_set_dsn(options, "https://foo@sentry.invalid/42"); + sentry_options_set_dsn_n(options, dsn, sizeof(dsn)); // simulate a crash TEST_CHECK(sentry__write_crash_marker(options)); @@ -201,7 +206,7 @@ SENTRY_TEST(crashed_last_run) TEST_CHECK_INT_EQUAL(sentry_get_crashed_last_run(), 1); options = sentry_options_new(); - sentry_options_set_dsn(options, "https://foo@sentry.invalid/42"); + sentry_options_set_dsn_n(options, dsn, sizeof(dsn)); TEST_CHECK_INT_EQUAL(sentry_init(options), 0); sentry_close(); diff --git a/shared/sentry/tests/unit/test_concurrency.c b/shared/sentry/src/tests/unit/test_concurrency.c similarity index 95% rename from shared/sentry/tests/unit/test_concurrency.c rename to shared/sentry/src/tests/unit/test_concurrency.c index 946081dba..47fc691a9 100644 --- a/shared/sentry/tests/unit/test_concurrency.c +++ b/shared/sentry/src/tests/unit/test_concurrency.c @@ -43,7 +43,7 @@ SENTRY_TEST(multiple_inits) SENTRY_LEVEL_INFO, "root", "Hello World!")); sentry_value_t obj = sentry_value_new_object(); - // something that is not a uuid, as this will be forcibly changed + // something that is not a UUID, as this will be forcibly changed sentry_value_set_by_key(obj, "event_id", sentry_value_new_int32(1234)); sentry_capture_event(obj); @@ -64,7 +64,7 @@ thread_worker(void *called) SENTRY_LEVEL_INFO, "root", "Hello World!")); sentry_value_t obj = sentry_value_new_object(); - // something that is not a uuid, as this will be forcibly changed + // something that is not a UUID, as this will be forcibly changed sentry_value_set_by_key(obj, "event_id", sentry_value_new_int32(1234)); sentry_capture_event(obj); @@ -75,7 +75,7 @@ SENTRY_TEST(concurrent_init) { long called = 0; -#define THREADS_NUM 10 +#define THREADS_NUM 100 sentry_threadid_t threads[THREADS_NUM]; for (size_t i = 0; i < THREADS_NUM; i++) { diff --git a/shared/sentry/tests/unit/test_consent.c b/shared/sentry/src/tests/unit/test_consent.c similarity index 89% rename from shared/sentry/tests/unit/test_consent.c rename to shared/sentry/src/tests/unit/test_consent.c index f26af345b..d81476c27 100644 --- a/shared/sentry/tests/unit/test_consent.c +++ b/shared/sentry/src/tests/unit/test_consent.c @@ -28,6 +28,10 @@ SENTRY_TEST(basic_consent_tracking) init_consenting_sentry(); sentry_user_consent_give(); + // testing correct options ref/decref during double + // `sentry_user_consent_give` call see + // https://github.com/getsentry/sentry-native/pull/922 + sentry_user_consent_give(); TEST_CHECK_INT_EQUAL(sentry_user_consent_get(), SENTRY_USER_CONSENT_GIVEN); sentry_close(); init_consenting_sentry(); diff --git a/shared/sentry/tests/unit/test_envelopes.c b/shared/sentry/src/tests/unit/test_envelopes.c similarity index 71% rename from shared/sentry/tests/unit/test_envelopes.c rename to shared/sentry/src/tests/unit/test_envelopes.c index 2e6128a9c..7be59db4a 100644 --- a/shared/sentry/tests/unit/test_envelopes.c +++ b/shared/sentry/src/tests/unit/test_envelopes.c @@ -1,9 +1,21 @@ #include "sentry_envelope.h" +#include "sentry_path.h" #include "sentry_testsupport.h" #include "sentry_transport.h" #include "sentry_utils.h" #include "sentry_value.h" +static char *const SERIALIZED_ENVELOPE_STR + = "{\"dsn\":\"https://foo@sentry.invalid/42\"," + "\"event_id\":\"c993afb6-b4ac-48a6-b61b-2558e601d65d\"}\n" + "{\"type\":\"event\",\"length\":71}\n" + "{\"event_id\":\"c993afb6-b4ac-48a6-b61b-2558e601d65d\",\"some-" + "context\":null}\n" + "{\"type\":\"minidump\",\"length\":4}\n" + "MDMP\n" + "{\"type\":\"attachment\",\"length\":12}\n" + "Hello World!"; + SENTRY_TEST(basic_http_request_preparation_for_event) { sentry_dsn_t *dsn = sentry__dsn_new("https://foo@sentry.invalid/42"); @@ -17,7 +29,7 @@ SENTRY_TEST(basic_http_request_preparation_for_event) sentry__envelope_add_event(envelope, event); sentry_prepared_http_request_t *req - = sentry__prepare_http_request(envelope, dsn, NULL); + = sentry__prepare_http_request(envelope, dsn, NULL, NULL); TEST_CHECK_STRING_EQUAL(req->method, "POST"); TEST_CHECK_STRING_EQUAL( req->url, "https://sentry.invalid:443/api/42/envelope/"); @@ -46,7 +58,7 @@ SENTRY_TEST(basic_http_request_preparation_for_transaction) sentry__envelope_add_transaction(envelope, transaction); sentry_prepared_http_request_t *req - = sentry__prepare_http_request(envelope, dsn, NULL); + = sentry__prepare_http_request(envelope, dsn, NULL, NULL); TEST_CHECK_STRING_EQUAL(req->method, "POST"); TEST_CHECK_STRING_EQUAL( req->url, "https://sentry.invalid:443/api/42/envelope/"); @@ -79,7 +91,7 @@ SENTRY_TEST(basic_http_request_preparation_for_event_with_attachment) envelope, msg, sizeof(msg) - 1, "attachment"); sentry_prepared_http_request_t *req - = sentry__prepare_http_request(envelope, dsn, NULL); + = sentry__prepare_http_request(envelope, dsn, NULL, NULL); TEST_CHECK_STRING_EQUAL(req->method, "POST"); TEST_CHECK_STRING_EQUAL( req->url, "https://sentry.invalid:443/api/42/envelope/"); @@ -108,7 +120,7 @@ SENTRY_TEST(basic_http_request_preparation_for_minidump) envelope, msg, sizeof(msg) - 1, "attachment"); sentry_prepared_http_request_t *req - = sentry__prepare_http_request(envelope, dsn, NULL); + = sentry__prepare_http_request(envelope, dsn, NULL, NULL); TEST_CHECK_STRING_EQUAL(req->method, "POST"); TEST_CHECK_STRING_EQUAL( req->url, "https://sentry.invalid:443/api/42/envelope/"); @@ -124,7 +136,8 @@ SENTRY_TEST(basic_http_request_preparation_for_minidump) sentry__dsn_decref(dsn); } -SENTRY_TEST(serialize_envelope) +sentry_envelope_t * +create_test_envelope() { sentry_options_t *options = sentry_options_new(); sentry_options_set_dsn(options, "https://foo@sentry.invalid/42"); @@ -145,25 +158,60 @@ SENTRY_TEST(serialize_envelope) char msg[] = "Hello World!"; sentry__envelope_add_from_buffer( envelope, msg, sizeof(msg) - 1, "attachment"); + return envelope; +} + +SENTRY_TEST(serialize_envelope) +{ + sentry_envelope_t *envelope = create_test_envelope(); sentry_stringbuilder_t sb; sentry__stringbuilder_init(&sb); sentry__envelope_serialize_into_stringbuilder(envelope, &sb); char *str = sentry__stringbuilder_into_string(&sb); - TEST_CHECK_STRING_EQUAL(str, - "{\"dsn\":\"https://foo@sentry.invalid/42\"," - "\"event_id\":\"c993afb6-b4ac-48a6-b61b-2558e601d65d\"}\n" - "{\"type\":\"event\",\"length\":71}\n" - "{\"event_id\":\"c993afb6-b4ac-48a6-b61b-2558e601d65d\",\"some-" - "context\":null}\n" - "{\"type\":\"minidump\",\"length\":4}\n" - "MDMP\n" - "{\"type\":\"attachment\",\"length\":12}\n" - "Hello World!"); + TEST_CHECK_STRING_EQUAL(str, SERIALIZED_ENVELOPE_STR); sentry_envelope_free(envelope); sentry_free(str); sentry_close(); } + +SENTRY_TEST(basic_write_envelope_to_file) +{ + sentry_envelope_t *envelope = create_test_envelope(); + const char *test_file_str = "sentry_test_envelope"; + sentry_path_t *test_file_path = sentry__path_from_str(test_file_str); + int rv = sentry_envelope_write_to_file(envelope, test_file_str); + TEST_CHECK_INT_EQUAL(rv, 0); + TEST_ASSERT(sentry__path_is_file(test_file_path)); + + size_t test_file_size; + char *test_file_content + = sentry__path_read_to_buffer(test_file_path, &test_file_size); + TEST_CHECK_INT_EQUAL(test_file_size, strlen(SERIALIZED_ENVELOPE_STR)); + TEST_CHECK_STRING_EQUAL(test_file_content, SERIALIZED_ENVELOPE_STR); + + sentry_free(test_file_content); + sentry__path_remove(test_file_path); + sentry__path_free(test_file_path); + sentry_envelope_free(envelope); + sentry_close(); +} + +SENTRY_TEST(write_envelope_to_file_null) +{ + sentry_envelope_t *empty_envelope = sentry__envelope_new(); + + TEST_CHECK_INT_EQUAL( + sentry_envelope_write_to_file(NULL, "irrelevant/path"), 1); + TEST_CHECK_INT_EQUAL( + sentry_envelope_write_to_file(empty_envelope, NULL), 1); + TEST_CHECK_INT_EQUAL( + sentry_envelope_write_to_file_n(NULL, "irrelevant/path", 0), 1); + TEST_CHECK_INT_EQUAL( + sentry_envelope_write_to_file_n(empty_envelope, NULL, 0), 1); + + sentry_envelope_free(empty_envelope); +} diff --git a/shared/sentry/tests/unit/test_failures.c b/shared/sentry/src/tests/unit/test_failures.c similarity index 100% rename from shared/sentry/tests/unit/test_failures.c rename to shared/sentry/src/tests/unit/test_failures.c diff --git a/shared/sentry/tests/unit/test_fuzzfailures.c b/shared/sentry/src/tests/unit/test_fuzzfailures.c similarity index 100% rename from shared/sentry/tests/unit/test_fuzzfailures.c rename to shared/sentry/src/tests/unit/test_fuzzfailures.c diff --git a/shared/sentry/tests/unit/test_info.c b/shared/sentry/src/tests/unit/test_info.c similarity index 100% rename from shared/sentry/tests/unit/test_info.c rename to shared/sentry/src/tests/unit/test_info.c diff --git a/shared/sentry/tests/unit/test_logger.c b/shared/sentry/src/tests/unit/test_logger.c similarity index 100% rename from shared/sentry/tests/unit/test_logger.c rename to shared/sentry/src/tests/unit/test_logger.c diff --git a/shared/sentry/tests/unit/test_modulefinder.c b/shared/sentry/src/tests/unit/test_modulefinder.c similarity index 62% rename from shared/sentry/tests/unit/test_modulefinder.c rename to shared/sentry/src/tests/unit/test_modulefinder.c index 38440406b..09298e0ee 100644 --- a/shared/sentry/tests/unit/test_modulefinder.c +++ b/shared/sentry/src/tests/unit/test_modulefinder.c @@ -120,12 +120,11 @@ SENTRY_TEST(procmaps_parser) #endif } -SENTRY_TEST(buildid_fallback) +#ifdef SENTRY_PLATFORM_LINUX +static void +parse_elf_and_check_code_and_build_id(const char *rel_elf_path, + const char *expected_code_id, const char *expected_debug_id) { - // skipping this on android because it does not have access to the fixtures -#if !defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID) - SKIP_TEST(); -#else sentry_path_t *path = sentry__path_from_str(__FILE__); sentry_path_t *dir = sentry__path_dir(path); sentry__path_free(path); @@ -135,72 +134,55 @@ SENTRY_TEST(buildid_fallback) size_t *file_size = &module.mappings[0].size; char **buf = (char **)&module.mappings[0].addr; - sentry_value_t with_id_val = sentry_value_new_object(); - sentry_path_t *with_id_path - = sentry__path_join_str(dir, "../fixtures/with-buildid.so"); - *buf = sentry__path_read_to_buffer(with_id_path, file_size); - sentry__path_free(with_id_path); + sentry_value_t value = sentry_value_new_object(); + sentry_path_t *elf_path = sentry__path_join_str(dir, rel_elf_path); + *buf = sentry__path_read_to_buffer(elf_path, file_size); + sentry__path_free(elf_path); - TEST_CHECK(sentry__procmaps_read_ids_from_elf(with_id_val, &module)); + TEST_CHECK(sentry__procmaps_read_ids_from_elf(value, &module)); sentry_free(*buf); + sentry__path_free(dir); - TEST_CHECK_STRING_EQUAL( - sentry_value_as_string(sentry_value_get_by_key(with_id_val, "code_id")), - "1c304742f114215453a8a777f6cdb3a2b8505e11"); - TEST_CHECK_STRING_EQUAL(sentry_value_as_string(sentry_value_get_by_key( - with_id_val, "debug_id")), - "4247301c-14f1-5421-53a8-a777f6cdb3a2"); - sentry_value_decref(with_id_val); - - sentry_value_t x86_exe_val = sentry_value_new_object(); - sentry_path_t *x86_exe_path - = sentry__path_join_str(dir, "../fixtures/sentry_example"); - *buf = sentry__path_read_to_buffer(x86_exe_path, file_size); - sentry__path_free(x86_exe_path); - - TEST_CHECK(sentry__procmaps_read_ids_from_elf(x86_exe_val, &module)); - sentry_free(*buf); + if (expected_code_id) { + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(value, "code_id")), + expected_code_id); + } else { + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(value, "code_id"))); + } + // The debug-id should always be non-NULL TEST_CHECK_STRING_EQUAL( - sentry_value_as_string(sentry_value_get_by_key(x86_exe_val, "code_id")), - "b4c24a6cc995c17fb18a65184a65863cfc01c673"); - TEST_CHECK_STRING_EQUAL(sentry_value_as_string(sentry_value_get_by_key( - x86_exe_val, "debug_id")), - "6c4ac2b4-95c9-7fc1-b18a-65184a65863c"); - sentry_value_decref(x86_exe_val); + sentry_value_as_string(sentry_value_get_by_key(value, "debug_id")), + expected_debug_id); - sentry_value_t without_id_val = sentry_value_new_object(); - sentry_path_t *without_id_path - = sentry__path_join_str(dir, "../fixtures/without-buildid.so"); - *buf = sentry__path_read_to_buffer(without_id_path, file_size); - sentry__path_free(without_id_path); + sentry_value_decref(value); +} +#endif - TEST_CHECK(sentry__procmaps_read_ids_from_elf(without_id_val, &module)); - sentry_free(*buf); +SENTRY_TEST(build_id_parser) +{ + // skipping this on android because it does not have access to the fixtures +#if !defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID) + SKIP_TEST(); +#else + parse_elf_and_check_code_and_build_id("../fixtures/with-buildid.so", + "1c304742f114215453a8a777f6cdb3a2b8505e11", + "4247301c-14f1-5421-53a8-a777f6cdb3a2"); - TEST_CHECK(sentry_value_is_null( - sentry_value_get_by_key(without_id_val, "code_id"))); - TEST_CHECK_STRING_EQUAL(sentry_value_as_string(sentry_value_get_by_key( - without_id_val, "debug_id")), - "29271919-a2ef-129d-9aac-be85a0948d9c"); - sentry_value_decref(without_id_val); + parse_elf_and_check_code_and_build_id("../fixtures/without-buildid-phdr.so", + "1c304742f114215453a8a777f6cdb3a2b8505e11", + "4247301c-14f1-5421-53a8-a777f6cdb3a2"); - sentry_value_t x86_lib_val = sentry_value_new_object(); - sentry_path_t *x86_lib_path - = sentry__path_join_str(dir, "../fixtures/libstdc++.so"); - *buf = sentry__path_read_to_buffer(x86_lib_path, file_size); - sentry__path_free(x86_lib_path); + parse_elf_and_check_code_and_build_id("../fixtures/sentry_example", + "b4c24a6cc995c17fb18a65184a65863cfc01c673", + "6c4ac2b4-95c9-7fc1-b18a-65184a65863c"); - TEST_CHECK(sentry__procmaps_read_ids_from_elf(x86_lib_val, &module)); - sentry_free(*buf); + parse_elf_and_check_code_and_build_id("../fixtures/without-buildid.so", + NULL, "29271919-a2ef-129d-9aac-be85a0948d9c"); - TEST_CHECK( - sentry_value_is_null(sentry_value_get_by_key(x86_lib_val, "code_id"))); - TEST_CHECK_STRING_EQUAL(sentry_value_as_string(sentry_value_get_by_key( - x86_lib_val, "debug_id")), + parse_elf_and_check_code_and_build_id("../fixtures/libstdc++.so", NULL, "7fa824da-38f1-b87c-04df-718fda64990c"); - sentry_value_decref(x86_lib_val); - - sentry__path_free(dir); #endif } diff --git a/shared/sentry/tests/unit/test_mpack.c b/shared/sentry/src/tests/unit/test_mpack.c similarity index 100% rename from shared/sentry/tests/unit/test_mpack.c rename to shared/sentry/src/tests/unit/test_mpack.c diff --git a/shared/sentry/src/tests/unit/test_options.c b/shared/sentry/src/tests/unit/test_options.c new file mode 100644 index 000000000..c9115a434 --- /dev/null +++ b/shared/sentry/src/tests/unit/test_options.c @@ -0,0 +1,54 @@ +#include "sentry_options.h" +#include "sentry_testsupport.h" + +SENTRY_TEST(options_sdk_name_defaults) +{ + sentry_options_t *options = sentry_options_new(); + // when nothing is set + + // then both sdk name and user agent should default to the build time + // directives + TEST_CHECK_STRING_EQUAL( + sentry_options_get_sdk_name(options), SENTRY_SDK_NAME); + TEST_CHECK_STRING_EQUAL( + sentry_options_get_user_agent(options), SENTRY_SDK_USER_AGENT); + + sentry_options_free(options); +} + +SENTRY_TEST(options_sdk_name_custom) +{ + sentry_options_t *options = sentry_options_new(); + + // when the sdk name is set to a custom string + const int result + = sentry_options_set_sdk_name(options, "sentry.native.android.flutter"); + + // both the sdk_name and user_agent should reflect this change + TEST_CHECK_INT_EQUAL(result, 0); + TEST_CHECK_STRING_EQUAL( + sentry_options_get_sdk_name(options), "sentry.native.android.flutter"); + + TEST_CHECK_STRING_EQUAL(sentry_options_get_user_agent(options), + "sentry.native.android.flutter/" SENTRY_SDK_VERSION); + + sentry_options_free(options); +} + +SENTRY_TEST(options_sdk_name_invalid) +{ + sentry_options_t *options = sentry_options_new(); + + // when the sdk name is set to an invalid value + const char *sdk_name = NULL; + const int result = sentry_options_set_sdk_name(options, sdk_name); + + // then the value should be ignored + TEST_CHECK_INT_EQUAL(result, 1); + TEST_CHECK_STRING_EQUAL( + sentry_options_get_sdk_name(options), SENTRY_SDK_NAME); + TEST_CHECK_STRING_EQUAL( + sentry_options_get_user_agent(options), SENTRY_SDK_USER_AGENT); + + sentry_options_free(options); +} diff --git a/shared/sentry/tests/unit/test_path.c b/shared/sentry/src/tests/unit/test_path.c similarity index 90% rename from shared/sentry/tests/unit/test_path.c rename to shared/sentry/src/tests/unit/test_path.c index 3f25d77a5..8424d1f0b 100644 --- a/shared/sentry/tests/unit/test_path.c +++ b/shared/sentry/src/tests/unit/test_path.c @@ -58,6 +58,26 @@ SENTRY_TEST(path_joining_unix) #endif } +SENTRY_TEST(path_from_str_null) +{ + TEST_CHECK(NULL == sentry__path_from_str(NULL)); + TEST_CHECK(NULL == sentry__path_from_str_n(NULL, 0)); + TEST_CHECK(NULL == sentry__path_from_str_n(NULL, 10)); +} + +SENTRY_TEST(path_from_str_n_wo_null_termination) +{ + // provide non-null-terminated path string with buffer character at the end. + char path_str[] = { 't', 'e', 's', 't', 'X' }; + sentry_path_t *test_path = sentry__path_from_str_n(path_str, 4); +#ifdef SENTRY_PLATFORM_WINDOWS + TEST_CHECK_WSTRING_EQUAL(test_path->path, L"test"); +#else + TEST_CHECK_STRING_EQUAL(test_path->path, "test"); +#endif + sentry__path_free(test_path); +} + SENTRY_TEST(path_joining_windows) { #ifndef SENTRY_PLATFORM_WINDOWS diff --git a/shared/sentry/tests/unit/test_ratelimiter.c b/shared/sentry/src/tests/unit/test_ratelimiter.c similarity index 100% rename from shared/sentry/tests/unit/test_ratelimiter.c rename to shared/sentry/src/tests/unit/test_ratelimiter.c diff --git a/shared/sentry/tests/unit/test_sampling.c b/shared/sentry/src/tests/unit/test_sampling.c similarity index 100% rename from shared/sentry/tests/unit/test_sampling.c rename to shared/sentry/src/tests/unit/test_sampling.c diff --git a/shared/sentry/tests/unit/test_session.c b/shared/sentry/src/tests/unit/test_session.c similarity index 92% rename from shared/sentry/tests/unit/test_session.c rename to shared/sentry/src/tests/unit/test_session.c index 59fa8774c..ebaaed389 100644 --- a/shared/sentry/tests/unit/test_session.c +++ b/shared/sentry/src/tests/unit/test_session.c @@ -26,7 +26,7 @@ send_envelope(const sentry_envelope_t *envelope, void *data) SENTRY_VALUE_TYPE_STRING); TEST_CHECK_STRING_EQUAL( sentry_value_as_string(sentry_value_get_by_key(session, "status")), - "exited"); + *called == 2 ? "crashed" : "exited"); TEST_CHECK_STRING_EQUAL( sentry_value_as_string(sentry_value_get_by_key(session, "did")), *called == 1 ? "foo@blabla.invalid" : "swatinem"); @@ -47,7 +47,7 @@ send_envelope(const sentry_envelope_t *envelope, void *data) "my_release"); TEST_CHECK_STRING_EQUAL( sentry_value_as_string(sentry_value_get_by_key(attrs, "environment")), - "my_environment"); + "test"); sentry_value_decref(session); } @@ -67,6 +67,10 @@ SENTRY_TEST(session_basics) TEST_CHECK_STRING_EQUAL( sentry_options_get_environment(options), "production"); sentry_options_set_environment(options, "my_environment"); + TEST_CHECK_STRING_EQUAL( + sentry_options_get_environment(options), "my_environment"); + char env[] = { 't', 'e', 's', 't' }; + sentry_options_set_environment_n(options, env, sizeof(env)); sentry_init(options); // a session was already started by automatic session tracking @@ -83,9 +87,12 @@ SENTRY_TEST(session_basics) user, "username", sentry_value_new_string("swatinem")); sentry_set_user(user); + sentry_end_session_with_status(SENTRY_SESSION_STATUS_CRASHED); + sentry_start_session(); + sentry_close(); - TEST_CHECK_INT_EQUAL(called, 2); + TEST_CHECK_INT_EQUAL(called, 3); } typedef struct { diff --git a/shared/sentry/tests/unit/test_slice.c b/shared/sentry/src/tests/unit/test_slice.c similarity index 100% rename from shared/sentry/tests/unit/test_slice.c rename to shared/sentry/src/tests/unit/test_slice.c diff --git a/shared/sentry/tests/unit/test_symbolizer.c b/shared/sentry/src/tests/unit/test_symbolizer.c similarity index 100% rename from shared/sentry/tests/unit/test_symbolizer.c rename to shared/sentry/src/tests/unit/test_symbolizer.c diff --git a/shared/sentry/tests/unit/test_sync.c b/shared/sentry/src/tests/unit/test_sync.c similarity index 100% rename from shared/sentry/tests/unit/test_sync.c rename to shared/sentry/src/tests/unit/test_sync.c diff --git a/shared/sentry/tests/unit/test_tracing.c b/shared/sentry/src/tests/unit/test_tracing.c similarity index 73% rename from shared/sentry/tests/unit/test_tracing.c rename to shared/sentry/src/tests/unit/test_tracing.c index a960273e0..bdac0921f 100644 --- a/shared/sentry/tests/unit/test_tracing.c +++ b/shared/sentry/src/tests/unit/test_tracing.c @@ -94,9 +94,19 @@ SENTRY_TEST(basic_transaction) sentry_transaction_context_set_name(opaque_tx_cxt, ""); CHECK_STRING_PROPERTY(tx_cxt, "transaction", ""); + char txn_ctx_name[] = { 'h', 'o', 'n', 'k', '.', 'b', 'e', 'e', 'p' }; + sentry_transaction_context_set_name_n( + opaque_tx_cxt, txn_ctx_name, sizeof(txn_ctx_name)); + CHECK_STRING_PROPERTY(tx_cxt, "transaction", "honk.beep"); + sentry_transaction_context_set_operation(opaque_tx_cxt, ""); CHECK_STRING_PROPERTY(tx_cxt, "op", ""); + char txn_ctx_op[] = { 'b', 'e', 'e', 'p', 'b', 'e', 'e', 'p' }; + sentry_transaction_context_set_operation_n( + opaque_tx_cxt, txn_ctx_op, sizeof(txn_ctx_op)); + CHECK_STRING_PROPERTY(tx_cxt, "op", "beepbeep"); + sentry_transaction_context_set_sampled(opaque_tx_cxt, 1); TEST_CHECK( sentry_value_is_true(sentry_value_get_by_key(tx_cxt, "sampled")) @@ -195,9 +205,13 @@ SENTRY_TEST(basic_function_transport_transaction) // consent was not given TEST_CHECK(!sentry_uuid_is_nil(&event_id)); sentry_user_consent_give(); - - tx_cxt = sentry_transaction_context_new("honk", "beep"); + char name[] = { 'h', 'o', 'n', 'k' }; + char op[] = { 'b', 'e', 'e', 'p' }; + tx_cxt + = sentry_transaction_context_new_n(name, sizeof(name), op, sizeof(op)); tx = sentry_transaction_start(tx_cxt, sentry_value_new_null()); + CHECK_STRING_PROPERTY(tx->inner, "transaction", "honk"); + CHECK_STRING_PROPERTY(tx->inner, "op", "beep"); event_id = sentry_transaction_finish(tx); TEST_CHECK(!sentry_uuid_is_nil(&event_id)); @@ -697,6 +711,43 @@ forward_headers_to(const char *key, const char *value, void *userdata) sentry_transaction_context_update_from_header(tx_ctx, key, value); } +SENTRY_TEST(update_from_header_null_ctx) +{ + sentry_transaction_context_update_from_header( + NULL, "irrelevant-key", "irrelevant-value"); +} + +SENTRY_TEST(update_from_header_no_sampled_flag) +{ + sentry_options_t *options = sentry_options_new(); + sentry_options_set_dsn(options, "https://foo@sentry.invalid/42"); + + sentry_options_set_traces_sample_rate(options, 1.0); + sentry_options_set_max_spans(options, 2); + sentry_init(options); + + sentry_transaction_context_update_from_header( + NULL, "irrelevant-key", "irrelevant-value"); + const char *trace_header + = "2674eb52d5874b13b560236d6c79ce8a-a0f9fdf04f1a63df"; + sentry_transaction_context_t *tx_ctx + = sentry_transaction_context_new("wow!", NULL); + sentry_transaction_context_update_from_header( + tx_ctx, "sentry-trace", trace_header); + sentry_transaction_t *tx + = sentry_transaction_start(tx_ctx, sentry_value_new_null()); + + CHECK_STRING_PROPERTY( + tx->inner, "trace_id", "2674eb52d5874b13b560236d6c79ce8a"); + CHECK_STRING_PROPERTY(tx->inner, "parent_span_id", "a0f9fdf04f1a63df"); + sentry_value_t sampled = sentry_value_get_by_key(tx->inner, "sampled"); + TEST_CHECK(sentry_value_get_type(sampled) == SENTRY_VALUE_TYPE_BOOL); + TEST_CHECK(sentry_value_is_true(sampled)); + + sentry__transaction_decref(tx); + sentry_close(); +} + SENTRY_TEST(distributed_headers) { sentry_options_t *options = sentry_options_new(); @@ -715,9 +766,14 @@ SENTRY_TEST(distributed_headers) sentry_transaction_context_t *tx_ctx = sentry_transaction_context_new("wow!", NULL); - // check case insensitive headers, and bogus header names + // check case-insensitive headers, and bogus header names sentry_transaction_context_update_from_header( tx_ctx, "SeNtry-TrAcE", trace_header); + sentry_transaction_context_update_from_header( + tx_ctx, "sentry_trace", not_expected_header); + sentry_transaction_context_update_from_header( + tx_ctx, NULL, not_expected_header); + sentry_transaction_context_update_from_header(tx_ctx, "sentry-trace", NULL); sentry_transaction_context_update_from_header( tx_ctx, "nop", not_expected_header); sentry_transaction_context_update_from_header( @@ -807,5 +863,246 @@ SENTRY_TEST(distributed_headers) sentry_close(); } +void +check_after_set(sentry_value_t inner, const char *inner_key, + const char *item_key, const char *expected) +{ + sentry_value_t inner_tags = sentry_value_get_by_key(inner, inner_key); + TEST_CHECK_INT_EQUAL(1, sentry_value_get_length(inner_tags)); + TEST_CHECK( + sentry_value_get_type(sentry_value_get_by_key(inner_tags, item_key)) + == SENTRY_VALUE_TYPE_STRING); + CHECK_STRING_PROPERTY(inner_tags, item_key, expected); +} + +void +check_after_remove( + sentry_value_t inner, const char *inner_key, const char *item_key) +{ + sentry_value_t inner_tags = sentry_value_get_by_key(inner, inner_key); + TEST_CHECK_INT_EQUAL(0, sentry_value_get_length(inner_tags)); + TEST_CHECK(IS_NULL(inner_tags, item_key)); +} + +SENTRY_TEST(txn_tagging) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + + sentry_transaction_set_tag(txn, "os.name", "Linux"); + check_after_set(txn->inner, "tags", "os.name", "Linux"); + + sentry_transaction_remove_tag(txn, "os.name"); + check_after_remove(txn->inner, "tags", "os.name"); + + sentry__transaction_decref(txn); +} + +SENTRY_TEST(span_tagging) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + sentry_span_t *span = sentry__span_new(txn, sentry_value_new_object()); + + sentry_span_set_tag(span, "os.name", "Linux"); + check_after_set(span->inner, "tags", "os.name", "Linux"); + + sentry_span_remove_tag(span, "os.name"); + check_after_remove(span->inner, "tags", "os.name"); + + sentry__span_decref(span); + sentry__transaction_decref(txn); +} + +SENTRY_TEST(txn_tagging_n) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + + char tag[] = { 'o', 's', '.', 'n', 'a', 'm', 'e' }; + char tag_val[] = { 'L', 'i', 'n', 'u', 'x' }; + sentry_transaction_set_tag_n( + txn, tag, sizeof(tag), tag_val, sizeof(tag_val)); + check_after_set(txn->inner, "tags", "os.name", "Linux"); + + sentry_transaction_remove_tag_n(txn, tag, sizeof(tag)); + check_after_remove(txn->inner, "tags", "os.name"); + + sentry__transaction_decref(txn); +} + +SENTRY_TEST(span_tagging_n) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + sentry_span_t *span = sentry__span_new(txn, sentry_value_new_object()); + + char tag[] = { 'o', 's', '.', 'n', 'a', 'm', 'e' }; + char tag_val[] = { 'L', 'i', 'n', 'u', 'x' }; + sentry_span_set_tag_n(span, tag, sizeof(tag), tag_val, sizeof(tag_val)); + check_after_set(span->inner, "tags", "os.name", "Linux"); + + sentry_span_remove_tag_n(span, tag, sizeof(tag)); + check_after_remove(span->inner, "tags", "os.name"); + + sentry__span_decref(span); + sentry__transaction_decref(txn); +} + +SENTRY_TEST(txn_name) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + + char *txn_name = "the_txn"; + sentry_transaction_set_name(txn, txn_name); + sentry_value_t txn_name_value + = sentry_value_get_by_key(txn->inner, "transaction"); + TEST_CHECK( + sentry_value_get_type(txn_name_value) == SENTRY_VALUE_TYPE_STRING); + TEST_CHECK_STRING_EQUAL(sentry_value_as_string(txn_name_value), txn_name); + + sentry__transaction_decref(txn); +} + +SENTRY_TEST(txn_data) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + + sentry_transaction_set_data( + txn, "os.name", sentry_value_new_string("Linux")); + check_after_set(txn->inner, "data", "os.name", "Linux"); + + sentry_transaction_remove_data(txn, "os.name"); + check_after_remove(txn->inner, "data", "os.name"); + + sentry__transaction_decref(txn); +} + +SENTRY_TEST(span_data) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + sentry_span_t *span = sentry__span_new(txn, sentry_value_new_object()); + + sentry_span_set_data(span, "os.name", sentry_value_new_string("Linux")); + check_after_set(span->inner, "data", "os.name", "Linux"); + + sentry_span_remove_data(span, "os.name"); + check_after_remove(span->inner, "data", "os.name"); + + sentry__span_decref(span); + sentry__transaction_decref(txn); +} + +SENTRY_TEST(txn_name_n) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + char txn_name[] = { 't', 'h', 'e', '_', 't', 'x', 'n' }; + sentry_transaction_set_name_n(txn, txn_name, sizeof(txn_name)); + + sentry_value_t txn_name_value + = sentry_value_get_by_key(txn->inner, "transaction"); + TEST_CHECK( + sentry_value_get_type(txn_name_value) == SENTRY_VALUE_TYPE_STRING); + TEST_CHECK_STRING_EQUAL(sentry_value_as_string(txn_name_value), "the_txn"); + + sentry__transaction_decref(txn); +} + +SENTRY_TEST(txn_data_n) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + + char data_k[] = { 'o', 's', '.', 'n', 'a', 'm', 'e' }; + char data_v[] = { 'L', 'i', 'n', 'u', 'x' }; + sentry_value_t data_value + = sentry_value_new_string_n(data_v, sizeof(data_v)); + sentry_transaction_set_data_n(txn, data_k, sizeof(data_k), data_value); + check_after_set(txn->inner, "data", "os.name", "Linux"); + + sentry_transaction_remove_data_n(txn, data_k, sizeof(data_k)); + check_after_remove(txn->inner, "data", "os.name"); + + sentry__transaction_decref(txn); +} + +SENTRY_TEST(span_data_n) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + sentry_span_t *span = sentry__span_new(txn, sentry_value_new_object()); + + char data_k[] = { 'o', 's', '.', 'n', 'a', 'm', 'e' }; + char data_v[] = { 'L', 'i', 'n', 'u', 'x' }; + sentry_value_t data_value + = sentry_value_new_string_n(data_v, sizeof(data_v)); + sentry_span_set_data_n(span, data_k, sizeof(data_k), data_value); + check_after_set(span->inner, "data", "os.name", "Linux"); + + sentry_span_remove_data_n(span, data_k, sizeof(data_k)); + check_after_remove(span->inner, "data", "os.name"); + + sentry__span_decref(span); + sentry__transaction_decref(txn); +} + +SENTRY_TEST(sentry__value_span_new_requires_unfinished_parent) +{ + sentry_value_t parent = sentry_value_new_object(); + // timestamps are typically iso8601 strings, but this is irrelevant to + // `sentry__value_span_new` which just wants `timestamp` to not be null. + sentry_value_set_by_key(parent, "timestamp", sentry_value_new_object()); + sentry_value_t inner_span = sentry__value_span_new(0, parent, NULL, NULL); + TEST_CHECK(sentry_value_is_null(inner_span)); + + sentry_value_decref(parent); +} + +SENTRY_TEST(set_tag_allows_null_tag_and_value) +{ + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + sentry_transaction_set_tag(txn, NULL, NULL); + sentry_value_t tags = sentry_value_get_by_key(txn->inner, "tags"); + TEST_CHECK(!sentry_value_is_null(tags)); + TEST_CHECK(sentry_value_get_type(tags) == SENTRY_VALUE_TYPE_OBJECT); + TEST_CHECK(sentry_value_get_length(tags) == 0); + + sentry_transaction_set_tag(txn, "os.name", NULL); + tags = sentry_value_get_by_key(txn->inner, "tags"); + TEST_CHECK(!sentry_value_is_null(tags)); + TEST_CHECK(sentry_value_get_type(tags) == SENTRY_VALUE_TYPE_OBJECT); + TEST_CHECK(sentry_value_get_length(tags) == 1); + TEST_CHECK(IS_NULL(tags, "os.name")); + + sentry__transaction_decref(txn); +} + +SENTRY_TEST(set_tag_cuts_value_at_length_200) +{ + const char test_value[] + = "012345678901234567890123456789012345678901234567890123456789" + "012345678901234567890123456789012345678901234567890123456789" + "012345678901234567890123456789012345678901234567890123456789" + "012345678901234567890123456789012345678901234567890123456789"; + + sentry_transaction_t *txn + = sentry__transaction_new(sentry_value_new_object()); + sentry_transaction_set_tag(txn, "cut-off", test_value); + sentry_value_t tags = sentry_value_get_by_key(txn->inner, "tags"); + TEST_CHECK(!sentry_value_is_null(tags)); + TEST_CHECK(sentry_value_get_type(tags) == SENTRY_VALUE_TYPE_OBJECT); + TEST_CHECK(sentry_value_get_length(tags) == 1); + TEST_CHECK_INT_EQUAL(strlen(sentry_value_as_string( + sentry_value_get_by_key(tags, "cut-off"))), + 200); + + sentry__transaction_decref(txn); +} + #undef IS_NULL #undef CHECK_STRING_PROPERTY diff --git a/shared/sentry/tests/unit/test_uninit.c b/shared/sentry/src/tests/unit/test_uninit.c similarity index 100% rename from shared/sentry/tests/unit/test_uninit.c rename to shared/sentry/src/tests/unit/test_uninit.c diff --git a/shared/sentry/tests/unit/test_unwinder.c b/shared/sentry/src/tests/unit/test_unwinder.c similarity index 100% rename from shared/sentry/tests/unit/test_unwinder.c rename to shared/sentry/src/tests/unit/test_unwinder.c diff --git a/shared/sentry/tests/unit/test_utils.c b/shared/sentry/src/tests/unit/test_utils.c similarity index 61% rename from shared/sentry/tests/unit/test_utils.c rename to shared/sentry/src/tests/unit/test_utils.c index f280f59f7..232303415 100644 --- a/shared/sentry/tests/unit/test_utils.c +++ b/shared/sentry/src/tests/unit/test_utils.c @@ -152,7 +152,7 @@ SENTRY_TEST(dsn_store_url_with_path) TEST_CHECK_STRING_EQUAL( url, "http://example.com:80/foo/bar/api/42/envelope/"); sentry_free(url); - url = sentry__dsn_get_minidump_url(dsn); + url = sentry__dsn_get_minidump_url(dsn, SENTRY_SDK_USER_AGENT); TEST_CHECK_STRING_EQUAL(url, "http://example.com:80/foo/bar/api/42/minidump/" "?sentry_client=" SENTRY_SDK_USER_AGENT "&sentry_key=username"); @@ -168,7 +168,7 @@ SENTRY_TEST(dsn_store_url_without_path) url = sentry__dsn_get_envelope_url(dsn); TEST_CHECK_STRING_EQUAL(url, "http://example.com:80/api/42/envelope/"); sentry_free(url); - url = sentry__dsn_get_minidump_url(dsn); + url = sentry__dsn_get_minidump_url(dsn, SENTRY_SDK_USER_AGENT); TEST_CHECK_STRING_EQUAL(url, "http://example.com:80/api/42/minidump/" "?sentry_client=" SENTRY_SDK_USER_AGENT "&sentry_key=username"); @@ -176,6 +176,18 @@ SENTRY_TEST(dsn_store_url_without_path) sentry__dsn_decref(dsn); } +SENTRY_TEST(dsn_store_url_custom_agent) +{ + sentry_dsn_t *dsn + = sentry__dsn_new("http://username:password@example.com/42?x=y#z"); + char *url = sentry__dsn_get_minidump_url(dsn, "custom_user_agent"); + TEST_CHECK_STRING_EQUAL(url, + "http://example.com:80/api/42/minidump/" + "?sentry_client=custom_user_agent&sentry_key=username"); + sentry_free(url); + sentry__dsn_decref(dsn); +} + SENTRY_TEST(page_allocator) { #ifndef SENTRY_PLATFORM_UNIX @@ -221,3 +233,104 @@ SENTRY_TEST(os) sentry_value_decref(os); } + +SENTRY_TEST(check_version) +{ + TEST_CHECK(sentry__check_min_version( + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); + TEST_CHECK(sentry__check_min_version( + (sentry_version_t) { .major = 7, .minor = 11, .patch = 7 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); + TEST_CHECK(sentry__check_min_version( + (sentry_version_t) { .major = 7, .minor = 10, .patch = 8 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); + TEST_CHECK(sentry__check_min_version( + (sentry_version_t) { .major = 8, .minor = 9, .patch = 7 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); + TEST_CHECK(sentry__check_min_version( + (sentry_version_t) { .major = 7, .minor = 11, .patch = 6 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); + + TEST_CHECK(!sentry__check_min_version( + (sentry_version_t) { .major = 6, .minor = 10, .patch = 7 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); + TEST_CHECK(!sentry__check_min_version( + (sentry_version_t) { .major = 7, .minor = 9, .patch = 7 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); + TEST_CHECK(!sentry__check_min_version( + (sentry_version_t) { .major = 7, .minor = 10, .patch = 6 }, + (sentry_version_t) { .major = 7, .minor = 10, .patch = 7 })); +} + +SENTRY_TEST(dsn_without_url_scheme_is_invalid) +{ + sentry_dsn_t *dsn = sentry__dsn_new("//without-scheme-separator"); + TEST_CHECK(dsn->is_valid == false); + sentry__dsn_decref(dsn); +} + +SENTRY_TEST(dsn_with_non_http_scheme_is_invalid) +{ + sentry_dsn_t *dsn = sentry__dsn_new("ftp://ftp-server/"); + TEST_CHECK(dsn->is_valid == false); + sentry__dsn_decref(dsn); +} + +SENTRY_TEST(dsn_without_project_id_is_invalid) +{ + sentry_dsn_t *dsn = sentry__dsn_new("https://foo@sentry.io/"); + TEST_CHECK(dsn->is_valid == false); + sentry__dsn_decref(dsn); +} + +SENTRY_TEST(dsn_with_ending_forward_slash_will_be_cleaned) +{ + sentry_dsn_t *dsn = sentry__dsn_new("https://foo@sentry.io/42/43/44////"); + + TEST_CHECK_STRING_EQUAL(dsn->path, "/42/43"); + TEST_CHECK_STRING_EQUAL(dsn->project_id, "44"); + TEST_CHECK(dsn->is_valid == true); + + sentry__dsn_decref(dsn); +} + +SENTRY_TEST(dsn_auth_header_no_user_agent) +{ + sentry_dsn_t *dsn = sentry__dsn_new("https://key@sentry.io/42"); + char *auth_header = sentry__dsn_get_auth_header(dsn, NULL); + TEST_CHECK_STRING_EQUAL(auth_header, + "Sentry sentry_key=key, sentry_version=7, " + "sentry_client=" SENTRY_SDK_NAME "/" SENTRY_SDK_VERSION); + + sentry_free(auth_header); + sentry__dsn_decref(dsn); +} + +SENTRY_TEST(dsn_auth_header_custom_user_agent) +{ + sentry_dsn_t *dsn = sentry__dsn_new("https://key@sentry.io/42"); + char *auth_header = sentry__dsn_get_auth_header(dsn, "user_agent"); + TEST_CHECK_STRING_EQUAL(auth_header, + "Sentry sentry_key=key, sentry_version=7, " + "sentry_client=user_agent"); + + sentry_free(auth_header); + sentry__dsn_decref(dsn); +} + +SENTRY_TEST(dsn_auth_header_null_dsn) +{ + char *auth_header = sentry__dsn_get_auth_header(NULL, NULL); + TEST_CHECK(!auth_header); +} + +SENTRY_TEST(dsn_auth_header_invalid_dsn) +{ + sentry_dsn_t *dsn = sentry__dsn_new("whatever"); + char *auth_header = sentry__dsn_get_auth_header(dsn, NULL); + TEST_CHECK(!auth_header); + + sentry_free(auth_header); + sentry__dsn_decref(dsn); +} diff --git a/shared/sentry/tests/unit/test_uuid.c b/shared/sentry/src/tests/unit/test_uuid.c similarity index 100% rename from shared/sentry/tests/unit/test_uuid.c rename to shared/sentry/src/tests/unit/test_uuid.c diff --git a/shared/sentry/tests/unit/test_value.c b/shared/sentry/src/tests/unit/test_value.c similarity index 69% rename from shared/sentry/tests/unit/test_value.c rename to shared/sentry/src/tests/unit/test_value.c index 6a4044c13..92e195d58 100644 --- a/shared/sentry/tests/unit/test_value.c +++ b/shared/sentry/src/tests/unit/test_value.c @@ -102,16 +102,31 @@ SENTRY_TEST(value_string) sentry_value_decref(val); } +SENTRY_TEST(value_string_n) +{ + sentry_value_t val = sentry_value_new_string_n(NULL, 0); + TEST_CHECK(sentry_value_is_null(val)); + TEST_CHECK(sentry_value_get_type(val) == SENTRY_VALUE_TYPE_NULL); + TEST_CHECK(sentry_value_is_true(val) == false); + sentry_value_decref(val); + + char non_null_term_empty_str[] = { 'h', 'e', 'l', 'l', 'o' }; + val = sentry_value_new_string_n( + non_null_term_empty_str, sizeof(non_null_term_empty_str)); + TEST_CHECK_STRING_EQUAL(sentry_value_as_string(val), "hello"); + TEST_CHECK(sentry_value_get_type(val) == SENTRY_VALUE_TYPE_STRING); + TEST_CHECK(sentry_value_is_true(val) == true); + sentry_value_decref(val); +} + SENTRY_TEST(value_unicode) { // https://xkcd.com/1813/ :-) - sentry_value_t val - = sentry_value_new_string("őá…–🤮🚀¿ 한글 테스트 \a\v"); - TEST_CHECK_STRING_EQUAL(sentry_value_as_string(val), - "őá…–🤮🚀¿ 한글 테스트 \a\v"); + sentry_value_t val = sentry_value_new_string("őá…–🤮🚀¿ 한글 테스트 \a\v"); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(val), "őá…–🤮🚀¿ 한글 테스트 \a\v"); // json does not need to escape unicode, except for control characters - TEST_CHECK_JSON_VALUE( - val, "\"őá…–🤮🚀¿ 한글 테스트 \\u0007\\u000b\""); + TEST_CHECK_JSON_VALUE(val, "\"őá…–🤮🚀¿ 한글 테스트 \\u0007\\u000b\""); sentry_value_decref(val); char zalgo[] = "z̴̢̈͜ä̴̺̟́ͅl̸̛̦͎̺͂̃̚͝g̷̦̲͊͋̄̌͝o̸͇̞̪͙̞͌̇̀̓̏͜"; val = sentry_value_new_string(zalgo); @@ -161,7 +176,7 @@ SENTRY_TEST(value_list) sentry_value_decref(val); val = sentry_value_new_list(); - for (uint32_t i = 1; i <= 10; i++) { + for (int32_t i = 1; i <= 10; i++) { sentry_value_append(val, sentry_value_new_int32(i)); } sentry__value_append_bounded(val, sentry_value_new_int32(1010), 5); @@ -547,6 +562,89 @@ SENTRY_TEST(value_collections_leak) sentry_value_decref(obj); } +SENTRY_TEST(value_set_by_null_key) +{ + sentry_value_t value = sentry_value_new_object(); + sentry_value_t payload = sentry_value_new_object(); + + TEST_CHECK(sentry_value_refcount(payload) == 1); + TEST_CHECK_INT_EQUAL(1, sentry_value_set_by_key(value, NULL, payload)); + TEST_CHECK(sentry_value_get_length(value) == 0); + + payload = sentry_value_new_object(); + TEST_CHECK(sentry_value_refcount(payload) == 1); + TEST_CHECK_INT_EQUAL(1, sentry_value_set_by_key_n(value, NULL, 0, payload)); + TEST_CHECK(sentry_value_get_length(value) == 0); + + payload = sentry_value_new_object(); + TEST_CHECK(sentry_value_refcount(payload) == 1); + TEST_CHECK_INT_EQUAL( + 1, sentry_value_set_by_key_n(value, NULL, 10, payload)); + TEST_CHECK(sentry_value_get_length(value) == 0); + + sentry_value_decref(value); +} + +SENTRY_TEST(value_remove_by_null_key) +{ + sentry_value_t value = sentry_value_new_object(); + + TEST_CHECK_INT_EQUAL(0, + sentry_value_set_by_key(value, "some_key", sentry_value_new_object())); + TEST_CHECK(sentry_value_get_length(value) == 1); + + TEST_CHECK_INT_EQUAL(1, sentry_value_remove_by_key(value, NULL)); + TEST_CHECK_INT_EQUAL(1, sentry_value_get_length(value)); + TEST_CHECK_INT_EQUAL(1, sentry_value_remove_by_key_n(value, NULL, 0)); + TEST_CHECK_INT_EQUAL(1, sentry_value_get_length(value)); + TEST_CHECK_INT_EQUAL(1, sentry_value_remove_by_key_n(value, NULL, 10)); + TEST_CHECK_INT_EQUAL(1, sentry_value_get_length(value)); + + sentry_value_decref(value); +} + +SENTRY_TEST(value_get_by_null_key) +{ + sentry_value_t value = sentry_value_new_object(); + + const char *some_key = "some_key"; + TEST_CHECK_INT_EQUAL( + 0, sentry_value_set_by_key(value, some_key, sentry_value_new_object())); + TEST_CHECK(sentry_value_get_length(value) == 1); + + sentry_value_t rv = sentry_value_get_by_key(value, NULL); + TEST_CHECK(sentry_value_is_null(rv)); + TEST_CHECK_INT_EQUAL(1, sentry_value_refcount(rv)); + + rv = sentry_value_get_by_key_owned(value, NULL); + TEST_CHECK(sentry_value_is_null(rv)); + TEST_CHECK_INT_EQUAL(1, sentry_value_refcount(rv)); + sentry_value_decref(rv); + TEST_CHECK_INT_EQUAL(1, sentry_value_refcount(rv)); + + rv = sentry_value_get_by_key_owned(value, some_key); + TEST_CHECK(!sentry_value_is_null(rv)); + TEST_CHECK_INT_EQUAL(2, sentry_value_refcount(rv)); + sentry_value_decref(rv); + TEST_CHECK_INT_EQUAL(1, sentry_value_refcount(rv)); + + // if `k_len` != any length of keys stored in the object this won't + // segfault because the `sentry_slice_t` equality check already fails due to + // the length-inequality and never reaches `memcmp()`. + TEST_CHECK(sentry_value_is_null(sentry_value_get_by_key_n(value, NULL, 0))); + // If `k_len' == any key-length, we'd segfault without a NULL-check. + TEST_CHECK(sentry_value_is_null( + sentry_value_get_by_key_n(value, NULL, strlen(some_key)))); + + rv = sentry_value_get_by_key_owned_n(value, NULL, strlen(some_key)); + TEST_CHECK(sentry_value_is_null(rv)); + TEST_CHECK_INT_EQUAL(1, sentry_value_refcount(rv)); + sentry_value_decref(rv); + TEST_CHECK_INT_EQUAL(1, sentry_value_refcount(rv)); + + sentry_value_decref(value); +} + SENTRY_TEST(value_set_stacktrace) { sentry_value_t exc @@ -564,3 +662,113 @@ SENTRY_TEST(value_set_stacktrace) sentry_value_decref(exc); } + +SENTRY_TEST(message_with_null_text_is_valid) +{ + sentry_value_t message_event = sentry_value_new_message_event( + SENTRY_LEVEL_WARNING, "some-logger", NULL); + + TEST_CHECK(!sentry_value_is_null(message_event)); + TEST_CHECK_STRING_EQUAL(sentry_value_as_string(sentry_value_get_by_key( + message_event, "logger")), + "some-logger"); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(message_event, "level")), + "warning"); + + sentry_value_decref(message_event); +} + +SENTRY_TEST(breadcrumb_without_type_or_message_still_valid) +{ + sentry_value_t breadcrumb = sentry_value_new_breadcrumb(NULL, NULL); + TEST_CHECK(!sentry_value_is_null(breadcrumb)); + TEST_CHECK(!sentry_value_is_null( + sentry_value_get_by_key(breadcrumb, "timestamp"))); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(breadcrumb, "type"))); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(breadcrumb, "message"))); + sentry_value_decref(breadcrumb); + + char *const test_type = "navigation"; + breadcrumb = sentry_value_new_breadcrumb(test_type, NULL); + TEST_CHECK(!sentry_value_is_null(breadcrumb)); + TEST_CHECK(!sentry_value_is_null( + sentry_value_get_by_key(breadcrumb, "timestamp"))); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(breadcrumb, "type")), + test_type); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(breadcrumb, "message"))); + sentry_value_decref(breadcrumb); + + char *const test_message = "a fork in the road, take it"; + breadcrumb = sentry_value_new_breadcrumb(NULL, test_message); + TEST_CHECK(!sentry_value_is_null(breadcrumb)); + TEST_CHECK(!sentry_value_is_null( + sentry_value_get_by_key(breadcrumb, "timestamp"))); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(breadcrumb, "type"))); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(breadcrumb, "message")), + test_message); + sentry_value_decref(breadcrumb); +} + +SENTRY_TEST(exception_without_type_or_value_still_valid) +{ + sentry_value_t exception = sentry_value_new_exception(NULL, NULL); + TEST_CHECK(!sentry_value_is_null(exception)); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(exception, "type"))); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(exception, "value"))); + sentry_value_decref(exception); + + char *const test_type = "EXC_BAD_ACCESS / KERN_INVALID_ADDRESS / 0x61"; + exception = sentry_value_new_exception(test_type, NULL); + TEST_CHECK(!sentry_value_is_null(exception)); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(exception, "type")), + test_type); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(exception, "value"))); + sentry_value_decref(exception); + + char *const test_value + = "Fatal Error: EXC_BAD_ACCESS / KERN_INVALID_ADDRESS / 0x61"; + exception = sentry_value_new_exception(NULL, test_value); + TEST_CHECK(!sentry_value_is_null(exception)); + TEST_CHECK( + sentry_value_is_null(sentry_value_get_by_key(exception, "type"))); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(exception, "value")), + test_value); + sentry_value_decref(exception); +} + +SENTRY_TEST(thread_without_name_still_valid) +{ + sentry_value_t thread = sentry_value_new_thread(0xFF00FF00FF00FF00, NULL); + TEST_CHECK(!sentry_value_is_null(thread)); + TEST_CHECK(!sentry_value_is_null(sentry_value_get_by_key(thread, "id"))); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(thread, "id")), + "18374966859414961920"); + TEST_CHECK(sentry_value_is_null(sentry_value_get_by_key(thread, "name"))); + sentry_value_decref(thread); + + char *const test_name = "worker"; + thread = sentry_value_new_thread(0xAA00AA00AA00AA00, test_name); + TEST_CHECK(!sentry_value_is_null(thread)); + TEST_CHECK(!sentry_value_is_null(sentry_value_get_by_key(thread, "id"))); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(thread, "id")), + "12249977906276641280"); + TEST_CHECK(!sentry_value_is_null(sentry_value_get_by_key(thread, "name"))); + TEST_CHECK_STRING_EQUAL( + sentry_value_as_string(sentry_value_get_by_key(thread, "name")), + test_name); + sentry_value_decref(thread); +} diff --git a/shared/sentry/tests/unit/tests.inc b/shared/sentry/src/tests/unit/tests.inc similarity index 64% rename from shared/sentry/tests/unit/tests.inc rename to shared/sentry/src/tests/unit/tests.inc index 6f14d67d1..1770edfc1 100644 --- a/shared/sentry/tests/unit/tests.inc +++ b/shared/sentry/src/tests/unit/tests.inc @@ -12,8 +12,11 @@ XX(basic_http_request_preparation_for_transaction) XX(basic_spans) XX(basic_tracing_context) XX(basic_transaction) +XX(basic_write_envelope_to_file) XX(bgworker_flush) -XX(buildid_fallback) +XX(breadcrumb_without_type_or_message_still_valid) +XX(build_id_parser) +XX(check_version) XX(child_spans) XX(concurrent_init) XX(concurrent_uninit) @@ -24,11 +27,21 @@ XX(custom_logger) XX(discarding_before_send) XX(distributed_headers) XX(drop_unfinished_spans) +XX(dsn_auth_header_custom_user_agent) +XX(dsn_auth_header_invalid_dsn) +XX(dsn_auth_header_no_user_agent) +XX(dsn_auth_header_null_dsn) XX(dsn_parsing_complete) XX(dsn_parsing_invalid) +XX(dsn_store_url_custom_agent) XX(dsn_store_url_with_path) XX(dsn_store_url_without_path) +XX(dsn_with_ending_forward_slash_will_be_cleaned) +XX(dsn_with_non_http_scheme_is_invalid) +XX(dsn_without_project_id_is_invalid) +XX(dsn_without_url_scheme_is_invalid) XX(empty_transport) +XX(exception_without_type_or_value_still_valid) XX(fuzz_json) XX(init_failure) XX(internal_uuid_api) @@ -36,18 +49,24 @@ XX(invalid_dsn) XX(invalid_proxy) XX(iso_time) XX(lazy_attachments) +XX(message_with_null_text_is_valid) XX(module_addr) XX(module_finder) XX(mpack_newlines) XX(mpack_removed_tags) XX(multiple_inits) XX(multiple_transactions) +XX(options_sdk_name_custom) +XX(options_sdk_name_defaults) +XX(options_sdk_name_invalid) XX(os) XX(overflow_spans) XX(page_allocator) XX(path_basics) XX(path_current_exe) XX(path_directory) +XX(path_from_str_n_wo_null_termination) +XX(path_from_str_null) XX(path_joining_unix) XX(path_joining_windows) XX(path_relative_filename) @@ -57,18 +76,34 @@ XX(recursive_paths) XX(sampling_before_send) XX(sampling_decision) XX(sampling_transaction) +XX(sentry__value_span_new_requires_unfinished_parent) XX(serialize_envelope) XX(session_basics) +XX(set_tag_allows_null_tag_and_value) +XX(set_tag_cuts_value_at_length_200) XX(slice) +XX(span_data) +XX(span_data_n) +XX(span_tagging) +XX(span_tagging_n) XX(spans_on_scope) XX(symbolizer) XX(task_queue) +XX(thread_without_name_still_valid) XX(transaction_name_backfill_on_finish) XX(transactions_skip_before_send) XX(transport_sampling_transactions) +XX(txn_data) +XX(txn_data_n) +XX(txn_name) +XX(txn_name_n) +XX(txn_tagging) +XX(txn_tagging_n) XX(uninitialized) XX(unsampled_spans) XX(unwinder) +XX(update_from_header_no_sampled_flag) +XX(update_from_header_null_ctx) XX(url_parsing_complete) XX(url_parsing_invalid) XX(url_parsing_partial) @@ -78,6 +113,7 @@ XX(value_bool) XX(value_collections_leak) XX(value_double) XX(value_freezing) +XX(value_get_by_null_key) XX(value_int32) XX(value_json_deeply_nested) XX(value_json_escaping) @@ -90,7 +126,11 @@ XX(value_null) XX(value_object) XX(value_object_merge) XX(value_object_merge_nested) +XX(value_remove_by_null_key) +XX(value_set_by_null_key) XX(value_set_stacktrace) XX(value_string) +XX(value_string_n) XX(value_unicode) XX(value_wrong_type) +XX(write_envelope_to_file_null) diff --git a/shared/sentry/tests/valgrind.txt b/shared/sentry/src/tests/valgrind.txt similarity index 100% rename from shared/sentry/tests/valgrind.txt rename to shared/sentry/src/tests/valgrind.txt diff --git a/shared/sentry/toolchains/msys2-mingw64-pkglist.txt b/shared/sentry/src/toolchains/msys2-mingw64-pkglist.txt similarity index 100% rename from shared/sentry/toolchains/msys2-mingw64-pkglist.txt rename to shared/sentry/src/toolchains/msys2-mingw64-pkglist.txt diff --git a/shared/sentry/toolchains/msys2.cmake b/shared/sentry/src/toolchains/msys2.cmake similarity index 100% rename from shared/sentry/toolchains/msys2.cmake rename to shared/sentry/src/toolchains/msys2.cmake diff --git a/shared/sentry/vendor/acutest.h b/shared/sentry/src/vendor/acutest.h similarity index 100% rename from shared/sentry/vendor/acutest.h rename to shared/sentry/src/vendor/acutest.h diff --git a/shared/sentry/vendor/jsmn.h b/shared/sentry/src/vendor/jsmn.h similarity index 100% rename from shared/sentry/vendor/jsmn.h rename to shared/sentry/src/vendor/jsmn.h diff --git a/shared/sentry/vendor/mpack.c b/shared/sentry/src/vendor/mpack.c similarity index 100% rename from shared/sentry/vendor/mpack.c rename to shared/sentry/src/vendor/mpack.c diff --git a/shared/sentry/vendor/mpack.h b/shared/sentry/src/vendor/mpack.h similarity index 100% rename from shared/sentry/vendor/mpack.h rename to shared/sentry/src/vendor/mpack.h diff --git a/shared/sentry/vendor/stb_sprintf.c b/shared/sentry/src/vendor/stb_sprintf.c similarity index 100% rename from shared/sentry/vendor/stb_sprintf.c rename to shared/sentry/src/vendor/stb_sprintf.c diff --git a/shared/sentry/vendor/stb_sprintf.h b/shared/sentry/src/vendor/stb_sprintf.h similarity index 100% rename from shared/sentry/vendor/stb_sprintf.h rename to shared/sentry/src/vendor/stb_sprintf.h diff --git a/shared/sentry/tests/requirements.txt b/shared/sentry/tests/requirements.txt deleted file mode 100644 index dd2fd18e8..000000000 --- a/shared/sentry/tests/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -black==22.3.0 -pytest==6.2.5 -pytest-httpserver==1.0.1 diff --git a/shared/shared.pro b/shared/shared.pro index 183ce12ea..cc73d6f77 100644 --- a/shared/shared.pro +++ b/shared/shared.pro @@ -1,6 +1,9 @@ TEMPLATE = subdirs SUBDIRS = \ - liboxide + sentry \ + liboxide \ + epaper +liboxide.depends = sentry epaper INSTALLS += $$SUBDIRS diff --git a/tests/tests.pro b/tests/tests.pro new file mode 100644 index 000000000..5d93081a3 --- /dev/null +++ b/tests/tests.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs + +SUBDIRS = + +INSTALLS += $$SUBDIRS From 98dbe2fe853ea0d67d9d89d32ff83d7e6b1b64ff Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 16 Jan 2024 00:14:51 -0700 Subject: [PATCH 53/87] Folio (#342) * Split device settings and xochitlsettings into their own files * Move shared settings to it's own file * Fix #340 * Fix #339 * Remove broken nix build * Fix build errors --- .github/workflows/nix.yml | 48 -- README.md | 7 - applications/inject_evdev/main.cpp | 160 ++-- applications/system-service/application.cpp | 6 +- applications/system-service/buttonhandler.cpp | 4 +- applications/system-service/buttonhandler.h | 2 + .../system-service/keyboarddevice.cpp | 71 ++ applications/system-service/keyboarddevice.h | 30 + .../system-service/keyboardhandler.cpp | 681 ++++++++++++++++++ applications/system-service/keyboardhandler.h | 32 + .../system-service/system-service.pro | 4 + applications/system-service/systemapi.cpp | 40 +- applications/system-service/systemapi.h | 4 + applications/xdg-settings/main.cpp | 16 +- nix/sources.json | 38 - nix/sources.nix | 171 ----- shared/liboxide/devicesettings.cpp | 297 ++++++++ shared/liboxide/devicesettings.h | 150 ++++ shared/liboxide/event_device.cpp | 14 +- shared/liboxide/liboxide.cpp | 307 -------- shared/liboxide/liboxide.h | 413 +---------- shared/liboxide/liboxide.pro | 10 +- shared/liboxide/oxide_sentry.cpp | 4 +- shared/liboxide/settingsfile.h | 1 + shared/liboxide/sharedsettings.cpp | 16 + shared/liboxide/sharedsettings.h | 212 ++++++ shared/liboxide/xochitlsettings.cpp | 41 ++ shared/liboxide/xochitlsettings.h | 106 +++ 28 files changed, 1795 insertions(+), 1090 deletions(-) delete mode 100644 .github/workflows/nix.yml create mode 100644 applications/system-service/keyboarddevice.cpp create mode 100644 applications/system-service/keyboarddevice.h create mode 100644 applications/system-service/keyboardhandler.cpp create mode 100644 applications/system-service/keyboardhandler.h delete mode 100644 nix/sources.json delete mode 100644 nix/sources.nix create mode 100644 shared/liboxide/devicesettings.cpp create mode 100644 shared/liboxide/devicesettings.h create mode 100644 shared/liboxide/sharedsettings.cpp create mode 100644 shared/liboxide/sharedsettings.h create mode 100644 shared/liboxide/xochitlsettings.cpp create mode 100644 shared/liboxide/xochitlsettings.h diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml deleted file mode 100644 index a46e6842f..000000000 --- a/.github/workflows/nix.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Build with Nix - -on: - push: - branches: - - master - paths: - - 'applications/**' - - 'shared/**' - - 'assets/**' - - 'interfaces/**' - - 'qmake/**' - - 'oxide.pro' - - 'Makefile' - - '*.nix' - pull_request: - paths: - - 'applications/**' - - 'shared/**' - - 'assets/**' - - 'interfaces/**' - - 'qmake/**' - - 'oxide.pro' - - 'Makefile' - - '*.nix' -jobs: - nix-build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v20 - with: - nix_path: nixpkgs=channel:nixos-unstable - - uses: cachix/cachix-action@v12 - with: - name: nix-remarkable - authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - - name: Build - run: nix-build --argstr system 'x86_64-linux' - timeout-minutes: 15 - - run: | - mkdir output - cp -a result/. output/ - - name: Save Artifact - uses: actions/upload-artifact@v3 - with: - name: output - path: output diff --git a/README.md b/README.md index 1df91e8c3..b5a002afe 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,3 @@ You can find other (likely outdated) [videos here](https://github.com/Eeems/oxid 1. Install [toltecmk](https://pypi.org/project/toltecmk/) 2. Run `make package` 3. The ipk files can be found in the `dist/` folder - -### Nix -Works on x86_64-linux or macOS via [nix-docker](https://github.com/LnL7/nix-docker). - -```ShellSession -$ nix-build --argstr system 'x86_64-linux' -``` diff --git a/applications/inject_evdev/main.cpp b/applications/inject_evdev/main.cpp index f29b9047f..452c409bd 100644 --- a/applications/inject_evdev/main.cpp +++ b/applications/inject_evdev/main.cpp @@ -82,9 +82,9 @@ bool process_EV_ABS(const QStringList& args){ abs(ABS_TILT_Y); abs(ABS_TOOL_WIDTH); abs(ABS_VOLUME); - //abs(ABS_PROFILE); + // abs(ABS_PROFILE); abs(ABS_MISC); - //abs(ABS_RESERVED); + abs(ABS_RESERVED); abs(ABS_MT_SLOT); abs(ABS_MT_TOUCH_MAJOR); abs(ABS_MT_TOUCH_MINOR); @@ -128,9 +128,9 @@ bool process_EV_REL(const QStringList& args){ rel(REL_DIAL); rel(REL_WHEEL); rel(REL_MISC); - //rel(REL_RESERVED); - //rel(REL_WHEEL_HI_RES); - //rel(REL_HWHEEL_HI_RES); + rel(REL_RESERVED); + rel(REL_WHEEL_HI_RES); + rel(REL_HWHEEL_HI_RES); rel(REL_MAX); rel(REL_CNT); qDebug() << "Unknown EV_REL event code:" << code.c_str(); @@ -350,7 +350,7 @@ bool process_EV_KEY(const QStringList& args){ key(KEY_PAUSECD); key(KEY_PROG3); key(KEY_PROG4); - //key(KEY_ALL_APPLICATIONS); + // key(KEY_ALL_APPLICATIONS); key(KEY_DASHBOARD); key(KEY_SUSPEND); key(KEY_CLOSE); @@ -418,11 +418,11 @@ bool process_EV_KEY(const QStringList& args){ key(KEY_TITLE); key(KEY_SUBTITLE); key(KEY_ANGLE); - //key(KEY_FULL_SCREEN); + key(KEY_FULL_SCREEN); key(KEY_ZOOM); key(KEY_MODE); key(KEY_KEYBOARD); - //key(KEY_ASPECT_RATIO); + key(KEY_ASPECT_RATIO); key(KEY_SCREEN); key(KEY_PC); key(KEY_TV); @@ -492,9 +492,9 @@ bool process_EV_KEY(const QStringList& args){ key(KEY_10CHANNELSUP); key(KEY_10CHANNELSDOWN); key(KEY_IMAGES); - //key(KEY_NOTIFICATION_CENTER); - //key(KEY_PICKUP_PHONE); - //key(KEY_HANGUP_PHONE); + // key(KEY_NOTIFICATION_CENTER); + // key(KEY_PICKUP_PHONE); + // key(KEY_HANGUP_PHONE); key(KEY_DEL_EOL); key(KEY_DEL_EOS); key(KEY_INS_LINE); @@ -520,7 +520,7 @@ bool process_EV_KEY(const QStringList& args){ key(KEY_FN_F); key(KEY_FN_S); key(KEY_FN_B); - //key(KEY_FN_RIGHT_SHIFT); + // key(KEY_FN_RIGHT_SHIFT); key(KEY_BRL_DOT1); key(KEY_BRL_DOT2); key(KEY_BRL_DOT3); @@ -563,7 +563,7 @@ bool process_EV_KEY(const QStringList& args){ key(KEY_ATTENDANT_TOGGLE); key(KEY_LIGHTS_TOGGLE); key(KEY_ALS_TOGGLE); - //key(KEY_ROTATE_LOCK_TOGGLE); + key(KEY_ROTATE_LOCK_TOGGLE); key(KEY_BUTTONCONFIG); key(KEY_TASKMANAGER); key(KEY_JOURNAL); @@ -571,13 +571,13 @@ bool process_EV_KEY(const QStringList& args){ key(KEY_APPSELECT); key(KEY_SCREENSAVER); key(KEY_VOICECOMMAND); - //key(KEY_ASSISTANT); - //key(KEY_KBD_LAYOUT_NEXT); - //key(KEY_EMOJI_PICKER); - //key(KEY_DICTATE); - //key(KEY_CAMERA_ACCESS_ENABLE); - //key(KEY_CAMERA_ACCESS_DISABLE); - //key(KEY_CAMERA_ACCESS_TOGGLE); + key(KEY_ASSISTANT); + key(KEY_KBD_LAYOUT_NEXT); + // key(KEY_EMOJI_PICKER); + // key(KEY_DICTATE); + // key(KEY_CAMERA_ACCESS_ENABLE); + // key(KEY_CAMERA_ACCESS_DISABLE); + // key(KEY_CAMERA_ACCESS_TOGGLE); key(KEY_BRIGHTNESS_MIN); key(KEY_BRIGHTNESS_MAX); key(KEY_KBDINPUTASSIST_PREV); @@ -604,65 +604,65 @@ bool process_EV_KEY(const QStringList& args){ key(KEY_FASTREVERSE); key(KEY_SLOWREVERSE); key(KEY_DATA); - //key(KEY_ONSCREEN_KEYBOARD); - //key(KEY_PRIVACY_SCREEN_TOGGLE); - //key(KEY_SELECTIVE_SCREENSHOT); - //key(KEY_NEXT_ELEMENT); - //key(KEY_PREVIOUS_ELEMENT); - //key(KEY_AUTOPILOT_ENGAGE_TOGGLE); - //key(KEY_MARK_WAYPOINT); - //key(KEY_SOS); - //key(KEY_NAV_CHART); - //key(KEY_FISHING_CHART); - //key(KEY_SINGLE_RANGE_RADAR); - //key(KEY_DUAL_RANGE_RADAR); - //key(KEY_RADAR_OVERLAY); - //key(KEY_TRADITIONAL_SONAR); - //key(KEY_CLEARVU_SONAR); - //key(KEY_SIDEVU_SONAR); - //key(KEY_NAV_INFO); - //key(KEY_BRIGHTNESS_MENU); - //key(KEY_MACRO1); - //key(KEY_MACRO2); - //key(KEY_MACRO3); - //key(KEY_MACRO4); - //key(KEY_MACRO5); - //key(KEY_MACRO6); - //key(KEY_MACRO7); - //key(KEY_MACRO8); - //key(KEY_MACRO9); - //key(KEY_MACRO10); - //key(KEY_MACRO11); - //key(KEY_MACRO12); - //key(KEY_MACRO13); - //key(KEY_MACRO14); - //key(KEY_MACRO15); - //key(KEY_MACRO16); - //key(KEY_MACRO17); - //key(KEY_MACRO18); - //key(KEY_MACRO19); - //key(KEY_MACRO20); - //key(KEY_MACRO21); - //key(KEY_MACRO22); - //key(KEY_MACRO23); - //key(KEY_MACRO24); - //key(KEY_MACRO25); - //key(KEY_MACRO26); - //key(KEY_MACRO27); - //key(KEY_MACRO28); - //key(KEY_MACRO29); - //key(KEY_MACRO30); - //key(KEY_MACRO_RECORD_START); - //key(KEY_MACRO_RECORD_STOP); - //key(KEY_MACRO_PRESET_CYCLE); - //key(KEY_MACRO_PRESET1); - //key(KEY_MACRO_PRESET2); - //key(KEY_MACRO_PRESET3); - //key(KEY_KBD_LCD_MENU1); - //key(KEY_KBD_LCD_MENU2); - //key(KEY_KBD_LCD_MENU3); - //key(KEY_KBD_LCD_MENU4); - //key(KEY_KBD_LCD_MENU5); + key(KEY_ONSCREEN_KEYBOARD); + // key(KEY_PRIVACY_SCREEN_TOGGLE); + // key(KEY_SELECTIVE_SCREENSHOT); + // key(KEY_NEXT_ELEMENT); + // key(KEY_PREVIOUS_ELEMENT); + // key(KEY_AUTOPILOT_ENGAGE_TOGGLE); + // key(KEY_MARK_WAYPOINT); + // key(KEY_SOS); + // key(KEY_NAV_CHART); + // key(KEY_FISHING_CHART); + // key(KEY_SINGLE_RANGE_RADAR); + // key(KEY_DUAL_RANGE_RADAR); + // key(KEY_RADAR_OVERLAY); + // key(KEY_TRADITIONAL_SONAR); + // key(KEY_CLEARVU_SONAR); + // key(KEY_SIDEVU_SONAR); + // key(KEY_NAV_INFO); + // key(KEY_BRIGHTNESS_MENU); + // key(KEY_MACRO1); + // key(KEY_MACRO2); + // key(KEY_MACRO3); + // key(KEY_MACRO4); + // key(KEY_MACRO5); + // key(KEY_MACRO6); + // key(KEY_MACRO7); + // key(KEY_MACRO8); + // key(KEY_MACRO9); + // key(KEY_MACRO10); + // key(KEY_MACRO11); + // key(KEY_MACRO12); + // key(KEY_MACRO13); + // key(KEY_MACRO14); + // key(KEY_MACRO15); + // key(KEY_MACRO16); + // key(KEY_MACRO17); + // key(KEY_MACRO18); + // key(KEY_MACRO19); + // key(KEY_MACRO20); + // key(KEY_MACRO21); + // key(KEY_MACRO22); + // key(KEY_MACRO23); + // key(KEY_MACRO24); + // key(KEY_MACRO25); + // key(KEY_MACRO26); + // key(KEY_MACRO27); + // key(KEY_MACRO28); + // key(KEY_MACRO29); + // key(KEY_MACRO30); + // key(KEY_MACRO_RECORD_START); + // key(KEY_MACRO_RECORD_STOP); + // key(KEY_MACRO_PRESET_CYCLE); + // key(KEY_MACRO_PRESET1); + // key(KEY_MACRO_PRESET2); + // key(KEY_MACRO_PRESET3); + // key(KEY_KBD_LCD_MENU1); + // key(KEY_KBD_LCD_MENU2); + // key(KEY_KBD_LCD_MENU3); + // key(KEY_KBD_LCD_MENU4); + // key(KEY_KBD_LCD_MENU5); key(KEY_MIN_INTERESTING); key(KEY_MAX); key(KEY_CNT); @@ -731,7 +731,7 @@ bool process_EV_KEY(const QStringList& args){ key(BTN_TOOL_MOUSE); key(BTN_TOOL_LENS); key(BTN_TOOL_QUINTTAP); - //key(BTN_STYLUS3); + key(BTN_STYLUS3); key(BTN_TOUCH); key(BTN_STYLUS); key(BTN_STYLUS2); diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index 2426ad883..6da36e8f3 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -284,7 +284,7 @@ void Application::uninterruptApplication(){ case Background: case Backgroundable: if(stateNoSecurityCheck() == Paused){ - touchHandler->clear_buffer(); + systemAPI->clearDeviceBuffers(); kill(-m_process->processId(), SIGCONT); } qDebug() << "Waiting for SIGUSR1 ack"; @@ -303,7 +303,7 @@ void Application::uninterruptApplication(){ break; case Foreground: default: - touchHandler->clear_buffer(); + systemAPI->clearDeviceBuffers(); kill(-m_process->processId(), SIGCONT); startSpan("foreground", "Application is in the foreground"); } @@ -339,7 +339,7 @@ void Application::stopNoSecurityCheck(){ Application* pausedApplication = nullptr; if(state == Paused){ Oxide::Sentry::sentry_span(t, "resume", "Resume paused application", [this, &pausedApplication](){ - touchHandler->clear_buffer(); + systemAPI->clearDeviceBuffers(); auto currentApplication = appsAPI->currentApplicationNoSecurityCheck(); if(currentApplication.path() != path()){ pausedApplication = appsAPI->getApplication(currentApplication); diff --git a/applications/system-service/buttonhandler.cpp b/applications/system-service/buttonhandler.cpp index ff5f7eb7d..d076c023c 100644 --- a/applications/system-service/buttonhandler.cpp +++ b/applications/system-service/buttonhandler.cpp @@ -69,9 +69,11 @@ void ButtonHandler::clear_buffer(){ #ifdef DEBUG qDebug() << "Clearing event buffer on" << buttons.device.c_str(); #endif - ::write(buttons.fd, flood, 512 * 8 * 4 * sizeof(input_event)); + ::write(buttons.fd, flood, EVENT_FLOOD_SIZE); } +input_event* ButtonHandler::event_flood(){ return flood; } + void ButtonHandler::run(){ char name[256]; memset(name, 0, sizeof(name)); diff --git a/applications/system-service/buttonhandler.h b/applications/system-service/buttonhandler.h index 0365c96fc..8ae1b0545 100644 --- a/applications/system-service/buttonhandler.h +++ b/applications/system-service/buttonhandler.h @@ -29,6 +29,7 @@ using namespace std; using namespace Oxide; #define buttonHandler ButtonHandler::init() +#define EVENT_FLOOD_SIZE 512 * 8 * 4 * sizeof(input_event) struct PressRecord { bool pressed = false; @@ -51,6 +52,7 @@ class ButtonHandler : public QThread { ButtonHandler(); void setEnabled(bool enabled); void clear_buffer(); + input_event* event_flood(); public slots: void pressKey(Qt::Key); diff --git a/applications/system-service/keyboarddevice.cpp b/applications/system-service/keyboarddevice.cpp new file mode 100644 index 000000000..729eda738 --- /dev/null +++ b/applications/system-service/keyboarddevice.cpp @@ -0,0 +1,71 @@ +#include "keyboarddevice.h" +#include "buttonhandler.h" +#include "keyboardhandler.h" + +KeyboardDevice::KeyboardDevice(QThread* handler, event_device device) +: QObject(handler), + device(device), + sys("/sys/class/input/" + devName() + "/device/") +{ + moveToThread(handler); + _name = sys.strProperty("name").c_str(); + device.lock(); + notifier = new QSocketNotifier(device.fd, QSocketNotifier::Read, this); + connect(notifier, &QSocketNotifier::activated, this, &KeyboardDevice::readEvents); + notifier->setEnabled(true); +} + +KeyboardDevice::~KeyboardDevice(){ + if(exists() && device.locked){ + device.unlock(); + } +} + +QString KeyboardDevice::devName(){ return QFileInfo(device.device.c_str()).baseName(); } + +QString KeyboardDevice::name(){ return _name; } + +QString KeyboardDevice::path(){ return device.device.c_str(); } + +QString KeyboardDevice::id(){ + return QString("%1:%2") + .arg(sys.strProperty("id/vendor").c_str()) + .arg(sys.strProperty("id/product").c_str()); +} + +bool KeyboardDevice::exists(){ return QFile::exists(path()); } + +void KeyboardDevice::flood(){ + if(device.fd == -1 || !device.locked){ + return; + } + ::write(device.fd, buttonHandler->event_flood(), EVENT_FLOOD_SIZE); +} + +void KeyboardDevice::readEvents(){ + notifier->setEnabled(false); + input_event event; + while(::read(device.fd, &event, sizeof(input_event)) > 0){ + switch(event.type){ + case EV_KEY: + pressed[event.code] = event.value; + break; + case EV_SYN: + switch(event.code){ + case SYN_DROPPED: + pressed.clear(); + break; + case SYN_REPORT: + auto handler = static_cast(parent()); + for(auto code : pressed.keys()){ + handler->writeEvent(EV_KEY, code, pressed[code]); + } + handler->writeEvent(EV_SYN, SYN_REPORT, 0); + pressed.clear(); + break; + } + break; + } + } + notifier->setEnabled(true); +} diff --git a/applications/system-service/keyboarddevice.h b/applications/system-service/keyboarddevice.h new file mode 100644 index 000000000..986df9c64 --- /dev/null +++ b/applications/system-service/keyboarddevice.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +using namespace Oxide; + +class KeyboardDevice : public QObject{ + Q_OBJECT + +public: + KeyboardDevice(QThread* handler, event_device device); + ~KeyboardDevice(); + QString devName(); + QString name(); + QString path(); + QString id(); + bool exists(); + void flood(); + +public slots: + void readEvents(); + +private: + event_device device; + SysObject sys; + QString _name; + QSocketNotifier* notifier; + QMap pressed; +}; diff --git a/applications/system-service/keyboardhandler.cpp b/applications/system-service/keyboardhandler.cpp new file mode 100644 index 000000000..9a5bfa947 --- /dev/null +++ b/applications/system-service/keyboardhandler.cpp @@ -0,0 +1,681 @@ +#include "keyboardhandler.h" +#include "eventlistener.h" +#include "buttonhandler.h" + +#include +#include +#include + +KeyboardHandler* KeyboardHandler::init(){ + static KeyboardHandler* instance; + if(instance != nullptr){ + return instance; + } + instance = new KeyboardHandler(); + instance->start(); + return instance; +} + +KeyboardHandler::KeyboardHandler(){ + setObjectName("OxideVirtKeyboard"); + fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); + if(fd == -1){ + O_WARNING("Failed to open uinput!"); + }else{ + ioctl(fd, UI_SET_EVBIT, EV_REP); + ioctl(fd, UI_SET_EVBIT, EV_LED); + ioctl(fd, UI_SET_EVBIT, EV_KEY); + ioctl(fd, UI_SET_EVBIT, EV_SYN); + + ioctl(fd, UI_SET_KEYBIT, KEY_RESERVED); + ioctl(fd, UI_SET_KEYBIT, KEY_ESC); + ioctl(fd, UI_SET_KEYBIT, KEY_1); + ioctl(fd, UI_SET_KEYBIT, KEY_2); + ioctl(fd, UI_SET_KEYBIT, KEY_3); + ioctl(fd, UI_SET_KEYBIT, KEY_4); + ioctl(fd, UI_SET_KEYBIT, KEY_5); + ioctl(fd, UI_SET_KEYBIT, KEY_6); + ioctl(fd, UI_SET_KEYBIT, KEY_7); + ioctl(fd, UI_SET_KEYBIT, KEY_8); + ioctl(fd, UI_SET_KEYBIT, KEY_9); + ioctl(fd, UI_SET_KEYBIT, KEY_0); + ioctl(fd, UI_SET_KEYBIT, KEY_MINUS); + ioctl(fd, UI_SET_KEYBIT, KEY_EQUAL); + ioctl(fd, UI_SET_KEYBIT, KEY_BACKSPACE); + ioctl(fd, UI_SET_KEYBIT, KEY_TAB); + ioctl(fd, UI_SET_KEYBIT, KEY_Q); + ioctl(fd, UI_SET_KEYBIT, KEY_W); + ioctl(fd, UI_SET_KEYBIT, KEY_E); + ioctl(fd, UI_SET_KEYBIT, KEY_R); + ioctl(fd, UI_SET_KEYBIT, KEY_T); + ioctl(fd, UI_SET_KEYBIT, KEY_Y); + ioctl(fd, UI_SET_KEYBIT, KEY_U); + ioctl(fd, UI_SET_KEYBIT, KEY_I); + ioctl(fd, UI_SET_KEYBIT, KEY_O); + ioctl(fd, UI_SET_KEYBIT, KEY_P); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFTBRACE); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHTBRACE); + ioctl(fd, UI_SET_KEYBIT, KEY_ENTER); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFTCTRL); + ioctl(fd, UI_SET_KEYBIT, KEY_A); + ioctl(fd, UI_SET_KEYBIT, KEY_S); + ioctl(fd, UI_SET_KEYBIT, KEY_D); + ioctl(fd, UI_SET_KEYBIT, KEY_F); + ioctl(fd, UI_SET_KEYBIT, KEY_G); + ioctl(fd, UI_SET_KEYBIT, KEY_H); + ioctl(fd, UI_SET_KEYBIT, KEY_J); + ioctl(fd, UI_SET_KEYBIT, KEY_K); + ioctl(fd, UI_SET_KEYBIT, KEY_L); + ioctl(fd, UI_SET_KEYBIT, KEY_SEMICOLON); + ioctl(fd, UI_SET_KEYBIT, KEY_APOSTROPHE); + ioctl(fd, UI_SET_KEYBIT, KEY_GRAVE); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFTSHIFT); + ioctl(fd, UI_SET_KEYBIT, KEY_BACKSLASH); + ioctl(fd, UI_SET_KEYBIT, KEY_Z); + ioctl(fd, UI_SET_KEYBIT, KEY_X); + ioctl(fd, UI_SET_KEYBIT, KEY_C); + ioctl(fd, UI_SET_KEYBIT, KEY_V); + ioctl(fd, UI_SET_KEYBIT, KEY_B); + ioctl(fd, UI_SET_KEYBIT, KEY_N); + ioctl(fd, UI_SET_KEYBIT, KEY_M); + ioctl(fd, UI_SET_KEYBIT, KEY_COMMA); + ioctl(fd, UI_SET_KEYBIT, KEY_DOT); + ioctl(fd, UI_SET_KEYBIT, KEY_SLASH); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHTSHIFT); + ioctl(fd, UI_SET_KEYBIT, KEY_KPASTERISK); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFTALT); + ioctl(fd, UI_SET_KEYBIT, KEY_SPACE); + ioctl(fd, UI_SET_KEYBIT, KEY_CAPSLOCK); + ioctl(fd, UI_SET_KEYBIT, KEY_F1); + ioctl(fd, UI_SET_KEYBIT, KEY_F2); + ioctl(fd, UI_SET_KEYBIT, KEY_F3); + ioctl(fd, UI_SET_KEYBIT, KEY_F4); + ioctl(fd, UI_SET_KEYBIT, KEY_F5); + ioctl(fd, UI_SET_KEYBIT, KEY_F6); + ioctl(fd, UI_SET_KEYBIT, KEY_F7); + ioctl(fd, UI_SET_KEYBIT, KEY_F8); + ioctl(fd, UI_SET_KEYBIT, KEY_F9); + ioctl(fd, UI_SET_KEYBIT, KEY_F10); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMLOCK); + ioctl(fd, UI_SET_KEYBIT, KEY_SCROLLLOCK); + ioctl(fd, UI_SET_KEYBIT, KEY_KP7); + ioctl(fd, UI_SET_KEYBIT, KEY_KP8); + ioctl(fd, UI_SET_KEYBIT, KEY_KP9); + ioctl(fd, UI_SET_KEYBIT, KEY_KPMINUS); + ioctl(fd, UI_SET_KEYBIT, KEY_KP4); + ioctl(fd, UI_SET_KEYBIT, KEY_KP5); + ioctl(fd, UI_SET_KEYBIT, KEY_KP6); + ioctl(fd, UI_SET_KEYBIT, KEY_KPPLUS); + ioctl(fd, UI_SET_KEYBIT, KEY_KP1); + ioctl(fd, UI_SET_KEYBIT, KEY_KP2); + ioctl(fd, UI_SET_KEYBIT, KEY_KP3); + ioctl(fd, UI_SET_KEYBIT, KEY_KP0); + ioctl(fd, UI_SET_KEYBIT, KEY_KPDOT); + ioctl(fd, UI_SET_KEYBIT, KEY_ZENKAKUHANKAKU); + ioctl(fd, UI_SET_KEYBIT, KEY_102ND); + ioctl(fd, UI_SET_KEYBIT, KEY_F11); + ioctl(fd, UI_SET_KEYBIT, KEY_F12); + ioctl(fd, UI_SET_KEYBIT, KEY_RO); + ioctl(fd, UI_SET_KEYBIT, KEY_KATAKANA); + ioctl(fd, UI_SET_KEYBIT, KEY_HIRAGANA); + ioctl(fd, UI_SET_KEYBIT, KEY_HENKAN); + ioctl(fd, UI_SET_KEYBIT, KEY_KATAKANAHIRAGANA); + ioctl(fd, UI_SET_KEYBIT, KEY_MUHENKAN); + ioctl(fd, UI_SET_KEYBIT, KEY_KPJPCOMMA); + ioctl(fd, UI_SET_KEYBIT, KEY_KPENTER); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHTCTRL); + ioctl(fd, UI_SET_KEYBIT, KEY_KPSLASH); + ioctl(fd, UI_SET_KEYBIT, KEY_SYSRQ); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHTALT); + ioctl(fd, UI_SET_KEYBIT, KEY_LINEFEED); + ioctl(fd, UI_SET_KEYBIT, KEY_HOME); + ioctl(fd, UI_SET_KEYBIT, KEY_UP); + ioctl(fd, UI_SET_KEYBIT, KEY_PAGEUP); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFT); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHT); + ioctl(fd, UI_SET_KEYBIT, KEY_END); + ioctl(fd, UI_SET_KEYBIT, KEY_DOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_PAGEDOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_INSERT); + ioctl(fd, UI_SET_KEYBIT, KEY_DELETE); + ioctl(fd, UI_SET_KEYBIT, KEY_MACRO); + ioctl(fd, UI_SET_KEYBIT, KEY_MUTE); + ioctl(fd, UI_SET_KEYBIT, KEY_VOLUMEDOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_VOLUMEUP); + ioctl(fd, UI_SET_KEYBIT, KEY_POWER); + ioctl(fd, UI_SET_KEYBIT, KEY_KPEQUAL); + ioctl(fd, UI_SET_KEYBIT, KEY_KPPLUSMINUS); + ioctl(fd, UI_SET_KEYBIT, KEY_PAUSE); + ioctl(fd, UI_SET_KEYBIT, KEY_SCALE); + ioctl(fd, UI_SET_KEYBIT, KEY_KPCOMMA); + ioctl(fd, UI_SET_KEYBIT, KEY_HANGEUL); + ioctl(fd, UI_SET_KEYBIT, KEY_HANGUEL); + ioctl(fd, UI_SET_KEYBIT, KEY_HANJA); + ioctl(fd, UI_SET_KEYBIT, KEY_YEN); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFTMETA); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHTMETA); + ioctl(fd, UI_SET_KEYBIT, KEY_COMPOSE); + ioctl(fd, UI_SET_KEYBIT, KEY_STOP); + ioctl(fd, UI_SET_KEYBIT, KEY_AGAIN); + ioctl(fd, UI_SET_KEYBIT, KEY_PROPS); + ioctl(fd, UI_SET_KEYBIT, KEY_UNDO); + ioctl(fd, UI_SET_KEYBIT, KEY_FRONT); + ioctl(fd, UI_SET_KEYBIT, KEY_COPY); + ioctl(fd, UI_SET_KEYBIT, KEY_OPEN); + ioctl(fd, UI_SET_KEYBIT, KEY_PASTE); + ioctl(fd, UI_SET_KEYBIT, KEY_FIND); + ioctl(fd, UI_SET_KEYBIT, KEY_CUT); + ioctl(fd, UI_SET_KEYBIT, KEY_HELP); + ioctl(fd, UI_SET_KEYBIT, KEY_MENU); + ioctl(fd, UI_SET_KEYBIT, KEY_CALC); + ioctl(fd, UI_SET_KEYBIT, KEY_SETUP); + ioctl(fd, UI_SET_KEYBIT, KEY_SLEEP); + ioctl(fd, UI_SET_KEYBIT, KEY_WAKEUP); + ioctl(fd, UI_SET_KEYBIT, KEY_FILE); + ioctl(fd, UI_SET_KEYBIT, KEY_SENDFILE); + ioctl(fd, UI_SET_KEYBIT, KEY_DELETEFILE); + ioctl(fd, UI_SET_KEYBIT, KEY_XFER); + ioctl(fd, UI_SET_KEYBIT, KEY_PROG1); + ioctl(fd, UI_SET_KEYBIT, KEY_PROG2); + ioctl(fd, UI_SET_KEYBIT, KEY_WWW); + ioctl(fd, UI_SET_KEYBIT, KEY_MSDOS); + ioctl(fd, UI_SET_KEYBIT, KEY_COFFEE); + ioctl(fd, UI_SET_KEYBIT, KEY_SCREENLOCK); + ioctl(fd, UI_SET_KEYBIT, KEY_ROTATE_DISPLAY); + ioctl(fd, UI_SET_KEYBIT, KEY_DIRECTION); + ioctl(fd, UI_SET_KEYBIT, KEY_CYCLEWINDOWS); + ioctl(fd, UI_SET_KEYBIT, KEY_MAIL); + ioctl(fd, UI_SET_KEYBIT, KEY_BOOKMARKS); + ioctl(fd, UI_SET_KEYBIT, KEY_COMPUTER); + ioctl(fd, UI_SET_KEYBIT, KEY_BACK); + ioctl(fd, UI_SET_KEYBIT, KEY_FORWARD); + ioctl(fd, UI_SET_KEYBIT, KEY_CLOSECD); + ioctl(fd, UI_SET_KEYBIT, KEY_EJECTCD); + ioctl(fd, UI_SET_KEYBIT, KEY_EJECTCLOSECD); + ioctl(fd, UI_SET_KEYBIT, KEY_NEXTSONG); + ioctl(fd, UI_SET_KEYBIT, KEY_PLAYPAUSE); + ioctl(fd, UI_SET_KEYBIT, KEY_PREVIOUSSONG); + ioctl(fd, UI_SET_KEYBIT, KEY_STOPCD); + ioctl(fd, UI_SET_KEYBIT, KEY_RECORD); + ioctl(fd, UI_SET_KEYBIT, KEY_REWIND); + ioctl(fd, UI_SET_KEYBIT, KEY_PHONE); + ioctl(fd, UI_SET_KEYBIT, KEY_ISO); + ioctl(fd, UI_SET_KEYBIT, KEY_CONFIG); + ioctl(fd, UI_SET_KEYBIT, KEY_HOMEPAGE); + ioctl(fd, UI_SET_KEYBIT, KEY_REFRESH); + ioctl(fd, UI_SET_KEYBIT, KEY_EXIT); + ioctl(fd, UI_SET_KEYBIT, KEY_MOVE); + ioctl(fd, UI_SET_KEYBIT, KEY_EDIT); + ioctl(fd, UI_SET_KEYBIT, KEY_SCROLLUP); + ioctl(fd, UI_SET_KEYBIT, KEY_SCROLLDOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_KPLEFTPAREN); + ioctl(fd, UI_SET_KEYBIT, KEY_KPRIGHTPAREN); + ioctl(fd, UI_SET_KEYBIT, KEY_NEW); + ioctl(fd, UI_SET_KEYBIT, KEY_REDO); + ioctl(fd, UI_SET_KEYBIT, KEY_F13); + ioctl(fd, UI_SET_KEYBIT, KEY_F14); + ioctl(fd, UI_SET_KEYBIT, KEY_F15); + ioctl(fd, UI_SET_KEYBIT, KEY_F16); + ioctl(fd, UI_SET_KEYBIT, KEY_F17); + ioctl(fd, UI_SET_KEYBIT, KEY_F18); + ioctl(fd, UI_SET_KEYBIT, KEY_F19); + ioctl(fd, UI_SET_KEYBIT, KEY_F20); + ioctl(fd, UI_SET_KEYBIT, KEY_F21); + ioctl(fd, UI_SET_KEYBIT, KEY_F22); + ioctl(fd, UI_SET_KEYBIT, KEY_F23); + ioctl(fd, UI_SET_KEYBIT, KEY_F24); + ioctl(fd, UI_SET_KEYBIT, KEY_PLAYCD); + ioctl(fd, UI_SET_KEYBIT, KEY_PAUSECD); + ioctl(fd, UI_SET_KEYBIT, KEY_PROG3); + ioctl(fd, UI_SET_KEYBIT, KEY_PROG4); + ioctl(fd, UI_SET_KEYBIT, KEY_DASHBOARD); + ioctl(fd, UI_SET_KEYBIT, KEY_SUSPEND); + ioctl(fd, UI_SET_KEYBIT, KEY_CLOSE); + ioctl(fd, UI_SET_KEYBIT, KEY_PLAY); + ioctl(fd, UI_SET_KEYBIT, KEY_FASTFORWARD); + ioctl(fd, UI_SET_KEYBIT, KEY_BASSBOOST); + ioctl(fd, UI_SET_KEYBIT, KEY_PRINT); + ioctl(fd, UI_SET_KEYBIT, KEY_HP); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA); + ioctl(fd, UI_SET_KEYBIT, KEY_SOUND); + ioctl(fd, UI_SET_KEYBIT, KEY_QUESTION); + ioctl(fd, UI_SET_KEYBIT, KEY_EMAIL); + ioctl(fd, UI_SET_KEYBIT, KEY_CHAT); + ioctl(fd, UI_SET_KEYBIT, KEY_SEARCH); + ioctl(fd, UI_SET_KEYBIT, KEY_CONNECT); + ioctl(fd, UI_SET_KEYBIT, KEY_FINANCE); + ioctl(fd, UI_SET_KEYBIT, KEY_SPORT); + ioctl(fd, UI_SET_KEYBIT, KEY_SHOP); + ioctl(fd, UI_SET_KEYBIT, KEY_ALTERASE); + ioctl(fd, UI_SET_KEYBIT, KEY_CANCEL); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESSDOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESSUP); + ioctl(fd, UI_SET_KEYBIT, KEY_MEDIA); + ioctl(fd, UI_SET_KEYBIT, KEY_SWITCHVIDEOMODE); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDILLUMTOGGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDILLUMDOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDILLUMUP); + ioctl(fd, UI_SET_KEYBIT, KEY_SEND); + ioctl(fd, UI_SET_KEYBIT, KEY_REPLY); + ioctl(fd, UI_SET_KEYBIT, KEY_FORWARDMAIL); + ioctl(fd, UI_SET_KEYBIT, KEY_SAVE); + ioctl(fd, UI_SET_KEYBIT, KEY_DOCUMENTS); + ioctl(fd, UI_SET_KEYBIT, KEY_BATTERY); + ioctl(fd, UI_SET_KEYBIT, KEY_BLUETOOTH); + ioctl(fd, UI_SET_KEYBIT, KEY_WLAN); + ioctl(fd, UI_SET_KEYBIT, KEY_UWB); + ioctl(fd, UI_SET_KEYBIT, KEY_UNKNOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_VIDEO_NEXT); + ioctl(fd, UI_SET_KEYBIT, KEY_VIDEO_PREV); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESS_CYCLE); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESS_AUTO); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESS_ZERO); + ioctl(fd, UI_SET_KEYBIT, KEY_DISPLAY_OFF); + ioctl(fd, UI_SET_KEYBIT, KEY_WWAN); + ioctl(fd, UI_SET_KEYBIT, KEY_WIMAX); + ioctl(fd, UI_SET_KEYBIT, KEY_RFKILL); + ioctl(fd, UI_SET_KEYBIT, KEY_MICMUTE); + ioctl(fd, UI_SET_KEYBIT, BTN_MISC); + ioctl(fd, UI_SET_KEYBIT, BTN_0); + ioctl(fd, UI_SET_KEYBIT, BTN_1); + ioctl(fd, UI_SET_KEYBIT, BTN_2); + ioctl(fd, UI_SET_KEYBIT, BTN_3); + ioctl(fd, UI_SET_KEYBIT, BTN_4); + ioctl(fd, UI_SET_KEYBIT, BTN_5); + ioctl(fd, UI_SET_KEYBIT, BTN_6); + ioctl(fd, UI_SET_KEYBIT, BTN_7); + ioctl(fd, UI_SET_KEYBIT, BTN_8); + ioctl(fd, UI_SET_KEYBIT, BTN_9); + ioctl(fd, UI_SET_KEYBIT, BTN_MOUSE); + ioctl(fd, UI_SET_KEYBIT, BTN_LEFT); + ioctl(fd, UI_SET_KEYBIT, BTN_RIGHT); + ioctl(fd, UI_SET_KEYBIT, BTN_MIDDLE); + ioctl(fd, UI_SET_KEYBIT, BTN_SIDE); + ioctl(fd, UI_SET_KEYBIT, BTN_EXTRA); + ioctl(fd, UI_SET_KEYBIT, BTN_FORWARD); + ioctl(fd, UI_SET_KEYBIT, BTN_BACK); + ioctl(fd, UI_SET_KEYBIT, BTN_TASK); + ioctl(fd, UI_SET_KEYBIT, BTN_JOYSTICK); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER); + ioctl(fd, UI_SET_KEYBIT, BTN_THUMB); + ioctl(fd, UI_SET_KEYBIT, BTN_THUMB2); + ioctl(fd, UI_SET_KEYBIT, BTN_TOP); + ioctl(fd, UI_SET_KEYBIT, BTN_TOP2); + ioctl(fd, UI_SET_KEYBIT, BTN_PINKIE); + ioctl(fd, UI_SET_KEYBIT, BTN_BASE); + ioctl(fd, UI_SET_KEYBIT, BTN_BASE2); + ioctl(fd, UI_SET_KEYBIT, BTN_BASE3); + ioctl(fd, UI_SET_KEYBIT, BTN_BASE4); + ioctl(fd, UI_SET_KEYBIT, BTN_BASE5); + ioctl(fd, UI_SET_KEYBIT, BTN_BASE6); + ioctl(fd, UI_SET_KEYBIT, BTN_DEAD); + ioctl(fd, UI_SET_KEYBIT, BTN_GAMEPAD); + ioctl(fd, UI_SET_KEYBIT, BTN_SOUTH); + ioctl(fd, UI_SET_KEYBIT, BTN_A); + ioctl(fd, UI_SET_KEYBIT, BTN_EAST); + ioctl(fd, UI_SET_KEYBIT, BTN_B); + ioctl(fd, UI_SET_KEYBIT, BTN_C); + ioctl(fd, UI_SET_KEYBIT, BTN_NORTH); + ioctl(fd, UI_SET_KEYBIT, BTN_X); + ioctl(fd, UI_SET_KEYBIT, BTN_WEST); + ioctl(fd, UI_SET_KEYBIT, BTN_Y); + ioctl(fd, UI_SET_KEYBIT, BTN_Z); + ioctl(fd, UI_SET_KEYBIT, BTN_TL); + ioctl(fd, UI_SET_KEYBIT, BTN_TR); + ioctl(fd, UI_SET_KEYBIT, BTN_TL2); + ioctl(fd, UI_SET_KEYBIT, BTN_TR2); + ioctl(fd, UI_SET_KEYBIT, BTN_SELECT); + ioctl(fd, UI_SET_KEYBIT, BTN_START); + ioctl(fd, UI_SET_KEYBIT, BTN_MODE); + ioctl(fd, UI_SET_KEYBIT, BTN_THUMBL); + ioctl(fd, UI_SET_KEYBIT, BTN_THUMBR); + ioctl(fd, UI_SET_KEYBIT, BTN_DIGI); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_PEN); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_RUBBER); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_BRUSH); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_PENCIL); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_AIRBRUSH); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_FINGER); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_MOUSE); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_LENS); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_QUINTTAP); + ioctl(fd, UI_SET_KEYBIT, BTN_STYLUS3); + ioctl(fd, UI_SET_KEYBIT, BTN_TOUCH); + ioctl(fd, UI_SET_KEYBIT, BTN_STYLUS); + ioctl(fd, UI_SET_KEYBIT, BTN_STYLUS2); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_DOUBLETAP); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_TRIPLETAP); + ioctl(fd, UI_SET_KEYBIT, BTN_TOOL_QUADTAP); + ioctl(fd, UI_SET_KEYBIT, BTN_WHEEL); + ioctl(fd, UI_SET_KEYBIT, BTN_GEAR_DOWN); + ioctl(fd, UI_SET_KEYBIT, BTN_GEAR_UP); + ioctl(fd, UI_SET_KEYBIT, KEY_OK); + ioctl(fd, UI_SET_KEYBIT, KEY_SELECT); + ioctl(fd, UI_SET_KEYBIT, KEY_GOTO); + ioctl(fd, UI_SET_KEYBIT, KEY_CLEAR); + ioctl(fd, UI_SET_KEYBIT, KEY_POWER2); + ioctl(fd, UI_SET_KEYBIT, KEY_OPTION); + ioctl(fd, UI_SET_KEYBIT, KEY_INFO); + ioctl(fd, UI_SET_KEYBIT, KEY_TIME); + ioctl(fd, UI_SET_KEYBIT, KEY_VENDOR); + ioctl(fd, UI_SET_KEYBIT, KEY_ARCHIVE); + ioctl(fd, UI_SET_KEYBIT, KEY_PROGRAM); + ioctl(fd, UI_SET_KEYBIT, KEY_CHANNEL); + ioctl(fd, UI_SET_KEYBIT, KEY_FAVORITES); + ioctl(fd, UI_SET_KEYBIT, KEY_EPG); + ioctl(fd, UI_SET_KEYBIT, KEY_PVR); + ioctl(fd, UI_SET_KEYBIT, KEY_MHP); + ioctl(fd, UI_SET_KEYBIT, KEY_LANGUAGE); + ioctl(fd, UI_SET_KEYBIT, KEY_TITLE); + ioctl(fd, UI_SET_KEYBIT, KEY_SUBTITLE); + ioctl(fd, UI_SET_KEYBIT, KEY_ANGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_FULL_SCREEN); + ioctl(fd, UI_SET_KEYBIT, KEY_ZOOM); + ioctl(fd, UI_SET_KEYBIT, KEY_MODE); + ioctl(fd, UI_SET_KEYBIT, KEY_KEYBOARD); + ioctl(fd, UI_SET_KEYBIT, KEY_ASPECT_RATIO); + ioctl(fd, UI_SET_KEYBIT, KEY_SCREEN); + ioctl(fd, UI_SET_KEYBIT, KEY_PC); + ioctl(fd, UI_SET_KEYBIT, KEY_TV); + ioctl(fd, UI_SET_KEYBIT, KEY_TV2); + ioctl(fd, UI_SET_KEYBIT, KEY_VCR); + ioctl(fd, UI_SET_KEYBIT, KEY_VCR2); + ioctl(fd, UI_SET_KEYBIT, KEY_SAT); + ioctl(fd, UI_SET_KEYBIT, KEY_SAT2); + ioctl(fd, UI_SET_KEYBIT, KEY_CD); + ioctl(fd, UI_SET_KEYBIT, KEY_TAPE); + ioctl(fd, UI_SET_KEYBIT, KEY_RADIO); + ioctl(fd, UI_SET_KEYBIT, KEY_TUNER); + ioctl(fd, UI_SET_KEYBIT, KEY_PLAYER); + ioctl(fd, UI_SET_KEYBIT, KEY_TEXT); + ioctl(fd, UI_SET_KEYBIT, KEY_DVD); + ioctl(fd, UI_SET_KEYBIT, KEY_AUX); + ioctl(fd, UI_SET_KEYBIT, KEY_MP3); + ioctl(fd, UI_SET_KEYBIT, KEY_AUDIO); + ioctl(fd, UI_SET_KEYBIT, KEY_VIDEO); + ioctl(fd, UI_SET_KEYBIT, KEY_DIRECTORY); + ioctl(fd, UI_SET_KEYBIT, KEY_LIST); + ioctl(fd, UI_SET_KEYBIT, KEY_MEMO); + ioctl(fd, UI_SET_KEYBIT, KEY_CALENDAR); + ioctl(fd, UI_SET_KEYBIT, KEY_RED); + ioctl(fd, UI_SET_KEYBIT, KEY_GREEN); + ioctl(fd, UI_SET_KEYBIT, KEY_YELLOW); + ioctl(fd, UI_SET_KEYBIT, KEY_BLUE); + ioctl(fd, UI_SET_KEYBIT, KEY_CHANNELUP); + ioctl(fd, UI_SET_KEYBIT, KEY_CHANNELDOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_FIRST); + ioctl(fd, UI_SET_KEYBIT, KEY_LAST); + ioctl(fd, UI_SET_KEYBIT, KEY_AB); + ioctl(fd, UI_SET_KEYBIT, KEY_NEXT); + ioctl(fd, UI_SET_KEYBIT, KEY_RESTART); + ioctl(fd, UI_SET_KEYBIT, KEY_SLOW); + ioctl(fd, UI_SET_KEYBIT, KEY_SHUFFLE); + ioctl(fd, UI_SET_KEYBIT, KEY_BREAK); + ioctl(fd, UI_SET_KEYBIT, KEY_PREVIOUS); + ioctl(fd, UI_SET_KEYBIT, KEY_DIGITS); + ioctl(fd, UI_SET_KEYBIT, KEY_TEEN); + ioctl(fd, UI_SET_KEYBIT, KEY_TWEN); + ioctl(fd, UI_SET_KEYBIT, KEY_VIDEOPHONE); + ioctl(fd, UI_SET_KEYBIT, KEY_GAMES); + ioctl(fd, UI_SET_KEYBIT, KEY_ZOOMIN); + ioctl(fd, UI_SET_KEYBIT, KEY_ZOOMOUT); + ioctl(fd, UI_SET_KEYBIT, KEY_ZOOMRESET); + ioctl(fd, UI_SET_KEYBIT, KEY_WORDPROCESSOR); + ioctl(fd, UI_SET_KEYBIT, KEY_EDITOR); + ioctl(fd, UI_SET_KEYBIT, KEY_SPREADSHEET); + ioctl(fd, UI_SET_KEYBIT, KEY_GRAPHICSEDITOR); + ioctl(fd, UI_SET_KEYBIT, KEY_PRESENTATION); + ioctl(fd, UI_SET_KEYBIT, KEY_DATABASE); + ioctl(fd, UI_SET_KEYBIT, KEY_NEWS); + ioctl(fd, UI_SET_KEYBIT, KEY_VOICEMAIL); + ioctl(fd, UI_SET_KEYBIT, KEY_ADDRESSBOOK); + ioctl(fd, UI_SET_KEYBIT, KEY_MESSENGER); + ioctl(fd, UI_SET_KEYBIT, KEY_DISPLAYTOGGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESS_TOGGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_SPELLCHECK); + ioctl(fd, UI_SET_KEYBIT, KEY_LOGOFF); + ioctl(fd, UI_SET_KEYBIT, KEY_DOLLAR); + ioctl(fd, UI_SET_KEYBIT, KEY_EURO); + ioctl(fd, UI_SET_KEYBIT, KEY_FRAMEBACK); + ioctl(fd, UI_SET_KEYBIT, KEY_FRAMEFORWARD); + ioctl(fd, UI_SET_KEYBIT, KEY_CONTEXT_MENU); + ioctl(fd, UI_SET_KEYBIT, KEY_MEDIA_REPEAT); + ioctl(fd, UI_SET_KEYBIT, KEY_10CHANNELSUP); + ioctl(fd, UI_SET_KEYBIT, KEY_10CHANNELSDOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_IMAGES); + ioctl(fd, UI_SET_KEYBIT, KEY_DEL_EOL); + ioctl(fd, UI_SET_KEYBIT, KEY_DEL_EOS); + ioctl(fd, UI_SET_KEYBIT, KEY_INS_LINE); + ioctl(fd, UI_SET_KEYBIT, KEY_DEL_LINE); + ioctl(fd, UI_SET_KEYBIT, KEY_FN); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_ESC); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F1); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F2); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F3); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F4); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F5); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F6); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F7); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F8); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F9); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F10); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F11); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F12); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_1); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_2); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_D); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_E); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_F); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_S); + ioctl(fd, UI_SET_KEYBIT, KEY_FN_B); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT1); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT2); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT3); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT4); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT5); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT6); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT7); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT8); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT9); + ioctl(fd, UI_SET_KEYBIT, KEY_BRL_DOT10); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_0); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_1); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_2); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_3); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_4); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_5); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_6); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_7); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_8); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_9); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_STAR); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_POUND); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_A); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_B); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_C); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_D); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA_FOCUS); + ioctl(fd, UI_SET_KEYBIT, KEY_WPS_BUTTON); + ioctl(fd, UI_SET_KEYBIT, KEY_TOUCHPAD_TOGGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_TOUCHPAD_ON); + ioctl(fd, UI_SET_KEYBIT, KEY_TOUCHPAD_OFF); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA_ZOOMIN); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA_ZOOMOUT); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA_UP); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA_DOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA_LEFT); + ioctl(fd, UI_SET_KEYBIT, KEY_CAMERA_RIGHT); + ioctl(fd, UI_SET_KEYBIT, KEY_ATTENDANT_ON); + ioctl(fd, UI_SET_KEYBIT, KEY_ATTENDANT_OFF); + ioctl(fd, UI_SET_KEYBIT, KEY_ATTENDANT_TOGGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_LIGHTS_TOGGLE); + ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_UP); + ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_DOWN); + ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_LEFT); + ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_RIGHT); + ioctl(fd, UI_SET_KEYBIT, KEY_ALS_TOGGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_ROTATE_LOCK_TOGGLE); + ioctl(fd, UI_SET_KEYBIT, KEY_BUTTONCONFIG); + ioctl(fd, UI_SET_KEYBIT, KEY_TASKMANAGER); + ioctl(fd, UI_SET_KEYBIT, KEY_JOURNAL); + ioctl(fd, UI_SET_KEYBIT, KEY_CONTROLPANEL); + ioctl(fd, UI_SET_KEYBIT, KEY_APPSELECT); + ioctl(fd, UI_SET_KEYBIT, KEY_SCREENSAVER); + ioctl(fd, UI_SET_KEYBIT, KEY_VOICECOMMAND); + ioctl(fd, UI_SET_KEYBIT, KEY_ASSISTANT); + ioctl(fd, UI_SET_KEYBIT, KEY_KBD_LAYOUT_NEXT); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESS_MIN); + ioctl(fd, UI_SET_KEYBIT, KEY_BRIGHTNESS_MAX); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDINPUTASSIST_PREV); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDINPUTASSIST_NEXT); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDINPUTASSIST_PREVGROUP); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDINPUTASSIST_NEXTGROUP); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDINPUTASSIST_ACCEPT); + ioctl(fd, UI_SET_KEYBIT, KEY_KBDINPUTASSIST_CANCEL); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHT_UP); + ioctl(fd, UI_SET_KEYBIT, KEY_RIGHT_DOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFT_UP); + ioctl(fd, UI_SET_KEYBIT, KEY_LEFT_DOWN); + ioctl(fd, UI_SET_KEYBIT, KEY_ROOT_MENU); + ioctl(fd, UI_SET_KEYBIT, KEY_MEDIA_TOP_MENU); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_11); + ioctl(fd, UI_SET_KEYBIT, KEY_NUMERIC_12); + ioctl(fd, UI_SET_KEYBIT, KEY_AUDIO_DESC); + ioctl(fd, UI_SET_KEYBIT, KEY_3D_MODE); + ioctl(fd, UI_SET_KEYBIT, KEY_NEXT_FAVORITE); + ioctl(fd, UI_SET_KEYBIT, KEY_STOP_RECORD); + ioctl(fd, UI_SET_KEYBIT, KEY_PAUSE_RECORD); + ioctl(fd, UI_SET_KEYBIT, KEY_VOD); + ioctl(fd, UI_SET_KEYBIT, KEY_UNMUTE); + ioctl(fd, UI_SET_KEYBIT, KEY_FASTREVERSE); + ioctl(fd, UI_SET_KEYBIT, KEY_SLOWREVERSE); + ioctl(fd, UI_SET_KEYBIT, KEY_DATA); + ioctl(fd, UI_SET_KEYBIT, KEY_ONSCREEN_KEYBOARD); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY1); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY2); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY3); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY4); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY5); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY6); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY7); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY8); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY9); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY10); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY11); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY12); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY13); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY14); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY15); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY16); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY17); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY18); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY19); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY20); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY21); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY22); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY23); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY24); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY25); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY26); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY27); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY28); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY29); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY30); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY31); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY32); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY33); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY34); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY35); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY36); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY37); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY38); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY39); + ioctl(fd, UI_SET_KEYBIT, BTN_TRIGGER_HAPPY40); + for(int i = LED_NUML; i <= LED_MISC; i++){ + if(ioctl(fd, UI_SET_LEDBIT, i)){ + perror("ioctl set_ledbit"); + exit(-1); + } + } + ioctl(fd, UI_SET_KEYBIT, KEY_ZOOM); + memset(&usetup, 0, sizeof(usetup)); + usetup.id.bustype = BUS_USB; + usetup.id.vendor = 0x0000; + usetup.id.product = 0xFFFF; + strcpy(usetup.name, "Oxide Virtual Keyboard"); + + ioctl(fd, UI_DEV_SETUP, &usetup); + ioctl(fd, UI_DEV_CREATE); + } + reloadDevices(); + deviceSettings.onKeyboardAttachedChanged([this]{ reloadDevices(); }); +} + +KeyboardHandler::~KeyboardHandler(){ + if(fd != -1){ + ioctl(fd, UI_DEV_DESTROY); + close(fd); + } +} + +void KeyboardHandler::flood(){ + qDebug() << "Flooding"; + for(int i = 0; i < 512 * 8; i+=4){ + writeEvent(EV_KEY, KEY_ROTATE_LOCK_TOGGLE, 1); + writeEvent(EV_SYN, SYN_REPORT, 0); + writeEvent(EV_KEY, KEY_ROTATE_LOCK_TOGGLE, 0); + writeEvent(EV_SYN, SYN_REPORT, 0); + } +} + +void KeyboardHandler::writeEvent(int type, int code, int val){ + input_event ie; + ie.type = type; + ie.code = code; + ie.value = val; + // timestamp values below are ignored + ie.time.tv_sec = 0; + ie.time.tv_usec = 0; + ::write(fd, &ie, sizeof(input_event)); +} + +void KeyboardHandler::keyEvent(int code, int value){ + writeEvent(EV_KEY, code, value); + writeEvent(EV_SYN, SYN_REPORT, 0); +} + +bool KeyboardHandler::hasDevice(event_device device){ + for(auto keyboard : devices){ + if(device.device.c_str() == keyboard->path()){ + return true; + } + } + return false; +} + +void KeyboardHandler::reloadDevices(){ + O_DEBUG("Reloading keyboards"); + for(auto device : deviceSettings.keyboards()){ + if(device.device == deviceSettings.getButtonsDevicePath()){ + continue; + } + if(!hasDevice(device) && device.fd != -1){ + auto keyboard = new KeyboardDevice(this, device); + keyboard->moveToThread(this); + O_DEBUG(keyboard->name() << "added"); + devices.append(keyboard); + keyboard->readEvents(); + } + } + QMutableListIterator i(devices); + while(i.hasNext()){ + KeyboardDevice* device = i.next(); + if(device->exists()){ + continue; + } + O_DEBUG(device->name() << "removed"); + i.remove(); + delete device; + } +} diff --git a/applications/system-service/keyboardhandler.h b/applications/system-service/keyboardhandler.h new file mode 100644 index 000000000..e103100d8 --- /dev/null +++ b/applications/system-service/keyboardhandler.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +#include "keyboarddevice.h" + +using namespace Oxide; + +#define keyboardHandler KeyboardHandler::init() + +class KeyboardHandler : public QThread{ + Q_OBJECT + +public: + static KeyboardHandler* init(); + KeyboardHandler(); + ~KeyboardHandler(); + void flood(); + void writeEvent(int type, int code, int val); + +private slots: + void keyEvent(int code, int value); + +private: + int fd; + uinput_setup usetup; + + QList devices; + bool hasDevice(event_device device); + void reloadDevices(); +}; diff --git a/applications/system-service/system-service.pro b/applications/system-service/system-service.pro index 0b2547e50..f68e1f552 100644 --- a/applications/system-service/system-service.pro +++ b/applications/system-service/system-service.pro @@ -21,6 +21,8 @@ SOURCES += \ digitizerhandler.cpp \ eventlistener.cpp \ fifohandler.cpp \ + keyboarddevice.cpp \ + keyboardhandler.cpp \ network.cpp \ notification.cpp \ notificationapi.cpp \ @@ -73,6 +75,8 @@ HEADERS += \ digitizerhandler.h \ eventlistener.h \ fifohandler.h \ + keyboarddevice.h \ + keyboardhandler.h \ network.h \ notification.h \ notificationapi.h \ diff --git a/applications/system-service/systemapi.cpp b/applications/system-service/systemapi.cpp index 28413cf7a..92b5f3ae5 100644 --- a/applications/system-service/systemapi.cpp +++ b/applications/system-service/systemapi.cpp @@ -5,6 +5,7 @@ #include "powerapi.h" #include "wifiapi.h" #include "notificationapi.h" +#include "keyboardhandler.h" QDebug operator<<(QDebug debug, const Touch& touch){ QDebugStateSaver saver(debug); @@ -59,10 +60,8 @@ void SystemAPI::PrepareForSleep(bool suspending){ } releaseSleepInhibitors(); }); - Oxide::Sentry::sentry_span(t, "clear-input", "Clear input buffers", []{ - touchHandler->clear_buffer(); - wacomHandler->clear_buffer(); - buttonHandler->clear_buffer(); + Oxide::Sentry::sentry_span(t, "clear-input", "Clear input buffers", [this]{ + clearDeviceBuffers(); }); qDebug() << "Suspending..."; }); @@ -277,6 +276,7 @@ SystemAPI::SystemAPI(QObject* parent) deviceSettings.onKeyboardAttachedChanged([this]{ emit landscapeChanged(landscape()); }); + keyboardHandler; }); qDebug() << "System API ready to use"; }); @@ -385,6 +385,14 @@ void SystemAPI::lock(){ mutex.lock(); } void SystemAPI::unlock() { mutex.unlock(); } +void SystemAPI::clearDeviceBuffers(){ + touchHandler->clear_buffer(); + wacomHandler->clear_buffer(); + buttonHandler->clear_buffer(); + clearKeyboardBuffers(); +} +void SystemAPI::clearKeyboardBuffers(){ keyboardHandler->flood(); } + void SystemAPI::setSwipeEnabled(int direction, bool enabled){ if(!hasPermission("system")){ return; @@ -897,14 +905,22 @@ void SystemAPI::touchUp(QList touches){ cancelSwipe(touch); return; } - emit bottomAction(); + if(landscape()){ + emit rightAction(); + }else{ + emit bottomAction(); + } }else if(swipeDirection == Down){ if(!swipeStates[Down] || touch->y > location.y() || startLocation.y() - touch->y < swipeLengths[Down]){ // Must end swiping down and having gone far enough cancelSwipe(touch); return; } - emit topAction(); + if(landscape()){ + emit leftAction(); + }else{ + emit topAction(); + } }else if(swipeDirection == Right || swipeDirection == Left){ auto isRM2 = deviceSettings.getDeviceType() == Oxide::DeviceSettings::RM2; auto invalidLeft = !swipeStates[Left] || touch->x < location.x() || touch->x - startLocation.x() < swipeLengths[Left]; @@ -919,9 +935,17 @@ void SystemAPI::touchUp(QList touches){ return; } if(swipeDirection == Left){ - emit rightAction(); + if(landscape()){ + emit topAction(); + }else{ + emit rightAction(); + } }else{ - emit leftAction(); + if(landscape()){ + emit bottomAction(); + }else{ + emit leftAction(); + } } } swipeDirection = None; diff --git a/applications/system-service/systemapi.h b/applications/system-service/systemapi.h index 431f30c89..3436c17e8 100644 --- a/applications/system-service/systemapi.h +++ b/applications/system-service/systemapi.h @@ -87,6 +87,8 @@ class SystemAPI : public APIBase { void startLockTimer(); void lock(); void unlock(); + void clearDeviceBuffers(); + void clearKeyboardBuffers(); Q_INVOKABLE void setSwipeEnabled(int direction, bool enabled); void setSwipeEnabled(SwipeDirection direction, bool enabled); Q_INVOKABLE bool getSwipeEnabled(int direction); @@ -97,6 +99,7 @@ class SystemAPI : public APIBase { void setSwipeLength(SwipeDirection direction, int length); Q_INVOKABLE int getSwipeLength(int direction); int getSwipeLength(SwipeDirection direction); + public slots: void suspend(); void powerOff(); @@ -107,6 +110,7 @@ public slots: void inhibitPowerOff(QDBusMessage message); void uninhibitPowerOff(QDBusMessage message); void toggleSwipes(); + signals: void leftAction(); void homeAction(); diff --git a/applications/xdg-settings/main.cpp b/applications/xdg-settings/main.cpp index 7755558f6..49815894c 100644 --- a/applications/xdg-settings/main.cpp +++ b/applications/xdg-settings/main.cpp @@ -125,7 +125,7 @@ QObject* getObj(QStringList* args, int isGet = false){ return obj; } -int get(QCommandLineParser& parser){ +int get_command(QCommandLineParser& parser){ parser.clearPositionalArguments(); parser.addPositionalArgument("", "", "get"); parser.addPositionalArgument("property", "Property to get", "{property}"); @@ -151,7 +151,7 @@ int get(QCommandLineParser& parser){ return EXIT_SUCCESS; } -int check(QCommandLineParser& parser){ +int check_command(QCommandLineParser& parser){ parser.clearPositionalArguments(); parser.addPositionalArgument("", "", "check"); parser.addPositionalArgument("property", "Property to check", "{property}"); @@ -177,7 +177,7 @@ int check(QCommandLineParser& parser){ return EXIT_SUCCESS; } -int set(QCommandLineParser& parser){ +int set_command(QCommandLineParser& parser){ parser.clearPositionalArguments(); parser.addPositionalArgument("", "", "set"); parser.addPositionalArgument("property", "Property to set", "{property}"); @@ -211,7 +211,7 @@ int set(QCommandLineParser& parser){ return EXIT_FAILURE; } -int list(QCommandLineParser& parser){ +int list_command(QCommandLineParser& parser){ if(!parser.positionalArguments().isEmpty()){ parser.showHelp(EXIT_FAILURE); } @@ -261,7 +261,7 @@ int main(int argc, char *argv[]){ parser.setOptionsAfterPositionalArgumentsMode(QCommandLineParser::ParseAsOptions); QStringList args = parser.positionalArguments(); if(parser.isSet(listOption)){ - return list(parser); + return list_command(parser); } if (args.isEmpty()) { parser.showHelp(EXIT_FAILURE); @@ -271,15 +271,15 @@ int main(int argc, char *argv[]){ auto command = args.first(); if(command == "get"){ parser.clearPositionalArguments(); - return get(parser); + return get_command(parser); } if(command == "check"){ parser.clearPositionalArguments(); - return check(parser); + return check_command(parser); } if(command == "set"){ parser.clearPositionalArguments(); - return set(parser); + return set_command(parser); } parser.showHelp(EXIT_FAILURE); } diff --git a/nix/sources.json b/nix/sources.json deleted file mode 100644 index be881ad27..000000000 --- a/nix/sources.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "niv": { - "branch": "master", - "description": "Easy dependency management for Nix projects", - "homepage": "https://github.com/nmattia/niv", - "owner": "nmattia", - "repo": "niv", - "rev": "5830a4dd348d77e39a0f3c4c762ff2663b602d4c", - "sha256": "1d3lsrqvci4qz2hwjrcnd8h5vfkg8aypq3sjd4g3izbc8frwz5sm", - "type": "tarball", - "url": "https://github.com/nmattia/niv/archive/5830a4dd348d77e39a0f3c4c762ff2663b602d4c.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nix-inclusive": { - "branch": "master", - "description": "Simple inclusive file selection implementation for Nix", - "homepage": "", - "owner": "grahamc", - "repo": "nix-inclusive", - "rev": "6d7062921b2ea3911d2f95a8bd7afdf723d01b9a", - "sha256": "0mx5w1la3yz6m6434dsi25hfra6wm87h854qanm9hsjmxzmgg7w7", - "type": "tarball", - "url": "https://github.com/grahamc/nix-inclusive/archive/6d7062921b2ea3911d2f95a8bd7afdf723d01b9a.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs": { - "branch": "nixpkgs-unstable", - "description": "Nix Packages collection", - "homepage": "", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "77fda7f672726e1a95c8cd200f27bccfc86c870b", - "sha256": "07qj1d45pkqsmkahbhh7hilwwbvg8vlz1wg497hzjrlx1a57v4y5", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/77fda7f672726e1a95c8cd200f27bccfc86c870b.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - } -} diff --git a/nix/sources.nix b/nix/sources.nix deleted file mode 100644 index b796fffac..000000000 --- a/nix/sources.nix +++ /dev/null @@ -1,171 +0,0 @@ -# This file has been generated by Niv. - -let - - # - # The fetchers. fetch_ fetches specs of type . - # - - fetch_file = pkgs: name: spec: - let - name' = sanitizeName name + "-src"; - in - if spec.builtin or true then - builtins_fetchurl { inherit (spec) url sha256; name = name'; } - else - pkgs.fetchurl { inherit (spec) url sha256; name = name'; }; - - fetch_tarball = pkgs: name: spec: - let - name' = sanitizeName name + "-src"; - in - if spec.builtin or true then - builtins_fetchTarball { name = name'; inherit (spec) url sha256; } - else - pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; - - fetch_git = name: spec: - let - ref = - if spec ? ref then spec.ref else - if spec ? branch then "refs/heads/${spec.branch}" else - if spec ? tag then "refs/tags/${spec.tag}" else - abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"; - in - builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; }; - - fetch_local = spec: spec.path; - - fetch_builtin-tarball = name: throw - ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=tarball -a builtin=true''; - - fetch_builtin-url = name: throw - ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=file -a builtin=true''; - - # - # Various helpers - # - - # https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695 - sanitizeName = name: - ( - concatMapStrings (s: if builtins.isList s then "-" else s) - ( - builtins.split "[^[:alnum:]+._?=-]+" - ((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name) - ) - ); - - # The set of packages used when specs are fetched using non-builtins. - mkPkgs = sources: system: - let - sourcesNixpkgs = - import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; }; - hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; - hasThisAsNixpkgsPath = == ./.; - in - if builtins.hasAttr "nixpkgs" sources - then sourcesNixpkgs - else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then - import {} - else - abort - '' - Please specify either (through -I or NIX_PATH=nixpkgs=...) or - add a package called "nixpkgs" to your sources.json. - ''; - - # The actual fetching function. - fetch = pkgs: name: spec: - - if ! builtins.hasAttr "type" spec then - abort "ERROR: niv spec ${name} does not have a 'type' attribute" - else if spec.type == "file" then fetch_file pkgs name spec - else if spec.type == "tarball" then fetch_tarball pkgs name spec - else if spec.type == "git" then fetch_git name spec - else if spec.type == "local" then fetch_local spec - else if spec.type == "builtin-tarball" then fetch_builtin-tarball name - else if spec.type == "builtin-url" then fetch_builtin-url name - else - abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; - - # If the environment variable NIV_OVERRIDE_${name} is set, then use - # the path directly as opposed to the fetched source. - replace = name: drv: - let - saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name; - ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}"; - in - if ersatz == "" then drv else ersatz; - - # Ports of functions for older nix versions - - # a Nix version of mapAttrs if the built-in doesn't exist - mapAttrs = builtins.mapAttrs or ( - f: set: with builtins; - listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) - ); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 - range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 - stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 - stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); - concatMapStrings = f: list: concatStrings (map f list); - concatStrings = builtins.concatStringsSep ""; - - # https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331 - optionalAttrs = cond: as: if cond then as else {}; - - # fetchTarball version that is compatible between all the versions of Nix - builtins_fetchTarball = { url, name ? null, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchTarball; - in - if lessThan nixVersion "1.12" then - fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) - else - fetchTarball attrs; - - # fetchurl version that is compatible between all the versions of Nix - builtins_fetchurl = { url, name ? null, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchurl; - in - if lessThan nixVersion "1.12" then - fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) - else - fetchurl attrs; - - # Create the final "sources" from the config - mkSources = config: - mapAttrs ( - name: spec: - if builtins.hasAttr "outPath" spec - then abort - "The values in sources.json should not have an 'outPath' attribute" - else - spec // { outPath = replace name (fetch config.pkgs name spec); } - ) config.sources; - - # The "config" used by the fetchers - mkConfig = - { sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null - , sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile) - , system ? builtins.currentSystem - , pkgs ? mkPkgs sources system - }: rec { - # The sources, i.e. the attribute set of spec name to spec - inherit sources; - - # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers - inherit pkgs; - }; - -in -mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); } diff --git a/shared/liboxide/devicesettings.cpp b/shared/liboxide/devicesettings.cpp new file mode 100644 index 000000000..8ca926f51 --- /dev/null +++ b/shared/liboxide/devicesettings.cpp @@ -0,0 +1,297 @@ +#include "devicesettings.h" + +#include +#include + +#include "debug.h" +#include "liboxide.h" + +#define BITS_PER_LONG (sizeof(long) * 8) +#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) +#define OFF(x) ((x)%BITS_PER_LONG) +#define LONG(x) ((x)/BITS_PER_LONG) +#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) + +using namespace Oxide; + +namespace Oxide { + DeviceSettings& DeviceSettings::instance() { + static DeviceSettings INSTANCE; + return INSTANCE; + } + DeviceSettings::DeviceSettings(): _deviceType(DeviceType::RM1) { + readDeviceType(); + + O_DEBUG("Looking for input devices..."); + QDir dir("/dev/input"); + for(auto path : dir.entryList(QDir::Files | QDir::NoSymLinks | QDir::System)){ + if(!wacomPath.empty() && !touchPath.empty() && !buttonsPath.empty()){ + break; + } + O_DEBUG((" Checking " + path + "...").toStdString().c_str()); + QString fullPath(dir.path() + "/" + path); + QFile device(fullPath); + device.open(QIODevice::ReadOnly); + int fd = device.handle(); + int version; + if(ioctl(fd, EVIOCGVERSION, &version)){ + O_DEBUG(" Invalid"); + continue; + } + unsigned long bit[EV_MAX]; + ioctl(fd, EVIOCGBIT(0, EV_MAX), bit); + if(test_bit(EV_KEY, bit)){ + if(checkBitSet(fd, EV_KEY, BTN_STYLUS) && test_bit(EV_ABS, bit)){ + O_DEBUG(" Wacom input device detected"); + if(wacomPath.empty()){ + wacomPath = fullPath.toStdString(); + } + continue; + } + if(checkBitSet(fd, EV_KEY, KEY_POWER)){ + O_DEBUG(" Buttons input device detected"); + if(buttonsPath.empty()){ + buttonsPath = fullPath.toStdString(); + } + continue; + } + } + if(checkBitSet(fd, EV_ABS, ABS_MT_SLOT)){ + O_DEBUG(" Touch input device detected"); + if(touchPath.empty()){ + touchPath = fullPath.toStdString(); + } + continue; + } + O_DEBUG(" Invalid"); + } + if(wacomPath.empty()){ + O_WARNING("Wacom input device not found"); + }else{ + O_DEBUG(("Wacom input device: " + wacomPath).c_str()); + } + if(touchPath.empty()){ + O_WARNING("Touch input device not found"); + }else{ + O_DEBUG(("Touch input device: " + touchPath).c_str()); + } + if(buttonsPath.empty()){ + O_WARNING("Buttons input device not found"); + }else{ + O_DEBUG(("Buttons input device: " + buttonsPath).c_str()); + } + } + DeviceSettings::~DeviceSettings(){} + bool DeviceSettings::checkBitSet(int fd, int type, int i) { + unsigned long bit[NBITS(KEY_MAX)]; + ioctl(fd, EVIOCGBIT(type, KEY_MAX), bit); + return test_bit(i, bit); + } + + void DeviceSettings::readDeviceType() { + QFile file("/sys/devices/soc0/machine"); + if(!file.exists() || !file.open(QIODevice::ReadOnly | QIODevice::Text)){ + O_DEBUG("Couldn't open " << file.fileName()); + _deviceType = DeviceType::Unknown; + return; + } + QTextStream in(&file); + QString modelName = in.readLine(); + if (modelName.startsWith("reMarkable 2")) { + O_DEBUG("RM2 detected..."); + _deviceType = DeviceType::RM2; + return; + } + O_DEBUG("RM1 detected..."); + _deviceType = DeviceType::RM1; + } + + DeviceSettings::DeviceType DeviceSettings::getDeviceType() const { return _deviceType; } + + const char* DeviceSettings::getButtonsDevicePath() const { return buttonsPath.c_str(); } + + const char* DeviceSettings::getWacomDevicePath() const { return wacomPath.c_str(); } + + const char* DeviceSettings::getTouchDevicePath() const { return touchPath.c_str(); } + const char* DeviceSettings::getDeviceName() const { + switch(getDeviceType()){ + case DeviceType::RM1: + return "reMarkable 1"; + case DeviceType::RM2: + return "reMarkable 2"; + default: + return "Unknown"; + } + } + + const char* DeviceSettings::getTouchEnvSetting() const { + switch(getDeviceType()) { + case DeviceType::RM1: + return "rotate=180"; + case DeviceType::RM2: + return "rotate=180:invertx"; + default: + return ""; + } + } + + int DeviceSettings::getTouchWidth() const { + switch(getDeviceType()) { + case DeviceType::RM1: + return 767; + case DeviceType::RM2: + return 1403; + default: + return 0; + } + } + int DeviceSettings::getTouchHeight() const { + switch(getDeviceType()) { + case DeviceType::RM1: + return 1023; + case DeviceType::RM2: + return 1871; + default: + return 0; + } + } + const QStringList DeviceSettings::getLocales() { + return execute("localectl", QStringList() << "list-locales" << "--no-pager").split("\n"); + } + QString DeviceSettings::getLocale() { + QFile file("/etc/locale.conf"); + if(file.open(QFile::ReadOnly)){ + while(!file.atEnd()){ + QString line = file.readLine(); + QStringList fields = line.split("="); + if(fields.first().trimmed() != "LANG"){ + continue; + } + return fields.at(1).trimmed(); + } + } + return qEnvironmentVariable("LANG", "C"); + } + void DeviceSettings::setLocale(const QString& locale) { + if(debugEnabled()){ + qDebug() << "Setting locale:" << locale; + } + qputenv("LANG", locale.toUtf8()); + QProcess::execute("localectl", QStringList() << "set-locale" << locale); + } + const QStringList DeviceSettings::getTimezones() { + return execute("timedatectl", QStringList() << "list-timezones" << "--no-pager").split("\n"); + } + QString DeviceSettings::getTimezone() { + auto lines = execute("timedatectl", QStringList() << "show").split("\n"); + for(auto line : lines){ + QStringList fields = line.split("="); + if(fields.first().trimmed() != "Timezone"){ + continue; + } + return fields.at(1).trimmed(); + } + return "UTC"; + } + void DeviceSettings::setTimezone(const QString& timezone) { + if(debugEnabled()){ + qDebug() << "Setting timezone:" << timezone; + } + QProcess::execute("timedatectl", QStringList() << "set-timezone" << timezone); + } + void DeviceSettings::setupQtEnvironment(bool touch){ + auto qt_version = qVersion(); + if (strcmp(qt_version, QT_VERSION_STR) != 0){ + qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; + } + #ifdef __arm__ + qputenv("QMLSCENE_DEVICE", "epaper"); + qputenv("QT_QUICK_BACKEND","epaper"); + qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); + #endif + if(touch){ + qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); + qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); + } + } + bool DeviceSettings::keyboardAttached(){ return !physicalKeyboards().empty(); } + void DeviceSettings::onKeyboardAttachedChanged(std::function callback){ + auto manager = QGuiApplicationPrivate::inputDeviceManager(); + QObject::connect(manager, &QInputDeviceManager::deviceListChanged, [callback](QInputDeviceManager::DeviceType type){ + if(type == QInputDeviceManager::DeviceTypeKeyboard){ + callback(); + } + }); + } + QList DeviceSettings::keyboards(){ + QList keyboards; + QDir dir("/dev/input"); + for(auto path : dir.entryList(QDir::Files | QDir::NoSymLinks | QDir::System)){ + QString fullPath(dir.path() + "/" + path); + if( + fullPath == QString::fromStdString(buttonsPath) + || fullPath == QString::fromStdString(wacomPath) + || fullPath == QString::fromStdString(touchPath) + ){ + continue; + } + QFile device(fullPath); + device.open(QIODevice::ReadOnly); + int fd = device.handle(); + int version; + if(ioctl(fd, EVIOCGVERSION, &version)){ + continue; + } + unsigned long bit[EV_MAX]; + ioctl(fd, EVIOCGBIT(0, EV_MAX), bit); + if(!test_bit(EV_KEY, bit)){ + continue; + } + if(checkBitSet(fd, EV_KEY, BTN_STYLUS) && test_bit(EV_ABS, bit)){ + continue; + } + SysObject sys("/sys/class/input/" + path + "/device"); + auto vendor = sys.strProperty("id/vendor"); + if(vendor == "0000"){ + continue; + } + auto product = sys.strProperty("id/product"); + if(product == "0000"){ + continue; + } + keyboards.append(event_device(fullPath.toStdString(), O_RDWR | O_NONBLOCK)); + } + return keyboards; + } + static QStringList VIRTUAL_KEYBOARD_IDS( + QStringList() << "0fac:0ade" << "0fac:1ade" << "0000:ffff" + ); + QList DeviceSettings::physicalKeyboards(){ + QList physicalKeyboards; + for(auto device : keyboards()){ + auto name = QFileInfo(device.device.c_str()).baseName(); + SysObject sys("/sys/class/input/" + name + "/device/id"); + auto id = QString("%1:%2") + .arg(sys.strProperty("vendor").c_str()) + .arg(sys.strProperty("product").c_str()); + if(!VIRTUAL_KEYBOARD_IDS.contains(id)){ + physicalKeyboards.append(device); + } + } + return physicalKeyboards; + } + QList DeviceSettings::virtualKeyboards(){ + QList physicalKeyboards; + for(auto device : keyboards()){ + auto name = QFileInfo(device.device.c_str()).baseName(); + SysObject sys("/sys/class/input/" + name + "/device/id"); + auto id = QString("%1:%2") + .arg(sys.strProperty("vendor").c_str()) + .arg(sys.strProperty("product").c_str()); + if(VIRTUAL_KEYBOARD_IDS.contains(id)){ + physicalKeyboards.append(device); + } + } + return physicalKeyboards; + } +} diff --git a/shared/liboxide/devicesettings.h b/shared/liboxide/devicesettings.h new file mode 100644 index 000000000..8193d7e2d --- /dev/null +++ b/shared/liboxide/devicesettings.h @@ -0,0 +1,150 @@ +/*! + * \addtogroup Oxide + * \brief The DeviceSettings class + * @{ + * \file + */ +#pragma once +#include "liboxide_global.h" +#include "event_device.h" + +/*! + * \def deviceSettings() + * \brief Get the Oxide::DeviceSettings instance + */ +#define deviceSettings Oxide::DeviceSettings::instance() + +namespace Oxide{ + /*! + * \brief Device specific values + */ + class LIBOXIDE_EXPORT DeviceSettings{ + public: + /*! + * \brief Known device types + */ + enum DeviceType { + Unknown, /*!< Unknown device type >*/ + RM1, /*!< reMarkable 1 >*/ + RM2 /*!< reMarkable 2 >*/ + }; + /*! + * \brief Get the static instance of this class. You should use the deviceSettings macro instead. + * \return The static instance + * \sa deviceSettings + */ + static DeviceSettings& instance(); + /*! + * \brief Get the path to the buttons input device + * \return Path to the buttons device + */ + const char* getButtonsDevicePath() const; + /*! + * \brief Get the path to the wacom input device + * \return Path to the wacom device + */ + const char* getWacomDevicePath() const; + /*! + * \brief Get the path to the touch input device + * \return Path to the touch device + */ + const char* getTouchDevicePath() const; + /*! + * \brief Get the Qt environment settings for the device + * \return The Qt environment settings for the device + */ + const char* getTouchEnvSetting() const; + /*! + * \brief Get the device type + * \return The device type + */ + DeviceType getDeviceType() const; + /*! + * \brief Get the human readable device name + * \return Human readable device name + */ + const char* getDeviceName() const; + /*! + * \brief Get the max width for touch input on the device + * \return Max width for touch input + */ + int getTouchWidth() const; + /*! + * \brief Get the max height for touch input on the device + * \return Max height for touch input + */ + int getTouchHeight() const; + /*! + * \brief Get the list of possible locales on the device + * \return The list of possible locales on the device + */ + const QStringList getLocales(); + /*! + * \brief Get the current set locale + * \return The current locale + */ + QString getLocale(); + /*! + * \brief Set the current locale + * \param locale Locale to set + */ + void setLocale(const QString& locale); + /*! + * \brief Get the list of possible timezones on the device + * \return The list of possible timezones on the device + */ + const QStringList getTimezones(); + /*! + * \brief Get the current set timezone + * \return The current timezone + */ + QString getTimezone(); + /*! + * \brief Set the current timezone + * \param locale Timezone to set + */ + void setTimezone(const QString& timezone); + /*! + * \brief Setup the Qt environment + * \snippet examples/oxide.cpp setupQtEnvironment + */ + void setupQtEnvironment(bool touch = true); + /*! + * \brief Check if a keyboard is attached + * \return If a keyboard is attached + */ + bool keyboardAttached(); + /*! + * \brief Run a callback when keyboardAttached changes + * \param callback Callback to run + */ + void onKeyboardAttachedChanged(std::function callback); + /*! + * \brief Get the list of all keyboard evdev devices + * \return All keyboard devices + */ + QList keyboards(); + /*! + * \brief Get the list of all physical keyboard evdev devices + * \return All physical keyboard devices + */ + QList physicalKeyboards(); + /*! + * \brief Get the list of all virtual keyboard evdev devices + * \return All virtual keyboard devices + */ + QList virtualKeyboards(); + + private: + DeviceType _deviceType; + + DeviceSettings(); + ~DeviceSettings(); + void readDeviceType(); + bool checkBitSet(int fd, int type, int i); + std::string buttonsPath = ""; + std::string wacomPath = ""; + std::string touchPath = ""; + }; +} +/*! @} */ diff --git a/shared/liboxide/event_device.cpp b/shared/liboxide/event_device.cpp index 5bdbff2ea..cf004300b 100644 --- a/shared/liboxide/event_device.cpp +++ b/shared/liboxide/event_device.cpp @@ -34,14 +34,16 @@ namespace Oxide { int event_device::lock(){ O_DEBUG("locking " << device.c_str()); - int result = ioctl(fd, EVIOCGRAB, 1); - if(result == EBUSY){ - O_WARNING("Device is busy"); - }else if(result != 0){ - O_WARNING("Unknown error: " << result); - }else{ + if(ioctl(fd, EVIOCGRAB, 1) == 0){ locked = true; O_DEBUG(device.c_str() << " locked"); + return 0; + } + int result = errno; + if(result == EBUSY){ + O_WARNING("Device is already grabbed"); + }else{ + O_WARNING("Unknown error: " << result); } return result; } diff --git a/shared/liboxide/liboxide.cpp b/shared/liboxide/liboxide.cpp index 8e7596330..81cc510c8 100644 --- a/shared/liboxide/liboxide.cpp +++ b/shared/liboxide/liboxide.cpp @@ -5,9 +5,6 @@ #include #include -#include -#include - #include #include #include @@ -15,12 +12,6 @@ #include #include -#define BITS_PER_LONG (sizeof(long) * 8) -#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) -#define OFF(x) ((x)%BITS_PER_LONG) -#define LONG(x) ((x)/BITS_PER_LONG) -#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) - namespace Oxide { QString execute(const QString& program, const QStringList& args){ QString output; @@ -130,302 +121,4 @@ namespace Oxide { } return result->gr_gid; } - DeviceSettings& DeviceSettings::instance() { - static DeviceSettings INSTANCE; - return INSTANCE; - } - DeviceSettings::DeviceSettings(): _deviceType(DeviceType::RM1) { - readDeviceType(); - - O_DEBUG("Looking for input devices..."); - QDir dir("/dev/input"); - for(auto path : dir.entryList(QDir::Files | QDir::NoSymLinks | QDir::System)){ - O_DEBUG((" Checking " + path + "...").toStdString().c_str()); - QString fullPath(dir.path() + "/" + path); - QFile device(fullPath); - device.open(QIODevice::ReadOnly); - int fd = device.handle(); - int version; - if(ioctl(fd, EVIOCGVERSION, &version)){ - O_DEBUG(" Invalid"); - continue; - } - unsigned long bit[EV_MAX]; - ioctl(fd, EVIOCGBIT(0, EV_MAX), bit); - if(test_bit(EV_KEY, bit)){ - if(checkBitSet(fd, EV_KEY, BTN_STYLUS) && test_bit(EV_ABS, bit)){ - O_DEBUG(" Wacom input device detected"); - if(wacomPath.empty()){ - wacomPath = fullPath.toStdString(); - } - continue; - } - if(checkBitSet(fd, EV_KEY, KEY_POWER)){ - O_DEBUG(" Buttons input device detected"); - if(buttonsPath.empty()){ - buttonsPath = fullPath.toStdString(); - } - continue; - } - } - if(checkBitSet(fd, EV_ABS, ABS_MT_SLOT)){ - O_DEBUG(" Touch input device detected"); - if(touchPath.empty()){ - touchPath = fullPath.toStdString(); - } - continue; - } - O_DEBUG(" Invalid"); - } - if(wacomPath.empty()){ - O_WARNING("Wacom input device not found"); - }else{ - O_DEBUG(("Wacom input device: " + wacomPath).c_str()); - } - if(touchPath.empty()){ - O_WARNING("Touch input device not found"); - }else{ - O_DEBUG(("Touch input device: " + touchPath).c_str()); - } - if(buttonsPath.empty()){ - O_WARNING("Buttons input device not found"); - }else{ - O_DEBUG(("Buttons input device: " + buttonsPath).c_str()); - } - } - DeviceSettings::~DeviceSettings(){} - bool DeviceSettings::checkBitSet(int fd, int type, int i) { - unsigned long bit[NBITS(KEY_MAX)]; - ioctl(fd, EVIOCGBIT(type, KEY_MAX), bit); - return test_bit(i, bit); - } - - void DeviceSettings::readDeviceType() { - QFile file("/sys/devices/soc0/machine"); - if(!file.exists() || !file.open(QIODevice::ReadOnly | QIODevice::Text)){ - O_DEBUG("Couldn't open " << file.fileName()); - _deviceType = DeviceType::Unknown; - return; - } - QTextStream in(&file); - QString modelName = in.readLine(); - if (modelName.startsWith("reMarkable 2")) { - O_DEBUG("RM2 detected..."); - _deviceType = DeviceType::RM2; - return; - } - O_DEBUG("RM1 detected..."); - _deviceType = DeviceType::RM1; - } - - DeviceSettings::DeviceType DeviceSettings::getDeviceType() const { return _deviceType; } - - const char* DeviceSettings::getButtonsDevicePath() const { return buttonsPath.c_str(); } - - const char* DeviceSettings::getWacomDevicePath() const { return wacomPath.c_str(); } - - const char* DeviceSettings::getTouchDevicePath() const { return touchPath.c_str(); } - const char* DeviceSettings::getDeviceName() const { - switch(getDeviceType()){ - case DeviceType::RM1: - return "reMarkable 1"; - case DeviceType::RM2: - return "reMarkable 2"; - default: - return "Unknown"; - } - } - - const char* DeviceSettings::getTouchEnvSetting() const { - switch(getDeviceType()) { - case DeviceType::RM1: - return "rotate=180"; - case DeviceType::RM2: - return "rotate=180:invertx"; - default: - return ""; - } - } - - int DeviceSettings::getTouchWidth() const { - switch(getDeviceType()) { - case DeviceType::RM1: - return 767; - case DeviceType::RM2: - return 1403; - default: - return 0; - } - } - int DeviceSettings::getTouchHeight() const { - switch(getDeviceType()) { - case DeviceType::RM1: - return 1023; - case DeviceType::RM2: - return 1871; - default: - return 0; - } - } - const QStringList DeviceSettings::getLocales() { - return execute("localectl", QStringList() << "list-locales" << "--no-pager").split("\n"); - } - QString DeviceSettings::getLocale() { - QFile file("/etc/locale.conf"); - if(file.open(QFile::ReadOnly)){ - while(!file.atEnd()){ - QString line = file.readLine(); - QStringList fields = line.split("="); - if(fields.first().trimmed() != "LANG"){ - continue; - } - return fields.at(1).trimmed(); - } - } - return qEnvironmentVariable("LANG", "C"); - } - void DeviceSettings::setLocale(const QString& locale) { - if(debugEnabled()){ - qDebug() << "Setting locale:" << locale; - } - qputenv("LANG", locale.toUtf8()); - QProcess::execute("localectl", QStringList() << "set-locale" << locale); - } - const QStringList DeviceSettings::getTimezones() { - return execute("timedatectl", QStringList() << "list-timezones" << "--no-pager").split("\n"); - } - QString DeviceSettings::getTimezone() { - auto lines = execute("timedatectl", QStringList() << "show").split("\n"); - for(auto line : lines){ - QStringList fields = line.split("="); - if(fields.first().trimmed() != "Timezone"){ - continue; - } - return fields.at(1).trimmed(); - } - return "UTC"; - } - void DeviceSettings::setTimezone(const QString& timezone) { - if(debugEnabled()){ - qDebug() << "Setting timezone:" << timezone; - } - QProcess::execute("timedatectl", QStringList() << "set-timezone" << timezone); - } - void DeviceSettings::setupQtEnvironment(bool touch){ - auto qt_version = qVersion(); - if (strcmp(qt_version, QT_VERSION_STR) != 0){ - qDebug() << "Version mismatch, Runtime: " << qt_version << ", Build: " << QT_VERSION_STR; - } -#ifdef __arm__ - qputenv("QMLSCENE_DEVICE", "epaper"); - qputenv("QT_QUICK_BACKEND","epaper"); - qputenv("QT_QPA_PLATFORM", "epaper:enable_fonts"); -#endif - if(touch){ - qputenv("QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS", deviceSettings.getTouchEnvSetting()); - qputenv("QT_QPA_GENERIC_PLUGINS", "evdevtablet"); - } - } - bool DeviceSettings::keyboardAttached(){ - QDir dir("/dev/input"); - for(auto path : dir.entryList(QDir::Files | QDir::NoSymLinks | QDir::System)){ - O_DEBUG((" Checking " + path + "...").toStdString().c_str()); - QString fullPath(dir.path() + "/" + path); - if( - fullPath == QString::fromStdString(buttonsPath) - || fullPath == QString::fromStdString(wacomPath) - || fullPath == QString::fromStdString(touchPath) - ){ - continue; - } - QFile device(fullPath); - device.open(QIODevice::ReadOnly); - int fd = device.handle(); - int version; - if(ioctl(fd, EVIOCGVERSION, &version)){ - continue; - } - unsigned long bit[EV_MAX]; - ioctl(fd, EVIOCGBIT(0, EV_MAX), bit); - if(!test_bit(EV_KEY, bit)){ - continue; - } - if(checkBitSet(fd, EV_KEY, BTN_STYLUS) && test_bit(EV_ABS, bit)){ - continue; - } - SysObject sys("/sys/class/input/" + path + "/device"); - auto vendor = sys.strProperty("id/vendor"); - if(vendor == "0000"){ - continue; - } - auto product = sys.strProperty("id/product"); - if(product == "0000"){ - continue; - } - auto id = vendor+":"+product; - if(id == "0fac:0ade" || id == "0fac:1ade"){ - continue; - } - O_DEBUG("Keyboard found: " << sys.strProperty("name").c_str()); - return true; - } - O_DEBUG("No keyboard found"); - return false; - } - void DeviceSettings::onKeyboardAttachedChanged(std::function callback){ - auto manager = QGuiApplicationPrivate::inputDeviceManager(); - QObject::connect(manager, &QInputDeviceManager::deviceListChanged, [callback](QInputDeviceManager::DeviceType type){ - if(type == QInputDeviceManager::DeviceTypeKeyboard){ - callback(); - } - }); - } - WifiNetworks XochitlSettings::wifinetworks(){ - beginGroup("wifinetworks"); - QMap wifinetworks; - for(const QString& key : allKeys()){ - QVariantMap network = value(key).toMap(); - wifinetworks[key] = network; - } - endGroup(); - return wifinetworks; - } - void XochitlSettings::setWifinetworks(const WifiNetworks& wifinetworks){ - beginGroup("wifinetworks"); - for(const QString& key : wifinetworks.keys()){ - setValue(key, wifinetworks.value(key)); - } - endGroup(); - sync(); - } - QVariantMap XochitlSettings::getWifiNetwork(const QString& name){ - beginGroup("wifinetworks"); - QVariantMap network = value(name).toMap(); - endGroup(); - return network; - } - void XochitlSettings::setWifiNetwork(const QString& name, QVariantMap properties){ - beginGroup("wifinetworks"); - setValue(name, properties); - endGroup(); - sync(); - } - void XochitlSettings::resetWifinetworks(){} - XochitlSettings::~XochitlSettings(){} - SharedSettings::~SharedSettings(){} - O_SETTINGS_PROPERTY_BODY(XochitlSettings, QString, General, passcode) - O_SETTINGS_PROPERTY_BODY(XochitlSettings, bool, General, wifion) - O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, version) - O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, firstLaunch, true) - O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, telemetry, false) - O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, applicationUsage, false) - O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, crashReport, true) - O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, lockOnSuspend, true) - O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoSleep, 5) - O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoLock, 5) - O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, pin) - O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onLogin) - O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onFailedLogin) } - -#include "moc_liboxide.cpp" diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index ae0ac1e1a..184603f4c 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -18,6 +18,9 @@ #include "slothandler.h" #include "sysobject.h" #include "debug.h" +#include "devicesettings.h" +#include "xochitlsettings.h" +#include "sharedsettings.h" #if defined(LIBOXIDE_LIBRARY) #include "oxide_sentry.h" #else @@ -44,27 +47,7 @@ Q_IMPORT_PLUGIN(QsgEpaperPlugin) #ifndef APP_VERSION #define APP_VERSION VERSION #endif -/*! - * \def deviceSettings() - * \brief Get the Oxide::DeviceSettings instance - */ -#define deviceSettings Oxide::DeviceSettings::instance() -/*! - * \def xochitlSettings() - * \brief Get the Oxide::XochitlSettings instance - */ -#define xochitlSettings Oxide::XochitlSettings::instance() -/*! - * \def sharedSettings() - * \brief Get the Oxide::SharedSettings instance - */ -#define sharedSettings Oxide::SharedSettings::instance() -/*! - * \brief Wifi Network definition - */ -typedef QMap WifiNetworks; -Q_DECLARE_METATYPE(WifiNetworks); /*! * \brief The main Oxide namespace */ @@ -148,395 +131,5 @@ namespace Oxide { * \snippet examples/oxide.cpp getGID */ LIBOXIDE_EXPORT gid_t getGID(const QString& name); - /*! - * \brief Device specific values - */ - class LIBOXIDE_EXPORT DeviceSettings{ - public: - /*! - * \brief Known device types - */ - enum DeviceType { - Unknown, /*!< Unknown device type >*/ - RM1, /*!< reMarkable 1 >*/ - RM2 /*!< reMarkable 2 >*/ - }; - /*! - * \brief Get the static instance of this class. You should use the deviceSettings macro instead. - * \return The static instance - * \sa deviceSettings - */ - static DeviceSettings& instance(); - /*! - * \brief Get the path to the buttons input device - * \return Path to the buttons device - */ - const char* getButtonsDevicePath() const; - /*! - * \brief Get the path to the wacom input device - * \return Path to the wacom device - */ - const char* getWacomDevicePath() const; - /*! - * \brief Get the path to the touch input device - * \return Path to the touch device - */ - const char* getTouchDevicePath() const; - /*! - * \brief Get the Qt environment settings for the device - * \return The Qt environment settings for the device - */ - const char* getTouchEnvSetting() const; - /*! - * \brief Get the device type - * \return The device type - */ - DeviceType getDeviceType() const; - /*! - * \brief Get the human readable device name - * \return Human readable device name - */ - const char* getDeviceName() const; - /*! - * \brief Get the max width for touch input on the device - * \return Max width for touch input - */ - int getTouchWidth() const; - /*! - * \brief Get the max height for touch input on the device - * \return Max height for touch input - */ - int getTouchHeight() const; - /*! - * \brief Get the list of possible locales on the device - * \return The list of possible locales on the device - */ - const QStringList getLocales(); - /*! - * \brief Get the current set locale - * \return The current locale - */ - QString getLocale(); - /*! - * \brief Set the current locale - * \param locale Locale to set - */ - void setLocale(const QString& locale); - /*! - * \brief Get the list of possible timezones on the device - * \return The list of possible timezones on the device - */ - const QStringList getTimezones(); - /*! - * \brief Get the current set timezone - * \return The current timezone - */ - QString getTimezone(); - /*! - * \brief Set the current timezone - * \param locale Timezone to set - */ - void setTimezone(const QString& timezone); - /*! - * \brief Setup the Qt environment - * \snippet examples/oxide.cpp setupQtEnvironment - */ - void setupQtEnvironment(bool touch = true); - /*! - * \brief Check if a keyboard is attached - * \return If a keyboard is attached - */ - bool keyboardAttached(); - /*! - * \brief Run a callback when keyboardAttached changes - * \param callback Callback to run - */ - void onKeyboardAttachedChanged(std::function callback); - - private: - DeviceType _deviceType; - - DeviceSettings(); - ~DeviceSettings(); - void readDeviceType(); - bool checkBitSet(int fd, int type, int i); - std::string buttonsPath = ""; - std::string wacomPath = ""; - std::string touchPath = ""; - }; - /*! - * \brief Manage Xochitl settings - */ - class LIBOXIDE_EXPORT XochitlSettings : public SettingsFile { - Q_OBJECT - /*! - * \fn instance - * \brief Get the static instance of this class. You should use the xochitlSettings macro instead. - * \return The static instance - * \sa xochitlSettings - */ - // cppcheck-suppress uninitMemberVarPrivate - // cppcheck-suppress unusedFunction - O_SETTINGS(XochitlSettings, "/home/root/.config/remarkable/xochitl.conf") - /*! - * \property passcode - * \brief The passcode used to unlock the device - * \sa set_passcode, passcodeChanged - */ - /*! - * \fn set_passcode - * \param _arg_passcode The passcode used to unlock the device - * \brief Set the passcode used to unlock the device - */ - /*! - * \fn passcodeChanged - * \brief The passcode used to unlock the device has changed - */ - O_SETTINGS_PROPERTY(QString, General, passcode) - /*! - * \property wifion - * \brief If wifi is on or off - * \sa set_wifion, wifionChanged - */ - /*! - * \fn set_wifion - * \param _arg_wifion If wifi should be on or off - * \brief Turn wifi on or off - */ - /*! - * \fn wifionChanged - * \brief Wifi has been turned on or off - */ - O_SETTINGS_PROPERTY(bool, General, wifion) - /*! - * \property XochitlSettings::wifinetworks - * \brief List of wifi networks - * \sa setWifinetworks, wifinetworksChanged - */ - Q_PROPERTY(WifiNetworks wifinetworks MEMBER m_wifinetworks READ wifinetworks WRITE setWifinetworks RESET resetWifinetworks NOTIFY wifinetworksChanged) - - public: - WifiNetworks wifinetworks(); - /*! - * \brief Set the list of wifi networks - * \param wifinetworks List of wifi networks to replace with - */ - void setWifinetworks(const WifiNetworks& wifinetworks); - /*! - * \brief Get a specific wifi network - * \param name SSID of the wifi network - * \return The wifi network properties - */ - QVariantMap getWifiNetwork(const QString& name); - /*! - * \brief Set the properties for a specific wifi network - * \param name SSID of the wifi network - * \param properties The wifi network properties - */ - void setWifiNetwork(const QString& name, QVariantMap properties); - void resetWifinetworks(); - - signals: - /*! - * \brief The contents of the wifi network list has changed - */ - void wifinetworksChanged(WifiNetworks); - - private: - ~XochitlSettings(); - WifiNetworks m_wifinetworks; - }; - /*! - * \brief Shared settings for Oxide - */ - class LIBOXIDE_EXPORT SharedSettings : public SettingsFile { - Q_OBJECT - /*! - * \fn instance - * \brief Get the static instance of this class. You should use the sharedSettings macro instead. - * \return The static instance - * \sa sharedSettings - */ - // cppcheck-suppress uninitMemberVarPrivate - O_SETTINGS(SharedSettings, "/home/root/.config/Eeems/shared.conf") - /*! - * \property version - * \brief Current version of the settings file - * \sa set_version, versionChanged - */ - /*! - * \fn versionChanged - * \brief If the version number has changed - */ - O_SETTINGS_PROPERTY(int, General, version) - /*! - * \property firstLaunch - * \brief If this is the first time that things have been run - * \sa set_firstLaunch, firstLaunchChanged - */ - /*! - * \fn set_firstLaunch - * \param _arg_firstLaunch - * \brief Change the state of firstLaunch - */ - /*! - * \fn firstLaunchChanged - * \brief If firstLaunch has changed - */ - O_SETTINGS_PROPERTY(bool, General, firstLaunch, true) - /*! - * \property telemetry - * \brief If telemetry reporting is enabled or not - * \sa set_telemetry, telemetryChanged - */ - /*! - * \fn set_telemetry - * \param _arg_telemetry - * \brief Enable or disable telemetry reporting - */ - /*! - * \fn telemetryChanged - * \brief If telemetry reporting has been enabled or disabled - */ - O_SETTINGS_PROPERTY(bool, General, telemetry, false) - /*! - * \property applicationUsage - * \brief If application usage reporting is enabled or not - * \sa set_applicationUsage, applicationUsageChanged - */ - /*! - * \fn set_applicationUsage - * \param _arg_applicationUsage - * \brief Enable or disable application usage reporting - */ - /*! - * \fn applicationUsageChanged - * \brief If application usage reporting has been enabled or disabled - */ - O_SETTINGS_PROPERTY(bool, General, applicationUsage, false) - /*! - * \property crashReport - * \brief If crash reporting is enabled or not - * \sa set_crashReport, crashReportChanged - */ - /*! - * \fn set_crashReport - * \param _arg_crashReport - * \brief Enable or disable crash reporting - */ - /*! - * \fn crashReportChanged - * \brief If crash reporting has been enabled or disabled - */ - O_SETTINGS_PROPERTY(bool, General, crashReport, true) - /*! - * \property lockOnSuspend - * \brief If the device should lock on suspend or not - * \sa set_lockOnSuspend, lockOnSuspendChanged - */ - /*! - * \fn set_lockOnSuspend - * \param _arg_lockOnSuspend - * \brief Enable or disable locking on suspend - */ - /*! - * \fn lockOnSuspendChanged - * \brief If lock on suspend has been enabled or disabled - */ - O_SETTINGS_PROPERTY(bool, General, lockOnSuspend, true) - /*! - * \property autoSleep - * \brief How long without activity before the device should suspend - * \sa set_autoSleep, autoSleepChanged - */ - /*! - * \fn set_autoSleep - * \param _arg_autoSleep - * \brief Change autoSleep - */ - /*! - * \fn autoSleepChanged - * \brief If autoSleep has been changed - */ - O_SETTINGS_PROPERTY(int, General, autoSleep, 5) - /*! - * \property autoLock - * \brief How long without activity before the device should suspend - * \sa set_autoLock, autoLockChanged - */ - /*! - * \fn set_autoLock - * \param _arg_autoLock - * \brief Change autoLock - */ - /*! - * \fn autoLockChanged - * \brief If autoLock has been changed - */ - O_SETTINGS_PROPERTY(int, General, autoLock, 5) - /*! - * \property pin - * \brief The lockscreen pin - * \sa set_pin, pinChanged - */ - /*! - * \fn set_pin - * \param _arg_pin - * \brief Change lockscreen pin - */ - /*! - * \fn has_pin - * \brief Change lockscreen pin - * \return If the lockscreen pin is set - */ - /*! - * \fn pinChanged - * \brief If the lockscreen pin has been changed - */ - O_SETTINGS_PROPERTY(QString, Lockscreen, pin) - /*! - * \property onLogin - * \brief The lockscreen onLogin - * \sa set_onLogin, onLoginChanged - */ - /*! - * \fn set_onLogin - * \param _arg_onLogin - * \brief Change lockscreen onLogin - */ - /*! - * \fn has_onLogin - * \brief If lockscreen onLogin has been set - * \return If the lockscreen onLogin is set - */ - /*! - * \fn onLoginChanged - * \brief If the lockscreen onLogin has been changed - */ - O_SETTINGS_PROPERTY(QString, Lockscreen, onLogin) - /*! - * \property onFailedLogin - * \brief The lockscreen onFailedLogin - * \sa set_onFailedLogin, onFailedLoginChanged - */ - /*! - * \fn set_onFailedLogin - * \param _arg_onFailedLogin - * \brief Change lockscreen onFailedLogin - */ - /*! - * \fn has_onFailedLogin - * \brief If lockscreen onFailedLogin has been set - * \return If the lockscreen onFailedLogin is set - */ - /*! - * \fn onFailedLoginChanged - * \brief If the lockscreen onFailedLogin has been changed - */ - O_SETTINGS_PROPERTY(QString, Lockscreen, onFailedLogin) - - private: - ~SharedSettings(); - }; } /*! @} */ diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index 0eb1f587c..d0645d2d7 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -23,6 +23,7 @@ DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs depr SOURCES += \ applications.cpp \ debug.cpp \ + devicesettings.cpp \ event_device.cpp \ eventfilter.cpp \ json.cpp \ @@ -31,14 +32,17 @@ SOURCES += \ oxideqml.cpp \ power.cpp \ settingsfile.cpp \ + sharedsettings.cpp \ slothandler.cpp \ sysobject.cpp \ - signalhandler.cpp + signalhandler.cpp \ + xochitlsettings.cpp HEADERS += \ applications.h \ dbus.h \ debug.h \ + devicesettings.h \ event_device.h \ eventfilter.h \ liboxide_global.h \ @@ -49,9 +53,11 @@ HEADERS += \ power.h \ json.h \ settingsfile.h \ + sharedsettings.h \ slothandler.h \ sysobject.h \ - signalhandler.h + signalhandler.h \ + xochitlsettings.h PRECOMPILED_HEADER = \ liboxide_stable.h diff --git a/shared/liboxide/oxide_sentry.cpp b/shared/liboxide/oxide_sentry.cpp index 8aaaa2abe..5cbf7976a 100644 --- a/shared/liboxide/oxide_sentry.cpp +++ b/shared/liboxide/oxide_sentry.cpp @@ -1,5 +1,5 @@ #include "oxide_sentry.h" -#include "liboxide.h" +#include "sharedsettings.h" #include #include @@ -23,6 +23,8 @@ std::string readFile(const std::string& path){ buffer << t.rdbuf(); return buffer.str(); } + +#include "devicesettings.h" #endif static void* invalid_mem = (void *)1; diff --git a/shared/liboxide/settingsfile.h b/shared/liboxide/settingsfile.h index c32c94d69..5de0183df 100644 --- a/shared/liboxide/settingsfile.h +++ b/shared/liboxide/settingsfile.h @@ -6,6 +6,7 @@ #pragma once #include "liboxide_global.h" +#include "debug.h" #include #include diff --git a/shared/liboxide/sharedsettings.cpp b/shared/liboxide/sharedsettings.cpp new file mode 100644 index 000000000..e98eda536 --- /dev/null +++ b/shared/liboxide/sharedsettings.cpp @@ -0,0 +1,16 @@ +#include "sharedsettings.h" + +namespace Oxide{ + SharedSettings::~SharedSettings(){} + O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, version) + O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, firstLaunch, true) + O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, telemetry, false) + O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, applicationUsage, false) + O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, crashReport, true) + O_SETTINGS_PROPERTY_BODY(SharedSettings, bool, General, lockOnSuspend, true) + O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoSleep, 5) + O_SETTINGS_PROPERTY_BODY(SharedSettings, int, General, autoLock, 5) + O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, pin) + O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onLogin) + O_SETTINGS_PROPERTY_BODY(SharedSettings, QString, Lockscreen, onFailedLogin) +} diff --git a/shared/liboxide/sharedsettings.h b/shared/liboxide/sharedsettings.h new file mode 100644 index 000000000..f1f4d4454 --- /dev/null +++ b/shared/liboxide/sharedsettings.h @@ -0,0 +1,212 @@ +/*! + * \addtogroup Oxide + * \brief The shared settings class + * @{ + * \file + */ +#pragma once +#include "liboxide_global.h" +#include "settingsfile.h" + +/*! + * \def sharedSettings() + * \brief Get the Oxide::SharedSettings instance + */ +#define sharedSettings Oxide::SharedSettings::instance() + +namespace Oxide{ + /*! + * \brief Shared settings for Oxide + */ + class LIBOXIDE_EXPORT SharedSettings : public SettingsFile { + Q_OBJECT + /*! + * \fn instance + * \brief Get the static instance of this class. You should use the sharedSettings macro instead. + * \return The static instance + * \sa sharedSettings + */ + // cppcheck-suppress uninitMemberVarPrivate + O_SETTINGS(SharedSettings, "/home/root/.config/Eeems/shared.conf") + /*! + * \property version + * \brief Current version of the settings file + * \sa set_version, versionChanged + */ + /*! + * \fn versionChanged + * \brief If the version number has changed + */ + O_SETTINGS_PROPERTY(int, General, version) + /*! + * \property firstLaunch + * \brief If this is the first time that things have been run + * \sa set_firstLaunch, firstLaunchChanged + */ + /*! + * \fn set_firstLaunch + * \param _arg_firstLaunch + * \brief Change the state of firstLaunch + */ + /*! + * \fn firstLaunchChanged + * \brief If firstLaunch has changed + */ + O_SETTINGS_PROPERTY(bool, General, firstLaunch, true) + /*! + * \property telemetry + * \brief If telemetry reporting is enabled or not + * \sa set_telemetry, telemetryChanged + */ + /*! + * \fn set_telemetry + * \param _arg_telemetry + * \brief Enable or disable telemetry reporting + */ + /*! + * \fn telemetryChanged + * \brief If telemetry reporting has been enabled or disabled + */ + O_SETTINGS_PROPERTY(bool, General, telemetry, false) + /*! + * \property applicationUsage + * \brief If application usage reporting is enabled or not + * \sa set_applicationUsage, applicationUsageChanged + */ + /*! + * \fn set_applicationUsage + * \param _arg_applicationUsage + * \brief Enable or disable application usage reporting + */ + /*! + * \fn applicationUsageChanged + * \brief If application usage reporting has been enabled or disabled + */ + O_SETTINGS_PROPERTY(bool, General, applicationUsage, false) + /*! + * \property crashReport + * \brief If crash reporting is enabled or not + * \sa set_crashReport, crashReportChanged + */ + /*! + * \fn set_crashReport + * \param _arg_crashReport + * \brief Enable or disable crash reporting + */ + /*! + * \fn crashReportChanged + * \brief If crash reporting has been enabled or disabled + */ + O_SETTINGS_PROPERTY(bool, General, crashReport, true) + /*! + * \property lockOnSuspend + * \brief If the device should lock on suspend or not + * \sa set_lockOnSuspend, lockOnSuspendChanged + */ + /*! + * \fn set_lockOnSuspend + * \param _arg_lockOnSuspend + * \brief Enable or disable locking on suspend + */ + /*! + * \fn lockOnSuspendChanged + * \brief If lock on suspend has been enabled or disabled + */ + O_SETTINGS_PROPERTY(bool, General, lockOnSuspend, true) + /*! + * \property autoSleep + * \brief How long without activity before the device should suspend + * \sa set_autoSleep, autoSleepChanged + */ + /*! + * \fn set_autoSleep + * \param _arg_autoSleep + * \brief Change autoSleep + */ + /*! + * \fn autoSleepChanged + * \brief If autoSleep has been changed + */ + O_SETTINGS_PROPERTY(int, General, autoSleep, 5) + /*! + * \property autoLock + * \brief How long without activity before the device should suspend + * \sa set_autoLock, autoLockChanged + */ + /*! + * \fn set_autoLock + * \param _arg_autoLock + * \brief Change autoLock + */ + /*! + * \fn autoLockChanged + * \brief If autoLock has been changed + */ + O_SETTINGS_PROPERTY(int, General, autoLock, 5) + /*! + * \property pin + * \brief The lockscreen pin + * \sa set_pin, pinChanged + */ + /*! + * \fn set_pin + * \param _arg_pin + * \brief Change lockscreen pin + */ + /*! + * \fn has_pin + * \brief Change lockscreen pin + * \return If the lockscreen pin is set + */ + /*! + * \fn pinChanged + * \brief If the lockscreen pin has been changed + */ + O_SETTINGS_PROPERTY(QString, Lockscreen, pin) + /*! + * \property onLogin + * \brief The lockscreen onLogin + * \sa set_onLogin, onLoginChanged + */ + /*! + * \fn set_onLogin + * \param _arg_onLogin + * \brief Change lockscreen onLogin + */ + /*! + * \fn has_onLogin + * \brief If lockscreen onLogin has been set + * \return If the lockscreen onLogin is set + */ + /*! + * \fn onLoginChanged + * \brief If the lockscreen onLogin has been changed + */ + O_SETTINGS_PROPERTY(QString, Lockscreen, onLogin) + /*! + * \property onFailedLogin + * \brief The lockscreen onFailedLogin + * \sa set_onFailedLogin, onFailedLoginChanged + */ + /*! + * \fn set_onFailedLogin + * \param _arg_onFailedLogin + * \brief Change lockscreen onFailedLogin + */ + /*! + * \fn has_onFailedLogin + * \brief If lockscreen onFailedLogin has been set + * \return If the lockscreen onFailedLogin is set + */ + /*! + * \fn onFailedLoginChanged + * \brief If the lockscreen onFailedLogin has been changed + */ + O_SETTINGS_PROPERTY(QString, Lockscreen, onFailedLogin) + + private: + ~SharedSettings(); + }; +} + +/*! @} */ diff --git a/shared/liboxide/xochitlsettings.cpp b/shared/liboxide/xochitlsettings.cpp new file mode 100644 index 000000000..05b05e388 --- /dev/null +++ b/shared/liboxide/xochitlsettings.cpp @@ -0,0 +1,41 @@ +#include "xochitlsettings.h" + +using namespace Oxide; + +namespace Oxide{ + WifiNetworks XochitlSettings::wifinetworks(){ + beginGroup("wifinetworks"); + QMap wifinetworks; + for(const QString& key : allKeys()){ + QVariantMap network = value(key).toMap(); + wifinetworks[key] = network; + } + endGroup(); + return wifinetworks; + } + void XochitlSettings::setWifinetworks(const WifiNetworks& wifinetworks){ + beginGroup("wifinetworks"); + for(const QString& key : wifinetworks.keys()){ + setValue(key, wifinetworks.value(key)); + } + endGroup(); + sync(); + } + QVariantMap XochitlSettings::getWifiNetwork(const QString& name){ + beginGroup("wifinetworks"); + QVariantMap network = value(name).toMap(); + endGroup(); + return network; + } + void XochitlSettings::setWifiNetwork(const QString& name, QVariantMap properties){ + beginGroup("wifinetworks"); + setValue(name, properties); + endGroup(); + sync(); + } + void XochitlSettings::resetWifinetworks(){} + XochitlSettings::~XochitlSettings(){} + O_SETTINGS_PROPERTY_BODY(XochitlSettings, QString, General, passcode) + O_SETTINGS_PROPERTY_BODY(XochitlSettings, bool, General, wifion) +} +#include "moc_xochitlsettings.cpp" diff --git a/shared/liboxide/xochitlsettings.h b/shared/liboxide/xochitlsettings.h new file mode 100644 index 000000000..0f946b25e --- /dev/null +++ b/shared/liboxide/xochitlsettings.h @@ -0,0 +1,106 @@ +/*! + * \addtogroup Oxide + * \brief The xochitl setttings class + * @{ + * \file + */ +#pragma once +#include "liboxide_global.h" +#include "settingsfile.h" + +/*! + * \def xochitlSettings() + * \brief Get the Oxide::XochitlSettings instance + */ +#define xochitlSettings Oxide::XochitlSettings::instance() +/*! + * \brief Wifi Network definition + */ +typedef QMap WifiNetworks; +Q_DECLARE_METATYPE(WifiNetworks); + +namespace Oxide{ + /*! + * \brief Manage Xochitl settings + */ + class LIBOXIDE_EXPORT XochitlSettings : public SettingsFile { + Q_OBJECT + /*! + * \fn instance + * \brief Get the static instance of this class. You should use the xochitlSettings macro instead. + * \return The static instance + * \sa xochitlSettings + */ + // cppcheck-suppress uninitMemberVarPrivate + // cppcheck-suppress unusedFunction + O_SETTINGS(XochitlSettings, "/home/root/.config/remarkable/xochitl.conf") + /*! + * \property passcode + * \brief The passcode used to unlock the device + * \sa set_passcode, passcodeChanged + */ + /*! + * \fn set_passcode + * \param _arg_passcode The passcode used to unlock the device + * \brief Set the passcode used to unlock the device + */ + /*! + * \fn passcodeChanged + * \brief The passcode used to unlock the device has changed + */ + O_SETTINGS_PROPERTY(QString, General, passcode) + /*! + * \property wifion + * \brief If wifi is on or off + * \sa set_wifion, wifionChanged + */ + /*! + * \fn set_wifion + * \param _arg_wifion If wifi should be on or off + * \brief Turn wifi on or off + */ + /*! + * \fn wifionChanged + * \brief Wifi has been turned on or off + */ + O_SETTINGS_PROPERTY(bool, General, wifion) + /*! + * \property XochitlSettings::wifinetworks + * \brief List of wifi networks + * \sa setWifinetworks, wifinetworksChanged + */ + Q_PROPERTY(WifiNetworks wifinetworks MEMBER m_wifinetworks READ wifinetworks WRITE setWifinetworks RESET resetWifinetworks NOTIFY wifinetworksChanged) + + public: + WifiNetworks wifinetworks(); + /*! + * \brief Set the list of wifi networks + * \param wifinetworks List of wifi networks to replace with + */ + void setWifinetworks(const WifiNetworks& wifinetworks); + /*! + * \brief Get a specific wifi network + * \param name SSID of the wifi network + * \return The wifi network properties + */ + QVariantMap getWifiNetwork(const QString& name); + /*! + * \brief Set the properties for a specific wifi network + * \param name SSID of the wifi network + * \param properties The wifi network properties + */ + void setWifiNetwork(const QString& name, QVariantMap properties); + void resetWifinetworks(); + + signals: + /*! + * \brief The contents of the wifi network list has changed + */ + void wifinetworksChanged(WifiNetworks); + + private: + ~XochitlSettings(); + WifiNetworks m_wifinetworks; + }; +} +/*! @} */ From 45747b38f2236bc0a6f3d3a36fd4a3705ce26cf6 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 16 Jan 2024 01:41:01 -0700 Subject: [PATCH 54/87] Fix thread logic --- applications/system-service/keyboarddevice.cpp | 1 - applications/system-service/keyboardhandler.cpp | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/applications/system-service/keyboarddevice.cpp b/applications/system-service/keyboarddevice.cpp index 729eda738..f77fe671b 100644 --- a/applications/system-service/keyboarddevice.cpp +++ b/applications/system-service/keyboarddevice.cpp @@ -7,7 +7,6 @@ KeyboardDevice::KeyboardDevice(QThread* handler, event_device device) device(device), sys("/sys/class/input/" + devName() + "/device/") { - moveToThread(handler); _name = sys.strProperty("name").c_str(); device.lock(); notifier = new QSocketNotifier(device.fd, QSocketNotifier::Read, this); diff --git a/applications/system-service/keyboardhandler.cpp b/applications/system-service/keyboardhandler.cpp index 9a5bfa947..5f25cc82a 100644 --- a/applications/system-service/keyboardhandler.cpp +++ b/applications/system-service/keyboardhandler.cpp @@ -1,6 +1,4 @@ #include "keyboardhandler.h" -#include "eventlistener.h" -#include "buttonhandler.h" #include #include @@ -12,6 +10,7 @@ KeyboardHandler* KeyboardHandler::init(){ return instance; } instance = new KeyboardHandler(); + instance->moveToThread(instance); instance->start(); return instance; } @@ -662,7 +661,6 @@ void KeyboardHandler::reloadDevices(){ } if(!hasDevice(device) && device.fd != -1){ auto keyboard = new KeyboardDevice(this, device); - keyboard->moveToThread(this); O_DEBUG(keyboard->name() << "added"); devices.append(keyboard); keyboard->readEvents(); From 6ed9d5e3c8ada04ed05b06f0d1610094fc5ff562 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 16 Jan 2024 03:12:44 -0700 Subject: [PATCH 55/87] Automate version number in meta.h --- shared/liboxide/liboxide.pro | 4 +++- shared/liboxide/meta.h | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index d0645d2d7..8589c42cb 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -78,9 +78,12 @@ DBUS_INTERFACES += \ LIBS += -lsystemd +include(../../qmake/common.pri) + liboxide_liboxide_h.target = include/liboxide/liboxide.h liboxide_liboxide_h.commands = \ mkdir -p include/liboxide && \ + sed -i \'s/define OXIDE_VERSION .*/define OXIDE_VERSION \"$$VERSION\"/\' $$_PRO_FILE_PWD_/meta.h && \ echo $$HEADERS | xargs -rn1 | xargs -rI {} cp $$PWD/{} include/liboxide/ && \ mv include/liboxide/oxide_sentry.h include/liboxide/sentry.h && \ echo $$DBUS_INTERFACES | xargs -rn1 | xargs -rI {} basename \"{}\" .xml | xargs -rI {} cp $$OUT_PWD/\"{}\"_interface.h include/liboxide/ @@ -110,7 +113,6 @@ PRE_TARGETDEPS += $$clean_headers.target POST_TARGETDEPS += $$liboxide_liboxide_h.target $$liboxide_h.target QMAKE_CLEAN += $$liboxide_h.target include/liboxide/*.h -include(../../qmake/common.pri) TARGET = oxide target.path = /opt/lib INSTALLS += target diff --git a/shared/liboxide/meta.h b/shared/liboxide/meta.h index f119fca87..1310882f5 100644 --- a/shared/liboxide/meta.h +++ b/shared/liboxide/meta.h @@ -27,10 +27,15 @@ */ #define OXIDE_SERVICE_PATH "/codes/eeems/oxide1" /*! - * \def OXIDE_INTERFACE_VERSION + * \def OXIDE_VERSION * \brief Version of Tarnish and liboxide */ -#define OXIDE_INTERFACE_VERSION "2.7.0" +#define OXIDE_VERSION "2.8" +/*! + * \def OXIDE_INTERFACE_VERSION + * \brief Version of Tarnish and liboxide for dbus + */ +#define OXIDE_INTERFACE_VERSION OXIDE_VERSION ".0" /*! * \def OXIDE_GENERAL_INTERFACE * \brief DBus service for the general API From 0905934acef1a970c07ac5456bca6d95fe1034df Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 16 Jan 2024 18:40:33 -0700 Subject: [PATCH 56/87] Rework build logic to allow building on amd64 --- .../desktop-file-edit/desktop-file-edit.pro | 3 - .../desktop-file-install.pro | 3 - .../desktop-file-validate.pro | 3 - applications/gio/gio.pro | 3 - applications/inject_evdev/inject_evdev.pro | 3 - applications/launcher/controller.h | 2 +- applications/launcher/launcher.pro | 3 - applications/launcher/wifinetworklist.h | 2 +- applications/lockscreen/lockscreen.pro | 3 - applications/notify-send/notify-send.pro | 3 - applications/process-manager/controller.h | 10 ++- .../process-manager/process-manager.pro | 5 +- applications/process-manager/tasklist.h | 3 +- .../screenshot-tool/screenshot-tool.pro | 5 +- applications/screenshot-viewer/controller.h | 1 - .../screenshot-viewer/screenshot-viewer.pro | 3 - .../settings-manager/settings-manager.pro | 3 - applications/system-service/application.cpp | 1 - applications/system-service/powerapi.h | 1 - applications/system-service/screenapi.cpp | 2 + applications/system-service/screenapi.h | 2 - .../system-service/system-service.pro | 3 - applications/system-service/tarnish_stable.h | 1 - .../system-service/wpa_supplicant.cpp | 2 +- applications/system-service/wpa_supplicant.h | 2 +- applications/task-switcher/controller.h | 1 - applications/task-switcher/corrupt_stable.h | 1 - applications/task-switcher/task-switcher.pro | 3 - .../update-desktop-database.pro | 3 - .../xdg-desktop-icon/xdg-desktop-icon.pro | 3 - .../xdg-desktop-menu/xdg-desktop-menu.pro | 3 - .../xdg-icon-resource/xdg-icon-resource.pro | 3 - applications/xdg-open/xdg-open.pro | 3 - applications/xdg-settings/xdg-settings.pro | 3 - qmake/common.pri | 10 ++- qmake/epaper.pri | 7 +- qmake/liboxide.pri | 1 + shared/epaper/epaper.pro | 5 ++ shared/epaper/epframebuffer.h | 16 ++--- shared/liboxide/epaper.h | 68 +++++++++++++++++++ shared/liboxide/liboxide.h | 4 +- shared/liboxide/liboxide.pro | 11 +-- shared/sentry/sentry.pro | 3 + shared/shared.pro | 15 ++-- 44 files changed, 132 insertions(+), 103 deletions(-) create mode 100644 shared/liboxide/epaper.h diff --git a/applications/desktop-file-edit/desktop-file-edit.pro b/applications/desktop-file-edit/desktop-file-edit.pro index 54233adb1..789d8c89c 100644 --- a/applications/desktop-file-edit/desktop-file-edit.pro +++ b/applications/desktop-file-edit/desktop-file-edit.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ edit.cpp \ main.cpp diff --git a/applications/desktop-file-install/desktop-file-install.pro b/applications/desktop-file-install/desktop-file-install.pro index 68e94c6d0..a845ea36d 100644 --- a/applications/desktop-file-install/desktop-file-install.pro +++ b/applications/desktop-file-install/desktop-file-install.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ ../desktop-file-edit/edit.cpp \ main.cpp diff --git a/applications/desktop-file-validate/desktop-file-validate.pro b/applications/desktop-file-validate/desktop-file-validate.pro index 982f7644d..02e37b0f5 100644 --- a/applications/desktop-file-validate/desktop-file-validate.pro +++ b/applications/desktop-file-validate/desktop-file-validate.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/gio/gio.pro b/applications/gio/gio.pro index 84b25a9a8..bca4aea2e 100644 --- a/applications/gio/gio.pro +++ b/applications/gio/gio.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ common.cpp \ main.cpp diff --git a/applications/inject_evdev/inject_evdev.pro b/applications/inject_evdev/inject_evdev.pro index e542401f0..1fc2cd40b 100644 --- a/applications/inject_evdev/inject_evdev.pro +++ b/applications/inject_evdev/inject_evdev.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/launcher/controller.h b/applications/launcher/controller.h index ba4ef43d8..510d38585 100644 --- a/applications/launcher/controller.h +++ b/applications/launcher/controller.h @@ -122,7 +122,7 @@ class Controller : public QObject networks->setAPI(wifiApi); auto state = wifiApi->state(); m_wifion = state != WifiState::WifiOff && state != WifiState::WifiUnknown; - QTimer::singleShot(1000, [=](){ + QTimer::singleShot(1000, [this](){ // Get initial values when UI is ready batteryLevelChanged(powerApi->batteryLevel()); batteryStateChanged(powerApi->batteryState()); diff --git a/applications/launcher/launcher.pro b/applications/launcher/launcher.pro index dbfba87d8..4162fc0ce 100644 --- a/applications/launcher/launcher.pro +++ b/applications/launcher/launcher.pro @@ -7,9 +7,6 @@ CONFIG += qml_debug CONFIG += qtquickcompiler CONFIG += precompile_header -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp \ controller.cpp \ diff --git a/applications/launcher/wifinetworklist.h b/applications/launcher/wifinetworklist.h index 5eb3fbb5d..ca37e0cd6 100644 --- a/applications/launcher/wifinetworklist.h +++ b/applications/launcher/wifinetworklist.h @@ -326,7 +326,7 @@ class WifiNetworkList : public QAbstractListModel for(auto network : networks){ network->setAPI(api); } - connect(api, &Wifi::scanningChanged, this, [=](bool scanning){ + connect(api, &Wifi::scanningChanged, this, [this](bool scanning){ emit scanningChanged(scanning); }); } diff --git a/applications/lockscreen/lockscreen.pro b/applications/lockscreen/lockscreen.pro index a9c1d580d..2cdea9267 100644 --- a/applications/lockscreen/lockscreen.pro +++ b/applications/lockscreen/lockscreen.pro @@ -6,9 +6,6 @@ CONFIG += c++11 CONFIG += qml_debug CONFIG += qtquickcompiler -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/notify-send/notify-send.pro b/applications/notify-send/notify-send.pro index 728af10b0..84dcac16f 100644 --- a/applications/notify-send/notify-send.pro +++ b/applications/notify-send/notify-send.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/process-manager/controller.h b/applications/process-manager/controller.h index 10575fb59..52ce846fd 100755 --- a/applications/process-manager/controller.h +++ b/applications/process-manager/controller.h @@ -16,7 +16,15 @@ class Controller : public QObject Q_PROPERTY(QString sortBy READ sortBy WRITE sortBy NOTIFY sortByChanged) public: int protectPid; - explicit Controller(QQmlApplicationEngine* engine) : QObject(nullptr), mutex(QMutex::NonRecursive), _engine(engine){ + explicit Controller(QQmlApplicationEngine* engine) + : QObject(nullptr), +#if QT_DEPRECATED_SINCE(5,15) + mutex(QMutex::NonRecursive), +#else + mutex(), +#endif + _engine(engine) + { m_tasks = new TaskList(); connect(m_tasks, &TaskList::sortByChanged, this, &Controller::sortByChanged); emit tasksChanged(m_tasks); diff --git a/applications/process-manager/process-manager.pro b/applications/process-manager/process-manager.pro index d66d9dbd3..a0b1c9fc5 100755 --- a/applications/process-manager/process-manager.pro +++ b/applications/process-manager/process-manager.pro @@ -3,10 +3,7 @@ QT += dbus CONFIG += c++11 CONFIG += qtquickcompiler -CONFIG += precompile_header - -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +CONFIG += precompile_header# disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp diff --git a/applications/process-manager/tasklist.h b/applications/process-manager/tasklist.h index 9b2e184c1..40fe788e5 100644 --- a/applications/process-manager/tasklist.h +++ b/applications/process-manager/tasklist.h @@ -69,9 +69,8 @@ class TaskList : public QAbstractListModel } void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override{ Q_UNUSED(column) - Q_UNUSED(order) emit layoutAboutToBeChanged(); - std::sort(taskItems.begin(), taskItems.end(), [=](TaskItem* a, TaskItem* b) -> bool { + std::sort(taskItems.begin(), taskItems.end(), [this, order](TaskItem* a, TaskItem* b) -> bool { if(order == Qt::DescendingOrder){ auto temp = a; a = b; diff --git a/applications/screenshot-tool/screenshot-tool.pro b/applications/screenshot-tool/screenshot-tool.pro index c05d80412..a50d25589 100644 --- a/applications/screenshot-tool/screenshot-tool.pro +++ b/applications/screenshot-tool/screenshot-tool.pro @@ -2,10 +2,7 @@ QT -= gui QT += dbus CONFIG += c++11 console -CONFIG -= app_bundle - -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +CONFIG -= app_bundle # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp diff --git a/applications/screenshot-viewer/controller.h b/applications/screenshot-viewer/controller.h index 32d98259a..cbeacb90b 100644 --- a/applications/screenshot-viewer/controller.h +++ b/applications/screenshot-viewer/controller.h @@ -5,7 +5,6 @@ #include #include #include -#include #include "screenshotlist.h" diff --git a/applications/screenshot-viewer/screenshot-viewer.pro b/applications/screenshot-viewer/screenshot-viewer.pro index d7a6b7c72..fb4ce475f 100644 --- a/applications/screenshot-viewer/screenshot-viewer.pro +++ b/applications/screenshot-viewer/screenshot-viewer.pro @@ -7,9 +7,6 @@ CONFIG += qml_debug CONFIG += qtquickcompiler CONFIG += precompile_header -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/settings-manager/settings-manager.pro b/applications/settings-manager/settings-manager.pro index 77234e57a..b4b33bce2 100644 --- a/applications/settings-manager/settings-manager.pro +++ b/applications/settings-manager/settings-manager.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index 6da36e8f3..622bc9148 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -14,7 +14,6 @@ #include "screenapi.h" #include "buttonhandler.h" - using namespace Oxide::Applications; const event_device touchScreen(deviceSettings.getTouchDevicePath(), O_WRONLY); diff --git a/applications/system-service/powerapi.h b/applications/system-service/powerapi.h index 268f64387..a11722476 100644 --- a/applications/system-service/powerapi.h +++ b/applications/system-service/powerapi.h @@ -16,7 +16,6 @@ class PowerAPI : public APIBase { Q_OBJECT - Q_CLASSINFO("Version", OXIDE_INTERFACE_VERSION) Q_CLASSINFO("D-Bus Interface", OXIDE_POWER_INTERFACE) Q_PROPERTY(int state READ state WRITE setState NOTIFY stateChanged) Q_PROPERTY(int batteryState READ batteryState NOTIFY batteryStateChanged) diff --git a/applications/system-service/screenapi.cpp b/applications/system-service/screenapi.cpp index c6b18d34b..5cfaab148 100644 --- a/applications/system-service/screenapi.cpp +++ b/applications/system-service/screenapi.cpp @@ -2,6 +2,8 @@ #include "notificationapi.h" #include "systemapi.h" +#include + QDBusObjectPath ScreenAPI::screenshot(){ if(!hasPermission("screen")){ return QDBusObjectPath("/"); diff --git a/applications/system-service/screenapi.h b/applications/system-service/screenapi.h index fd14d96b1..ac25b0653 100644 --- a/applications/system-service/screenapi.h +++ b/applications/system-service/screenapi.h @@ -12,11 +12,9 @@ #include #include #include -#include #include #include "apibase.h" -#include "mxcfb.h" #include "screenshot.h" #define DISPLAYWIDTH 1404 diff --git a/applications/system-service/system-service.pro b/applications/system-service/system-service.pro index f68e1f552..f8f7fc355 100644 --- a/applications/system-service/system-service.pro +++ b/applications/system-service/system-service.pro @@ -6,9 +6,6 @@ CONFIG += console CONFIG -= app_bundle CONFIG += precompile_header -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - QMAKE_CFLAGS += -std=c99 SOURCES += \ diff --git a/applications/system-service/tarnish_stable.h b/applications/system-service/tarnish_stable.h index 872a6bc80..056b4f721 100644 --- a/applications/system-service/tarnish_stable.h +++ b/applications/system-service/tarnish_stable.h @@ -1,7 +1,6 @@ #if defined __cplusplus #include #include -#include #include #include #include diff --git a/applications/system-service/wpa_supplicant.cpp b/applications/system-service/wpa_supplicant.cpp index f5b5bc495..30b79d9dc 100644 --- a/applications/system-service/wpa_supplicant.cpp +++ b/applications/system-service/wpa_supplicant.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -N -p wpa_supplicant.h:wpa_supplicant.cpp fi.w1.wpa_supplicant1.xml * - * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2022 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/applications/system-service/wpa_supplicant.h b/applications/system-service/wpa_supplicant.h index 5bb12e449..852dd0dd7 100644 --- a/applications/system-service/wpa_supplicant.h +++ b/applications/system-service/wpa_supplicant.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -N -p wpa_supplicant.h:wpa_supplicant.cpp fi.w1.wpa_supplicant1.xml * - * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2022 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/applications/task-switcher/controller.h b/applications/task-switcher/controller.h index 41c995a4f..ed4dc5990 100644 --- a/applications/task-switcher/controller.h +++ b/applications/task-switcher/controller.h @@ -7,7 +7,6 @@ #include #include -#include #include #include diff --git a/applications/task-switcher/corrupt_stable.h b/applications/task-switcher/corrupt_stable.h index a22fb4ffd..e36b85be2 100644 --- a/applications/task-switcher/corrupt_stable.h +++ b/applications/task-switcher/corrupt_stable.h @@ -1,6 +1,5 @@ #if defined __cplusplus #include -#include #include #include #include diff --git a/applications/task-switcher/task-switcher.pro b/applications/task-switcher/task-switcher.pro index c24978da2..39f225c57 100644 --- a/applications/task-switcher/task-switcher.pro +++ b/applications/task-switcher/task-switcher.pro @@ -7,9 +7,6 @@ CONFIG += qml_debug CONFIG += qtquickcompiler CONFIG += precompile_header -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ appitem.cpp \ main.cpp diff --git a/applications/update-desktop-database/update-desktop-database.pro b/applications/update-desktop-database/update-desktop-database.pro index 163e292b8..0ce54846e 100644 --- a/applications/update-desktop-database/update-desktop-database.pro +++ b/applications/update-desktop-database/update-desktop-database.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/xdg-desktop-icon/xdg-desktop-icon.pro b/applications/xdg-desktop-icon/xdg-desktop-icon.pro index 09effaa6c..58e0a29bd 100644 --- a/applications/xdg-desktop-icon/xdg-desktop-icon.pro +++ b/applications/xdg-desktop-icon/xdg-desktop-icon.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/xdg-desktop-menu/xdg-desktop-menu.pro b/applications/xdg-desktop-menu/xdg-desktop-menu.pro index ad99b239e..bc55012de 100644 --- a/applications/xdg-desktop-menu/xdg-desktop-menu.pro +++ b/applications/xdg-desktop-menu/xdg-desktop-menu.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/xdg-icon-resource/xdg-icon-resource.pro b/applications/xdg-icon-resource/xdg-icon-resource.pro index b4b5f99a0..64412808b 100644 --- a/applications/xdg-icon-resource/xdg-icon-resource.pro +++ b/applications/xdg-icon-resource/xdg-icon-resource.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/xdg-open/xdg-open.pro b/applications/xdg-open/xdg-open.pro index 46d0b019e..046f0d342 100644 --- a/applications/xdg-open/xdg-open.pro +++ b/applications/xdg-open/xdg-open.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/applications/xdg-settings/xdg-settings.pro b/applications/xdg-settings/xdg-settings.pro index 7edf2ee7e..8d2bd861b 100644 --- a/applications/xdg-settings/xdg-settings.pro +++ b/applications/xdg-settings/xdg-settings.pro @@ -4,9 +4,6 @@ QT += dbus CONFIG += c++11 console CONFIG -= app_bundle -DEFINES += QT_DEPRECATED_WARNINGS -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ main.cpp diff --git a/qmake/common.pri b/qmake/common.pri index 31b0a9b95..9078deb39 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -1,8 +1,14 @@ VERSION = 2.8 -DEFINES += QT_DEPRECATED_WARNINGS +!contains(DEFINES, QT_DEPRECATED_WARNINGS){ + DEFINES += QT_DEPRECATED_WARNINGS +} !contains(DEFINES, QT_DISABLE_DEPRECATED_BEFORE){ - DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x051510 + isEmpty(QT_DISABLE_DEPRECATED_BEFORE){ + DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 + }else{ + DEFINES += QT_DISABLE_DEPRECATED_BEFORE=$${QT_DISABLE_DEPRECATED_BEFORE} + } } CONFIG(debug, debug|release){ LIBS += -lunwind diff --git a/qmake/epaper.pri b/qmake/epaper.pri index e115822eb..3a1784ae0 100644 --- a/qmake/epaper.pri +++ b/qmake/epaper.pri @@ -1,2 +1,5 @@ -LIBS += -L$$OUT_PWD/../../shared/epaper -lqsgepaper -INCLUDEPATH += $$OUT_PWD/../../shared/epaper +linux-oe-g++{ + LIBS += -L$$OUT_PWD/../../shared/epaper -lqsgepaper + INCLUDEPATH += $$OUT_PWD/../../shared/epaper + DEFINES += EPAPER +} diff --git a/qmake/liboxide.pri b/qmake/liboxide.pri index d0e4797ad..439ef57eb 100644 --- a/qmake/liboxide.pri +++ b/qmake/liboxide.pri @@ -6,6 +6,7 @@ contains(DEFINES, LIBOXIDE_PRIVATE){ INCLUDEPATH += $$OUT_PWD/../../shared/liboxide/include QT += network QT += dbus +QT += gui QML_IMPORT_PATH += qrc:/codes.eeems.oxide include(sentry.pri) diff --git a/shared/epaper/epaper.pro b/shared/epaper/epaper.pro index b6f9ab7b1..aadad6f46 100644 --- a/shared/epaper/epaper.pro +++ b/shared/epaper/epaper.pro @@ -1,3 +1,6 @@ +!linux-oe-g++{ + error("epaper is only supported on the reMarkable") +} TEMPLATE = lib QT += core @@ -5,6 +8,8 @@ include(../../qmake/common.pri) VERSION = 1.0 +DISTFILES = epframebuffer.h + TARGET = qsgepaper target.path = /opt/lib INSTALLS += target diff --git a/shared/epaper/epframebuffer.h b/shared/epaper/epframebuffer.h index 868e0ad3c..2b13105eb 100644 --- a/shared/epaper/epframebuffer.h +++ b/shared/epaper/epframebuffer.h @@ -10,17 +10,17 @@ #include #include -#if defined(LIBOXIDE_LIBRARY) -#include "liboxide_global.h" -#ifdef __arm__ -Q_IMPORT_PLUGIN(QsgEpaperPlugin) -#endif +#ifndef DOXYGEN_SHOULD_SKIP_THIS +# if defined(EPFRAMEBUFFER_EXPORT) +# define EPFRAMEBUFFER_EXPORT Q_DECL_EXPORT +# else +# define EPFRAMEBUFFER_EXPORT Q_DECL_IMPORT +# endif #else -#include +# define EPFRAMEBUFFER_EXPORT #endif - -class LIBOXIDE_EXPORT EPFrameBuffer : public QObject +class EPFRAMEBUFFER_EXPORT EPFrameBuffer : public QObject { Q_OBJECT diff --git a/shared/liboxide/epaper.h b/shared/liboxide/epaper.h new file mode 100644 index 000000000..c3f02b1a2 --- /dev/null +++ b/shared/liboxide/epaper.h @@ -0,0 +1,68 @@ +#pragma once + +#if defined(LIBOXIDE_LIBRARY) +#include "liboxide_global.h" +#else +#include +#endif +#ifdef EPAPER +#ifdef __arm__ +Q_IMPORT_PLUGIN(QsgEpaperPlugin) +#endif +#include +#else +#include +#include + +class LIBOXIDE_EXPORT EPFrameBuffer : public QObject{ + Q_OBJECT + +public: + enum WaveformMode { + Initialize = 0, + Mono = 1, + Grayscale = 3, + HighQualityGrayscale = 2, + Highlight = 8 + }; + enum UpdateMode { + PartialUpdate = 0x0, + FullUpdate = 0x1 + }; + static EPFrameBuffer* instance(){ + static EPFrameBuffer* instance; + if(instance == nullptr){ + instance = new EPFrameBuffer(); + } + return instance; + } + static QImage* framebuffer() { return &instance()->m_fb; } + Q_INVOKABLE static void setForceFull(bool force) { instance()->m_forceFull = force; } + static bool isForceFull() { return instance()->m_forceFull; } + int lastUpdateId() const { return m_lastUpdateId; } + void setSuspended(bool suspended) { m_suspended = suspended; } + bool isSuspended() const { + std::lock_guard locker(fbMutex); + return m_suspended; + } + mutable std::mutex fbMutex; + qint64 timeSinceLastUpdate() const{ return QDateTime::currentMSecsSinceEpoch(); } + +public slots: + static void clearScreen(){ instance()->m_fb.fill(Qt::white); } + static void sendUpdate(QRect rect, WaveformMode waveform, UpdateMode mode, bool sync = false){ + Q_UNUSED(rect); + Q_UNUSED(waveform); + Q_UNUSED(mode); + Q_UNUSED(sync); + } + static void waitForLastUpdate(){} + +private: + EPFrameBuffer() : m_fb(1000, 1000, QImage::Format_ARGB32_Premultiplied){} + QImage m_fb; + bool m_forceFull = false; + bool m_suspended = false; + int m_lastUpdateId = 0; +}; +#endif diff --git a/shared/liboxide/liboxide.h b/shared/liboxide/liboxide.h index 184603f4c..27fa19550 100644 --- a/shared/liboxide/liboxide.h +++ b/shared/liboxide/liboxide.h @@ -21,13 +21,11 @@ #include "devicesettings.h" #include "xochitlsettings.h" #include "sharedsettings.h" +#include "epaper.h" #if defined(LIBOXIDE_LIBRARY) #include "oxide_sentry.h" #else #include "sentry.h" -#ifdef __arm__ -Q_IMPORT_PLUGIN(QsgEpaperPlugin) -#endif #endif #include diff --git a/shared/liboxide/liboxide.pro b/shared/liboxide/liboxide.pro index 8589c42cb..05e0b6209 100644 --- a/shared/liboxide/liboxide.pro +++ b/shared/liboxide/liboxide.pro @@ -18,8 +18,6 @@ CONFIG += qmltypes QML_IMPORT_NAME = codes.eeems.oxide QML_IMPORT_MAJOR_VERSION = 2 -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - SOURCES += \ applications.cpp \ debug.cpp \ @@ -43,6 +41,7 @@ HEADERS += \ dbus.h \ debug.h \ devicesettings.h \ + epaper.h \ event_device.h \ eventfilter.h \ liboxide_global.h \ @@ -104,9 +103,11 @@ liboxide_h_install.depends = liboxide_h liboxide_h_install.path = /opt/include/ INSTALLS += liboxide_h_install -epframebuffer_h_install.files = ../epaper/epframebuffer.h -epframebuffer_h_install.path = /opt/include -INSTALLS += epframebuffer_h_install +linux-oe-g++{ + epframebuffer_h_install.files = ../epaper/epframebuffer.h + epframebuffer_h_install.path = /opt/include + INSTALLS += epframebuffer_h_install +} QMAKE_EXTRA_TARGETS += liboxide_liboxide_h liboxide_h clean_headers liboxide_h_install PRE_TARGETDEPS += $$clean_headers.target diff --git a/shared/sentry/sentry.pro b/shared/sentry/sentry.pro index a0b33807f..512a7378b 100644 --- a/shared/sentry/sentry.pro +++ b/shared/sentry/sentry.pro @@ -1,3 +1,6 @@ +!contains(DEFINES, SENTRY){ + error("Not configured to build sentry") +} TEMPLATE = aux PRE_TARGETDEPS += $$OUT_PWD/src/Makefile diff --git a/shared/shared.pro b/shared/shared.pro index cc73d6f77..284b9d039 100644 --- a/shared/shared.pro +++ b/shared/shared.pro @@ -1,9 +1,12 @@ TEMPLATE = subdirs -SUBDIRS = \ - sentry \ - liboxide \ - epaper - -liboxide.depends = sentry epaper +SUBDIRS = liboxide +contains(DEFINES, SENTRY){ + SUBDIRS += sentry + liboxide.depends += sentry +} +linux-oe-g++{ + SUBDIRS += epaper + liboxide.depends += epaper +} INSTALLS += $$SUBDIRS From f5fcbd5f9417f4f401448db09d1bffd035af7d02 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 16 Jan 2024 18:52:07 -0700 Subject: [PATCH 57/87] Fix some qdbus complaints --- applications/system-service/apibase.h | 4 ++++ applications/system-service/notificationapi.h | 1 - applications/system-service/screenapi.h | 2 +- interfaces/screenapi.xml | 5 +++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/applications/system-service/apibase.h b/applications/system-service/apibase.h index bd2013b7f..05c773efd 100644 --- a/applications/system-service/apibase.h +++ b/applications/system-service/apibase.h @@ -10,6 +10,10 @@ #include #include +#ifdef Q_MOC_RUN +#include "../../shared/liboxide/meta.h" +#endif + class APIBase : public QObject, protected QDBusContext { Q_OBJECT diff --git a/applications/system-service/notificationapi.h b/applications/system-service/notificationapi.h index 888ee5e9e..065956480 100644 --- a/applications/system-service/notificationapi.h +++ b/applications/system-service/notificationapi.h @@ -43,7 +43,6 @@ public slots: QDBusObjectPath add(const QString& identifier, const QString& application, const QString& text, const QString& icon, QDBusMessage message); bool take(QString identifier, QDBusMessage message); QList notifications(QDBusMessage message); - void remove(Notification* notification); bool locked(); void lock(); diff --git a/applications/system-service/screenapi.h b/applications/system-service/screenapi.h index ac25b0653..365272ef5 100644 --- a/applications/system-service/screenapi.h +++ b/applications/system-service/screenapi.h @@ -39,7 +39,7 @@ class ScreenAPI : public APIBase { bool enabled(); QList screenshots(); - Q_INVOKABLE bool drawFullscreenImage(QString path, float rotate = 0); + Q_INVOKABLE bool drawFullscreenImage(QString path, double rotate = 0); Q_INVOKABLE QDBusObjectPath screenshot(); QImage copy(); diff --git a/interfaces/screenapi.xml b/interfaces/screenapi.xml index c8db2f025..0ed088ce4 100644 --- a/interfaces/screenapi.xml +++ b/interfaces/screenapi.xml @@ -16,6 +16,11 @@ + + + + + From 3ed1bad7a028861e586e703a50cc05fce39a6ec5 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 16 Jan 2024 19:05:44 -0700 Subject: [PATCH 58/87] Fix build --- applications/system-service/screenapi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/system-service/screenapi.cpp b/applications/system-service/screenapi.cpp index 5cfaab148..abba365e8 100644 --- a/applications/system-service/screenapi.cpp +++ b/applications/system-service/screenapi.cpp @@ -187,7 +187,7 @@ QList ScreenAPI::screenshots(){ return list; } -bool ScreenAPI::drawFullscreenImage(QString path, float rotate) { +bool ScreenAPI::drawFullscreenImage(QString path, double rotate) { if (!hasPermission("screen")) { return false; } From fc924ae96e59538a3e0c774e0891aefce098f04b Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 5 Feb 2024 19:47:20 -0700 Subject: [PATCH 59/87] Add sysfs_preload dependency (#336) * Add sysfs_preload dependency --- .github/workflows/build.yml | 3 +++ package | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c253f2da..815780b40 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,6 +68,9 @@ jobs: with: setup: | set -ex + wget https://github.com/Eeems-Org/sysfs_preload/releases/download/1.0.0/packages.zip -O /tmp/packages.zip + unzip /tmp/packages.zip -d /tmp + opkg install /tmp/rmall/sysfs_preload_1.0.0-1_rmall.ipk echo "src/gz local-rmall file:///opt/tmp/src" > /opt/etc/opkg.conf.d/16-local.conf run: | set -ex diff --git a/package b/package index 6359a0b3a..8b5800c20 100644 --- a/package +++ b/package @@ -24,7 +24,7 @@ build() { oxide() { pkgdesc="Launcher application" section="launchers" - installdepends=("oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver" "reboot-guard") + installdepends=("oxide-utils=$pkgver" "liboxide=$pkgver" "libsentry=$_sentryver" "reboot-guard" "sysfs_preload") replaces=(erode tarnish decay corrupt) conflicts=(erode tarnish decay corrupt) From e32a6c997405b247626f61b27b77f1aea39e1c8d Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 5 Feb 2024 20:24:48 -0700 Subject: [PATCH 60/87] Add keyboard shortcuts (#350) --- web/src/documentation/01_usage.rst | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/web/src/documentation/01_usage.rst b/web/src/documentation/01_usage.rst index 83726a938..845527052 100644 --- a/web/src/documentation/01_usage.rst +++ b/web/src/documentation/01_usage.rst @@ -34,7 +34,11 @@ Press on an application to launch, or return to an application. Long press on it Application Switcher (corrupt) ============================== -* Swipe up from the bottom of the screen to open the application switcher. +* To open the application switcher: + + * Swipe up from the bottom of the screen + * Alt+Tab + * You can select ``Home`` to return to the launcher. * You can select any running application to switch to that application. * You can long press any running application to close that application. @@ -47,11 +51,27 @@ Application Switcher (corrupt) Background Service (tarnish) ============================ -* Press and hold the left button, or swipe from the left edge of the screen to return to the previous application. -* Press and hold the middle button to launch the process manager. +* To return to the previous application: + + * Opt+Backspace + * Press and hold the left button on the rM1. + * Swipe from the left edge of the screen. + +* To launch the process manager: + + * Press and hold the middle button on the rM1. + * Ctrl+Shift+1 + * Press the power button to suspend the device. -* Press and hold the right button, or swipe from the right edge of the screen to take a screenshot. +* To take a screenshot: + + * Press and hold the right button on the rM1. + * Swipe from the right edge of the screen. + * Shift+Opt+S + * Swipe from the top of the screen to enable/disable swipe gestures. +* Opt+L to lock the screen. +* Ctrl+Alt+T to open yaft or fingerterm if installed .. _erode: From dee27c3381336729ecbfa22a5e27882792283203 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 1 May 2024 13:31:40 -0600 Subject: [PATCH 61/87] Update index.rst --- web/src/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/index.rst b/web/src/index.rst index f05118098..cc332743c 100644 --- a/web/src/index.rst +++ b/web/src/index.rst @@ -27,7 +27,7 @@ Install Oxide .. raw:: html

Oxide is available in From 17fd50d7cc0896198e2e826c97335447b588b5ec Mon Sep 17 00:00:00 2001 From: stereo-highway <163424743+stereo-highway@users.noreply.github.com> Date: Thu, 9 May 2024 20:35:05 -0700 Subject: [PATCH 62/87] Fixed memory leak by process->deletelater(); (#353) --- applications/system-service/wlan.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/applications/system-service/wlan.cpp b/applications/system-service/wlan.cpp index db255077f..a3019090c 100644 --- a/applications/system-service/wlan.cpp +++ b/applications/system-service/wlan.cpp @@ -59,6 +59,7 @@ bool Wlan::pingIP(std::string ip, const char* port) { std::string cmd("{ echo -n > /dev/tcp/" + ip.substr(0, ip.length() - 1) + "/" + port + "; } > /dev/null 2>&1"); process->setArguments(QStringList() << "-c" << cmd.c_str()); process->start(); + process->deleteLater(); if(!process->waitForFinished(100)){ process->kill(); return false; From 88a35bdafa9f6782a7f7fdaccfcdb3ddcf8cce1f Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 9 May 2024 21:36:54 -0600 Subject: [PATCH 63/87] Bump version number --- qmake/common.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qmake/common.pri b/qmake/common.pri index 9078deb39..b4f36dad0 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -1,4 +1,4 @@ -VERSION = 2.8 +VERSION = 2.8.1 !contains(DEFINES, QT_DEPRECATED_WARNINGS){ DEFINES += QT_DEPRECATED_WARNINGS From fe74eb8ed3640b642a666026d69ab32ac4ceb333 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Thu, 9 May 2024 22:07:51 -0600 Subject: [PATCH 64/87] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 815780b40..319795048 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -102,7 +102,7 @@ jobs: SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} SENTRY_URL: https://sentry.eeems.codes - name: Setup Sentry CLI - uses: mathieu-bour/setup-sentry-cli@v1 + uses: mathieu-bour/setup-sentry-cli@v2 with: version: latest url: https://sentry.eeems.codes From c05672a5b353b3ea76b952924e2415b65ae16da4 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 21 May 2024 14:17:34 -0600 Subject: [PATCH 65/87] Fix #354 (#355) --- applications/system-service/wpa_supplicant.cpp | 2 +- applications/system-service/wpa_supplicant.h | 2 +- package | 2 ++ qmake/common.pri | 2 +- shared/liboxide/meta.h | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/applications/system-service/wpa_supplicant.cpp b/applications/system-service/wpa_supplicant.cpp index 30b79d9dc..f5b5bc495 100644 --- a/applications/system-service/wpa_supplicant.cpp +++ b/applications/system-service/wpa_supplicant.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -N -p wpa_supplicant.h:wpa_supplicant.cpp fi.w1.wpa_supplicant1.xml * - * qdbusxml2cpp is Copyright (C) 2022 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/applications/system-service/wpa_supplicant.h b/applications/system-service/wpa_supplicant.h index 852dd0dd7..5bb12e449 100644 --- a/applications/system-service/wpa_supplicant.h +++ b/applications/system-service/wpa_supplicant.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -N -p wpa_supplicant.h:wpa_supplicant.cpp fi.w1.wpa_supplicant1.xml * - * qdbusxml2cpp is Copyright (C) 2022 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/package b/package index 8b5800c20..ea416e9b9 100644 --- a/package +++ b/package @@ -18,6 +18,8 @@ sha256sums=(SKIP) build() { find . -name "*.pro" -type f -print0 \ | xargs -r -0 sed -i 's/linux-oe-g++/linux-arm-remarkable-g++/g' + find . -name "*.pri" -type f -print0 \ + | xargs -r -0 sed -i 's/linux-oe-g++/linux-arm-remarkable-g++/g' CMAKE_TOOLCHAIN_FILE="/usr/share/cmake/$CHOST.cmake" make FEATURES=sentry release } diff --git a/qmake/common.pri b/qmake/common.pri index b4f36dad0..b5d623485 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -1,4 +1,4 @@ -VERSION = 2.8.1 +VERSION = 2.8.2 !contains(DEFINES, QT_DEPRECATED_WARNINGS){ DEFINES += QT_DEPRECATED_WARNINGS diff --git a/shared/liboxide/meta.h b/shared/liboxide/meta.h index 1310882f5..1e2038c22 100644 --- a/shared/liboxide/meta.h +++ b/shared/liboxide/meta.h @@ -30,7 +30,7 @@ * \def OXIDE_VERSION * \brief Version of Tarnish and liboxide */ -#define OXIDE_VERSION "2.8" +#define OXIDE_VERSION "2.8.2" /*! * \def OXIDE_INTERFACE_VERSION * \brief Version of Tarnish and liboxide for dbus From 6d90499828514714a7df5326e26a3ce85c59c351 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 21 May 2024 14:54:06 -0600 Subject: [PATCH 66/87] Update actions (#356) * Update actions --- .github/actions/sync-repository/action.yml | 2 +- .github/actions/web/action.yaml | 4 ++-- .github/workflows/build.yml | 14 +++++++------- .github/workflows/publish.yml | 6 +++--- .github/workflows/web.yaml | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/actions/sync-repository/action.yml b/.github/actions/sync-repository/action.yml index 8fc4f4b4d..789c6a6f0 100644 --- a/.github/actions/sync-repository/action.yml +++ b/.github/actions/sync-repository/action.yml @@ -22,7 +22,7 @@ runs: sudo apt-get update -yq echo "syncAptVersion=sshfs-$(apt-cache policy sshfs | grep -oP '(?<=Candidate:\s)(.+)')" >> $GITHUB_ENV - name: Cache Apt packages - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache-apt with: path: ~/.aptcache diff --git a/.github/actions/web/action.yaml b/.github/actions/web/action.yaml index 03f226ea9..005f3448f 100644 --- a/.github/actions/web/action.yaml +++ b/.github/actions/web/action.yaml @@ -4,11 +4,11 @@ runs: using: composite steps: - name: Setup Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: '3.8' - name: Cache Python environment - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache-python with: path: web/.venv diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 319795048..92429186d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,9 +30,9 @@ jobs: name: Build and package runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install toltecmk @@ -41,17 +41,17 @@ jobs: run: make package timeout-minutes: 15 - name: Save packages - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: packages path: release - name: Save packages - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build path: .build/package/build/rmall/src/release - name: Save repo - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: repo path: .build/package/dist/rmall @@ -60,7 +60,7 @@ jobs: runs-on: ubuntu-latest needs: [build] steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 id: download with: name: repo @@ -90,7 +90,7 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: build path: .build diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2721234a3..92c7b2688 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,13 +16,13 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout the Git repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true - name: Build web uses: ./.github/actions/web - name: Upload artifact - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v3 with: path: 'web/dist/' deploy: @@ -38,4 +38,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v1 + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/web.yaml b/.github/workflows/web.yaml index 9f7d37ef4..ef9448ae8 100644 --- a/.github/workflows/web.yaml +++ b/.github/workflows/web.yaml @@ -22,13 +22,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the Git repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true - name: Build web uses: ./.github/actions/web - name: Save web - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: web path: web/dist From da7935dbc611fdec4e1c538d153fce903faf0d47 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Mon, 10 Jun 2024 13:19:11 -0600 Subject: [PATCH 67/87] Change instructions to use launcherctl --- web/src/index.rst | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/web/src/index.rst b/web/src/index.rst index cc332743c..c82761b33 100644 --- a/web/src/index.rst +++ b/web/src/index.rst @@ -38,13 +38,10 @@ Install Oxide

1. ``opkg install oxide`` -2. ``systemctl disable --now xochitl`` -3. If you are installing on a reMarkable 2: ``systemctl enable --now rm2fb`` -4. ``systemctl enable --now tarnish`` +2. ``launcherctl switch-launcher --start oxide`` Uninstall Oxide =============== -1. ``systemctl disable --now tarnish`` -2. ``systemctl enable --now xochitl`` +1. ``launcherctl switch-launcher --start xochitl`` 3. ``opkg remove --force-removal-of-dependent-packages liboxide`` From ea6ad4123861b508131d04e7c119e4f02c470542 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Tue, 25 Jun 2024 23:08:21 -0600 Subject: [PATCH 68/87] Clean up logging (#360) * Clean up logging * Version bump * Remove timezone FAQ --- applications/system-service/apibase.cpp | 6 +- applications/system-service/application.cpp | 130 ++++++------- applications/system-service/appsapi.cpp | 122 ++++++------ applications/system-service/bss.cpp | 6 +- applications/system-service/buttonhandler.cpp | 22 +-- applications/system-service/dbusservice.cpp | 20 +- .../system-service/digitizerhandler.cpp | 16 +- .../system-service/keyboardhandler.cpp | 2 +- applications/system-service/main.cpp | 24 +-- applications/system-service/network.cpp | 10 +- applications/system-service/notification.cpp | 16 +- .../system-service/notificationapi.cpp | 10 +- applications/system-service/powerapi.cpp | 2 +- applications/system-service/screenapi.cpp | 18 +- applications/system-service/screenshot.cpp | 16 +- applications/system-service/systemapi.cpp | 180 ++++++++---------- applications/system-service/wifiapi.cpp | 60 +++--- applications/system-service/wlan.cpp | 55 +++--- qmake/common.pri | 2 +- shared/liboxide/debug.h | 6 + shared/liboxide/meta.h | 2 +- web/src/faq.rst | 14 -- 22 files changed, 344 insertions(+), 395 deletions(-) diff --git a/applications/system-service/apibase.cpp b/applications/system-service/apibase.cpp index 8e71ce3f4..d3b393bac 100644 --- a/applications/system-service/apibase.cpp +++ b/applications/system-service/apibase.cpp @@ -5,7 +5,7 @@ int APIBase::hasPermission(QString permission, const char* sender){ if(getpgid(getpid()) == getSenderPgid()){ return true; } - qDebug() << "Checking permission" << permission << "from" << sender; + O_INFO("Checking permission" << permission << "from" << sender); for(auto name : appsAPI->runningApplicationsNoSecurityCheck().keys()){ auto app = appsAPI->getApplication(name); if(app == nullptr){ @@ -13,11 +13,11 @@ int APIBase::hasPermission(QString permission, const char* sender){ } if(app->processId() == getSenderPgid()){ auto result = app->permissions().contains(permission); - qDebug() << app->name() << result; + O_INFO(app->name() << result); return result; } } - qDebug() << "app not found, permission granted"; + O_INFO("app not found, permission granted"); return true; } diff --git a/applications/system-service/application.cpp b/applications/system-service/application.cpp index 622bc9148..e187376a5 100644 --- a/applications/system-service/application.cpp +++ b/applications/system-service/application.cpp @@ -46,7 +46,7 @@ void Application::launchNoSecurityCheck(){ Q_UNUSED(t); #endif appsAPI->recordPreviousApplication(); - qDebug() << "Launching " << path(); + O_INFO("Launching " << path()); appsAPI->pauseAll(); if(!flags().contains("nosplash")){ showSplashScreen(); @@ -70,15 +70,15 @@ void Application::launchNoSecurityCheck(){ p_stdout_fd = sd_journal_stream_fd(name().toStdString().c_str(), LOG_INFO, 1); if (p_stdout_fd < 0) { errno = -p_stdout_fd; - qDebug() << "Failed to create stdout fd:" << -p_stdout_fd; + O_WARNING("Failed to create stdout fd:" << -p_stdout_fd); }else{ FILE* log = fdopen(p_stdout_fd, "w"); if(!log){ - qDebug() << "Failed to create stdout FILE:" << errno; + O_WARNING("Failed to create stdout FILE:" << errno); close(p_stdout_fd); }else{ p_stdout = new QTextStream(log); - qDebug() << "Opened stdout for " << name(); + O_DEBUG("Opened stdout for " << name()); } } } @@ -86,15 +86,15 @@ void Application::launchNoSecurityCheck(){ p_stderr_fd = sd_journal_stream_fd(name().toStdString().c_str(), LOG_ERR, 1); if (p_stderr_fd < 0) { errno = -p_stderr_fd; - qDebug() << "Failed to create sterr fd:" << -p_stderr_fd; + O_WARNING("Failed to create sterr fd:" << -p_stderr_fd); }else{ FILE* log = fdopen(p_stderr_fd, "w"); if(!log){ - qDebug() << "Failed to create stderr FILE:" << errno; + O_WARNING("Failed to create stderr FILE:" << errno); close(p_stderr_fd); }else{ p_stderr = new QTextStream(log); - qDebug() << "Opened stderr for " << name(); + O_DEBUG("Opened stderr for " << name()); } } } @@ -122,7 +122,7 @@ void Application::pauseNoSecurityCheck(bool startIfNone){ ){ return; } - qDebug() << "Pausing " << path(); + O_INFO("Pausing " << path()); Oxide::Sentry::sentry_transaction("application", "pause", [this, startIfNone](Oxide::Sentry::Transaction* t){ #ifdef SENTRY if(t != nullptr){ @@ -141,7 +141,7 @@ void Application::pauseNoSecurityCheck(bool startIfNone){ emit paused(); emit appsAPI->applicationPaused(qPath()); }); - qDebug() << "Paused " << path(); + O_INFO("Paused " << path()); } void Application::interruptApplication(){ if( @@ -171,22 +171,22 @@ void Application::interruptApplication(){ startSpan("background", "Application is in the background"); return; case Backgroundable: - qDebug() << "Waiting for SIGUSR2 ack"; + O_INFO("Waiting for SIGUSR2 ack"); appsAPI->connectSignals(this, 2); kill(-m_process->processId(), SIGUSR2); timer.restart(); delayUpTo(1000); appsAPI->disconnectSignals(this, 2); if(stateNoSecurityCheck() == Inactive){ - qDebug() << "Application crashed while pausing"; + O_INFO("Application crashed while pausing"); }else if(timer.isValid()){ - qDebug() << "Application took too long to background" << name(); + O_INFO("Application took too long to background" << name()); kill(-m_process->processId(), SIGSTOP); waitForPause(); startSpan("stopped", "Application is stopped"); }else{ m_backgrounded = true; - qDebug() << "SIGUSR2 ack recieved"; + O_INFO("SIGUSR2 ack recieved"); startSpan("background", "Application is in the background"); } break; @@ -233,7 +233,7 @@ void Application::resumeNoSecurityCheck(){ || stateNoSecurityCheck() == InForeground || (type() == Background && stateNoSecurityCheck() == InBackground) ){ - qDebug() << "Can't Resume" << path() << "Already running!"; + O_DEBUG("Can't Resume" << path() << "Already running!"); return; } Oxide::Sentry::sentry_transaction("application", "resume", [this](Oxide::Sentry::Transaction* t){ @@ -245,7 +245,7 @@ void Application::resumeNoSecurityCheck(){ Q_UNUSED(t); #endif appsAPI->recordPreviousApplication(); - qDebug() << "Resuming " << path(); + O_INFO("Resuming " << path()); appsAPI->pauseAll(); if(!flags().contains("nosavescreen") && (type() != Backgroundable || stateNoSecurityCheck() == Paused)){ recallScreen(); @@ -255,7 +255,7 @@ void Application::resumeNoSecurityCheck(){ emit resumed(); emit appsAPI->applicationResumed(qPath()); }); - qDebug() << "Resumed " << path(); + O_INFO("Resumed " << path()); } void Application::uninterruptApplication(){ if( @@ -286,16 +286,16 @@ void Application::uninterruptApplication(){ systemAPI->clearDeviceBuffers(); kill(-m_process->processId(), SIGCONT); } - qDebug() << "Waiting for SIGUSR1 ack"; + O_INFO("Waiting for SIGUSR1 ack"); appsAPI->connectSignals(this, 1); kill(-m_process->processId(), SIGUSR1); delayUpTo(1000); appsAPI->disconnectSignals(this, 1); if(timer.isValid()){ // No need to fall through, we've just assumed it continued - qDebug() << "Warning: application took too long to forground" << name(); + O_INFO("Warning: application took too long to forground" << name()); }else{ - qDebug() << "SIGUSR1 ack recieved"; + O_INFO("SIGUSR1 ack recieved"); } m_backgrounded = false; startSpan("background", "Application is in the background"); @@ -328,11 +328,11 @@ void Application::stopNoSecurityCheck(){ #else Q_UNUSED(t); #endif - qDebug() << "Stopping " << path(); + O_INFO("Stopping " << path()); if(!onStop().isEmpty()){ Oxide::Sentry::sentry_span(t, "onStop", "Run onStop action", [this](){ - qDebug() << "onStop: " << onStop(); - qDebug() << "exit code: " << QProcess::execute(onStop(), QStringList()); + O_INFO("onStop: " << onStop()); + O_INFO("exit code: " << QProcess::execute(onStop(), QStringList())); }); } Application* pausedApplication = nullptr; @@ -469,7 +469,7 @@ void Application::setEnvironment(QVariantMap environment){ for(auto key : environment.keys()){ auto value = environment.value(key, QVariant()); if(!value.isValid()){ - qDebug() << key << " has invalid value: " << value; + O_INFO(key << " has invalid value: " << value); return; } } @@ -537,7 +537,7 @@ void Application::saveScreen(){ return; } Oxide::Sentry::sentry_transaction("application", "saveScreen", [this](Oxide::Sentry::Transaction* t){ - qDebug() << "Saving screen..."; + O_INFO("Saving screen..."); QByteArray bytes; Oxide::Sentry::sentry_span(t, "save", "Save the framebuffer", [&bytes]{ QBuffer buffer(&bytes); @@ -548,11 +548,11 @@ void Application::saveScreen(){ } }); }); - qDebug() << "Compressing data..."; + O_DEBUG("Compressing data..."); Oxide::Sentry::sentry_span(t, "compress", "Compress the framebuffer", [this, bytes]{ m_screenCapture = new QByteArray(qCompress(bytes)); }); - qDebug() << "Screen saved " << m_screenCapture->size() << "bytes"; + O_INFO("Screen saved " << m_screenCapture->size() << "bytes"); }); } void Application::started(){ @@ -560,7 +560,7 @@ void Application::started(){ emit appsAPI->applicationLaunched(qPath()); } void Application::finished(int exitCode){ - qDebug() << "Application" << name() << "exit code" << exitCode; + O_INFO("Application" << name() << "exit code" << exitCode); emit exited(exitCode); appsAPI->resumeIfNone(); emit appsAPI->applicationExited(qPath(), exitCode); @@ -603,13 +603,13 @@ void Application::readyReadStandardOutput(){ void Application::stateChanged(QProcess::ProcessState state){ switch(state){ case QProcess::Starting: - qDebug() << "Application" << name() << "is starting."; + O_INFO("Application" << name() << "is starting."); break; case QProcess::Running: - qDebug() << "Application" << name() << "is running."; + O_INFO("Application" << name() << "is running."); break; case QProcess::NotRunning: - qDebug() << "Application" << name() << "is not running."; + O_INFO("Application" << name() << "is not running."); if(sharedSettings.applicationUsage()){ if(span != nullptr){ Oxide::Sentry::stop_span(span); @@ -624,13 +624,13 @@ void Application::stateChanged(QProcess::ProcessState state){ } break; default: - qDebug() << "Application" << name() << "unknown state" << state; + O_WARNING("Application" << name() << "unknown state" << state); } } void Application::errorOccurred(QProcess::ProcessError error){ switch(error){ case QProcess::FailedToStart: - qDebug() << "Application" << name() << "failed to start."; + O_INFO("Application" << name() << "failed to start."); emit exited(-1); emit appsAPI->applicationExited(qPath(), -1); if(transient()){ @@ -638,20 +638,20 @@ void Application::errorOccurred(QProcess::ProcessError error){ } break; case QProcess::Crashed: - qDebug() << "Application" << name() << "crashed."; + O_INFO("Application" << name() << "crashed."); break; case QProcess::Timedout: - qDebug() << "Application" << name() << "timed out."; + O_INFO("Application" << name() << "timed out."); break; case QProcess::WriteError: - qDebug() << "Application" << name() << "unable to write to stdin."; + O_INFO("Application" << name() << "unable to write to stdin."); break; case QProcess::ReadError: - qDebug() << "Application" << name() << "unable to read from stdout or stderr."; + O_INFO("Application" << name() << "unable to read from stdout or stderr."); break; case QProcess::UnknownError: default: - qDebug() << "Application" << name() << "unknown error."; + O_WARNING("Application" << name() << "unknown error."); } } bool Application::hasPermission(QString permission, const char* sender){ return appsAPI->hasPermission(permission, sender); } @@ -715,7 +715,7 @@ void Application::bind(const QString& source, const QString& target, bool readOn } auto ctarget = target.toStdString(); auto csource = source.toStdString(); - qDebug() << "mount" << source << target; + O_DEBUG("mount" << source << target); if(mount(csource.c_str(), ctarget.c_str(), NULL, MS_BIND, NULL)){ O_WARNING("Failed to create bindmount: " << ::strerror(errno)); return; @@ -726,13 +726,13 @@ void Application::bind(const QString& source, const QString& target, bool readOn if(mount(csource.c_str(), ctarget.c_str(), NULL, MS_REMOUNT | MS_BIND | MS_RDONLY, NULL)){ O_WARNING("Failed to remount bindmount read only: " << ::strerror(errno)); } - qDebug() << "mount ro" << source << target; + O_DEBUG("mount ro" << source << target); } void Application::sysfs(const QString& path){ mkdirs(path, 744); umount(path); - qDebug() << "sysfs" << path; + O_DEBUG("sysfs" << path); if(mount("none", path.toStdString().c_str(), "sysfs", 0, "")){ O_WARNING("Failed to mount sysfs: " << ::strerror(errno)); } @@ -741,7 +741,7 @@ void Application::sysfs(const QString& path){ void Application::ramdisk(const QString& path){ mkdirs(path, 744); umount(path); - qDebug() << "ramdisk" << path; + O_DEBUG("ramdisk" << path); if(mount("tmpfs", path.toStdString().c_str(), "tmpfs", 0, "size=249m,mode=755")){ O_WARNING("Failed to create ramdisk: " << ::strerror(errno)); } @@ -754,14 +754,14 @@ void Application::umount(const QString& path){ auto cpath = path.toStdString(); auto ret = ::umount2(cpath.c_str(), MNT_DETACH); if((ret && ret != EINVAL && ret != ENOENT) || isMounted(path)){ - qDebug() << "umount failed" << path; + O_WARNING("umount failed" << path); return; } QDir dir(path); if(dir.exists()){ rmdir(cpath.c_str()); } - qDebug() << "umount" << path; + O_DEBUG("umount" << path); } FifoHandler* Application::mkfifo(const QString& name, const QString& target){ @@ -781,18 +781,18 @@ FifoHandler* Application::mkfifo(const QString& name, const QString& target){ } bind(source, target); if(!fifos.contains(name)){ - qDebug() << "Creating fifo thread for" << source; + O_DEBUG("Creating fifo thread for" << source); auto handler = new FifoHandler(name, source.toStdString().c_str(), this); - qDebug() << "Connecting fifo thread events for" << source; + O_DEBUG("Connecting fifo thread events for" << source); connect(handler, &FifoHandler::finished, [this, name]{ if(fifos.contains(name)){ fifos.take(name); } }); fifos[name] = handler; - qDebug() << "Starting fifo thread for" << source; + O_DEBUG("Starting fifo thread for" << source); handler->start(); - qDebug() << "Fifo thread for " << source << "started"; + O_DEBUG("Fifo thread for " << source << "started"); } return fifos[name]; } @@ -801,7 +801,7 @@ void Application::symlink(const QString& source, const QString& target){ if(QFile::exists(source)){ return; } - qDebug() << "symlink" << source << target; + O_DEBUG("symlink" << source << target); if(::symlink(target.toStdString().c_str(), source.toStdString().c_str())){ O_WARNING("Failed to create symlink: " << ::strerror(errno)); return; @@ -820,7 +820,7 @@ void Application::mountAll(){ } #endif auto path = chrootPath(); - qDebug() << "Setting up chroot" << path; + O_DEBUG("Setting up chroot" << path); Oxide::Sentry::sentry_span(t, "bind", "Bind directories", [this, path]{ // System tmpfs folders bind("/dev", path + "/dev"); @@ -887,7 +887,7 @@ void Application::umountAll(){ if(!dir.exists()){ return; } - qDebug() << "Tearing down chroot" << path; + O_DEBUG("Tearing down chroot" << path); Oxide::Sentry::sentry_span(t, "dirs", "Remove directories", [dir]{ for(auto file : dir.entryList(QDir::Files)){ QFile::remove(file); @@ -899,7 +899,7 @@ void Application::umountAll(){ } }); if(!getActiveApplicationMounts().isEmpty()){ - qDebug() << "Some items are still mounted in chroot" << path; + O_WARNING("Some items are still mounted in chroot" << path); return; } Oxide::Sentry::sentry_span(t, "rm", "Remove final folder", [&dir]{ @@ -921,7 +921,7 @@ QStringList Application::getActiveApplicationMounts(){ QStringList Application::getActiveMounts(){ QFile mounts("/proc/mounts"); if(!mounts.open(QIODevice::ReadOnly)){ - qDebug() << "Unable to open /proc/mounts"; + O_WARNING("Unable to open /proc/mounts"); return QStringList(); } QString line; @@ -939,7 +939,7 @@ QStringList Application::getActiveMounts(){ } void Application::showSplashScreen(){ auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; + O_DEBUG("Waiting for other painting to finish..."); Oxide::Sentry::sentry_transaction("application", "showSplashScreen", [this, frameBuffer](Oxide::Sentry::Transaction* t){ #ifdef SENTRY if(t != nullptr){ @@ -955,7 +955,7 @@ void Application::showSplashScreen(){ } }); }); - qDebug() << "Displaying splashscreen for" << name(); + O_INFO("Displaying splashscreen for" << name()); Oxide::Sentry::sentry_span(t, "paint", "Draw splash screen", [this, frameBuffer](){ dispatchToMainThread([this, frameBuffer]{ QPainter painter(frameBuffer); @@ -968,7 +968,7 @@ void Application::showSplashScreen(){ splashPath = icon(); } if(!splashPath.isEmpty() && QFile::exists(splashPath)){ - qDebug() << "Using image" << splashPath; + O_INFO("Using image" << splashPath); int splashWidth = size.width() / 2; QSize splashSize(splashWidth, splashWidth); QImage splash = QImage(splashPath); @@ -990,14 +990,14 @@ void Application::showSplashScreen(){ notificationAPI->drawNotificationText("Loading " + displayName() + "..."); }); }); - qDebug() << "Waitng for screen to finish..."; + O_DEBUG("Waiting for screen to finish..."); Oxide::Sentry::sentry_span(t, "wait", "Wait for screen finish updating", [](){ dispatchToMainThread([]{ EPFrameBuffer::waitForLastUpdate(); }); }); }); - qDebug() << "Finished painting splash screen for" << name(); + O_INFO("Finished painting splash screen for" << name()); } void Application::powerStateDataRecieved(FifoHandler* handler, const QString& data){ Q_UNUSED(handler); @@ -1032,19 +1032,19 @@ void Application::recallScreen() { } Oxide::Sentry::sentry_transaction( "application", "recallScreen", [this](Oxide::Sentry::Transaction *t) { - qDebug() << "Uncompressing screen..."; + O_DEBUG("Uncompressing screen..."); QImage img; Oxide::Sentry::sentry_span( t, "decompress", "Decompress the framebuffer", [this, &img] { img = QImage::fromData(screenCaptureNoSecurityCheck(), "JPG"); }); if (img.isNull()) { - qDebug() << "Screen capture was corrupt"; - qDebug() << m_screenCapture->size(); + O_WARNING("Screen capture was corrupt"); + O_DEBUG(m_screenCapture->size()); delete m_screenCapture; return; } - qDebug() << "Recalling screen..."; + O_INFO("Recalling screen..."); Oxide::Sentry::sentry_span( t, "recall", "Recall the screen", [this, img] { dispatchToMainThread([img] { @@ -1065,7 +1065,7 @@ void Application::recallScreen() { delete m_screenCapture; m_screenCapture = nullptr; }); - qDebug() << "Screen recalled."; + O_INFO("Screen recalled."); }); } @@ -1143,15 +1143,15 @@ void Application::registerPath() { auto bus = QDBusConnection::systemBus(); bus.unregisterObject(path(), QDBusConnection::UnregisterTree); if (bus.registerObject(path(), this, QDBusConnection::ExportAllContents)) { - qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; + O_INFO("Registered" << path() << OXIDE_APPLICATION_INTERFACE); } else { - qDebug() << "Failed to register" << path(); + O_WARNING("Failed to register" << path()); } } void Application::unregisterPath() { auto bus = QDBusConnection::systemBus(); if (bus.objectRegisteredAt(path()) != nullptr) { - qDebug() << "Unregistered" << path(); + O_INFO("Unregistered" << path()); bus.unregisterObject(path()); } } diff --git a/applications/system-service/appsapi.cpp b/applications/system-service/appsapi.cpp index e369147cb..6094f36d3 100644 --- a/applications/system-service/appsapi.cpp +++ b/applications/system-service/appsapi.cpp @@ -106,18 +106,18 @@ AppsAPI::AppsAPI(QObject* parent) void AppsAPI::startup(){ Oxide::Sentry::sentry_transaction("apps", "startup", [this](Oxide::Sentry::Transaction* t){ if(applications.isEmpty()){ - qDebug() << "No applications found"; + O_INFO("No applications found"); notificationAPI->errorNotification(_noApplicationsMessage); return; } Oxide::Sentry::sentry_span(t, "autoStart", "Launching auto start applications", [this](Oxide::Sentry::Span* s){ for(auto app : applications){ if(app->autoStart()){ - qDebug() << "Auto starting" << app->name(); + O_INFO("Auto starting" << app->name()); Oxide::Sentry::sentry_span(s, app->name().toStdString(), "Launching application", [app]{ app->launchNoSecurityCheck(); if(app->type() == Backgroundable){ - qDebug() << " Pausing auto started app" << app->name(); + O_INFO(" Pausing auto started app" << app->name()); app->pauseNoSecurityCheck(); } }); @@ -127,20 +127,20 @@ void AppsAPI::startup(){ Oxide::Sentry::sentry_span(t, "start", "Launching initial application", [this]{ auto app = getApplication(m_lockscreenApplication); if(app == nullptr){ - qDebug() << "Could not find lockscreen application"; + O_WARNING("Could not find lockscreen application"); app = getApplication(m_startupApplication); } if(app == nullptr){ - qDebug() << "Could not find startup application"; - qDebug() << "Using xochitl due to invalid configuration"; + O_WARNING("Could not find startup application"); + O_WARNING("Using xochitl due to invalid configuration"); app = getApplication("xochitl"); } if(app == nullptr){ - qDebug() << "Could not find xochitl"; - qWarning() << "Using the first application in the list due to invalid configuration"; + O_WARNING("Could not find xochitl"); + O_WARNING("Using the first application in the list due to invalid configuration"); app = applications.first(); } - qDebug() << "Starting initial application" << app->name(); + O_INFO("Starting initial application" << app->name()); app->launchNoSecurityCheck(); ensureForegroundApp(); }); @@ -148,7 +148,7 @@ void AppsAPI::startup(){ } void AppsAPI::setEnabled(bool enabled){ - qDebug() << "Apps API" << enabled; + O_INFO("Apps API" << enabled); for(auto app : applications){ if(enabled){ app->registerPath(); @@ -170,19 +170,19 @@ QDBusObjectPath AppsAPI::registerApplicationNoSecurityCheck(QVariantMap properti QString bin = properties.value("bin", "").toString(); int type = properties.value("type", ApplicationType::Foreground).toInt(); if(type < ApplicationType::Foreground || type > ApplicationType::Backgroundable){ - qDebug() << "Invalid configuration: Invalid type" << type; + O_WARNING("Invalid configuration: Invalid type" << type); return QDBusObjectPath("/"); } if(name.isEmpty()){ - qDebug() << "Invalid configuration: Name is empty"; + O_WARNING("Invalid configuration: Name is empty"); return QDBusObjectPath("/"); } if(bin.isEmpty() || !QFile::exists(bin)){ - qDebug() << "Invalid configuration: " << name << " has invalid bin" << bin; + O_WARNING("Invalid configuration: " << name << " has invalid bin" << bin); return QDBusObjectPath("/"); } if(!QFileInfo(bin).isExecutable()){ - qDebug() << "Invalid configuration: " << name << " has bin that is not executable" << bin; + O_WARNING("Invalid configuration: " << name << " has bin that is not executable" << bin); return QDBusObjectPath("/"); } if(applications.contains(name)){ @@ -391,7 +391,7 @@ void AppsAPI::resumeIfNone(){ } if(app == nullptr){ if(applications.isEmpty()){ - qDebug() << "No applications found"; + O_WARNING("No applications found"); notificationAPI->errorNotification(_noApplicationsMessage); return; } @@ -465,7 +465,7 @@ bool AppsAPI::previousApplicationNoSecurityCheck(){ return false; } if(previousApplications.isEmpty()){ - qDebug() << "No previous applications"; + O_DEBUG("No previous applications"); return false; } bool found = false; @@ -483,11 +483,11 @@ bool AppsAPI::previousApplicationNoSecurityCheck(){ currentApplication->pauseNoSecurityCheck(false); } application->launchNoSecurityCheck(); - qDebug() << "Resuming previous application" << application->name(); + O_INFO("Resuming previous application" << application->name()); found = true; break; } - qDebug() << "Previous Applications" << previousApplications; + O_DEBUG("Previous Applications" << previousApplications); return found; } @@ -500,7 +500,7 @@ void AppsAPI::forceRecordPreviousApplication(){ auto name = currentApplication->name(); previousApplications.removeAll(name); previousApplications.append(name); - qDebug() << "Previous Applications" << previousApplications; + O_DEBUG("Previous Applications" << previousApplications); } void AppsAPI::recordPreviousApplication(){ @@ -518,7 +518,7 @@ void AppsAPI::recordPreviousApplication(){ auto name = currentApplication->name(); removeFromPreviousApplications(name); previousApplications.append(name); - qDebug() << "Previous Applications" << previousApplications; + O_DEBUG("Previous Applications" << previousApplications); } void AppsAPI::removeFromPreviousApplications(QString name){ previousApplications.removeAll(name); } @@ -537,16 +537,16 @@ void AppsAPI::openDefaultApplication(){ && currentApplication->stateNoSecurityCheck() != Application::Inactive && (path == m_startupApplication || path == m_lockscreenApplication) ){ - qDebug() << "Already in default application"; + O_DEBUG("Already in default application"); return; } } auto app = getApplication(m_startupApplication); if(app == nullptr){ - qDebug() << "Unable to find default application"; + O_WARNING("Unable to find default application"); return; } - qDebug() << "Opening default application"; + O_INFO("Opening default application"); app->launchNoSecurityCheck(); } @@ -564,16 +564,16 @@ void AppsAPI::openTaskManager(){ && currentApplication->stateNoSecurityCheck() != Application::Inactive && path == m_lockscreenApplication ){ - qDebug() << "Can't open task manager, on the lockscreen"; + O_WARNING("Can't open task manager, on the lockscreen"); return; } } auto app = getApplication(m_processManagerApplication); if(app == nullptr){ - qDebug() << "Unable to find task manager"; + O_WARNING("Unable to find task manager"); return; } - qDebug() << "Opening task manager"; + O_INFO("Opening task manager"); app->launchNoSecurityCheck(); } @@ -589,16 +589,16 @@ void AppsAPI::openLockScreen(){ && currentApplication->stateNoSecurityCheck() != Application::Inactive && path == m_lockscreenApplication ){ - qDebug() << "Already on the lockscreen"; + O_DEBUG("Already on the lockscreen"); return; } } auto app = getApplication(m_lockscreenApplication); if(app == nullptr){ - qDebug() << "Unable to find lockscreen"; + O_WARNING("Unable to find lockscreen"); return; } - qDebug() << "Opening lock screen"; + O_INFO("Opening lock screen"); app->launchNoSecurityCheck(); } @@ -614,11 +614,11 @@ void AppsAPI::openTaskSwitcher(){ && currentApplication->stateNoSecurityCheck() != Application::Inactive ){ if(path == m_lockscreenApplication){ - qDebug() << "Can't open task switcher, on the lockscreen"; + O_WARNING("Can't open task switcher, on the lockscreen"); return; } if(path == m_taskSwitcherApplication){ - qDebug() << "Already on the task switcher"; + O_WARNING("Already on the task switcher"); return; } } @@ -630,10 +630,10 @@ void AppsAPI::openTaskSwitcher(){ } app = getApplication(m_startupApplication); if(app == nullptr){ - qDebug() << "Unable to find default application"; + O_WARNING("Unable to find default application"); return; } - qDebug() << "Opening task switcher"; + O_INFO("Opening task switcher"); app->launchNoSecurityCheck(); } @@ -649,7 +649,7 @@ void AppsAPI::openTerminal(){ && currentApplication->stateNoSecurityCheck() != Application::Inactive ){ if(path == m_lockscreenApplication){ - qDebug() << "Can't open task switcher, on the lockscreen"; + O_WARNING("Can't open task switcher, on the lockscreen"); return; } } @@ -661,10 +661,10 @@ void AppsAPI::openTerminal(){ } app = getApplication("fingerterm"); if(app == nullptr){ - qDebug() << "Unable to find terminal application"; + O_WARNING("Unable to find terminal application"); return; } - qDebug() << "Opening terminal"; + O_INFO("Opening terminal"); app->launchNoSecurityCheck(); } @@ -722,9 +722,7 @@ void AppsAPI::readApplications(){ auto type = settings.value("type", Foreground).toInt(); auto bin = settings.value("bin").toString(); if(type < Foreground || type > Backgroundable || name.isEmpty() || bin.isEmpty()){ -#ifdef DEBUG - qDebug() << "Invalid configuration " << name; -#endif + O_DEBUG("Invalid configuration " << name); continue; } QVariantMap properties { @@ -751,16 +749,12 @@ void AppsAPI::readApplications(){ properties.insert("group", settings.value("group", "").toString()); } if(applications.contains(name)){ -#ifdef DEBUG - qDebug() << "Updating " << name; - qDebug() << properties; -#endif + O_DEBUG("Updating " << name); + O_DEBUG(properties); applications[name]->setConfig(properties); }else{ - qDebug() << name; -#ifdef DEBUG - qDebug() << properties; -#endif + O_INFO(name); + O_DEBUG(properties); registerApplicationNoSecurityCheck(properties); } } @@ -772,7 +766,7 @@ void AppsAPI::readApplications(){ for(auto entry : dir.entryInfoList()){ auto app = getRegistration(entry.filePath()); if(app.isEmpty()){ - qDebug() << "Invalid file " << entry.filePath(); + O_WARNING("Invalid file " << entry.filePath()); continue; } auto name = entry.completeBaseName(); @@ -783,7 +777,7 @@ void AppsAPI::readApplications(){ for(auto application : applications.values()){ auto name = application->name(); if(!apps.contains(name) && application->systemApp()){ - qDebug() << name << "Is no longer found on disk"; + O_WARNING(name << "Is no longer found on disk"); application->unregisterNoSecurityCheck(); } } @@ -792,10 +786,8 @@ void AppsAPI::readApplications(){ auto name = app["name"].toString(); auto bin = app["bin"].toString(); if(bin.isEmpty() || !QFile::exists(bin)){ - qDebug() << name << "Can't find application binary:" << bin; -#ifdef DEBUG - qDebug() << app; -#endif + O_WARNING(name << "Can't find application binary:" << bin); + O_DEBUG(app); continue; } if(!app.contains("flags") || !app["flags"].isArray()){ @@ -806,16 +798,12 @@ void AppsAPI::readApplications(){ app["flags"] = flags; auto properties = registrationToMap(app); if(applications.contains(name)){ -#ifdef DEBUG - qDebug() << "Updating " << name; - qDebug() << properties; -#endif + O_DEBUG("Updating " << name); + O_DEBUG(properties); applications[name]->setConfig(properties); }else{ - qDebug() << "New system app" << name; -#ifdef DEBUG - qDebug() << properties; -#endif + O_INFO("New system app" << name); + O_DEBUG(properties); registerApplicationNoSecurityCheck(properties); } } @@ -854,37 +842,37 @@ AppsAPI::~AppsAPI() { settings.sync(); dispatchToMainThread([this] { auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; + O_DEBUG("Waiting for other painting to finish..."); while (frameBuffer->paintingActive()) { EPFrameBuffer::waitForLastUpdate(); } QPainter painter(frameBuffer); auto rect = frameBuffer->rect(); auto fm = painter.fontMetrics(); - qDebug() << "Clearing screen..."; + O_INFO("Clearing screen..."); painter.setPen(Qt::white); painter.fillRect(rect, Qt::black); EPFrameBuffer::sendUpdate(rect, EPFrameBuffer::Mono, EPFrameBuffer::FullUpdate, true); EPFrameBuffer::waitForLastUpdate(); painter.end(); - qDebug() << "Stopping applications..."; + O_DEBUG("Stopping applications..."); for (auto app : applications) { if (app->stateNoSecurityCheck() != Application::Inactive) { auto text = "Stopping " + app->displayName() + "..."; - qDebug() << text.toStdString().c_str(); + O_DEBUG(text.toStdString().c_str()); notificationAPI->drawNotificationText(text, Qt::white, Qt::black); EPFrameBuffer::waitForLastUpdate(); } app->stopNoSecurityCheck(); } - qDebug() << "Ensuring all applications have stopped..."; + O_INFO("Ensuring all applications have stopped..."); for (auto app : applications) { app->waitForFinished(); app->deleteLater(); } applications.clear(); QPainter painter2(frameBuffer); - qDebug() << "Displaying final quit message..."; + O_INFO("Displaying final quit message..."); painter2.fillRect(rect, Qt::black); painter2.setPen(Qt::white); if(systemAPI->landscape()){ diff --git a/applications/system-service/bss.cpp b/applications/system-service/bss.cpp index c0221a25e..56c260eb1 100644 --- a/applications/system-service/bss.cpp +++ b/applications/system-service/bss.cpp @@ -20,16 +20,16 @@ void BSS::registerPath(){ auto bus = QDBusConnection::systemBus(); bus.unregisterObject(path(), QDBusConnection::UnregisterTree); if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_BSS_INTERFACE; + O_DEBUG("Registered" << path() << OXIDE_BSS_INTERFACE); }else{ - qDebug() << "Failed to register" << path(); + O_WARNING("Failed to register" << path()); } } void BSS::unregisterPath(){ auto bus = QDBusConnection::systemBus(); if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); + O_DEBUG("Unregistered" << path()); bus.unregisterObject(path()); } } diff --git a/applications/system-service/buttonhandler.cpp b/applications/system-service/buttonhandler.cpp index d076c023c..9c1892817 100644 --- a/applications/system-service/buttonhandler.cpp +++ b/applications/system-service/buttonhandler.cpp @@ -16,9 +16,7 @@ void flush_stream(istream* stream){ stream->read((char*)&ie, sie); } void press_button(event_device& evdev, int code, istream* stream){ -#ifdef DEBUG - qDebug() << "inject button " << code; -#endif + O_DEBUG("inject button " << code); evdev.unlock(); evdev.write(EV_KEY, code, 1); flush_stream(stream); @@ -38,7 +36,7 @@ ButtonHandler* ButtonHandler::init(){ } // Get event devices if(buttons.fd == -1){ - qDebug() << "Failed to open event device: " << buttons.device.c_str(); + O_WARNING("Failed to open event device: " << buttons.device.c_str()); throw QException(); } if(atexit(button_exit_handler)){ @@ -66,9 +64,7 @@ void ButtonHandler::clear_buffer(){ if(buttons.fd == -1){ return; } -#ifdef DEBUG - qDebug() << "Clearing event buffer on" << buttons.device.c_str(); -#endif + O_DEBUG("Clearing event buffer on" << buttons.device.c_str()); ::write(buttons.fd, flood, EVENT_FLOOD_SIZE); } @@ -78,9 +74,9 @@ void ButtonHandler::run(){ char name[256]; memset(name, 0, sizeof(name)); ioctl(buttons.fd, EVIOCGNAME(sizeof(name)), name); - qDebug() << "Reading From : " << buttons.device.c_str() << " (" << name << ")"; + O_INFO("Reading From : " << buttons.device.c_str() << " (" << name << ")"); buttons.lock(); - qDebug() << "Registering exit handler..."; + O_DEBUG("Registering exit handler..."); // Mapping the correct button IDs. unordered_map map; map[105] = PressRecord("Left", Qt::Key_Left); @@ -88,7 +84,7 @@ void ButtonHandler::run(){ map[106] = PressRecord("Right", Qt::Key_Right); map[116] = PressRecord("Power", Qt::Key_PowerOff); - qDebug() << "Listening for keypresses..."; + O_DEBUG("Listening for keypresses..."); // Get the size of an input event in the right format! input_event ie; streamsize sie = static_cast(sizeof(struct input_event)); @@ -162,7 +158,7 @@ void ButtonHandler::keyDown(Qt::Key key){ if(!m_enabled){ return; } - qDebug() << "Down" << key; + O_DEBUG("Down" << key); if(validKeys.contains(key) && !pressed.contains(key)){ QElapsedTimer timer; timer.start(); @@ -174,7 +170,7 @@ void ButtonHandler::keyUp(Qt::Key key){ if(!m_enabled){ return; } - qDebug() << "Up" << key; + O_DEBUG("Up" << key); if(!pressed.contains(key)){ // This should never happen return; @@ -201,7 +197,7 @@ void ButtonHandler::timeout(){ if(!pressed.value(key).hasExpired(700)){ continue; } - qDebug() << "Key held" << key; + O_DEBUG("Key held" << key); switch(key){ case Qt::Key_Left: emit leftHeld(); diff --git a/applications/system-service/dbusservice.cpp b/applications/system-service/dbusservice.cpp index 26ecf59e5..1cbbf169d 100644 --- a/applications/system-service/dbusservice.cpp +++ b/applications/system-service/dbusservice.cpp @@ -12,14 +12,14 @@ DBusService* DBusService::singleton(){ static DBusService* instance; if(instance == nullptr){ qRegisterMetaType>(); - qDebug() << "Creating DBusService instance"; + O_INFO("Creating DBusService instance"); instance = new DBusService(qApp); connect(qApp, &QGuiApplication::aboutToQuit, [=]{ if(instance == nullptr){ return; } emit instance->aboutToQuit(); - qDebug() << "Killing dbus service "; + O_INFO("Killing dbus service"); delete instance; qApp->processEvents(); instance = nullptr; @@ -32,7 +32,7 @@ DBusService* DBusService::singleton(){ qFatal("Failed to connect to system bus."); } QDBusConnectionInterface* interface = bus.interface(); - qDebug() << "Registering service..."; + O_INFO("Registering service..."); auto reply = interface->registerService(OXIDE_SERVICE); bus.registerService(OXIDE_SERVICE); if(!reply.isValid()){ @@ -42,7 +42,7 @@ DBusService* DBusService::singleton(){ #endif qFatal("Unable to register service: %s", ex.message().toStdString().c_str()); } - qDebug() << "Registering object..."; + O_DEBUG("Registering object..."); if(!bus.registerObject(OXIDE_SERVICE_PATH, instance, QDBusConnection::ExportAllContents)){ #ifdef SENTRY sentry_breadcrumb("dbusservice", "Unable to register interface", "error"); @@ -51,7 +51,7 @@ DBusService* DBusService::singleton(){ } connect(bus.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)), instance, SLOT(serviceOwnerChanged(QString,QString,QString))); - qDebug() << "Registered"; + O_DEBUG("Registered"); } return instance; } @@ -130,7 +130,7 @@ DBusService::DBusService(QObject* parent) : APIBase(parent), apis(){ } auto currentApplication = appsAPI->getApplication(appsAPI->currentApplicationNoSecurityCheck()); if(currentApplication != nullptr && currentApplication->path() == appsAPI->lockscreenApplication().path()){ - qDebug() << "Left Action cancelled. On lockscreen"; + O_DEBUG("Left Action cancelled. On lockscreen"); return; } if(!appsAPI->previousApplicationNoSecurityCheck()){ @@ -160,7 +160,7 @@ DBusService::~DBusService(){ #ifdef SENTRY sentry_breadcrumb("dbusservice", "Disconnecting APIs", "info"); #endif - qDebug() << "Removing all APIs"; + O_INFO("Removing all APIs"); auto bus = QDBusConnection::systemBus(); for(auto api : apis){ api.instance->setEnabled(false); @@ -202,7 +202,7 @@ QDBusObjectPath DBusService::requestAPI(QString name, QDBusMessage message) { bus.registerObject(api.path, api.instance, QDBusConnection::ExportAllContents); } if(!api.dependants->size()){ - qDebug() << "Registering " << api.path; + O_INFO("Registering " << api.path); api.instance->setEnabled(true); emit apiAvailable(QDBusObjectPath(api.path)); } @@ -221,7 +221,7 @@ void DBusService::releaseAPI(QString name, QDBusMessage message) { auto client = message.service(); api.dependants->removeAll(client); if(!api.dependants->size()){ - qDebug() << "Unregistering " << api.path; + O_INFO("Unregistering " << api.path); api.instance->setEnabled(false); QDBusConnection::systemBus().unregisterObject(api.path, QDBusConnection::UnregisterNode); emit apiUnavailable(QDBusObjectPath(api.path)); @@ -257,7 +257,7 @@ void DBusService::serviceOwnerChanged(const QString& name, const QString& oldOwn auto api = apis[key]; api.dependants->removeAll(name); if(!api.dependants->size() && bus.objectRegisteredAt(api.path) != nullptr){ - qDebug() << "Automatically unregistering " << api.path; + O_INFO("Automatically unregistering " << api.path); api.instance->setEnabled(false); bus.unregisterObject(api.path, QDBusConnection::UnregisterNode); apiUnavailable(QDBusObjectPath(api.path)); diff --git a/applications/system-service/digitizerhandler.cpp b/applications/system-service/digitizerhandler.cpp index 7e77364db..e32711fd3 100644 --- a/applications/system-service/digitizerhandler.cpp +++ b/applications/system-service/digitizerhandler.cpp @@ -8,7 +8,7 @@ DigitizerHandler* DigitizerHandler::singleton_touchScreen(){ // Get event devices event_device touchScreen_device(deviceSettings.getTouchDevicePath(), O_RDWR); if(touchScreen_device.fd == -1){ - qDebug() << "Failed to open event device: " << touchScreen_device.device.c_str(); + O_WARNING("Failed to open event device: " << touchScreen_device.device.c_str()); throw QException(); } instance = new DigitizerHandler(touchScreen_device); @@ -24,7 +24,7 @@ DigitizerHandler* DigitizerHandler::singleton_wacom(){ // Get event devices event_device wacom_device(deviceSettings.getWacomDevicePath(), O_RDWR); if(wacom_device.fd == -1){ - qDebug() << "Failed to open event device: " << wacom_device.device.c_str(); + O_WARNING("Failed to open event device: " << wacom_device.device.c_str()); throw QException(); } instance = new DigitizerHandler(wacom_device); @@ -72,9 +72,7 @@ bool DigitizerHandler::grabbed() { return device.locked; } void DigitizerHandler::write(ushort type, ushort code, int value){ auto event = createEvent(type, code, value); ::write(device.fd, &event, sizeof(input_event)); -#ifdef DEBUG - qDebug() << "Emitted event " << event.time.tv_sec << event.time.tv_usec << type << code << value; -#endif + O_DEBUG("Emitted event " << event.time.tv_sec << event.time.tv_usec << type << code << value); } void DigitizerHandler::write(input_event* events, size_t size){ @@ -89,9 +87,7 @@ void DigitizerHandler::clear_buffer(){ if(device.fd == -1){ return; } -#ifdef DEBUG - qDebug() << "Clearing event buffer on" << device.device.c_str(); -#endif + O_DEBUG("Clearing event buffer on" << device.device.c_str()); write(flood, 512 * 8 * 4 * sizeof(input_event)); } @@ -122,8 +118,8 @@ void DigitizerHandler::run(){ char name[256]; memset(name, 0, sizeof(name)); ioctl(device.fd, EVIOCGNAME(sizeof(name)), name); - qDebug() << "Reading From : " << device.device.c_str() << " (" << name << ")"; - qDebug() << "Listening for events..."; + O_INFO("Reading From : " << device.device.c_str() << " (" << name << ")"); + O_DEBUG("Listening for events..."); while(handle_events()){ qApp->processEvents(QEventLoop::AllEvents, 100); QThread::yieldCurrentThread(); diff --git a/applications/system-service/keyboardhandler.cpp b/applications/system-service/keyboardhandler.cpp index 5f25cc82a..4a22139d9 100644 --- a/applications/system-service/keyboardhandler.cpp +++ b/applications/system-service/keyboardhandler.cpp @@ -619,7 +619,7 @@ KeyboardHandler::~KeyboardHandler(){ } void KeyboardHandler::flood(){ - qDebug() << "Flooding"; + O_DEBUG("Flooding"); for(int i = 0; i < 512 * 8; i+=4){ writeEvent(EV_KEY, KEY_ROTATE_LOCK_TOGGLE, 1); writeEvent(EV_SYN, SYN_REPORT, 0); diff --git a/applications/system-service/main.cpp b/applications/system-service/main.cpp index 5c51b5ff5..c362f7dc9 100755 --- a/applications/system-service/main.cpp +++ b/applications/system-service/main.cpp @@ -28,16 +28,16 @@ bool stopProcess(pid_t pid){ if(pid <= 1){ return false; } - qDebug() << "Waiting for other instance to stop..."; + O_INFO("Waiting for other instance to stop..."); kill(pid, SIGTERM); int tries = 0; while(0 == kill(pid, 0)){ std::this_thread::sleep_for(std::chrono::milliseconds(100)); if(++tries == 50){ - qDebug() << "Instance is taking too long, killing..."; + O_INFO("Instance is taking too long, killing..."); kill(pid, SIGKILL); }else if(tries == 60){ - qDebug() << "Unable to kill process"; + O_INFO("Unable to kill process"); return false; } } @@ -87,27 +87,27 @@ int main(int argc, char* argv[]){ ).trimmed(); if(pid != "0" && pid != actualPid){ if(!parser.isSet(breakLockOption)){ - qDebug() << "tarnish.service is already running"; + O_INFO("tarnish.service is already running"); return EXIT_FAILURE; } if(QProcess::execute("systemctl", QStringList() << "stop" << "tarnish")){ - qDebug() << "tarnish.service is already running"; - qDebug() << "Unable to stop service"; + O_INFO("tarnish.service is already running"); + O_INFO("Unable to stop service"); return EXIT_FAILURE; } } - qDebug() << "Creating lock file" << lockPath; + O_INFO("Creating lock file" << lockPath); if(!QFile::exists(QString::fromStdString(runPath)) && !std::filesystem::create_directories(runPath)){ - qDebug() << "Failed to create" << runPath.c_str(); + O_INFO("Failed to create" << runPath.c_str()); return EXIT_FAILURE; } int lock = Oxide::tryGetLock(lockPath); if(lock < 0){ - qDebug() << "Unable to establish lock on" << lockPath << strerror(errno); + O_INFO("Unable to establish lock on" << lockPath << strerror(errno)); if(!parser.isSet(breakLockOption)){ return EXIT_FAILURE; } - qDebug() << "Attempting to stop all other instances of tarnish" << lockPath; + O_INFO("Attempting to stop all other instances of tarnish" << lockPath); for(auto lockingPid : Oxide::lsof(lockPath)){ if(Oxide::processExists(lockingPid)){ stopProcess(lockingPid); @@ -115,13 +115,13 @@ int main(int argc, char* argv[]){ } lock = Oxide::tryGetLock(lockPath); if(lock < 0){ - qDebug() << "Unable to establish lock on" << lockPath << strerror(errno); + O_INFO("Unable to establish lock on" << lockPath << strerror(errno)); return EXIT_FAILURE; } } QObject::connect(&app, &QGuiApplication::aboutToQuit, [lock]{ - qDebug() << "Releasing lock " << lockPath; + O_INFO("Releasing lock " << lockPath); Oxide::releaseLock(lock, lockPath); }); diff --git a/applications/system-service/network.cpp b/applications/system-service/network.cpp index b8c9266ac..6e6cac1be 100644 --- a/applications/system-service/network.cpp +++ b/applications/system-service/network.cpp @@ -52,16 +52,16 @@ void Network::registerPath(){ auto bus = QDBusConnection::systemBus(); bus.unregisterObject(path(), QDBusConnection::UnregisterTree); if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_NETWORK_INTERFACE; + O_DEBUG("Registered" << path() << OXIDE_NETWORK_INTERFACE); }else{ - qDebug() << "Failed to register" << path(); + O_WARNING("Failed to register" << path()); } } void Network::unregisterPath(){ auto bus = QDBusConnection::systemBus(); if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); + O_DEBUG("Unregistered" << path()); bus.unregisterObject(path()); } } @@ -94,9 +94,7 @@ void Network::registerNetwork(){ } } if(!found){ -#ifdef DEBUG - qDebug() << realProps(); -#endif + O_DEBUG(realProps()); QDBusObjectPath path = interface->AddNetwork(realProps()); auto network = new INetwork(WPA_SUPPLICANT_SERVICE, path.path(), QDBusConnection::systemBus(), interface); networks.append(network); diff --git a/applications/system-service/notification.cpp b/applications/system-service/notification.cpp index bf3de86bb..d18ea3e31 100644 --- a/applications/system-service/notification.cpp +++ b/applications/system-service/notification.cpp @@ -35,16 +35,16 @@ void Notification::registerPath(){ auto bus = QDBusConnection::systemBus(); bus.unregisterObject(path(), QDBusConnection::UnregisterTree); if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; + O_INFO("Registered" << path() << OXIDE_APPLICATION_INTERFACE); }else{ - qDebug() << "Failed to register" << path(); + O_WARNING("Failed to register" << path()); } } void Notification::unregisterPath(){ auto bus = QDBusConnection::systemBus(); if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); + O_INFO("Unregistered" << path()); bus.unregisterObject(path()); } } @@ -104,13 +104,13 @@ void Notification::display(){ return; } if(notificationAPI->locked()){ - qDebug() << "Queueing notification display"; + O_INFO("Queueing notification display"); notificationAPI->notificationDisplayQueue.append(this); return; } notificationAPI->lock(); Oxide::dispatchToMainThread([this]{ - qDebug() << "Displaying notification" << identifier(); + O_INFO("Displaying notification" << identifier()); auto path = appsAPI->currentApplicationNoSecurityCheck(); Application* resumeApp = nullptr; if(path.path() != "/"){ @@ -174,10 +174,10 @@ void Notification::setOwner(QString owner){ bool Notification::hasPermission(QString permission, const char* sender){ return notificationAPI->hasPermission(permission, sender); } void Notification::paintNotification(Application *resumeApp) { - qDebug() << "Painting notification" << identifier(); + O_INFO("Painting notification" << identifier()); dispatchToMainThread([this] { screenBackup = screenAPI->copy(); }); updateRect = notificationAPI->paintNotification(text(), m_icon); - qDebug() << "Painted notification" << identifier(); + O_INFO("Painted notification" << identifier()); emit displayed(); QTimer::singleShot(2000, [this, resumeApp] { dispatchToMainThread([this] { @@ -191,7 +191,7 @@ void Notification::paintNotification(Application *resumeApp) { EPFrameBuffer::FullUpdate, true ); - qDebug() << "Finished displaying notification" << identifier(); + O_INFO("Finished displaying notification" << identifier()); EPFrameBuffer::waitForLastUpdate(); }); if (!notificationAPI->notificationDisplayQueue.isEmpty()) { diff --git a/applications/system-service/notificationapi.cpp b/applications/system-service/notificationapi.cpp index 6f2751cdf..98ca91eca 100644 --- a/applications/system-service/notificationapi.cpp +++ b/applications/system-service/notificationapi.cpp @@ -25,7 +25,7 @@ bool NotificationAPI::enabled(){ return m_enabled; } void NotificationAPI::setEnabled(bool enabled){ m_enabled = enabled; - qDebug() << "Notification API" << enabled; + O_INFO("Notification API" << enabled); for(auto notification : m_notifications.values()){ if(enabled){ notification->registerPath(); @@ -98,7 +98,7 @@ Notification* NotificationAPI::getByIdentifier(const QString& identifier){ QRect NotificationAPI::paintNotification(const QString &text, const QString &iconPath){ QImage notification = notificationImage(text, iconPath); return dispatchToMainThread([¬ification]{ - qDebug() << "Painting to framebuffer..."; + O_DEBUG("Painting to framebuffer..."); auto frameBuffer = EPFrameBuffer::framebuffer(); QPainter painter(frameBuffer); QPoint pos(0, frameBuffer->height() - notification.height()); @@ -110,7 +110,7 @@ QRect NotificationAPI::paintNotification(const QString &text, const QString &ico auto updateRect = notification.rect().translated(pos); painter.drawImage(updateRect, notification); painter.end(); - qDebug() << "Updating screen " << updateRect << "..."; + O_DEBUG("Updating screen " << updateRect << "..."); EPFrameBuffer::sendUpdate( updateRect, EPFrameBuffer::Grayscale, @@ -124,11 +124,11 @@ QRect NotificationAPI::paintNotification(const QString &text, const QString &ico void NotificationAPI::errorNotification(const QString &text) { dispatchToMainThread([] { auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; + O_DEBUG("Waiting for other painting to finish..."); while (frameBuffer->paintingActive()) { EPFrameBuffer::waitForLastUpdate(); } - qDebug() << "Displaying error text"; + O_DEBUG("Displaying error text"); QPainter painter(frameBuffer); painter.fillRect(frameBuffer->rect(), Qt::white); painter.end(); diff --git a/applications/system-service/powerapi.cpp b/applications/system-service/powerapi.cpp index 0a88f2faf..78d4847ec 100644 --- a/applications/system-service/powerapi.cpp +++ b/applications/system-service/powerapi.cpp @@ -33,7 +33,7 @@ PowerAPI::PowerAPI(QObject* parent) } PowerAPI::~PowerAPI(){ - qDebug() << "Killing timer"; + O_DEBUG("Killing timer"); timer->stop(); delete timer; } diff --git a/applications/system-service/screenapi.cpp b/applications/system-service/screenapi.cpp index abba365e8..ffd4b49b7 100644 --- a/applications/system-service/screenapi.cpp +++ b/applications/system-service/screenapi.cpp @@ -8,11 +8,9 @@ QDBusObjectPath ScreenAPI::screenshot(){ if(!hasPermission("screen")){ return QDBusObjectPath("/"); } - qDebug() << "Taking screenshot"; + O_INFO("Taking screenshot"); auto filePath = getNextPath(); -#ifdef DEBUG - qDebug() << "Using path" << filePath; -#endif + O_DEBUG("Using path" << filePath); return dispatchToMainThread([this, filePath]{ QImage screen = copy(); QRect rect = notificationAPI->paintNotification("Taking Screenshot...", ""); @@ -24,7 +22,7 @@ QDBusObjectPath ScreenAPI::screenshot(){ : screen ).save(filePath); if(!saved){ - qDebug() << "Failed to take screenshot"; + O_WARNING("Failed to take screenshot"); }else{ path = addScreenshot(filePath)->qPath(); } @@ -47,7 +45,7 @@ QDBusObjectPath ScreenAPI::screenshot(){ QImage ScreenAPI::copy(){ return Oxide::dispatchToMainThread([]{ auto frameBuffer = EPFrameBuffer::framebuffer(); - qDebug() << "Waiting for other painting to finish..."; + O_DEBUG("Waiting for other painting to finish..."); while(frameBuffer->paintingActive()){ EPFrameBuffer::waitForLastUpdate(); } @@ -59,7 +57,7 @@ QDBusObjectPath ScreenAPI::addScreenshot(QByteArray blob){ if(!hasPermission("screen")){ return QDBusObjectPath("/"); } - qDebug() << "Adding external screenshot"; + O_INFO("Adding external screenshot"); mutex.lock(); auto filePath = getNextPath(); QFile file(filePath); @@ -159,7 +157,7 @@ ScreenAPI::~ScreenAPI(){} void ScreenAPI::setEnabled(bool enabled){ m_enabled = enabled; - qDebug() << "Screen API" << enabled; + O_INFO("Screen API" << enabled); for(auto screenshot : m_screenshots){ if(enabled){ screenshot->registerPath(); @@ -192,12 +190,12 @@ bool ScreenAPI::drawFullscreenImage(QString path, double rotate) { return false; } if (!QFile(path).exists()) { - qDebug() << "Can't find image" << path; + O_WARNING("Can't find image" << path); return false; } QImage img(path); if (img.isNull()) { - qDebug() << "Image data invalid" << path; + O_WARNING("Image data invalid" << path); return false; } if(rotate){ diff --git a/applications/system-service/screenshot.cpp b/applications/system-service/screenshot.cpp index 580bbbab4..71ee7cc1a 100644 --- a/applications/system-service/screenshot.cpp +++ b/applications/system-service/screenshot.cpp @@ -4,7 +4,7 @@ Screenshot::Screenshot(QString path, QString filePath, QObject* parent) : QObject(parent), m_path(path), mutex() { m_file = new QFile(filePath); if(!m_file->open(QIODevice::ReadWrite)){ - qDebug() << "Unable to open screenshot file" << m_file->fileName(); + O_WARNING("Unable to open screenshot file" << m_file->fileName()); } } @@ -24,16 +24,16 @@ void Screenshot::registerPath(){ auto bus = QDBusConnection::systemBus(); bus.unregisterObject(path(), QDBusConnection::UnregisterTree); if(bus.registerObject(path(), this, QDBusConnection::ExportAllContents)){ - qDebug() << "Registered" << path() << OXIDE_APPLICATION_INTERFACE; + O_INFO("Registered" << path() << OXIDE_APPLICATION_INTERFACE); }else{ - qDebug() << "Failed to register" << path(); + O_WARNING("Failed to register" << path()); } } void Screenshot::unregisterPath(){ auto bus = QDBusConnection::systemBus(); if(bus.objectRegisteredAt(path()) != nullptr){ - qDebug() << "Unregistered" << path(); + O_INFO("Unregistered" << path()); bus.unregisterObject(path()); } } @@ -48,7 +48,7 @@ QByteArray Screenshot::blob(){ } mutex.lock(); if(!m_file->isOpen() && !m_file->open(QIODevice::ReadWrite)){ - qDebug() << "Unable to open screenshot file" << m_file->fileName(); + O_WARNING("Unable to open screenshot file" << m_file->fileName()); mutex.unlock(); return QByteArray(); } @@ -64,7 +64,7 @@ void Screenshot::setBlob(QByteArray blob){ } mutex.lock(); if(!m_file->isOpen() && !m_file->open(QIODevice::ReadWrite)){ - qDebug() << "Unable to open screenshot file" << m_file->fileName(); + O_WARNING("Unable to open screenshot file" << m_file->fileName()); mutex.unlock(); return; } @@ -93,7 +93,7 @@ void Screenshot::remove(){ } mutex.lock(); if(m_file->exists() && !m_file->remove()){ - qDebug() << "Failed to remove screenshot" << path(); + O_INFO("Failed to remove screenshot" << path()); mutex.unlock(); return; } @@ -101,7 +101,7 @@ void Screenshot::remove(){ m_file->close(); } mutex.unlock(); - qDebug() << "Removed screenshot" << path(); + O_INFO("Removed screenshot" << path()); emit removed(); } diff --git a/applications/system-service/systemapi.cpp b/applications/system-service/systemapi.cpp index 92b5f3ae5..94981a0e8 100644 --- a/applications/system-service/systemapi.cpp +++ b/applications/system-service/systemapi.cpp @@ -24,9 +24,9 @@ void SystemAPI::PrepareForSleep(bool suspending){ Oxide::Sentry::sentry_transaction("system", "suspend", [this, device](Oxide::Sentry::Transaction* t){ if(autoLock()){ lockTimestamp = QDateTime::currentMSecsSinceEpoch() + lockTimer.remainingTime(); - qDebug() << "Auto Lock timestamp:" << lockTimestamp; + O_DEBUG("Auto Lock timestamp:" << lockTimestamp); } - qDebug() << "Preparing for suspend..."; + O_INFO("Preparing for suspend..."); Oxide::Sentry::sentry_span(t, "prepare", "Prepare for suspend", [this]{ wifiAPI->stopUpdating(); emit deviceSuspending(); @@ -35,9 +35,9 @@ void SystemAPI::PrepareForSleep(bool suspending){ if(path.path() != "/"){ resumeApp = appsAPI->getApplication(path); resumeApp->pauseNoSecurityCheck(false); - qDebug() << "Resume app set to " << resumeApp->name(); + O_INFO("Resume app set to " << resumeApp->name()); }else{ - qDebug() << "Unable to set resume app"; + O_INFO("Unable to set resume app"); resumeApp = nullptr; } }); @@ -63,14 +63,14 @@ void SystemAPI::PrepareForSleep(bool suspending){ Oxide::Sentry::sentry_span(t, "clear-input", "Clear input buffers", [this]{ clearDeviceBuffers(); }); - qDebug() << "Suspending..."; + O_INFO("Suspending..."); }); }else{ Oxide::Sentry::sentry_transaction("system", "resume", [this, device](Oxide::Sentry::Transaction* t){ Oxide::Sentry::sentry_span(t, "inhibit", "Inhibit sleep", [this]{ inhibitSleep(); }); - qDebug() << "Resuming..."; + O_INFO("Resuming..."); Oxide::Sentry::sentry_span(t, "process", "Process events", []{ QCoreApplication::processEvents(QEventLoop::AllEvents, 100); }); @@ -78,40 +78,40 @@ void SystemAPI::PrepareForSleep(bool suspending){ auto now = QDateTime::currentMSecsSinceEpoch(); bool lockTimeout = autoLock(); if(lockTimeout){ - qDebug() << "Current timestamp:" << now; + O_DEBUG("Current timestamp:" << now); lockTimeout = now >= lockTimestamp; } if(lockOnSuspend() || lockTimeout){ if(lockTimeout){ - qDebug() << "Lock timer expired while suspended"; + O_DEBUG("Lock timer expired while suspended"); }else{ - qDebug() << "Always locking after suspend"; + O_DEBUG("Always locking after suspend"); } auto lockscreenApp = appsAPI->getApplication(appsAPI->lockscreenApplication()); if(lockscreenApp != nullptr){ - qDebug() << "Resume app set to lockscreen application"; + O_DEBUG("Resume app set to lockscreen application"); resumeApp = lockscreenApp; } } if(resumeApp == nullptr){ - qDebug() << "Resume app set to startup application"; + O_DEBUG("Resume app set to startup application"); resumeApp = appsAPI->getApplication(appsAPI->startupApplication()); } if(resumeApp != nullptr){ resumeApp->resumeNoSecurityCheck(); }else{ - qDebug() << "Unable to find an app to resume"; + O_WARNING("Unable to find an app to resume"); } }); Oxide::Sentry::sentry_span(t, "enable", "Enable various services", [this, device]{ buttonHandler->setEnabled(true); emit deviceResuming(); if(autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected){ - qDebug() << "Suspend timer re-enabled due to resume"; + O_DEBUG("Suspend timer re-enabled due to resume"); suspendTimer.start(autoSleep() * 60 * 1000); } if(autoLock()){ - qDebug() << "Lock timer re-enabled due to resume"; + O_DEBUG("Lock timer re-enabled due to resume"); lockTimer.start(autoLock() * 60 * 1000); } if(device == Oxide::DeviceSettings::DeviceType::RM2){ @@ -173,10 +173,10 @@ SystemAPI::SystemAPI(QObject* parent) Oxide::Sentry::sentry_span(t, "autoSleep", "Setup automatic sleep", [this](Oxide::Sentry::Span* s){ QSettings settings; if(QFile::exists(settings.fileName())){ - qDebug() << "Importing old settings"; + O_INFO("Importing old settings"); settings.sync(); if(settings.contains("autoSleep")){ - qDebug() << "Importing old autoSleep"; + O_DEBUG("Importing old autoSleep"); sharedSettings.set_autoSleep(settings.value("autoSleep").toInt()); } int size = settings.beginReadArray("swipes"); @@ -185,7 +185,7 @@ SystemAPI::SystemAPI(QObject* parent) for(short i = Right; i <= Down && i < size; i++){ settings.setArrayIndex(i); sharedSettings.setArrayIndex(i); - qDebug() << QString("Importing old swipe[%1]").arg(i); + O_DEBUG(QString("Importing old swipe[%1]").arg(i)); sharedSettings.setValue("enabled", settings.value("enabled", true)); sharedSettings.setValue("length", settings.value("length", 30)); } @@ -201,7 +201,7 @@ SystemAPI::SystemAPI(QObject* parent) }else if(autoSleep() > 10){ sharedSettings.set_autoSleep(10); } - qDebug() << "Auto Sleep" << autoSleep(); + O_DEBUG("Auto Sleep" << autoSleep()); Oxide::Sentry::sentry_span(s, "timer", "Setup timers", [this]{ if(autoSleep()){ suspendTimer.start(autoSleep() * 60 * 1000); @@ -278,12 +278,12 @@ SystemAPI::SystemAPI(QObject* parent) }); keyboardHandler; }); - qDebug() << "System API ready to use"; + O_INFO("System API ready to use"); }); } SystemAPI::~SystemAPI(){ - qDebug() << "Removing all inhibitors"; + O_INFO("Removing all inhibitors"); rguard(false); QMutableListIterator i(inhibitors); while(i.hasNext()){ @@ -295,7 +295,7 @@ SystemAPI::~SystemAPI(){ } void SystemAPI::setEnabled(bool enabled){ - qDebug() << "System API" << enabled; + O_INFO("System API" << enabled); } int SystemAPI::autoSleep(){return sharedSettings.autoSleep(); } @@ -304,7 +304,7 @@ void SystemAPI::setAutoSleep(int _autoSleep){ if(_autoSleep < 0 || _autoSleep > 360){ return; } - qDebug() << "Auto Sleep" << _autoSleep; + O_INFO("Auto Sleep" << _autoSleep); sharedSettings.set_autoSleep(_autoSleep); if(_autoSleep && powerAPI->chargerState() != PowerAPI::ChargerConnected){ suspendTimer.setInterval(_autoSleep * 60 * 1000); @@ -320,7 +320,7 @@ void SystemAPI::setAutoLock(int _autoLock){ if(_autoLock < 0 || _autoLock > 360){ return; } - qDebug() << "Auto Lock" << _autoLock; + O_INFO("Auto Lock" << _autoLock); sharedSettings.set_autoLock(_autoLock); lockTimer.setInterval(_autoLock * 60 * 1000); sharedSettings.sync(); @@ -330,7 +330,7 @@ void SystemAPI::setAutoLock(int _autoLock){ bool SystemAPI::lockOnSuspend(){return sharedSettings.lockOnSuspend(); } void SystemAPI::setLockOnSuspend(bool _lockOnSuspend){ sharedSettings.set_lockOnSuspend(_lockOnSuspend); - qDebug() << "Lock on Suspend" << _lockOnSuspend; + O_INFO("Lock on Suspend" << _lockOnSuspend); sharedSettings.sync(); emit lockOnSuspendChanged(_lockOnSuspend); } @@ -354,29 +354,29 @@ void SystemAPI::uninhibitAll(QString name){ } } if(!sleepInhibited() && autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected && !suspendTimer.isActive()){ - qDebug() << "Suspend timer re-enabled due to uninhibit" << name; + O_DEBUG("Suspend timer re-enabled due to uninhibit" << name); suspendTimer.start(autoSleep() * 60 * 1000); } } void SystemAPI::stopSuspendTimer(){ - qDebug() << "Suspend timer disabled"; + O_DEBUG("Suspend timer disabled"); suspendTimer.stop(); } void SystemAPI::stopLockTimer(){ - qDebug() << "Lock timer disabled"; + O_DEBUG("Lock timer disabled"); lockTimer.stop(); } void SystemAPI::startSuspendTimer(){ if(autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected && !suspendTimer.isActive()){ - qDebug() << "Suspend timer re-enabled due to start Suspend timer"; + O_DEBUG("Suspend timer re-enabled due to start Suspend timer"); suspendTimer.start(autoSleep() * 60 * 1000); } } void SystemAPI::startLockTimer(){ if(autoLock() && !lockTimer.isActive()){ - qDebug() << "Lock timer re-enabled due to start lock timer"; + O_DEBUG("Lock timer re-enabled due to start lock timer"); lockTimer.start(autoSleep() * 60 * 1000); } } @@ -398,7 +398,7 @@ void SystemAPI::setSwipeEnabled(int direction, bool enabled){ return; } if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; + O_WARNING("Invalid swipe direction: " << direction); return; } setSwipeEnabled((SwipeDirection)direction, enabled); @@ -410,16 +410,16 @@ void SystemAPI::setSwipeEnabled(SwipeDirection direction, bool enabled){ } switch(direction){ case Left: - qDebug() << "Swipe Left: " << enabled; + O_INFO("Swipe Left: " << enabled); break; case Right: - qDebug() << "Swipe Right: " << enabled; + O_INFO("Swipe Right: " << enabled); break; case Up: - qDebug() << "Swipe Up: " << enabled; + O_INFO("Swipe Up: " << enabled); break; case Down: - qDebug() << "Swipe Down: " << enabled; + O_INFO("Swipe Down: " << enabled); break; default: return; @@ -440,7 +440,7 @@ bool SystemAPI::getSwipeEnabled(int direction){ return false; } if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; + O_WARNING("Invalid swipe direction: " << direction); return false; } return getSwipeEnabled(direction); @@ -453,7 +453,7 @@ void SystemAPI::toggleSwipeEnabled(int direction){ return; } if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; + O_WARNING("Invalid swipe direction: " << direction); return; } toggleSwipeEnabled((SwipeDirection)direction); @@ -467,7 +467,7 @@ void SystemAPI::setSwipeLength(int direction, int length){ return; } if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; + O_WARNING("Invalid swipe direction: " << direction); return; } if(direction == SwipeDirection::Up || direction == SwipeDirection::Down){ @@ -476,7 +476,7 @@ void SystemAPI::setSwipeLength(int direction, int length){ maxLength = deviceSettings.getTouchWidth(); } if(length < 0 || length > maxLength){ - qDebug() << "Invalid swipe length: " << direction; + O_WARNING("Invalid swipe length: " << direction); return; } setSwipeLength((SwipeDirection)direction, length); @@ -488,16 +488,16 @@ void SystemAPI::setSwipeLength(SwipeDirection direction, int length){ } switch(direction){ case Left: - qDebug() << "Swipe Left Length: " << length; + O_INFO("Swipe Left Length: " << length); break; case Right: - qDebug() << "Swipe Right Length: " << length; + O_INFO("Swipe Right Length: " << length); break; case Up: - qDebug() << "Swipe Up Length: " << length; + O_INFO("Swipe Up Length: " << length); break; case Down: - qDebug() << "Swipe Down Length: " << length; + O_INFO("Swipe Down Length: " << length); break; default: return; @@ -519,7 +519,7 @@ int SystemAPI::getSwipeLength(int direction){ return -1; } if(direction <= SwipeDirection::None || direction > SwipeDirection::Down){ - qDebug() << "Invalid swipe direction: " << direction; + O_WARNING("Invalid swipe direction: " << direction); return -1; } return getSwipeLength((SwipeDirection)direction); @@ -529,56 +529,56 @@ int SystemAPI::getSwipeLength(SwipeDirection direction){ return swipeLengths[dir void SystemAPI::suspend(){ if(sleepInhibited()){ - qDebug() << "Unable to suspend. Action is currently inhibited."; + O_INFO("Unable to suspend. Action is currently inhibited."); return; } - qDebug() << "Requesting Suspend..."; + O_INFO("Requesting Suspend..."); systemd->Suspend(false).waitForFinished(); - qDebug() << "Suspend requested."; + O_INFO("Suspend requested."); } void SystemAPI::powerOff() { if(powerOffInhibited()){ - qDebug() << "Unable to power off. Action is currently inhibited."; + O_INFO("Unable to power off. Action is currently inhibited."); return; } - qDebug() << "Requesting Power off..."; + O_INFO("Requesting Power off..."); releasePowerOffInhibitors(true); rguard(false); systemd->PowerOff(false).waitForFinished(); - qDebug() << "Power off requested"; + O_INFO("Power off requested"); } void SystemAPI::reboot() { if(powerOffInhibited()){ - qDebug() << "Unable to reboot. Action is currently inhibited."; + O_INFO("Unable to reboot. Action is currently inhibited."); return; } - qDebug() << "Requesting Reboot..."; + O_INFO("Requesting Reboot..."); releasePowerOffInhibitors(true); rguard(false); systemd->Reboot(false).waitForFinished(); - qDebug() << "Reboot requested"; + O_INFO("Reboot requested"); } void SystemAPI::activity(){ auto active = suspendTimer.isActive(); suspendTimer.stop(); if(autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected){ if(!active){ - qDebug() << "Suspend timer re-enabled due to activity"; + O_DEBUG("Suspend timer re-enabled due to activity"); } suspendTimer.start(autoSleep() * 60 * 1000); }else if(active){ - qDebug() << "Suspend timer disabled"; + O_DEBUG("Suspend timer disabled"); } active = lockTimer.isActive(); if(autoLock()){ if(!active){ - qDebug() << "Lock timer re-enabled due to activity"; + O_DEBUG("Lock timer re-enabled due to activity"); } lockTimer.start(autoLock() * 60 * 1000); }else if(active){ - qDebug() << "Lock timer disabled"; + O_DEBUG("Lock timer disabled"); } } @@ -598,7 +598,7 @@ void SystemAPI::uninhibitSleep(QDBusMessage message){ sleepInhibitors.removeAll(message.service()); if(!sleepInhibited() && autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected){ if(!suspendTimer.isActive()){ - qDebug() << "Suspend timer re-enabled due to uninhibit sleep" << message.service(); + O_DEBUG("Suspend timer re-enabled due to uninhibit sleep" << message.service()); suspendTimer.start(autoSleep() * 60 * 1000); } releaseSleepInhibitors(true); @@ -627,7 +627,7 @@ void SystemAPI::uninhibitPowerOff(QDBusMessage message){ } void SystemAPI::suspendTimeout(){ if(autoSleep() && powerAPI->chargerState() != PowerAPI::ChargerConnected){ - qDebug() << "Automatic suspend due to inactivity..."; + O_INFO("Automatic suspend due to inactivity..."); suspend(); } } @@ -635,7 +635,7 @@ void SystemAPI::lockTimeout(){ if(autoLock()){ auto lockscreenApp = appsAPI->getApplication(appsAPI->lockscreenApplication()); if(lockscreenApp != nullptr){ - qDebug() << "Automatic lock due to inactivity..."; + O_INFO("Automatic lock due to inactivity..."); lockscreenApp->resumeNoSecurityCheck(); } } @@ -675,9 +675,7 @@ void SystemAPI::touchEvent(const input_event& event){ touchUp(released); } }else if(swipeDirection != None){ - if(Oxide::debugEnabled()){ - qDebug() << "Swiping cancelled due to pen activity"; - } + O_DEBUG("Swiping cancelled due to pen activity"); swipeDirection = None; } // Cleanup released touches @@ -746,9 +744,7 @@ void SystemAPI::penEvent(const input_event& event){ return; } penActive = event.value; - if(Oxide::debugEnabled()){ - qDebug() << "Pen state: " << (penActive ? "Active" : "Inactive"); - } + O_DEBUG("Pen state: " << (penActive ? "Active" : "Inactive")); } void SystemAPI::inhibitSleep(){ @@ -812,9 +808,7 @@ void SystemAPI::touchDown(QList touches){ if(penActive){ return; } - if(Oxide::debugEnabled()){ - qDebug() << "DOWN" << touches; - } + O_DEBUG("DOWN" << touches); if(getCurrentFingers() != 1){ return; } @@ -845,20 +839,14 @@ void SystemAPI::touchDown(QList touches){ }else{ return; } - if(Oxide::debugEnabled()){ - qDebug() << "Swipe started" << swipeDirection; - } + O_DEBUG("Swipe started" << swipeDirection); startLocation = location = QPoint(touch->x, touch->y); } void SystemAPI::touchUp(QList touches){ - if(Oxide::debugEnabled()){ - qDebug() << "UP" << touches; - } + O_DEBUG("UP" << touches); if(swipeDirection == None){ - if(Oxide::debugEnabled()){ - qDebug() << "Not swiping"; - } + O_DEBUG("Not swiping"); if(touchHandler->grabbed()){ for(auto touch : touches){ writeTouchUp(touch); @@ -868,9 +856,7 @@ void SystemAPI::touchUp(QList touches){ return; } if(getCurrentFingers()){ - if(Oxide::debugEnabled()){ - qDebug() << "Still swiping"; - } + O_DEBUG("Still swiping"); if(touchHandler->grabbed()){ for(auto touch : touches){ writeTouchUp(touch); @@ -879,9 +865,7 @@ void SystemAPI::touchUp(QList touches){ return; } if(touches.length() > 1){ - if(Oxide::debugEnabled()){ - qDebug() << "Too many fingers"; - } + O_DEBUG("Too many fingers"); if(touchHandler->grabbed()){ for(auto touch : touches){ writeTouchUp(touch); @@ -893,9 +877,7 @@ void SystemAPI::touchUp(QList touches){ } auto touch = touches.first(); if(touch->x == NULL_TOUCH_COORD || touch->y == NULL_TOUCH_COORD){ - if(Oxide::debugEnabled()){ - qDebug() << "Invalid touch event"; - } + O_DEBUG("Invalid touch event"); swipeDirection = None; return; } @@ -953,15 +935,11 @@ void SystemAPI::touchUp(QList touches){ touch->x = -1; touch->y = -1; writeTouchUp(touch); - if(Oxide::debugEnabled()){ - qDebug() << "Swipe direction" << swipeDirection; - } + O_DEBUG("Swipe direction" << swipeDirection); } void SystemAPI::touchMove(QList touches){ - if(Oxide::debugEnabled()){ - qDebug() << "MOVE" << touches; - } + O_DEBUG("MOVE" << touches); if(swipeDirection == None){ if(touchHandler->grabbed()){ for(auto touch : touches){ @@ -972,9 +950,7 @@ void SystemAPI::touchMove(QList touches){ return; } if(touches.length() > 1){ - if(Oxide::debugEnabled()){ - qDebug() << "Too many fingers"; - } + O_DEBUG("Too many fingers"); if(touchHandler->grabbed()){ for(auto touch : touches){ writeTouchMove(touch); @@ -991,9 +967,7 @@ void SystemAPI::touchMove(QList touches){ } void SystemAPI::cancelSwipe(Touch* touch){ - if(Oxide::debugEnabled()){ - qDebug() << "Swipe Cancelled"; - } + O_DEBUG("Swipe Cancelled"); swipeDirection = None; touchHandler->ungrab(); writeTouchUp(touch); @@ -1005,9 +979,7 @@ void SystemAPI::writeTouchUp(Touch* touch){ touchHandler->ungrab(); } writeTouchMove(touch); - if(Oxide::debugEnabled()){ - qDebug() << "Write touch up" << touch; - } + O_DEBUG("Write touch up" << touch); int size = sizeof(input_event) * 3; input_event* events = (input_event*)malloc(size); events[0] = DigitizerHandler::createEvent(EV_ABS, ABS_MT_SLOT, touch->slot); @@ -1025,9 +997,7 @@ void SystemAPI::writeTouchMove(Touch* touch){ if(grabbed){ touchHandler->ungrab(); } - if(Oxide::debugEnabled()){ - qDebug() << "Write touch move" << touch; - } + O_DEBUG("Write touch move" << touch); int count = 8; if(touch->x == NULL_TOUCH_COORD){ count--; @@ -1075,7 +1045,7 @@ void SystemAPI::toggleSwipes(){ setSwipeEnabled(Right, state); setSwipeEnabled(Up, state); QString message = state ? "Swipes Enabled" : "Swipes Disabled"; - qDebug() << message; + O_INFO(message); const QString& id = "system-swipe-toggle"; auto notification = notificationAPI->add(id, OXIDE_SERVICE, "tarnish", message, ""); if(notification == nullptr){ diff --git a/applications/system-service/wifiapi.cpp b/applications/system-service/wifiapi.cpp index 061695058..6f4a6a132 100644 --- a/applications/system-service/wifiapi.cpp +++ b/applications/system-service/wifiapi.cpp @@ -24,15 +24,15 @@ WifiAPI::WifiAPI(QObject* parent) }); Oxide::Sentry::sentry_span(t, "sysfs", "Finding wireless devices", [this](Oxide::Sentry::Span* s){ QDir dir("/sys/class/net"); - qDebug() << "Looking for wireless devices..."; + O_DEBUG("Looking for wireless devices..."); for(auto path : dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Readable)){ - qDebug() << (" Checking " + path + "...").toStdString().c_str(); + O_DEBUG((" Checking " + path + "...").toStdString().c_str()); Wlan* item = new Wlan(dir.path() + "/" + path, this); if(!item->hasDirectory("wireless")){ - qDebug() << " Not a wireless device"; + O_DEBUG(" Not a wireless device"); continue; } - qDebug() << " Wireless device found!"; + O_DEBUG(" Wireless device found!"); Oxide::Sentry::sentry_span(s, path.toStdString(), "Connect to wireless device", [this, item]{ wlans.append(item); connect(item, &Wlan::BSSAdded, this, &WifiAPI::BSSAdded, Qt::QueuedConnection); @@ -148,21 +148,21 @@ WifiAPI::WifiAPI(QObject* parent) } WifiAPI::~WifiAPI(){ - qDebug() << "Unregistering all networks"; + O_DEBUG("Unregistering all networks"); while(!networks.isEmpty()){ networks.takeFirst()->deleteLater(); } - qDebug() << "Unregistering all BSSs"; + O_DEBUG("Unregistering all BSSs"); while(!bsss.isEmpty()){ bsss.takeFirst()->deleteLater(); } - qDebug() << "Killing timer"; + O_DEBUG("Killing timer"); timer->stop(); timer->deleteLater(); } void WifiAPI::setEnabled(bool enabled){ - qDebug() << "Wifi API" << enabled; + O_INFO("Wifi API" << enabled); m_enabled = enabled; if(enabled){ for(auto network : networks){ @@ -209,17 +209,17 @@ bool WifiAPI::enable(){ if(!hasPermission("wifi")){ return false; } - qDebug() << "Turning wifi on"; + O_INFO("Turning wifi on"); if(m_state == Off){ setState(Disconnected); } if(system("/usr/sbin/rfkill unblock wifi")){ - qDebug() << "Failed to enable wifi devices"; + O_INFO("Failed to enable wifi devices"); return false; } for(auto wlan : wlans){ if(!wlan->isUp() && !wlan->up()){ - qDebug() << "Failed to enable " + wlan->iface(); + O_INFO("Failed to enable " + wlan->iface()); continue; } } @@ -228,7 +228,7 @@ bool WifiAPI::enable(){ auto state = getCurrentState(); m_state = state; if(state != Online){ - qDebug() << "State:" << state; + O_INFO("State:" << state); reconnect(); } return true; @@ -238,15 +238,15 @@ void WifiAPI::disable(){ if(!hasPermission("wifi")){ return; } - qDebug() << "Turning wifi off"; + O_INFO("Turning wifi off"); setState(Off); for(auto wlan : wlans){ if(wlan->isUp() && !wlan->down()){ - qDebug() << "Failed to disable " + wlan->iface(); + O_INFO("Failed to disable " + wlan->iface()); } } if(system("/usr/sbin/rfkill block wifi")){ - qDebug() << "Failed to disable wifi devices"; + O_INFO("Failed to disable wifi devices"); } flushBSSCache(0); xochitlSettings.set_wifion(false); @@ -344,7 +344,7 @@ void WifiAPI::reconnect(){ if(!hasPermission("wifi")){ return; } - qDebug() << "Reconnecting to wifi"; + O_INFO("Reconnecting to wifi"); QList> replies; for(auto interface : interfaces()){ replies.append(interface->Reconnect()); @@ -546,7 +546,7 @@ void WifiAPI::BSSAdded(Wlan* wlan, const QDBusObjectPath& path, const QVariantMa return; } } - qDebug() << "BSS added " << bssid.toUtf8().toHex() << ssid; + O_DEBUG("BSS added " << bssid.toUtf8().toHex() << ssid); auto bss = new BSS(getPath("bss", bssid), bssid, ssid, this); if(m_enabled){ bss->registerPath(); @@ -599,7 +599,7 @@ void WifiAPI::NetworkAdded(Wlan* wlan, const QDBusObjectPath& path, const QVaria return; } } - qDebug() << "Network added " << ssid; + O_INFO("Network added " << ssid); auto network = new Network(getPath("network", ssid), properties, this); network->addNetwork(path.path(), wlan->interface()); if(m_enabled){ @@ -620,7 +620,7 @@ void WifiAPI::NetworkRemoved(Wlan* wlan, const QDBusObjectPath& path){ i.remove(); emit network->removed(); emit networkRemoved(QDBusObjectPath(network->path())); - qDebug() << "Network removed " << network->ssid(); + O_INFO("Network removed " << network->ssid()); network->deleteLater(); } } @@ -630,7 +630,7 @@ void WifiAPI::NetworkSelected(Wlan* wlan, const QDBusObjectPath& path){ Q_UNUSED(wlan); for(auto network : networks){ if(network->paths().contains(path.path())){ - qDebug() << "Network selected" << path.path(); + O_INFO("Network selected" << path.path()); break; } } @@ -674,7 +674,7 @@ void WifiAPI::InterfaceRemoved(const QDBusObjectPath& path){ if(network->paths().empty()){ emit network->removed(); emit networkRemoved(QDBusObjectPath(network->path())); - qDebug() << "Network removed " << network->ssid(); + O_INFO("Network removed " << network->ssid()); } } wlan->removeInterface(); @@ -701,13 +701,13 @@ void WifiAPI::validateSupplicant(){ QStringList serviceNames = bus.interface()->registeredServiceNames(); if (!serviceNames.contains(WPA_SUPPLICANT_SERVICE)){ if(system("/bin/systemctl --quiet is-active wpa_supplicant")){ - qDebug() << "Starting wpa_supplicant..."; + O_INFO("Starting wpa_supplicant..."); if(system("/bin/systemctl --quiet start wpa_supplicant")){ qCritical() << "Failed to start wpa_supplicant"; throw QException(); } } - qDebug() << "Waiting for wpa_supplicant dbus service..."; + O_INFO("Waiting for wpa_supplicant dbus service..."); while(!serviceNames.contains(WPA_SUPPLICANT_SERVICE)){ struct timespec args{ .tv_sec = 1, @@ -720,16 +720,16 @@ void WifiAPI::validateSupplicant(){ } void WifiAPI::loadNetworks(){ - qDebug() << "Loading networks from settings..."; + O_INFO("Loading networks from settings..."); QList> registeredNetworks = xochitlSettings.wifinetworks().values(); - qDebug() << "Registering networks..."; + O_INFO("Registering networks..."); for(auto registration : registeredNetworks){ bool found = false; auto ssid = registration["ssid"].toString(); auto protocol = registration["protocol"].toString(); for(auto network : networks){ if(network->ssid() == ssid && network->protocol() == protocol){ - qDebug() << " Found network" << network->ssid(); + O_INFO(" Found network" << network->ssid()); found = true; if(network->password() != registration["password"].toString()){ network->setPassword(registration["password"].toString()); @@ -754,10 +754,10 @@ void WifiAPI::loadNetworks(){ } networks.append(network); emit networkAdded(QDBusObjectPath(network->path())); - qDebug() << " Registered network" << ssid; + O_INFO(" Registered network" << ssid); } } - qDebug() << "Loaded networks."; + O_INFO("Loaded networks."); } void WifiAPI::update(){ @@ -772,11 +772,11 @@ void WifiAPI::update(){ } auto path = network().path(); if((state == Online || state == Offline) && m_currentNetwork.path() != path){ - qDebug() << "Connected to" << path; + O_INFO("Connected to" << path); m_currentNetwork.setPath(path); emit networkConnected(m_currentNetwork); }else if((state == Disconnected || state == Off) && m_currentNetwork.path() != "/"){ - qDebug() << "Disconnected from" << m_currentNetwork.path(); + O_INFO("Disconnected from" << m_currentNetwork.path()); m_currentNetwork.setPath("/"); emit disconnected(); } diff --git a/applications/system-service/wlan.cpp b/applications/system-service/wlan.cpp index a3019090c..b92d37d45 100644 --- a/applications/system-service/wlan.cpp +++ b/applications/system-service/wlan.cpp @@ -40,7 +40,7 @@ bool Wlan::up() { return !system(("/sbin/ifconfig " + iface() + " up").toStdStri bool Wlan::down() { return !system(("/sbin/ifconfig " + iface() + " down").toStdString().c_str()); } -bool Wlan::isUp(){ return !system(("/sbin/ip addr show " + iface() + " | /bin/grep UP > /dev/null").toStdString().c_str()); } +bool Wlan::isUp(){ return !system(("/sbin/ip addr show " + iface() + " 2>&1 | /bin/grep UP > /dev/null").toStdString().c_str()); } Interface* Wlan::interface() { return m_interface; } @@ -68,8 +68,12 @@ bool Wlan::pingIP(std::string ip, const char* port) { } bool Wlan::isConnected(){ - auto ip = exec("/sbin/ip r | /bin/grep " + iface() + " | /bin/grep default | /usr/bin/awk '{print $3}'"); - return ip != "" && (pingIP(ip, "53") || pingIP(ip, "80")); + try{ + auto ip = exec("/sbin/ip r | /bin/grep " + iface() + " | /bin/grep default | /usr/bin/awk '{print $3}'"); + return ip != "" && (pingIP(ip, "53") || pingIP(ip, "80")); + }catch(const std::runtime_error&){ + return false; + } } int Wlan::link(){ @@ -84,15 +88,18 @@ int Wlan::link(){ return result; } O_WARNING("SignalPoll error: " << res.error()); - auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $3}'"); - if(QString(out.c_str()).isEmpty()){ - return 0; - } - try { - return std::stoi(out); - } - catch (const std::invalid_argument& e) { - qDebug() << "link failed: " << out.c_str(); + try{ + auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $3}'"); + if(QString(out.c_str()).isEmpty()){ + return 0; + } + try{ + return std::stoi(out); + }catch(const std::invalid_argument& e){ + O_WARNING("link failed: " << out.c_str()); + return 0; + } + }catch(const std::runtime_error&){ return 0; } return -100; @@ -110,15 +117,19 @@ signed int Wlan::rssi(){ return result; } O_WARNING("SignalPoll error: " << res.error()); - auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $4}'"); - if(QString(out.c_str()).isEmpty()){ - return 0; - } - try { - return std::stoi(out); - } - catch (const std::invalid_argument& e) { - qDebug() << "signal failed: " << out.c_str(); + try{ + auto out = exec("/bin/grep " + iface() + " /proc/net/wireless | /usr/bin/awk '{print $4}'"); + if(QString(out.c_str()).isEmpty()){ + return 0; + } + try { + return std::stoi(out); + } + catch (const std::invalid_argument& e) { + O_WARNING("signal failed: " << out.c_str()); + return 0; + } + }catch(const std::runtime_error&){ return 0; } return -100; @@ -159,7 +170,7 @@ std::string Wlan::exec(QString cmd) { std::array buffer; std::string result; std::unique_ptr pipe(popen(cmd.toStdString().c_str(), "r"), pclose); - if (!pipe) { + if(!pipe){ throw std::runtime_error("popen() failed!"); } while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { diff --git a/qmake/common.pri b/qmake/common.pri index b5d623485..fcea1da5c 100644 --- a/qmake/common.pri +++ b/qmake/common.pri @@ -1,4 +1,4 @@ -VERSION = 2.8.2 +VERSION = 2.8.3 !contains(DEFINES, QT_DEPRECATED_WARNINGS){ DEFINES += QT_DEPRECATED_WARNINGS diff --git a/shared/liboxide/debug.h b/shared/liboxide/debug.h index 7a12cec5f..a1647080b 100644 --- a/shared/liboxide/debug.h +++ b/shared/liboxide/debug.h @@ -29,6 +29,12 @@ * \param msg Warning message to log */ #define O_WARNING(msg) if(Oxide::debugEnabled()){ qWarning() << msg; } +/*! + * \def O_INFO(msg) + * \brief Log an informational message + * \param msg Informational message to log + */ +#define O_INFO(msg) qInfo() << msg; namespace Oxide { /*! diff --git a/shared/liboxide/meta.h b/shared/liboxide/meta.h index 1e2038c22..530af2cd8 100644 --- a/shared/liboxide/meta.h +++ b/shared/liboxide/meta.h @@ -30,7 +30,7 @@ * \def OXIDE_VERSION * \brief Version of Tarnish and liboxide */ -#define OXIDE_VERSION "2.8.2" +#define OXIDE_VERSION "2.8.3" /*! * \def OXIDE_INTERFACE_VERSION * \brief Version of Tarnish and liboxide for dbus diff --git a/web/src/faq.rst b/web/src/faq.rst index 45e930c66..f6171d80d 100644 --- a/web/src/faq.rst +++ b/web/src/faq.rst @@ -50,20 +50,6 @@ On 2.5 or earlier you can use the following commands to disable telemetry: Alternatively, you can compile the applications manually without the ``sentry`` feature enabled. -How can I get the time to display in my timezone? -================================================= - -You can use `timedatectl `_ -to change your timezone. You can see available timezones by looking into ``/usr/share/zoneinfo/``. -Do not trust the output of ``timedatectl get-timezones`` as it reports more timezones than are -actually installed on the device by default. You can install more timezones on the device through -`Toltec `_ by installing one of the ``zoneinfo-*`` packages. - -.. code:: bash - - timedatectl set-timezone America/Denver - - I'm installing without `Toltec `_ and nothing displays? =============================================================================== From cc7652dc810ac7551034361dcf19908999bf4551 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 00:16:36 -0600 Subject: [PATCH 69/87] Bump certifi from 2021.10.8 to 2023.7.22 in /web (#365) Bumps [certifi](https://github.com/certifi/python-certifi) from 2021.10.8 to 2023.7.22. - [Commits](https://github.com/certifi/python-certifi/compare/2021.10.08...2023.07.22) --- updated-dependencies: - dependency-name: certifi dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- web/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/requirements.txt b/web/requirements.txt index f5ff7c6ec..c46fad1fd 100644 --- a/web/requirements.txt +++ b/web/requirements.txt @@ -1,6 +1,6 @@ alabaster==0.7.12 Babel==2.9.1 -certifi==2021.10.8 +certifi==2023.7.22 charset-normalizer==2.0.7 colorama==0.4.4 docutils==0.17.1 From 971edb9e0700ddcb74f37a68fec9880587b9ac1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 00:19:22 -0600 Subject: [PATCH 70/87] Bump requests from 2.26.0 to 2.32.2 in /web (#361) Bumps [requests](https://github.com/psf/requests) from 2.26.0 to 2.32.2. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.26.0...v2.32.2) --- updated-dependencies: - dependency-name: requests dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nathaniel van Diepen --- web/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/requirements.txt b/web/requirements.txt index c46fad1fd..9072aba54 100644 --- a/web/requirements.txt +++ b/web/requirements.txt @@ -13,7 +13,7 @@ packaging==21.0 Pygments==2.10.0 pyparsing==2.4.7 pytz==2021.3 -requests==2.26.0 +requests==2.32.2 six==1.16.0 snowballstemmer==2.1.0 Sphinx==4.2.0 From 6f5e6a97f6475e332a172040e1e1f5f6ef472c7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 00:35:52 -0600 Subject: [PATCH 71/87] Bump urllib3 from 1.26.7 to 1.26.19 in /web (#366) Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.7 to 1.26.19. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.7...1.26.19) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nathaniel van Diepen --- web/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/requirements.txt b/web/requirements.txt index 9072aba54..ca245c8f4 100644 --- a/web/requirements.txt +++ b/web/requirements.txt @@ -26,5 +26,5 @@ sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==1.0.3 sphinxcontrib-serializinghtml==1.1.5 tornado==6.1 -urllib3==1.26.7 +urllib3==1.26.19 breathe==4.33.1 From 31f526becba1c9458c0b3de4923a0d5156f907a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 00:39:53 -0600 Subject: [PATCH 72/87] Bump jinja2 from 3.0.2 to 3.1.4 in /web (#362) Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.2 to 3.1.4. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.0.2...3.1.4) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nathaniel van Diepen --- web/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/requirements.txt b/web/requirements.txt index ca245c8f4..1bc0e7ab7 100644 --- a/web/requirements.txt +++ b/web/requirements.txt @@ -6,7 +6,7 @@ colorama==0.4.4 docutils==0.17.1 idna==3.3 imagesize==1.2.0 -Jinja2==3.0.2 +Jinja2==3.1.4 livereload==2.6.3 MarkupSafe==2.0.1 packaging==21.0 From 83914d817325a839d3eda267f9e3746915cfb877 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 00:43:26 -0600 Subject: [PATCH 73/87] Bump the pip group across 2 directories with 3 updates (#369) Bumps the pip group with 1 update in the /shared/sentry/src/tests directory: [black](https://github.com/psf/black). Bumps the pip group with 2 updates in the /web directory: [idna](https://github.com/kjd/idna) and [tornado](https://github.com/tornadoweb/tornado). Updates `black` from 23.3.0 to 24.3.0 - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.3.0...24.3.0) Updates `idna` from 3.3 to 3.7 - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.3...v3.7) Updates `tornado` from 6.1 to 6.4.1 - [Changelog](https://github.com/tornadoweb/tornado/blob/master/docs/releases.rst) - [Commits](https://github.com/tornadoweb/tornado/compare/v6.1.0...v6.4.1) --- updated-dependencies: - dependency-name: black dependency-type: direct:production dependency-group: pip - dependency-name: idna dependency-type: direct:production dependency-group: pip - dependency-name: tornado dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- shared/sentry/src/tests/requirements.txt | 2 +- web/requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/sentry/src/tests/requirements.txt b/shared/sentry/src/tests/requirements.txt index c90370ba0..7b75c7d14 100644 --- a/shared/sentry/src/tests/requirements.txt +++ b/shared/sentry/src/tests/requirements.txt @@ -1,4 +1,4 @@ -black==23.3.0 +black==24.3.0 pytest==7.4.0 pytest-httpserver==1.0.8 msgpack==1.0.5 diff --git a/web/requirements.txt b/web/requirements.txt index 1bc0e7ab7..d7d464dfa 100644 --- a/web/requirements.txt +++ b/web/requirements.txt @@ -4,7 +4,7 @@ certifi==2023.7.22 charset-normalizer==2.0.7 colorama==0.4.4 docutils==0.17.1 -idna==3.3 +idna==3.7 imagesize==1.2.0 Jinja2==3.1.4 livereload==2.6.3 @@ -25,6 +25,6 @@ sphinxcontrib-htmlhelp==2.0.0 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==1.0.3 sphinxcontrib-serializinghtml==1.1.5 -tornado==6.1 +tornado==6.4.1 urllib3==1.26.19 breathe==4.33.1 From 18d385e732b7fb49be662005cd8391e700e43bb1 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 26 Jun 2024 12:58:48 -0600 Subject: [PATCH 74/87] Update sentry to 0.7.6 (#370) --- package | 4 +- shared/sentry/.vscode/extensions.json | 9 - shared/sentry/.vscode/settings.json | 10 - shared/sentry/src/.vscode/extensions.json | 9 - shared/sentry/src/.vscode/settings.json | 10 - shared/sentry/src/CHANGELOG.md | 77 +++ shared/sentry/src/CMakeLists.txt | 63 ++- shared/sentry/src/CONTRIBUTING.md | 1 + shared/sentry/src/README.md | 15 +- shared/sentry/src/examples/example.c | 55 +- .../src/external/crashpad/.github/CODEOWNERS | 2 +- .../crashpad/.github/workflows/build.yml | 58 ++- .../src/external/crashpad/CMakeLists.txt | 18 +- .../crashpad/client/crashpad_client_win.cc | 2 +- .../cmake/scripts/install-llvm-mingw.ps1 | 58 +++ .../cmake/toolchains/mingw_arm64.cmake | 5 + .../external/crashpad/compat/mingw/werapi.h | 6 +- .../crashpad/crashpad-config.cmake.in | 4 +- .../external/crashpad/handler/CMakeLists.txt | 4 +- .../snapshot/win/process_reader_win.cc | 7 +- .../src/external/crashpad/util/CMakeLists.txt | 25 +- .../util/misc/capture_context_win_arm64.S | 74 +++ .../util/net/http_multipart_builder.cc | 5 + .../util/win/exception_handler_server.cc | 35 +- .../external/crashpad/util/win/xp_compat.h | 4 + shared/sentry/src/include/sentry.h | 28 +- shared/sentry/src/ndk/README.md | 75 +++ shared/sentry/src/ndk/build.gradle.kts | 207 ++++++++ shared/sentry/src/ndk/debug.keystore | Bin 0 -> 2473 bytes shared/sentry/src/ndk/gradle.properties | 53 ++ .../src/ndk/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + shared/sentry/src/ndk/gradlew | 249 +++++++++ shared/sentry/src/ndk/gradlew.bat | 92 ++++ shared/sentry/src/ndk/lib/CMakeLists.txt | 17 + .../src/ndk/lib/api/sentry-android-ndk.api | 29 ++ shared/sentry/src/ndk/lib/build.gradle.kts | 132 +++++ shared/sentry/src/ndk/lib/proguard-rules.pro | 22 + .../main/java/io/sentry/ndk/DebugImage.java | 199 +++++++ .../main/java/io/sentry/ndk/INativeScope.java | 18 + .../io/sentry/ndk/NativeModuleListLoader.java | 18 + .../main/java/io/sentry/ndk/NativeScope.java | 55 ++ .../main/java/io/sentry/ndk/NdkOptions.java | 64 +++ .../main/java/io/sentry/ndk/SentryNdk.java | 42 ++ .../sentry/src/ndk/lib/src/main/jni/sentry.c | 489 ++++++++++++++++++ .../ndk/lib/src/main/res/values/public.xml | 4 + shared/sentry/src/ndk/sample/CMakeLists.txt | 18 + shared/sentry/src/ndk/sample/build.gradle.kts | 70 +++ .../sentry/src/ndk/sample/proguard-rules.pro | 34 ++ .../ndk/sample/src/main/AndroidManifest.xml | 18 + .../ndk/sample/src/main/cpp/ndk-sample.cpp | 25 + .../io/sentry/ndk/sample/MainActivity.java | 54 ++ .../java/io/sentry/ndk/sample/NdkSample.java | 11 + .../src/main/res/layout/activity_main.xml | 36 ++ shared/sentry/src/ndk/settings.gradle | 19 + shared/sentry/src/sentry-config.cmake.in | 11 +- .../src/backends/sentry_backend_breakpad.cpp | 4 + .../src/backends/sentry_backend_crashpad.cpp | 94 ++-- .../src/src/backends/sentry_backend_inproc.c | 50 +- .../modulefinder/sentry_modulefinder_linux.c | 10 +- shared/sentry/src/src/sentry_core.c | 40 +- shared/sentry/src/src/sentry_database.c | 8 +- shared/sentry/src/src/sentry_envelope.c | 32 +- shared/sentry/src/src/sentry_envelope.h | 6 + shared/sentry/src/src/sentry_json.c | 4 +- shared/sentry/src/src/sentry_json.h | 6 +- shared/sentry/src/src/sentry_os.c | 147 ++++-- shared/sentry/src/src/sentry_os.h | 15 + shared/sentry/src/src/sentry_session.c | 17 +- shared/sentry/src/src/sentry_session.h | 4 +- shared/sentry/src/src/sentry_tracing.c | 70 ++- shared/sentry/src/src/sentry_transport.c | 87 +++- shared/sentry/src/src/sentry_utils.c | 23 +- shared/sentry/src/src/sentry_utils.h | 20 +- shared/sentry/src/src/sentry_value.c | 40 +- shared/sentry/src/tests/__init__.py | 14 +- shared/sentry/src/tests/assertions.py | 77 ++- shared/sentry/src/tests/cmake.py | 7 +- shared/sentry/src/tests/requirements.txt | 7 +- .../src/tests/test_integration_crashpad.py | 80 ++- .../sentry/src/tests/test_integration_http.py | 126 ++++- .../src/tests/test_integration_stdout.py | 36 +- shared/sentry/src/tests/test_unit.py | 3 + shared/sentry/src/tests/unit/test_envelopes.c | 38 ++ shared/sentry/src/tests/unit/test_tracing.c | 8 +- shared/sentry/src/tests/unit/test_utils.c | 22 +- shared/sentry/src/tests/unit/test_value.c | 21 + shared/sentry/src/tests/unit/tests.inc | 2 + 88 files changed, 3364 insertions(+), 410 deletions(-) delete mode 100644 shared/sentry/.vscode/extensions.json delete mode 100644 shared/sentry/.vscode/settings.json delete mode 100644 shared/sentry/src/.vscode/extensions.json delete mode 100644 shared/sentry/src/.vscode/settings.json create mode 100755 shared/sentry/src/external/crashpad/cmake/scripts/install-llvm-mingw.ps1 create mode 100644 shared/sentry/src/external/crashpad/cmake/toolchains/mingw_arm64.cmake create mode 100644 shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.S create mode 100644 shared/sentry/src/ndk/README.md create mode 100644 shared/sentry/src/ndk/build.gradle.kts create mode 100644 shared/sentry/src/ndk/debug.keystore create mode 100644 shared/sentry/src/ndk/gradle.properties create mode 100644 shared/sentry/src/ndk/gradle/wrapper/gradle-wrapper.jar create mode 100644 shared/sentry/src/ndk/gradle/wrapper/gradle-wrapper.properties create mode 100755 shared/sentry/src/ndk/gradlew create mode 100644 shared/sentry/src/ndk/gradlew.bat create mode 100644 shared/sentry/src/ndk/lib/CMakeLists.txt create mode 100644 shared/sentry/src/ndk/lib/api/sentry-android-ndk.api create mode 100644 shared/sentry/src/ndk/lib/build.gradle.kts create mode 100644 shared/sentry/src/ndk/lib/proguard-rules.pro create mode 100644 shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/DebugImage.java create mode 100644 shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java create mode 100644 shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeModuleListLoader.java create mode 100644 shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java create mode 100644 shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NdkOptions.java create mode 100644 shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java create mode 100644 shared/sentry/src/ndk/lib/src/main/jni/sentry.c create mode 100644 shared/sentry/src/ndk/lib/src/main/res/values/public.xml create mode 100644 shared/sentry/src/ndk/sample/CMakeLists.txt create mode 100644 shared/sentry/src/ndk/sample/build.gradle.kts create mode 100644 shared/sentry/src/ndk/sample/proguard-rules.pro create mode 100644 shared/sentry/src/ndk/sample/src/main/AndroidManifest.xml create mode 100644 shared/sentry/src/ndk/sample/src/main/cpp/ndk-sample.cpp create mode 100644 shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/MainActivity.java create mode 100644 shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/NdkSample.java create mode 100644 shared/sentry/src/ndk/sample/src/main/res/layout/activity_main.xml create mode 100644 shared/sentry/src/ndk/settings.gradle diff --git a/package b/package index ea416e9b9..58643334e 100644 --- a/package +++ b/package @@ -5,7 +5,7 @@ pkgnames=(oxide oxide-extra oxide-utils inject_evdev liboxide liboxide-dev libsentry) _oxidever=$(grep 'VERSION =' qmake/common.pri | awk '{print $3}') pkgver="$_oxidever~VERSION~" -_sentryver=0.7.0 +_sentryver=0.7.6 timestamp="$(date -u +%Y-%m-%dT%H:%MZ)" maintainer="Eeems " url=https://oxide.eeems.codes @@ -165,7 +165,7 @@ libsentry() { section="devel" url=https://github.com/getsentry/sentry-native pkgver="$_sentryver" - timestamp="2021-12-20T14:25:11Z" + timestamp="2024-06-12T08:04:15Z" package() { install -D -m 755 -t "$pkgdir"/opt/lib "$srcdir"/release/opt/lib/libsentry.so diff --git a/shared/sentry/.vscode/extensions.json b/shared/sentry/.vscode/extensions.json deleted file mode 100644 index 3b2ac6a0f..000000000 --- a/shared/sentry/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "ms-vscode.cpptools", - "ms-vscode.cmake-tools", - "twxs.cmake" - ] -} diff --git a/shared/sentry/.vscode/settings.json b/shared/sentry/.vscode/settings.json deleted file mode 100644 index e4f9a033c..000000000 --- a/shared/sentry/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "editor.formatOnPaste": true, - "editor.formatOnSave": true, - "editor.formatOnType": true, - "files.trimTrailingWhitespace": true, - "files.insertFinalNewline": true, - - // C++ Extension - "C_Cpp.autoAddFileAssociations": false -} diff --git a/shared/sentry/src/.vscode/extensions.json b/shared/sentry/src/.vscode/extensions.json deleted file mode 100644 index 3b2ac6a0f..000000000 --- a/shared/sentry/src/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "ms-vscode.cpptools", - "ms-vscode.cmake-tools", - "twxs.cmake" - ] -} diff --git a/shared/sentry/src/.vscode/settings.json b/shared/sentry/src/.vscode/settings.json deleted file mode 100644 index e4f9a033c..000000000 --- a/shared/sentry/src/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "editor.formatOnPaste": true, - "editor.formatOnSave": true, - "editor.formatOnType": true, - "files.trimTrailingWhitespace": true, - "files.insertFinalNewline": true, - - // C++ Extension - "C_Cpp.autoAddFileAssociations": false -} diff --git a/shared/sentry/src/CHANGELOG.md b/shared/sentry/src/CHANGELOG.md index dcaaf1ebf..42f07718f 100644 --- a/shared/sentry/src/CHANGELOG.md +++ b/shared/sentry/src/CHANGELOG.md @@ -1,5 +1,81 @@ # Changelog +## 0.7.6 + +**Fixes**: + +- Remove remaining build blockers for the `crashpad` backend on Windows ARM64 when using LLVM-MINGW. ([#1003](https://github.com/getsentry/sentry-native/pull/1003), [crashpad#101](https://github.com/getsentry/crashpad/pull/101)) +- Ensure `crashpad` targets are included when building as a shared library using our exported CMake config. ([#1007](https://github.com/getsentry/sentry-native/pull/1007)) +- Use `find_dependency()` instead of `find_package()` in the exported CMake config. ([#1007](https://github.com/getsentry/sentry-native/pull/1007), [#1008](https://github.com/getsentry/sentry-native/pull/1008), [crashpad#104](https://github.com/getsentry/crashpad/pull/104)) + +**Thank you**: + +- [@past-due](https://github.com/past-due) +- [@podlaszczyk](https://github.com/podlaszczyk) + +## 0.7.5 + +**Features**: + +- Change the timestamp resolution to microseconds. ([#995](https://github.com/getsentry/sentry-native/pull/995)) + +**Internal**: + +- (Android) Switch ndk back to `libc++_static`, and hide it from prefab ([#996](https://github.com/getsentry/sentry-native/pull/996)) + +## 0.7.4 + +**Fixes**: + +- Allow `crashpad` to run under [Epic's Anti-Cheat Client](https://dev.epicgames.com/docs/game-services/anti-cheat/using-anti-cheat#external-crash-dumpers) by deferring the full `crashpad_handler` access rights to the client application until a crash occurred. ([#980](https://github.com/getsentry/sentry-native/pull/980), [crashpad#99](https://github.com/getsentry/crashpad/pull/99)) +- Reserve enough stack space on Windows for our handler to run when the stack is exhausted from stack-overflow. ([#982](https://github.com/getsentry/sentry-native/pull/982)) +- Only configure a `sigaltstack` in `inproc` if no previous configuration exists on Linux and Android. ([#982](https://github.com/getsentry/sentry-native/pull/982)) +- Store transaction `data` in the event property `extra` since the `data` property is discarded by `relay`. ([#986](https://github.com/getsentry/sentry-native/issues/986)) + +**Docs**: + +- Add compile-time flag `SENTRY_TRANSPORT_COMPRESSION` description to the `README.md` file. ([#976](https://github.com/getsentry/sentry-native/pull/976)) + +**Internal**: + +- Move sentry-android-ndk JNI related parts from sentry-java to sentry-native ([#944](https://github.com/getsentry/sentry-native/pull/944)) + This will create a pre-built `io.sentry:sentry-native-ndk` maven artifact, suitable for being consumed by Android apps. + +**Thank you**: + +- [@AenBleidd](https://github.com/AenBleidd) +- [@kristjanvalur](https://github.com/kristjanvalur) + +## 0.7.2 + +**Features**: + +- Add optional Gzip transport compression via build option `SENTRY_TRANSPORT_COMPRESSION`. Requires system `zlib`. ([#954](https://github.com/getsentry/sentry-native/pull/954)) +- Enable automatic MIME detection of attachments sent with crash-reports from the `crashpad_handler`. ([#973](https://github.com/getsentry/sentry-native/pull/973), [crashpad#98](https://github.com/getsentry/crashpad/pull/98)) + +**Fixes**: + +- Fix the Linux build when targeting RISC-V. ([#972](https://github.com/getsentry/sentry-native/pull/972)) + +**Thank you**: + +- [@Strive-Sun](https://github.com/Strive-Sun) +- [@jwinarske](https://github.com/jwinarske) + +## 0.7.1 + +**Features**: + +- Add user feedback capability to the Native SDK. ([#966](https://github.com/getsentry/sentry-native/pull/966)) + +**Internal**: + +- Remove the `CRASHPAD_WER_ENABLED` build flag. The WER module is now built for all supported Windows targets, and registration is conditional on runtime Windows version checks. ([#950](https://github.com/getsentry/sentry-native/pull/950), [crashpad#96](https://github.com/getsentry/crashpad/pull/96)) + +**Docs**: + +- Add usage of the breadcrumb `data` property to the example. [#951](https://github.com/getsentry/sentry-native/pull/951) + ## 0.7.0 **Breaking changes**: @@ -25,6 +101,7 @@ Features, fixes and improvements in this release have been contributed by: - [@compnerd](https://github.com/compnerd) - [@stima](https://github.com/stima) +- [@hyp](https://github.com/hyp) ## 0.6.7 diff --git a/shared/sentry/src/CMakeLists.txt b/shared/sentry/src/CMakeLists.txt index 8e460cded..00ac137ab 100644 --- a/shared/sentry/src/CMakeLists.txt +++ b/shared/sentry/src/CMakeLists.txt @@ -55,6 +55,8 @@ endif() option(SENTRY_PIC "Build sentry (and dependent) libraries as position independent libraries" ON) +option(SENTRY_TRANSPORT_COMPRESSION "Enable transport gzip compression" OFF) + option(SENTRY_BUILD_TESTS "Build sentry-native tests" "${SENTRY_MAIN_PROJECT}") option(SENTRY_BUILD_EXAMPLES "Build sentry-native example(s)" "${SENTRY_MAIN_PROJECT}") @@ -278,17 +280,20 @@ if(SENTRY_TRANSPORT_CURL) find_package(CURL REQUIRED COMPONENTS AsynchDNS) endif() - if(TARGET CURL::libcurl) # Only available in cmake 3.12+ - target_link_libraries(sentry PRIVATE CURL::libcurl) - else() - # Needed for cmake < 3.12 support (cmake 3.12 introduced the target CURL::libcurl) - target_include_directories(sentry PRIVATE ${CURL_INCLUDE_DIR}) - # The exported sentry target must not contain any path of the build machine, therefore use generator expressions - string(REPLACE ";" "$" GENEX_CURL_LIBRARIES "${CURL_LIBRARIES}") - string(REPLACE ";" "$" GENEX_CURL_COMPILE_DEFINITIONS "${CURL_COMPILE_DEFINITIONS}") - target_link_libraries(sentry PRIVATE $) - target_compile_definitions(sentry PRIVATE $) + target_link_libraries(sentry PRIVATE CURL::libcurl) +endif() + +if(SENTRY_TRANSPORT_COMPRESSION) + if(NOT ZLIB_FOUND) + find_package(ZLIB REQUIRED) endif() + + if(SENTRY_BACKEND_CRASHPAD) + set(CRASHPAD_ZLIB_SYSTEM ON CACHE BOOL "Force CRASHPAD_ZLIB_SYSTEM when enabling transport compression" FORCE) + endif() + + target_link_libraries(sentry PRIVATE ZLIB::ZLIB) + target_compile_definitions(sentry PRIVATE SENTRY_TRANSPORT_COMPRESSION) endif() set_property(TARGET sentry PROPERTY C_VISIBILITY_PRESET hidden) @@ -413,9 +418,6 @@ if(SENTRY_WITH_LIBUNWINDSTACK) endif() if(SENTRY_BACKEND_CRASHPAD) - # FIXME: required for cmake 3.12 and lower: - # - NEW behavior lets normal variable override option - cmake_policy(SET CMP0077 NEW) if(SENTRY_BUILD_SHARED_LIBS) set(CRASHPAD_ENABLE_INSTALL OFF CACHE BOOL "Enable crashpad installation" FORCE) else() @@ -423,7 +425,7 @@ if(SENTRY_BACKEND_CRASHPAD) endif() add_subdirectory(external/crashpad crashpad_build) - if(CRASHPAD_WER_ENABLED) + if(WIN32) add_dependencies(sentry crashpad::wer) endif() @@ -438,9 +440,7 @@ if(SENTRY_BACKEND_CRASHPAD) set_property(TARGET crashpad_snapshot PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") set_property(TARGET crashpad_tools PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") set_property(TARGET crashpad_util PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - if(CRASHPAD_WER_ENABLED) - set_property(TARGET crashpad_wer PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - endif() + set_property(TARGET crashpad_wer PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") set_property(TARGET crashpad_zlib PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") set_property(TARGET mini_chromium PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() @@ -457,9 +457,7 @@ if(SENTRY_BACKEND_CRASHPAD) set_target_properties(crashpad_util PROPERTIES FOLDER ${SENTRY_FOLDER}) set_target_properties(crashpad_zlib PROPERTIES FOLDER ${SENTRY_FOLDER}) set_target_properties(mini_chromium PROPERTIES FOLDER ${SENTRY_FOLDER}) - if(CRASHPAD_WER_ENABLED) - set_target_properties(crashpad_wer PROPERTIES FOLDER ${SENTRY_FOLDER}) - endif() + set_target_properties(crashpad_wer PROPERTIES FOLDER ${SENTRY_FOLDER}) endif() target_link_libraries(sentry PRIVATE @@ -472,16 +470,10 @@ if(SENTRY_BACKEND_CRASHPAD) if(WIN32 AND MSVC) sentry_install(FILES $ DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) - if (CRASHPAD_WER_ENABLED) - sentry_install(FILES $ - DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) - endif() + sentry_install(FILES $ + DESTINATION "${CMAKE_INSTALL_BINDIR}" OPTIONAL) endif() add_dependencies(sentry crashpad::handler) - - if(CRASHPAD_WER_ENABLED) - add_compile_definitions(CRASHPAD_WER_ENABLED) - endif() elseif(SENTRY_BACKEND_BREAKPAD) option(SENTRY_BREAKPAD_SYSTEM "Use system breakpad" OFF) if(SENTRY_BREAKPAD_SYSTEM) @@ -574,11 +566,14 @@ if(SENTRY_BUILD_EXAMPLES) target_link_libraries(sentry_example PRIVATE sentry) if(MSVC) - target_compile_options(sentry_example PRIVATE $) - if(CRASHPAD_WER_ENABLED) - # to test handling SEH by-passing exceptions we need to enable the control flow guard - target_compile_options(sentry_example PRIVATE $) - endif() + target_compile_options(sentry_example PRIVATE $) + + # to test handling SEH by-passing exceptions we need to enable the control flow guard + target_compile_options(sentry_example PRIVATE $) + else() + # Disable all optimizations for the `sentry_example` in gcc/clang. This allows us to keep crash triggers simple. + # The effects besides reproducible code-gen across compiler versions, will be negligible for build- and runtime. + target_compile_options(sentry_example PRIVATE $) endif() # set static runtime if enabled @@ -604,4 +599,4 @@ endif() if(SENTRY_BUILD_SHARED_LIBS) target_link_libraries(sentry PRIVATE "$<$,$>:-Wl,--build-id=sha1,--version-script=${PROJECT_SOURCE_DIR}/src/exports.map>") -endif() \ No newline at end of file +endif() diff --git a/shared/sentry/src/CONTRIBUTING.md b/shared/sentry/src/CONTRIBUTING.md index 2af86e966..4678c4d74 100644 --- a/shared/sentry/src/CONTRIBUTING.md +++ b/shared/sentry/src/CONTRIBUTING.md @@ -145,6 +145,7 @@ The example currently supports the following commands: - `on-crash`: Installs an `on_crash()` callback that retains the crash event. - `discarding-on-crash`: Installs an `on_crash()` callback that discards the crash event. - `override-sdk-name`: Changes the SDK name via the options at runtime. +- `stack-overflow`: Provokes a stack-overflow. Only on Windows using crashpad with its WER handler module: diff --git a/shared/sentry/src/README.md b/shared/sentry/src/README.md index 3c809b50c..b3223d6cf 100644 --- a/shared/sentry/src/README.md +++ b/shared/sentry/src/README.md @@ -17,6 +17,10 @@ applications, optimized for C and C++. Sentry allows to add tags, breadcrumbs and arbitrary custom context to enrich error reports. Supports Sentry _20.6.0_ and later. +### Note + +Using the `sentry-native` SDK in a standalone use case is currently an experimental feature. The SDK’s primary function is to fuel our other SDKs, like [`sentry-java`](https://github.com/getsentry/sentry-java) or [`sentry-unreal`](https://github.com/getsentry/sentry-unreal). Support from our side is best effort and we do what we can to respond to issues in a timely fashion, but please understand if we won’t be able to address your issues or feature suggestions. + ## Resources - [SDK Documentation](https://docs.sentry.io/platforms/native/) @@ -52,6 +56,7 @@ The SDK bundle contains the following folders: directory or copy the header file to your source tree so that it is available during the build. - `src`: Sources of the Sentry SDK required for building. +- `ndk`: Sources for the Android NDK JNI layer. ## Platform and Feature Support @@ -118,11 +123,14 @@ Please refer to the CMake Manual for more details. **Android**: The CMake project can also be configured to correctly work with the Android NDK, -see the dedicated [CMake Guide] for details on how to integrate it with gradle +see the dedicated [CMake Guide] for details on how to integrate it with Gradle or use it on the command line. +The `ndk` folder provides Gradle project which adds a Java JNI layer for Android, suitable for accessing the sentry-native SDK from Java. See the [NDK Readme] for more details about this topic. + [cmake]: https://cmake.org/cmake/help/latest/ [cmake guide]: https://developer.android.com/ndk/guides/cmake +[NDK Readme]: ndk/README.md **MinGW**: @@ -239,7 +247,10 @@ using `cmake -D BUILD_SHARED_LIBS=OFF ..`. Builds the Qt integration, which turns Qt log messages into breadcrumbs. - `SENTRY_BREAKPAD_SYSTEM` (Default: OFF): - This instructs the build system to use system-installed breakpad libraries instead of using the in-tree version. + This instructs the build system to use system-installed breakpad libraries instead of using the in-tree version. + +- `SENTRY_TRANSPORT_COMPRESSION` (Default: OFF): + Adds Gzip transport compression. Requires `zlib`. | Feature | Windows | macOS | Linux | Android | iOS | | ---------- | ------- | ----- | ----- | ------- | --- | diff --git a/shared/sentry/src/examples/example.c b/shared/sentry/src/examples/example.c index 7e1b71b0c..42e76231e 100644 --- a/shared/sentry/src/examples/example.c +++ b/shared/sentry/src/examples/example.c @@ -9,17 +9,22 @@ #include #include #include + #ifdef NDEBUG # undef NDEBUG #endif + #include #ifdef SENTRY_PLATFORM_WINDOWS +# include # include # define sleep_s(SECONDS) Sleep((SECONDS)*1000) #else + # include # include + # define sleep_s(SECONDS) sleep(SECONDS) #endif @@ -93,7 +98,9 @@ has_arg(int argc, char **argv, const char *arg) return false; } -#ifdef CRASHPAD_WER_ENABLED +#if defined(SENTRY_PLATFORM_WINDOWS) && !defined(__MINGW32__) \ + && !defined(__MINGW64__) + int call_rffe_many_times() { @@ -138,7 +145,7 @@ trigger_fastfail_crash() __fastfail(77); } -#endif // CRASHPAD_WER_ENABLED +#endif #ifdef SENTRY_PLATFORM_AIX // AIX has a null page mapped to the bottom of memory, which means null derefs @@ -155,6 +162,13 @@ trigger_crash() memset((char *)invalid_mem, 1, 100); } +static void +trigger_stack_overflow() +{ + alloca(1024); + trigger_stack_overflow(); +} + int main(int argc, char **argv) { @@ -258,6 +272,21 @@ main(int argc, char **argv) debug_crumb, "category", sentry_value_new_string("example!")); sentry_value_set_by_key( debug_crumb, "level", sentry_value_new_string("debug")); + + // extend the `http` crumb with (optional) data properties as documented + // here: + // https://develop.sentry.dev/sdk/event-payloads/breadcrumbs/#breadcrumb-types + sentry_value_t http_data = sentry_value_new_object(); + sentry_value_set_by_key(http_data, "url", + sentry_value_new_string("https://example.com/api/1.0/users")); + sentry_value_set_by_key( + http_data, "method", sentry_value_new_string("GET")); + sentry_value_set_by_key( + http_data, "status_code", sentry_value_new_int32(200)); + sentry_value_set_by_key( + http_data, "reason", sentry_value_new_string("OK")); + sentry_value_set_by_key(debug_crumb, "data", http_data); + sentry_add_breadcrumb(debug_crumb); sentry_value_t nl_crumb @@ -301,7 +330,11 @@ main(int argc, char **argv) if (has_arg(argc, argv, "crash")) { trigger_crash(); } -#ifdef CRASHPAD_WER_ENABLED + if (has_arg(argc, argv, "stack-overflow")) { + trigger_stack_overflow(); + } +#if defined(SENTRY_PLATFORM_WINDOWS) && !defined(__MINGW32__) \ + && !defined(__MINGW64__) if (has_arg(argc, argv, "fastfail")) { trigger_fastfail_crash(); } @@ -343,6 +376,16 @@ main(int argc, char **argv) sentry_capture_event(event); } + if (has_arg(argc, argv, "capture-user-feedback")) { + sentry_value_t event = sentry_value_new_message_event( + SENTRY_LEVEL_INFO, "my-logger", "Hello user feedback!"); + sentry_uuid_t event_id = sentry_capture_event(event); + + sentry_value_t user_feedback = sentry_value_new_user_feedback( + &event_id, "some-name", "some-email", "some-comment"); + + sentry_capture_user_feedback(user_feedback); + } if (has_arg(argc, argv, "capture-transaction")) { sentry_transaction_context_t *tx_ctx @@ -355,6 +398,9 @@ main(int argc, char **argv) sentry_transaction_t *tx = sentry_transaction_start(tx_ctx, sentry_value_new_null()); + sentry_transaction_set_data( + tx, "url", sentry_value_new_string("https://example.com")); + if (has_arg(argc, argv, "error-status")) { sentry_transaction_set_status( tx, SENTRY_SPAN_STATUS_INTERNAL_ERROR); @@ -366,6 +412,9 @@ main(int argc, char **argv) sentry_span_t *grandchild = sentry_span_start_child(child, "littlest.teapot", NULL); + sentry_span_set_data( + child, "span_data_says", sentry_value_new_string("hi!")); + if (has_arg(argc, argv, "error-status")) { sentry_span_set_status(child, SENTRY_SPAN_STATUS_NOT_FOUND); sentry_span_set_status( diff --git a/shared/sentry/src/external/crashpad/.github/CODEOWNERS b/shared/sentry/src/external/crashpad/.github/CODEOWNERS index 7afbb99cb..ad4ca0632 100644 --- a/shared/sentry/src/external/crashpad/.github/CODEOWNERS +++ b/shared/sentry/src/external/crashpad/.github/CODEOWNERS @@ -1 +1 @@ -* @getsentry/owners-native +* @getsentry/processing diff --git a/shared/sentry/src/external/crashpad/.github/workflows/build.yml b/shared/sentry/src/external/crashpad/.github/workflows/build.yml index 5161a689e..c622d9563 100644 --- a/shared/sentry/src/external/crashpad/.github/workflows/build.yml +++ b/shared/sentry/src/external/crashpad/.github/workflows/build.yml @@ -11,10 +11,33 @@ jobs: strategy: fail-fast: false matrix: - platform: [ubuntu-latest, windows-latest, macos-latest] + include: + - name: Ubuntu + platform: ubuntu-latest + - name: Windows (x64) + platform: windows-latest + - name: Windows (arm64) + platform: windows-latest + CMAKE_DEFINES: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/win_arm64.cmake -A arm64 + - name: LLVM-MINGW (x64) + platform: windows-latest + MINGW: 1 + MINGW_PKG_PREFIX: x86_64-w64-mingw32 + MINGW_ASM_MASM_COMPILER: llvm-ml;-m64 + CMAKE_DEFINES: -DCRASHPAD_ZLIB_SYSTEM=OFF -DCRASHPAD_BUILD_TOOLS=OFF -G Ninja + - name: LLVM-MINGW (arm64) + platform: windows-latest + MINGW: 1 + MINGW_PKG_PREFIX: aarch64-w64-mingw32 + CMAKE_DEFINES: -DCRASHPAD_ZLIB_SYSTEM=OFF -DCRASHPAD_BUILD_TOOLS=OFF -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/mingw_arm64.cmake -G Ninja + - name: macOS + platform: macos-latest + name: ${{ matrix.name }} runs-on: ${{ matrix.platform }} + env: + CMAKE_DEFINES: ${{ matrix.CMAKE_DEFINES }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: submodules: "recursive" @@ -24,32 +47,33 @@ jobs: sudo apt update sudo apt install zlib1g-dev libcurl4-openssl-dev libssl-dev libunwind-dev pkg-config + - name: Installing LLVM-MINGW Dependencies + if: ${{ runner.os == 'Windows' && matrix.MINGW == '1' }} + shell: powershell + env: + MINGW_PKG_PREFIX: ${{ matrix.MINGW_PKG_PREFIX }} + MINGW_ASM_MASM_COMPILER: ${{ matrix.MINGW_ASM_MASM_COMPILER }} + run: . "cmake\scripts\install-llvm-mingw.ps1" + - name: Build crashpad + shell: bash run: | - cmake -B cmake-build -D CRASHPAD_BUILD_TOOLS=On + echo "CMAKE_DEFINES=${CMAKE_DEFINES}" + cmake -B cmake-build -D CRASHPAD_BUILD_TOOLS=On ${CMAKE_DEFINES} cmake --build cmake-build --parallel - name: Build crashpad with client-side stack traces + shell: bash run: | - cmake -B cmake-build-stacks -D CRASHPAD_ENABLE_STACKTRACE=ON + echo "CMAKE_DEFINES=${CMAKE_DEFINES}" + cmake -B cmake-build-stacks -D CRASHPAD_ENABLE_STACKTRACE=ON ${CMAKE_DEFINES} cmake --build cmake-build-stacks --parallel - - name: Build crashpad Windows ARM64 - if: ${{ runner.os == 'Windows' }} - run: | - cmake -B cmake-build-arm64 -DCMAKE_TOOLCHAIN_FILE="cmake/toolchains/win_arm64.cmake" -DCRASHPAD_BUILD_TOOLS=On - cmake --build cmake-build-arm64 --config RelWithDebInfo -- /p:Platform=ARM64 - - - name: Build crashpad with client-side stack traces Windows ARM64 - if: ${{ runner.os == 'Windows' }} - run: | - cmake -B cmake-build-stacks-arm64 -DCMAKE_TOOLCHAIN_FILE="cmake/toolchains/win_arm64.cmake" -DCRASHPAD_ENABLE_STACKTRACE=ON - cmake --build cmake-build-stacks-arm64 --config RelWithDebInfo -- /p:Platform=ARM64 - build-ios: + name: 'iOS' runs-on: macos-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: submodules: "recursive" - run: | diff --git a/shared/sentry/src/external/crashpad/CMakeLists.txt b/shared/sentry/src/external/crashpad/CMakeLists.txt index 79edcfafc..edf23ce25 100644 --- a/shared/sentry/src/external/crashpad/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/CMakeLists.txt @@ -21,7 +21,7 @@ else() endif() option(CRASHPAD_ZLIB_SYSTEM "Use system zlib library" "${CRASHPAD_ZLIB_SYSTEM_DEFAULT}") -if(CRASHPAD_ZLIB_SYSTEM) +if(CRASHPAD_ZLIB_SYSTEM AND NOT ZLIB_FOUND) find_package(ZLIB REQUIRED) endif() @@ -49,7 +49,7 @@ function(crashpad_install_dev) endif() endfunction() -if(WIN32) +if(WIN32 AND NOT (MINGW AND "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "[Aa][Rr][Mm]64")) if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES ARM64) enable_language(ASM_MARMASM) else() @@ -123,24 +123,10 @@ if(MSVC) $<$:/wd4577> # 'noexcept' used with no exception handling mode specified. $<$:/wd4996> # 'X' was declared deprecated. ) - - # WER support is only available starting from Win10 build 10941 - if("${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" VERSION_LESS 10.0.19041) - message(STATUS "WER support disabled. Needs target platform >= 10.0.19041 (actual: ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION})") - else() - SET(CRASHPAD_WER_ENABLED TRUE) - SET(CRASHPAD_WER_ENABLED TRUE PARENT_SCOPE) - message(STATUS "WER support enabled") - endif() elseif(MINGW) # redirect to wmain # FIXME: cmake 3.13 added target_link_options set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode") - if(CRASHPAD_WER_ENABLED) - message(STATUS "WER support enabled") - else() - message(STATUS "WER support disabled. Define CRASHPAD_WER_ENABLED = TRUE to enable.") - endif() endif() add_library(crashpad::interface ALIAS crashpad_interface) diff --git a/shared/sentry/src/external/crashpad/client/crashpad_client_win.cc b/shared/sentry/src/external/crashpad/client/crashpad_client_win.cc index fa87ef996..cd1b206b0 100644 --- a/shared/sentry/src/external/crashpad/client/crashpad_client_win.cc +++ b/shared/sentry/src/external/crashpad/client/crashpad_client_win.cc @@ -438,7 +438,7 @@ bool StartHandlerProcess( } ScopedKernelHANDLE this_process( - OpenProcess(kXPProcessAllAccess, true, GetCurrentProcessId())); + OpenProcess(kXPProcessLimitedAccess, true, GetCurrentProcessId())); if (!this_process.is_valid()) { PLOG(ERROR) << "OpenProcess"; return false; diff --git a/shared/sentry/src/external/crashpad/cmake/scripts/install-llvm-mingw.ps1 b/shared/sentry/src/external/crashpad/cmake/scripts/install-llvm-mingw.ps1 new file mode 100755 index 000000000..3e6d40e08 --- /dev/null +++ b/shared/sentry/src/external/crashpad/cmake/scripts/install-llvm-mingw.ps1 @@ -0,0 +1,58 @@ +Start-Sleep -Milliseconds 1 # See: https://stackoverflow.com/a/49859001 + +$LLVM_MINGW_RELEASE = "20240518"; +$LLVM_MINGW_PKG = "llvm-mingw-${LLVM_MINGW_RELEASE}-ucrt-x86_64" +$LLVM_MINGW_DL_URL = "https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_RELEASE}/${LLVM_MINGW_PKG}.zip" +$LLVM_MINGW_DL_SHA512 = "4758b41533930f9b4d646f60406f37a644dedd662d0adb8586f544c1b875fc86ece51ce2bb7b060075c3d081533f1a7aafa816ccdee2101e507aa047024d8d3f" +$DL_BASEDIR = "$env:GITHUB_WORKSPACE\dl" +$LLVM_MINGW_DL_PATH = "${DL_BASEDIR}\llvm-mingw.zip" +if (!(Test-Path -Path "$DL_BASEDIR")) { New-Item -ItemType Directory -Force -Path "$DL_BASEDIR" } + +# Download LLVM-mingw +$CurlArguments = '-s', '-Lf', '-o', "${LLVM_MINGW_DL_PATH}", "${LLVM_MINGW_DL_URL}" +& curl.exe @CurlArguments +$dl_zip_hash = Get-FileHash -LiteralPath "${LLVM_MINGW_DL_PATH}" -Algorithm SHA512 +if ($dl_zip_hash.Hash -eq $LLVM_MINGW_DL_SHA512) { + Write-Host "Successfully downloaded LLVM-mingw .zip" +} +Else { + Write-Error "The downloaded LLVM-mingw zip hash '$($dl_zip_hash.Hash)' does not match the expected hash: '$LLVM_MINGW_DL_SHA512'" +} + +# Extract LLVM-mingw +Write-Host "Extracting LLVM-mingw..." +$LLVM_MINGW_INSTALL_PATH = "$env:GITHUB_WORKSPACE\buildtools\llvm-mingw" +New-Item -ItemType Directory -Force -Path "${LLVM_MINGW_INSTALL_PATH}" +Expand-Archive -LiteralPath "${LLVM_MINGW_DL_PATH}" -DestinationPath "${LLVM_MINGW_INSTALL_PATH}" +# Export the LLVM-mingw install path +$LLVM_MINGW_INSTALL_PATH = "${LLVM_MINGW_INSTALL_PATH}\${LLVM_MINGW_PKG}" +"LLVM_MINGW_INSTALL_PATH=${LLVM_MINGW_INSTALL_PATH}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append +# Prepend bin path to the system PATH +Write-Host "Path to LLVM-mingw bin folder: ${LLVM_MINGW_INSTALL_PATH}\bin" +"${LLVM_MINGW_INSTALL_PATH}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + +# Download ninja-build +$NINJA_DL_URL = "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-win.zip" +$NINJA_DL_SHA512 = "d6715c6458d798bcb809f410c0364dabd937b5b7a3ddb4cd5aba42f9fca45139b2a8a3e7fd9fbd88fd75d298ed99123220b33c7bdc8966a9d5f2a1c9c230955f" +$NINJA_DL_PATH = "${DL_BASEDIR}\ninja-win.zip" +$CurlArguments = '-s', '-Lf', '-o', "${NINJA_DL_PATH}", "${NINJA_DL_URL}" +& curl.exe @CurlArguments +$ninja_zip_hash = Get-FileHash -LiteralPath "${NINJA_DL_PATH}" -Algorithm SHA512 +if ($ninja_zip_hash.Hash -eq $NINJA_DL_SHA512) { + Write-Host "Successfully downloaded Ninja-Build .zip" +} +Else { + Write-Error "The downloaded Ninja-build zip hash '$($ninja_zip_hash.Hash)' does not match the expected hash: '$NINJA_DL_SHA512'" +} + +Write-Host "Extracting Ninja-Build..." +$NINJA_INSTALL_PATH = "$env:GITHUB_WORKSPACE\buildtools\ninja" +New-Item -ItemType Directory -Force -Path "${NINJA_INSTALL_PATH}" +Expand-Archive -LiteralPath "${NINJA_DL_PATH}" -DestinationPath "${NINJA_INSTALL_PATH}" + +# Export the NINJA executable path +"NINJA_INSTALL_PATH=${NINJA_INSTALL_PATH}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append +"PATH=${NINJA_INSTALL_PATH}; $env:PATH" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + +# export CMAKE_DEFINES to the runner environment +"CMAKE_DEFINES=${env:CMAKE_DEFINES} -DCMAKE_C_COMPILER=${env:MINGW_PKG_PREFIX}-gcc -DCMAKE_CXX_COMPILER=${env:MINGW_PKG_PREFIX}-g++ -DCMAKE_RC_COMPILER=${env:MINGW_PKG_PREFIX}-windres -DCMAKE_ASM_MASM_COMPILER=${env:MINGW_ASM_MASM_COMPILER}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append \ No newline at end of file diff --git a/shared/sentry/src/external/crashpad/cmake/toolchains/mingw_arm64.cmake b/shared/sentry/src/external/crashpad/cmake/toolchains/mingw_arm64.cmake new file mode 100644 index 000000000..de26e51a8 --- /dev/null +++ b/shared/sentry/src/external/crashpad/cmake/toolchains/mingw_arm64.cmake @@ -0,0 +1,5 @@ +# Toolchain file that should provide required and non-conflicting build- +# parameters to allow normal and cross-compilation to ARM64 targets on +# Windows using any generator. +SET(CMAKE_SYSTEM_PROCESSOR "ARM64") +SET(CMAKE_SYSTEM_NAME "Windows") diff --git a/shared/sentry/src/external/crashpad/compat/mingw/werapi.h b/shared/sentry/src/external/crashpad/compat/mingw/werapi.h index 2007a0538..9f0443c01 100644 --- a/shared/sentry/src/external/crashpad/compat/mingw/werapi.h +++ b/shared/sentry/src/external/crashpad/compat/mingw/werapi.h @@ -21,8 +21,10 @@ typedef HANDLE HREPORT; #define WER_MAX_PREFERRED_MODULES_BUFFER 256 #endif -#define PWER_SUBMIT_RESULT WER_SUBMIT_RESULT* - #include_next +#ifndef PWER_SUBMIT_RESULT +#define PWER_SUBMIT_RESULT WER_SUBMIT_RESULT* +#endif + #endif // CRASHPAD_COMPAT_MINGW_WERAPI_H_ diff --git a/shared/sentry/src/external/crashpad/crashpad-config.cmake.in b/shared/sentry/src/external/crashpad/crashpad-config.cmake.in index 846797d77..88fa099c7 100644 --- a/shared/sentry/src/external/crashpad/crashpad-config.cmake.in +++ b/shared/sentry/src/external/crashpad/crashpad-config.cmake.in @@ -1,7 +1,9 @@ include("${CMAKE_CURRENT_LIST_DIR}/crashpad-targets.cmake") +include(CMakeFindDependencyMacro) + if(@CRASHPAD_ZLIB_SYSTEM@) - find_package(ZLIB REQUIRED) + find_dependency(ZLIB REQUIRED) target_include_directories(crashpad::zlib INTERFACE ${ZLIB_INCLUDE_DIRS}) target_compile_definitions(crashpad::zlib INTERFACE ${ZLIB_COMPILE_DEFINITIONS}) target_link_libraries(crashpad::zlib INTERFACE ${ZLIB_LIBRARIES}) diff --git a/shared/sentry/src/external/crashpad/handler/CMakeLists.txt b/shared/sentry/src/external/crashpad/handler/CMakeLists.txt index 0e5851c09..55d2e4a97 100644 --- a/shared/sentry/src/external/crashpad/handler/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/handler/CMakeLists.txt @@ -123,7 +123,7 @@ if(NOT IOS) ) endif() -if(CRASHPAD_WER_ENABLED) +if (WIN32) add_library(crashpad_wer SHARED win/wer/crashpad_wer.cc win/wer/crashpad_wer.h @@ -147,4 +147,4 @@ if(CRASHPAD_WER_ENABLED) install(TARGETS crashpad_wer EXPORT crashpad_export RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ) -endif() +endif() \ No newline at end of file diff --git a/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.cc b/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.cc index 8c3bb160d..d203f6fd7 100644 --- a/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.cc +++ b/shared/sentry/src/external/crashpad/snapshot/win/process_reader_win.cc @@ -229,6 +229,7 @@ bool FillThreadContextAndSuspendCount(HANDLE process, thread->id == reinterpret_cast*>(NtCurrentTeb()) ->ClientId.UniqueThread; + bool did_suspend_thread = true; if (is_current_thread) { DCHECK(suspension_state == ProcessSuspensionState::kRunning); @@ -243,7 +244,9 @@ bool FillThreadContextAndSuspendCount(HANDLE process, DWORD previous_suspend_count = SuspendThread(thread_handle); if (previous_suspend_count == static_cast(-1)) { PLOG(ERROR) << "SuspendThread"; - return false; + // Must assume thread was already suspended, so we can still try to read + did_suspend_thread = false; + previous_suspend_count = 1; } if (previous_suspend_count <= 0 && suspension_state == ProcessSuspensionState::kSuspended) { @@ -281,7 +284,7 @@ bool FillThreadContextAndSuspendCount(HANDLE process, DoStackWalk(thread, process, thread_handle, is_64_reading_32); #endif - if (!ResumeThread(thread_handle)) { + if (did_suspend_thread && !ResumeThread(thread_handle)) { PLOG(ERROR) << "ResumeThread"; return false; } diff --git a/shared/sentry/src/external/crashpad/util/CMakeLists.txt b/shared/sentry/src/external/crashpad/util/CMakeLists.txt index 02ff865a4..a260f5d6c 100644 --- a/shared/sentry/src/external/crashpad/util/CMakeLists.txt +++ b/shared/sentry/src/external/crashpad/util/CMakeLists.txt @@ -253,18 +253,7 @@ if(LINUX OR ANDROID) find_package(CURL REQUIRED) endif() - if(TARGET CURL::libcurl) # Only available in cmake 3.12+ - target_link_libraries(crashpad_util PRIVATE CURL::libcurl) - else() - # Needed for cmake < 3.12 support (cmake 3.12 introduced the target CURL::libcurl) - target_include_directories(crashpad_util PRIVATE ${CURL_INCLUDE_DIR}) - # The exported sentry target must not contain any path of the build machine, therefore use generator expressions - string(REPLACE ";" "$" GENEX_CURL_LIBRARIES "${CURL_LIBRARIES}") - string(REPLACE ";" "$" GENEX_CURL_COMPILE_DEFINITIONS "${CURL_COMPILE_DEFINITIONS}") - target_link_libraries(crashpad_util PRIVATE $) - target_compile_definitions(crashpad_util PRIVATE $) - endif() - + target_link_libraries(crashpad_util PRIVATE CURL::libcurl) SET(HTTP_TRANSPORT_IMPL net/http_transport_libcurl.cc) else() find_package(OpenSSL) @@ -386,9 +375,15 @@ if(WIN32) win/xp_compat.h ) if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm|ARM64") - target_sources(crashpad_util PRIVATE - misc/capture_context_win_arm64.asm - ) + if (MINGW) + target_sources(crashpad_util PRIVATE + misc/capture_context_win_arm64.S + ) + else() + target_sources(crashpad_util PRIVATE + misc/capture_context_win_arm64.asm + ) + endif() else() target_sources(crashpad_util PRIVATE misc/capture_context_win.asm diff --git a/shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.S b/shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.S new file mode 100644 index 000000000..35af0e6c3 --- /dev/null +++ b/shared/sentry/src/external/crashpad/util/misc/capture_context_win_arm64.S @@ -0,0 +1,74 @@ +// Copyright 2019 The Crashpad Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// namespace crashpad { +// void CaptureContext(CONTEXT* context); +// } // namespace crashpad + +#include "arm64_pac_bti.S" + +#define CAPTURECONTEXT_SYMBOL _ZN8crashpad14CaptureContextEP8_CONTEXT + + .text + .globl CAPTURECONTEXT_SYMBOL + .balign 4, 0x0 + //.type CAPTURECONTEXT_SYMBOL, %function + +CAPTURECONTEXT_SYMBOL: + CRASHPAD_AARCH64_VALID_CALL_TARGET + + // Save general purpose registers in context.regs[i]. + // The original x0 can't be recovered. + stp x0, x1, [x0, #0x008] + stp x2, x3, [x0, #0x018] + stp x4, x5, [x0, #0x028] + stp x6, x7, [x0, #0x038] + stp x8, x9, [x0, #0x048] + stp x10, x11, [x0, #0x058] + stp x12, x13, [x0, #0x068] + stp x14, x15, [x0, #0x078] + stp x16, x17, [x0, #0x088] + stp x18, x19, [x0, #0x098] + stp x20, x21, [x0, #0x0a8] + stp x22, x23, [x0, #0x0b8] + stp x24, x25, [x0, #0x0c8] + stp x26, x27, [x0, #0x0d8] + stp x28, x29, [x0, #0x0e8] + + // The original LR can't be recovered. + str LR, [x0, #0x0f8] + + // Use x1 as a scratch register. + mov x1, SP + str x1, [x0, #0x100] // context.sp + + // The link register holds the return address for this function. + str LR, [x0, #0x108] // context.pc + + // pstate should hold SPSR but NZCV are the only bits we know about. + mrs x1, NZCV + + // Enable Control flags, such as CONTEXT_ARM64, CONTEXT_CONTROL, + // CONTEXT_INTEGER + ldr w1, =0x00400003 + + // Set ControlFlags /0x000/ and pstate /0x004/ at the same time. + str x1, [x0, #0x000] + + // Restore x1 from the saved context. + ldr x1, [x0, #0x010] + + // TODO(https://crashpad.chromium.org/bug/300): save floating-point registers + + ret diff --git a/shared/sentry/src/external/crashpad/util/net/http_multipart_builder.cc b/shared/sentry/src/external/crashpad/util/net/http_multipart_builder.cc index 83514cb31..26c297286 100644 --- a/shared/sentry/src/external/crashpad/util/net/http_multipart_builder.cc +++ b/shared/sentry/src/external/crashpad/util/net/http_multipart_builder.cc @@ -169,10 +169,15 @@ std::unique_ptr HTTPMultipartBuilder::GetBodyStream() { for (const auto& pair : file_attachments_) { const FileAttachment& attachment = pair.second; std::string header = GetFormDataBoundary(boundary_, pair.first); +#ifdef SENTRY_MODIFIED header += base::StringPrintf("; filename=\"%s\"%s", attachment.filename.c_str(), kCRLF); header += base::StringPrintf("Content-Type: %s%s", attachment.content_type.c_str(), kBoundaryCRLF); +#else + header += base::StringPrintf("; filename=\"%s\"%s", + attachment.filename.c_str(), kBoundaryCRLF); +#endif streams.push_back(new StringHTTPBodyStream(header)); streams.push_back(new FileReaderHTTPBodyStream(attachment.reader)); diff --git a/shared/sentry/src/external/crashpad/util/win/exception_handler_server.cc b/shared/sentry/src/external/crashpad/util/win/exception_handler_server.cc index e641c7fb9..32d767df7 100644 --- a/shared/sentry/src/external/crashpad/util/win/exception_handler_server.cc +++ b/shared/sentry/src/external/crashpad/util/win/exception_handler_server.cc @@ -129,6 +129,7 @@ class ClientData { non_crash_dump_completed_event_( std::move(non_crash_dump_completed_event)), process_(std::move(process)), + process_promoted_(false), crash_exception_information_address_( crash_exception_information_address), non_crash_exception_information_address_( @@ -172,6 +173,29 @@ class ClientData { } HANDLE process() const { return process_.get(); } + // Promotes the process handle to full access if it hasn't already been done. + HANDLE process_promoted() + { + if (!process_promoted_) + { + // Duplicate restricted process handle for a full memory access handle. + HANDLE hAllAccessHandle = nullptr; + if (DuplicateHandle(GetCurrentProcess(), + process_.get(), + GetCurrentProcess(), + &hAllAccessHandle, + kXPProcessAllAccess, + FALSE, + 0)) + { + ScopedKernelHANDLE ScopedAllAccessHandle(hAllAccessHandle); + process_.swap(ScopedAllAccessHandle); + process_promoted_ = true; + } + } + return process_.get(); + } + private: void RegisterThreadPoolWaits( WAITORTIMERCALLBACK crash_dump_request_callback, @@ -232,6 +256,7 @@ class ClientData { ScopedKernelHANDLE non_crash_dump_requested_event_; ScopedKernelHANDLE non_crash_dump_completed_event_; ScopedKernelHANDLE process_; + bool process_promoted_; WinVMAddress crash_exception_information_address_; WinVMAddress non_crash_exception_information_address_; WinVMAddress debug_critical_section_address_; @@ -459,14 +484,14 @@ bool ExceptionHandlerServer::ServiceClientConnection( // the process, but the client will be able to, so we make a second attempt // having impersonated the client. HANDLE client_process = OpenProcess( - kXPProcessAllAccess, false, message.registration.client_process_id); + kXPProcessLimitedAccess, false, message.registration.client_process_id); if (!client_process) { if (!ImpersonateNamedPipeClient(service_context.pipe())) { PLOG(ERROR) << "ImpersonateNamedPipeClient"; return false; } client_process = OpenProcess( - kXPProcessAllAccess, false, message.registration.client_process_id); + kXPProcessLimitedAccess, false, message.registration.client_process_id); PCHECK(RevertToSelf()); if (!client_process) { LOG(ERROR) << "failed to open " << message.registration.client_process_id; @@ -543,11 +568,11 @@ void __stdcall ExceptionHandlerServer::OnCrashDumpEvent(void* ctx, BOOLEAN) { // Capture the exception. unsigned int exit_code = client->delegate()->ExceptionHandlerServerException( - client->process(), + client->process_promoted(), client->crash_exception_information_address(), client->debug_critical_section_address()); - SafeTerminateProcess(client->process(), exit_code); + SafeTerminateProcess(client->process_promoted(), exit_code); } // static @@ -558,7 +583,7 @@ void __stdcall ExceptionHandlerServer::OnNonCrashDumpEvent(void* ctx, BOOLEAN) { // Capture the exception. client->delegate()->ExceptionHandlerServerException( - client->process(), + client->process_promoted(), client->non_crash_exception_information_address(), client->debug_critical_section_address()); diff --git a/shared/sentry/src/external/crashpad/util/win/xp_compat.h b/shared/sentry/src/external/crashpad/util/win/xp_compat.h index 1499c08aa..314fd73bb 100644 --- a/shared/sentry/src/external/crashpad/util/win/xp_compat.h +++ b/shared/sentry/src/external/crashpad/util/win/xp_compat.h @@ -26,6 +26,10 @@ enum { //! against a Vista+ SDK results in `ERROR_ACCESS_DENIED` when running on XP. //! See https://msdn.microsoft.com/library/ms684880.aspx. kXPProcessAllAccess = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, + + // A limited access version, suitable for initial access to the process. + kXPProcessLimitedAccess = PROCESS_DUP_HANDLE | PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_TERMINATE | SYNCHRONIZE, + //! \brief This is the XP-suitable value of `THREAD_ALL_ACCESS`. //! diff --git a/shared/sentry/src/include/sentry.h b/shared/sentry/src/include/sentry.h index bba0dd0e7..ba462eae5 100644 --- a/shared/sentry/src/include/sentry.h +++ b/shared/sentry/src/include/sentry.h @@ -30,7 +30,7 @@ extern "C" { # define SENTRY_SDK_NAME "sentry.native" # endif #endif -#define SENTRY_SDK_VERSION "0.7.0" +#define SENTRY_SDK_VERSION "0.7.6" #define SENTRY_SDK_USER_AGENT SENTRY_SDK_NAME "/" SENTRY_SDK_VERSION /* common platform detection */ @@ -1068,6 +1068,11 @@ typedef void (*sentry_logger_function_t)( * Sets the sentry-native logger function. * * Used for logging debug events when the `debug` option is set to true. + * + * Note: Multiple threads may invoke your `func`. If you plan to mutate any data + * inside the `userdata` argument after initialization, you must ensure proper + * synchronization inside the logger function. + * */ SENTRY_API void sentry_options_set_logger( sentry_options_t *opts, sentry_logger_function_t func, void *userdata); @@ -1888,6 +1893,27 @@ SENTRY_EXPERIMENTAL_API void sentry_transaction_set_name( SENTRY_EXPERIMENTAL_API void sentry_transaction_set_name_n( sentry_transaction_t *transaction, const char *name, size_t name_len); +/** + * Creates a new User Feedback with a specific name, email and comments. + * + * See https://develop.sentry.dev/sdk/envelopes/#user-feedback + * + * User Feedback has to be associated with a specific event that has been + * sent to Sentry earlier. + */ +SENTRY_API sentry_value_t sentry_value_new_user_feedback( + const sentry_uuid_t *uuid, const char *name, const char *email, + const char *comments); +SENTRY_API sentry_value_t sentry_value_new_user_feedback_n( + const sentry_uuid_t *uuid, const char *name, size_t name_len, + const char *email, size_t email_len, const char *comments, + size_t comments_len); + +/** + * Captures a manually created User Feedback and sends it to Sentry. + */ +SENTRY_API void sentry_capture_user_feedback(sentry_value_t user_feedback); + /** * The status of a Span or Transaction. * diff --git a/shared/sentry/src/ndk/README.md b/shared/sentry/src/ndk/README.md new file mode 100644 index 000000000..190b51251 --- /dev/null +++ b/shared/sentry/src/ndk/README.md @@ -0,0 +1,75 @@ +# Android NDK support for sentry-native + +| Package | Maven Central | Minimum Android API Level | Supported ABIs | +| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- | ------------------------------------------- | +| `io.sentry:sentry-native-ndk` | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-native-ndk/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.sentry/sentry-native-ndk) | 19 | "x86", "armeabi-v7a", "x86_64", "arm64-v8a" | + +## Resources + +- [SDK Documentation](https://docs.sentry.io/platforms/native/) +- [Discord](https://discord.gg/ez5KZN7) server for project discussions +- Follow [@getsentry](https://twitter.com/getsentry) on Twitter for updates + +## About + +The sub-project aims to automatically bundle pre-built `sentry-native` binaries together with a Java JNI layer into an Android friendly `.aar` package. + +The `.aar` package also provides [prefab](https://developer.android.com/build/native-dependencies?buildsystem=cmake) support, giving you the possibility to consume the native `sentry.h` APIs from your native app code. + +If you're using the [Sentry Android SDK](https://docs.sentry.io/platforms/android/), this package is included by default already. + +Besides the main package in `ndk/lib`, a simple Android app for for testing purposes is provided in the `ndk/sample` folder. + +## Building and Installation + +The `ndk` project uses the Gradle build system in combination with CMake. You can either use a suitable IDE (e.g. Android Studio) or the command line to build it. + +## Testing and consuming a local package version + +1. Set a custom `versionName` in the `ndk/gradle.properties` file +2. Publish the package locally + +```shell +cd ndk +./gradlew :sentry-native-ndk:publishToMavenLocal +``` + +3. Consume the build in your app + +``` +// usually settings.gradle +allprojects { + repositories { + mavenLocal() + } +} + +// usually app/build.gradle +android { + buildFeatures { + prefab = true + } +} + +dependencies { + implementation("io.sentry:sentry-native-ndk:") +} +``` + +4. Link the pre-built packages with your native code + +```cmake +# usually app/CMakeLists.txt + +find_package(sentry-native-ndk REQUIRED CONFIG) + +target_link_libraries( PRIVATE + ${LOG_LIB} + sentry-native-ndk::sentry-android + sentry-native-ndk::sentry +) +``` + +## Development + +Please see the [contribution guide](../CONTRIBUTING.md). diff --git a/shared/sentry/src/ndk/build.gradle.kts b/shared/sentry/src/ndk/build.gradle.kts new file mode 100644 index 000000000..4e9ded034 --- /dev/null +++ b/shared/sentry/src/ndk/build.gradle.kts @@ -0,0 +1,207 @@ +import com.diffplug.spotless.LineEnding +import com.vanniktech.maven.publish.MavenPublishBaseExtension +import com.vanniktech.maven.publish.MavenPublishPlugin +import com.vanniktech.maven.publish.MavenPublishPluginExtension +import groovy.util.Node +import io.gitlab.arturbosch.detekt.extensions.DetektExtension +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.gradle.api.tasks.testing.logging.TestLogEvent + +plugins { + `java-library` + id("com.diffplug.spotless") version "6.11.0" apply true + id("io.gitlab.arturbosch.detekt") version "1.19.0" + `maven-publish` + id("org.jetbrains.kotlinx.binary-compatibility-validator") version "0.13.0" + +} + +buildscript { + repositories { + google() + } + dependencies { + classpath("com.android.tools.build:gradle:7.4.2") + classpath(kotlin("gradle-plugin", version = "1.8.0")) + classpath("com.vanniktech:gradle-maven-publish-plugin:0.18.0") + // dokka is required by gradle-maven-publish-plugin. + classpath("org.jetbrains.dokka:dokka-gradle-plugin:1.7.10") + classpath("net.ltgt.gradle:gradle-errorprone-plugin:3.0.1") + + // legacy pre-prefab support + // https://github.com/howardpang/androidNativeBundle + classpath("io.github.howardpang:androidNativeBundle:1.1.4") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } + group = "io.sentry" + version = properties["versionName"].toString() + description = "SDK for sentry.io" + tasks { + withType { + testLogging.showStandardStreams = true + testLogging.exceptionFormat = TestExceptionFormat.FULL + testLogging.events = setOf( + TestLogEvent.SKIPPED, + TestLogEvent.PASSED, + TestLogEvent.FAILED + ) + maxParallelForks = Runtime.getRuntime().availableProcessors() / 2 + + // Cap JVM args per test + minHeapSize = "128m" + maxHeapSize = "1g" + dependsOn("cleanTest") + } + withType { + options.compilerArgs.addAll(arrayOf("-Xlint:all", "-Werror", "-Xlint:-classfile", "-Xlint:-processing")) + } + } +} + +subprojects { + plugins.withId("io.gitlab.arturbosch.detekt") { + configure { + buildUponDefaultConfig = true + allRules = true + config.setFrom("${rootProject.rootDir}/detekt.yml") + } + } + + if (!this.name.contains("sample")) { + apply() + + val sep = File.separator + + configure { + + this.getByName("main").contents { + // non android modules + from("build${sep}libs") + from("build${sep}publications${sep}maven") + // android modules + from("build${sep}outputs${sep}aar") { + include("*-release*") + } + from("build${sep}publications${sep}release") + } + + // craft only uses zip archives + this.forEach { dist -> + if (dist.name == DistributionPlugin.MAIN_DISTRIBUTION_NAME) { + tasks.getByName("distTar").enabled = false + } else { + tasks.getByName(dist.name + "DistTar").enabled = false + } + } + } + + tasks.named("distZip").configure { + this.dependsOn("publishToMavenLocal") + this.doLast { + val distributionFilePath = + "${this.project.buildDir}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" + val file = File(distributionFilePath) + if (!file.exists()) throw IllegalStateException("Distribution file: $distributionFilePath does not exist") + if (file.length() == 0L) throw IllegalStateException("Distribution file: $distributionFilePath is empty") + } + } + + afterEvaluate { + apply() + + configure { + // signing is done when uploading files to MC + // via gpg:sign-and-deploy-file (release.kts) + releaseSigningEnabled = false + } + + @Suppress("UnstableApiUsage") + configure { + assignAarTypes() + } + } + } +} + +spotless { + lineEndings = LineEnding.UNIX + java { + target("**/*.java") + removeUnusedImports() + googleJavaFormat() + targetExclude("**/generated/**", "**/vendor/**") + } + kotlin { + target("**/*.kt") + ktlint() + } + kotlinGradle { + target("**/*.kts") + ktlint() + } +} + +private val androidLibs = setOf( + "lib" +) + +private val androidXLibs = listOf( + "androidx.core:core" +) + +/* + * Adapted from https://github.com/androidx/androidx/blob/c799cba927a71f01ea6b421a8f83c181682633fb/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt#L524-L549 + * + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Workaround for https://github.com/gradle/gradle/issues/3170 +@Suppress("UnstableApiUsage") +fun MavenPublishBaseExtension.assignAarTypes() { + pom { + withXml { + val dependencies = asNode().children().find { + it is Node && it.name().toString().endsWith("dependencies") + } as Node? + + dependencies?.children()?.forEach { dep -> + if (dep !is Node) { + return@forEach + } + val group = dep.children().firstOrNull { + it is Node && it.name().toString().endsWith("groupId") + } as? Node + val groupValue = group?.children()?.firstOrNull() as? String + + val artifactId = dep.children().firstOrNull { + it is Node && it.name().toString().endsWith("artifactId") + } as? Node + val artifactIdValue = artifactId?.children()?.firstOrNull() as? String + + if (artifactIdValue in androidLibs) { + dep.appendNode("type", "aar") + } else if ("$groupValue:$artifactIdValue" in androidXLibs) { + dep.appendNode("type", "aar") + } + } + } + } +} diff --git a/shared/sentry/src/ndk/debug.keystore b/shared/sentry/src/ndk/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..7da7480dd09f15fe47e9dffa9a506bf4ab7103f9 GIT binary patch literal 2473 zcmY+EcQ_l08pcB+_NrAYB=#s#wRbfYwJU0GQKYe{Jwmx?sXa?@N>y6asMIRK(PQUW zMeQ0@6jdtJb?ZhX31_&-p=|8eSbR zq-Z$tw~ZWIY=ZDsy|3RaH4s2D2jM^i4fj(teMl8!&Q-RW81xQej6zScfK)Y&II_hw zH0Iq-)CY=-2nS)l!}#8md@~}O@!ZqUNdAaLpG-AB&xb{@(*;MC1{9D$4w#H!$)bi# z1L$CE=|bXCHNV*}9iHS>@4Rhc>X~@%TiC)&|C;=GAh13~EE=a(jVHMRq(MywM=Hf?dt-63z9Je)XB#m~xYh%*&xbr_kwnHu@L;QSmao@kCyRRBxx$i+N%rdOAL zd^IaXem+OBfVgaBGP;rLOag+CR9cFb+oD;8{r4?%2GeoY*pZO zs0TG!Zl{WUNW0;jvThga40!Q==g0QS24gT8uc()A;^OaYi4)bj@H=z-p+Dk0$X)Ic za0GfLnZ^CC4(%#yQPs}yzzuMJ*~G?KSG!Io_Xs(^@_*Y!L`eRrHzW12hZd$7e^29n zVroa7ZlYqz17%JGSzk)J>ATH{@#KxkXxDZVlq#K?@0-(O8xqp88R$Oi%3HD*+o8^S z*2`g|Awp?0XFUKhS-)y$KN8OG+M%}CR7QmFw+B76c72rNd8**zH{#jUzwRD7u5cHA z?Jrc)b1Dc!AOKf@FTev32=D`VU#bTH4R8a50PX`Yms>a-`gfg6ffIBE<&8xPD<~`7c>IDKZ#faW zUmbPxz**tH%#FhV{rQICCx$(#;x>YKD?>=j5%~fJ7xk|WlQrLB($FCfQKVd@b&4wz zKcg(6dNWlea8Ou%Q%iB$^CV2Vd~OsXiCcm(Z?aevN>0*au5yUazaA7z@~n{$U72W| z97c_@j3LC{R~M~5We6^v7#p|Zr4tQlRpE^ozW@?jpH?qRp4iEh>8hIdwq*K?TIx2i z|B4D^;P7iIcQzyRuQ3XU2Ef(_WZZb^BmL92+BEnXI6Z%=IXny}w7)0V_KQ!pP;Oxi zh<3Z#J_vtr?slCr!7u&B>~6XZpY8 zs3q}`i&REO1$8#$xb6*Yrc1uw!nRy5h>@L9Mv`}!debwz&)z^yFW7UkE0gJ_IRZv+ z-mXN=%P?6PMs5BnH6Gr37aIe0IkN=4iwnB?$}4G=5CJjJ4Rgm`@kr7xhqb2E__mf` zb!##&(B9BAH6j$#X^h>lVz*{(SCdcXyg}nWMxxPJVEfU`6>TV(#>`J>Si}e((1Bdz zGH_33V%oH}eY-aNgjlePJv}SD+N%Lo$rA|Kc&;p%C!|K`Zk`dpZubkrYc`E_(F2bR zg-E}OJC*y+T}vbi^^gX3MVKZXHt=;$~ey>ipc))L6fA6(nE!N65#VwrF!) zm75CYfOrcXc#4dZLGCm z3HeGeezrq}K|U2b@8r_i@QKnfj?(F>OA*V8n?bvmgcSOby+~bGh&997+_4nj(J(Co zlJ$gWdQ$hT3gwuf)7ZUIGk(RKT02H{2!dz(t-t=04Sz1V+}S%3=}G_MPtq~$M3a^{ zZjByUd=Nv3wwli(8+^*zh6Pq;HT5Kye;&;lEbrHDmqO5HZB}cbr=155KXPoI>Fqs{ zPiq}>+NRA~^${+bK1EKskh_GDIwer$5`swE8WH~o1(2Ds0{nU6?W1e7u1I_*zj({W z>0J7=-@Fw~;bhOp){BH`Fa26yD9%nv4_Wi+ytov&D1VVVUtGWrPq4!tdpyz;?7gml zp>)Wvd0vBS!=Z3`FpUfgkeZJM0OAa~6GUuHO|m&+Iqg?sCy6}a)>;B_<_+dvB%bbC W#z5= 3.6.x +android.useAndroidX=true + +# Required by AGP >= 8.0.x +android.defaults.buildfeatures.buildconfig=true + +# Release information, used for maven publishing +versionName=0.7.6 + +# disable renderscript, it's enabled by default +android.defaults.buildfeatures.renderscript=false + +# disable shader compilation, it's enabled by default +android.defaults.buildfeatures.shaders=false + +# disable aidl files, it's enabled by default +android.defaults.buildfeatures.aidl=false + +# disable Resource Values generation +android.defaults.buildfeatures.resvalues=false + +# disable automatically adding Kotlin stdlib to compile dependencies +kotlin.stdlib.default.dependency=false + +# TODO: Enable Prefab https://android-developers.googleblog.com/2020/02/native-dependencies-in-android-studio-40.html +# android.enablePrefab=true +# android.prefabVersion=1.0.0 + +# publication pom properties +POM_NAME=Sentry SDK +POM_DESCRIPTION=SDK for sentry.io +POM_URL=https://github.com/getsentry/sentry-native +POM_SCM_URL=https://github.com/getsentry/sentry-native +POM_SCM_CONNECTION=scm:git:git://github.com/getsentry/sentry-native.git +POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/getsentry/sentry-native.git + +POM_LICENCE_NAME=MIT +POM_LICENCE_URL=http://www.opensource.org/licenses/mit-license.php + +POM_DEVELOPER_ID=getsentry +POM_DEVELOPER_NAME=Sentry Team and Contributors +POM_DEVELOPER_URL=https://github.com/getsentry/ + +POM_ARTIFACT_ID=sentry-native-ndk + +systemProp.org.gradle.internal.http.socketTimeout=120000 + +android.nonTransitiveRClass=true diff --git a/shared/sentry/src/ndk/gradle/wrapper/gradle-wrapper.jar b/shared/sentry/src/ndk/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et zwk~hMkhq;MOw^Q5`7oC{CUUyTw9x>^%*FHx^qJw(LB+E0WBX@{Ghw;)6aA-KyYg8p z7XDveQOpEr;B4je@2~usI5BlFadedX^ma{b{ypd|RNYqo#~d*mj&y`^iojR}s%~vF z(H!u`yx68D1Tj(3(m;Q+Ma}s2n#;O~bcB1`lYk%Irx60&-nWIUBr2x&@}@76+*zJ5 ze&4?q8?m%L9c6h=J$WBzbiTf1Z-0Eb5$IZs>lvm$>1n_Mezp*qw_pr8<8$6f)5f<@ zyV#tzMCs51nTv_5ca`x`yfE5YA^*%O_H?;tWYdM_kHPubA%vy47i=9>Bq) zRQ&0UwLQHeswmB1yP)+BiR;S+Vc-5TX84KUA;8VY9}yEj0eESSO`7HQ4lO z4(CyA8y1G7_C;6kd4U3K-aNOK!sHE}KL_-^EDl(vB42P$2Km7$WGqNy=%fqB+ zSLdrlcbEH=T@W8V4(TgoXZ*G1_aq$K^@ek=TVhoKRjw;HyI&coln|uRr5mMOy2GXP zwr*F^Y|!Sjr2YQXX(Fp^*`Wk905K%$bd03R4(igl0&7IIm*#f`A!DCarW9$h$z`kYk9MjjqN&5-DsH@8xh63!fTNPxWsFQhNv z#|3RjnP$Thdb#Ys7M+v|>AHm0BVTw)EH}>x@_f4zca&3tXJhTZ8pO}aN?(dHo)44Z z_5j+YP=jMlFqwvf3lq!57-SAuRV2_gJ*wsR_!Y4Z(trO}0wmB9%f#jNDHPdQGHFR; zZXzS-$`;7DQ5vF~oSgP3bNV$6Z(rwo6W(U07b1n3UHqml>{=6&-4PALATsH@Bh^W? z)ob%oAPaiw{?9HfMzpGb)@Kys^J$CN{uf*HX?)z=g`J(uK1YO^8~s1(ZIbG%Et(|q z$D@_QqltVZu9Py4R0Ld8!U|#`5~^M=b>fnHthzKBRr=i+w@0Vr^l|W;=zFT#PJ?*a zbC}G#It}rQP^Ait^W&aa6B;+0gNvz4cWUMzpv(1gvfw-X4xJ2Sv;mt;zb2Tsn|kSS zo*U9N?I{=-;a-OybL4r;PolCfiaL=y@o9{%`>+&FI#D^uy#>)R@b^1ue&AKKwuI*` zx%+6r48EIX6nF4o;>)zhV_8(IEX})NGU6Vs(yslrx{5fII}o3SMHW7wGtK9oIO4OM&@@ECtXSICLcPXoS|{;=_yj>hh*%hP27yZwOmj4&Lh z*Nd@OMkd!aKReoqNOkp5cW*lC)&C$P?+H3*%8)6HcpBg&IhGP^77XPZpc%WKYLX$T zsSQ$|ntaVVOoRat$6lvZO(G-QM5s#N4j*|N_;8cc2v_k4n6zx9c1L4JL*83F-C1Cn zaJhd;>rHXB%%ZN=3_o3&Qd2YOxrK~&?1=UuN9QhL$~OY-Qyg&})#ez*8NpQW_*a&kD&ANjedxT0Ar z<6r{eaVz3`d~+N~vkMaV8{F?RBVemN(jD@S8qO~L{rUw#=2a$V(7rLE+kGUZ<%pdr z?$DP|Vg#gZ9S}w((O2NbxzQ^zTot=89!0^~hE{|c9q1hVzv0?YC5s42Yx($;hAp*E zyoGuRyphQY{Q2ee0Xx`1&lv(l-SeC$NEyS~8iil3_aNlnqF_G|;zt#F%1;J)jnPT& z@iU0S;wHJ2$f!juqEzPZeZkjcQ+Pa@eERSLKsWf=`{R@yv7AuRh&ALRTAy z8=g&nxsSJCe!QLchJ=}6|LshnXIK)SNd zRkJNiqHwKK{SO;N5m5wdL&qK`v|d?5<4!(FAsDxR>Ky#0#t$8XCMptvNo?|SY?d8b z`*8dVBlXTUanlh6n)!EHf2&PDG8sXNAt6~u-_1EjPI1|<=33T8 zEnA00E!`4Ave0d&VVh0e>)Dc}=FfAFxpsC1u9ATfQ`-Cu;mhc8Z>2;uyXtqpLb7(P zd2F9<3cXS} znMg?{&8_YFTGRQZEPU-XPq55%51}RJpw@LO_|)CFAt62-_!u_Uq$csc+7|3+TV_!h z+2a7Yh^5AA{q^m|=KSJL+w-EWDBc&I_I1vOr^}P8i?cKMhGy$CP0XKrQzCheG$}G# zuglf8*PAFO8%xop7KSwI8||liTaQ9NCAFarr~psQt)g*pC@9bORZ>m`_GA`_K@~&% zijH0z;T$fd;-Liw8%EKZas>BH8nYTqsK7F;>>@YsE=Rqo?_8}UO-S#|6~CAW0Oz1} z3F(1=+#wrBJh4H)9jTQ_$~@#9|Bc1Pd3rAIA_&vOpvvbgDJOM(yNPhJJq2%PCcMaI zrbe~toYzvkZYQ{ea(Wiyu#4WB#RRN%bMe=SOk!CbJZv^m?Flo5p{W8|0i3`hI3Np# zvCZqY%o258CI=SGb+A3yJe~JH^i{uU`#U#fvSC~rWTq+K`E%J@ zasU07&pB6A4w3b?d?q}2=0rA#SA7D`X+zg@&zm^iA*HVi z009#PUH<%lk4z~p^l0S{lCJk1Uxi=F4e_DwlfHA`X`rv(|JqWKAA5nH+u4Da+E_p+ zVmH@lg^n4ixs~*@gm_dgQ&eDmE1mnw5wBz9Yg?QdZwF|an67Xd*x!He)Gc8&2!urh z4_uXzbYz-aX)X1>&iUjGp;P1u8&7TID0bTH-jCL&Xk8b&;;6p2op_=y^m@Nq*0{#o!!A;wNAFG@0%Z9rHo zcJs?Th>Ny6+hI`+1XoU*ED$Yf@9f91m9Y=#N(HJP^Y@ZEYR6I?oM{>&Wq4|v0IB(p zqX#Z<_3X(&{H+{3Tr|sFy}~=bv+l=P;|sBz$wk-n^R`G3p0(p>p=5ahpaD7>r|>pm zv;V`_IR@tvZreIuv2EM7ZQHhO+qUgw#kOs%*ekY^n|=1#x9&c;Ro&I~{rG-#_3ZB1 z?|9}IFdbP}^DneP*T-JaoYHt~r@EfvnPE5EKUwIxjPbsr$% zfWW83pgWST7*B(o=kmo)74$8UU)v0{@4DI+ci&%=#90}!CZz|rnH+Mz=HN~97G3~@ z;v5(9_2%eca(9iu@J@aqaMS6*$TMw!S>H(b z4(*B!|H|8&EuB%mITr~O?vVEf%(Gr)6E=>H~1VR z&1YOXluJSG1!?TnT)_*YmJ*o_Q@om~(GdrhI{$Fsx_zrkupc#y{DK1WOUR>tk>ZE) ziOLoBkhZZ?0Uf}cm>GsA>Rd6V8@JF)J*EQlQ<=JD@m<)hyElXR0`pTku*3MU`HJn| zIf7$)RlK^pW-$87U;431;Ye4Ie+l~_B3*bH1>*yKzn23cH0u(i5pXV! z4K?{3oF7ZavmmtTq((wtml)m6i)8X6ot_mrE-QJCW}Yn!(3~aUHYG=^fA<^~`e3yc z-NWTb{gR;DOUcK#zPbN^D*e=2eR^_!(!RKkiwMW@@yYtEoOp4XjOGgzi`;=8 zi3`Ccw1%L*y(FDj=C7Ro-V?q)-%p?Ob2ZElu`eZ99n14-ZkEV#y5C+{Pq87Gu3&>g zFy~Wk7^6v*)4pF3@F@rE__k3ikx(hzN3@e*^0=KNA6|jC^B5nf(XaoQaZN?Xi}Rn3 z$8&m*KmWvPaUQ(V<#J+S&zO|8P-#!f%7G+n_%sXp9=J%Z4&9OkWXeuZN}ssgQ#Tcj z8p6ErJQJWZ+fXLCco=RN8D{W%+*kko*2-LEb))xcHwNl~Xmir>kmAxW?eW50Osw3# zki8Fl$#fvw*7rqd?%E?}ZX4`c5-R&w!Y0#EBbelVXSng+kUfeUiqofPehl}$ormli zg%r)}?%=?_pHb9`Cq9Z|B`L8b>(!+8HSX?`5+5mm81AFXfnAt1*R3F z%b2RPIacKAddx%JfQ8l{3U|vK@W7KB$CdLqn@wP^?azRks@x8z59#$Q*7q!KilY-P zHUbs(IFYRGG1{~@RF;Lqyho$~7^hNC`NL3kn^Td%A7dRgr_&`2k=t+}D-o9&C!y^? z6MsQ=tc3g0xkK(O%DzR9nbNB(r@L;1zQrs8mzx&4dz}?3KNYozOW5;=w18U6$G4U2 z#2^qRLT*Mo4bV1Oeo1PKQ2WQS2Y-hv&S|C7`xh6=Pj7MNLC5K-zokZ67S)C;(F0Dd zloDK2_o1$Fmza>EMj3X9je7e%Q`$39Dk~GoOj89-6q9|_WJlSl!!+*{R=tGp z8u|MuSwm^t7K^nUe+^0G3dkGZr3@(X+TL5eah)K^Tn zXEtHmR9UIaEYgD5Nhh(s*fcG_lh-mfy5iUF3xxpRZ0q3nZ=1qAtUa?(LnT9I&~uxX z`pV?+=|-Gl(kz?w!zIieXT}o}7@`QO>;u$Z!QB${a08_bW0_o@&9cjJUXzVyNGCm8 zm=W+$H!;_Kzp6WQqxUI;JlPY&`V}9C$8HZ^m?NvI*JT@~BM=()T()Ii#+*$y@lTZBkmMMda>7s#O(1YZR+zTG@&}!EXFG{ zEWPSDI5bFi;NT>Yj*FjH((=oe%t%xYmE~AGaOc4#9K_XsVpl<4SP@E!TgC0qpe1oi zNpxU2b0(lEMcoibQ-G^cxO?ySVW26HoBNa;n0}CWL*{k)oBu1>F18X061$SP{Gu67 z-v-Fa=Fl^u3lnGY^o5v)Bux}bNZ~ z5pL+7F_Esoun8^5>z8NFoIdb$sNS&xT8_|`GTe8zSXQzs4r^g0kZjg(b0bJvz`g<70u9Z3fQILX1Lj@;@+##bP|FAOl)U^9U>0rx zGi)M1(Hce)LAvQO-pW!MN$;#ZMX?VE(22lTlJrk#pB0FJNqVwC+*%${Gt#r_tH9I_ z;+#)#8cWAl?d@R+O+}@1A^hAR1s3UcW{G+>;X4utD2d9X(jF555}!TVN-hByV6t+A zdFR^aE@GNNgSxxixS2p=on4(+*+f<8xrwAObC)D5)4!z7)}mTpb7&ofF3u&9&wPS< zB62WHLGMhmrmOAgmJ+|c>qEWTD#jd~lHNgT0?t-p{T=~#EMcB| z=AoDKOL+qXCfk~F)-Rv**V}}gWFl>liXOl7Uec_8v)(S#av99PX1sQIVZ9eNLkhq$ zt|qu0b?GW_uo}TbU8!jYn8iJeIP)r@;!Ze_7mj{AUV$GEz6bDSDO=D!&C9!M@*S2! zfGyA|EPlXGMjkH6x7OMF?gKL7{GvGfED=Jte^p=91FpCu)#{whAMw`vSLa`K#atdN zThnL+7!ZNmP{rc=Z>%$meH;Qi1=m1E3Lq2D_O1-X5C;!I0L>zur@tPAC9*7Jeh)`;eec}1`nkRP(%iv-`N zZ@ip-g|7l6Hz%j%gcAM}6-nrC8oA$BkOTz^?dakvX?`^=ZkYh%vUE z9+&)K1UTK=ahYiaNn&G5nHUY5niLGus@p5E2@RwZufRvF{@$hW{;{3QhjvEHMvduO z#Wf-@oYU4ht?#uP{N3utVzV49mEc9>*TV_W2TVC`6+oI)zAjy$KJrr=*q##&kobiQ z1vNbya&OVjK`2pdRrM?LuK6BgrLN7H_3m z!qpNKg~87XgCwb#I=Q&0rI*l$wM!qTkXrx1ko5q-f;=R2fImRMwt5Qs{P*p^z@9ex z`2#v(qE&F%MXlHpdO#QEZyZftn4f05ab^f2vjxuFaat2}jke{j?5GrF=WYBR?gS(^ z9SBiNi}anzBDBRc+QqizTTQuJrzm^bNA~A{j%ugXP7McZqJ}65l10({wk++$=e8O{ zxWjG!Qp#5OmI#XRQQM?n6?1ztl6^D40hDJr?4$Wc&O_{*OfMfxe)V0=e{|N?J#fgE>j9jAajze$iN!*yeF%jJU#G1c@@rm zolGW!j?W6Q8pP=lkctNFdfgUMg92wlM4E$aks1??M$~WQfzzzXtS)wKrr2sJeCN4X zY(X^H_c^PzfcO8Bq(Q*p4c_v@F$Y8cHLrH$`pJ2}=#*8%JYdqsqnGqEdBQMpl!Ot04tUGSXTQdsX&GDtjbWD=prcCT9(+ z&UM%lW%Q3yrl1yiYs;LxzIy>2G}EPY6|sBhL&X&RAQrSAV4Tlh2nITR?{6xO9ujGu zr*)^E`>o!c=gT*_@6S&>0POxcXYNQd&HMw6<|#{eSute2C3{&h?Ah|cw56-AP^f8l zT^kvZY$YiH8j)sk7_=;gx)vx-PW`hbSBXJGCTkpt;ap(}G2GY=2bbjABU5)ty%G#x zAi07{Bjhv}>OD#5zh#$0w;-vvC@^}F! z#X$@)zIs1L^E;2xDAwEjaXhTBw2<{&JkF*`;c3<1U@A4MaLPe{M5DGGkL}#{cHL%* zYMG+-Fm0#qzPL#V)TvQVI|?_M>=zVJr9>(6ib*#z8q@mYKXDP`k&A4A};xMK0h=yrMp~JW{L?mE~ph&1Y1a#4%SO)@{ zK2juwynUOC)U*hVlJU17%llUxAJFuKZh3K0gU`aP)pc~bE~mM!i1mi!~LTf>1Wp< zuG+ahp^gH8g8-M$u{HUWh0m^9Rg@cQ{&DAO{PTMudV6c?ka7+AO& z746QylZ&Oj`1aqfu?l&zGtJnpEQOt;OAFq19MXTcI~`ZcoZmyMrIKDFRIDi`FH)w; z8+*8tdevMDv*VtQi|e}CnB_JWs>fhLOH-+Os2Lh!&)Oh2utl{*AwR)QVLS49iTp{6 z;|172Jl!Ml17unF+pd+Ff@jIE-{Oxv)5|pOm@CkHW?{l}b@1>Pe!l}VccX#xp@xgJ zyE<&ep$=*vT=}7vtvif0B?9xw_3Gej7mN*dOHdQPtW5kA5_zGD zpA4tV2*0E^OUimSsV#?Tg#oiQ>%4D@1F5@AHwT8Kgen$bSMHD3sXCkq8^(uo7CWk`mT zuslYq`6Yz;L%wJh$3l1%SZv#QnG3=NZ=BK4yzk#HAPbqXa92;3K5?0kn4TQ`%E%X} z&>Lbt!!QclYKd6+J7Nl@xv!uD%)*bY-;p`y^ZCC<%LEHUi$l5biu!sT3TGGSTPA21 zT8@B&a0lJHVn1I$I3I1I{W9fJAYc+8 zVj8>HvD}&O`TqU2AAb={?eT;0hyL(R{|h23=4fDSZKC32;wWxsVj`P z3J3{M$PwdH!ro*Cn!D&=jnFR>BNGR<<|I8CI@+@658Dy(lhqbhXfPTVecY@L8%`3Q z1Fux2w?2C3th60jI~%OC9BtpNF$QPqcG+Pz96qZJ71_`0o0w_q7|h&O>`6U+^BA&5 zXd5Zp1Xkw~>M%RixTm&OqpNl8Q+ue=92Op_>T~_9UON?ZM2c0aGm=^A4ejrXj3dV9 zhh_bCt-b9`uOX#cFLj!vhZ#lS8Tc47OH>*)y#{O9?AT~KR9LntM|#l#Dlm^8{nZdk zjMl#>ZM%#^nK2TPzLcKxqx24P7R1FPlBy7LSBrRvx>fE$9AJ;7{PQm~^LBX^k#6Zq zw*Z(zJC|`!6_)EFR}8|n8&&Rbj8y028~P~sFXBFRt+tmqH-S3<%N;C&WGH!f3{7cm zy_fCAb9@HqaXa1Y5vFbxWf%#zg6SI$C+Uz5=CTO}e|2fjWkZ;Dx|84Ow~bkI=LW+U zuq;KSv9VMboRvs9)}2PAO|b(JCEC_A0wq{uEj|3x@}*=bOd zwr{TgeCGG>HT<@Zeq8y}vTpwDg#UBvD)BEs@1KP$^3$sh&_joQPn{hjBXmLPJ{tC) z*HS`*2+VtJO{|e$mM^|qv1R*8i(m1`%)}g=SU#T#0KlTM2RSvYUc1fP+va|4;5}Bfz98UvDCpq7}+SMV&;nX zQw~N6qOX{P55{#LQkrZk(e5YGzr|(B;Q;ju;2a`q+S9bsEH@i1{_Y0;hWYn1-79jl z5c&bytD*k)GqrVcHn6t-7kinadiD>B{Tl`ZY@`g|b~pvHh5!gKP4({rp?D0aFd_cN zhHRo4dd5^S6ViN(>(28qZT6E>??aRhc($kP`>@<+lIKS5HdhjVU;>f7<4))E*5|g{ z&d1}D|vpuV^eRj5j|xx9nwaCxXFG?Qbjn~_WSy=N}P0W>MP zG-F%70lX5Xr$a)2i6?i|iMyM|;Jtf*hO?=Jxj12oz&>P=1#h~lf%#fc73M2_(SUM- zf&qnjS80|_Y0lDgl&I?*eMumUklLe_=Td!9G@eR*tcPOgIShJipp3{A10u(4eT~DY zHezEj8V+7m!knn7)W!-5QI3=IvC^as5+TW1@Ern@yX| z7Nn~xVx&fGSr+L%4iohtS3w^{-H1A_5=r&x8}R!YZvp<2T^YFvj8G_vm}5q;^UOJf ztl=X3iL;;^^a#`t{Ae-%5Oq{?M#s6Npj+L(n-*LMI-yMR{)qki!~{5z{&`-iL}lgW zxo+tnvICK=lImjV$Z|O_cYj_PlEYCzu-XBz&XC-JVxUh9;6*z4fuBG+H{voCC;`~GYV|hj%j_&I zDZCj>Q_0RCwFauYoVMiUSB+*Mx`tg)bWmM^SwMA+?lBg12QUF_x2b)b?qb88K-YUd z0dO}3k#QirBV<5%jL$#wlf!60dizu;tsp(7XLdI=eQs?P`tOZYMjVq&jE)qK*6B^$ zBe>VvH5TO>s>izhwJJ$<`a8fakTL!yM^Zfr2hV9`f}}VVUXK39p@G|xYRz{fTI+Yq z20d=)iwjuG9RB$%$^&8#(c0_j0t_C~^|n+c`Apu|x7~;#cS-s=X1|C*YxX3ailhg_|0`g!E&GZJEr?bh#Tpb8siR=JxWKc{#w7g zWznLwi;zLFmM1g8V5-P#RsM@iX>TK$xsWuujcsVR^7TQ@!+vCD<>Bk9tdCo7Mzgq5 zv8d>dK9x8C@Qoh01u@3h0X_`SZluTb@5o;{4{{eF!-4405x8X7hewZWpz z2qEi4UTiXTvsa(0X7kQH{3VMF>W|6;6iTrrYD2fMggFA&-CBEfSqPlQDxqsa>{e2M z(R5PJ7uOooFc|9GU0ELA%m4&4Ja#cQpNw8i8ACAoK6?-px+oBl_yKmenZut#Xumjz zk8p^OV2KY&?5MUwGrBOo?ki`Sxo#?-Q4gw*Sh0k`@ zFTaYK2;}%Zk-68`#5DXU$2#=%YL#S&MTN8bF+!J2VT6x^XBci6O)Q#JfW{YMz) zOBM>t2rSj)n#0a3cjvu}r|k3od6W(SN}V-cL?bi*Iz-8uOcCcsX0L>ZXjLqk zZu2uHq5B|Kt>e+=pPKu=1P@1r9WLgYFq_TNV1p9pu0erHGd!+bBp!qGi+~4A(RsYN@CyXNrC&hxGmW)u5m35OmWwX`I+0yByglO`}HC4nGE^_HUs^&A(uaM zKPj^=qI{&ayOq#z=p&pnx@@k&I1JI>cttJcu@Ihljt?6p^6{|ds`0MoQwp+I{3l6` zB<9S((RpLG^>=Kic`1LnhpW2=Gu!x`m~=y;A`Qk!-w`IN;S8S930#vBVMv2vCKi}u z6<-VPrU0AnE&vzwV(CFC0gnZYcpa-l5T0ZS$P6(?9AM;`Aj~XDvt;Jua=jIgF=Fm? zdp=M$>`phx%+Gu};;-&7T|B1AcC#L4@mW5SV_^1BRbo6;2PWe$r+npRV`yc;T1mo& z+~_?7rA+(Um&o@Tddl zL_hxvWk~a)yY}%j`Y+200D%9$bWHy&;(yj{jpi?Rtz{J66ANw)UyPOm;t6FzY3$hx zcn)Ir79nhFvNa7^a{SHN7XH*|Vlsx`CddPnA&Qvh8aNhEA;mPVv;Ah=k<*u!Zq^7 z<=xs*iQTQOMMcg|(NA_auh@x`3#_LFt=)}%SQppP{E>mu_LgquAWvh<>L7tf9+~rO znwUDS52u)OtY<~!d$;m9+87aO+&`#2ICl@Y>&F{jI=H(K+@3M1$rr=*H^dye#~TyD z!){#Pyfn+|ugUu}G;a~!&&0aqQ59U@UT3|_JuBlYUpT$2+11;}JBJ`{+lQN9T@QFY z5+`t;6(TS0F?OlBTE!@7D`8#URDNqx2t6`GZ{ZgXeS@v%-eJzZOHz18aS|svxII$a zZeFjrJ*$IwX$f-Rzr_G>xbu@euGl)B7pC&S+CmDJBg$BoV~jxSO#>y z33`bupN#LDoW0feZe0%q8un0rYN|eRAnwDHQ6e_)xBTbtoZtTA=Fvk){q}9Os~6mQ zKB80VI_&6iSq`LnK7*kfHZoeX6?WE}8yjuDn=2#JG$+;-TOA1%^=DnXx%w{b=w}tS zQbU3XxtOI8E(!%`64r2`zog;5<0b4i)xBmGP^jiDZ2%HNSxIf3@wKs~uk4%3Mxz;~ zts_S~E4>W+YwI<-*-$U8*^HKDEa8oLbmqGg?3vewnaNg%Mm)W=)lcC_J+1ov^u*N3 zXJ?!BrH-+wGYziJq2Y#vyry6Z>NPgkEk+Ke`^DvNRdb>Q2Nlr#v%O@<5hbflI6EKE z9dWc0-ORk^T}jP!nkJ1imyjdVX@GrjOs%cpgA8-c&FH&$(4od#x6Y&=LiJZPINVyW z0snY$8JW@>tc2}DlrD3StQmA0Twck~@>8dSix9CyQOALcREdxoM$Sw*l!}bXKq9&r zysMWR@%OY24@e`?+#xV2bk{T^C_xSo8v2ZI=lBI*l{RciPwuE>L5@uhz@{!l)rtVlWC>)6(G)1~n=Q|S!{E9~6*fdpa*n z!()-8EpTdj=zr_Lswi;#{TxbtH$8*G=UM`I+icz7sr_SdnHXrv=?iEOF1UL+*6O;% zPw>t^kbW9X@oEXx<97%lBm-9?O_7L!DeD)Me#rwE54t~UBu9VZ zl_I1tBB~>jm@bw0Aljz8! zXBB6ATG6iByKIxs!qr%pz%wgqbg(l{65DP4#v(vqhhL{0b#0C8mq`bnqZ1OwFV z7mlZZJFMACm>h9v^2J9+^_zc1=JjL#qM5ZHaThH&n zXPTsR8(+)cj&>Un{6v*z?@VTLr{TmZ@-fY%*o2G}*G}#!bmqpoo*Ay@U!JI^Q@7gj;Kg-HIrLj4}#ec4~D2~X6vo;ghep-@&yOivYP zC19L0D`jjKy1Yi-SGPAn94(768Tcf$urAf{)1)9W58P`6MA{YG%O?|07!g9(b`8PXG1B1Sh0?HQmeJtP0M$O$hI z{5G`&9XzYhh|y@qsF1GnHN|~^ru~HVf#)lOTSrv=S@DyR$UKQk zjdEPFDz{uHM&UM;=mG!xKvp;xAGHOBo~>_=WFTmh$chpC7c`~7?36h)7$fF~Ii}8q zF|YXxH-Z?d+Q+27Rs3X9S&K3N+)OBxMHn1u(vlrUC6ckBY@@jl+mgr#KQUKo#VeFm zFwNYgv0<%~Wn}KeLeD9e1$S>jhOq&(e*I@L<=I5b(?G(zpqI*WBqf|Zge0&aoDUsC zngMRA_Kt0>La+Erl=Uv_J^p(z=!?XHpenzn$%EA`JIq#yYF?JLDMYiPfM(&Csr#f{ zdd+LJL1by?xz|D8+(fgzRs~(N1k9DSyK@LJygwaYX8dZl0W!I&c^K?7)z{2is;OkE zd$VK-(uH#AUaZrp=1z;O*n=b?QJkxu`Xsw&7yrX0?(CX=I-C#T;yi8a<{E~?vr3W> zQrpPqOW2M+AnZ&p{hqmHZU-;Q(7?- zP8L|Q0RM~sB0w1w53f&Kd*y}ofx@c z5Y6B8qGel+uT1JMot$nT1!Tim6{>oZzJXdyA+4euOLME?5Fd_85Uk%#E*ln%y{u8Q z$|?|R@Hpb~yTVK-Yr_S#%NUy7EBfYGAg>b({J|5b+j-PBpPy$Ns`PaJin4JdRfOaS zE|<HjH%NuJgsd2wOlv>~y=np%=2)$M9LS|>P)zJ+Fei5vYo_N~B0XCn+GM76 z)Xz3tg*FRVFgIl9zpESgdpWAavvVViGlU8|UFY{{gVJskg*I!ZjWyk~OW-Td4(mZ6 zB&SQreAAMqwp}rjy`HsG({l2&q5Y52<@AULVAu~rWI$UbFuZs>Sc*x+XI<+ez%$U)|a^unjpiW0l0 zj1!K0(b6$8LOjzRqQ~K&dfbMIE=TF}XFAi)$+h}5SD3lo z%%Qd>p9se=VtQG{kQ;N`sI)G^u|DN#7{aoEd zkksYP%_X$Rq08);-s6o>CGJ<}v`qs%eYf+J%DQ^2k68C%nvikRsN?$ap--f+vCS`K z#&~)f7!N^;sdUXu54gl3L=LN>FB^tuK=y2e#|hWiWUls__n@L|>xH{%8lIJTd5`w? zSwZbnS;W~DawT4OwSJVdAylbY+u5S+ZH{4hAi2&}Iv~W(UvHg(1GTZRPz`@{SOqzy z(8g&Dz=$PfRV=6FgxN~zo+G8OoPI&d-thcGVR*_^(R8COTM@bq?fDwY{}WhsQS1AK zF6R1t8!RdFmfocpJ6?9Yv~;WYi~XPgs(|>{5})j!AR!voO7y9&cMPo#80A(`za@t>cx<0;qxM@S*m(jYP)dMXr*?q0E`oL;12}VAep179uEr8c<=D zr5?A*C{eJ`z9Ee;E$8)MECqatHkbHH z&Y+ho0B$31MIB-xm&;xyaFCtg<{m~M-QDbY)fQ>Q*Xibb~8ytxZQ?QMf9!%cV zU0_X1@b4d+Pg#R!`OJ~DOrQz3@cpiGy~XSKjZQQ|^4J1puvwKeScrH8o{bscBsowomu z^f12kTvje`yEI3eEXDHJ6L+O{Jv$HVj%IKb|J{IvD*l6IG8WUgDJ*UGz z3!C%>?=dlfSJ>4U88)V+`U-!9r^@AxJBx8R;)J4Fn@`~k>8>v0M9xp90OJElWP&R5 zM#v*vtT}*Gm1^)Bv!s72T3PB0yVIjJW)H7a)ilkAvoaH?)jjb`MP>2z{%Y?}83 zUIwBKn`-MSg)=?R)1Q0z3b>dHE^)D8LFs}6ASG1|daDly_^lOSy&zIIhm*HXm1?VS=_iacG);_I9c zUQH1>i#*?oPIwBMJkzi_*>HoUe}_4o>2(SHWzqQ=;TyhAHS;Enr7!#8;sdlty&(>d zl%5cjri8`2X^Ds`jnw7>A`X|bl=U8n+3LKLy(1dAu8`g@9=5iw$R0qk)w8Vh_Dt^U zIglK}sn^)W7aB(Q>HvrX=rxB z+*L)3DiqpQ_%~|m=44LcD4-bxO3OO*LPjsh%p(k?&jvLp0py57oMH|*IMa(<|{m1(0S|x)?R-mqJ=I;_YUZA>J z62v*eSK;5w!h8J+6Z2~oyGdZ68waWfy09?4fU&m7%u~zi?YPHPgK6LDwphgaYu%0j zurtw)AYOpYKgHBrkX189mlJ`q)w-f|6>IER{5Lk97%P~a-JyCRFjejW@L>n4vt6#hq;!|m;hNE||LK3nw1{bJOy+eBJjK=QqNjI;Q6;Rp5 z&035pZDUZ#%Oa;&_7x0T<7!RW`#YBOj}F380Bq?MjjEhrvlCATPdkCTTl+2efTX$k zH&0zR1n^`C3ef~^sXzJK-)52(T}uTG%OF8yDhT76L~|^+hZ2hiSM*QA9*D5odI1>& z9kV9jC~twA5MwyOx(lsGD_ggYmztXPD`2=_V|ks_FOx!_J8!zM zTzh^cc+=VNZ&(OdN=y4Juw)@8-85lwf_#VMN!Ed(eQiRiLB2^2e`4dp286h@v@`O%_b)Y~A; zv}r6U?zs&@uD_+(_4bwoy7*uozNvp?bXFoB8?l8yG0qsm1JYzIvB_OH4_2G*IIOwT zVl%HX1562vLVcxM_RG*~w_`FbIc!(T=3>r528#%mwwMK}uEhJ()3MEby zQQjzqjWkwfI~;Fuj(Lj=Ug0y`>~C7`w&wzjK(rPw+Hpd~EvQ-ufQOiB4OMpyUKJhw zqEt~jle9d7S~LI~$6Z->J~QJ{Vdn3!c}g9}*KG^Kzr^(7VI5Gk(mHLL{itj_hG?&K4Ws0+T4gLfi3eu$N=`s36geNC?c zm!~}vG6lx9Uf^5M;bWntF<-{p^bruy~f?sk9 zcETAPQZLoJ8JzMMg<-=ju4keY@SY%Wo?u9Gx=j&dfa6LIAB|IrbORLV1-H==Z1zCM zeZcOYpm5>U2fU7V*h;%n`8 zN95QhfD994={1*<2vKLCNF)feKOGk`R#K~G=;rfq}|)s20&MCa65 zUM?xF5!&e0lF%|U!#rD@I{~OsS_?=;s_MQ_b_s=PuWdC)q|UQ&ea)DMRh5>fpQjXe z%9#*x=7{iRCtBKT#H>#v%>77|{4_slZ)XCY{s3j_r{tdpvb#|r|sbS^dU1x70$eJMU!h{Y7Kd{dl}9&vxQl6Jt1a` zHQZrWyY0?!vqf@u-fxU_@+}u(%Wm>0I#KP48tiAPYY!TdW(o|KtVI|EUB9V`CBBNaBLVih7+yMVF|GSoIQD0Jfb{ z!OXq;(>Z?O`1gap(L~bUcp>Lc@Jl-})^=6P%<~~9ywY=$iu8pJ0m*hOPzr~q`23eX zgbs;VOxxENe0UMVeN*>uCn9Gk!4siN-e>x)pIKAbQz!G)TcqIJ0`JBBaX>1-4_XO_-HCS^vr2vjv#7KltDZdyQ{tlWh4$Gm zB>|O1cBDC)yG(sbnc*@w6e%e}r*|IhpXckx&;sQCwGdKH+3oSG-2)Bf#x`@<4ETAr z0My%7RFh6ZLiZ_;X6Mu1YmXx7C$lSZ^}1h;j`EZd6@%JNUe=btBE z%s=Xmo1Ps?8G`}9+6>iaB8bgjUdXT?=trMu|4yLX^m0Dg{m7rpKNJey|EwHI+nN1e zL^>qN%5Fg)dGs4DO~uwIdXImN)QJ*Jhpj7$fq_^`{3fwpztL@WBB}OwQ#Epo-mqMO zsM$UgpFiG&d#)lzEQ{3Q;)&zTw;SzGOah-Dpm{!q7<8*)Ti_;xvV2TYXa}=faXZy? z3y?~GY@kl)>G&EvEijk9y1S`*=zBJSB1iet>0;x1Ai)*`^{pj0JMs)KAM=@UyOGtO z3y0BouW$N&TnwU6!%zS%nIrnANvZF&vB1~P5_d`x-giHuG zPJ;>XkVoghm#kZXRf>qxxEix;2;D1CC~NrbO6NBX!`&_$iXwP~P*c($EVV|669kDO zKoTLZNF4Cskh!Jz5ga9uZ`3o%7Pv`d^;a=cXI|>y;zC3rYPFLQkF*nv(r>SQvD*## z(Vo%^9g`%XwS0t#94zPq;mYGLKu4LU3;txF26?V~A0xZbU4Lmy`)>SoQX^m7fd^*E z+%{R4eN!rIk~K)M&UEzxp9dbY;_I^c} zOc{wlIrN_P(PPqi51k_$>Lt|X6A^|CGYgKAmoI#Li?;Wq%q~q*L7ehZkUrMxW67Jl zhsb~+U?33QS>eqyN{(odAkbopo=Q$Az?L+NZW>j;#~@wCDX?=L5SI|OxI~7!Pli;e zELMFcZtJY3!|=Gr2L4>z8yQ-{To>(f80*#;6`4IAiqUw`=Pg$%C?#1 z_g@hIGerILSU>=P>z{gM|DS91A4cT@PEIB^hSop!uhMo#2G;+tQSpDO_6nOnPWSLU zS;a9m^DFMXR4?*X=}d7l;nXuHk&0|m`NQn%d?8|Ab3A9l9Jh5s120ibWBdB z$5YwsK3;wvp!Kn@)Qae{ef`0#NwlRpQ}k^r>yos_Ne1;xyKLO?4)t_G4eK~wkUS2A&@_;)K0-03XGBzU+5f+uMDxC z(s8!8!RvdC#@`~fx$r)TKdLD6fWEVdEYtV#{ncT-ZMX~eI#UeQ-+H(Z43vVn%Yj9X zLdu9>o%wnWdvzA-#d6Z~vzj-}V3FQ5;axDIZ;i(95IIU=GQ4WuU{tl-{gk!5{l4_d zvvb&uE{%!iFwpymz{wh?bKr1*qzeZb5f6e6m_ozRF&zux2mlK=v_(_s^R6b5lu?_W4W3#<$zeG~Pd)^!4tzhs}-Sx$FJP>)ZGF(hVTH|C3(U zs0PO&*h_ zNA-&qZpTP$$LtIgfiCn07}XDbK#HIXdmv8zdz4TY;ifNIH-0jy(gMSByG2EF~Th#eb_TueZC` zE?3I>UTMpKQ})=C;6p!?G)M6w^u*A57bD?2X`m3X^6;&4%i_m(uGJ3Z5h`nwxM<)H z$I5m?wN>O~8`BGnZ=y^p6;0+%_0K}Dcg|K;+fEi|qoBqvHj(M&aHGqNF48~XqhtU? z^ogwBzRlOfpAJ+Rw7IED8lRbTdBdyEK$gPUpUG}j-M42xDj_&qEAQEtbs>D#dRd7Y z<&TpSZ(quQDHiCFn&0xsrz~4`4tz!CdL8m~HxZM_agu@IrBpyeL1Ft}V$HX_ZqDPm z-f89)pjuEzGdq-PRu`b1m+qBGY{zr_>{6Ss>F|xHZlJj9dt5HD$u`1*WZe)qEIuDSR)%z+|n zatVlhQ?$w#XRS7xUrFE;Y8vMGhQS5*T{ZnY=q1P?w5g$OKJ#M&e??tAmPWHMj3xhS ziGxapy?kn@$~2%ZY;M8Bc@%$pkl%Rvj!?o%agBvpQ-Q61n9kznC4ttrRNQ4%GFR5u zyv%Yo9~yxQJWJSfj z?#HY$y=O~F|2pZs22pu|_&Ajd+D(Mt!nPUG{|1nlvP`=R#kKH zO*s$r_%ss5h1YO7k0bHJ2CXN)Yd6CHn~W!R=SqkWe=&nAZu(Q1G!xgcUilM@YVei@2@a`8he z9@pM`)VB*=e7-MWgLlXlc)t;fF&-AwM{E-EX}pViFn0I0CNw2bNEnN2dj!^4(^zS3 zobUm1uQnpqk_4q{pl*n06=TfK_C>UgurKFjRXsK_LEn};=79`TB12tv6KzwSu*-C8 z;=~ohDLZylHQ|Mpx-?yql>|e=vI1Z!epyUpAcDCp4T|*RV&X`Q$0ogNwy6mFALo^@ z9=&(9txO8V@E!@6^(W0{*~CT>+-MA~vnJULBxCTUW>X5>r7*eXYUT0B6+w@lzw%n> z_VjJ<2qf|(d6jYq2(x$(ZDf!yVkfnbvNmb5c|hhZ^2TV_LBz`9w!e_V*W_(MiA7|= z&EeIIkw*+$Xd!)j8<@_<}A5;~A_>3JT*kX^@}cDoLd>Qj<`Se^wdUa(j0dp+Tl8EptwBm{9OGsdFEq zM`!pjf(Lm(`$e3FLOjqA5LnN5o!}z{ zNf}rJuZh@yUtq&ErjHeGzX4(!luV!jB&;FAP|!R_QHYw#^Z1LwTePAKJ6X&IDNO#; z)#I@Xnnzyij~C@UH~X51JCgQeF0&hTXnuoElz#m{heZRexWc0k4<>0+ClX7%0 zEBqCCld1tD9Zwkr4{?Nor19#E5-YKfB8d?qgR82-Ow2^AuNevly2*tHA|sK!ybYkX zm-sLQH72P&{vEAW6+z~O5d0qd=xW~rua~5a?ymYFSD@8&gV)E5@RNNBAj^C99+Z5Z zR@Pq55mbCQbz+Mn$d_CMW<-+?TU960agEk1J<>d>0K=pF19yN))a~4>m^G&tc*xR+yMD*S=yip-q=H zIlredHpsJV8H(32@Zxc@bX6a21dUV95Th--8pE6C&3F>pk=yv$yd6@Haw;$v4+Fcb zRwn{Qo@0`7aPa2LQOP}j9v>sjOo5Kqvn|`FLizX zB+@-u4Lw|jsvz{p^>n8Vo8H2peIqJJnMN}A)q6%$Tmig7eu^}K2 zrh$X?T|ZMsoh{6pdw1G$_T<`Ds-G=jc;qcGdK4{?dN2-XxjDNbb(7pk|3JUVCU4y; z)?LXR>f+AAu)JEiti_Zy#z5{RgsC}R(@jl%9YZ>zu~hKQ*AxbvhC378-I@{~#%Y`Z zy=a=9YpewPIC+gkEUUwtUL7|RU7=!^Aa}Mk^6uxOgRGA#JXjWLsjFUnix|Mau{hDT z7mn*z1m5g`vP(#tjT0Zy4eAY(br&!RiiXE=ZI!{sE1#^#%x^Z7t1U)b<;%Y}Q9=5v z;wpDCEZ@OE36TWT=|gxigT@VaW9BvHS05;_P(#s z8zI4XFQys}q)<`tkX$WnSarn{3e!s}4(J!=Yf>+Y>cP3f;vr63f2{|S^`_pWc)^5_!R z*(x-fuBxL51@xe!lnDBKi}Br$c$BMZ3%f2Sa6kLabiBS{pq*yj;q|k(86x`PiC{p6 z_bxCW{>Q2BA8~Ggz&0jkrcU+-$ANBsOop*ms>34K9lNYil@}jC;?cYP(m^P}nR6FV zk(M%48Z&%2Rx$A&FhOEirEhY0(dn;-k(qkTU)sFQ`+-ih+s@A8g?r8Pw+}2;35WYf zi}VO`jS`p(tc)$X$a>-#WXoW!phhatC*$}|rk>|wUU71eUJG^$c6_jwX?iSHM@6__ zvV|6%U*$sSXJu9SX?2%M^kK|}a2QJ8AhF{fuXrHZxXsI~O zGKX45!K7p*MCPEQ=gp?eu&#AW*pR{lhQR##P_*{c_DjMGL|3T3-bSJ(o$|M{ytU}> zAV>wq*uE*qFo9KvnA^@juy{x<-u*#2NvkV={Ly}ysKYB-k`K3@K#^S1Bb$8Y#0L0# z`6IkSG&|Z$ODy|VLS+y5pFJx&8tvPmMd8c9FhCyiU8~k6FwkakUd^(_ml8`rnl>JS zZV){9G*)xBqPz^LDqRwyS6w86#D^~xP4($150M)SOZRe9sn=>V#aG0Iy(_^YcPpIz8QYM-#s+n% z@Jd?xQq?Xk6=<3xSY7XYP$$yd&Spu{A#uafiIfy8gRC`o0nk{ezEDjb=q_qRAlR1d zFq^*9Gn)yTG4b}R{!+3hWQ+u3GT~8nwl2S1lpw`s0X_qpxv)g+JIkVKl${sYf_nV~B>Em>M;RlqGb5WVil(89 zs=ld@|#;dq1*vQGz=7--Br-|l) zZ%Xh@v8>B7P?~}?Cg$q9_={59l%m~O&*a6TKsCMAzG&vD>k2WDzJ6!tc!V)+oxF;h zJH;apM=wO?r_+*#;ulohuP=E>^zon}a$NnlcQ{1$SO*i=jnGVcQa^>QOILc)e6;eNTI>os=eaJ{*^DE+~jc zS}TYeOykDmJ=6O%>m`i*>&pO_S;qMySJIyP=}4E&J%#1zju$RpVAkZbEl+p%?ZP^C z*$$2b4t%a(e+%>a>d_f_<JjxI#J1x;=hPd1zFPx=6T$;;X1TD*2(edZ3f46zaAoW>L53vS_J*N8TMB|n+;LD| zC=GkQPpyDY#Am4l49chDv*gojhRj_?63&&8#doW`INATAo(qY#{q}%nf@eTIXmtU< zdB<7YWfyCmBs|c)cK>1)v&M#!yNj#4d$~pVfDWQc_ke1?fw{T1Nce_b`v|Vp5ig(H zJvRD^+ps46^hLX;=e2!2e;w9y1D@!D$c@Jc&%%%IL=+xzw55&2?darw=9g~>P z9>?Kdc$r?6c$m%x2S$sdpPl>GQZ{rC9mPS63*qjCVa?OIBj!fW zm|g?>CVfGXNjOfcyqImXR_(tXS(F{FcoNzKvG5R$IgGaxC@)i(e+$ME}vPVIhd|mx2IIE+f zM?9opQHIVgBWu)^A|RzXw!^??S!x)SZOwZaJkGjc<_}2l^eSBm!eAJG9T>EC6I_sy z?bxzDIAn&K5*mX)$RQzDA?s)-no-XF(g*yl4%+GBf`##bDXJ==AQk*xmnatI;SsLp zP9XTHq5mmS=iWu~9ES>b%Q=1aMa|ya^vj$@qz9S!ih{T8_PD%Sf_QrNKwgrXw9ldm zHRVR98*{C?_XNpJn{abA!oix_mowRMu^2lV-LPi;0+?-F(>^5#OHX-fPED zCu^l7u3E%STI}c4{J2!)9SUlGP_@!d?5W^QJXOI-Ea`hFMKjR7TluLvzC-ozCPn1`Tpy z!vlv@_Z58ILX6>nDjTp-1LlFMx~-%GA`aJvG$?8*Ihn;mH37eK**rmOEwqegf-Ccx zrIX4;{c~RK>XuTXxYo5kMiWMy)!IC{*DHG@E$hx?RwP@+wuad(P1{@%tRkyJRqD)3 zMHHHZ4boqDn>-=DgR5VlhQTpfVy182Gk;A_S8A1-;U1RR>+$62>(MUx@Nox$vTjHq z%QR=j!6Gdyb5wu7y(YUktwMuW5<@jl?m4cv4BODiT5o8qVdC0MBqGr@-YBIwnpZAY znX9(_uQjP}JJ=!~Ve9#5I~rUnN|P_3D$LqZcvBnywYhjlMSFHm`;u9GPla{5QD7(7*6Tb3Svr8;(nuAd81q$*uq6HC_&~je*Ca7hP4sJp0av{M8480wF zxASi7Qv+~@2U%Nu1Ud;s-G4CTVWIPyx!sg&8ZG0Wq zG_}i3C(6_1>q3w!EH7$Kwq8uBp2F2N7}l65mk1p*9v0&+;th=_E-W)E;w}P(j⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/shared/sentry/src/ndk/gradle/wrapper/gradle-wrapper.properties b/shared/sentry/src/ndk/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..3fa8f862f --- /dev/null +++ b/shared/sentry/src/ndk/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/shared/sentry/src/ndk/gradlew b/shared/sentry/src/ndk/gradlew new file mode 100755 index 000000000..1aa94a426 --- /dev/null +++ b/shared/sentry/src/ndk/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/shared/sentry/src/ndk/gradlew.bat b/shared/sentry/src/ndk/gradlew.bat new file mode 100644 index 000000000..6689b85be --- /dev/null +++ b/shared/sentry/src/ndk/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/shared/sentry/src/ndk/lib/CMakeLists.txt b/shared/sentry/src/ndk/lib/CMakeLists.txt new file mode 100644 index 000000000..b9f8f4a4b --- /dev/null +++ b/shared/sentry/src/ndk/lib/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.10) +project(Sentry-Android LANGUAGES C CXX) + +# Add sentry-android shared library +add_library(sentry-android SHARED src/main/jni/sentry.c) + +# make sure that we build it as a shared lib instead of a static lib +set(BUILD_SHARED_LIBS ON) +set(SENTRY_BUILD_SHARED_LIBS ON) + +# Adding sentry-native project +add_subdirectory(${SENTRY_NATIVE_SRC} sentry_build) + +# Link to sentry-native +target_link_libraries(sentry-android PRIVATE + $ +) diff --git a/shared/sentry/src/ndk/lib/api/sentry-android-ndk.api b/shared/sentry/src/ndk/lib/api/sentry-android-ndk.api new file mode 100644 index 000000000..e8f838ce8 --- /dev/null +++ b/shared/sentry/src/ndk/lib/api/sentry-android-ndk.api @@ -0,0 +1,29 @@ +public final class io/sentry/android/ndk/BuildConfig { + public static final field BUILD_TYPE Ljava/lang/String; + public static final field DEBUG Z + public static final field LIBRARY_PACKAGE_NAME Ljava/lang/String; + public static final field VERSION_NAME Ljava/lang/String; + public fun ()V +} + +public final class io/sentry/android/ndk/DebugImagesLoader : io/sentry/android/core/IDebugImagesLoader { + public fun (Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/ndk/NativeModuleListLoader;)V + public fun clearDebugImages ()V + public fun loadDebugImages ()Ljava/util/List; +} + +public final class io/sentry/android/ndk/NdkScopeObserver : io/sentry/ScopeObserverAdapter { + public fun (Lio/sentry/SentryOptions;)V + public fun addBreadcrumb (Lio/sentry/Breadcrumb;)V + public fun removeExtra (Ljava/lang/String;)V + public fun removeTag (Ljava/lang/String;)V + public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V + public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setUser (Lio/sentry/protocol/User;)V +} + +public final class io/sentry/android/ndk/SentryNdk { + public static fun close ()V + public static fun init (Lio/sentry/android/core/SentryAndroidOptions;)V +} + diff --git a/shared/sentry/src/ndk/lib/build.gradle.kts b/shared/sentry/src/ndk/lib/build.gradle.kts new file mode 100644 index 000000000..8e3600a59 --- /dev/null +++ b/shared/sentry/src/ndk/lib/build.gradle.kts @@ -0,0 +1,132 @@ +plugins { + id("com.android.library") + kotlin("android") + id("com.ydq.android.gradle.native-aar.export") +} + +var sentryNativeSrc: String = "${project.projectDir}/../.." + +android { + compileSdk = 34 + namespace = "io.sentry.ndk" + + defaultConfig { + minSdk = 19 + + externalNativeBuild { + cmake { + arguments.add(0, "-DANDROID_STL=c++_static") + arguments.add(0, "-DSENTRY_NATIVE_SRC=$sentryNativeSrc") + } + } + + ndk { + abiFilters.addAll(listOf("x86", "armeabi-v7a", "x86_64", "arm64-v8a")) + } + } + + // we use the default NDK and CMake versions based on the AGP's version + // https://developer.android.com/studio/projects/install-ndk#apply-specific-version + externalNativeBuild { + cmake { + path("CMakeLists.txt") + } + } + + buildTypes { + getByName("debug") + getByName("release") { + consumerProguardFiles("proguard-rules.pro") + } + } + + buildFeatures { + prefabPublishing = true + } + + // creates + // lib.aar/prefab/modules/sentry-android/libs//.so + // lib.aar/prefab/modules/sentry-android/include/sentry.h + prefab { + create("sentry-android") {} + create("sentry") { + headers = "../../include" + } + } + + // legacy pre-prefab support + // https://github.com/howardpang/androidNativeBundle + // creates + // lib.aar/jni//.so + // lib.aar/jni/include/sentry.h + nativeBundleExport { + headerDir = "../../include" + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + testOptions { + animationsDisabled = true + unitTests.apply { + isReturnDefaultValues = true + isIncludeAndroidResources = true + } + } + + lint { + warningsAsErrors = true + checkDependencies = true + checkReleaseBuilds = true + } + + variantFilter { + if (System.getenv("CI")?.toBoolean() == true && buildType.name == "debug") { + ignore = true + } + } +} + +dependencies { + compileOnly("org.jetbrains:annotations:23.0.0") +} + +/* + * Prefab doesn't support c++_static, so we need to change it to none. + * This should be fine, as we don't expose any conflicting symbols. + * Based on: https://github.com/bugsnag/bugsnag-android/blob/59460018551750dfcce4fd4e9f612eae7826559e/bugsnag-plugin-android-ndk/build.gradle.kts + * + * Copyright (c) 2012 Bugsnag + + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +afterEvaluate { + tasks.getByName("prefabReleasePackage") { + doLast { + project.fileTree("build/intermediates/prefab_package/") { + include("**/abi.json") + }.forEach { file -> + file.writeText(file.readText().replace("c++_static", "none")) + } + } + } +} diff --git a/shared/sentry/src/ndk/lib/proguard-rules.pro b/shared/sentry/src/ndk/lib/proguard-rules.pro new file mode 100644 index 000000000..a6d1d5f15 --- /dev/null +++ b/shared/sentry/src/ndk/lib/proguard-rules.pro @@ -0,0 +1,22 @@ +##---------------Begin: proguard configuration for NDK ---------- + +# The Android SDK checks at runtime if this class is available via Class.forName +-keep class io.sentry.ndk.SentryNdk { *; } + +# The JNI layer uses this class through reflection +-keep class io.sentry.ndk.NdkOptions { *; } +-keep class io.sentry.ndk.DebugImage { *; } + +# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native +-keepclasseswithmembernames,includedescriptorclasses class * { + native ; +} + +# don't warn jetbrains annotations +-dontwarn org.jetbrains.annotations.** + +# To ensure that stack traces is unambiguous +# https://developer.android.com/studio/build/shrink-code#decode-stack-trace +-keepattributes LineNumberTable,SourceFile + +##---------------End: proguard configuration for NDK ---------- diff --git a/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/DebugImage.java b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/DebugImage.java new file mode 100644 index 000000000..e06b6e2b4 --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/DebugImage.java @@ -0,0 +1,199 @@ +package io.sentry.ndk; + +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public final class DebugImage { + + /** + * The unique UUID of the image. + * + *

UUID computed from the file contents, assigned by the Java SDK. + */ + private @Nullable String uuid; + + private @Nullable String type; + /** + * Unique debug identifier of the image. + * + *

- `elf`: Debug identifier of the dynamic library or executable. If a code identifier is + * available, the debug identifier is the little-endian UUID representation of the first 16-bytes + * of that identifier. Spaces are inserted for readability, note the byte order of the first + * fields: + * + *

```text code id: f1c3bcc0 2798 65fe 3058 404b2831d9e6 4135386c debug id: + * c0bcc3f1-9827-fe65-3058-404b2831d9e6 ``` + * + *

If no code id is available, the debug id should be computed by XORing the first 4096 bytes + * of the `.text` section in 16-byte chunks, and representing it as a little-endian UUID (again + * swapping the byte order). + * + *

- `pe`: `signature` and `age` of the PDB file. Both values can be read from the CodeView + * PDB70 debug information header in the PE. The value should be represented as little-endian + * UUID, with the age appended at the end. Note that the byte order of the UUID fields must be + * swapped (spaces inserted for readability): + * + *

```text signature: f1c3bcc0 2798 65fe 3058 404b2831d9e6 age: 1 debug_id: + * c0bcc3f1-9827-fe65-3058-404b2831d9e6-1 ``` + * + *

- `macho`: Identifier of the dynamic library or executable. It is the value of the `LC_UUID` + * load command in the Mach header, formatted as UUID. + */ + private @Nullable String debugId; + + /** + * Path and name of the debug companion file. + * + *

- `elf`: Name or absolute path to the file containing stripped debug information for this + * image. This value might be _required_ to retrieve debug files from certain symbol servers. + * + *

- `pe`: Name of the PDB file containing debug information for this image. This value is + * often required to retrieve debug files from specific symbol servers. + * + *

- `macho`: Name or absolute path to the dSYM file containing debug information for this + * image. This value might be required to retrieve debug files from certain symbol servers. + */ + private @Nullable String debugFile; + /** + * Optional identifier of the code file. + * + *

- `elf`: If the program was compiled with a relatively recent compiler, this should be the + * hex representation of the `NT_GNU_BUILD_ID` program header (type `PT_NOTE`), or the value of + * the `.note.gnu.build-id` note section (type `SHT_NOTE`). Otherwise, leave this value empty. + * + *

Certain symbol servers use the code identifier to locate debug information for ELF images, + * in which case this field should be included if possible. + * + *

- `pe`: Identifier of the executable or DLL. It contains the values of the `time_date_stamp` + * from the COFF header and `size_of_image` from the optional header formatted together into a hex + * string using `%08x%X` (note that the second value is not padded): + * + *

```text time_date_stamp: 0x5ab38077 size_of_image: 0x9000 code_id: 5ab380779000 ``` + * + *

The code identifier should be provided to allow server-side stack walking of binary crash + * reports, such as Minidumps. + * + *

+ * + *

- `macho`: Identifier of the dynamic library or executable. It is the value of the `LC_UUID` + * load command in the Mach header, formatted as UUID. Can be empty for Mach images, as it is + * equivalent to the debug identifier. + */ + private @Nullable String codeId; + /** + * Path and name of the image file (required). + * + *

The absolute path to the dynamic library or executable. This helps to locate the file if it + * is missing on Sentry. + * + *

- `pe`: The code file should be provided to allow server-side stack walking of binary crash + * reports, such as Minidumps. + */ + private @Nullable String codeFile; + /** + * Starting memory address of the image (required). + * + *

Memory address, at which the image is mounted in the virtual address space of the process. + * Should be a string in hex representation prefixed with `"0x"`. + */ + private @Nullable String imageAddr; + /** + * Size of the image in bytes (required). + * + *

The size of the image in virtual memory. If missing, Sentry will assume that the image spans + * up to the next image, which might lead to invalid stack traces. + */ + private @Nullable Long imageSize; + /** + * CPU architecture target. + * + *

Architecture of the module. If missing, this will be backfilled by Sentry. + */ + private @Nullable String arch; + + @SuppressWarnings("unused") + private @Nullable Map unknown; + + public @Nullable String getUuid() { + return uuid; + } + + public void setUuid(final @Nullable String uuid) { + this.uuid = uuid; + } + + public @Nullable String getType() { + return type; + } + + public void setType(final @Nullable String type) { + this.type = type; + } + + public @Nullable String getDebugId() { + return debugId; + } + + public void setDebugId(final @Nullable String debugId) { + this.debugId = debugId; + } + + public @Nullable String getDebugFile() { + return debugFile; + } + + public void setDebugFile(final @Nullable String debugFile) { + this.debugFile = debugFile; + } + + public @Nullable String getCodeFile() { + return codeFile; + } + + public void setCodeFile(final @Nullable String codeFile) { + this.codeFile = codeFile; + } + + public @Nullable String getImageAddr() { + return imageAddr; + } + + public void setImageAddr(final @Nullable String imageAddr) { + this.imageAddr = imageAddr; + } + + public @Nullable Long getImageSize() { + return imageSize; + } + + public void setImageSize(final @Nullable Long imageSize) { + this.imageSize = imageSize; + } + + /** + * Sets the image size. + * + * @param imageSize the image size. + */ + public void setImageSize(long imageSize) { + this.imageSize = imageSize; + } + + public @Nullable String getArch() { + return arch; + } + + public void setArch(final @Nullable String arch) { + this.arch = arch; + } + + public @Nullable String getCodeId() { + return codeId; + } + + public void setCodeId(final @Nullable String codeId) { + this.codeId = codeId; + } + +} diff --git a/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java new file mode 100644 index 000000000..4053929b3 --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java @@ -0,0 +1,18 @@ +package io.sentry.ndk; + +public interface INativeScope { + void setTag(String key, String value); + + void removeTag(String key); + + void setExtra(String key, String value); + + void removeExtra(String key); + + void setUser(String id, String email, String ipAddress, String username); + + void removeUser(); + + void addBreadcrumb( + String level, String message, String category, String type, String timestamp, String data); +} diff --git a/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeModuleListLoader.java b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeModuleListLoader.java new file mode 100644 index 000000000..c6612cef7 --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeModuleListLoader.java @@ -0,0 +1,18 @@ +package io.sentry.ndk; + +import org.jetbrains.annotations.Nullable; + +public final class NativeModuleListLoader { + + public static native DebugImage[] nativeLoadModuleList(); + + public static native void nativeClearModuleList(); + + public @Nullable DebugImage[] loadModuleList() { + return nativeLoadModuleList(); + } + + public void clearModuleList() { + nativeClearModuleList(); + } +} diff --git a/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java new file mode 100644 index 000000000..18df418f7 --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java @@ -0,0 +1,55 @@ +package io.sentry.ndk; + +public final class NativeScope implements INativeScope { + public static native void nativeSetTag(String key, String value); + + public static native void nativeRemoveTag(String key); + + public static native void nativeSetExtra(String key, String value); + + public static native void nativeRemoveExtra(String key); + + public static native void nativeSetUser( + String id, String email, String ipAddress, String username); + + public static native void nativeRemoveUser(); + + public static native void nativeAddBreadcrumb( + String level, String message, String category, String type, String timestamp, String data); + + @Override + public void setTag(String key, String value) { + nativeSetTag(key, value); + } + + @Override + public void removeTag(String key) { + nativeRemoveTag(key); + } + + @Override + public void setExtra(String key, String value) { + nativeSetExtra(key, value); + } + + @Override + public void removeExtra(String key) { + nativeRemoveExtra(key); + } + + @Override + public void setUser(String id, String email, String ipAddress, String username) { + nativeSetUser(id, email, ipAddress, username); + } + + @Override + public void removeUser() { + nativeRemoveUser(); + } + + @Override + public void addBreadcrumb( + String level, String message, String category, String type, String timestamp, String data) { + nativeAddBreadcrumb(level, message, category, type, timestamp, data); + } +} diff --git a/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NdkOptions.java b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NdkOptions.java new file mode 100644 index 000000000..c4ed14f40 --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/NdkOptions.java @@ -0,0 +1,64 @@ +package io.sentry.ndk; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public final class NdkOptions { + private final @NotNull String dsn; + private final boolean isDebug; + private final @NotNull String outboxPath; + private final @Nullable String release; + private final @Nullable String environment; + private final @Nullable String dist; + private final int maxBreadcrumbs; + private final @Nullable String sdkName; + + public NdkOptions(@NotNull String dsn, boolean isDebug, @NotNull String outboxPath, @Nullable String release, @Nullable String environment, @Nullable String dist, int maxBreadcrumbs, @Nullable String sdkName) { + this.dsn = dsn; + this.isDebug = isDebug; + this.outboxPath = outboxPath; + this.release = release; + this.environment = environment; + this.dist = dist; + this.maxBreadcrumbs = maxBreadcrumbs; + this.sdkName = sdkName; + } + + @NotNull + public String getDsn() { + return dsn; + } + + public boolean isDebug() { + return isDebug; + } + + @NotNull + public String getOutboxPath() { + return outboxPath; + } + + @Nullable + public String getRelease() { + return release; + } + + @Nullable + public String getEnvironment() { + return environment; + } + + @Nullable + public String getDist() { + return dist; + } + + public int getMaxBreadcrumbs() { + return maxBreadcrumbs; + } + + @Nullable + public String getSdkName() { + return sdkName; + } +} diff --git a/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java new file mode 100644 index 000000000..58394188c --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java @@ -0,0 +1,42 @@ +package io.sentry.ndk; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +@ApiStatus.Internal +public final class SentryNdk { + + static { + // On older Android versions, it was necessary to manually call "`System.loadLibrary` on all + // transitive dependencies before loading [the] main library." + // The dependencies of `libsentry.so` are currently `lib{c,m,dl,log}.so`. + // See + // https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#changes-to-library-dependency-resolution + System.loadLibrary("log"); + System.loadLibrary("sentry"); + System.loadLibrary("sentry-android"); + } + + private SentryNdk() { + } + + private static native void initSentryNative(@NotNull final NdkOptions options); + + private static native void shutdown(); + + /** + * Init the NDK integration + * + * @param options the SentryAndroidOptions + */ + public static void init(@NotNull final NdkOptions options) { + initSentryNative(options); + } + + /** + * Closes the NDK integration + */ + public static void close() { + shutdown(); + } +} diff --git a/shared/sentry/src/ndk/lib/src/main/jni/sentry.c b/shared/sentry/src/ndk/lib/src/main/jni/sentry.c new file mode 100644 index 000000000..ee412a01a --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/jni/sentry.c @@ -0,0 +1,489 @@ +#include +#include +#include +#include +#include + +#define ENSURE(Expr) \ + if (!(Expr)) \ + return + +#define ENSURE_OR_FAIL(Expr) \ + if (!(Expr)) \ + goto fail + +static bool get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) { + jsize utf_len = (*env)->GetStringUTFLength(env, jstr); + if ((size_t) utf_len >= buf_len) { + return false; + } + + jsize j_len = (*env)->GetStringLength(env, jstr); + + (*env)->GetStringUTFRegion(env, jstr, 0, j_len, buf); + if ((*env)->ExceptionCheck(env) == JNI_TRUE) { + return false; + } + + buf[utf_len] = '\0'; + return true; +} + +static char *get_string(JNIEnv *env, jstring jstr) { + char *buf = NULL; + + jsize utf_len = (*env)->GetStringUTFLength(env, jstr); + size_t buf_len = (size_t) utf_len + 1; + buf = sentry_malloc(buf_len); + ENSURE_OR_FAIL(buf); + + ENSURE_OR_FAIL(get_string_into(env, jstr, buf, buf_len)); + + return buf; + + fail: + sentry_free(buf); + + return NULL; +} + +static char *call_get_string(JNIEnv *env, jobject obj, jmethodID mid) { + jstring j_str = (jstring) (*env)->CallObjectMethod(env, obj, mid); + ENSURE_OR_FAIL(j_str); + char *str = get_string(env, j_str); + (*env)->DeleteLocalRef(env, j_str); + + return str; + + fail: + return NULL; +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeSetTag( + JNIEnv *env, + jclass cls, + jstring key, + jstring value) { + const char *charKey = (*env)->GetStringUTFChars(env, key, 0); + const char *charValue = (*env)->GetStringUTFChars(env, value, 0); + + sentry_set_tag(charKey, charValue); + + (*env)->ReleaseStringUTFChars(env, key, charKey); + (*env)->ReleaseStringUTFChars(env, value, charValue); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeRemoveTag(JNIEnv *env, jclass cls, jstring key) { + const char *charKey = (*env)->GetStringUTFChars(env, key, 0); + + sentry_remove_tag(charKey); + + (*env)->ReleaseStringUTFChars(env, key, charKey); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeSetExtra( + JNIEnv *env, + jclass cls, + jstring key, + jstring value) { + const char *charKey = (*env)->GetStringUTFChars(env, key, 0); + const char *charValue = (*env)->GetStringUTFChars(env, value, 0); + + sentry_value_t sentryValue = sentry_value_new_string(charValue); + sentry_set_extra(charKey, sentryValue); + + (*env)->ReleaseStringUTFChars(env, key, charKey); + (*env)->ReleaseStringUTFChars(env, value, charValue); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeRemoveExtra(JNIEnv *env, jclass cls, jstring key) { + const char *charKey = (*env)->GetStringUTFChars(env, key, 0); + + sentry_remove_extra(charKey); + + (*env)->ReleaseStringUTFChars(env, key, charKey); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeSetUser( + JNIEnv *env, + jclass cls, + jstring id, + jstring email, + jstring ipAddress, + jstring username) { + sentry_value_t user = sentry_value_new_object(); + if (id) { + const char *charId = (*env)->GetStringUTFChars(env, id, 0); + sentry_value_set_by_key(user, "id", sentry_value_new_string(charId)); + (*env)->ReleaseStringUTFChars(env, id, charId); + } + if (email) { + const char *charEmail = (*env)->GetStringUTFChars(env, email, 0); + sentry_value_set_by_key( + user, "email", sentry_value_new_string(charEmail)); + (*env)->ReleaseStringUTFChars(env, email, charEmail); + } + if (ipAddress) { + const char *charIpAddress = (*env)->GetStringUTFChars(env, ipAddress, 0); + sentry_value_set_by_key( + user, "ip_address", sentry_value_new_string(charIpAddress)); + (*env)->ReleaseStringUTFChars(env, ipAddress, charIpAddress); + } + if (username) { + const char *charUsername = (*env)->GetStringUTFChars(env, username, 0); + sentry_value_set_by_key( + user, "username", sentry_value_new_string(charUsername)); + (*env)->ReleaseStringUTFChars(env, username, charUsername); + } + sentry_set_user(user); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) { + sentry_remove_user(); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( + JNIEnv *env, + jclass cls, + jstring level, + jstring message, + jstring category, + jstring type, + jstring timestamp, + jstring data) { + if (!level && !message && !category && !type) { + return; + } + const char *charMessage = NULL; + if (message) { + charMessage = (*env)->GetStringUTFChars(env, message, 0); + } + const char *charType = NULL; + if (type) { + charType = (*env)->GetStringUTFChars(env, type, 0); + } + sentry_value_t crumb = sentry_value_new_breadcrumb(charType, charMessage); + + if (charMessage) { + (*env)->ReleaseStringUTFChars(env, message, charMessage); + } + if (charType) { + (*env)->ReleaseStringUTFChars(env, type, charType); + } + + if (category) { + const char *charCategory = (*env)->GetStringUTFChars(env, category, 0); + sentry_value_set_by_key( + crumb, "category", sentry_value_new_string(charCategory)); + (*env)->ReleaseStringUTFChars(env, category, charCategory); + } + if (level) { + const char *charLevel = (*env)->GetStringUTFChars(env, level, 0); + sentry_value_set_by_key( + crumb, "level", sentry_value_new_string(charLevel)); + (*env)->ReleaseStringUTFChars(env, level, charLevel); + } + + if (timestamp) { + // overwrite timestamp that is already created on sentry_value_new_breadcrumb + const char *charTimestamp = (*env)->GetStringUTFChars(env, timestamp, 0); + sentry_value_set_by_key( + crumb, "timestamp", sentry_value_new_string(charTimestamp)); + (*env)->ReleaseStringUTFChars(env, timestamp, charTimestamp); + } + + if (data) { + const char *charData = (*env)->GetStringUTFChars(env, data, 0); + + // we create an object because the Java layer parses it as a Map + sentry_value_t dataObject = sentry_value_new_object(); + sentry_value_set_by_key(dataObject, "data", sentry_value_new_string(charData)); + + sentry_value_set_by_key(crumb, "data", dataObject); + + (*env)->ReleaseStringUTFChars(env, data, charData); + } + + sentry_add_breadcrumb(crumb); +} + +static void send_envelope(sentry_envelope_t *envelope, void *data) { + const char *outbox_path = (const char *) data; + char envelope_id_str[40]; + + sentry_uuid_t envelope_id = sentry_uuid_new_v4(); + sentry_uuid_as_string(&envelope_id, envelope_id_str); + + size_t outbox_len = strlen(outbox_path); + size_t final_len = outbox_len + 42; // "/" + envelope_id_str + "\0" = 42 + char *envelope_path = sentry_malloc(final_len); + ENSURE(envelope_path); + int written = snprintf(envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); + if (written > outbox_len && written < final_len) { + sentry_envelope_write_to_file(envelope, envelope_path); + } + + sentry_free(envelope_path); + sentry_envelope_free(envelope); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_SentryNdk_initSentryNative( + JNIEnv *env, + jclass cls, + jobject sentry_ndk_options) { + jclass options_cls = (*env)->GetObjectClass(env, sentry_ndk_options); + jmethodID outbox_path_mid = (*env)->GetMethodID(env, options_cls, "getOutboxPath", + "()Ljava/lang/String;"); + jmethodID dsn_mid = (*env)->GetMethodID(env, options_cls, "getDsn", "()Ljava/lang/String;"); + jmethodID is_debug_mid = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); + jmethodID release_mid = (*env)->GetMethodID(env, options_cls, "getRelease", + "()Ljava/lang/String;"); + jmethodID environment_mid = (*env)->GetMethodID(env, options_cls, "getEnvironment", + "()Ljava/lang/String;"); + jmethodID dist_mid = (*env)->GetMethodID(env, options_cls, "getDist", "()Ljava/lang/String;"); + jmethodID max_crumbs_mid = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); + jmethodID native_sdk_name_mid = (*env)->GetMethodID(env, options_cls, "getSdkName", + "()Ljava/lang/String;"); + + (*env)->DeleteLocalRef(env, options_cls); + + char *outbox_path = NULL; + sentry_transport_t *transport = NULL; + bool transport_owns_path = false; + sentry_options_t *options = NULL; + bool options_owns_transport = false; + char *dsn_str = NULL; + char *release_str = NULL; + char *environment_str = NULL; + char *dist_str = NULL; + char *native_sdk_name_str = NULL; + + options = sentry_options_new(); + ENSURE_OR_FAIL(options); + + // session tracking is enabled by default, but the Android SDK already handles it + sentry_options_set_auto_session_tracking(options, 0); + + jboolean debug = (jboolean) (*env)->CallBooleanMethod(env, sentry_ndk_options, is_debug_mid); + sentry_options_set_debug(options, debug); + + jint max_crumbs = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); + sentry_options_set_max_breadcrumbs(options, max_crumbs); + + outbox_path = call_get_string(env, sentry_ndk_options, outbox_path_mid); + ENSURE_OR_FAIL(outbox_path); + + transport = sentry_transport_new(send_envelope); + ENSURE_OR_FAIL(transport); + sentry_transport_set_state(transport, outbox_path); + sentry_transport_set_free_func(transport, sentry_free); + transport_owns_path = true; + + sentry_options_set_transport(options, transport); + options_owns_transport = true; + + // give sentry-native its own database path it can work with, next to the outbox + size_t outbox_len = strlen(outbox_path); + size_t final_len = outbox_len + 15; // len(".sentry-native\0") = 15 + char *database_path = sentry_malloc(final_len); + ENSURE_OR_FAIL(database_path); + strncpy(database_path, outbox_path, final_len); + char *dir = strrchr(database_path, '/'); + if (dir) { + strncpy(dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); + } + sentry_options_set_database_path(options, database_path); + sentry_free(database_path); + + dsn_str = call_get_string(env, sentry_ndk_options, dsn_mid); + ENSURE_OR_FAIL(dsn_str); + sentry_options_set_dsn(options, dsn_str); + sentry_free(dsn_str); + + release_str = call_get_string(env, sentry_ndk_options, release_mid); + if (release_str) { + sentry_options_set_release(options, release_str); + sentry_free(release_str); + } + + environment_str = call_get_string(env, sentry_ndk_options, environment_mid); + if (environment_str) { + sentry_options_set_environment(options, environment_str); + sentry_free(environment_str); + } + + dist_str = call_get_string(env, sentry_ndk_options, dist_mid); + if (dist_str) { + sentry_options_set_dist(options, dist_str); + sentry_free(dist_str); + } + + native_sdk_name_str = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); + if (native_sdk_name_str) { + sentry_options_set_sdk_name(options, native_sdk_name_str); + sentry_free(native_sdk_name_str); + } + + sentry_init(options); + return; + + fail: + if (!transport_owns_path) { + sentry_free(outbox_path); + } + if (!options_owns_transport) { + sentry_transport_free(transport); + } + sentry_options_free(options); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList(JNIEnv *env, jclass cls) { + sentry_clear_modulecache(); +} + +JNIEXPORT jobjectArray JNICALL +Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jclass cls) { + sentry_value_t image_list_t = sentry_get_modules_list(); + jobjectArray image_list = NULL; + + if (sentry_value_get_type(image_list_t) == SENTRY_VALUE_TYPE_LIST) { + size_t len_t = sentry_value_get_length(image_list_t); + + jclass image_class = (*env)->FindClass(env, "io/sentry/ndk/DebugImage"); + image_list = (*env)->NewObjectArray(env, len_t, image_class, NULL); + + jmethodID image_addr_method = (*env)->GetMethodID(env, image_class, "setImageAddr", + "(Ljava/lang/String;)V"); + + jmethodID image_size_method = (*env)->GetMethodID(env, image_class, "setImageSize", + "(J)V"); + + jmethodID code_file_method = (*env)->GetMethodID(env, image_class, "setCodeFile", + "(Ljava/lang/String;)V"); + + jmethodID image_addr_ctor = (*env)->GetMethodID(env, image_class, "", + "()V"); + + jmethodID type_method = (*env)->GetMethodID(env, image_class, "setType", + "(Ljava/lang/String;)V"); + + jmethodID debug_id_method = (*env)->GetMethodID(env, image_class, "setDebugId", + "(Ljava/lang/String;)V"); + + jmethodID code_id_method = (*env)->GetMethodID(env, image_class, "setCodeId", + "(Ljava/lang/String;)V"); + + jmethodID debug_file_method = (*env)->GetMethodID(env, image_class, "setDebugFile", + "(Ljava/lang/String;)V"); + + for (size_t i = 0; i < len_t; i++) { + sentry_value_t image_t = sentry_value_get_by_index(image_list_t, i); + + if (!sentry_value_is_null(image_t)) { + jobject image = (*env)->NewObject(env, image_class, image_addr_ctor); + + sentry_value_t image_addr_t = sentry_value_get_by_key(image_t, "image_addr"); + if (!sentry_value_is_null(image_addr_t)) { + + const char *value_v = sentry_value_as_string(image_addr_t); + jstring value = (*env)->NewStringUTF(env, value_v); + + (*env)->CallVoidMethod(env, image, image_addr_method, value); + + // Local refs (eg NewStringUTF) are freed automatically when the native method + // returns, but if you're iterating a large array, it's recommended to release + // manually due to allocation limits (512) on Android < 8 or OOM. + // https://developer.android.com/training/articles/perf-jni.html#local-and-global-references + (*env)->DeleteLocalRef(env, value); + } + + sentry_value_t image_size_t = sentry_value_get_by_key(image_t, "image_size"); + if (!sentry_value_is_null(image_size_t)) { + + int32_t value_v = sentry_value_as_int32(image_size_t); + jlong value = (jlong) value_v; + + (*env)->CallVoidMethod(env, image, image_size_method, value); + } + + sentry_value_t code_file_t = sentry_value_get_by_key(image_t, "code_file"); + if (!sentry_value_is_null(code_file_t)) { + + const char *value_v = sentry_value_as_string(code_file_t); + jstring value = (*env)->NewStringUTF(env, value_v); + + (*env)->CallVoidMethod(env, image, code_file_method, value); + + (*env)->DeleteLocalRef(env, value); + } + + sentry_value_t code_type_t = sentry_value_get_by_key(image_t, "type"); + if (!sentry_value_is_null(code_type_t)) { + + const char *value_v = sentry_value_as_string(code_type_t); + jstring value = (*env)->NewStringUTF(env, value_v); + + (*env)->CallVoidMethod(env, image, type_method, value); + + (*env)->DeleteLocalRef(env, value); + } + + sentry_value_t debug_id_t = sentry_value_get_by_key(image_t, "debug_id"); + if (!sentry_value_is_null(code_type_t)) { + + const char *value_v = sentry_value_as_string(debug_id_t); + jstring value = (*env)->NewStringUTF(env, value_v); + + (*env)->CallVoidMethod(env, image, debug_id_method, value); + + (*env)->DeleteLocalRef(env, value); + } + + sentry_value_t code_id_t = sentry_value_get_by_key(image_t, "code_id"); + if (!sentry_value_is_null(code_id_t)) { + + const char *value_v = sentry_value_as_string(code_id_t); + jstring value = (*env)->NewStringUTF(env, value_v); + + (*env)->CallVoidMethod(env, image, code_id_method, value); + + (*env)->DeleteLocalRef(env, value); + } + + // not needed on Android, but keeping for forward compatibility + sentry_value_t debug_file_t = sentry_value_get_by_key(image_t, "debug_file"); + if (!sentry_value_is_null(debug_file_t)) { + + const char *value_v = sentry_value_as_string(debug_file_t); + jstring value = (*env)->NewStringUTF(env, value_v); + + (*env)->CallVoidMethod(env, image, debug_file_method, value); + + (*env)->DeleteLocalRef(env, value); + } + + (*env)->SetObjectArrayElement(env, image_list, i, image); + + (*env)->DeleteLocalRef(env, image); + } + } + + sentry_value_decref(image_list_t); + } + + return image_list; +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) { + sentry_close(); +} diff --git a/shared/sentry/src/ndk/lib/src/main/res/values/public.xml b/shared/sentry/src/ndk/lib/src/main/res/values/public.xml new file mode 100644 index 000000000..788fdddc0 --- /dev/null +++ b/shared/sentry/src/ndk/lib/src/main/res/values/public.xml @@ -0,0 +1,4 @@ + + + + diff --git a/shared/sentry/src/ndk/sample/CMakeLists.txt b/shared/sentry/src/ndk/sample/CMakeLists.txt new file mode 100644 index 000000000..de05d5a02 --- /dev/null +++ b/shared/sentry/src/ndk/sample/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.10) +project(sentry-native-ndk-sample LANGUAGES C CXX) + +set(BUILD_SHARED_LIBS ON) +set(SENTRY_BUILD_SHARED_LIBS ON) + +add_library(ndk-sample SHARED src/main/cpp/ndk-sample.cpp) + +# Adding sentry-native project +add_subdirectory(${SENTRY_NATIVE_SRC} sentry_build) + +# Android logging library +find_library(LOG_LIB log) + +target_link_libraries(ndk-sample PRIVATE + ${LOG_LIB} + $ +) diff --git a/shared/sentry/src/ndk/sample/build.gradle.kts b/shared/sentry/src/ndk/sample/build.gradle.kts new file mode 100644 index 000000000..5390793df --- /dev/null +++ b/shared/sentry/src/ndk/sample/build.gradle.kts @@ -0,0 +1,70 @@ +plugins { + id("com.android.application") + kotlin("android") +} + +var sentryNativeSrc: String = "${project.projectDir}/../.." + +android { + compileSdk = 34 + namespace = "io.sentry.ndk.sample" + + defaultConfig { + applicationId = "io.sentry.ndk.sample" + minSdk = 19 + targetSdk = 34 + versionCode = 2 + versionName = project.version.toString() + + externalNativeBuild { + cmake { + arguments.add(0, "-DANDROID_STL=c++_shared") + arguments.add(0, "-DSENTRY_NATIVE_SRC=$sentryNativeSrc") + } + } + + ndk { + abiFilters.addAll(listOf("x86", "armeabi-v7a", "x86_64", "arm64-v8a")) + } + } + + externalNativeBuild { + cmake { + path("CMakeLists.txt") + } + } + + signingConfigs { + getByName("debug") { + storeFile = rootProject.file("debug.keystore") + storePassword = "android" + keyAlias = "androiddebugkey" + keyPassword = "android" + } + } + + buildTypes { + getByName("release") { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("debug") // to be able to run release mode + isShrinkResources = true + + addManifestPlaceholders( + mapOf( + "sentryDebug" to false, "sentryEnvironment" to "release" + ) + ) + } + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } +} + +dependencies { + implementation(project(":sentry-native-ndk")) +} diff --git a/shared/sentry/src/ndk/sample/proguard-rules.pro b/shared/sentry/src/ndk/sample/proguard-rules.pro new file mode 100644 index 000000000..1165340c8 --- /dev/null +++ b/shared/sentry/src/ndk/sample/proguard-rules.pro @@ -0,0 +1,34 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# To ensure that stack traces is unambiguous +# https://developer.android.com/studio/build/shrink-code#decode-stack-trace +-keepattributes LineNumberTable,SourceFile + +# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native +-keepclasseswithmembernames,includedescriptorclasses class * { + native ; +} + +# Please add these rules to your existing keep rules in order to suppress warnings. +# This is generated automatically by the Android Gradle plugin. +-dontwarn org.bouncycastle.jsse.BCSSLParameters +-dontwarn org.bouncycastle.jsse.BCSSLSocket +-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider +-dontwarn org.conscrypt.Conscrypt$Version +-dontwarn org.conscrypt.Conscrypt +-dontwarn org.conscrypt.ConscryptHostnameVerifier +-dontwarn org.openjsse.javax.net.ssl.SSLParameters +-dontwarn org.openjsse.javax.net.ssl.SSLSocket +-dontwarn org.openjsse.net.ssl.OpenJSSE diff --git a/shared/sentry/src/ndk/sample/src/main/AndroidManifest.xml b/shared/sentry/src/ndk/sample/src/main/AndroidManifest.xml new file mode 100644 index 000000000..882d9c1e8 --- /dev/null +++ b/shared/sentry/src/ndk/sample/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/shared/sentry/src/ndk/sample/src/main/cpp/ndk-sample.cpp b/shared/sentry/src/ndk/sample/src/main/cpp/ndk-sample.cpp new file mode 100644 index 000000000..d1f62bf0b --- /dev/null +++ b/shared/sentry/src/ndk/sample/src/main/cpp/ndk-sample.cpp @@ -0,0 +1,25 @@ +#include +#include +#include + +#define TAG "ndk-sample" + +extern "C" { + +JNIEXPORT void JNICALL Java_io_sentry_ndk_sample_NdkSample_crash(JNIEnv *env, jclass cls) { + __android_log_print(ANDROID_LOG_WARN, TAG, "About to crash."); + char *ptr = 0; + *ptr += 1; +} + +JNIEXPORT void JNICALL Java_io_sentry_ndk_sample_NdkSample_message(JNIEnv *env, jclass cls) { + __android_log_print(ANDROID_LOG_WARN, TAG, "Sending message."); + sentry_value_t event = sentry_value_new_message_event( + /* level */ SENTRY_LEVEL_INFO, + /* logger */ "custom", + /* message */ "It works!" + ); + sentry_capture_event(event); +} + +} diff --git a/shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/MainActivity.java b/shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/MainActivity.java new file mode 100644 index 000000000..d8d42b3df --- /dev/null +++ b/shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/MainActivity.java @@ -0,0 +1,54 @@ +package io.sentry.ndk.sample; + +import android.app.Activity; +import android.os.Bundle; + +import java.io.File; + +import io.sentry.ndk.NdkOptions; +import io.sentry.ndk.SentryNdk; + +public class MainActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + findViewById(R.id.init_ndk_button).setOnClickListener(v -> initNdk()); + findViewById(R.id.trigger_native_crash_button).setOnClickListener(v -> NdkSample.crash()); + findViewById(R.id.capture_message_button).setOnClickListener(v -> NdkSample.message()); + } + + private void initNdk() { + final File outboxFolder = setupOutboxFolder(); + final NdkOptions options = new NdkOptions( + "https://1053864c67cc410aa1ffc9701bd6f93d@o447951.ingest.sentry.io/5428559", + BuildConfig.DEBUG, + outboxFolder.getAbsolutePath(), + "1.0.0", + "production", + BuildConfig.VERSION_NAME, + 100, + "sentry-native-jni" + ); + SentryNdk.init(options); + } + + private File setupOutboxFolder() { + // ensure we have a proper outbox directory + final File outboxDir = new File(getFilesDir(), "outbox"); + if (outboxDir.isFile()) { + final boolean deleteOk = outboxDir.delete(); + if (!deleteOk) { + throw new IllegalStateException("Failed to delete outbox file: " + outboxDir); + } + } + if (!outboxDir.exists()) { + final boolean mkdirOk = outboxDir.mkdirs(); + if (!mkdirOk) { + throw new IllegalStateException("Failed to create outbox directory: " + outboxDir); + } + } + return outboxDir; + } +} diff --git a/shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/NdkSample.java b/shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/NdkSample.java new file mode 100644 index 000000000..27fdeaf5e --- /dev/null +++ b/shared/sentry/src/ndk/sample/src/main/java/io/sentry/ndk/sample/NdkSample.java @@ -0,0 +1,11 @@ +package io.sentry.ndk.sample; + +public class NdkSample { + static { + System.loadLibrary("ndk-sample"); + } + + public static native void crash(); + + public static native void message(); +} diff --git a/shared/sentry/src/ndk/sample/src/main/res/layout/activity_main.xml b/shared/sentry/src/ndk/sample/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..8045ad259 --- /dev/null +++ b/shared/sentry/src/ndk/sample/src/main/res/layout/activity_main.xml @@ -0,0 +1,36 @@ + + + + + +

- ⚠️ Warning: Since this changes what application is launched on boot, you'll want to make sure you have your SSH password written down, and it's recommended to setup an SSH key. + ⚠️ Warning: Since this changes what application is launched on boot, you'll want to make sure you have your SSH password written down, and it's recommended to setup an SSH key. This way you wont lose access to SSH if something goes wrong and your device soft-bricks.