/*
 * Copyright (C) 2012 The Android Open Source Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#undef _FORTIFY_SOURCE
#include <string.h>
#include <stdlib.h>
#include <private/logd.h>

/*
 * Runtime implementation of __memcpy_chk2.
 *
 * See
 *   http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html
 *   http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html
 * for details.
 *
 * This memcpy check is called if _FORTIFY_SOURCE is defined and
 * greater than 0.
 */
void *__memcpy_chk2(void *dest, const void *src,
              size_t copy_amount, size_t dest_len, size_t src_len)
{
    char *d = (char *) dest;
    const char *s = (const char *) src;

    if (__builtin_expect(copy_amount > dest_len, 0)) {
        __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
            "*** memcpy buffer overflow detected ***\n");
        __libc_android_log_event_uid(BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW);
        abort();
    }

    if (__builtin_expect(copy_amount > src_len, 0)) {
        __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
            "*** memcpy read overflow detected ***\n");
        abort();
    }

    if (__builtin_expect(((d <= s) && ((size_t)(s - d) < copy_amount))
                      || ((d >= s) && ((size_t)(d - s) < copy_amount)), 0)) {
        __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
            "*** memcpy memory overlap detected ***\n");
        abort();
    }

    return memcpy(dest, src, copy_amount);
}

/*
 * GCC can create references to __memcpy_chk when using
 * __builtin__memmove_chk().
 */
void *__memcpy_chk(void *dest, const void *src,
              size_t copy_amount, size_t dest_len)
{
    return __memcpy_chk2(dest, src, copy_amount, dest_len, (size_t) -1);
}
