mirror of
https://git.gnunet.org/libmicrohttpd.git
synced 2026-09-25 04:09:31 +03:00
fix a few memory leaks in test_upgrade logic
This commit is contained in:
@@ -143,7 +143,7 @@ gnutlscli_connect (int *sock,
|
||||
/**
|
||||
* Wrapper structure for plain&TLS sockets
|
||||
*/
|
||||
struct wr_socket_strc
|
||||
struct wr_socket
|
||||
{
|
||||
/**
|
||||
* Real network socket
|
||||
@@ -178,18 +178,6 @@ struct wr_socket_strc
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Pseudo type for plain&TLS sockets
|
||||
*/
|
||||
typedef struct wr_socket_strc* wr_socket;
|
||||
|
||||
|
||||
/**
|
||||
* Invalid value of wr_socket
|
||||
*/
|
||||
#define WR_BAD (NULL)
|
||||
|
||||
|
||||
/**
|
||||
* Get underlying real socket.
|
||||
* @return FD of real socket
|
||||
@@ -199,34 +187,34 @@ typedef struct wr_socket_strc* wr_socket;
|
||||
|
||||
/**
|
||||
* Create wr_socket with plain TCP underlying socket
|
||||
* @return created socket on success, WR_BAD otherwise
|
||||
* @return created socket on success, NULL otherwise
|
||||
*/
|
||||
static wr_socket
|
||||
static struct wr_socket *
|
||||
wr_create_plain_sckt(void)
|
||||
{
|
||||
wr_socket s = (wr_socket)malloc(sizeof(struct wr_socket_strc));
|
||||
if (WR_BAD == s)
|
||||
return WR_BAD;
|
||||
struct wr_socket *s = malloc(sizeof(struct wr_socket));
|
||||
if (NULL == s)
|
||||
return NULL;
|
||||
s->t = wr_plain;
|
||||
s->fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (MHD_INVALID_SOCKET != s->fd)
|
||||
return s;
|
||||
free(s);
|
||||
return WR_BAD;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create wr_socket with TLS TCP underlying socket
|
||||
* @return created socket on success, WR_BAD otherwise
|
||||
* @return created socket on success, NULL otherwise
|
||||
*/
|
||||
static wr_socket
|
||||
static struct wr_socket *
|
||||
wr_create_tls_sckt(void)
|
||||
{
|
||||
#ifdef HTTPS_SUPPORT
|
||||
wr_socket s = (wr_socket)malloc(sizeof(struct wr_socket_strc));
|
||||
if (WR_BAD == s)
|
||||
return WR_BAD;
|
||||
struct wr_socket *s = malloc(sizeof(struct wr_socket));
|
||||
if (NULL == s)
|
||||
return NULL;
|
||||
s->t = wr_tls;
|
||||
s->tls_connected = 0;
|
||||
s->fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
@@ -256,7 +244,7 @@ wr_create_tls_sckt(void)
|
||||
}
|
||||
free(s);
|
||||
#endif /* HTTPS_SUPPORT */
|
||||
return WR_BAD;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -264,15 +252,15 @@ wr_create_tls_sckt(void)
|
||||
* Create wr_socket with plain TCP underlying socket
|
||||
* from already created TCP socket.
|
||||
* @param plain_sk real TCP socket
|
||||
* @return created socket on success, WR_BAD otherwise
|
||||
* @return created socket on success, NULL otherwise
|
||||
*/
|
||||
static wr_socket
|
||||
static struct wr_socket *
|
||||
wr_create_from_plain_sckt(MHD_socket plain_sk)
|
||||
{
|
||||
wr_socket s = (wr_socket)malloc(sizeof(struct wr_socket_strc));
|
||||
struct wr_socket *s = malloc(sizeof(struct wr_socket));
|
||||
|
||||
if (WR_BAD == s)
|
||||
return WR_BAD;
|
||||
if (NULL == s)
|
||||
return NULL;
|
||||
s->t = wr_plain;
|
||||
s->fd = plain_sk;
|
||||
return s;
|
||||
@@ -287,7 +275,7 @@ wr_create_from_plain_sckt(MHD_socket plain_sk)
|
||||
* @return zero on success, -1 otherwise.
|
||||
*/
|
||||
static int
|
||||
wr_connect(wr_socket s,
|
||||
wr_connect(struct wr_socket *s,
|
||||
const struct sockaddr *addr,
|
||||
int length)
|
||||
{
|
||||
@@ -312,7 +300,8 @@ wr_connect(wr_socket s,
|
||||
|
||||
#ifdef HTTPS_SUPPORT
|
||||
/* Only to be called from wr_send() and wr_recv() ! */
|
||||
static bool wr_handshake(wr_socket s)
|
||||
static bool
|
||||
wr_handshake(struct wr_socket *s)
|
||||
{
|
||||
int res = gnutls_handshake (s->tls_s);
|
||||
if (GNUTLS_E_SUCCESS == res)
|
||||
@@ -336,7 +325,7 @@ static bool wr_handshake(wr_socket s)
|
||||
* to get socket error.
|
||||
*/
|
||||
static ssize_t
|
||||
wr_send (wr_socket s,
|
||||
wr_send (struct wr_socket *s,
|
||||
const void *buf,
|
||||
size_t len)
|
||||
{
|
||||
@@ -372,7 +361,7 @@ wr_send (wr_socket s,
|
||||
* to get socket error.
|
||||
*/
|
||||
static ssize_t
|
||||
wr_recv (wr_socket s,
|
||||
wr_recv (struct wr_socket *s,
|
||||
void *buf,
|
||||
size_t len)
|
||||
{
|
||||
@@ -404,7 +393,7 @@ wr_recv (wr_socket s,
|
||||
* @return zero on succeed, -1 otherwise
|
||||
*/
|
||||
static int
|
||||
wr_close (wr_socket s)
|
||||
wr_close (struct wr_socket *s)
|
||||
{
|
||||
int ret = (MHD_socket_close_(s->fd)) ? 0 : -1;
|
||||
#ifdef HTTPS_SUPPORT
|
||||
@@ -414,7 +403,7 @@ wr_close (wr_socket s)
|
||||
gnutls_certificate_free_credentials (s->tls_crd);
|
||||
}
|
||||
#endif /* HTTPS_SUPPORT */
|
||||
free(s);
|
||||
free (s);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -427,7 +416,7 @@ static pthread_t pt;
|
||||
/**
|
||||
* Will be set to the upgraded socket.
|
||||
*/
|
||||
static wr_socket usock;
|
||||
static struct wr_socket *usock;
|
||||
|
||||
/**
|
||||
* Thread we use to run the interaction with the upgraded socket.
|
||||
@@ -440,20 +429,34 @@ static pthread_t pt_client;
|
||||
static volatile bool done;
|
||||
|
||||
|
||||
/**
|
||||
* Callback used by MHD to notify the application about completed
|
||||
* requests. Frees memory.
|
||||
*
|
||||
* @param cls client-defined closure
|
||||
* @param connection connection handle
|
||||
* @param con_cls value as set by the last call to
|
||||
* the #MHD_AccessHandlerCallback
|
||||
* @param toe reason for request termination
|
||||
*/
|
||||
static void
|
||||
notify_completed_cb (void *cls,
|
||||
struct MHD_Connection *connection,
|
||||
void **con_cls,
|
||||
enum MHD_RequestTerminationCode toe)
|
||||
{
|
||||
pthread_t* ppth = *con_cls;
|
||||
|
||||
(void)cls; (void)connection; /* Unused. Silent compiler warning. */
|
||||
if ( (toe != MHD_REQUEST_TERMINATED_COMPLETED_OK) &&
|
||||
(toe != MHD_REQUEST_TERMINATED_CLIENT_ABORT) &&
|
||||
(toe != MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN) )
|
||||
abort ();
|
||||
if (! pthread_equal (**((pthread_t**)con_cls), pthread_self ()))
|
||||
if (! pthread_equal (**((pthread_t**)con_cls),
|
||||
pthread_self ()))
|
||||
abort ();
|
||||
free (*con_cls);
|
||||
if (NULL != ppth)
|
||||
free (*con_cls);
|
||||
*con_cls = NULL;
|
||||
}
|
||||
|
||||
@@ -561,7 +564,7 @@ make_blocking (MHD_socket fd)
|
||||
|
||||
|
||||
static void
|
||||
send_all (wr_socket sock,
|
||||
send_all (struct wr_socket *sock,
|
||||
const char *text)
|
||||
{
|
||||
size_t len = strlen (text);
|
||||
@@ -572,8 +575,8 @@ send_all (wr_socket sock,
|
||||
for (off = 0; off < len; off += ret)
|
||||
{
|
||||
ret = wr_send (sock,
|
||||
&text[off],
|
||||
len - off);
|
||||
&text[off],
|
||||
len - off);
|
||||
if (0 > ret)
|
||||
{
|
||||
if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ()))
|
||||
@@ -592,7 +595,7 @@ send_all (wr_socket sock,
|
||||
* get '\r\n\r\n'.
|
||||
*/
|
||||
static void
|
||||
recv_hdr (wr_socket sock)
|
||||
recv_hdr (struct wr_socket *sock)
|
||||
{
|
||||
unsigned int i;
|
||||
char next;
|
||||
@@ -637,7 +640,7 @@ recv_hdr (wr_socket sock)
|
||||
|
||||
|
||||
static void
|
||||
recv_all (wr_socket sock,
|
||||
recv_all (struct wr_socket *sock,
|
||||
const char *text)
|
||||
{
|
||||
size_t len = strlen (text);
|
||||
@@ -685,6 +688,8 @@ run_usock (void *cls)
|
||||
"Finished");
|
||||
MHD_upgrade_action (urh,
|
||||
MHD_UPGRADE_ACTION_CLOSE);
|
||||
free (usock);
|
||||
usock = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -698,18 +703,18 @@ run_usock (void *cls)
|
||||
static void *
|
||||
run_usock_client (void *cls)
|
||||
{
|
||||
wr_socket *sock = cls;
|
||||
struct wr_socket *sock = cls;
|
||||
|
||||
send_all (*sock,
|
||||
send_all (sock,
|
||||
"GET / HTTP/1.1\r\nConnection: Upgrade\r\n\r\n");
|
||||
recv_hdr (*sock);
|
||||
recv_all (*sock,
|
||||
recv_hdr (sock);
|
||||
recv_all (sock,
|
||||
"Hello");
|
||||
send_all (*sock,
|
||||
send_all (sock,
|
||||
"World");
|
||||
recv_all (*sock,
|
||||
recv_all (sock,
|
||||
"Finished");
|
||||
wr_close (*sock);
|
||||
wr_close (sock);
|
||||
done = true;
|
||||
return NULL;
|
||||
}
|
||||
@@ -979,6 +984,7 @@ run_mhd_loop (struct MHD_Daemon *daemon,
|
||||
abort ();
|
||||
}
|
||||
|
||||
|
||||
static bool test_tls;
|
||||
|
||||
/**
|
||||
@@ -992,7 +998,7 @@ test_upgrade (int flags,
|
||||
unsigned int pool)
|
||||
{
|
||||
struct MHD_Daemon *d = NULL;
|
||||
wr_socket sock;
|
||||
struct wr_socket *sock;
|
||||
struct sockaddr_in sa;
|
||||
const union MHD_DaemonInfo *real_flags;
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
@@ -1039,7 +1045,7 @@ test_upgrade (int flags,
|
||||
if (!test_tls || TLS_LIB_GNUTLS == use_tls_tool)
|
||||
{
|
||||
sock = test_tls ? wr_create_tls_sckt () : wr_create_plain_sckt ();
|
||||
if (WR_BAD == sock)
|
||||
if (NULL == sock)
|
||||
abort ();
|
||||
sa.sin_family = AF_INET;
|
||||
sa.sin_port = htons (dinfo->port);
|
||||
@@ -1059,7 +1065,7 @@ test_upgrade (int flags,
|
||||
return 4;
|
||||
}
|
||||
sock = wr_create_from_plain_sckt (tls_fork_sock);
|
||||
if (WR_BAD == sock)
|
||||
if (NULL == sock)
|
||||
abort ();
|
||||
#else /* !HTTPS_SUPPORT || !HAVE_FORK || !HAVE_WAITPID */
|
||||
abort ();
|
||||
@@ -1069,7 +1075,7 @@ test_upgrade (int flags,
|
||||
if (0 != pthread_create (&pt_client,
|
||||
NULL,
|
||||
&run_usock_client,
|
||||
&sock))
|
||||
sock))
|
||||
abort ();
|
||||
if (0 == (flags & MHD_USE_INTERNAL_POLLING_THREAD) )
|
||||
run_mhd_loop (d, real_flags->flags);
|
||||
|
||||
Reference in New Issue
Block a user