From d5e6109e3b09e9bd30a055120fdaa48dd6f3043d Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Sat, 10 Sep 2022 23:28:12 +0800 Subject: [PATCH 1/5] allow user to build config from dictionary other than disk file --- qiling/utils.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/qiling/utils.py b/qiling/utils.py index 3c959b892..d66134987 100644 --- a/qiling/utils.py +++ b/qiling/utils.py @@ -404,31 +404,36 @@ def select_os(ostype: QL_OS) -> QlClassInit['QlOs']: return partial(obj) -def profile_setup(ostype: QL_OS, filename: Optional[str]): +def profile_setup(ostype: QL_OS, config_src: Optional[str|dict]): # mcu uses a yaml-based config if ostype == QL_OS.MCU: import yaml - if filename: - with open(filename) as f: + if config_src: + with open(config_src) as f: config = yaml.load(f, Loader=yaml.Loader) else: config = {} else: - qiling_home = Path(inspect.getfile(inspect.currentframe())).parent - os_profile = qiling_home / 'profiles' / f'{ostype.name.lower()}.ql' + # patch 'getint' to convert integers of all bases + int_converter = partial(int, base=0) + config = ConfigParser(converters={'int': int_converter}) - profiles = [os_profile] + # build config from dictionary, but not read from disk file + if isinstance(config_src, dict): + config.read_dict(config_src) - if filename: - profiles.append(filename) + elif isinstance(config_src, str): + qiling_home = Path(inspect.getfile(inspect.currentframe())).parent + os_profile = qiling_home / 'profiles' / f'{ostype.name.lower()}.ql' - # patch 'getint' to convert integers of all bases - int_converter = partial(int, base=0) + profiles = [os_profile] - config = ConfigParser(converters={'int': int_converter}) - config.read(profiles) + if config_src: + profiles.append(config_src) + + config.read(profiles) return config From f68ea661b46e1f66a0d326ef5b5d1d6bd0347df8 Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Sun, 11 Sep 2022 02:52:33 +0800 Subject: [PATCH 2/5] proper type hint for profile_setup --- qiling/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiling/utils.py b/qiling/utils.py index d66134987..5121288a3 100644 --- a/qiling/utils.py +++ b/qiling/utils.py @@ -404,7 +404,7 @@ def select_os(ostype: QL_OS) -> QlClassInit['QlOs']: return partial(obj) -def profile_setup(ostype: QL_OS, config_src: Optional[str|dict]): +def profile_setup(ostype: QL_OS, config_src: Optional[Union[str, dict]]): # mcu uses a yaml-based config if ostype == QL_OS.MCU: import yaml From 89811a02df07f35da30d54702d7004ffeb9c7e15 Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Sun, 11 Sep 2022 03:01:45 +0800 Subject: [PATCH 3/5] fix profile_setup default behavior --- qiling/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qiling/utils.py b/qiling/utils.py index 5121288a3..b253b5836 100644 --- a/qiling/utils.py +++ b/qiling/utils.py @@ -424,7 +424,7 @@ def profile_setup(ostype: QL_OS, config_src: Optional[Union[str, dict]]): if isinstance(config_src, dict): config.read_dict(config_src) - elif isinstance(config_src, str): + else: qiling_home = Path(inspect.getfile(inspect.currentframe())).parent os_profile = qiling_home / 'profiles' / f'{ostype.name.lower()}.ql' @@ -432,9 +432,9 @@ def profile_setup(ostype: QL_OS, config_src: Optional[Union[str, dict]]): if config_src: profiles.append(config_src) - + config.read(profiles) - + return config # verify if emulator returns properly From 6ac199d634c6ddcd25ffe1e2f6f747644d9d7104 Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Thu, 22 Sep 2022 23:57:40 +0800 Subject: [PATCH 4/5] keep same behaviour as previous version of profile_setup --- qiling/utils.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/qiling/utils.py b/qiling/utils.py index b253b5836..49ff32cd8 100644 --- a/qiling/utils.py +++ b/qiling/utils.py @@ -404,13 +404,13 @@ def select_os(ostype: QL_OS) -> QlClassInit['QlOs']: return partial(obj) -def profile_setup(ostype: QL_OS, config_src: Optional[Union[str, dict]]): +def profile_setup(ostype: QL_OS, user_config: Optional[Union[str, dict]]): # mcu uses a yaml-based config if ostype == QL_OS.MCU: import yaml - if config_src: - with open(config_src) as f: + if user_config: + with open(user_config) as f: config = yaml.load(f, Loader=yaml.Loader) else: config = {} @@ -420,20 +420,18 @@ def profile_setup(ostype: QL_OS, config_src: Optional[Union[str, dict]]): int_converter = partial(int, base=0) config = ConfigParser(converters={'int': int_converter}) - # build config from dictionary, but not read from disk file - if isinstance(config_src, dict): - config.read_dict(config_src) + qiling_home = Path(inspect.getfile(inspect.currentframe())).parent + os_profile = qiling_home / 'profiles' / f'{ostype.name.lower()}.ql' - else: - qiling_home = Path(inspect.getfile(inspect.currentframe())).parent - os_profile = qiling_home / 'profiles' / f'{ostype.name.lower()}.ql' + # read default profile first + config.read(os_profile) - profiles = [os_profile] + # user-specified profile adds or overrides existing setting + if isinstance(user_config, dict): + config.read_dict(user_config) - if config_src: - profiles.append(config_src) - - config.read(profiles) + else: + config.read(user_config) return config From 0a7407193cfced2a9c8f6118b33987287537a0c8 Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Thu, 22 Sep 2022 23:59:25 +0800 Subject: [PATCH 5/5] make sure user_config is not None --- qiling/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiling/utils.py b/qiling/utils.py index 49ff32cd8..34ce265e1 100644 --- a/qiling/utils.py +++ b/qiling/utils.py @@ -430,7 +430,7 @@ def profile_setup(ostype: QL_OS, user_config: Optional[Union[str, dict]]): if isinstance(user_config, dict): config.read_dict(user_config) - else: + elif user_config: config.read(user_config) return config