Skip to content

Commit ca5b42d

Browse files
committed
Fixed leak in internal_error backtraces.
1 parent 4d8f646 commit ca5b42d

File tree

3 files changed

+19
-57
lines changed

3 files changed

+19
-57
lines changed

src/data/hash_chunk.cc

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,22 @@
1-
// libTorrent - BitTorrent library
2-
// Copyright (C) 2005-2011, Jari Sundell
3-
//
4-
// This program is free software; you can redistribute it and/or modify
5-
// it under the terms of the GNU General Public License as published by
6-
// the Free Software Foundation; either version 2 of the License, or
7-
// (at your option) any later version.
8-
//
9-
// This program is distributed in the hope that it will be useful,
10-
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11-
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12-
// GNU General Public License for more details.
13-
//
14-
// You should have received a copy of the GNU General Public License
15-
// along with this program; if not, write to the Free Software
16-
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17-
//
18-
// In addition, as a special exception, the copyright holders give
19-
// permission to link the code of portions of this program with the
20-
// OpenSSL library under certain conditions as described in each
21-
// individual source file, and distribute linked combinations
22-
// including the two.
23-
//
24-
// You must obey the GNU General Public License in all respects for
25-
// all of the code used other than OpenSSL. If you modify file(s)
26-
// with this exception, you may extend this exception to your version
27-
// of the file(s), but you are not obligated to do so. If you do not
28-
// wish to do so, delete this exception statement from your version.
29-
// If you delete this exception statement from all source files in the
30-
// program, then also delete it here.
31-
//
32-
// Contact: Jari Sundell <jaris@ifi.uio.no>
33-
//
34-
// Skomakerveien 33
35-
// 3185 Skoppum, NORWAY
36-
371
#include "config.h"
382

393
#include "chunk.h"
404
#include "chunk_list_node.h"
415
#include "hash_chunk.h"
42-
#include "utils/sha1.h"
436

447
namespace torrent {
458

46-
HashChunk::~HashChunk() = default;
47-
48-
HashChunk::HashChunk(ChunkHandle h) {
49-
m_hash = std::make_unique<Sha1>();
50-
set_chunk(h);
51-
}
52-
539
void
5410
HashChunk::set_chunk(ChunkHandle h) {
5511
m_position = 0;
5612
m_chunk = h;
57-
m_hash->init();
13+
14+
m_hash.init();
5815
}
5916

6017
void
6118
HashChunk::hash_c(char* buffer) {
62-
m_hash->final_c(buffer);
19+
m_hash.final_c(buffer);
6320
}
6421

6522
bool
@@ -68,7 +25,7 @@ HashChunk::perform(uint32_t length, bool force) {
6825

6926
if (m_position + length > m_chunk.chunk()->chunk_size())
7027
throw internal_error("HashChunk::perform(...) received length out of range");
71-
28+
7229
uint32_t l = force ? length : m_chunk.chunk()->incore_length(m_position);
7330

7431
bool complete = l == length;
@@ -109,7 +66,7 @@ uint32_t
10966
HashChunk::perform_part(Chunk::iterator itr, uint32_t length) {
11067
length = std::min(length, remaining_part(itr, m_position));
11168

112-
m_hash->update(itr->chunk().begin() + m_position - itr->position(), length);
69+
m_hash.update(itr->chunk().begin() + m_position - itr->position(), length);
11370
m_position += length;
11471

11572
return length;

src/data/hash_chunk.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
#include <memory>
55

6-
#include "torrent/exceptions.h"
7-
86
#include "chunk.h"
97
#include "chunk_handle.h"
8+
#include "torrent/exceptions.h"
9+
#include "utils/sha1.h"
1010

1111
namespace torrent {
1212

@@ -15,26 +15,25 @@ namespace torrent {
1515
// stuff related to performance and responsiveness.
1616

1717
class ChunkListNode;
18-
class Sha1;
1918

2019
class HashChunk {
2120
public:
22-
~HashChunk();
2321
HashChunk(ChunkHandle h);
24-
25-
void set_chunk(ChunkHandle h);
22+
~HashChunk() = default;
2623

2724
ChunkHandle* chunk() { return &m_chunk; }
2825
ChunkHandle& handle() { return m_chunk; }
26+
uint32_t remaining();
27+
28+
void set_chunk(ChunkHandle h);
29+
2930
void hash_c(char* buffer);
3031

3132
// If force is true, then the return value is always true.
3233
bool perform(uint32_t length, bool force = true);
3334

3435
void advise_willneed(uint32_t length);
3536

36-
uint32_t remaining();
37-
3837
private:
3938
HashChunk(const HashChunk&) = delete;
4039
HashChunk& operator=(const HashChunk&) = delete;
@@ -45,9 +44,14 @@ class HashChunk {
4544
uint32_t m_position;
4645

4746
ChunkHandle m_chunk;
48-
std::unique_ptr<Sha1> m_hash;
47+
Sha1 m_hash;
4948
};
5049

50+
inline
51+
HashChunk::HashChunk(ChunkHandle h) {
52+
set_chunk(h);
53+
}
54+
5155
inline uint32_t
5256
HashChunk::remaining_part(Chunk::iterator itr, uint32_t pos) {
5357
return itr->size() - (pos - itr->position());

src/torrent/exceptions.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ internal_error::initialize(const std::string& msg) {
5757
}
5858

5959
m_backtrace = output.str();
60+
::free(stack_symbol_names);
6061

6162
#else
6263
m_backtrace = "stack dump not enabled";

0 commit comments

Comments
 (0)