Fix for #1236090: FSSpec.as_pathname() crashes.
Turns out patch #1035255 was incomplete, it only patched _Filemodule.c and not filesupport.py. So regenerating caused as_pathname() to go into an infinite loop.
This commit is contained in:
parent
b9ab7a584d
commit
d7b76e9f69
|
@ -92,6 +92,50 @@ PyMac_BuildHFSUniStr255(HFSUniStr255 *itself)
|
||||||
return Py_BuildValue("u#", itself->unicode, itself->length);
|
return Py_BuildValue("u#", itself->unicode, itself->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static OSErr
|
||||||
|
_PyMac_GetFullPathname(FSSpec *fss, char *path, int len)
|
||||||
|
{
|
||||||
|
FSRef fsr;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
*path = '\0';
|
||||||
|
err = FSpMakeFSRef(fss, &fsr);
|
||||||
|
if (err == fnfErr) {
|
||||||
|
/* FSSpecs can point to non-existing files, fsrefs can't. */
|
||||||
|
FSSpec fss2;
|
||||||
|
int tocopy;
|
||||||
|
|
||||||
|
err = FSMakeFSSpec(fss->vRefNum, fss->parID, "", &fss2);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = FSpMakeFSRef(&fss2, &fsr);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = (OSErr)FSRefMakePath(&fsr, path, len-1);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
/* This part is not 100% safe: we append the filename part, but
|
||||||
|
** I'm not sure that we don't run afoul of the various 8bit
|
||||||
|
** encodings here. Will have to look this up at some point...
|
||||||
|
*/
|
||||||
|
strcat(path, "/");
|
||||||
|
tocopy = fss->name[0];
|
||||||
|
if ((strlen(path) + tocopy) >= len)
|
||||||
|
tocopy = len - strlen(path) - 1;
|
||||||
|
if (tocopy > 0)
|
||||||
|
strncat(path, fss->name+1, tocopy);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = (OSErr)FSRefMakePath(&fsr, path, len);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static PyObject *File_Error;
|
static PyObject *File_Error;
|
||||||
|
|
||||||
/* ------------------- Object type FSCatalogInfo -------------------- */
|
/* ------------------- Object type FSCatalogInfo -------------------- */
|
||||||
|
@ -1265,7 +1309,7 @@ static PyObject *FSSpec_as_pathname(FSSpecObject *_self, PyObject *_args)
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(_args, ""))
|
if (!PyArg_ParseTuple(_args, ""))
|
||||||
return NULL;
|
return NULL;
|
||||||
err = PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
|
err = _PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
|
||||||
if ( err ) {
|
if ( err ) {
|
||||||
PyMac_Error(err);
|
PyMac_Error(err);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -198,6 +198,53 @@ PyMac_BuildHFSUniStr255(HFSUniStr255 *itself)
|
||||||
|
|
||||||
return Py_BuildValue("u#", itself->unicode, itself->length);
|
return Py_BuildValue("u#", itself->unicode, itself->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Get pathname for a given FSSpec
|
||||||
|
*/
|
||||||
|
static OSErr
|
||||||
|
_PyMac_GetFullPathname(FSSpec *fss, char *path, int len)
|
||||||
|
{
|
||||||
|
FSRef fsr;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
*path = '\0';
|
||||||
|
err = FSpMakeFSRef(fss, &fsr);
|
||||||
|
if (err == fnfErr) {
|
||||||
|
/* FSSpecs can point to non-existing files, fsrefs can't. */
|
||||||
|
FSSpec fss2;
|
||||||
|
int tocopy;
|
||||||
|
|
||||||
|
err = FSMakeFSSpec(fss->vRefNum, fss->parID, "", &fss2);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = FSpMakeFSRef(&fss2, &fsr);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = (OSErr)FSRefMakePath(&fsr, path, len-1);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
/* This part is not 100% safe: we append the filename part, but
|
||||||
|
** I'm not sure that we don't run afoul of the various 8bit
|
||||||
|
** encodings here. Will have to look this up at some point...
|
||||||
|
*/
|
||||||
|
strcat(path, "/");
|
||||||
|
tocopy = fss->name[0];
|
||||||
|
if ((strlen(path) + tocopy) >= len)
|
||||||
|
tocopy = len - strlen(path) - 1;
|
||||||
|
if (tocopy > 0)
|
||||||
|
strncat(path, fss->name+1, tocopy);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
err = (OSErr)FSRefMakePath(&fsr, path, len);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
finalstuff = finalstuff + """
|
finalstuff = finalstuff + """
|
||||||
|
@ -798,7 +845,7 @@ OSErr err;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(_args, ""))
|
if (!PyArg_ParseTuple(_args, ""))
|
||||||
return NULL;
|
return NULL;
|
||||||
err = PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
|
err = _PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
|
||||||
if ( err ) {
|
if ( err ) {
|
||||||
PyMac_Error(err);
|
PyMac_Error(err);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue