Mercurial > hg
comparison mercurial/bdiff.c @ 19962:66b21ce60a19 stable
bdiff: avoid a memory error on malloc failure
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 30 Oct 2013 16:03:42 -0500 |
parents | d6fb7bbec16a |
children | e868d8ee7c8f |
comparison
equal
deleted
inserted
replaced
19961:1d7a36ff2615 | 19962:66b21ce60a19 |
---|---|
301 PyObject *sa, *sb, *rl = NULL, *m; | 301 PyObject *sa, *sb, *rl = NULL, *m; |
302 struct line *a, *b; | 302 struct line *a, *b; |
303 struct hunk l, *h; | 303 struct hunk l, *h; |
304 int an, bn, count, pos = 0; | 304 int an, bn, count, pos = 0; |
305 | 305 |
306 l.next = NULL; | |
307 | |
306 if (!PyArg_ParseTuple(args, "SS:bdiff", &sa, &sb)) | 308 if (!PyArg_ParseTuple(args, "SS:bdiff", &sa, &sb)) |
307 return NULL; | 309 return NULL; |
308 | 310 |
309 an = splitlines(PyBytes_AsString(sa), PyBytes_Size(sa), &a); | 311 an = splitlines(PyBytes_AsString(sa), PyBytes_Size(sa), &a); |
310 bn = splitlines(PyBytes_AsString(sb), PyBytes_Size(sb), &b); | 312 bn = splitlines(PyBytes_AsString(sb), PyBytes_Size(sb), &b); |
311 | 313 |
312 if (!a || !b) | 314 if (!a || !b) |
313 goto nomem; | 315 goto nomem; |
314 | 316 |
315 l.next = NULL; | |
316 count = diff(a, an, b, bn, &l); | 317 count = diff(a, an, b, bn, &l); |
317 if (count < 0) | 318 if (count < 0) |
318 goto nomem; | 319 goto nomem; |
319 | 320 |
320 rl = PyList_New(count); | 321 rl = PyList_New(count); |
342 struct hunk l, *h; | 343 struct hunk l, *h; |
343 int an, bn, count; | 344 int an, bn, count; |
344 Py_ssize_t len = 0, la, lb; | 345 Py_ssize_t len = 0, la, lb; |
345 PyThreadState *_save; | 346 PyThreadState *_save; |
346 | 347 |
348 l.next = NULL; | |
349 | |
347 if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb)) | 350 if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb)) |
348 return NULL; | 351 return NULL; |
349 | 352 |
350 if (la > UINT_MAX || lb > UINT_MAX) { | 353 if (la > UINT_MAX || lb > UINT_MAX) { |
351 PyErr_SetString(PyExc_ValueError, "bdiff inputs too large"); | 354 PyErr_SetString(PyExc_ValueError, "bdiff inputs too large"); |
356 an = splitlines(sa, la, &al); | 359 an = splitlines(sa, la, &al); |
357 bn = splitlines(sb, lb, &bl); | 360 bn = splitlines(sb, lb, &bl); |
358 if (!al || !bl) | 361 if (!al || !bl) |
359 goto nomem; | 362 goto nomem; |
360 | 363 |
361 l.next = NULL; | |
362 count = diff(al, an, bl, bn, &l); | 364 count = diff(al, an, bl, bn, &l); |
363 if (count < 0) | 365 if (count < 0) |
364 goto nomem; | 366 goto nomem; |
365 | 367 |
366 /* calculate length of output */ | 368 /* calculate length of output */ |