Refuse to abort sceNp2 requests that change state

This commit is contained in:
RipleyTom
2025-12-19 06:07:18 +01:00
committed by Megamouse
parent b99bd12d5e
commit 371af2d94f
5 changed files with 43 additions and 38 deletions
+1 -4
View File
@@ -819,10 +819,7 @@ error_code sceNpMatching2AbortRequest(SceNpMatching2ContextId ctxId, SceNpMatchi
return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_FOUND; return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_FOUND;
} }
if (!nph.abort_request(reqId)) return nph.abort_request(reqId);
return SCE_NP_MATCHING2_ERROR_REQUEST_NOT_FOUND;
return CELL_OK;
} }
error_code sceNpMatching2GetServerInfo( error_code sceNpMatching2GetServerInfo(
+1 -1
View File
@@ -1,10 +1,10 @@
#include "Emu/NP/np_structs_extra.h"
#include "stdafx.h" #include "stdafx.h"
#include <bit> #include <bit>
#include "Emu/NP/np_allocator.h" #include "Emu/NP/np_allocator.h"
#include "Emu/NP/np_cache.h" #include "Emu/NP/np_cache.h"
#include "Emu/NP/np_helpers.h" #include "Emu/NP/np_helpers.h"
#include "Emu/NP/np_structs_extra.h"
LOG_CHANNEL(np_cache); LOG_CHANNEL(np_cache);
+20 -13
View File
@@ -1273,19 +1273,20 @@ namespace np
return false; return false;
} }
u32 np_handler::generate_callback_info(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, SceNpMatching2Event event_type) u32 np_handler::generate_callback_info(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, SceNpMatching2Event event_type, bool abortable)
{ {
callback_info ret;
const auto ctx = get_match2_context(ctx_id); const auto ctx = get_match2_context(ctx_id);
ensure(ctx); ensure(ctx);
const u32 req_id = get_req_id(optParam ? optParam->appReqId : ctx->default_match2_optparam.appReqId); const u32 req_id = get_req_id(optParam ? optParam->appReqId : ctx->default_match2_optparam.appReqId);
ret.ctx_id = ctx_id; callback_info ret{
ret.cb_arg = (optParam && optParam->cbFuncArg) ? optParam->cbFuncArg : ctx->default_match2_optparam.cbFuncArg; .ctx_id = ctx_id,
ret.cb = (optParam && optParam->cbFunc) ? optParam->cbFunc : ctx->default_match2_optparam.cbFunc; .cb = (optParam && optParam->cbFunc) ? optParam->cbFunc : ctx->default_match2_optparam.cbFunc,
ret.event_type = event_type; .cb_arg = (optParam && optParam->cbFuncArg) ? optParam->cbFuncArg : ctx->default_match2_optparam.cbFuncArg,
.event_type = event_type,
.abortable = abortable,
};
nph_log.trace("Callback used is 0x%x with req_id %d", ret.cb, req_id); nph_log.trace("Callback used is 0x%x with req_id %d", ret.cb, req_id);
@@ -1310,16 +1311,22 @@ namespace np
return cb_info; return cb_info;
} }
bool np_handler::abort_request(u32 req_id) error_code np_handler::abort_request(u32 req_id)
{ {
auto cb_info_opt = take_pending_request(req_id); std::lock_guard lock(mutex_pending_requests);
if (!cb_info_opt) if (!pending_requests.contains(req_id))
return false; return SCE_NP_MATCHING2_ERROR_REQUEST_NOT_FOUND;
cb_info_opt->queue_callback(req_id, 0, SCE_NP_MATCHING2_ERROR_ABORTED, 0); if (!::at32(pending_requests, req_id).abortable)
return SCE_NP_MATCHING2_ERROR_CANNOT_ABORT;
return true; const auto cb_info = std::move(::at32(pending_requests, req_id));
pending_requests.erase(req_id);
cb_info.queue_callback(req_id, 0, SCE_NP_MATCHING2_ERROR_ABORTED, 0);
return CELL_OK;
} }
event_data& np_handler::allocate_req_result(u32 event_key, u32 max_size, u32 initial_size) event_data& np_handler::allocate_req_result(u32 event_key, u32 max_size, u32 initial_size)
+3 -2
View File
@@ -257,7 +257,7 @@ namespace np
u32 add_players_to_history(const SceNpId* npids, const char* description, u32 count); u32 add_players_to_history(const SceNpId* npids, const char* description, u32 count);
u32 get_players_history_count(u32 options); u32 get_players_history_count(u32 options);
bool get_player_history_entry(u32 options, u32 index, SceNpId* npid); bool get_player_history_entry(u32 options, u32 index, SceNpId* npid);
bool abort_request(u32 req_id); error_code abort_request(u32 req_id);
// For signaling // For signaling
void req_sign_infos(const std::string& npid, u32 conn_id); void req_sign_infos(const std::string& npid, u32 conn_id);
@@ -372,11 +372,12 @@ namespace np
vm::ptr<SceNpMatching2RequestCallback> cb; vm::ptr<SceNpMatching2RequestCallback> cb;
vm::ptr<void> cb_arg; vm::ptr<void> cb_arg;
SceNpMatching2Event event_type; SceNpMatching2Event event_type;
bool abortable;
void queue_callback(u32 req_id, u32 event_key, s32 error_code, u32 data_size) const; void queue_callback(u32 req_id, u32 event_key, s32 error_code, u32 data_size) const;
}; };
u32 generate_callback_info(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, SceNpMatching2Event event_type); u32 generate_callback_info(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, SceNpMatching2Event event_type, bool abortable);
std::optional<callback_info> take_pending_request(u32 req_id); std::optional<callback_info> take_pending_request(u32 req_id);
private: private:
+18 -18
View File
@@ -69,7 +69,7 @@ namespace np
u32 np_handler::get_server_status(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 server_id) u32 np_handler::get_server_status(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 server_id)
{ {
// TODO: actually implement interaction with server for this? // TODO: actually implement interaction with server for this?
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetServerInfo); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetServerInfo, true);
const u32 event_key = get_event_key(); const u32 event_key = get_event_key();
auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetServerInfo, sizeof(SceNpMatching2GetServerInfoResponse)); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_GetServerInfo, sizeof(SceNpMatching2GetServerInfoResponse));
@@ -87,7 +87,7 @@ namespace np
u32 np_handler::create_server_context(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 /*server_id*/) u32 np_handler::create_server_context(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 /*server_id*/)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_CreateServerContext); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_CreateServerContext, false);
const auto cb_info_opt = take_pending_request(req_id); const auto cb_info_opt = take_pending_request(req_id);
ensure(cb_info_opt); ensure(cb_info_opt);
@@ -98,7 +98,7 @@ namespace np
u32 np_handler::delete_server_context(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 /*server_id*/) u32 np_handler::delete_server_context(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 /*server_id*/)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_DeleteServerContext); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_DeleteServerContext, false);
const auto cb_info_opt = take_pending_request(req_id); const auto cb_info_opt = take_pending_request(req_id);
ensure(cb_info_opt); ensure(cb_info_opt);
@@ -109,7 +109,7 @@ namespace np
u32 np_handler::get_world_list(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 server_id) u32 np_handler::get_world_list(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, u16 server_id)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetWorldInfoList); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetWorldInfoList, true);
if (!get_rpcn()->get_world_list(req_id, get_match2_context(ctx_id)->communicationId, server_id)) if (!get_rpcn()->get_world_list(req_id, get_match2_context(ctx_id)->communicationId, server_id))
{ {
@@ -159,7 +159,7 @@ namespace np
u32 np_handler::create_join_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2CreateJoinRoomRequest* req) u32 np_handler::create_join_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2CreateJoinRoomRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_CreateJoinRoom); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_CreateJoinRoom, false);
extra_nps::print_SceNpMatching2CreateJoinRoomRequest(req); extra_nps::print_SceNpMatching2CreateJoinRoomRequest(req);
@@ -221,7 +221,7 @@ namespace np
u32 np_handler::join_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2JoinRoomRequest* req) u32 np_handler::join_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2JoinRoomRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_JoinRoom); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_JoinRoom, false);
extra_nps::print_SceNpMatching2JoinRoomRequest(req); extra_nps::print_SceNpMatching2JoinRoomRequest(req);
@@ -311,7 +311,7 @@ namespace np
u32 np_handler::leave_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2LeaveRoomRequest* req) u32 np_handler::leave_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2LeaveRoomRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_LeaveRoom); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_LeaveRoom, false);
if (!get_rpcn()->leave_room(req_id, get_match2_context(ctx_id)->communicationId, req)) if (!get_rpcn()->leave_room(req_id, get_match2_context(ctx_id)->communicationId, req))
{ {
@@ -356,7 +356,7 @@ namespace np
u32 np_handler::search_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SearchRoomRequest* req) u32 np_handler::search_room(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SearchRoomRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SearchRoom); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SearchRoom, true);
extra_nps::print_SceNpMatching2SearchRoomRequest(req); extra_nps::print_SceNpMatching2SearchRoomRequest(req);
@@ -395,7 +395,7 @@ namespace np
u32 np_handler::get_roomdata_external_list(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2GetRoomDataExternalListRequest* req) u32 np_handler::get_roomdata_external_list(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2GetRoomDataExternalListRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomDataExternalList); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomDataExternalList, true);
extra_nps::print_SceNpMatching2GetRoomDataExternalListRequest(req); extra_nps::print_SceNpMatching2GetRoomDataExternalListRequest(req);
@@ -435,7 +435,7 @@ namespace np
u32 np_handler::set_roomdata_external(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetRoomDataExternalRequest* req) u32 np_handler::set_roomdata_external(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetRoomDataExternalRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomDataExternal); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomDataExternal, false);
extra_nps::print_SceNpMatching2SetRoomDataExternalRequest(req); extra_nps::print_SceNpMatching2SetRoomDataExternalRequest(req);
@@ -470,7 +470,7 @@ namespace np
u32 np_handler::get_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2GetRoomDataInternalRequest* req) u32 np_handler::get_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2GetRoomDataInternalRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomDataInternal); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomDataInternal, true);
if (!get_rpcn()->get_roomdata_internal(req_id, get_match2_context(ctx_id)->communicationId, req)) if (!get_rpcn()->get_roomdata_internal(req_id, get_match2_context(ctx_id)->communicationId, req))
{ {
@@ -524,7 +524,7 @@ namespace np
u32 np_handler::set_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetRoomDataInternalRequest* req) u32 np_handler::set_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetRoomDataInternalRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomDataInternal); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomDataInternal, false);
extra_nps::print_SceNpMatching2SetRoomDataInternalRequest(req); extra_nps::print_SceNpMatching2SetRoomDataInternalRequest(req);
@@ -558,7 +558,7 @@ namespace np
u32 np_handler::get_roommemberdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2GetRoomMemberDataInternalRequest* req) u32 np_handler::get_roommemberdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2GetRoomMemberDataInternalRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomMemberDataInternal); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetRoomMemberDataInternal, true);
extra_nps::print_SceNpMatching2GetRoomMemberDataInternalRequest(req); extra_nps::print_SceNpMatching2GetRoomMemberDataInternalRequest(req);
if (!get_rpcn()->get_roommemberdata_internal(req_id, get_match2_context(ctx_id)->communicationId, req)) if (!get_rpcn()->get_roommemberdata_internal(req_id, get_match2_context(ctx_id)->communicationId, req))
@@ -610,7 +610,7 @@ namespace np
u32 np_handler::set_roommemberdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetRoomMemberDataInternalRequest* req) u32 np_handler::set_roommemberdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetRoomMemberDataInternalRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomMemberDataInternal); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomMemberDataInternal, false);
extra_nps::print_SceNpMatching2SetRoomMemberDataInternalRequest(req); extra_nps::print_SceNpMatching2SetRoomMemberDataInternalRequest(req);
@@ -646,7 +646,7 @@ namespace np
u32 np_handler::set_userinfo(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetUserInfoRequest* req) u32 np_handler::set_userinfo(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SetUserInfoRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetUserInfo); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SetUserInfo, false);
if (!get_rpcn()->set_userinfo(req_id, get_match2_context(ctx_id)->communicationId, req)) if (!get_rpcn()->set_userinfo(req_id, get_match2_context(ctx_id)->communicationId, req))
{ {
@@ -675,7 +675,7 @@ namespace np
u32 np_handler::get_ping_info(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SignalingGetPingInfoRequest* req) u32 np_handler::get_ping_info(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SignalingGetPingInfoRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SignalingGetPingInfo); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SignalingGetPingInfo, true);
if (!get_rpcn()->ping_room_owner(req_id, get_match2_context(ctx_id)->communicationId, req->roomId)) if (!get_rpcn()->ping_room_owner(req_id, get_match2_context(ctx_id)->communicationId, req->roomId))
{ {
@@ -722,7 +722,7 @@ namespace np
u32 np_handler::send_room_message(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SendRoomMessageRequest* req) u32 np_handler::send_room_message(SceNpMatching2ContextId ctx_id, vm::cptr<SceNpMatching2RequestOptParam> optParam, const SceNpMatching2SendRoomMessageRequest* req)
{ {
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SendRoomMessage); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_SendRoomMessage, false);
if (!get_rpcn()->send_room_message(req_id, get_match2_context(ctx_id)->communicationId, req)) if (!get_rpcn()->send_room_message(req_id, get_match2_context(ctx_id)->communicationId, req))
{ {
@@ -803,7 +803,7 @@ namespace np
extra_nps::print_SceNpMatching2GetLobbyInfoListRequest(req); extra_nps::print_SceNpMatching2GetLobbyInfoListRequest(req);
const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetLobbyInfoList); const u32 req_id = generate_callback_info(ctx_id, optParam, SCE_NP_MATCHING2_REQUEST_EVENT_GetLobbyInfoList, false);
auto cb_info_opt = take_pending_request(req_id); auto cb_info_opt = take_pending_request(req_id);
if (!cb_info_opt) if (!cb_info_opt)