8000 Clean up memory leaks in OdbBackend · libgit2/pygit2@4169c01 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4169c01

Browse files
committed
Clean up memory leaks in OdbBackend
1 parent 1c72da9 commit 4169c01

File tree

1 file changed

+70
-52
lines changed

1 file changed

+70
-52
lines changed

src/odb_backend.c

Lines changed: 70 additions & 52 deletions
10000
Original file line numberDiff line numberDiff line change
@@ -70,27 +70,33 @@ pygit2_odb_backend_read(void **ptr, size_t *sz,
7070
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
7171

7272
py_oid = git_oid_to_python(oid);
73-
args = Py_BuildValue("(O)", py_oid);
73+
args = Py_BuildValue("(N)", py_oid);
7474
result = PyObject_CallObject(be->read, args);
7575
Py_DECREF(py_oid);
76+
Py_DECREF(args);
7677

7778
if ((err = git_error_for_exc()) != 0) {
78-
return err;
79+
goto out;
7980
}
8081

8182
if (result == NULL)
82-
return GIT_EUSER;
83+
goto euser;
8384

8485
const char *bytes;
8586
if (!PyArg_ParseTuple(result, "ny#", type, &bytes, sz) || !bytes)
86-
return GIT_EUSER;
87+
goto euser;
8788

8889
*ptr = git_odb_backend_data_alloc(_be, *sz);
8990
if (!*ptr)
90-
return GIT_EUSER;
91-
91+
goto euser;
9292
memcpy(*ptr, bytes, *sz);
93-
return 0;
93+
94+
out:
95+
Py_DECREF(result);
96+
return err;
97+
euser:
98+
err = GIT_EUSER;
99+
goto out;
94100
}
95101

96102
static int
@@ -103,29 +109,35 @@ pygit2_odb_backend_read_prefix(git_oid *oid_out, void **ptr, size_t *sz,
103109
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
104110

105111
py_oid = git_oid_to_python(short_oid);
106-
args = Py_BuildValue("(O)", py_oid);
112+
args = Py_BuildValue("(N)", py_oid);
107113
result = PyObject_CallObject(be->read_prefix, args);
108114
Py_DECREF(py_oid);
115+
Py_DECREF(args);
109116

110-
if ((err = git_error_for_exc()) != 0) {
111-
return err;
112-
}
117+
if ((err = git_error_for_exc()) != 0)
118+
goto out;
113119

114120
if (result == NULL)
115-
return GIT_EUSER;
121+
goto euser;
116122

117123
const char *bytes;
118124
if (!PyArg_ParseTuple(result, "Ony#",
119125
&py_oid_out, type, &bytes, sz) || !bytes)
120-
return GIT_EUSER;
126+
goto euser;
121127

122128
*ptr = git_odb_backend_data_alloc(_be, *sz);
123129
if (!*ptr)
124-
return GIT_EUSER;
130+
goto euser;
125131

126132
memcpy(*ptr, bytes, *sz);
127133
py_oid_to_git_oid(py_oid_out, oid_out);
128-
return 0;
134+
135+
out:
136+
Py_DECREF(result);
137+
return err;
138+
euser:
139+
err = GIT_EUSER;
140+
goto out;
129141
}
130142

131143
static int
@@ -137,21 +149,26 @@ pygit2_odb_backend_read_header(size_t *len, git_object_t *type,
137149
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
138150

139151
py_oid = git_oid_to_python(oid);
140-
args = Py_BuildValue("(O)", py_oid);
152+
args = Py_BuildValue("(N)", py_oid);
141153
result = PyObject_CallObject(be->read_header, args);
142154
Py_DECREF(py_oid);
155+
Py_DECREF(args);
143156

144-
if ((err = git_error_for_exc()) != 0) {
145-
return err;
146-
}
157+
if ((err = git_error_for_exc()) != 0)
158+
goto out;
147159

148160
if (result == NULL)
149-
return GIT_EUSER;
161+
goto euser;
150162

151163
if (!PyArg_ParseTuple(result, "nn", type, len))
152-
return GIT_EUSER;
153-
154-
return 0;
164+
goto euser;
165+
166+
out:
167+
Py_DECREF(result);
168+
return err;
169+
euser:
170+
err = GIT_EUSER;
171+
goto out;
155172
}
156173

