Skip to content

Commit 952bf8d

Browse files
authored
Merge pull request nodegit#1332 from kurtb/master
Fix git_tree_entry double free
2 parents 20d40d6 + 67fc71d commit 952bf8d

2 files changed

Lines changed: 40 additions & 3 deletions

File tree

generate/input/descriptor.json

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2658,19 +2658,22 @@
26582658
"functions": {
26592659
"git_tree_entry_byid": {
26602660
"return": {
2661-
"ownedByThis": true
2661+
"ownedByThis": true,
2662+
"selfFreeing": false
26622663
}
26632664
},
26642665
"git_tree_entry_byindex": {
26652666
"jsFunctionName": "_entryByIndex",
26662667
"return": {
2667-
"ownedByThis": true
2668+
"ownedByThis": true,
2669+
"selfFreeing": false
26682670
}
26692671
},
26702672
"git_tree_entry_byname": {
26712673
"jsFunctionName": "_entryByName",
26722674
"return": {
2673-
"ownedByThis": true
2675+
"ownedByThis": true,
2676+
"selfFreeing": false
26742677
}
26752678
},
26762679
"git_tree_entrycount": {
@@ -2691,6 +2694,21 @@
26912694
"git_treebuilder_filter": {
26922695
"ignore": true
26932696
},
2697+
"git_treebuilder_get": {
2698+
"return": {
2699+
"selfFreeing": false,
2700+
"ownedByThis": true
2701+
}
2702+
},
2703+
"git_treebuilder_insert": {
2704+
"isAsync": false,
2705+
"args": {
2706+
"out": {
2707+
"selfFreeing": false,
2708+
"ownedByThis": true
2709+
}
2710+
}
2711+
},
26942712
"git_treebuilder_write": {
26952713
"args": {
26962714
"id": {

test/tests/treebuilder.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ var promisify = require("promisify-node");
55
var readDir = promisify(fs.readdir);
66
var local = path.join.bind(path, __dirname);
77

8+
var leakTest = require("../utils/leak_test");
9+
810
describe("TreeBuilder", function(){
911

1012
var Git = require("../../");
1113
var reposPath = local("../repos/workdir");
14+
var oid = "111dd657329797f6165f52f5085f61ac976dcf04";
15+
1216
//setup test repo each test
1317
beforeEach(function() {
1418
var test = this;
@@ -76,4 +80,19 @@ describe("TreeBuilder", function(){
7680
return Git.Tree.lookup(test.repo, newTreeEntry.oid());
7781
});
7882
});
83+
84+
it("does not leak inserts", function() {
85+
var test = this;
86+
87+
// The underlying C++ git_tree_entry is owned by the treebuilder that
88+
// creates it. But since git_tree_entry is duplicable the generator will
89+
// duplicate it and mark it as self freeing.
90+
// Validate this with the leakTest.
91+
return leakTest(Git.TreeEntry, function() {
92+
return Git.Treebuilder.create(test.repo, null)
93+
.then(function(builder) {
94+
return builder.insert("test", oid, Git.TreeEntry.FILEMODE.BLOB);
95+
});
96+
});
97+
});
7998
});

0 commit comments

Comments
 (0)