mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-23 10:52:13 +00:00
sf: handle serialization errors more accurately and gracefully
This commit is contained in:
parent
44c5cb9789
commit
874208b44a
1 changed files with 27 additions and 19 deletions
|
@ -43,16 +43,19 @@ namespace ams::sf::cmif {
|
||||||
CmifOutHeader *out_header = nullptr;
|
CmifOutHeader *out_header = nullptr;
|
||||||
Result command_result = cmd_handler(&out_header, ctx, in_message_raw_data);
|
Result command_result = cmd_handler(&out_header, ctx, in_message_raw_data);
|
||||||
|
|
||||||
/* Forward forwardable results, otherwise ensure we can send result to user. */
|
/* Forward any meta-context change result. */
|
||||||
R_TRY_CATCH(command_result) {
|
if (sf::impl::ResultRequestContextChanged::Includes(command_result)) {
|
||||||
R_CATCH_RETHROW(sf::impl::ResultRequestContextChanged)
|
return command_result;
|
||||||
R_CATCH_ALL() { AMS_ABORT_UNLESS(out_header != nullptr); }
|
}
|
||||||
} R_END_TRY_CATCH;
|
|
||||||
|
/* Otherwise, ensure that we're able to write the output header. */
|
||||||
|
if (out_header == nullptr) {
|
||||||
|
AMS_ABORT_UNLESS(R_FAILED(command_result));
|
||||||
|
return command_result;
|
||||||
|
}
|
||||||
|
|
||||||
/* Write output header to raw data. */
|
/* Write output header to raw data. */
|
||||||
if (out_header != nullptr) {
|
*out_header = CmifOutHeader{CMIF_OUT_HEADER_MAGIC, 0, command_result.GetValue(), 0};
|
||||||
*out_header = CmifOutHeader{CMIF_OUT_HEADER_MAGIC, 0, command_result.GetValue(), 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
@ -87,19 +90,24 @@ namespace ams::sf::cmif {
|
||||||
CmifOutHeader *out_header = nullptr;
|
CmifOutHeader *out_header = nullptr;
|
||||||
Result command_result = cmd_handler(&out_header, ctx, in_message_raw_data);
|
Result command_result = cmd_handler(&out_header, ctx, in_message_raw_data);
|
||||||
|
|
||||||
/* Forward forwardable results, otherwise ensure we can send result to user. */
|
/* If we should, forward the request to the forward session. */
|
||||||
R_TRY_CATCH(command_result) {
|
if (sm::mitm::ResultShouldForwardToSession::Includes(command_result)) {
|
||||||
R_CATCH(sm::mitm::ResultShouldForwardToSession) {
|
return ctx.session->ForwardRequest(ctx);
|
||||||
return ctx.session->ForwardRequest(ctx);
|
}
|
||||||
}
|
|
||||||
R_CATCH_RETHROW(sf::impl::ResultRequestContextChanged)
|
/* Forward any meta-context change result. */
|
||||||
R_CATCH_ALL() { AMS_ABORT_UNLESS(out_header != nullptr); }
|
if (sf::impl::ResultRequestContextChanged::Includes(command_result)) {
|
||||||
} R_END_TRY_CATCH;
|
return command_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, ensure that we're able to write the output header. */
|
||||||
|
if (out_header == nullptr) {
|
||||||
|
AMS_ABORT_UNLESS(R_FAILED(command_result));
|
||||||
|
return command_result;
|
||||||
|
}
|
||||||
|
|
||||||
/* Write output header to raw data. */
|
/* Write output header to raw data. */
|
||||||
if (out_header != nullptr) {
|
*out_header = CmifOutHeader{CMIF_OUT_HEADER_MAGIC, 0, command_result.GetValue(), 0};
|
||||||
*out_header = CmifOutHeader{CMIF_OUT_HEADER_MAGIC, 0, command_result.GetValue(), 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue