// Copyright 2021 The Pigweed 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
//
//     https://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 "pw_transfer/internal/chunk_data_buffer.h"

#include <cstring>

#include "pw_assert/assert.h"

namespace pw::transfer::internal {

void ChunkDataBuffer::Write(ConstByteSpan data, bool last_chunk) {
  PW_DASSERT(data.size() <= buffer_.size());

  std::memcpy(buffer_.data(), data.data(), data.size());
  size_ = data.size();

  last_chunk_ = last_chunk;
}

}  // namespace pw::transfer::internal

// Copyright 2021 The Pigweed 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
//
//     https://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 "pw_transfer/internal/chunk_data_buffer.h"

#include <algorithm>
#include <cstring>

#include "pw_assert/assert.h"

namespace pw::transfer::internal {

void ChunkDataBuffer::Write(ConstByteSpan data, bool last_chunk) {
  PW_DASSERT(data.size() <= buffer_.size());

  std::copy(data.begin(), data.end(), buffer_.begin());
  size_ = data.size();

  last_chunk_ = last_chunk;
}

}  // namespace pw::transfer::internal

Fix undefined behavior in memcpy
pw_transfer: Fix undefined behavior in memcpy

Passing nullptr to memcpy is undefined behavior, even when copying 0
bytes. Switch to std::copy to avoid this.

Fixes: 543
Change-Id: I31139435e8d3860003874ad6c21211d476af6577
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/69060
Pigweed-Auto-Submit: Wyatt Hepler <cca3bedb37979eacd157a9bceb473582df8aea1e@google.com>
Reviewed-by: Ted Pudlik <c7372cc3e451acc046049fca9e050bcb2a4a3d11@google.com>
Commit-Queue: Auto-Submit <14637eda5603879df170705285bf30f5996692f0@pigweed.google.com.iam.gserviceaccount.com>
