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 */