Merge pull request #9211 from voidlakhan/fix/savedata-dialog-getresult-output-buffer

fix(libSceSaveDataDialog.native): initialize result directory name on empty selection
This commit is contained in:
Dean authored and GitHub committed 2026-10-24 10:36:36 +13:00
commit cbd7ec1959
2 files changed
+33 -1

No files matched your search

@@ -44,7 +44,7 @@ int APS5_VABI sceSaveDataDialogGetResult(void* result) {
r->result = SAVE_DATA_DIALOG_RESULT_OK;
r->button_id = SAVE_DATA_DIALOG_BUTTON_ID_OK;
r->user_data = g_user_data;
if (r->dir_name != nullptr && g_dir_name[0] != '\0') {
if (r->dir_name != nullptr) {
std::snprintf(static_cast<SaveDataDirName*>(r->dir_name)->data,
sizeof(SaveDataDirName::data), "%s", g_dir_name);
}
+32
View File
@@ -106,6 +106,38 @@ int main() {
Require(sceSaveDataDialogTerminate() == 0, "terminate");
Require(sceSaveDataDialogTerminate() == SAVE_DATA_DIALOG_ERROR_NOT_INITIALIZED, "terminate when already terminated");
Require(sceSaveDataDialogGetStatus() == SAVE_DATA_DIALOG_STATUS_NONE, "terminated state");
Require(sceSaveDataDialogInitialize() == 0, "re-initialize for empty selection");
SaveDataDialogParam emptySelectionParam{};
emptySelectionParam.size = sizeof(emptySelectionParam);
emptySelectionParam.mode = 1;
Require(sceSaveDataDialogOpen(&emptySelectionParam) == 0, "open selection dialog without items");
Require(sceSaveDataDialogGetStatus() == SAVE_DATA_DIALOG_STATUS_FINISHED, "selection finishes immediately");
SaveDataDirName emptySelectionDir{};
std::memset(emptySelectionDir.data, 'X', sizeof(emptySelectionDir.data));
SaveDataDialogResult emptySelectionResult{};
emptySelectionResult.dir_name = &emptySelectionDir;
Require(sceSaveDataDialogGetResult(&emptySelectionResult) == 0, "read empty selection result");
Require(emptySelectionDir.data[0] == '\0', "empty selection directory name must be null-terminated");
Require(emptySelectionResult.mode == emptySelectionParam.mode &&
emptySelectionResult.result == SAVE_DATA_DIALOG_RESULT_OK, "selection result status");
Require(sceSaveDataDialogTerminate() == 0, "terminate selection");
Require(sceSaveDataDialogInitialize() == 0, "re-initialize for empty result");
param = {};
param.size = sizeof(param);
param.mode = SAVE_DATA_DIALOG_MODE_PROGRESS_BAR;
Require(sceSaveDataDialogOpen(&param) == 0, "open progress without items");
Require(sceSaveDataDialogClose(nullptr) == 0, "close empty progress");
Require(sceSaveDataDialogUpdateStatus() == SAVE_DATA_DIALOG_STATUS_FINISHED, "finish empty progress");
SaveDataDirName emptySelected{};
std::memset(emptySelected.data, 'X', sizeof(emptySelected.data));
SaveDataDialogResult emptyResult{};
emptyResult.dir_name = &emptySelected;
Require(sceSaveDataDialogGetResult(&emptyResult) == 0, "read empty result");
Require(emptySelected.data[0] == '\0', "empty directory name must be null-terminated");
Require(sceSaveDataDialogTerminate() == 0, "terminate empty progress");
Require(sceSaveDataDialogProgressBarInc(0, 10) == SAVE_DATA_DIALOG_ERROR_NOT_RUNNING, "progress inc after terminate");
Require(sceSaveDataDialogProgressBarSetValue(0, 50) == SAVE_DATA_DIALOG_ERROR_NOT_RUNNING, "progress set value after terminate");
}