From: ThorstenB Date: Thu, 1 Nov 2012 13:35:17 +0000 (+0100) Subject: #903: generic protocol: fix a rare corner case X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=51f16337c2327fa6d7a257cae39473045123f2f8;p=flightgear.git #903: generic protocol: fix a rare corner case ASCII protocols consisting of a single chunk only (one variable per line) would not work when no "separator" was defined. Also add error message for protocols with more than one var per line which are missing a separator... --- diff --git a/src/Network/generic.cxx b/src/Network/generic.cxx index 94a00a0eb..dca363087 100644 --- a/src/Network/generic.cxx +++ b/src/Network/generic.cxx @@ -340,7 +340,7 @@ bool FGGeneric::parse_message_binary(int length) { } bool FGGeneric::parse_message_ascii(int length) { - char *p2, *p1 = buf; + char *p1 = buf; int i = -1; int chunks = _in_message.size(); int line_separator_size = line_separator.size(); @@ -354,11 +354,17 @@ bool FGGeneric::parse_message_ascii(int length) { buf[length - line_separator_size] = 0; } + size_t varsep_len = var_separator.length(); while ((++i < chunks) && p1) { - p2 = strstr(p1, var_separator.c_str()); - if (p2) { - *p2 = 0; - p2 += var_separator.length(); + char* p2 = NULL; + + if (varsep_len > 0) + { + p2 = strstr(p1, var_separator.c_str()); + if (p2) { + *p2 = 0; + p2 += varsep_len; + } } switch (_in_message[i].type) { @@ -542,13 +548,21 @@ FGGeneric::reinit() SGPropertyNode *output = root.getNode("generic/output"); if (output) { _out_message.clear(); - read_config(output, _out_message); + if (!read_config(output, _out_message)) + { + // bad configuration + return; + } } } else if (direction == "in") { SGPropertyNode *input = root.getNode("generic/input"); if (input) { _in_message.clear(); - read_config(input, _in_message); + if (!read_config(input, _in_message)) + { + // bad configuration + return; + } if (!binary_mode && (line_separator.size() == 0 || *line_separator.rbegin() != '\n')) { @@ -563,7 +577,7 @@ FGGeneric::reinit() } -void +bool FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) { binary_mode = root->getBoolValue("binary_mode"); @@ -663,6 +677,7 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) int record_length = 0; // Only used for binary protocols. vector chunks = root->getChildren("chunk"); + for (unsigned int i = 0; i < chunks.size(); i++) { _serial_prot chunk; @@ -705,7 +720,19 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) } - if( binary_mode ) { + if( !binary_mode ) + { + if ((chunks.size() > 1)&&(var_sep_string.length() == 0)) + { + // ASCII protocols really need a separator when there is more than one chunk per line + SG_LOG(SG_IO, SG_ALERT, + "generic protocol: Invalid configuration. " + "'var_separator' must not be empty for protocols which have more than one chunk per line."); + return false; + } + } + else + { if (binary_record_length == -1) { binary_record_length = record_length; } else if (binary_record_length < record_length) { @@ -715,6 +742,8 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) binary_record_length = record_length; } } + + return true; } void FGGeneric::updateValue(FGGeneric::_serial_prot& prot, bool val) diff --git a/src/Network/generic.hxx b/src/Network/generic.hxx index b3020a390..18493651c 100644 --- a/src/Network/generic.hxx +++ b/src/Network/generic.hxx @@ -101,7 +101,7 @@ private: bool gen_message_binary(); bool parse_message_ascii(int length); bool parse_message_binary(int length); - void read_config(SGPropertyNode *root, vector<_serial_prot> &msg); + bool read_config(SGPropertyNode *root, vector<_serial_prot> &msg); bool exitOnError; bool initOk;