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

Reply via email to