diff --git a/bin/system-info.c b/bin/system-info.c
index a0fa957a2aaf65cf6cffef43fce314796f377d7b..e8fab9c45ceeddc025ce474c5eb35db58aee97c0 100644
--- a/bin/system-info.c
+++ b/bin/system-info.c
@@ -119,6 +119,7 @@
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <getopt.h>
 #include <glib.h>
 
@@ -394,6 +395,24 @@ print_libraries_details (JsonBuilder *builder,
               json_builder_begin_array (builder);
               jsonify_library_issues (builder, srt_library_get_issues (l->data));
               json_builder_end_array (builder);
+
+              int exit_status = srt_library_get_exit_status (l->data);
+              if (exit_status != 0 && exit_status != -1)
+                {
+                  json_builder_set_member_name (builder, "exit-status");
+                  json_builder_add_int_value (builder, exit_status);
+                }
+
+              int terminating_signal = srt_library_get_terminating_signal (l->data);
+              if (terminating_signal != 0)
+                {
+                  json_builder_set_member_name (builder, "terminating-signal");
+                  json_builder_add_int_value (builder, terminating_signal);
+
+                  json_builder_set_member_name (builder, "terminating-signal-name");
+                  json_builder_add_string_value (builder, strsignal (terminating_signal));
+                }
+
             }
 
           missing_symbols = srt_library_get_missing_symbols (l->data);
@@ -464,6 +483,23 @@ print_graphics_details(JsonBuilder *builder,
           json_builder_begin_array (builder);
           jsonify_graphics_issues (builder, srt_graphics_get_issues (g->data));
           json_builder_end_array (builder);
+          int exit_status = srt_graphics_get_exit_status (g->data);
+          if (exit_status != 0 && exit_status != -1)
+            {
+              json_builder_set_member_name (builder, "exit-status");
+              json_builder_add_int_value (builder, exit_status);
+            }
+
+          int terminating_signal = srt_graphics_get_terminating_signal (g->data);
+          if (terminating_signal != 0)
+            {
+              json_builder_set_member_name (builder, "terminating-signal");
+              json_builder_add_int_value (builder, terminating_signal);
+
+              json_builder_set_member_name (builder, "terminating-signal-name");
+              json_builder_add_string_value (builder, strsignal (terminating_signal));
+            }
+
         }
       json_builder_end_object (builder); // End object for parameters
       g_free (parameters);
diff --git a/steam-runtime-tools/graphics-internal.h b/steam-runtime-tools/graphics-internal.h
index a4a5c67df1a599f5c4d09f4832dd12a4a2acf61b..88148a202af7576c1f86f29cbe0986cf8ef61a35 100644
--- a/steam-runtime-tools/graphics-internal.h
+++ b/steam-runtime-tools/graphics-internal.h
@@ -37,6 +37,8 @@
  * @issues: Problems found when checking @multiarch_tuple with
  *  the given @winsys and @renderer.
  * @messages: Any debug messages found when checking graphics.
+ * @exit_status: exit status of helper, or -1 if it did not exit normally
+ * @termination_signal: signal that terminated the helper, or 0
  *
  * Inline convenience function to create a new SrtGraphics.
  * This is not part of the public API.
