From 4248b169b75f93c6440bf027e2c995c4e75387ca Mon Sep 17 00:00:00 2001 From: Yucel Albar Date: Thu, 30 Jan 2025 11:33:34 +0300 Subject: [PATCH 1/6] fix(STAFF-141736): The app installed on Spanish user profile is unable to relaunch --- src/backends/sentry_backend_crashpad.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/backends/sentry_backend_crashpad.cpp b/src/backends/sentry_backend_crashpad.cpp index ef63ac3028..a562845ce0 100644 --- a/src/backends/sentry_backend_crashpad.cpp +++ b/src/backends/sentry_backend_crashpad.cpp @@ -424,12 +424,8 @@ crashpad_backend_startup( annotations["__td-crashed-pid"] = std::to_string(td__getpid()); annotations["__td-relaunch-argv"] = std::string(options->relaunch_argv); #ifdef SENTRY_PLATFORM_WINDOWS - std::wstring wstrPath(current_exe->path); - std::string strPath; - std::transform(wstrPath.begin(), wstrPath.end(), - std::back_inserter(strPath), [](wchar_t c) { return (char)c; }); - - annotations["__td-relaunch-path"] = strPath; + annotations["__td-relaunch-path"] + = std::string { sentry__string_from_wstr(current_exe->path) }; #else annotations["__td-relaunch-path"] = std::string(current_exe->path); #endif From 0b1651ec4e9bb119f7408e0ff72319a68b0f1e78 Mon Sep 17 00:00:00 2001 From: Yucel Albar Date: Thu, 30 Jan 2025 15:56:54 +0300 Subject: [PATCH 2/6] handle relaunch argv as wchar --- include/sentry.h | 13 +++++++++++++ src/backends/sentry_backend_crashpad.cpp | 3 ++- src/sentry_options.c | 15 +++++++++++++++ src/sentry_options.h | 4 ++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/include/sentry.h b/include/sentry.h index 7de351e1b9..3aee57c25f 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -1288,6 +1288,19 @@ 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); + +/** + * Sets the args passed to the process when relaunching after a crash. + * Args must be in 1 single string separated by | + */ +SENTRY_API void sentry_options_set_relaunch_argvw( + sentry_options_t *opts, const wchar_t *relaunch_argv); + +/** + * Gets the args passsed to the process when relaunching after a crash. + */ +SENTRY_API const wchar_t *sentry_options_get_relaunch_argvw( + const sentry_options_t *opts); #endif /** diff --git a/src/backends/sentry_backend_crashpad.cpp b/src/backends/sentry_backend_crashpad.cpp index a562845ce0..5d016ba827 100644 --- a/src/backends/sentry_backend_crashpad.cpp +++ b/src/backends/sentry_backend_crashpad.cpp @@ -422,8 +422,9 @@ crashpad_backend_startup( sentry_path_t *current_exe = sentry__path_current_exe(); if (current_exe && options->relaunch_argv) { annotations["__td-crashed-pid"] = std::to_string(td__getpid()); - annotations["__td-relaunch-argv"] = std::string(options->relaunch_argv); #ifdef SENTRY_PLATFORM_WINDOWS + annotations["__td-relaunch-argv"] + = std::string { sentry__string_from_wstr(options->relaunch_argv) }; annotations["__td-relaunch-path"] = std::string { sentry__string_from_wstr(current_exe->path) }; #else diff --git a/src/sentry_options.c b/src/sentry_options.c index 9f916a0c5c..c3ce85a135 100644 --- a/src/sentry_options.c +++ b/src/sentry_options.c @@ -550,6 +550,21 @@ 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); } + +void +sentry_options_set_relaunch_argvw( + sentry_options_t *opts, const wchar_t *relaunch_argv) +{ + sentry_free(opts->relaunch_argv); + size_t len = relaunch_argv ? wcslen(relaunch_argv) : 0; + opts->relaunch_argv = sentry__path_from_wstr_n(relaunch_argv, len); +} + +const wchar_t * +sentry_options_get_relaunch_argvw(const sentry_options_t *opts) +{ + return opts->relaunch_argv; +} #endif /** diff --git a/src/sentry_options.h b/src/sentry_options.h index 76fe04a4a7..586fad3e14 100644 --- a/src/sentry_options.h +++ b/src/sentry_options.h @@ -38,7 +38,11 @@ typedef struct sentry_options_s { char *http_proxy; char *ca_certs; char *transport_thread_name; +#ifdef SENTRY_PLATFORM_WINDOWS + wchar_t *relaunch_argv; +#else char *relaunch_argv; +#endif char *sdk_name; char *user_agent; sentry_path_t *database_path; From ff11ecfa12d2b1d397bcf0355b82a1bb2934d0e5 Mon Sep 17 00:00:00 2001 From: Yucel Albar Date: Thu, 30 Jan 2025 18:13:46 +0300 Subject: [PATCH 3/6] fix relaunch argv --- src/backends/sentry_backend_crashpad.cpp | 1 + src/sentry_options.c | 13 ++++++++----- src/sentry_options.h | 5 ++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/backends/sentry_backend_crashpad.cpp b/src/backends/sentry_backend_crashpad.cpp index 5d016ba827..3f07e2fd96 100644 --- a/src/backends/sentry_backend_crashpad.cpp +++ b/src/backends/sentry_backend_crashpad.cpp @@ -428,6 +428,7 @@ crashpad_backend_startup( annotations["__td-relaunch-path"] = std::string { sentry__string_from_wstr(current_exe->path) }; #else + annotations["__td-relaunch-argv"] = std::string(options->relaunch_argv); annotations["__td-relaunch-path"] = std::string(current_exe->path); #endif sentry__path_free(current_exe); diff --git a/src/sentry_options.c b/src/sentry_options.c index c3ce85a135..5455c8eace 100644 --- a/src/sentry_options.c +++ b/src/sentry_options.c @@ -85,6 +85,9 @@ sentry_options_free(sentry_options_t *opts) } sentry__dsn_decref(opts->dsn); sentry_free(opts->release); +#ifdef SENTRY_PLATFORM_WINDOWS + sentry_free(opts->relaunch_argvw); +#endif sentry_free(opts->relaunch_argv); sentry_free(opts->sdk_name); sentry_free(opts->user_agent); @@ -553,17 +556,17 @@ sentry_options_set_database_pathw(sentry_options_t *opts, const wchar_t *path) void sentry_options_set_relaunch_argvw( - sentry_options_t *opts, const wchar_t *relaunch_argv) + sentry_options_t *opts, const wchar_t *relaunch_argvw) { - sentry_free(opts->relaunch_argv); - size_t len = relaunch_argv ? wcslen(relaunch_argv) : 0; - opts->relaunch_argv = sentry__path_from_wstr_n(relaunch_argv, len); + sentry_free(opts->relaunch_argvw); + size_t len = relaunch_argvw ? wcslen(relaunch_argvw) : 0; + opts->relaunch_argvw = sentry__path_from_wstr_n(relaunch_argvw, len); } const wchar_t * sentry_options_get_relaunch_argvw(const sentry_options_t *opts) { - return opts->relaunch_argv; + return opts->relaunch_argvw; } #endif diff --git a/src/sentry_options.h b/src/sentry_options.h index 586fad3e14..0d7163a9e3 100644 --- a/src/sentry_options.h +++ b/src/sentry_options.h @@ -39,10 +39,9 @@ typedef struct sentry_options_s { char *ca_certs; char *transport_thread_name; #ifdef SENTRY_PLATFORM_WINDOWS - wchar_t *relaunch_argv; -#else - char *relaunch_argv; + wchar_t *relaunch_argvw; #endif + char *relaunch_argv; char *sdk_name; char *user_agent; sentry_path_t *database_path; From d9d7859320b2adb14082bbcfb053cd2b9aaf4600 Mon Sep 17 00:00:00 2001 From: Yucel Albar Date: Thu, 30 Jan 2025 18:18:10 +0300 Subject: [PATCH 4/6] fix --- src/backends/sentry_backend_crashpad.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/sentry_backend_crashpad.cpp b/src/backends/sentry_backend_crashpad.cpp index 3f07e2fd96..bae96fa447 100644 --- a/src/backends/sentry_backend_crashpad.cpp +++ b/src/backends/sentry_backend_crashpad.cpp @@ -424,7 +424,7 @@ crashpad_backend_startup( annotations["__td-crashed-pid"] = std::to_string(td__getpid()); #ifdef SENTRY_PLATFORM_WINDOWS annotations["__td-relaunch-argv"] - = std::string { sentry__string_from_wstr(options->relaunch_argv) }; + = std::string { sentry__string_from_wstr(options->relaunch_argvw) }; annotations["__td-relaunch-path"] = std::string { sentry__string_from_wstr(current_exe->path) }; #else From 79ccafc88f77403afb70995c1ce1e8ff1a207f2f Mon Sep 17 00:00:00 2001 From: Yucel Albar Date: Fri, 31 Jan 2025 15:30:43 +0300 Subject: [PATCH 5/6] check if relaunch_argvw is null --- src/backends/sentry_backend_crashpad.cpp | 25 ++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/backends/sentry_backend_crashpad.cpp b/src/backends/sentry_backend_crashpad.cpp index bae96fa447..931559185a 100644 --- a/src/backends/sentry_backend_crashpad.cpp +++ b/src/backends/sentry_backend_crashpad.cpp @@ -420,23 +420,28 @@ crashpad_backend_startup( std::vector attachments; sentry_path_t *current_exe = sentry__path_current_exe(); - if (current_exe && options->relaunch_argv) { - annotations["__td-crashed-pid"] = std::to_string(td__getpid()); + if (current_exe) { + if (options->relaunch_argv) { + annotations["__td-relaunch-argv"] + = std::string(options->relaunch_argv); + annotations["__td-relaunch-path"] = std::string(current_exe->path); + } #ifdef SENTRY_PLATFORM_WINDOWS - annotations["__td-relaunch-argv"] - = std::string { sentry__string_from_wstr(options->relaunch_argvw) }; - annotations["__td-relaunch-path"] - = std::string { sentry__string_from_wstr(current_exe->path) }; -#else - annotations["__td-relaunch-argv"] = std::string(options->relaunch_argv); - annotations["__td-relaunch-path"] = std::string(current_exe->path); + if (options->relaunch_argvw) { + annotations["__td-relaunch-argv"] = std::string { + sentry__string_from_wstr(options->relaunch_argvw) + }; + annotations["__td-relaunch-path"] + = std::string { sentry__string_from_wstr(current_exe->path) }; + } #endif + annotations["__td-crashed-pid"] = std::to_string(td__getpid()); sentry__path_free(current_exe); } // register attachments for (sentry_attachment_t *attachment = options->attachments; attachment; - attachment = attachment->next) { + attachment = attachment->next) { attachments.emplace_back(attachment->path->path); } From 250673e7ad499fc0d7881777700bdf0406fe4e41 Mon Sep 17 00:00:00 2001 From: Yucel Albar Date: Mon, 3 Feb 2025 14:29:44 +0300 Subject: [PATCH 6/6] assign the correct value --- src/sentry_options.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sentry_options.c b/src/sentry_options.c index 5455c8eace..e73d2a32a2 100644 --- a/src/sentry_options.c +++ b/src/sentry_options.c @@ -560,7 +560,8 @@ sentry_options_set_relaunch_argvw( { sentry_free(opts->relaunch_argvw); size_t len = relaunch_argvw ? wcslen(relaunch_argvw) : 0; - opts->relaunch_argvw = sentry__path_from_wstr_n(relaunch_argvw, len); + const auto clonedPath = sentry__path_from_wstr_n(relaunch_argvw, len); + opts->relaunch_argvw = clonedPath->path; } const wchar_t *