From: chenjiangyi chenjiangyi@uniontech.com
Signed-off-by: chenjiangyi chenjiangyi@uniontech.com --- server/mapping.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/server/mapping.c b/server/mapping.c index 8d4332d240f..4730d93be90 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -558,7 +558,7 @@ static int build_shared_mapping( struct mapping *mapping, int fd, struct file *file; unsigned int i; mem_size_t total_size; - size_t file_size, map_size, max_size; + size_t file_size, map_size, max_size, file_roundsize; off_t shared_pos, read_pos, write_pos; char *buffer = NULL; int shared_fd; @@ -595,6 +595,7 @@ static int build_shared_mapping( struct mapping *mapping, int fd, { if (!(sec[i].Characteristics & IMAGE_SCN_MEM_SHARED)) continue; if (!(sec[i].Characteristics & IMAGE_SCN_MEM_WRITE)) continue; + memset(buffer, 0, max_size); get_section_sizes( &sec[i], &map_size, &read_pos, &file_size ); write_pos = shared_pos; shared_pos += map_size; @@ -612,7 +613,16 @@ static int build_shared_mapping( struct mapping *mapping, int fd, toread -= res; read_pos += res; } - if (pwrite( shared_fd, buffer, file_size, write_pos ) != file_size) goto error; + if (file_size & page_mask) + { + file_roundsize = ROUND_SIZE( file_size ); + if (file_roundsize > map_size) file_roundsize = map_size; + if (pwrite( shared_fd, buffer, file_roundsize, write_pos ) != file_roundsize) goto error; + } + else + { + if (pwrite( shared_fd, buffer, file_size, write_pos ) != file_size) goto error; + } }
if (!(shared = alloc_object( &shared_map_ops ))) goto error;