@@ -50,7 +52,9 @@ static inline SrtGraphics *_srt_graphics_new (const char *multiarch_tuple,
                                               const gchar *renderer_string,
                                               const gchar *version_string,
                                               SrtGraphicsIssues issues,
-                                              const gchar *messages);
+                                              const gchar *messages,
+                                              int exit_status,
+                                              int termination_signal);
 
 /*
  * _srt_graphics_hash_key:
@@ -82,7 +86,9 @@ _srt_graphics_new (const char *multiarch_tuple,
                    const gchar *renderer_string,
                    const gchar *version_string,
                    SrtGraphicsIssues issues,
-                   const gchar *messages)
+                   const gchar *messages,
+                   int exit_status,
+                   int terminating_signal)
 {
   g_return_val_if_fail (multiarch_tuple != NULL, NULL);
   return g_object_new (SRT_TYPE_GRAPHICS,
@@ -94,6 +100,8 @@ _srt_graphics_new (const char *multiarch_tuple,
                        "renderer-string", renderer_string,
                        "version-string", version_string,
                        "messages", messages,
+                       "exit-status", exit_status,
+                       "terminating-signal", terminating_signal,
                        NULL);
 }
 
diff --git a/steam-runtime-tools/graphics.c b/steam-runtime-tools/graphics.c
index 85f7f10311bb335a71793a4ed3ab69f5784b6516..728335c6d47b7b2ae2ee20e2f820fd2205b97f86 100644
--- a/steam-runtime-tools/graphics.c
+++ b/steam-runtime-tools/graphics.c
@@ -34,7 +34,6 @@
 
 #include <stdint.h>
 #include <string.h>
-#include <sys/wait.h>
 
 #include <json-glib/json-glib.h>
 
@@ -75,6 +74,8 @@ struct _SrtGraphics
   gchar *messages;
   gchar *renderer_string;
   gchar *version_string;
+  int exit_status;
+  int terminating_signal;
 };
 
 struct _SrtGraphicsClass
@@ -93,6 +94,8 @@ enum {
   PROP_RENDERING_INTERFACE,
   PROP_RENDERER_STRING,
   PROP_VERSION_STRING,
+  PROP_EXIT_STATUS,
+  PROP_TERMINATING_SIGNAL,
   N_PROPERTIES
 };
 
@@ -145,6 +148,14 @@ srt_graphics_get_property (GObject *object,
         g_value_set_string (value, self->version_string);
         break;
 
+      case PROP_EXIT_STATUS:
+        g_value_set_int (value, self->exit_status);
+        break;
+
+      case PROP_TERMINATING_SIGNAL:
+        g_value_set_int (value, self->terminating_signal);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -218,6 +229,14 @@ srt_graphics_set_property (GObject *object,
         self->version_string = g_value_dup_string (value);
         break;
 
+      case PROP_EXIT_STATUS:
+        self->exit_status = g_value_get_int (value);
+        break;
+
+      case PROP_TERMINATING_SIGNAL:
+        self->terminating_signal = g_value_get_int (value);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -298,6 +317,22 @@ srt_graphics_class_init (SrtGraphicsClass *cls)
                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
                          G_PARAM_STATIC_STRINGS);
 
+  properties[PROP_EXIT_STATUS] =
+    g_param_spec_int ("exit-status", "Exit status", "Exit status of helper(s) executed. 0 on success, positive on unsuccessful exit(), -1 if killed by a signal or not run at all",
+                      -1,
+                      G_MAXINT,
+                      0,
+                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+                      G_PARAM_STATIC_STRINGS);
+
+  properties[PROP_TERMINATING_SIGNAL] =
+    g_param_spec_int ("terminating-signal", "Terminating signal", "Signal used to terminate helper process if any, 0 otherwise",
+                      0,
+                      G_MAXINT,
+                      0,
+                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+                      G_PARAM_STATIC_STRINGS);
+
   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
 }
 
@@ -696,7 +731,9 @@ _srt_check_graphics (const char *helpers_path,
   gchar *output = NULL;
   gchar *child_stderr = NULL;
   gchar *child_stderr2 = NULL;
+  int wait_status = -1;
   int exit_status = -1;
+  int terminating_signal = 0;
   JsonParser *parser = NULL;
   const gchar *version_string = NULL;
   gchar *new_version_string = NULL;
@@ -747,28 +784,29 @@ _srt_check_graphics (const char *helpers_path,
                      NULL,    /* user data */
                      &output, /* stdout */
                      &child_stderr,
-                     &exit_status,
+                     &wait_status,
                      &error))
     {
       g_debug ("An error occurred calling the helper: %s", error->message);
       issues |= SRT_GRAPHICS_ISSUES_CANNOT_LOAD;
-      goto out;
     }
 
