1950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris/*
2950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * Copyright (C) 2014 The Android Open Source Project
3950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * All rights reserved.
4950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *
5950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * Redistribution and use in source and binary forms, with or without
6950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * modification, are permitted provided that the following conditions
7950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * are met:
8950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *  * Redistributions of source code must retain the above copyright
9950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *    notice, this list of conditions and the following disclaimer.
10950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *  * Redistributions in binary form must reproduce the above copyright
11950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *    notice, this list of conditions and the following disclaimer in
12950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *    the documentation and/or other materials provided with the
13950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *    distribution.
14950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *
15950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * SUCH DAMAGE.
27950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris */
28950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris
29950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris#undef _FORTIFY_SOURCE
30950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris
31950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris#include <string.h>
32950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris#include <stdlib.h>
33950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris#include "private/libc_logging.h"
34950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris
35950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris/*
36950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * Runtime implementation of __builtin____stpcpy_chk.
37950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *
38950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * See
39950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *   http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html
40950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *   http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html
41950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * for details.
42950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris *
43950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * This stpcpy check is called if _FORTIFY_SOURCE is defined and
44950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris * greater than 0.
45950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris */
46950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferrisextern "C" char* __stpcpy_chk(char* dest, const char* src, size_t dest_len) {
47950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris  // TODO: optimize so we don't scan src twice.
48950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris  size_t src_len = strlen(src) + 1;
49950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris  if (__predict_false(src_len > dest_len)) {
50950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris    __fortify_chk_fail("stpcpy: prevented write past end of buffer",
51950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris                       BIONIC_EVENT_STPCPY_BUFFER_OVERFLOW);
52950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris  }
53950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris
54950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris  return stpcpy(dest, src);
55950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris}
56