From: Ralf Habacker Date: Tue, 30 Nov 2021 14:11:01 +0000 (+0100) Subject: Adjust _dbus_spawn_async_with_babysitter() on Windows to follow Unix like OOM behavior X-Git-Tag: dbus-1.13.20~17^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0d37aeb41bdcfca668890a9464ff80569f2b0d9e;p=thirdparty%2Fdbus.git Adjust _dbus_spawn_async_with_babysitter() on Windows to follow Unix like OOM behavior That way, the spawn-oom unit test could expect OOM on Windows to behave the same as OOM on Unix, raising DBUS_ERROR_NO_MEMORY. --- diff --git a/dbus/dbus-spawn-win.c b/dbus/dbus-spawn-win.c index 8372a92a9..fec00290f 100644 --- a/dbus/dbus-spawn-win.c +++ b/dbus/dbus-spawn-win.c @@ -647,6 +647,7 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, HANDLE handle; int argc; char **my_argv = NULL; + DBusError local_error = DBUS_ERROR_INIT; _DBUS_ASSERT_ERROR_IS_CLEAR (error); _dbus_assert (argv[0] != NULL); @@ -717,7 +718,7 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, _dbus_verbose ("babysitter: spawn child '%s'\n", my_argv[0]); PING(); - handle = _dbus_spawn_program (sitter->log_name, my_argv, (char **) envp, FALSE, NULL); + handle = _dbus_spawn_program (sitter->log_name, my_argv, (char **) envp, FALSE, &local_error); if (my_argv != NULL) { @@ -727,13 +728,26 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, PING(); if (handle == NULL) { - sitter->child_handle = NULL; - sitter->have_spawn_errno = TRUE; - sitter->spawn_errno = GetLastError(); - dbus_set_error_const (error, DBUS_ERROR_SPAWN_EXEC_FAILED, - "Failed to spawn child"); + if (dbus_error_has_name (&local_error, DBUS_ERROR_NO_MEMORY)) + { + sitter->child_handle = NULL; + sitter->have_spawn_errno = TRUE; + sitter->spawn_errno = ERROR_NOT_ENOUGH_MEMORY; + dbus_move_error (&local_error, error); + } + else + { + sitter->child_handle = NULL; + sitter->have_spawn_errno = TRUE; + sitter->spawn_errno = GetLastError(); + dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED, + "Failed to spawn child: %s", local_error.message); + } + dbus_error_free (&local_error); goto out0; } + else + dbus_error_free (&local_error); sitter->child_handle = handle;