-  if (exit_status != 0)
+  if (wait_status != 0)
     {
-      g_debug ("... wait status %d", exit_status);
+      g_debug ("... wait status %d", wait_status);
       issues |= SRT_GRAPHICS_ISSUES_CANNOT_LOAD;
 
-      // TERM signal gives us 124 from timeout man page
-      if (WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 124) // timeout command killed the helper
+      if (_srt_process_timeout_wait_status (wait_status, &exit_status, &terminating_signal))
         {
-          g_debug ("helper killed by timeout command");
           issues |= SRT_GRAPHICS_ISSUES_TIMEOUT;
         }
 
       goto out;
     }
+  else
+    {
+      exit_status = 0;
+    }
 
   /* We can't use `json_from_string()` directly because we are targeting an
    * older json-glib version */
@@ -815,26 +853,27 @@ _srt_check_graphics (const char *helpers_path,
                              NULL,    /* user data */
                              &output, /* stdout */
                              &child_stderr2,
-                             &exit_status,
+                             &wait_status,
                              &error))
             {
               g_debug ("An error occurred calling the helper: %s", error->message);
               issues |= SRT_GRAPHICS_ISSUES_CANNOT_DRAW;
-              goto out;
             }
 
-          if (exit_status != 0)
+          if (wait_status != 0)
             {
-              g_debug ("... wait status %d", exit_status);
+              g_debug ("... wait status %d", wait_status);
               issues |= SRT_GRAPHICS_ISSUES_CANNOT_DRAW;
 
-              // TERM signal gives us 124 from timeout man page
-              if (WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 124) // timeout command killed the helper
+              if (_srt_process_timeout_wait_status (wait_status, &exit_status, &terminating_signal))
                 {
-                  g_debug ("helper killed by timeout command");
                   issues |= SRT_GRAPHICS_ISSUES_TIMEOUT;
                 }
             }
+          else
+            {
+              exit_status = 0;
+            }
         }
     }
   else
@@ -871,25 +910,27 @@ _srt_check_graphics (const char *helpers_path,
                          NULL,    /* user data */
                          &output, /* stdout */
                          &child_stderr2,
-                         &exit_status,
+                         &wait_status,
                          &error))
         {
           g_debug ("An error occurred calling the helper: %s", error->message);
           issues |= SRT_GRAPHICS_ISSUES_CANNOT_DRAW;
-          goto out;
         }
 
-      if (exit_status != 0)
+      if (wait_status != 0)
         {
-          g_debug ("... wait status %d", exit_status);
+          g_debug ("... wait status %d", wait_status);
           issues |= SRT_GRAPHICS_ISSUES_CANNOT_DRAW;
 
-          // TERM signal gives us 124 from timeout man page
-          if (WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 124) // timeout command killed the helper
+          if (_srt_process_timeout_wait_status (wait_status, &exit_status, &terminating_signal))
             {
-              g_debug ("helper killed by timeout command");
               issues |= SRT_GRAPHICS_ISSUES_TIMEOUT;
             }
+
+        }
+      else
+        {
+          exit_status = 0;
         }
     }
 
@@ -912,7 +953,9 @@ out:
                                       renderer_string,
                                       version_string,
                                       issues,
-                                      child_stderr);
+                                      child_stderr,
+                                      exit_status,
+                                      terminating_signal);
 
   if (parser != NULL)
     g_object_unref (parser);
@@ -1033,6 +1076,37 @@ srt_graphics_get_version_string (SrtGraphics *self)
   return self->version_string;
 }
 
