Hi

I've checked out lastest svn (rev 1123), and built a small test
program which basically makes a GET and takes ownership of response in
callback (to be freed later)
If targeted HTTP server is down, the program segfaults because HTTP
request is freed twice, even if evhttp_request_own has been used to
explicitly tell libevent not to free it.

Digging it a bit, I found out that evhttp_connection_cb_cleanup frees
request despite own flag has been set.

I've patched it, but if I may be wrong and there may be another mean
to know that request has failed (transport speaking).

Best regards
Guillaume

$ cat > test.c << EOF
#include <event.h>
#include <assert.h>

#include <event2/http.h>

static struct evhttp_request *resp = NULL;
static struct event_base *base;

static void request_done(struct evhttp_request *req, void *arg) {
  evhttp_request_own(req);

  resp = req;
}

void rest_process(
  enum evhttp_cmd_type method, const char *host, int port, const char *uri,
  struct evbuffer *body) {
  struct evhttp_connection *conn;
  struct evhttp_request *req;
  int ret;
  conn = evhttp_connection_base_new(base, host, port);
  assert(conn != NULL);

  req = evhttp_request_new(request_done, NULL);
  assert(req != NULL);

  ret = evhttp_make_request(conn, req, method, uri);
  assert(ret == 0);
}

int main(int argc, char **argv) {
  base = event_init();

  rest_process(EVHTTP_REQ_GET, "127.0.0.1", 8080, "/path", NULL);

  event_base_loop(base,0);

  assert(resp != NULL);

  evhttp_request_free(resp);

  return 0;
}
EOF
Index: http.c
===================================================================
--- http.c	(revision 1123)
+++ http.c	(working copy)
@@ -1081,6 +1081,10 @@
 
 		/* we might want to set an error here */
 		request->cb(request, request->cb_arg);
+
+		if (evhttp_request_is_owned(request))
+			continue;
+
 		evhttp_request_free(request);
 	}
 }
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkeymail.org/mailman/listinfo/libevent-users

Reply via email to