aboutsummaryrefslogtreecommitdiff
path: root/libssh/sftp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libssh/sftp.c')
-rw-r--r--libssh/sftp.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c
index e86a262b..f720aa58 100644
--- a/libssh/sftp.c
+++ b/libssh/sftp.c
@@ -2243,10 +2243,32 @@ int sftp_symlink(SFTP_SESSION *sftp, const char *target, const char *dest) {
}
id = sftp_get_new_id(sftp);
- if (buffer_add_u32(buffer, id) < 0 ||
- buffer_add_ssh_string(buffer, target_s) < 0 ||
- buffer_add_ssh_string(buffer, dest_s) < 0 ||
- sftp_packet_write(sftp, SSH_FXP_SYMLINK, buffer) < 0) {
+ if (buffer_add_u32(buffer, id) < 0) {
+ buffer_free(buffer);
+ string_free(dest_s);
+ string_free(target_s);
+ return -1;
+ }
+ if (ssh_get_openssh_version(sftp->session)) {
+ /* TODO check for version number if they ever fix it. */
+ if (buffer_add_ssh_string(buffer, target_s) < 0 ||
+ buffer_add_ssh_string(buffer, dest_s) < 0) {
+ buffer_free(buffer);
+ string_free(dest_s);
+ string_free(target_s);
+ return -1;
+ }
+ } else {
+ if (buffer_add_ssh_string(buffer, dest_s) < 0 ||
+ buffer_add_ssh_string(buffer, target_s) < 0) {
+ buffer_free(buffer);
+ string_free(dest_s);
+ string_free(target_s);
+ return -1;
+ }
+ }
+
+ if (sftp_packet_write(sftp, SSH_FXP_SYMLINK, buffer) < 0) {
buffer_free(buffer);
string_free(dest_s);
string_free(target_s);