+/**
+ * srt_graphics_get_exit_status:
+ * @self: a graphics object
+ *
+ * Return the exit status of helpers when testing the given graphics.
+ *
+ * Returns: 0 on success, positive on unsuccessful `exit()`,
+ *          -1 if killed by a signal or not run at all
+ */
+int srt_graphics_get_exit_status (SrtGraphics *self)
+{
+  g_return_val_if_fail (SRT_IS_GRAPHICS (self), -1);
+
+  return self->exit_status;
+}
+
+/**
+ * srt_graphics_get_terminating_signal:
+ * @self: a graphics object
+ *
+ * Return the terminating signal used to terminate the helper if any.
+ *
+ * Returns: a signal number such as `SIGTERM`, or 0 if not killed by a signal or not run at all.
+ */
+int srt_graphics_get_terminating_signal (SrtGraphics *self)
+{
+  g_return_val_if_fail (SRT_IS_GRAPHICS (self), -1);
+
+  return self->terminating_signal;
+}
+
 /**
  * srt_graphics_get_renderer_string:
  * @self: a graphics object
diff --git a/steam-runtime-tools/graphics.h b/steam-runtime-tools/graphics.h
index 8465a9987e90cc40aebf79a55ff478aa87a6c8aa..cc6b79f5c4291619ff20a07c25c04c9cc4efaa50 100644
--- a/steam-runtime-tools/graphics.h
+++ b/steam-runtime-tools/graphics.h
@@ -130,6 +130,8 @@ const char *srt_graphics_get_version_string (SrtGraphics *self);
 const char *srt_graphics_get_renderer_string (SrtGraphics *self);
 const char *srt_graphics_get_messages (SrtGraphics *self);
 gchar *srt_graphics_dup_parameters_string (SrtGraphics *self);
+int srt_graphics_get_exit_status (SrtGraphics *self);
+int srt_graphics_get_terminating_signal (SrtGraphics *self);
 
 typedef struct _SrtEglIcd SrtEglIcd;
 typedef struct _SrtEglIcdClass SrtEglIcdClass;
diff --git a/steam-runtime-tools/library-internal.h b/steam-runtime-tools/library-internal.h
index ebc11dea8fd812784808a680b703711a3ad62762..1463eb245d368e5edbe5c7c352e8ad2696926e26 100644
--- a/steam-runtime-tools/library-internal.h
+++ b/steam-runtime-tools/library-internal.h
@@ -43,6 +43,8 @@
  *  version
  * @dependencies: (nullable) (array zero-terminated=1) (element-type utf8):
  *  Dependencies of @soname
+ * @exit_status: exit status of helper, or -1 if it did not exit normally
+ * @terminating_signal: signal that terminated the helper, or 0
  *
  * Inline convenience function to create a new SrtLibrary.
  * This is not part of the public API.
@@ -56,7 +58,9 @@ static inline SrtLibrary *_srt_library_new (const char *multiarch_tuple,
                                             const char *messages,
                                             const char * const *missing_symbols,
                                             const char * const *misversioned_symbols,
-                                            const char * const *dependencies);
+                                            const char * const *dependencies,
+                                            int exit_status,
+                                            int terminating_signal);
 
 #ifndef __GTK_DOC_IGNORE__
 static inline SrtLibrary *
@@ -67,7 +71,9 @@ _srt_library_new (const char *multiarch_tuple,
                   const char *messages,
                   const char * const *missing_symbols,
                   const char * const *misversioned_symbols,
-                  const char * const *dependencies)
+                  const char * const *dependencies,
+                  int exit_status,
+                  int terminating_signal)
 {
   g_return_val_if_fail (multiarch_tuple != NULL, NULL);
   g_return_val_if_fail (soname != NULL, NULL);
@@ -80,6 +86,8 @@ _srt_library_new (const char *multiarch_tuple,
                        "multiarch-tuple", multiarch_tuple,
                        "soname", soname,
                        "misversioned-symbols", misversioned_symbols,
+                       "exit-status", exit_status,
+                       "terminating-signal", terminating_signal,
                        NULL);
 }
 #endif
diff --git a/steam-runtime-tools/library.c b/steam-runtime-tools/library.c
index e02cecb00ba1ac4c02b654855fe6a9df8dcd013e..b677124362ffdeab492d690fb198c7e1d0f1d941 100644
--- a/steam-runtime-tools/library.c
+++ b/steam-runtime-tools/library.c
@@ -57,6 +57,8 @@ struct _SrtLibrary
   GStrv misversioned_symbols;
   GQuark multiarch_tuple;
   SrtLibraryIssues issues;
+  int exit_status;
+  int terminating_signal;
 };
 
 struct _SrtLibraryClass
@@ -75,6 +77,8 @@ enum {
   PROP_MULTIARCH_TUPLE,
   PROP_SONAME,
   PROP_MISVERSIONED_SYMBOLS,
+  PROP_EXIT_STATUS,
+  PROP_TERMINATING_SIGNAL,
   N_PROPERTIES
 };
 
@@ -127,6 +131,14 @@ srt_library_get_property (GObject *object,
         g_value_set_boxed (value, self->misversioned_symbols);
         break;
 
+      case PROP_EXIT_STATUS:
+        g_value_set_int (value, self->exit_status);
+        break;
+
+      case PROP_TERMINATING_SIGNAL:
+        g_value_set_int (value, self->terminating_signal);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -213,6 +225,14 @@ srt_library_set_property (GObject *object,
 
         break;
 
+      case PROP_EXIT_STATUS:
+        self->exit_status = g_value_get_int (value);
+        break;
+
+      case PROP_TERMINATING_SIGNAL:
+        self->terminating_signal = g_value_get_int (value);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -297,6 +317,22 @@ srt_library_class_init (SrtLibraryClass *cls)
                         G_TYPE_STRV,
                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
                         G_PARAM_STATIC_STRINGS);
+  properties[PROP_EXIT_STATUS] =
+    g_param_spec_int ("exit-status", "Exit status", "Exit status of helper(s) executed. 0 on success, positive on unsuccessful exit(), -1 if killed by a signal or not run at all",
+                      -1,
+                      G_MAXINT,
+                      0,
+                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+                      G_PARAM_STATIC_STRINGS);
+
+  properties[PROP_TERMINATING_SIGNAL] =
+    g_param_spec_int ("terminating-signal", "Terminating signal", "Signal used to terminate helper process if any, 0 otherwise",
+                      0,
+                      G_MAXINT,
+                      0,
+                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+                      G_PARAM_STATIC_STRINGS);
+
 
   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
 }
@@ -399,6 +435,37 @@ srt_library_get_dependencies (SrtLibrary *self)
   return (const char * const *) self->dependencies;
 }
 
+/**
+ * srt_library_get_exit_status:
+ * @self: a library
+ *
+ * Return the exit status of helpers when testing the given library.
+ *
+ * Returns: 0 on success, positive on unsuccessful `exit()`, or
+ *          -1 if killed by a signal or not run at all
+ */
+int srt_library_get_exit_status (SrtLibrary *self)
+{
+  g_return_val_if_fail (SRT_IS_LIBRARY (self), -1);
+
+  return self->exit_status;
+}
+
+/**
+ * srt_library_get_terminating_signal:
+ * @self: a library
+ *
+ * Return the terminating signal used to terminate the helper if any.
+ *
+ * Returns: a signal number such as `SIGTERM`, or 0 if not killed by a signal or not run at all.
+ */
+int srt_library_get_terminating_signal (SrtLibrary *self)
+{
+  g_return_val_if_fail (SRT_IS_LIBRARY (self), -1);
+
+  return self->terminating_signal;
+}
+
 /**
  * srt_library_get_missing_symbols:
  * @self: a library
@@ -492,7 +559,9 @@ _srt_check_library_presence (const char *helpers_path,
   gchar *output = NULL;
   gchar *child_stderr = NULL;
   gchar *absolute_path = NULL;
+  int wait_status = -1;
   int exit_status = -1;
+  int terminating_signal = 0;
   JsonParser *parser = NULL;
   JsonNode *node = NULL;
   JsonObject *json;
@@ -533,7 +602,7 @@ _srt_check_library_presence (const char *helpers_path,
 
   log_args = g_string_new ("");
 
-  for (int i = 0; i < argv->len; ++i)
+  for (guint i = 0; i < argv->len; ++i)
     {
       if (i > 0)
         {
@@ -587,20 +656,28 @@ _srt_check_library_presence (const char *helpers_path,
                      NULL,       /* user data */
                      &output,    /* stdout */
                      &child_stderr,
