diff --git a/src/file/SDL_rwops.c b/src/file/SDL_rwops.c index cf2ad1b74..41e3f69c4 100644 --- a/src/file/SDL_rwops.c +++ b/src/file/SDL_rwops.c @@ -110,15 +110,23 @@ static int mem_seek(SDL_RWops *context, int offset, int whence) } static int mem_read(SDL_RWops *context, void *ptr, int size, int maxnum) { - int num; + int total_bytes; + int mem_available; - num = maxnum; - if ( (context->hidden.mem.here + (num*size)) > context->hidden.mem.stop ) { - num = (context->hidden.mem.stop-context->hidden.mem.here)/size; + total_bytes = (maxnum * size); + if ( (maxnum <= 0) || (size <= 0) || ((total_bytes / maxnum) != size) ) { + return 0; } - memcpy(ptr, context->hidden.mem.here, num*size); - context->hidden.mem.here += num*size; - return(num); + + mem_available = (context->hidden.mem.stop - context->hidden.mem.here); + if (total_bytes > mem_available) { + total_bytes = mem_available; + } + + memcpy(ptr, context->hidden.mem.here, total_bytes); + context->hidden.mem.here += total_bytes; + + return (total_bytes / size); } static int mem_write(SDL_RWops *context, const void *ptr, int size, int num) {