Skip to content

Commit

Permalink
修复文件传输回调的double free
Browse files Browse the repository at this point in the history
  • Loading branch information
Daylily-Zeleen committed Apr 19, 2024
1 parent fa6b72e commit a7831d6
Showing 1 changed file with 9 additions and 10 deletions.
19 changes: 9 additions & 10 deletions gd_eos/include/core/file_transfer.inl
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,14 @@ struct _FileTransferData {
template <typename EOSCallbackInfoTy, typename GDCallbackInfoTy, const char *SIGNAL_NAME>
EOS_PlayerDataStorage_EReadResult read_file_data_callback(const EOSCallbackInfoTy *p_data) {
auto file_transfer_data = (_FileTransferData *)(p_data->ClientData);
ERR_FAIL_COND_V(file_transfer_data->operation_callback.is_valid(), (memdelete(file_transfer_data), EOS_PlayerDataStorage_EReadResult::EOS_RR_FailRequest));
ERR_FAIL_COND_V(!file_transfer_data->operation_callback.is_valid(), EOS_PlayerDataStorage_EReadResult::EOS_RR_FailRequest);

auto data = GDCallbackInfoTy::from_eos(*p_data);
Variant res = file_transfer_data->operation_callback.call(data);
ERR_FAIL_COND_V_MSG(res.get_type() != Variant::INT || (int32_t)res < 1 || (int32_t)res > 3, (memdelete(file_transfer_data), EOS_PlayerDataStorage_EReadResult::EOS_RR_FailRequest), "Read file data callback shoul return a Value of PlayerDataStorage.ReadResult.");
ERR_FAIL_COND_V_MSG(res.get_type() != Variant::INT || (int32_t)res < 1 || (int32_t)res > 3, EOS_PlayerDataStorage_EReadResult::EOS_RR_FailRequest, "Read file data callback shoul return a Value of PlayerDataStorage.ReadResult.");

EOS_PlayerDataStorage_EReadResult read_result = (EOS_PlayerDataStorage_EReadResult)(res.operator int32_t());
if (read_result == EOS_PlayerDataStorage_EReadResult::EOS_RR_FailRequest || read_result == EOS_PlayerDataStorage_EReadResult::EOS_RR_CancelRequest) {
memdelete(file_transfer_data);
return read_result;
}

Expand All @@ -44,20 +43,19 @@ EOS_PlayerDataStorage_EReadResult read_file_data_callback(const EOSCallbackInfoT
template <typename EOSCallbackInfoTy, typename GDCallbackInfoTy, const char *SIGNAL_NAME>
EOS_PlayerDataStorage_EWriteResult write_file_data_callback(const EOSCallbackInfoTy *p_data, void *r_data_buffer, uint32_t *r_data_written) {
auto file_transfer_data = (_FileTransferData *)(p_data->ClientData);
ERR_FAIL_COND_V(file_transfer_data->operation_callback.is_valid(), (memdelete(file_transfer_data), EOS_PlayerDataStorage_EWriteResult::EOS_WR_FailRequest));
ERR_FAIL_COND_V(!file_transfer_data->operation_callback.is_valid(), EOS_PlayerDataStorage_EWriteResult::EOS_WR_FailRequest);

auto data = GDCallbackInfoTy::from_eos(*p_data);
PackedByteArray out_data_buffer;
Variant res = file_transfer_data->operation_callback.call(data, out_data_buffer);
ERR_FAIL_COND_V_MSG(res.get_type() != Variant::INT || (int32_t)res < 1 || (int32_t)res > 4, (memdelete(file_transfer_data), EOS_PlayerDataStorage_EWriteResult::EOS_WR_FailRequest), "Write file data callback shoul return a Value of PlayerDataStorage.WriteResult.");
ERR_FAIL_COND_V_MSG(res.get_type() != Variant::INT || (int32_t)res < 1 || (int32_t)res > 4, EOS_PlayerDataStorage_EWriteResult::EOS_WR_FailRequest, "Write file data callback shoul return a Value of PlayerDataStorage.WriteResult.");

EOS_PlayerDataStorage_EWriteResult write_result = (EOS_PlayerDataStorage_EWriteResult)(res.operator int32_t());
if (write_result == EOS_PlayerDataStorage_EWriteResult::EOS_WR_FailRequest || write_result == EOS_PlayerDataStorage_EWriteResult::EOS_WR_CancelRequest) {
memdelete(file_transfer_data);
return write_result;
}

ERR_FAIL_COND_V(out_data_buffer.size() < p_data->DataBufferLengthBytes, (memdelete(file_transfer_data), EOS_PlayerDataStorage_EWriteResult::EOS_WR_FailRequest));
ERR_FAIL_COND_V(out_data_buffer.size() > p_data->DataBufferLengthBytes, EOS_PlayerDataStorage_EWriteResult::EOS_WR_FailRequest);
memcpy(r_data_buffer, out_data_buffer.ptr(), out_data_buffer.size());
*r_data_written = out_data_buffer.size();

Expand All @@ -72,15 +70,14 @@ EOS_PlayerDataStorage_EWriteResult write_file_data_callback(const EOSCallbackInf
template <typename EOSCallbackInfoTy, typename GDCallbackInfoTy, const char *SIGNAL_NAME>
EOS_TitleStorage_EReadResult title_storage_read_file_data_callback(const EOSCallbackInfoTy *p_data) {
auto file_transfer_data = (_FileTransferData *)(p_data->ClientData);
ERR_FAIL_COND_V(file_transfer_data->operation_callback.is_valid(), (memdelete(file_transfer_data), EOS_TitleStorage_EReadResult::EOS_TS_RR_FailRequest));
ERR_FAIL_COND_V(!file_transfer_data->operation_callback.is_valid(), EOS_TitleStorage_EReadResult::EOS_TS_RR_FailRequest);

auto data = GDCallbackInfoTy::from_eos(*p_data);
Variant res = file_transfer_data->operation_callback.call(data);
ERR_FAIL_COND_V_MSG(res.get_type() != Variant::INT || (int32_t)res < 1 || (int32_t)res > 3, (memdelete(file_transfer_data), EOS_TitleStorage_EReadResult::EOS_TS_RR_FailRequest), "Read file data callback shoul return a Value of PlayerDataStorage.ReadResult.");
ERR_FAIL_COND_V_MSG(res.get_type() != Variant::INT || (int32_t)res < 1 || (int32_t)res > 3, EOS_TitleStorage_EReadResult::EOS_TS_RR_FailRequest, "Read file data callback shoul return a Value of PlayerDataStorage.ReadResult.");

EOS_TitleStorage_EReadResult read_result = (EOS_TitleStorage_EReadResult)(res.operator int32_t());
if (read_result == EOS_TitleStorage_EReadResult::EOS_TS_RR_FailRequest || read_result == EOS_TitleStorage_EReadResult::EOS_TS_RR_CancelRequest) {
memdelete(file_transfer_data);
return read_result;
}

Expand Down Expand Up @@ -122,6 +119,8 @@ void file_transfer_completion_callback(const EOSCallbackInfoTy *p_data) {
if (auto interface = Object::cast_to<Object>(file_transfer_data->interface_handle)) {
interface->emit_signal(SNAME(INTERFACE_SIGNAL_NAME), p_data);
}

// 即使是取消/失败操作也会调用completion回调
memdelete(file_transfer_data);
}

Expand Down

0 comments on commit a7831d6

Please sign in to comment.