-                     &exit_status,
+                     &wait_status,
                      &error))
     {
       g_debug ("An error occurred calling the helper: %s", error->message);
       issues |= SRT_LIBRARY_ISSUES_CANNOT_LOAD;
-      goto out;
     }
 
-  if (exit_status != 0)
+  if (wait_status != 0)
     {
-      g_debug ("... wait status %d", exit_status);
+      g_debug ("... wait status %d", wait_status);
       issues |= SRT_LIBRARY_ISSUES_CANNOT_LOAD;
+
+      if (_srt_process_timeout_wait_status (wait_status, &exit_status, &terminating_signal))
+        {
+          issues |= SRT_LIBRARY_ISSUES_TIMEOUT;
+        }
       goto out;
     }
+  else
+    {
+      exit_status = 0;
+    }
 
   /* We can't use `json_from_string()` directly because we are targeting an
    * older json-glib version */
@@ -678,7 +755,9 @@ out:
                                           child_stderr,
                                           (const char **) missing_symbols,
                                           (const char **) misversioned_symbols,
-                                          (const char **) dependencies);
+                                          (const char **) dependencies,
+                                          exit_status,
+                                          terminating_signal);
 
   if (parser != NULL)
     g_object_unref (parser);
diff --git a/steam-runtime-tools/library.h b/steam-runtime-tools/library.h
index 9f4fff0dd3d1e7387b51e2e9495eeb3cfbd5a6c4..011f9c16ce9503545415fcdd2ea54f10775dc385 100644
--- a/steam-runtime-tools/library.h
+++ b/steam-runtime-tools/library.h
@@ -57,6 +57,7 @@ GType srt_library_get_type (void);
  * @SRT_LIBRARY_ISSUES_UNKNOWN_EXPECTATIONS: No directory containing
  *  expected ABIs has been set, so we cannot know which libraries we are
  *  meant to have found
