From 8d07ed6318b95f56632d39e646e6bb4cde145b51 Mon Sep 17 00:00:00 2001 From: Jason K Hall <106277735+Jkhall81@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:02:22 -0700 Subject: [PATCH] Handle ValueError in run_command when parsing invalid args(shlex.split) (#85945) --- changelogs/fragments/basic_shlex_split.yml | 3 +++ lib/ansible/module_utils/basic.py | 5 ++++- .../targets/assemble/tasks/main.yml | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/basic_shlex_split.yml diff --git a/changelogs/fragments/basic_shlex_split.yml b/changelogs/fragments/basic_shlex_split.yml new file mode 100644 index 00000000000..3c71f7acb50 --- /dev/null +++ b/changelogs/fragments/basic_shlex_split.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - basic - fail in controlled manner when ``run_command()`` attempts to parse a command with broken syntax passed in as a string (https://github.com/ansible/ansible/issues/85719). \ No newline at end of file diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index e67299b8611..0333c5bf25e 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -1969,7 +1969,10 @@ class AnsibleModule(object): else: # ensure args are a list if isinstance(args, (bytes, str)): - args = shlex.split(to_text(args, errors='surrogateescape')) + try: + args = shlex.split(to_text(args, errors='surrogateescape')) + except ValueError as e: + self.fail_json(msg="Invalid command syntax in run_command", exception=e) # expand ``~`` in paths, and all environment vars if expand_user_and_vars: diff --git a/test/integration/targets/assemble/tasks/main.yml b/test/integration/targets/assemble/tasks/main.yml index a0e90b63277..4200c26d95e 100644 --- a/test/integration/targets/assemble/tasks/main.yml +++ b/test/integration/targets/assemble/tasks/main.yml @@ -198,3 +198,22 @@ - result.diff.after is defined - result.diff.before is defined - "result.state == 'file'" + +- name: Setup for validate test + ansible.builtin.file: + path: "{{ remote_tmp_dir }}/src_val_syntax" + state: directory + +- name: assemble with invalid validation command + ansible.builtin.assemble: + src: "{{ remote_tmp_dir }}/src_val_syntax" + dest: "{{ remote_tmp_dir }}/dest_val_syntax" + validate: "echo 'missing %s" + register: assemble_syntax_error + ignore_errors: yes + +- name: assert assemble failed with ignore_errors + assert: + that: + - assemble_syntax_error.failed + - "'Invalid command syntax' in assemble_syntax_error.msg" \ No newline at end of file