
1: /* Copy memory to memory until the specified number of bytes 2: has been copied, return pointer to following byte, with error checking. 3: Overlap is NOT handled correctly. 4: Copyright (C) 1991, 1997, 1998, 2002, 2004 Free Software Foundation, Inc. 5: This file is part of the GNU C Library. 6: Contributed by Torbjorn Granlund (tege@sics.se). 7: 8: The GNU C Library is free software; you can redistribute it and/or 9: modify it under the terms of the GNU Lesser General Public 10: License as published by the Free Software Foundation; either 11: version 2.1 of the License, or (at your option) any later version. 12: 13: The GNU C Library is distributed in the hope that it will be useful, 14: but WITHOUT ANY WARRANTY; without even the implied warranty of 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16: Lesser General Public License for more details. 17: 18: You should have received a copy of the GNU Lesser General Public 19: License along with the GNU C Library; if not, write to the Free 20: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 21: 02111-1307 USA. */ 22: 23: #include <string.h> 24: #include <memcopy.h> 25: #include <pagecopy.h> 26: 27: void * 28: __mempcpy_chk (dstpp, srcpp, len, dstlen) 29: void *dstpp; 30: const void *srcpp; 31: size_t len; 32: size_t dstlen; 33: { 34: if (__builtin_expect (dstlen < len, 0)) 35: __chk_fail (); 36: 37: unsigned long int dstp = (long int) dstpp; 38: unsigned long int srcp = (long int) srcpp; 39: 40: /* Copy from the beginning to the end. */ 41: 42: /* If there not too few bytes to copy, use word copy. */ 43: if (len >= OP_T_THRES) 44: { 45: /* Copy just a few bytes to make DSTP aligned. */ 46: len -= (-dstp) % OPSIZ; 47: BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ); 48: 49: /* Copy whole pages from SRCP to DSTP by virtual address manipulation, 50: as much as possible. */ 51: 52: PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len); 53: 54: /* Copy from SRCP to DSTP taking advantage of the known alignment of 55: DSTP. Number of bytes remaining is put in the third argument, 56: i.e. in LEN. This number may vary from machine to machine. */ 57: 58: WORD_COPY_FWD (dstp, srcp, len, len); 59: 60: /* Fall out and copy the tail. */ 61: } 62: 63: /* There are just a few bytes to copy. Use byte memory operations. */ 64: BYTE_COPY_FWD (dstp, srcp, len); 65: 66: return (void *) dstp; 67: }