mirror of
https://github.com/upa/mscp.git
synced 2026-05-13 05:17:29 +08:00
chmod after truncate and setutimes on the remote side.
When the source file permission is r--r--r--, truncate and setutimes AFTER chmod fail due to permission deined. So, do chmod after truncate and setutimes.
This commit is contained in:
@@ -323,12 +323,14 @@ int mscp_setstat(const char *path, struct stat *st, bool preserve_ts, sftp_sessi
|
|||||||
ret = sftp_setstat(sftp, path, &attr);
|
ret = sftp_setstat(sftp, path, &attr);
|
||||||
sftp_err_to_errno(sftp);
|
sftp_err_to_errno(sftp);
|
||||||
} else {
|
} else {
|
||||||
if ((ret = chmod(path, st->st_mode)) < 0)
|
|
||||||
return ret;
|
|
||||||
if ((ret = truncate(path, st->st_size)) < 0)
|
if ((ret = truncate(path, st->st_size)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (preserve_ts)
|
if (preserve_ts) {
|
||||||
ret = setutimes(path, st->st_atim, st->st_mtim);
|
if ((ret = setutimes(path, st->st_atim, st->st_mtim)) < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if ((ret = chmod(path, st->st_mode)) < 0)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -321,6 +321,21 @@ def test_dont_truncate_dst(mscp, src_prefix, dst_prefix):
|
|||||||
assert md5_before == md5_after
|
assert md5_before == md5_after
|
||||||
f.cleanup()
|
f.cleanup()
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("src_prefix, dst_prefix", param_remote_prefix)
|
||||||
|
def test_copy_readonly_file(mscp, src_prefix, dst_prefix):
|
||||||
|
"""When a source file permission is r--r--r--, if chmod(r--r--r--)
|
||||||
|
runs first on the remote side, following truncate() and setutime()
|
||||||
|
fail due to permission deneid. So, run chmod() after truncate()
|
||||||
|
and setutime()
|
||||||
|
|
||||||
|
"""
|
||||||
|
src = File("src", size = 1024 * 1024 * 128, perm = 0o444).make()
|
||||||
|
dst = File("dst")
|
||||||
|
run2ok([mscp, "-H", "-vvv", src_prefix + src.path, dst_prefix + dst.path])
|
||||||
|
assert check_same_md5sum(src, dst)
|
||||||
|
src.cleanup()
|
||||||
|
dst.cleanup()
|
||||||
|
|
||||||
@pytest.mark.parametrize("src_prefix, dst_prefix", param_remote_prefix)
|
@pytest.mark.parametrize("src_prefix, dst_prefix", param_remote_prefix)
|
||||||
def test_dont_make_conns_more_than_chunks(mscp, src_prefix, dst_prefix):
|
def test_dont_make_conns_more_than_chunks(mscp, src_prefix, dst_prefix):
|
||||||
# copy 100 files with -n 20 -I 1 options. if mscp creates 20 SSH
|
# copy 100 files with -n 20 -I 1 options. if mscp creates 20 SSH
|
||||||
|
|||||||
Reference in New Issue
Block a user