sftpserver: Standardize logging on errors

Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
This commit is contained in:
Jakub Jelen
2023-03-24 20:28:42 +01:00
parent f09b475c4b
commit cd54390188

View File

@@ -871,7 +871,8 @@ process_open(sftp_client_message client_msg)
int fd = -1; int fd = -1;
int status; int status;
SSH_LOG(SSH_LOG_PROTOCOL, "Processing open: filename %s", filename); SSH_LOG(SSH_LOG_PROTOCOL, "Processing open: filename %s, mode=0%o" PRIu32,
filename, mode);
if (((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) && if (((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) &&
((msg_flag & (uint32_t)SSH_FXF_WRITE) == SSH_FXF_WRITE)) { ((msg_flag & (uint32_t)SSH_FXF_WRITE) == SSH_FXF_WRITE)) {
@@ -887,15 +888,17 @@ process_open(sftp_client_message client_msg)
} else if ((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) { } else if ((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) {
file_flag = O_RDONLY; file_flag = O_RDONLY;
} else { } else {
SSH_LOG(SSH_LOG_PROTOCOL, "undefined message flag: %d", errno); SSH_LOG(SSH_LOG_PROTOCOL, "undefined message flag: %" PRIu32, msg_flag);
sftp_reply_status(client_msg, SSH_FX_FAILURE, "Flag error"); sftp_reply_status(client_msg, SSH_FX_FAILURE, "Flag error");
return SSH_ERROR; return SSH_ERROR;
} }
fd = open(filename, file_flag, mode); fd = open(filename, file_flag, mode);
if (fd == -1) { if (fd == -1) {
status = unix_errno_to_ssh_stat(errno); int saved_errno = errno;
SSH_LOG(SSH_LOG_PROTOCOL, "error open file with error: %d", errno); SSH_LOG(SSH_LOG_PROTOCOL, "error open file with error: %s",
strerror(saved_errno));
status = unix_errno_to_ssh_stat(saved_errno);
sftp_reply_status(client_msg, status, "Write error"); sftp_reply_status(client_msg, status, "Write error");
return SSH_ERROR; return SSH_ERROR;
} }
@@ -914,9 +917,10 @@ process_open(sftp_client_message client_msg)
sftp_reply_handle(client_msg, handle_s); sftp_reply_handle(client_msg, handle_s);
ssh_string_free(handle_s); ssh_string_free(handle_s);
} else { } else {
SSH_LOG(SSH_LOG_PROTOCOL, "opening file failed: %d", errno);
close(fd); close(fd);
sftp_reply_status(client_msg, SSH_FX_FAILURE, "No handle available"); SSH_LOG(SSH_LOG_PROTOCOL, "Failed to allocate handle");
sftp_reply_status(client_msg, SSH_FX_FAILURE,
"Failed to allocate handle");
} }
return SSH_OK; return SSH_OK;
@@ -944,7 +948,7 @@ process_read(sftp_client_message client_msg)
if (fd < 0) { if (fd < 0) {
sftp_reply_status(client_msg, SSH_FX_INVALID_HANDLE, NULL); sftp_reply_status(client_msg, SSH_FX_INVALID_HANDLE, NULL);
SSH_LOG(SSH_LOG_PROTOCOL, "error reading file fd: %d", fd); SSH_LOG(SSH_LOG_PROTOCOL, "invalid fd (%d) received from handle", fd);
return SSH_ERROR; return SSH_ERROR;
} }
rv = lseek(fd, client_msg->offset, SEEK_SET); rv = lseek(fd, client_msg->offset, SEEK_SET);
@@ -952,8 +956,7 @@ process_read(sftp_client_message client_msg)
sftp_reply_status(client_msg, SSH_FX_FAILURE, NULL); sftp_reply_status(client_msg, SSH_FX_FAILURE, NULL);
SSH_LOG(SSH_LOG_PROTOCOL, SSH_LOG(SSH_LOG_PROTOCOL,
"error seeking file fd: %d at offset: %" PRIu64, "error seeking file fd: %d at offset: %" PRIu64,
fd, fd, client_msg->offset);
client_msg->offset);
return SSH_ERROR; return SSH_ERROR;
} }
@@ -1288,7 +1291,8 @@ process_mkdir(sftp_client_message client_msg)
int status = SSH_FX_OK; int status = SSH_FX_OK;
int rv; int rv;
SSH_LOG(SSH_LOG_PROTOCOL, "Processing mkdir %s", filename); SSH_LOG(SSH_LOG_PROTOCOL, "Processing mkdir %s, mode=0%o" PRIu32,
filename, mode);
if (filename == NULL) { if (filename == NULL) {
sftp_reply_status(client_msg, SSH_FX_NO_SUCH_FILE, "File name error"); sftp_reply_status(client_msg, SSH_FX_NO_SUCH_FILE, "File name error");
@@ -1297,7 +1301,9 @@ process_mkdir(sftp_client_message client_msg)
rv = mkdir(filename, mode); rv = mkdir(filename, mode);
if (rv < 0) { if (rv < 0) {
status = unix_errno_to_ssh_stat(errno); int saved_errno = errno;
SSH_LOG(SSH_LOG_PROTOCOL, "failed to mkdir: %s", strerror(saved_errno));
status = unix_errno_to_ssh_stat(saved_errno);
ret = SSH_ERROR; ret = SSH_ERROR;
} }
@@ -1346,10 +1352,11 @@ process_realpath(sftp_client_message client_msg)
path = realpath(filename, NULL); path = realpath(filename, NULL);
} }
if (path == NULL) { if (path == NULL) {
int status = unix_errno_to_ssh_stat(errno); int saved_errno = errno;
int status = unix_errno_to_ssh_stat(saved_errno);
const char *err_msg = ssh_str_error(status); const char *err_msg = ssh_str_error(status);
SSH_LOG(SSH_LOG_PROTOCOL, "realpath failed: %d", errno); SSH_LOG(SSH_LOG_PROTOCOL, "realpath failed: %s", strerror(saved_errno));
sftp_reply_status(client_msg, status, err_msg); sftp_reply_status(client_msg, status, err_msg);
return SSH_ERROR; return SSH_ERROR;
} }
@@ -1377,7 +1384,9 @@ process_lstat(sftp_client_message client_msg)
rv = lstat(filename, &st); rv = lstat(filename, &st);
if (rv < 0) { if (rv < 0) {
status = unix_errno_to_ssh_stat(errno); int saved_errno = errno;
SSH_LOG(SSH_LOG_PROTOCOL, "lstat failed: %s", strerror(saved_errno));
status = unix_errno_to_ssh_stat(saved_errno);
sftp_reply_status(client_msg, status, NULL); sftp_reply_status(client_msg, status, NULL);
ret = SSH_ERROR; ret = SSH_ERROR;
} else { } else {
@@ -1407,7 +1416,9 @@ process_stat(sftp_client_message client_msg)
rv = stat(filename, &st); rv = stat(filename, &st);
if (rv < 0) { if (rv < 0) {
status = unix_errno_to_ssh_stat(errno); int saved_errno = errno;
SSH_LOG(SSH_LOG_PROTOCOL, "lstat failed: %s", strerror(saved_errno));
status = unix_errno_to_ssh_stat(saved_errno);
sftp_reply_status(client_msg, status, NULL); sftp_reply_status(client_msg, status, NULL);
ret = SSH_ERROR; ret = SSH_ERROR;
} else { } else {
@@ -1437,8 +1448,9 @@ process_readlink(sftp_client_message client_msg)
len = readlink(filename, buf, sizeof(buf) - 1); len = readlink(filename, buf, sizeof(buf) - 1);
if (len < 0) { if (len < 0) {
SSH_LOG(SSH_LOG_PROTOCOL, "read link error with reason: %d", errno); int saved_errno = errno;
status = unix_errno_to_ssh_stat(errno); SSH_LOG(SSH_LOG_PROTOCOL, "readlink failed: %s", strerror(saved_errno));
status = unix_errno_to_ssh_stat(saved_errno);
err_msg = ssh_str_error(status); err_msg = ssh_str_error(status);
sftp_reply_status(client_msg, status, err_msg); sftp_reply_status(client_msg, status, err_msg);
ret = SSH_ERROR; ret = SSH_ERROR;
@@ -1469,8 +1481,9 @@ process_symlink(sftp_client_message client_msg)
rv = symlink(srcpath, destpath); rv = symlink(srcpath, destpath);
if (rv < 0) { if (rv < 0) {
status = unix_errno_to_ssh_stat(errno); int saved_errno = errno;
SSH_LOG(SSH_LOG_PROTOCOL, "error symlink with error: %d", errno); status = unix_errno_to_ssh_stat(saved_errno);
SSH_LOG(SSH_LOG_PROTOCOL, "symlink failed: %s", strerror(saved_errno));
sftp_reply_status(client_msg, status, "Write error"); sftp_reply_status(client_msg, status, "Write error");
ret = SSH_ERROR; ret = SSH_ERROR;
} else { } else {
@@ -1492,8 +1505,9 @@ process_remove(sftp_client_message client_msg)
rv = unlink(filename); rv = unlink(filename);
if (rv < 0) { if (rv < 0) {
SSH_LOG(SSH_LOG_PROTOCOL, "unlink error with reason: %d", errno); int saved_errno = errno;
status = unix_errno_to_ssh_stat(errno); SSH_LOG(SSH_LOG_PROTOCOL, "unlink failed: %s", strerror(saved_errno));
status = unix_errno_to_ssh_stat(saved_errno);
ret = SSH_ERROR; ret = SSH_ERROR;
} }
@@ -1516,19 +1530,29 @@ static int
process_extended_statvfs(sftp_client_message client_msg) process_extended_statvfs(sftp_client_message client_msg)
{ {
const char *path = sftp_client_message_get_filename(client_msg); const char *path = sftp_client_message_get_filename(client_msg);
sftp_statvfs_t sftp_statvfs;
struct statvfs st; struct statvfs st;
uint64_t flag;
int status; int status;
int rv; int rv;
SSH_LOG(SSH_LOG_PROTOCOL, "processing extended statvfs: %s", path); SSH_LOG(SSH_LOG_PROTOCOL, "processing extended statvfs: %s", path);
rv = statvfs(path, &st); rv = statvfs(path, &st);
if (rv == 0) { if (rv != 0) {
sftp_statvfs_t sftp_statvfs; int saved_errno = errno;
u_int64_t flag; SSH_LOG(SSH_LOG_PROTOCOL, "statvfs failed: %s", strerror(saved_errno));
status = unix_errno_to_ssh_stat(saved_errno);
sftp_reply_status(client_msg, status, NULL);
return SSH_ERROR;
}
sftp_statvfs = calloc(1, sizeof(struct sftp_statvfs_struct)); sftp_statvfs = calloc(1, sizeof(struct sftp_statvfs_struct));
if (sftp_statvfs != NULL) { if (sftp_statvfs == NULL) {
SSH_LOG(SSH_LOG_PROTOCOL, "Failed to allocate statvfs structure");
sftp_reply_status(client_msg, SSH_FX_FAILURE, NULL);
return SSH_ERROR;
}
flag = (st.f_flag & ST_RDONLY) ? SSH_FXE_STATVFS_ST_RDONLY : 0; flag = (st.f_flag & ST_RDONLY) ? SSH_FXE_STATVFS_ST_RDONLY : 0;
flag |= (st.f_flag & ST_NOSUID) ? SSH_FXE_STATVFS_ST_NOSUID : 0; flag |= (st.f_flag & ST_NOSUID) ? SSH_FXE_STATVFS_ST_NOSUID : 0;
@@ -1549,13 +1573,6 @@ process_extended_statvfs(sftp_client_message client_msg)
if (rv == 0) { if (rv == 0) {
return SSH_OK; return SSH_OK;
} }
}
}
status = unix_errno_to_ssh_stat(errno);
sftp_reply_status(client_msg, status, NULL);
printf("statvfs send failed!\n");
return SSH_ERROR; return SSH_ERROR;
} }