X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib_internal%2Funify-copy.c;h=6fe282d383e0ddbc677b642881eb18f7cdc452ad;hb=be41237a12dad904d92e58373f670113bb730a24;hp=6b93089ed9c742492a54fef7816c438dd62ac7bc;hpb=9c78378bebc1a9f3d400f422df8ede9efea57dea;p=util-vserver.git diff --git a/lib_internal/unify-copy.c b/lib_internal/unify-copy.c index 6b93089..6fe282d 100644 --- a/lib_internal/unify-copy.c +++ b/lib_internal/unify-copy.c @@ -83,6 +83,8 @@ static void copyMem(void *dst_v, void const *src_v, size_t len_v) { #if 1 + // Do not use memcpy because this would dirty pages consisting only of + // '\0' int *dst = dst_v; int const *src = src_v; size_t len = len_v / sizeof(int); @@ -119,9 +121,7 @@ copyMMap(int in_fd, int out_fd) bool volatile res = false; if (in_len==-1) return false; - if (in_len>0 && - (lseek(out_fd, in_len-1, SEEK_SET)==-1 || - write(out_fd, "\0", 1)!=1)) // create sparse file + if (in_len>0 && ftruncate(out_fd, in_len)==-1) // create sparse file return false; bus_error = 0; @@ -132,8 +132,8 @@ copyMMap(int in_fd, int out_fd) buf_size = in_len - offset; if (buf_size > MMAP_BLOCKSIZE) buf_size = MMAP_BLOCKSIZE; - if ((in_buf = mmap(0, buf_size, PROT_READ, MAP_SHARED, in_fd, offset))==0 || - (out_buf = mmap(0, buf_size, PROT_WRITE, MAP_SHARED, out_fd, offset))==0) { + if ((in_buf = mmap(0, buf_size, PROT_READ, MAP_SHARED, in_fd, offset))==MAP_FAILED || + (out_buf = mmap(0, buf_size, PROT_WRITE, MAP_SHARED, out_fd, offset))==MAP_FAILED) { perror("mmap()"); goto out; } @@ -145,16 +145,16 @@ copyMMap(int in_fd, int out_fd) TESTSUITE_COPY_CODE; copyMem(out_buf, in_buf, buf_size); - munmap(const_cast(void *)(in_buf), buf_size); in_buf = 0; munmap(out_buf, buf_size); out_buf = 0; + munmap(const_cast(void *)(in_buf), buf_size); in_buf = 0; } res = true; } out: - if (in_buf !=0) munmap(const_cast(void *)(in_buf), buf_size); if (out_buf!=0) munmap(out_buf, buf_size); + if (in_buf !=0) munmap(const_cast(void *)(in_buf), buf_size); return res; } @@ -164,7 +164,7 @@ copyReg(char const *src, struct stat const *src_stat, char const *dst) { int in_fd = open(src, O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_LARGEFILE); - int out_fd = in_fd==-1 ? -1 : open(dst, O_RDWR|O_CREAT|O_EXCL, 0200); + int out_fd = in_fd==-1 ? -1 : open(dst, O_RDWR|O_CREAT|O_EXCL|O_NOCTTY, 0200); bool res = false; if (in_fd==-1 || out_fd==-1 ||