Project

General

Profile

Actions

Bug #2552

closed

Block::fromBuffer(ConstBufferPtr, size_t, Block&) unexpected decode error

Added by Junxiao Shi about 9 years ago. Updated about 9 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Category:
Base
Target version:
Start date:
02/21/2015
Due date:
% Done:

0%

Estimated time:

Description

Snippet to reproduce:

// g++ -std=c++0x x.cpp `pkg-config --cflags --libs libndn-cxx`

#include <ndn-cxx/encoding/block.hpp>

using ndn::Buffer;
using ndn::BufferPtr;
using ndn::Block;

int
main()
{
  BufferPtr buffer = std::make_shared<Buffer>(4);
  uint8_t* buf = buffer->get();
  buf[0] = 0x01;
  buf[1] = 0x02;
  buf[2] = 0xcc;
  buf[3] = 0xdd;

  Block block1;
  Block block2;

  std::cout << Block::fromBuffer(buffer, 4, block1)
            << Block::fromBuffer(buf,    4, block2)
            << std::endl;
  return 0;
}

Expected: 11

Actual: 01


Related issues 1 (0 open1 closed)

Blocks NFD - Feature #2261: Don't use exceptions in PartialMessageStore::receiveNdnlpDataClosedJunxiao Shi

Actions
Actions #1

Updated by Junxiao Shi about 9 years ago

  • Blocks Feature #2261: Don't use exceptions in PartialMessageStore::receiveNdnlpData added
Actions #2

Updated by Alex Afanasyev about 9 years ago

You misunderstood what fromBuffer(const ConstBufferPtr&, size_t, Block&); method is doing. The two fromBuffer overloads are not equivalent to each other and have different use cases:

  • fromBuffer(const uint8_t* buffer, size_t maxSize, Block& block); should be used when raw buffer is available and you want to create a Block from it (internally, it will create shared_ptr and copy the supplied data.

  • fromBuffer(const ConstBufferPtr& wire, size_t offset, Block& block) should be used when you already have shared_ptr<Buffer> (aka ConstBufferPtr). The second parameter is not size (size is part of Buffer object), rather it is offset from the beginning. The use case for this method is that you have shared_ptr<Buffer>, which holds multiple Blocks (either sequence or sub-TLVs). This method does not copy data, only copies shared_ptr pointer.

Actions #3

Updated by Junxiao Shi about 9 years ago

  • Status changed from New to Rejected

I didn't notice the different in second parameter.

The following snippet works well:

// g++ -std=c++0x x.cpp `pkg-config --cflags --libs libndn-cxx`
#include <ndn-cxx/encoding/block.hpp>

using ndn::Buffer;
using ndn::BufferPtr;
using ndn::Block;

int
main()
{
  BufferPtr buffer = std::make_shared<Buffer>(4);
  uint8_t* buf = buffer->get();
  buf[0] = 0x01;
  buf[1] = 0x02;
  buf[2] = 0xcc;
  buf[3] = 0xdd;

  Block block1;
  Block block2;

  std::cout << Block::fromBuffer(buffer, 0, block1)
            << Block::fromBuffer(buf,    4, block2)
            << std::endl;

  std::cout << block1.type() << "\t" << block1.size() << "\t" << block1.value_size() << std::endl;
  std::cout << block2.type() << "\t" << block2.size() << "\t" << block2.value_size() << std::endl;
  return 0;
}
Actions

Also available in: Atom PDF