This repository was archived by the owner on Sep 16, 2021. It is now read-only.
Avoid possible crash when getting server properties. #162
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The crash occurs when calling dls_device_get_all_props() for a content
directory server that we have not yet subscribed to (that is,
prv_cds_subscribed() returns FALSE in
prv_get_system_update_id_for_props()). This crash is caused by an
invalid GVariantBuilder passed to g_variant_builder_end() in
prv_get_sleeping_for_props(), leading to a NULL result pointer being
passed to dls_async_task_complete(). A GVariant is attempted to be
constructed from this NULL pointer in dls_task_complete().
Here is the call chain that leads to the crash:
The crash was most likely observed when a device running Plex Media
Server was present on the network.
This commit moves the call of g_variant_builder_end() in
prv_system_update_id_for_props_cb() (which invalidates the
GVariantBuilder used later in prv_get_sleeping_for_props()) to the
error handling branch. This leaves the GVariantBuilder alone and
allows prv_get_sr_token_for_props() or one of its descendants to call
g_variant_builder_end() and complete the task.