Corrected two potentially fatal errors: (1) Code doing the PDK_PATH

and HOME substitution in filenames needs to watch for a NULL
cd_file, and (2) The routine that removes the (UNNAMED) cell when
another cell is loaded needs to NULL the boxRootDef pointer or else
it ends up pointing to deallocated memory.
This commit is contained in:
Tim Edwards 2021-04-24 22:13:30 -04:00
parent 56c0620417
commit 0dcc9c6ca7
5 changed files with 31 additions and 4 deletions

View File

@ -1 +1 @@
8.3.157
8.3.158

View File

@ -273,6 +273,7 @@ DBCellDelete(cellname, force)
}
celldef->cd_parents = (CellUse *)NULL;
DBWResetBox(celldef);
result = DBCellDeleteDef(celldef);
if (result == FALSE)
@ -282,8 +283,6 @@ DBCellDelete(cellname, force)
return result;
}
/*
* ----------------------------------------------------------------------------
*

View File

@ -3494,7 +3494,9 @@ DBPathSubstitute(pathstart, cstring, cellDef)
char *homedir = getenv("HOME");
if (!strncmp(cellDef->cd_file, homedir, strlen(homedir))
if (cellDef->cd_file == NULL)
sprintf(cstring, "%s", pathstart);
else if (!strncmp(cellDef->cd_file, homedir, strlen(homedir))
&& (*(cellDef->cd_file + strlen(homedir)) == '/'))
sprintf(cstring, "~%s", cellDef->cd_file + strlen(homedir));
else

View File

@ -790,6 +790,31 @@ DBWSetBox(rootDef, rect)
dbwRecordBoxArea(FALSE);
}
/*
* ----------------------------------------------------------------------------
* DBWResetBox() ---
*
* Make sure that boxRootDef is set to NULL if it is equal to the
* specified CellDef. This is used by the cell delete function to
* make sure that if an edit cell is deleted, the boxRootDef is not
* pointing to an invalid area of memory.
*
* Results:
* None.
*
* Side effects:
* Global variable boxRootDef may be set to NULL.
*
* ----------------------------------------------------------------------------
*/
void
DBWResetBox(CellDef *def)
{
if (def == boxRootDef)
boxRootDef = NULL;
}
/*
* ----------------------------------------------------------------------------
* ToolMoveBox --

View File

@ -189,6 +189,7 @@ extern void ToolMoveBox(), ToolMoveCorner();
extern int ToolGetCorner();
extern void DBWloadWindow(), DBWxloadWindow();
extern void DBWSetBox();
extern void DBWResetBox();
extern void DBWUndoOldEdit();
extern void DBWUndoNewEdit();