Commit ab7d3c3c authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

net_Gets: rewrite, deal with errors

parent 0dce21c6
...@@ -484,46 +484,47 @@ error: ...@@ -484,46 +484,47 @@ error:
* This function is not thread-safe; the same file descriptor I/O cannot be * 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). * 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. * @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; char *buf = NULL;
size_t i_line = 0, i_max = 0; size_t bufsize = 0, buflen = 0;
for( ;; ) for (;;)
{ {
if( i_line == i_max ) if (buflen == bufsize)
{ {
i_max += 1024; if (unlikely(bufsize >= (1 << 10)))
psz_line = xrealloc( psz_line, i_max ); goto error; /* put sane buffer size limit */
ptr = psz_line + i_line;
}
if( net_Read( p_this, fd, p_vs, ptr, 1, true ) != 1 ) char *newbuf = realloc(buf, bufsize + 1024);
{ if (unlikely(newbuf == NULL))
if( i_line == 0 ) goto error;
{ buf = newbuf;
free( psz_line ); bufsize += 1024;
return NULL;
}
break;
} }
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; break;
i_line++; buflen++;
ptr++;
} }
*ptr-- = '\0'; buf[--buflen] = '\0';
if (buflen > 0 && buf[buflen - 1] == '\r')
if( ( ptr >= psz_line ) && ( *ptr == '\r' ) ) buf[buflen] = '\0';
*ptr = '\0'; return buf;
error:
return psz_line; free(buf);
return NULL;
} }
#undef net_Printf #undef net_Printf
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment