diff options
author | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2004-04-09 22:12:09 +0000 |
---|---|---|
committer | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2004-04-09 22:12:09 +0000 |
commit | 4ef0ea5839a70fbbd7426655a1d498cc7d0f5f90 (patch) | |
tree | d4bfbacd831f33f7b4b144f4f8ecb93d9583b1e6 /src/xine-engine/io_helper.c | |
parent | b6ae9e904ccd4028156ffa680b07d51336b76877 (diff) | |
download | xine-lib-4ef0ea5839a70fbbd7426655a1d498cc7d0f5f90.tar.gz xine-lib-4ef0ea5839a70fbbd7426655a1d498cc7d0f5f90.tar.bz2 |
receiving data from network is kind of critical, we better be careful
about buffer overruns.
CVS patchset: 6368
CVS date: 2004/04/09 22:12:09
Diffstat (limited to 'src/xine-engine/io_helper.c')
-rw-r--r-- | src/xine-engine/io_helper.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/xine-engine/io_helper.c b/src/xine-engine/io_helper.c index d16267794..47038296d 100644 --- a/src/xine-engine/io_helper.c +++ b/src/xine-engine/io_helper.c @@ -340,17 +340,22 @@ off_t _x_io_file_write (xine_stream_t *stream, int s, char *buf, off_t todo) { } /* - * read a string from socket, return size length + * read a string from socket, return string length (same as strlen) + * the string is always '\0' terminated but given buffer size is never exceeded + * that is, _x_io_tcp_read_line(,,,X) <= (X-1) ; X > 0 */ int _x_io_tcp_read_line(xine_stream_t *stream, int sock, char *str, int size) { int i = 0; char c; off_t r; + if( size <= 0 ) + return 0; + while ((r = xio_rw_abort(stream, sock, XIO_TCP_READ, &c, 1)) != -1) { if (c == '\r' || c == '\n') break; - if (i > size) + if (i+1 == size) break; str[i] = c; @@ -362,5 +367,5 @@ int _x_io_tcp_read_line(xine_stream_t *stream, int sock, char *str, int size) { str[i] = '\0'; - return (int)r; + return (r != -1) ? i : (int)r; } |