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