diff options
author | ajrhacker <ajrhacker@users.noreply.github.com> | 2017-04-17 10:57:04 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-17 10:57:04 -0400 |
commit | dbee59a9ffb45e3041e2c18e4a6a42f7bb81ddd7 (patch) | |
tree | ea5775babd56c46384e08e73f6d784579d186e01 | |
parent | bf3d4f0f06bba95fb3c073b9418adfae2d2d35cc (diff) | |
parent | 023292f081231d03ff137bf47d329e679ad1822e (diff) |
Merge pull request #2241 from npwoods/fix_neogeo_vector_out_of_bounds
Fixed out of bounds issues in NeoGeo memory access
-rw-r--r-- | src/devices/bus/neogeo/slot.h | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/devices/bus/neogeo/slot.h b/src/devices/bus/neogeo/slot.h index 40b782c877b..9d1c3cc7424 100644 --- a/src/devices/bus/neogeo/slot.h +++ b/src/devices/bus/neogeo/slot.h @@ -105,51 +105,51 @@ public: virtual int get_fixed_bank_type(void) { return 0; } void rom_alloc(uint32_t size) { m_rom.resize(size/sizeof(uint16_t)); } - uint16_t* get_rom_base() { return &m_rom[0]; } + uint16_t* get_rom_base() { return m_rom.size() > 0 ? &m_rom[0] : nullptr; } uint32_t get_rom_size() { return m_rom.size() * sizeof(uint16_t); } uint16_t* get_region_rom_base() { if (m_region_rom.found()) return &m_region_rom->as_u16(0); return nullptr; } uint32_t get_region_rom_size() { if (m_region_rom.found()) return m_region_rom->bytes(); return 0; } void fixed_alloc(uint32_t size) { m_fixed.resize(size); } - uint8_t* get_fixed_base() { return &m_fixed[0]; } + uint8_t* get_fixed_base() { return m_fixed.size() > 0 ? &m_fixed[0] : nullptr; } uint32_t get_fixed_size() { return m_fixed.size(); } uint8_t* get_region_fixed_base() { if (m_region_fixed.found()) return m_region_fixed->base(); return nullptr; } uint32_t get_region_fixed_size() { if (m_region_fixed.found()) return m_region_fixed->bytes(); return 0; } void audio_alloc(uint32_t size) { m_audio.resize(size); } - uint8_t* get_audio_base() { return &m_audio[0]; } + uint8_t* get_audio_base() { return m_audio.size() > 0 ? &m_audio[0] : nullptr; } uint32_t get_audio_size() { return m_audio.size(); } uint8_t* get_region_audio_base() { if (m_region_audio.found()) return m_region_audio->base(); return nullptr; } uint32_t get_region_audio_size() { if (m_region_audio.found()) return m_region_audio->bytes(); return 0; } void audiocrypt_alloc(uint32_t size) { m_audiocrypt.resize(size); } - uint8_t* get_audiocrypt_base() { if (m_audiocrypt.size() == 0) return nullptr; else return &m_audiocrypt[0]; } + uint8_t* get_audiocrypt_base() { return m_audiocrypt.size() > 0 ? &m_audiocrypt[0] : nullptr; } uint32_t get_audiocrypt_size() { return m_audiocrypt.size(); } uint8_t* get_region_audiocrypt_base() { if (m_region_audiocrypt.found()) return m_region_audiocrypt->base(); return nullptr; } uint32_t get_region_audiocrypt_size() { if (m_region_audiocrypt.found()) return m_region_audiocrypt->bytes(); return 0; } // TODO: review sprite code later!! void sprites_alloc(uint32_t size) { m_sprites.resize(size); } - uint8_t* get_sprites_base() { return &m_sprites[0]; } + uint8_t* get_sprites_base() { return m_sprites.size() > 0 ? &m_sprites[0] : nullptr; } uint32_t get_sprites_size() { return m_sprites.size(); } uint8_t* get_region_sprites_base() { if (m_region_spr.found()) return m_region_spr->base(); return nullptr; } uint32_t get_region_sprites_size() { if (m_region_spr.found()) return m_region_spr->bytes(); return 0; } void ym_alloc(uint32_t size) { m_ym.resize(size); } - uint8_t* get_ym_base() { return &m_ym[0]; } + uint8_t* get_ym_base() { return m_ym.size() > 0 ? &m_ym[0] : nullptr; } uint32_t get_ym_size() { return m_ym.size(); } uint8_t* get_region_ym_base() { if (m_region_ym.found()) return m_region_ym->base(); return nullptr; } uint32_t get_region_ym_size() { if (m_region_ym.found()) return m_region_ym->bytes(); return 0; } void ymdelta_alloc(uint32_t size) { m_ymdelta.resize(size); } - uint8_t* get_ymdelta_base() { return &m_ymdelta[0]; } + uint8_t* get_ymdelta_base() { return m_ymdelta.size() > 0 ? &m_ymdelta[0] : nullptr; } uint32_t get_ymdelta_size() { return m_ymdelta.size(); } uint8_t* get_region_ymdelta_base() { if (m_region_ymd.found()) return m_region_ymd->base(); return nullptr; } uint32_t get_region_ymdelta_size() { if (m_region_ymd.found()) return m_region_ymd->bytes(); return 0; } // this is only used to setup optimized sprites when loading on multi-slot drivers from softlist // therefore, we do not need a separate region accessor! - uint8_t* get_sprites_opt_base() { return &m_sprites_opt[0]; } + uint8_t* get_sprites_opt_base() { return m_sprites_opt.size() > 0 ? &m_sprites_opt[0] : nullptr; } uint32_t get_sprites_opt_size() { return m_sprites_opt.size(); } void optimize_sprites(uint8_t* region_sprites, uint32_t region_sprites_size); |