157174
static int
@@ -163,18 +180,20 @@ pygit2_odb_backend_write(git_odb_backend *_be, const git_oid *oid,
163180
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
164181

165182
py_oid = git_oid_to_python(oid);
166-
args = Py_BuildValue("(Oy#n)", py_oid, data, sz, typ);
183+
args = Py_BuildValue("(Ny#n)", py_oid, data, sz, typ);
167184
result = PyObject_CallObject(be->write, args);
168185
Py_DECREF(py_oid);
186+
Py_DECREF(args);
169187

170-
if ((err = git_error_for_exc()) != 0) {
171-
return err;
172-
}
188+
if ((err = git_error_for_exc()) != 0)
189+
goto out;
173190

174191
if (result == NULL)
175-
return GIT_EUSER;
192+
err = GIT_EUSER;
176193

177-
return 0;
194+
out:
195+
Py_DECREF(result);
196+
return err;
178197
}
179198

180199
static int
@@ -185,18 +204,21 @@ pygit2_odb_backend_exists(git_odb_backend *_be, const git_oid *oid)
185204
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
186205

187206
py_oid = git_oid_to_python(oid);
188-
args = Py_BuildValue("(O)", py_oid);
207+
args = Py_BuildValue("(N)", py_oid);
189208
result = PyObject_CallObject(be->exists, args);
190209
Py_DECREF(py_oid);
191210

192211
if ((err = git_error_for_exc()) != 0) {
212+
Py_DECREF(result);
193213
return err;
194214
}
195215

196216
if (!result)
197217
return GIT_EUSER;
198218

199-
return PyObject_IsTrue(result);
219+
int r = PyObject_IsTrue(result);
220+
Py_DECREF(result);
221+
return r;
200222
}
201223

202224
static int
@@ -208,47 +230,47 @@ pygit2_odb_backend_exists_prefix(git_oid *out, git_odb_backend *_be,
208230
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
209231

210232
py_oid = git_oid_to_python(partial);
211-
args = Py_BuildValue("(O)", py_oid);
233+
args = Py_BuildValue("(N)", py_oid);
212234
result = PyObject_CallObject(be->exists_prefix, args);
213235
Py_DECREF(py_oid);
236+
Py_DECREF(args);
214237

215-
if ((err = git_error_for_exc()) != 0) {
216-
return err;
217-
}
238+
if ((err = git_error_for_exc()) != 0)
239+
goto out;
218240

219241
if (result == NULL)
220-
return GIT_EUSER;
242+
goto euser;
221243

222244
if (!PyArg_ParseTuple(result, "O", &py_oid_out))
223-
return GIT_EUSER;
245+
goto euser;
224246

225-
if (py_oid_out == Py_None)
226-
return GIT_ENOTFOUND;
247+
if (py_oid_out == Py_None) {
248+
err = GIT_ENOTFOUND;
249+
goto out;
250+
}
227251

228252
py_oid_to_git_oid(py_oid_out, out);
229253
Py_DECREF(py_oid_out);
254+
out:
255+
Py_DECREF(result);
230256
return 0;
257+
euser:
258+
Py_DECREF(result);
259+
return GIT_EUSER;
231260
}
232261

233262
static int
234263
pygit2_odb_backend_refresh(git_odb_backend *_be)
235264
{
236-
int err;
237265
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
238-
239266
PyObject_CallObject(be->exists_prefix, NULL);
240-
if ((err = git_error_for_exc()) != 0) {
241-
return err;
242-
}
243-
244-
return 0;
267+
return git_error_for_exc();
245268
}
246269

247270
static int
248271
pygit2_odb_backend_foreach(git_odb_backend *_be,
249272
git_odb_foreach_cb cb, void *payload)
250273
{
251-
int err;
252274
PyObject *item;
253275
git_oid oid;
254276
struct pygit2_odb_backend *be = (struct pygit2_odb_backend *)_be;
@@ -261,11 +283,7 @@ pygit2_odb_backend_foreach(git_odb_backend *_be,
261283
Py_DECREF(item);
262284
}
263285

264-
if ((err = git_error_for_exc()) != 0) {
265-
return err;
266-
}
267-
268-
return 0;
286+
return git_error_for_exc();
269287
}
270288

271289
static void

0 commit comments

Comments
 (0)
0