From f68ccd6115e65e6da11f93e85cd05f991995c50d Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Fri, 5 Jul 2019 16:08:58 -0400 Subject: [PATCH] GT-2700 handle invalid filename characters during batch import --- .../importer/tasks/ImportBatchTask.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/plugins/importer/tasks/ImportBatchTask.java b/Ghidra/Features/Base/src/main/java/ghidra/plugins/importer/tasks/ImportBatchTask.java index 9b064ae2f6..b2faad48ce 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/plugins/importer/tasks/ImportBatchTask.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/plugins/importer/tasks/ImportBatchTask.java @@ -28,6 +28,7 @@ import ghidra.app.util.importer.MessageLog; import ghidra.app.util.opinion.LoadSpec; import ghidra.formats.gfilesystem.*; import ghidra.framework.model.*; +import ghidra.framework.store.local.LocalFileSystem; import ghidra.plugin.importer.ImporterUtilities; import ghidra.plugin.importer.ProgramMappingService; import ghidra.plugins.importer.batch.*; @@ -63,14 +64,13 @@ public class ImportBatchTask extends Task { * instance. *

* @param batchInfo {@link BatchInfo} state object - * @param destFolder {@link DomainFolder} where to place imported files. - * @param programManager {@link ProgramManager} to use when opening newly imported files, null ok. - * each file is imported, null ok. + * @param destFolder {@link DomainFolder} where to place imported files + * @param programManager {@link ProgramManager} to use when opening newly imported files, null ok * @param stripLeading boolean true if each import source's leading path should be omitted * when creating the destination project folder path. * @param stripAllContainerPath boolean true if each imported file's parent container * source path should be completely omitted when creating the destination project folder path. - * (the imported file's path within its container is still used). + * (the imported file's path within its container is still used) */ public ImportBatchTask(BatchInfo batchInfo, DomainFolder destFolder, ProgramManager programManager, boolean stripLeading, boolean stripAllContainerPath) { @@ -145,10 +145,10 @@ public class ImportBatchTask extends Task { Object consumer = new Object(); try { MessageLog messageLog = new MessageLog(); - List importedObjects = - loadSpec.getLoader().load(byteProvider, destInfo.second, destInfo.first, - loadSpec, getOptionsFor(batchLoadConfig, loadSpec, byteProvider), - messageLog, consumer, monitor); + List importedObjects = loadSpec.getLoader().load(byteProvider, + fixupProjectFilename(destInfo.second), destInfo.first, loadSpec, + getOptionsFor(batchLoadConfig, loadSpec, byteProvider), messageLog, consumer, + monitor); // TODO: accumulate batch results if (importedObjects != null) { @@ -177,6 +177,16 @@ public class ImportBatchTask extends Task { } } + private String fixupProjectFilename(String filename) { + // replaces any invalid characters with underscores + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < filename.length(); i++) { + char ch = filename.charAt(i); + sb.append(LocalFileSystem.isValidNameCharacter(ch) ? ch : '_'); + } + return sb.toString(); + } + private void releaseAll(List importedObjects, Object consumer) { for (DomainObject obj : importedObjects) { if (obj.isUsedBy(consumer)) { @@ -199,8 +209,9 @@ public class ImportBatchTask extends Task { ImporterUtilities.setProgramProperties(program, appInfo.getFSRL(), monitor); if (programManager != null && totalObjsImported < MAX_PROGRAMS_TO_OPEN) { - programManager.openProgram(program, totalObjsImported == 0 - ? ProgramManager.OPEN_CURRENT : ProgramManager.OPEN_VISIBLE); + programManager.openProgram(program, + totalObjsImported == 0 ? ProgramManager.OPEN_CURRENT + : ProgramManager.OPEN_VISIBLE); } ProgramMappingService.createAssociation(appInfo.getFSRL(), program); @@ -238,7 +249,8 @@ public class ImportBatchTask extends Task { int leadEnd = Math.min(filename, userSrcPath.length()); String leading = (leadStart < filename) ? fullPath.substring(leadStart, leadEnd) : ""; String containerPath = container < filename && !stripInteriorContainerPath - ? fullPath.substring(container, filename) : ""; + ? fullPath.substring(container, filename) + : ""; String filenameStr = fullPath.substring(filename); String result = FSUtilities.appendPath(leading, containerPath, filenameStr); return result;