//**********************************************************************;
// Copyright (c) 2015, 2016 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. 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 HOLDER 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.
//**********************************************************************;

#include <sapi/tpm20.h>
#include "sysapi_util.h"


TSS2_RC CheckOverflow( UINT8 *buffer, UINT32 bufferSize, UINT8 *nextData, UINT32 size )
{
    TSS2_RC rval = TSS2_RC_SUCCESS;
    INT64 usedSize;

    usedSize = (INT64)(nextData - buffer) - 1 + size;
    if( usedSize > (INT64)bufferSize )
    {
        rval = TSS2_SYS_RC_INSUFFICIENT_CONTEXT;
    }

    return( rval );
}
/**
 * The buffer and nextData parameters track the front of the output command
 * buffer and the next location where data is to be written in said buffer
 * respectively. In the marshal_* functions depend on these two pointers
 * being in a relatively sane order. Specifically neither should be NULL,
 * and buffer must be less than nextData.
 */
TSS2_RC CheckDataPointers( UINT8 *buffer, UINT8 **nextData )
{
    if( buffer == NULL || nextData == NULL || *nextData == NULL \
        || *nextData < buffer )
    {
        return TSS2_SYS_RC_BAD_REFERENCE;
    }

    return TSS2_RC_SUCCESS;
}