+ * @SRT_LIBRARY_ISSUES_TIMEOUT: Helper timed out when executing
  *
  * A bitfield with flags representing problems with a library, or
  * %SRT_LIBRARY_ISSUES_NONE (which is numerically zero) if no problems
@@ -71,6 +72,7 @@ typedef enum
   SRT_LIBRARY_ISSUES_MISVERSIONED_SYMBOLS = (1 << 2),
   SRT_LIBRARY_ISSUES_INTERNAL_ERROR = (1 << 3),
   SRT_LIBRARY_ISSUES_UNKNOWN_EXPECTATIONS = (1 << 4),
+  SRT_LIBRARY_ISSUES_TIMEOUT = (1 << 5),
   SRT_LIBRARY_ISSUES_NONE = 0
 } SrtLibraryIssues;
 
@@ -100,6 +102,8 @@ SrtLibraryIssues srt_check_library_presence (const char *soname,
                                              const char *symbols_path,
                                              SrtLibrarySymbolsFormat symbols_format,
                                              SrtLibrary **more_details_out);
+int srt_library_get_exit_status (SrtLibrary *self);
+int srt_library_get_terminating_signal (SrtLibrary *self);
 
 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
 G_DEFINE_AUTOPTR_CLEANUP_FUNC (SrtLibrary, g_object_unref)
