diff --git a/changelogs/fragments/psrp-copy-empty-file.yml b/changelogs/fragments/psrp-copy-empty-file.yml new file mode 100644 index 00000000000..282fbeeb661 --- /dev/null +++ b/changelogs/fragments/psrp-copy-empty-file.yml @@ -0,0 +1,2 @@ +bugfixes: +- psrp - Fix hang when copying an empty file to the remote target diff --git a/lib/ansible/plugins/connection/psrp.py b/lib/ansible/plugins/connection/psrp.py index f6835e7a70f..1892a4d7d9c 100644 --- a/lib/ansible/plugins/connection/psrp.py +++ b/lib/ansible/plugins/connection/psrp.py @@ -665,6 +665,9 @@ end { b64_data = base64.b64encode(b_data) yield [to_text(b64_data)] + if offset == 0: # empty file + yield [""] + rc, stdout, stderr = self._exec_psrp_script(copy_script, read_gen(), arguments=[out_path], force_stop=True) return rc, stdout, stderr, sha1_hash.hexdigest() diff --git a/test/integration/targets/connection_psrp/files/empty.txt b/test/integration/targets/connection_psrp/files/empty.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/integration/targets/connection_psrp/tests.yml b/test/integration/targets/connection_psrp/tests.yml index 1247ee19274..dabbf40729e 100644 --- a/test/integration/targets/connection_psrp/tests.yml +++ b/test/integration/targets/connection_psrp/tests.yml @@ -83,3 +83,51 @@ - shell_unicode_output.rc == 0 - "shell_unicode_output.stdout == '\U0001F4A9\n'" - shell_unicode_output.stderr == '' + + - name: copy empty file + win_copy: + src: empty.txt + dest: C:\Windows\TEMP\empty.txt + register: copy_empty + + - name: get result of copy empty file + win_stat: + path: C:\Windows\TEMP\empty.txt + get_checksum: yes + register: copy_empty_actual + + - name: assert copy empty file + assert: + that: + - copy_empty.checksum == 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + - copy_empty_actual.stat.checksum == 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + - copy_empty_actual.stat.size == 0 + + - block: + - name: fetch empty file + fetch: + src: C:\Windows\TEMP\empty.txt + dest: /tmp/empty.txt + flat: yes + register: fetch_empty + + - name: get result of fetch empty file + stat: + path: /tmp/empty.txt + get_checksum: yes + register: fetch_empty_actual + delegate_to: localhost + + - name: assert fetch empty file + assert: + that: + - fetch_empty.checksum == 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + - fetch_empty_actual.stat.checksum == 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + - fetch_empty_actual.stat.size == 0 + + always: + - name: remove tmp file + file: + path: /tmp/empty.txt + state: absent + delegate_to: localhost