Re: Re: Strange behavior with -static compilation flag

Jeffrey Walton <[email protected]> Wed, 26 Apr 2023 23:21:33 -0400
Newsgroups gmane.comp.encryption.cryptopp
Message-ID <CAH8yC8nzj4itGXwqvbXEVw9w396qJtfyYWb_1--aRny7h6Z3aQ@mail.gmail.com>
On Wed, Apr 26, 2023 at 11:16 PM Jeffrey Walton <[email protected]> wrote:
>
> On Wed, Apr 26, 2023 at 6:13 PM Dwight Kulkarni <[email protected]> wrote:
> >
> > I ran address sanitizer:  Heap use after free is the problem.  I had to use the NEW operator to allocate the ram.  What is weird is that usually it will error out right away after it goes out of scope, but this was delayed in recovering the memory, so it was working and then poof the memory disappears, but there is no access violation, it just returns bad result but only sometimes. Other times it is working and if there is a delay then the RAM gets reclaimed in that time and the error occurs right in the middle of the function. Really freaky.
> >
> > char* convert_cryptopp_integer_str(Integer n, size_t& msg_len){
> > const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
> > char* v = new char[len];
> > msg_len = len;
> > n.Encode((byte*)v, len, Integer::UNSIGNED);
> > return v;
> > }
> >
> > std::vector<byte>* convert_cryptopp_integer(Integer n){
> > const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
> > std::vector<byte>* v = new std::vector<byte>(len);
> > n.Encode((byte*)v, v->size(), Integer::UNSIGNED);
> > return v;
> > }
>
> So C-ish... Stop managing allocations with new and free. Let the std
> C++ library do the work for you:
>
> std::string convert_cryptopp_integer_str(const CryptoPP::Integer& n)
> {
>     using namespace CryptoPP;
>
>     const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
>     std::string v;
>     v.resize(len);
>
>     n.Encode((byte*)&v[0], v.size(), Integer::UNSIGNED);
>     return v;
>
> }
>
> std::vector<CryptoPP::byte> convert_cryptopp_integer(const CryptoPP::Integer& n)
> {
>     using namespace CryptoPP;
>
>     const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
>     std::vector<byte> v(len);
>
>     n.Encode((byte*)&v[len], v.size(), Integer::UNSIGNED);
>     return v;
> }

I probably should have said... This is the _portable_ way to get the
non-const pointer to the first element in the array:

    n.Encode((byte*)&v[0], v.size(), Integer::UNSIGNED);

It is portable because it works with C++98 and above. Other methods
exist, but they work with C++11 and above.

This was wrong. It should have used element 0, not element 'len':

    n.Encode((byte*)&v[len], v.size(), Integer::UNSIGNED);

Jeff

-- 
You received this message because you are subscribed to the Google Groups "Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion on the web visit https://groups.google.com/d/msgid/cryptopp-users/CAH8yC8nzj4itGXwqvbXEVw9w396qJtfyYWb_1--aRny7h6Z3aQ%40mail.gmail.com.