X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Fsg_socket_udp.cxx;h=6e43eb96098381dc6b6b4c52c6f7991c4d8369b0;hb=598b64fa9569c16878c904e344e2e2775e210c42;hp=b3e4a57ecd0c96efc1b1a65b0d34905247a39ff4;hpb=7fc8c026884b2d0a1b683765c089a9bef5ac47c8;p=simgear.git diff --git a/simgear/io/sg_socket_udp.cxx b/simgear/io/sg_socket_udp.cxx index b3e4a57e..6e43eb96 100644 --- a/simgear/io/sg_socket_udp.cxx +++ b/simgear/io/sg_socket_udp.cxx @@ -16,21 +16,25 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ +#ifdef HAVE_CONFIG_H +# include +#endif #include -#if defined( sgi ) -#include -#endif - #include #include "sg_socket_udp.hxx" +#include +#include // for atoi +#include + +using std::string; SGSocketUDP::SGSocketUDP( const string& host, const string& port ) : hostname(host), @@ -100,9 +104,14 @@ int SGSocketUDP::read( char *buf, int length ) { return 0; } + if (length <= 0) { + return 0; + } int result; + // prevent buffer overflow + int maxsize = std::min(length - 1, SG_IO_MAX_MSG_SIZE); - if ( (result = sock.recv(buf, SG_IO_MAX_MSG_SIZE, 0)) >= 0 ) { + if ( (result = sock.recv(buf, maxsize, 0)) >= 0 ) { buf[result] = '\0'; // printf("msg received = %s\n", buf); } @@ -117,10 +126,16 @@ int SGSocketUDP::readline( char *buf, int length ) { return 0; } + if (length <= 0) { + return 0; + } // cout << "sock = " << sock << endl; char *buf_ptr = save_buf + save_len; - int result = sock.recv(buf_ptr, SG_IO_MAX_MSG_SIZE, 0); + // prevent buffer overflow (size of save_buf is 2 * SG_IO_MAX_MSG_SIZE) + int maxsize = save_len < SG_IO_MAX_MSG_SIZE ? + SG_IO_MAX_MSG_SIZE : 2 * SG_IO_MAX_MSG_SIZE - save_len; + int result = sock.recv(buf_ptr, maxsize, 0); // printf("msg received = %s\n", buf); save_len += result; @@ -139,6 +154,8 @@ int SGSocketUDP::readline( char *buf, int length ) { // we found an end of line // copy to external buffer + // prevent buffer overflow + result = std::min(result,length - 1); strncpy( buf, save_buf, result ); buf[result] = '\0'; // cout << "sg_socket line = " << buf << endl; @@ -159,11 +176,8 @@ int SGSocketUDP::write( const char *buf, const int length ) { return 0; } - bool error_condition = false; - if ( sock.send( buf, length, 0 ) < 0 ) { SG_LOG( SG_IO, SG_WARN, "Error writing to socket: " << port ); - error_condition = true; return 0; }