diff --git a/steam-runtime-tools/utils-internal.h b/steam-runtime-tools/utils-internal.h
index dc74724aec8959a6aaf8fedc5edab45647eb4089..396a76acb7679b63099a41758a4e94ea7afed8bc 100644
--- a/steam-runtime-tools/utils-internal.h
+++ b/steam-runtime-tools/utils-internal.h
@@ -44,3 +44,7 @@ G_GNUC_INTERNAL GPtrArray *_srt_get_helper (const char *helpers_path,
 gchar *_srt_filter_gameoverlayrenderer (const gchar *input);
 G_GNUC_INTERNAL const char *_srt_find_myself (const char **helpers_path_out,
                                               GError **error);
+
+G_GNUC_INTERNAL gboolean _srt_process_timeout_wait_status (int wait_status,
+                                                           int *exit_status,
+                                                           int *terminating_signal);
diff --git a/steam-runtime-tools/utils.c b/steam-runtime-tools/utils.c
index 1c2b95bcd2370906b3f8a3669469e158fa7bb255..d324b5db26576b4c61ce57d29f7e7eafe63484cd 100644
--- a/steam-runtime-tools/utils.c
+++ b/steam-runtime-tools/utils.c
@@ -32,6 +32,7 @@
 #include <link.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/wait.h>
 #include <unistd.h>
 
 #ifdef HAVE_SYS_AUXV_H
@@ -151,6 +152,57 @@ _srt_check_not_setuid (void)
 #define RELOCATABLE_PKGLIBDIR \
   MULTIARCH_LIBDIR "/steam-runtime-tools-" _SRT_API_MAJOR
 
+/**
+ * _srt_process_timeout_wait_status:
+ *
+ * @wait_status: The wait_status from g_spawn_sync to process
+ * @exit_status: (not optional): The exit_status to populate
+ * @terminating_signal: (not optional): The terminating signal if any, 0 otherwise
+ *
+ * Check given wait_status and populate given exit_status and terminating_signal
+ *
+ * Returns: True if timeout, false otherwise
+ */
+G_GNUC_INTERNAL gboolean
+_srt_process_timeout_wait_status (int wait_status, int *exit_status, int *terminating_signal)
+{
+  gboolean timed_out = FALSE;
+
+  g_return_val_if_fail (exit_status != NULL, FALSE);
+  g_return_val_if_fail (terminating_signal != NULL, FALSE);
+
+  *exit_status = -1;
+  *terminating_signal = 0;
+
+  if (WIFEXITED (wait_status))
+    {
+      *exit_status = WEXITSTATUS (wait_status);
+
+      if (*exit_status > 128)
+        {
+          g_debug ("-> killed by signal %d", (*exit_status - 128));
+          *terminating_signal = (*exit_status - 128);
+        }
+      else if (*exit_status == 124)
+        {
+          g_debug ("-> timed out");
+          timed_out = TRUE;
+        }
+    }
+  else if (WIFSIGNALED (wait_status))
+    {
+      g_debug ("-> timeout killed by signal %d", WTERMSIG (wait_status));
+      *terminating_signal = WTERMSIG (wait_status);
+    }
+  else
+    {
+      g_critical ("Somehow got a wait_status that was neither exited nor signaled");
+      g_return_val_if_reached (FALSE);
+    }
+
+  return timed_out;
+}
+
 G_GNUC_INTERNAL const char *
 _srt_find_myself (const char **helpers_path_out,
                   GError **error)
diff --git a/tests/graphics.c b/tests/graphics.c
index 2fac6cc0300d23a21aa3c022b80a0e85da397f29..c244dba2037223e64e87f4ce7521f040cdc496ca 100644
--- a/tests/graphics.c
+++ b/tests/graphics.c
@@ -208,7 +208,9 @@ test_object (Fixture *f,
                                SRT_TEST_GOOD_GRAPHICS_RENDERER,
                                SRT_TEST_GOOD_GRAPHICS_VERSION,
                                SRT_GRAPHICS_ISSUES_NONE,
-                               "");
+                               "",
+                               0,
+                               0);
   g_assert_cmpint (srt_graphics_get_issues (graphics), ==,
                    SRT_GRAPHICS_ISSUES_NONE);
   g_assert_cmpstr (srt_graphics_get_multiarch_tuple (graphics), ==,
diff --git a/tests/library.c b/tests/library.c
index dc1b6d7a084974207b1ca56bff6b73ff6df9a03b..0d32171b61396825c95aba24ee41f075a437d86f 100644
--- a/tests/library.c
+++ b/tests/library.c
@@ -88,7 +88,9 @@ test_object (Fixture *f,
                               "",
                               NULL,
                               NULL,
-                              NULL);
+                              NULL,
+                              0,
+                              0);
   g_assert_cmpint (srt_library_get_issues (library), ==,
                    SRT_LIBRARY_ISSUES_NONE);
   g_assert_cmpstr (srt_library_get_messages (library), ==, NULL);
@@ -145,7 +147,9 @@ test_object (Fixture *f,
                               "ld.so: libjpeg.so.62: nope\n",
                               one_missing,
                               one_misversioned,
-                              two_deps);
+                              two_deps,
+                              0,
+                              0);
   g_assert_cmpint (srt_library_get_issues (library) &
                    SRT_LIBRARY_ISSUES_MISSING_SYMBOLS, !=, 0);
   g_assert_cmpint (srt_library_get_issues (library) &