summaryrefslogtreecommitdiff
path: root/src/input/libdvdread/dvd_reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/libdvdread/dvd_reader.c')
-rw-r--r--src/input/libdvdread/dvd_reader.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/input/libdvdread/dvd_reader.c b/src/input/libdvdread/dvd_reader.c
index b296a49de..0ec6fb24d 100644
--- a/src/input/libdvdread/dvd_reader.c
+++ b/src/input/libdvdread/dvd_reader.c
@@ -857,7 +857,7 @@ int32_t DVDFileSeek( dvd_file_t *dvd_file, int32_t offset )
ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
{
- unsigned char *secbuf;
+ unsigned char *secbuf_base, *secbuf;
unsigned int numsec, seek_sector, seek_byte;
int ret;
@@ -865,7 +865,8 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
seek_byte = dvd_file->seek_pos % DVD_VIDEO_LB_LEN;
numsec = ( ( seek_byte + byte_size ) / DVD_VIDEO_LB_LEN ) + 1;
- secbuf = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN );
+ secbuf_base = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN + 2048 );
+ secbuf = (unsigned char *)(((int)secbuf_base & ~2047) + 2048);
if( !secbuf ) {
fprintf( stderr, "libdvdread: Can't allocate memory "
"for file read!\n" );
@@ -881,12 +882,12 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
}
if( ret != (int) numsec ) {
- free( secbuf );
+ free( secbuf_base );
return ret < 0 ? ret : 0;
}
memcpy( data, &(secbuf[ seek_byte ]), byte_size );
- free( secbuf );
+ free( secbuf_base );
dvd_file->seek_pos += byte_size;
return byte_size;