Browse Source

GCS_MAVLink: fixed alignment errors in FTP server

c415-sdk
Andrew Tridgell 5 years ago
parent
commit
90232fa6c0
  1. 37
      libraries/GCS_MAVLink/GCS_FTP.cpp

37
libraries/GCS_MAVLink/GCS_FTP.cpp

@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
#include "GCS.h"
#include <AP_Filesystem/AP_Filesystem.h>
#include <AP_HAL/utility/sparse-endian.h>
extern const AP_HAL::HAL& hal;
@ -66,14 +67,14 @@ void GCS_MAVLINK::handle_file_transfer_protocol(const mavlink_message_t &msg) { @@ -66,14 +67,14 @@ void GCS_MAVLINK::handle_file_transfer_protocol(const mavlink_message_t &msg) {
struct pending_ftp request;
request.chan = chan;
request.seq_number = *(uint16_t *)packet.payload;
request.seq_number = le16toh_ptr(packet.payload);
request.session = packet.payload[2];
request.opcode = static_cast<FTP_OP>(packet.payload[3]);
request.size = packet.payload[4];
request.req_opcode = static_cast<FTP_OP>(packet.payload[5]);
request.burst_complete = packet.payload[6];
request.offset = *(uint32_t *)(&packet.payload[8]);
request.offset = le32toh_ptr(&packet.payload[8]);
request.sysid = msg.sysid;
request.compid = msg.compid;
memcpy(request.data, &packet.payload[12], sizeof(packet.payload) - 12);
@ -111,20 +112,20 @@ void GCS_MAVLINK::send_ftp_replies(void) @@ -111,20 +112,20 @@ void GCS_MAVLINK::send_ftp_replies(void)
struct pending_ftp reply;
uint8_t payload[251] = {};
if (ftp.replies->peek(reply) && (reply.chan == chan)) {
((uint16_t *)payload)[0] = reply.seq_number;
payload[2] = reply.session;
payload[3] = static_cast<uint8_t>(reply.opcode);
payload[4] = reply.size;
payload[5] = static_cast<uint8_t>(reply.req_opcode);
payload[6] = reply.burst_complete ? 1 : 0;
*(uint32_t *)(&payload[8]) = reply.offset;
memcpy(&payload[12], reply.data, sizeof(reply.data));
mavlink_msg_file_transfer_protocol_send(
reply.chan,
0, reply.sysid, reply.compid,
payload);
ftp.replies->pop();
ftp.last_send_ms = AP_HAL::millis();
put_le16_ptr(payload, reply.seq_number);
payload[2] = reply.session;
payload[3] = static_cast<uint8_t>(reply.opcode);
payload[4] = reply.size;
payload[5] = static_cast<uint8_t>(reply.req_opcode);
payload[6] = reply.burst_complete ? 1 : 0;
put_le32_ptr(&payload[8], reply.offset);
memcpy(&payload[12], reply.data, sizeof(reply.data));
mavlink_msg_file_transfer_protocol_send(
reply.chan,
0, reply.sysid, reply.compid,
payload);
ftp.replies->pop();
ftp.last_send_ms = AP_HAL::millis();
} else {
return;
}
@ -283,7 +284,7 @@ void GCS_MAVLINK::ftp_worker(void) { @@ -283,7 +284,7 @@ void GCS_MAVLINK::ftp_worker(void) {
reply.opcode = FTP_OP::Ack;
reply.size = sizeof(uint32_t);
*((int32_t *)reply.data) = (int32_t)file_size;
put_le32_ptr(reply.data, (uint32_t)file_size);
// provide compatibility with old protocol banner download
if (strncmp((const char *)request.data, "@PARAM/param.pck", 16) == 0) {
@ -469,7 +470,7 @@ void GCS_MAVLINK::ftp_worker(void) { @@ -469,7 +470,7 @@ void GCS_MAVLINK::ftp_worker(void) {
// reset our scratch area so we don't leak data, and can leverage trimming
memset(reply.data, 0, sizeof(reply.data));
reply.size = sizeof(uint32_t);
((uint32_t *)reply.data)[0] = checksum;
put_le32_ptr(reply.data, checksum);
reply.opcode = FTP_OP::Ack;
break;
}

Loading…
Cancel
Save