[XAM] Fixed crash related to incorrect buffer size in UserPlaylist enum
- Replaced unk_ptr in XMP_CREATE_USER_PLAYLIST_ENUMERATOR - Simplified logic in achievements StringBuffer
This commit is contained in:
committed by
Radosław Gliński
parent
4b73839bf1
commit
dce4d38c0a
@@ -85,7 +85,7 @@ class XEnumerator : public XObject {
|
||||
return result;
|
||||
}
|
||||
|
||||
virtual uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,
|
||||
virtual uint32_t WriteItems(uint8_t* buffer_data, uint32_t buffer_size,
|
||||
uint32_t* written_count) = 0;
|
||||
|
||||
size_t item_size() const { return item_size_; }
|
||||
@@ -110,7 +110,7 @@ class XStaticUntypedEnumerator : public XEnumerator {
|
||||
|
||||
uint8_t* AppendItem();
|
||||
|
||||
uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,
|
||||
uint32_t WriteItems(uint8_t* buffer_data, uint32_t buffer_size,
|
||||
uint32_t* written_count) override;
|
||||
|
||||
private:
|
||||
@@ -151,30 +151,27 @@ class XAchievementEnumerator : public XEnumerator {
|
||||
items_.push_back(std::move(item));
|
||||
}
|
||||
|
||||
uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,
|
||||
uint32_t WriteItems(uint8_t* buffer_data, uint32_t buffer_size,
|
||||
uint32_t* written_count) override;
|
||||
|
||||
private:
|
||||
struct StringBuffer {
|
||||
uint32_t ptr;
|
||||
uint8_t* data;
|
||||
size_t remaining_bytes;
|
||||
};
|
||||
|
||||
uint32_t AppendString(StringBuffer& sb, const std::u16string_view string) {
|
||||
size_t count = string.length() + 1;
|
||||
size_t size = count * sizeof(char16_t);
|
||||
const size_t count = string.length() + 1;
|
||||
const size_t size = count * sizeof(char16_t);
|
||||
if (size > sb.remaining_bytes) {
|
||||
assert_always();
|
||||
return 0;
|
||||
}
|
||||
auto ptr = sb.ptr;
|
||||
string_util::copy_and_swap_truncating(reinterpret_cast<char16_t*>(sb.data),
|
||||
string, count);
|
||||
sb.ptr += static_cast<uint32_t>(size);
|
||||
sb.data += size;
|
||||
sb.remaining_bytes -= size;
|
||||
return ptr;
|
||||
return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(sb.data - size));
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -195,7 +192,7 @@ class XTitleEnumerator : public XEnumerator {
|
||||
|
||||
void AppendItem(const xam::TitleInfo& item) { items_.push_back(item); }
|
||||
|
||||
uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,
|
||||
uint32_t WriteItems(uint8_t* buffer_data, uint32_t buffer_size,
|
||||
uint32_t* written_count) override;
|
||||
|
||||
private:
|
||||
@@ -214,7 +211,7 @@ class XUserStatsEnumerator : public XEnumerator {
|
||||
XUserStatsEnumerator(KernelState* kernel_state, size_t items_per_enumerate)
|
||||
: XEnumerator(kernel_state, items_per_enumerate, 0) {}
|
||||
|
||||
uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,
|
||||
uint32_t WriteItems(uint8_t* buffer_data, uint32_t buffer_size,
|
||||
uint32_t* written_count) override;
|
||||
|
||||
private:
|
||||
@@ -234,7 +231,7 @@ class XMPCreateUserPlaylistEnumerator : public XEnumerator {
|
||||
items_.push_back(item);
|
||||
}
|
||||
|
||||
uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,
|
||||
uint32_t WriteItems(uint8_t* buffer_data, uint32_t buffer_size,
|
||||
uint32_t* written_count) override;
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user