px4_daemon: fixes for packet length computation

The enum change from uint8_t to an int avoids uninitialized bytes,
which led to valgrind warnings (no error though).
This commit is contained in:
Beat Küng
2018-08-06 08:05:04 +02:00
committed by Lorenz Meier
parent 7359f44835
commit 5b171bd614
4 changed files with 11 additions and 10 deletions

View File

@@ -165,7 +165,7 @@ Client::_send_cmds(const int argc, const char **argv)
strcpy((char *)packet.payload.execute_msg.cmd, cmd_buf.c_str());
// The size is +1 because we want to include the null termination.
packet.header.payload_length = cmd_buf.size() + 1;
packet.header.payload_length = cmd_buf.size() + 1 + sizeof(packet.payload.execute_msg.is_atty);
_client_send_pipe_fd = open(get_client_send_pipe_path(_instance_id).c_str(), O_WRONLY);
@@ -214,7 +214,7 @@ Client::_listen()
// Again, we only read as much as we need because otherwise we need
// hold a buffer and parse it.
bytes_read = read(client_recv_pipe_fd, (char *)&packet_recv + bytes_read, payload_to_read);
bytes_read = read(client_recv_pipe_fd, ((uint8_t *)&packet_recv) + bytes_read, payload_to_read);
if (bytes_read > 0) {
@@ -293,7 +293,7 @@ Client::_stdout_msg_packet(const client_recv_packet_s &packet)
return 0;
} else {
PX4_ERR("payload size wrong");
PX4_ERR("payload size wrong (%i > %i)", packet.header.payload_length, sizeof(packet.payload.stdout_msg.text));
return -1;
}
}

View File

@@ -53,7 +53,7 @@ namespace px4_daemon
unsigned get_client_send_packet_length(const client_send_packet_s *packet)
{
return sizeof(client_send_packet_s) - sizeof(packet->payload) + packet->header.payload_length + sizeof(uint8_t);
return sizeof(client_send_packet_s) - sizeof(packet->payload) + packet->header.payload_length;
}
unsigned get_client_recv_packet_length(const client_recv_packet_s *packet)

View File

@@ -46,13 +46,16 @@ namespace px4_daemon
static const unsigned RECV_PIPE_PATH_LEN = 64;
// The packet size is no more than 512 bytes, because that is the minimum guaranteed size
// for a pipe to avoid interleaving of messages when multiple clients write at the same time
// (atomic writes).
struct client_send_packet_s {
struct message_header_s {
enum class e_msg_id : uint8_t {
uint64_t client_uuid;
enum class e_msg_id : int {
EXECUTE,
KILL
} msg_id;
uint64_t client_uuid;
unsigned payload_length;
} header;
@@ -70,7 +73,7 @@ struct client_send_packet_s {
// We have per client receiver a pipe with the uuid in its file path.
struct client_recv_packet_s {
struct message_header_s {
enum class e_msg_id : uint8_t {
enum class e_msg_id : int {
RETVAL,
STDOUT
} msg_id;
@@ -82,7 +85,7 @@ struct client_recv_packet_s {
int retval;
} retval_msg;
struct stdout_msg_s {
uint8_t text[512 - sizeof(message_header_s)];
uint8_t text[512 - sizeof(message_header_s)]; ///< null-terminated string (payload_length includes the null)
} stdout_msg;
} payload;
};

View File

@@ -239,8 +239,6 @@ void Pxh::run_pxh()
}
}
return;
}
void Pxh::stop()