// Copyright 2020 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "dawn_wire/ChunkedCommandHandler.h"

#include <algorithm>

#include <string.h>

namespace dawn_wire {

    ChunkedCommandHandler::~ChunkedCommandHandler() = default;

    const volatile char* ChunkedCommandHandler::HandleCommands(const volatile char* commands,
                                                               size_t size) {
        if (mChunkedCommandRemainingSize > 0) {
            // If there is a chunked command in flight, append the command data.
            // We append at most |mChunkedCommandRemainingSize| which is enough to finish the
            // in-flight chunked command, and then pass the rest along to a second call to
            // |HandleCommandsImpl|.
            size_t chunkSize = std::min(size, mChunkedCommandRemainingSize);

            memcpy(mChunkedCommandData.get() + mChunkedCommandPutOffset,
                   const_cast<const char*>(commands), chunkSize);
            mChunkedCommandPutOffset += chunkSize;
            mChunkedCommandRemainingSize -= chunkSize;

            commands += chunkSize;
            size -= chunkSize;

            if (mChunkedCommandRemainingSize == 0) {
                // Once the chunked command is complete, pass the data to the command handler
                // implemenation.
                auto chunkedCommandData = std::move(mChunkedCommandData);
                if (HandleCommandsImpl(chunkedCommandData.get(), mChunkedCommandPutOffset) ==
                    nullptr) {
                    // |HandleCommandsImpl| returns nullptr on error. Forward any errors
                    // out.
                    return nullptr;
                }
            }
        }

        return HandleCommandsImpl(commands, size);
    }

    ChunkedCommandHandler::ChunkedCommandsResult ChunkedCommandHandler::BeginChunkedCommandData(
        const volatile char* commands,
        size_t commandSize,
        size_t initialSize) {
        ASSERT(!mChunkedCommandData);

#if defined(ADDRESS_SANITIZER)
        if (commandSize >= 0x70000000) {
            // std::nothrow isn't implemented on ASAN and it has a 2GB allocation limit.
            // Catch large allocations and error out so fuzzers make progress.
            return ChunkedCommandsResult::Error;
        }
#endif
        // Reserve space for all the command data we're expecting, and copy the initial data
        // to the start of the memory.
        mChunkedCommandData.reset(new (std::nothrow) char[commandSize]);
        if (!mChunkedCommandData) {
            return ChunkedCommandsResult::Error;
        }

        memcpy(mChunkedCommandData.get(), const_cast<const char*>(commands), initialSize);
        mChunkedCommandPutOffset = initialSize;
        mChunkedCommandRemainingSize = commandSize - initialSize;

        return ChunkedCommandsResult::Consumed;
    }

}  // namespace dawn_wire
