Comments
Patch
@@ -816,6 +816,11 @@ bail:
return NULL;
}
+/**
+ * Obtain the base revision index entry.
+ *
+ * Callers must ensure that rev >= 0 or illegal memory access may occur.
+ */
static inline int index_baserev(indexObject *self, int rev)
{
const char *data;
@@ -841,7 +846,7 @@ static PyObject *index_deltachain(indexO
PyObject *stoparg;
int stoprev, iterrev, baserev = -1;
int stopped;
- PyObject *chain = NULL, *value = NULL, *result = NULL;
+ PyObject *chain = NULL, *result = NULL;
const Py_ssize_t length = index_length(self);
if (!PyArg_ParseTuple(args, "iOi", &rev, &stoparg, &generaldelta)) {
@@ -876,15 +881,16 @@ static PyObject *index_deltachain(indexO
baserev = index_baserev(self, rev);
/* This should never happen. */
- if (baserev == -2) {
- PyErr_SetString(PyExc_IndexError, "unable to resolve data");
+ if (baserev <= -2) {
+ /* Error should be set by index_deref() */
+ assert(PyErr_Occurred());
goto bail;
}
iterrev = rev;
while (iterrev != baserev && iterrev != stoprev) {
- value = PyInt_FromLong(iterrev);
+ PyObject *value = PyInt_FromLong(iterrev);
if (value == NULL) {
goto bail;
}
@@ -913,8 +919,9 @@ static PyObject *index_deltachain(indexO
baserev = index_baserev(self, iterrev);
/* This should never happen. */
- if (baserev == -2) {
- PyErr_SetString(PyExc_IndexError, "unable to resolve data");
+ if (baserev <= -2) {
+ /* Error should be set by index_deref() */
+ assert(PyErr_Occurred());
goto bail;
}
}
@@ -923,7 +930,7 @@ static PyObject *index_deltachain(indexO
stopped = 1;
}
else {
- value = PyInt_FromLong(iterrev);
+ PyObject *value = PyInt_FromLong(iterrev);
if (value == NULL) {
goto bail;
}