bochs: backport overlapping memcpy fix
Upstream SVN r12563: "Bugfix: use memmove() if source and destination range can overlap (found with valgrind)." (Manually backported, the code structure has significantly changed before this fix.) Change-Id: Id176fb5b0aca806908cfb06f06bb5a7221ccc9c4
This commit is contained in:
@ -3120,7 +3120,7 @@ void bx_hard_drive_c::init_mode_sense_single(Bit8u channel, const void* src, int
|
|||||||
BX_SELECTED_CONTROLLER(channel).buffer[7] = 0; // reserved
|
BX_SELECTED_CONTROLLER(channel).buffer[7] = 0; // reserved
|
||||||
|
|
||||||
// Data
|
// Data
|
||||||
memcpy(BX_SELECTED_CONTROLLER(channel).buffer + 8, src, size);
|
memmove(BX_SELECTED_CONTROLLER(channel).buffer + 8, src, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
void BX_CPP_AttrRegparmN(1)
|
||||||
|
|||||||
@ -304,7 +304,7 @@ void bx_pci_ide_c::timer()
|
|||||||
// To avoid buffer overflow reset buffer pointers and copy data if necessary
|
// To avoid buffer overflow reset buffer pointers and copy data if necessary
|
||||||
count = BX_PIDE_THIS s.bmdma[channel].buffer_top - BX_PIDE_THIS s.bmdma[channel].buffer_idx;
|
count = BX_PIDE_THIS s.bmdma[channel].buffer_top - BX_PIDE_THIS s.bmdma[channel].buffer_idx;
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
memcpy(BX_PIDE_THIS s.bmdma[channel].buffer, BX_PIDE_THIS s.bmdma[channel].buffer_idx, count);
|
memmove(BX_PIDE_THIS s.bmdma[channel].buffer, BX_PIDE_THIS s.bmdma[channel].buffer_idx, count);
|
||||||
}
|
}
|
||||||
BX_PIDE_THIS s.bmdma[channel].buffer_top = BX_PIDE_THIS s.bmdma[channel].buffer + count;
|
BX_PIDE_THIS s.bmdma[channel].buffer_top = BX_PIDE_THIS s.bmdma[channel].buffer + count;
|
||||||
BX_PIDE_THIS s.bmdma[channel].buffer_idx = BX_PIDE_THIS s.bmdma[channel].buffer;
|
BX_PIDE_THIS s.bmdma[channel].buffer_idx = BX_PIDE_THIS s.bmdma[channel].buffer;
|
||||||
|
|||||||
@ -448,7 +448,7 @@ int bx_sound_linux_c::alsa_pcm_write()
|
|||||||
BX_ERROR(("ALSA: short write, write %d frames", ret));
|
BX_ERROR(("ALSA: short write, write %d frames", ret));
|
||||||
}
|
}
|
||||||
audio_bufsize -= alsa_bufsize;
|
audio_bufsize -= alsa_bufsize;
|
||||||
memcpy(audio_buffer, audio_buffer+alsa_bufsize, audio_bufsize);
|
memmove(audio_buffer, audio_buffer+alsa_bufsize, audio_bufsize);
|
||||||
}
|
}
|
||||||
if ((audio_bufsize == 0) && (alsa_buffer != NULL)) {
|
if ((audio_bufsize == 0) && (alsa_buffer != NULL)) {
|
||||||
free(alsa_buffer);
|
free(alsa_buffer);
|
||||||
|
|||||||
Reference in New Issue
Block a user