summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgibbed <rick@gibbed.us>2020-11-29 02:00:16 -0600
committerRick Gibbed <rick@gibbed.us>2020-11-29 02:03:44 -0600
commit215f2a340b7c06a232f8480401b37c73bb79f238 (patch)
tree40c15724890f06e028cf4b5d23e85d992845efc1
parentc55918d944db8a8c2ae20619c86b94794e4a668b (diff)
[XAM] Ensure items returned is set in enumerate.
[XAM] Ensure items returned is set in xeXamEnumerate.
-rw-r--r--src/xenia/kernel/xam/xam_enum.cc68
1 files changed, 31 insertions, 37 deletions
diff --git a/src/xenia/kernel/xam/xam_enum.cc b/src/xenia/kernel/xam/xam_enum.cc
index 2cab56ab7..9aec9b056 100644
--- a/src/xenia/kernel/xam/xam_enum.cc
+++ b/src/xenia/kernel/xam/xam_enum.cc
@@ -32,50 +32,44 @@ uint32_t xeXamEnumerate(uint32_t handle, uint32_t flags, void* buffer,
uint32_t overlapped_ptr) {
assert_true(flags == 0);
+ X_RESULT result;
+ uint32_t item_count = 0;
+
auto e = kernel_state()->object_table()->LookupObject<XEnumerator>(handle);
if (!e) {
- if (overlapped_ptr) {
- kernel_state()->CompleteOverlappedImmediateEx(
- overlapped_ptr, X_ERROR_INVALID_HANDLE, X_ERROR_INVALID_HANDLE, 0);
- return X_ERROR_IO_PENDING;
- } else {
- return X_ERROR_INVALID_HANDLE;
+ result = X_ERROR_INVALID_HANDLE;
+ } else {
+ size_t actual_buffer_length = buffer_length;
+ if (buffer_length == e->items_per_enumerate()) {
+ actual_buffer_length = e->item_size() * e->items_per_enumerate();
+ // Known culprits:
+ // Final Fight: Double Impact (saves)
+ XELOGW(
+ "Broken usage of XamEnumerate! buffer length={:X} vs actual "
+ "length={:X} "
+ "(item size={:X}, items per enumerate={})",
+ (uint32_t)buffer_length, actual_buffer_length, e->item_size(),
+ e->items_per_enumerate());
}
- }
- size_t actual_buffer_length = buffer_length;
- if (buffer_length == e->items_per_enumerate()) {
- actual_buffer_length = e->item_size() * e->items_per_enumerate();
- // Known culprits:
- // Final Fight: Double Impact (saves)
- XELOGW(
- "Broken usage of XamEnumerate! buffer length={:X} vs actual "
- "length={:X} "
- "(item size={:X}, items per enumerate={})",
- (uint32_t)buffer_length, actual_buffer_length, e->item_size(),
- e->items_per_enumerate());
- }
+ std::memset(buffer, 0, actual_buffer_length);
- std::memset(buffer, 0, actual_buffer_length);
-
- X_RESULT result;
- uint32_t item_count = 0;
-
- if (actual_buffer_length < e->item_size()) {
- result = X_ERROR_INSUFFICIENT_BUFFER;
- } else if (e->current_item() >= e->item_count()) {
- result = X_ERROR_NO_MORE_FILES;
- } else {
- auto item_buffer = static_cast<uint8_t*>(buffer);
- auto max_items = actual_buffer_length / e->item_size();
- while (max_items--) {
- if (!e->WriteItem(item_buffer)) {
- break;
+ if (actual_buffer_length < e->item_size()) {
+ result = X_ERROR_INSUFFICIENT_BUFFER;
+ } else if (e->current_item() >= e->item_count()) {
+ result = X_ERROR_NO_MORE_FILES;
+ } else {
+ auto item_buffer = static_cast<uint8_t*>(buffer);
+ auto max_items = actual_buffer_length / e->item_size();
+ while (max_items--) {
+ if (!e->WriteItem(item_buffer)) {
+ break;
+ }
+ item_buffer += e->item_size();
+ item_count++;
}
- item_buffer += e->item_size();
- item_count++;
+ result = X_ERROR_SUCCESS;
}
- result = X_ERROR_SUCCESS;
}
if (items_returned) {