xref: /minix3/lib/libc/ssp/stpcpy_chk.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: stpcpy_chk.c,v 1.6 2015/05/09 15:42:21 christos Exp $	*/
284d9c625SLionel Sambuc 
384d9c625SLionel Sambuc /*-
484d9c625SLionel Sambuc  * Copyright (c) 2013 The NetBSD Foundation, Inc.
584d9c625SLionel Sambuc  * All rights reserved.
684d9c625SLionel Sambuc  *
784d9c625SLionel Sambuc  * This code is derived from software contributed to The NetBSD Foundation
884d9c625SLionel Sambuc  * by Christos Zoulas.
984d9c625SLionel Sambuc  *
1084d9c625SLionel Sambuc  * Redistribution and use in source and binary forms, with or without
1184d9c625SLionel Sambuc  * modification, are permitted provided that the following conditions
1284d9c625SLionel Sambuc  * are met:
1384d9c625SLionel Sambuc  * 1. Redistributions of source code must retain the above copyright
1484d9c625SLionel Sambuc  *    notice, this list of conditions and the following disclaimer.
1584d9c625SLionel Sambuc  * 2. Redistributions in binary form must reproduce the above copyright
1684d9c625SLionel Sambuc  *    notice, this list of conditions and the following disclaimer in the
1784d9c625SLionel Sambuc  *    documentation and/or other materials provided with the distribution.
1884d9c625SLionel Sambuc  *
1984d9c625SLionel Sambuc  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2084d9c625SLionel Sambuc  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2184d9c625SLionel Sambuc  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2284d9c625SLionel Sambuc  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2384d9c625SLionel Sambuc  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2484d9c625SLionel Sambuc  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2584d9c625SLionel Sambuc  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2684d9c625SLionel Sambuc  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2784d9c625SLionel Sambuc  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2884d9c625SLionel Sambuc  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2984d9c625SLionel Sambuc  * POSSIBILITY OF SUCH DAMAGE.
3084d9c625SLionel Sambuc  */
3184d9c625SLionel Sambuc #include <sys/cdefs.h>
32*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: stpcpy_chk.c,v 1.6 2015/05/09 15:42:21 christos Exp $");
3384d9c625SLionel Sambuc 
3484d9c625SLionel Sambuc /*LINTLIBRARY*/
3584d9c625SLionel Sambuc 
3684d9c625SLionel Sambuc #include <ssp/ssp.h>
3784d9c625SLionel Sambuc #include <string.h>
3884d9c625SLionel Sambuc 
3984d9c625SLionel Sambuc #undef memcpy
4084d9c625SLionel Sambuc 
4184d9c625SLionel Sambuc #if !__GNUC_PREREQ__(4, 8)
4284d9c625SLionel Sambuc char *__stpcpy_chk(char * __restrict, const char * __restrict, size_t);
4384d9c625SLionel Sambuc #endif
4484d9c625SLionel Sambuc 
4584d9c625SLionel Sambuc char *
__stpcpy_chk(char * __restrict dst,const char * __restrict src,size_t slen)4684d9c625SLionel Sambuc __stpcpy_chk(char * __restrict dst, const char * __restrict src, size_t slen)
4784d9c625SLionel Sambuc {
48*0a6a1f1dSLionel Sambuc 	size_t len = strlen(src);
4984d9c625SLionel Sambuc 
50*0a6a1f1dSLionel Sambuc 	if (len >= slen)
5184d9c625SLionel Sambuc 		__chk_fail();
5284d9c625SLionel Sambuc 
53*0a6a1f1dSLionel Sambuc 	if (__ssp_overlap(src, dst, len))
54*0a6a1f1dSLionel Sambuc 		__chk_fail();
55*0a6a1f1dSLionel Sambuc 
56*0a6a1f1dSLionel Sambuc 	(void)memcpy(dst, src, len + 1);
5784d9c625SLionel Sambuc 	return dst + len;
5884d9c625SLionel Sambuc }
59