vlc/vlc-2.1 | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Jul 21 19:09:02 2013 +0300| [966bf6c1da96747744526e802370f82e9f9914fa] | committer: Rémi Denis-Courmont
net_Gets: rewrite, deal with errors > http://git.videolan.org/gitweb.cgi/vlc/vlc-2.1.git/?a=commit;h=966bf6c1da96747744526e802370f82e9f9914fa --- src/network/io.c | 55 +++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/network/io.c b/src/network/io.c index a55c44c..9b13b2a 100644 --- a/src/network/io.c +++ b/src/network/io.c @@ -440,46 +440,47 @@ error: * This function is not thread-safe; the same file descriptor I/O cannot be * read by another thread at the same time (although it can be written to). * + * @note This only works with stream-oriented file descriptors, not with + * datagram or packet-oriented ones. + * * @return nul-terminated heap-allocated string, or NULL on I/O error. */ -char *net_Gets( vlc_object_t *p_this, int fd, const v_socket_t *p_vs ) +char *net_Gets(vlc_object_t *obj, int fd, const v_socket_t *vs) { - char *psz_line = NULL, *ptr = NULL; - size_t i_line = 0, i_max = 0; - + char *buf = NULL; + size_t bufsize = 0, buflen = 0; - for( ;; ) + for (;;) { - if( i_line == i_max ) + if (buflen == bufsize) { - i_max += 1024; - psz_line = xrealloc( psz_line, i_max ); - ptr = psz_line + i_line; - } + if (unlikely(bufsize >= (1 << 10))) + goto error; /* put sane buffer size limit */ - if( net_Read( p_this, fd, p_vs, ptr, 1, true ) != 1 ) - { - if( i_line == 0 ) - { - free( psz_line ); - return NULL; - } - break; + char *newbuf = realloc(buf, bufsize + 1024); + if (unlikely(newbuf == NULL)) + goto error; + buf = newbuf; + bufsize += 1024; } - if ( *ptr == '\n' ) + ssize_t val = net_Read(obj, fd, vs, buf + buflen, 1, false); + if (val < 1) + goto error; + + if (buf[buflen] == '\n') break; - i_line++; - ptr++; + buflen++; } - *ptr-- = '\0'; - - if( ( ptr >= psz_line ) && ( *ptr == '\r' ) ) - *ptr = '\0'; - - return psz_line; + buf[--buflen] = '\0'; + if (buflen > 0 && buf[buflen - 1] == '\r') + buf[buflen] = '\0'; + return buf; +error: + free(buf); + return NULL; } #undef net_Printf _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
