Staging
v0.5.1
https://github.com/python/cpython
Revision c44d823daac35b8f1f9a62ae54ae15dc81e03d3c authored by Guido van Rossum on 28 March 2002, 20:41:02 UTC, committed by Guido van Rossum on 28 March 2002, 20:41:02 UTC
(The fix looks different, but does the same thing to the 2.1 GC code
that Neil's patch does to the 2.2 GC code.)

This is Neil's fix for SF bug 535905 (Evil Trashcan and GC interaction).

The fix makes it possible to call PyObject_GC_UnTrack() more than once
on the same object, and then move the PyObject_GC_UnTrack() call to
*before* the trashcan code is invoked.

BUGFIX CANDIDATE!
1 parent ded18d6
Raw File
Tip revision: c44d823daac35b8f1f9a62ae54ae15dc81e03d3c authored by Guido van Rossum on 28 March 2002, 20:41:02 UTC
Sort-of backport to 2.1.3 (if we ever release it) of the following.
Tip revision: c44d823
import_nt.c
/********************************************************************

 import_nt.c 

  Win32 specific import code.

*/

#include "Python.h"
#include "osdefs.h"
#include <assert.h>
#include <windows.h>
#include "importdl.h"
#include "malloc.h" /* for alloca */

/* a string loaded from the DLL at startup */
extern const char *PyWin_DLLVersionString;

FILE *PyWin_FindRegisteredModule(const char *moduleName,
				 struct filedescr **ppFileDesc,
				 char *pathBuf,
				 int pathLen)
{
	char *moduleKey;
	const char keyPrefix[] = "Software\\Python\\PythonCore\\";
	const char keySuffix[] = "\\Modules\\";
#ifdef _DEBUG
	/* In debugging builds, we _must_ have the debug version
	 * registered.
	 */
	const char debugString[] = "\\Debug";
#else
	const char debugString[] = "";
#endif
	struct filedescr *fdp = NULL;
	FILE *fp;
	HKEY keyBase = HKEY_CURRENT_USER;
	int modNameSize;
	long regStat;

	/* Calculate the size for the sprintf buffer.
	 * Get the size of the chars only, plus 1 NULL.
	 */
	size_t bufSize = sizeof(keyPrefix)-1 +
	                 strlen(PyWin_DLLVersionString) +
	                 sizeof(keySuffix) +
	                 strlen(moduleName) +
	                 sizeof(debugString) - 1;
	/* alloca == no free required, but memory only local to fn,
	 * also no heap fragmentation!
	 */
	moduleKey = alloca(bufSize); 
	sprintf(moduleKey,
		"Software\\Python\\PythonCore\\%s\\Modules\\%s%s",
	        PyWin_DLLVersionString, moduleName, debugString);

	modNameSize = pathLen;
	regStat = RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize);
	if (regStat != ERROR_SUCCESS) {
		/* No user setting - lookup in machine settings */
		keyBase = HKEY_LOCAL_MACHINE;
		/* be anal - failure may have reset size param */
		modNameSize = pathLen;
		regStat = RegQueryValue(keyBase, moduleKey, 
		                        pathBuf, &modNameSize);

		if (regStat != ERROR_SUCCESS)
			return NULL;
	}
	/* use the file extension to locate the type entry. */
	for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
		size_t extLen = strlen(fdp->suffix);
		assert(modNameSize >= 0); /* else cast to size_t is wrong */
		if ((size_t)modNameSize > extLen &&
		    strnicmp(pathBuf + ((size_t)modNameSize-extLen-1),
		             fdp->suffix,
		             extLen) == 0)
			break;
	}
	if (fdp->suffix == NULL)
		return NULL;
	fp = fopen(pathBuf, fdp->mode);
	if (fp != NULL)
		*ppFileDesc = fdp;
	return fp;
}
back to top