mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
GP-3107 corrected issues related to resolving datatype from program to
an archive or composite editor.
This commit is contained in:
@@ -1042,6 +1042,9 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
|||||||
return resolvedDataType;
|
return resolvedDataType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: delayed pointer-resolve use of "undefined *" could cause unintended
|
||||||
|
// equivalence match. May need to use an internal reserved type instead.
|
||||||
|
|
||||||
SourceArchive sourceArchive = dataType.getSourceArchive();
|
SourceArchive sourceArchive = dataType.getSourceArchive();
|
||||||
if (sourceArchive != null && sourceArchive.getArchiveType() == ArchiveType.BUILT_IN) {
|
if (sourceArchive != null && sourceArchive.getArchiveType() == ArchiveType.BUILT_IN) {
|
||||||
resolvedDataType = resolveBuiltIn(dataType, currentHandler);
|
resolvedDataType = resolveBuiltIn(dataType, currentHandler);
|
||||||
@@ -1411,6 +1414,15 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
|||||||
return existingDataType;
|
return existingDataType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sourceArchive.getSourceArchiveID().equals(getUniversalID())) {
|
||||||
|
// Avoid conflict handling for types with a source which matches
|
||||||
|
// this archive, although a conflict name may still be used.
|
||||||
|
// This can occur when a semi-mirrored archive instance is used
|
||||||
|
// such as the CompositeViewerDataTypeManager which uses the same
|
||||||
|
// Archive UniversalID as the edited datatype's source.
|
||||||
|
return createDataType(dataType, sourceArchive, handler);
|
||||||
|
}
|
||||||
|
|
||||||
// If we have the same path name and the existing data type is a local data type
|
// If we have the same path name and the existing data type is a local data type
|
||||||
// and is equivalent to this one, then associate it with the source archive
|
// and is equivalent to this one, then associate it with the source archive
|
||||||
existingDataType = findEquivalentDataTypeSameLocation(dataType);
|
existingDataType = findEquivalentDataTypeSameLocation(dataType);
|
||||||
@@ -1421,7 +1433,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
|||||||
}
|
}
|
||||||
return existingDataType;
|
return existingDataType;
|
||||||
}
|
}
|
||||||
|
|
||||||
return resolveNoEquivalentFound(dataType, sourceArchive, handler);
|
return resolveNoEquivalentFound(dataType, sourceArchive, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1437,11 +1449,15 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
|||||||
private DataType resolveNoEquivalentFound(DataType dataType, SourceArchive sourceArchive,
|
private DataType resolveNoEquivalentFound(DataType dataType, SourceArchive sourceArchive,
|
||||||
DataTypeConflictHandler handler) {
|
DataTypeConflictHandler handler) {
|
||||||
|
|
||||||
|
if (sourceArchive != null && sourceArchive.getArchiveType() == ArchiveType.PROGRAM) {
|
||||||
|
sourceArchive = null; // do not preserve program as a source archive
|
||||||
|
}
|
||||||
|
|
||||||
// If not found, do we have the same named data type in the same category already?
|
// If not found, do we have the same named data type in the same category already?
|
||||||
// (preference is given to similar kind of datatype when checking existing conflict types)
|
// (preference is given to similar kind of datatype when checking existing conflict types)
|
||||||
DataType existingDataType = findDataTypeSameLocation(dataType);
|
DataType existingDataType = findDataTypeSameLocation(dataType);
|
||||||
if (existingDataType == null) {
|
if (existingDataType == null) {
|
||||||
return createDataType(dataType, handler);
|
return createDataType(dataType, sourceArchive, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
// So we have a dataType with the same path and name, but not equivalent, so use
|
// So we have a dataType with the same path and name, but not equivalent, so use
|
||||||
@@ -1472,15 +1488,15 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case RENAME_AND_ADD: // default handler behavior
|
case RENAME_AND_ADD: // default handler behavior
|
||||||
return createDataType(dataType, handler);
|
return createDataType(dataType, sourceArchive, handler);
|
||||||
|
|
||||||
default: // USE_EXISTING - new type is discarded and old conflicted type is returned
|
default: // USE_EXISTING - new type is discarded and old conflicted type is returned
|
||||||
return existingDataType;
|
return existingDataType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private DataType createDataType(DataType dataType, DataTypeConflictHandler handler) {
|
private DataType createDataType(DataType dataType, SourceArchive sourceArchive,
|
||||||
SourceArchive sourceArchive = dataType.getSourceArchive();
|
DataTypeConflictHandler handler) {
|
||||||
String dtName = getUnusedConflictName(dataType);
|
String dtName = getUnusedConflictName(dataType);
|
||||||
DataType newDataType = createDataType(dataType, dtName, sourceArchive, handler);
|
DataType newDataType = createDataType(dataType, dtName, sourceArchive, handler);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user