diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd14d3b..095682a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - linter: skip native API check for NtProtectVirtualMemory #1675 @williballenthin ### capa explorer IDA Pro plugin +- fix unhandled exception when resolving rule path #1693 @mike-hunhoff ### Development diff --git a/capa/ida/plugin/form.py b/capa/ida/plugin/form.py index aa076ede..a079f1d9 100644 --- a/capa/ida/plugin/form.py +++ b/capa/ida/plugin/form.py @@ -573,10 +573,11 @@ class CapaExplorerForm(idaapi.PluginForm): def ensure_capa_settings_rule_path(self): try: - path: Path = Path(settings.user.get(CAPA_SETTINGS_RULE_PATH, "")) + path: str = settings.user.get(CAPA_SETTINGS_RULE_PATH, "") # resolve rules directory - check self and settings first, then ask user - if not path.exists(): + # pathlib.Path considers "" equivalent to "." so we first check if rule path is an empty string + if not path or not Path(path).exists(): # configure rules selection messagebox rules_message = QtWidgets.QMessageBox() rules_message.setIcon(QtWidgets.QMessageBox.Information) @@ -594,15 +595,15 @@ class CapaExplorerForm(idaapi.PluginForm): if pressed == QtWidgets.QMessageBox.Cancel: raise UserCancelledError() - path = Path(self.ask_user_directory()) + path = self.ask_user_directory() if not path: raise UserCancelledError() - if not path.exists(): + if not Path(path).exists(): logger.error("rule path %s does not exist or cannot be accessed", path) return False - settings.user[CAPA_SETTINGS_RULE_PATH] = str(path) + settings.user[CAPA_SETTINGS_RULE_PATH] = path except UserCancelledError: capa.ida.helpers.inform_user_ida_ui("Analysis requires capa rules") logger.warning(