Index: PC/_winreg.c =================================================================== --- PC/_winreg.c (revision 84990) +++ PC/_winreg.c (working copy) @@ -1193,6 +1193,7 @@ DWORD typ; PyObject *obData; PyObject *retVal; + const DWORD maxValueSize = 32767; if (!PyArg_ParseTuple(args, "Oi:EnumValue", &obKey, &index)) return NULL; @@ -1233,16 +1234,36 @@ if (rc != ERROR_MORE_DATA) break; - bufDataSize *= 2; - tmpBuf = (char *)PyMem_Realloc(retDataBuf, bufDataSize); - if (tmpBuf == NULL) { - PyErr_NoMemory(); - retVal = NULL; - goto fail; + if (bufDataSize < retDataSize) { + bufDataSize = retDataSize; + tmpBuf = (char *)PyMem_Realloc(retDataBuf, bufDataSize); + if (tmpBuf == NULL) { + PyErr_NoMemory(); + retVal = NULL; + goto fail; + } + retDataBuf = tmpBuf; + retDataSize = bufDataSize; + } else { + if (bufValueSize >= maxValueSize) { + PyErr_SetString(PyExc_RuntimeError, + "RegEnumValue required value size greater than %d", + maxValueSize); + retVal = NULL; + goto fail; + } + bufValueSize *= 2; + if (bufValueSize > maxValueSize) + bufValueSize = maxValueSize; + tmpBuf = (char *)PyMem_Realloc(retValueBuf, bufValueSize); + if (tmpBuf == NULL) { + PyErr_NoMemory(); + retVal = NULL; + goto fail; + } + retValueBuf = tmpBuf; + retValueSize = bufValueSize; } - retDataBuf = tmpBuf; - retDataSize = bufDataSize; - retValueSize = bufValueSize; } if (rc != ERROR_SUCCESS) {