Skip to content
Snippets Groups Projects
Commit 4fcb4cf0 authored by Lorenz Meier's avatar Lorenz Meier Committed by Beat Küng
Browse files

MAVLink: Fix FTP file path handling

This was a real issue for long paths and not a flight safety issue for regular users, but could have been an issue for developers trying to use FTP on very deep nested file systems
parent 66226fb7
No related branches found
No related tags found
No related merge requests found
......@@ -303,6 +303,8 @@ MavlinkFTP::_workList(PayloadHeader *payload, bool list_hidden)
{
char dirPath[kMaxDataLength];
strncpy(dirPath, _data_as_cstring(payload), kMaxDataLength);
// ensure termination
dirPath[sizeof(dirPath) - 1] = '\0';
ErrorCode errorCode = kErrNone;
unsigned offset = 0;
......@@ -418,7 +420,7 @@ MavlinkFTP::_workList(PayloadHeader *payload, bool list_hidden)
} else {
// Everything else just sends name
strncpy(buf, result->d_name, sizeof(buf));
buf[sizeof(buf) - 1] = 0;
buf[sizeof(buf) - 1] = '\0';
}
size_t nameLen = strlen(buf);
......@@ -582,6 +584,8 @@ MavlinkFTP::_workRemoveFile(PayloadHeader *payload)
{
char file[kMaxDataLength];
strncpy(file, _data_as_cstring(payload), kMaxDataLength);
// ensure termination
file[sizeof(file) - 1] = '\0';
if (unlink(file) == 0) {
payload->size = 0;
......@@ -599,6 +603,8 @@ MavlinkFTP::_workTruncateFile(PayloadHeader *payload)
char file[kMaxDataLength];
const char temp_file[] = PX4_ROOTFSDIR"/fs/microsd/.trunc.tmp";
strncpy(file, _data_as_cstring(payload), kMaxDataLength);
// ensure termination
file[sizeof(file) - 1] = '\0';
payload->size = 0;
// emulate truncate(file, payload->offset) by
......@@ -721,7 +727,11 @@ MavlinkFTP::_workRename(PayloadHeader *payload)
}
strncpy(oldpath, ptr, kMaxDataLength);
// ensure termination
oldpath[sizeof(oldpath) - 1] = '\0';
strncpy(newpath, ptr + oldpath_sz + 1, kMaxDataLength);
// ensure termination
newpath[sizeof(newpath) - 1] = '\0';
if (rename(oldpath, newpath) == 0) {
payload->size = 0;
......@@ -738,6 +748,8 @@ MavlinkFTP::_workRemoveDirectory(PayloadHeader *payload)
{
char dir[kMaxDataLength];
strncpy(dir, _data_as_cstring(payload), kMaxDataLength);
// ensure termination
dir[sizeof(dir) - 1] = '\0';
if (rmdir(dir) == 0) {
payload->size = 0;
......@@ -754,6 +766,8 @@ MavlinkFTP::_workCreateDirectory(PayloadHeader *payload)
{
char dir[kMaxDataLength];
strncpy(dir, _data_as_cstring(payload), kMaxDataLength);
// ensure termination
dir[sizeof(dir) - 1] = '\0';
if (mkdir(dir, S_IRWXU | S_IRWXG | S_IRWXO) == 0) {
payload->size = 0;
......@@ -772,6 +786,8 @@ MavlinkFTP::_workCalcFileCRC32(PayloadHeader *payload)
uint32_t checksum = 0;
ssize_t bytes_read;
strncpy(file_buf, _data_as_cstring(payload), kMaxDataLength);
// ensure termination
file_buf[sizeof(file_buf) - 1] = '\0';
int fd = ::open(file_buf, O_RDONLY);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment