On Sat, Aug 30, 2008 at 12:24:40PM +0200, Jonas Fonseca wrote: > Some comments ... > > Witold Filipczyk <[EMAIL PROTECTED]> wrote Sat, Aug 30, 2008: > > commit b589f19b73c65621c0a8582199509f58dbcac09f > > Author: Witold Filipczyk <[EMAIL PROTECTED]> > > AuthorDate: Sat Aug 30 10:52:00 2008 +0200 > > Commit: Witold Filipczyk <[EMAIL PROTECTED]> > > CommitDate: Sat Aug 30 10:52:00 2008 +0200 > > > > An issue with bittorrent. > > > > It was possible that the reference to the automatic variable > > uri of the make_bittorrent_peer_connection trashed the stack. > > In addition done_uri crashed because uri->string was NULL. > > > > Now uri is allocated and unlocked to avoid memleak. > > > Instead of fixing this hack, why don't you add a setup_connection() that > make_connection() can use as a wrapper and be done with this. Or if this > is "bittorrent" URI thing actually works, why do you mess with the URI struct > yourself? Didn't parse_uri() do all that for you already? Also don't > unluck the URI, call done_uri(uri) after the call to make_connection().
It is not so easy, because bittorrent in ELinks uses free syntax. I'm cheating a bit here and using http instead of bittorrent. diff --git a/src/protocol/bittorrent/peerconnect.c b/src/protocol/bittorrent/peerconnect.c index aeafbf3..7a89523 100644 --- a/src/protocol/bittorrent/peerconnect.c +++ b/src/protocol/bittorrent/peerconnect.c @@ -271,9 +271,11 @@ enum bittorrent_state make_bittorrent_peer_connection(struct bittorrent_connection *bittorrent, struct bittorrent_peer *peer_info) { - struct uri uri; + struct string uri_string; + struct uri *uri; struct bittorrent_peer_connection *peer; - unsigned char port[5]; + unsigned char port[6]; + int port_length; peer = init_bittorrent_peer_connection(-1); if (!peer) return BITTORRENT_STATE_OUT_OF_MEM; @@ -296,14 +298,27 @@ make_bittorrent_peer_connection(struct bittorrent_connection *bittorrent, /* FIXME: Rather change the make_connection() interface. This is an ugly * hack. */ /* FIXME: Set the ipv6 flag iff ... */ - memset(&uri, 0, sizeof(uri)); - uri.protocol = PROTOCOL_BITTORRENT; - uri.host = peer_info->ip; - uri.hostlen = strlen(peer_info->ip); - uri.port = port; - uri.portlen = snprintf(port, sizeof(port), "%u", peer_info->port); - - make_connection(peer->socket, &uri, send_bittorrent_peer_handshake, 1); + if (!init_string(&uri_string)) { + done_bittorrent_peer_connection(peer); + return BITTORRENT_STATE_OUT_OF_MEM; + } + /* The bittorrent protocol uses free syntax. + * It does not set uri->port nor uri->host */ + add_to_string(&uri_string, "http://"); + add_to_string(&uri_string, peer_info->ip); + add_char_to_string(&uri_string, ':'); + port_length = snprintf(port, sizeof(port), "%u", peer_info->port); + add_bytes_to_string(&uri_string, port, port_length); + + uri = get_uri(uri_string.source, URI_BASE); + done_string(&uri_string); + if (!uri) { + done_bittorrent_peer_connection(peer); + return BITTORRENT_STATE_OUT_OF_MEM; + } + uri->protocol = PROTOCOL_BITTORRENT; + make_connection(peer->socket, uri, send_bittorrent_peer_handshake, 1); + done_uri(uri); return BITTORRENT_STATE_OK; } _______________________________________________ elinks-dev mailing list elinks-dev@linuxfromscratch.org http://linuxfromscratch.org/mailman/listinfo/elinks-dev