]> git.mxchange.org Git - simgear.git/blobdiff - simgear/io/sg_socket_udp.cxx
Linux test_HTTP fixes.
[simgear.git] / simgear / io / sg_socket_udp.cxx
index b3e4a57ecd0c96efc1b1a65b0d34905247a39ff4..6e43eb96098381dc6b6b4c52c6f7991c4d8369b0 100644 (file)
 //
 // 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 <simgear_config.h>
+#endif
 
 #include <simgear/compiler.h>
 
-#if defined( sgi )
-#include <strings.h>
-#endif
-
 #include <simgear/debug/logstream.hxx>
 
 #include "sg_socket_udp.hxx"
 
+#include <cstring>
+#include <cstdlib> // for atoi
+#include <algorithm>
+
+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;
     }