|
|
@ -0,0 +1,754 @@ |
|
|
|
--- a/ChangeLog
|
|
|
|
+++ b/ChangeLog
|
|
|
|
@@ -1,3 +1,14 @@
|
|
|
|
+Thu Jun 4 13:37:05 CEST 2015
|
|
|
|
+ Fixing memory leak in digest authentication. -AW
|
|
|
|
+
|
|
|
|
+Wed Jun 03 21:23:47 CEST 2015
|
|
|
|
+ Add deprecation compiler messages for deprecated functions
|
|
|
|
+ and macros. -EG
|
|
|
|
+
|
|
|
|
+Fri May 29 12:23:01 CEST 2015
|
|
|
|
+ Fixing digest authentication when used in combination
|
|
|
|
+ with escaped characters in URLs. -CG/AW
|
|
|
|
+
|
|
|
|
Wed May 13 11:49:09 CEST 2015 |
|
|
|
Releasing libmicrohttpd 0.9.42. -CG |
|
|
|
|
|
|
|
--- a/src/microhttpd/response.c
|
|
|
|
+++ b/src/microhttpd/response.c
|
|
|
|
@@ -24,6 +24,8 @@
|
|
|
|
* @author Christian Grothoff |
|
|
|
*/ |
|
|
|
|
|
|
|
+#define MHD_NO_DEPRECATION 1
|
|
|
|
+
|
|
|
|
#include "internal.h" |
|
|
|
#include "response.h" |
|
|
|
|
|
|
|
--- a/src/microhttpd/digestauth.c
|
|
|
|
+++ b/src/microhttpd/digestauth.c
|
|
|
|
@@ -1,6 +1,6 @@
|
|
|
|
/* |
|
|
|
This file is part of libmicrohttpd |
|
|
|
- Copyright (C) 2010, 2011, 2012 Daniel Pittman and Christian Grothoff
|
|
|
|
+ Copyright (C) 2010, 2011, 2012, 2015 Daniel Pittman and Christian Grothoff
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or |
|
|
|
modify it under the terms of the GNU Lesser General Public |
|
|
|
@@ -472,8 +472,8 @@ test_header (struct MHD_Connection *conn
|
|
|
|
* |
|
|
|
* @param connection connections with headers to compare against |
|
|
|
* @param args argument URI string (after "?" in URI) |
|
|
|
- * @return MHD_YES if the arguments match,
|
|
|
|
- * MHD_NO if not
|
|
|
|
+ * @return #MHD_YES if the arguments match,
|
|
|
|
+ * #MHD_NO if not
|
|
|
|
*/ |
|
|
|
static int |
|
|
|
check_argument_match (struct MHD_Connection *connection, |
|
|
|
@@ -508,7 +508,10 @@ check_argument_match (struct MHD_Connect
|
|
|
|
connection, |
|
|
|
argp); |
|
|
|
if (MHD_YES != test_header (connection, argp, NULL)) |
|
|
|
- return MHD_NO;
|
|
|
|
+ {
|
|
|
|
+ free(argb);
|
|
|
|
+ return MHD_NO;
|
|
|
|
+ }
|
|
|
|
num_headers++; |
|
|
|
break; |
|
|
|
} |
|
|
|
@@ -527,10 +530,16 @@ check_argument_match (struct MHD_Connect
|
|
|
|
connection, |
|
|
|
equals); |
|
|
|
if (! test_header (connection, argp, equals)) |
|
|
|
- return MHD_NO;
|
|
|
|
+ {
|
|
|
|
+ free(argb);
|
|
|
|
+ return MHD_NO;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
num_headers++; |
|
|
|
argp = amper; |
|
|
|
} |
|
|
|
+
|
|
|
|
+ free(argb);
|
|
|
|
|
|
|
|
/* also check that the number of headers matches */ |
|
|
|
for (pos = connection->headers_received; NULL != pos; pos = pos->next) |
|
|
|
@@ -632,10 +641,83 @@ MHD_digest_auth_check (struct MHD_Connec
|
|
|
|
header value. */ |
|
|
|
return MHD_NO; |
|
|
|
} |
|
|
|
+ /* 8 = 4 hexadecimal numbers for the timestamp */
|
|
|
|
+ nonce_time = strtoul (nonce + len - 8, (char **)NULL, 16);
|
|
|
|
+ t = (uint32_t) MHD_monotonic_time();
|
|
|
|
+ /*
|
|
|
|
+ * First level vetting for the nonce validity: if the timestamp
|
|
|
|
+ * attached to the nonce exceeds `nonce_timeout', then the nonce is
|
|
|
|
+ * invalid.
|
|
|
|
+ */
|
|
|
|
+ if ( (t > nonce_time + nonce_timeout) ||
|
|
|
|
+ (nonce_time + nonce_timeout < nonce_time) )
|
|
|
|
+ {
|
|
|
|
+ /* too old */
|
|
|
|
+ return MHD_INVALID_NONCE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ calculate_nonce (nonce_time,
|
|
|
|
+ connection->method,
|
|
|
|
+ connection->daemon->digest_auth_random,
|
|
|
|
+ connection->daemon->digest_auth_rand_size,
|
|
|
|
+ connection->url,
|
|
|
|
+ realm,
|
|
|
|
+ noncehashexp);
|
|
|
|
+ /*
|
|
|
|
+ * Second level vetting for the nonce validity
|
|
|
|
+ * if the timestamp attached to the nonce is valid
|
|
|
|
+ * and possibly fabricated (in case of an attack)
|
|
|
|
+ * the attacker must also know the random seed to be
|
|
|
|
+ * able to generate a "sane" nonce, which if he does
|
|
|
|
+ * not, the nonce fabrication process going to be
|
|
|
|
+ * very hard to achieve.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ if (0 != strcmp (nonce, noncehashexp))
|
|
|
|
+ {
|
|
|
|
+ return MHD_INVALID_NONCE;
|
|
|
|
+ }
|
|
|
|
+ if ( (0 == lookup_sub_value (cnonce,
|
|
|
|
+ sizeof (cnonce),
|
|
|
|
+ header, "cnonce")) ||
|
|
|
|
+ (0 == lookup_sub_value (qop, sizeof (qop), header, "qop")) ||
|
|
|
|
+ ( (0 != strcmp (qop, "auth")) &&
|
|
|
|
+ (0 != strcmp (qop, "")) ) ||
|
|
|
|
+ (0 == lookup_sub_value (nc, sizeof (nc), header, "nc")) ||
|
|
|
|
+ (0 == lookup_sub_value (response, sizeof (response), header, "response")) )
|
|
|
|
+ {
|
|
|
|
+#if HAVE_MESSAGES
|
|
|
|
+ MHD_DLOG (connection->daemon,
|
|
|
|
+ "Authentication failed, invalid format.\n");
|
|
|
|
+#endif
|
|
|
|
+ return MHD_NO;
|
|
|
|
+ }
|
|
|
|
+ nci = strtoul (nc, &end, 16);
|
|
|
|
+ if ( ('\0' != *end) ||
|
|
|
|
+ ( (LONG_MAX == nci) &&
|
|
|
|
+ (ERANGE == errno) ) )
|
|
|
|
+ {
|
|
|
|
+#if HAVE_MESSAGES
|
|
|
|
+ MHD_DLOG (connection->daemon,
|
|
|
|
+ "Authentication failed, invalid format.\n");
|
|
|
|
+#endif
|
|
|
|
+ return MHD_NO; /* invalid nonce format */
|
|
|
|
+ }
|
|
|
|
+ /*
|
|
|
|
+ * Checking if that combination of nonce and nc is sound
|
|
|
|
+ * and not a replay attack attempt. Also adds the nonce
|
|
|
|
+ * to the nonce-nc map if it does not exist there.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ if (MHD_YES != check_nonce_nc (connection, nonce, nci))
|
|
|
|
+ {
|
|
|
|
+ return MHD_NO;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
{ |
|
|
|
char *uri; |
|
|
|
-
|
|
|
|
- uri = malloc(left + 1);
|
|
|
|
+
|
|
|
|
+ uri = malloc (left + 1);
|
|
|
|
if (NULL == uri) |
|
|
|
{ |
|
|
|
#if HAVE_MESSAGES |
|
|
|
@@ -648,24 +730,31 @@ MHD_digest_auth_check (struct MHD_Connec
|
|
|
|
left + 1, |
|
|
|
header, "uri")) |
|
|
|
{ |
|
|
|
- free(uri);
|
|
|
|
+ free (uri);
|
|
|
|
return MHD_NO; |
|
|
|
} |
|
|
|
|
|
|
|
- /* 8 = 4 hexadecimal numbers for the timestamp */
|
|
|
|
- nonce_time = strtoul (nonce + len - 8, (char **)NULL, 16);
|
|
|
|
- t = (uint32_t) MHD_monotonic_time();
|
|
|
|
- /*
|
|
|
|
- * First level vetting for the nonce validity: if the timestamp
|
|
|
|
- * attached to the nonce exceeds `nonce_timeout', then the nonce is
|
|
|
|
- * invalid.
|
|
|
|
- */
|
|
|
|
- if ( (t > nonce_time + nonce_timeout) ||
|
|
|
|
- (nonce_time + nonce_timeout < nonce_time) )
|
|
|
|
- {
|
|
|
|
- free(uri);
|
|
|
|
- return MHD_INVALID_NONCE;
|
|
|
|
- }
|
|
|
|
+ digest_calc_ha1("md5",
|
|
|
|
+ username,
|
|
|
|
+ realm,
|
|
|
|
+ password,
|
|
|
|
+ nonce,
|
|
|
|
+ cnonce,
|
|
|
|
+ ha1);
|
|
|
|
+ digest_calc_response (ha1,
|
|
|
|
+ nonce,
|
|
|
|
+ nc,
|
|
|
|
+ cnonce,
|
|
|
|
+ qop,
|
|
|
|
+ connection->method,
|
|
|
|
+ uri,
|
|
|
|
+ hentity,
|
|
|
|
+ respexp);
|
|
|
|
+
|
|
|
|
+ /* Need to unescape URI before comparing with connection->url */
|
|
|
|
+ connection->daemon->unescape_callback (connection->daemon->unescape_callback_cls,
|
|
|
|
+ connection,
|
|
|
|
+ uri);
|
|
|
|
if (0 != strncmp (uri, |
|
|
|
connection->url, |
|
|
|
strlen (connection->url))) |
|
|
|
@@ -674,9 +763,10 @@ MHD_digest_auth_check (struct MHD_Connec
|
|
|
|
MHD_DLOG (connection->daemon, |
|
|
|
"Authentication failed, URI does not match.\n"); |
|
|
|
#endif |
|
|
|
- free(uri);
|
|
|
|
+ free (uri);
|
|
|
|
return MHD_NO; |
|
|
|
} |
|
|
|
+
|
|
|
|
{ |
|
|
|
const char *args = strchr (uri, '?'); |
|
|
|
|
|
|
|
@@ -692,89 +782,11 @@ MHD_digest_auth_check (struct MHD_Connec
|
|
|
|
MHD_DLOG (connection->daemon, |
|
|
|
"Authentication failed, arguments do not match.\n"); |
|
|
|
#endif |
|
|
|
- free(uri);
|
|
|
|
+ free (uri);
|
|
|
|
return MHD_NO; |
|
|
|
} |
|
|
|
} |
|
|
|
- calculate_nonce (nonce_time,
|
|
|
|
- connection->method,
|
|
|
|
- connection->daemon->digest_auth_random,
|
|
|
|
- connection->daemon->digest_auth_rand_size,
|
|
|
|
- connection->url,
|
|
|
|
- realm,
|
|
|
|
- noncehashexp);
|
|
|
|
- /*
|
|
|
|
- * Second level vetting for the nonce validity
|
|
|
|
- * if the timestamp attached to the nonce is valid
|
|
|
|
- * and possibly fabricated (in case of an attack)
|
|
|
|
- * the attacker must also know the random seed to be
|
|
|
|
- * able to generate a "sane" nonce, which if he does
|
|
|
|
- * not, the nonce fabrication process going to be
|
|
|
|
- * very hard to achieve.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- if (0 != strcmp (nonce, noncehashexp))
|
|
|
|
- {
|
|
|
|
- free(uri);
|
|
|
|
- return MHD_INVALID_NONCE;
|
|
|
|
- }
|
|
|
|
- if ( (0 == lookup_sub_value (cnonce,
|
|
|
|
- sizeof (cnonce),
|
|
|
|
- header, "cnonce")) ||
|
|
|
|
- (0 == lookup_sub_value (qop, sizeof (qop), header, "qop")) ||
|
|
|
|
- ( (0 != strcmp (qop, "auth")) &&
|
|
|
|
- (0 != strcmp (qop, "")) ) ||
|
|
|
|
- (0 == lookup_sub_value (nc, sizeof (nc), header, "nc")) ||
|
|
|
|
- (0 == lookup_sub_value (response, sizeof (response), header, "response")) )
|
|
|
|
- {
|
|
|
|
-#if HAVE_MESSAGES
|
|
|
|
- MHD_DLOG (connection->daemon,
|
|
|
|
- "Authentication failed, invalid format.\n");
|
|
|
|
-#endif
|
|
|
|
- free(uri);
|
|
|
|
- return MHD_NO;
|
|
|
|
- }
|
|
|
|
- nci = strtoul (nc, &end, 16);
|
|
|
|
- if ( ('\0' != *end) ||
|
|
|
|
- ( (LONG_MAX == nci) &&
|
|
|
|
- (ERANGE == errno) ) )
|
|
|
|
- {
|
|
|
|
-#if HAVE_MESSAGES
|
|
|
|
- MHD_DLOG (connection->daemon,
|
|
|
|
- "Authentication failed, invalid format.\n");
|
|
|
|
-#endif
|
|
|
|
- free(uri);
|
|
|
|
- return MHD_NO; /* invalid nonce format */
|
|
|
|
- }
|
|
|
|
- /*
|
|
|
|
- * Checking if that combination of nonce and nc is sound
|
|
|
|
- * and not a replay attack attempt. Also adds the nonce
|
|
|
|
- * to the nonce-nc map if it does not exist there.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- if (MHD_YES != check_nonce_nc (connection, nonce, nci))
|
|
|
|
- {
|
|
|
|
- free(uri);
|
|
|
|
- return MHD_NO;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- digest_calc_ha1("md5",
|
|
|
|
- username,
|
|
|
|
- realm,
|
|
|
|
- password,
|
|
|
|
- nonce,
|
|
|
|
- cnonce,
|
|
|
|
- ha1);
|
|
|
|
- digest_calc_response (ha1,
|
|
|
|
- nonce,
|
|
|
|
- nc,
|
|
|
|
- cnonce,
|
|
|
|
- qop,
|
|
|
|
- connection->method,
|
|
|
|
- uri,
|
|
|
|
- hentity,
|
|
|
|
- respexp);
|
|
|
|
- free(uri);
|
|
|
|
+ free (uri);
|
|
|
|
return (0 == strcmp(response, respexp)) |
|
|
|
? MHD_YES |
|
|
|
: MHD_NO; |
|
|
|
@@ -835,7 +847,7 @@ MHD_queue_auth_fail_response (struct MHD
|
|
|
|
: ""); |
|
|
|
{ |
|
|
|
char *header; |
|
|
|
-
|
|
|
|
+
|
|
|
|
header = malloc(hlen + 1); |
|
|
|
if (NULL == header) |
|
|
|
{ |
|
|
|
--- a/src/microhttpd/daemon.c
|
|
|
|
+++ b/src/microhttpd/daemon.c
|
|
|
|
@@ -73,7 +73,7 @@
|
|
|
|
/** |
|
|
|
* Default connection limit. |
|
|
|
*/ |
|
|
|
-#ifndef WINDOWS
|
|
|
|
+#ifndef MHD_WINSOCK_SOCKETS
|
|
|
|
#define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE - 4 |
|
|
|
#else |
|
|
|
#define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE |
|
|
|
@@ -1271,7 +1271,7 @@ internal_add_connection (struct MHD_Daem
|
|
|
|
return MHD_NO; |
|
|
|
} |
|
|
|
|
|
|
|
-#ifndef WINDOWS
|
|
|
|
+#ifndef MHD_WINSOCK_SOCKETS
|
|
|
|
if ( (client_socket >= FD_SETSIZE) && |
|
|
|
(0 == (daemon->options & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) ) |
|
|
|
{ |
|
|
|
@@ -1418,7 +1418,7 @@ internal_add_connection (struct MHD_Daem
|
|
|
|
#endif |
|
|
|
{ |
|
|
|
/* make socket non-blocking */ |
|
|
|
-#if !defined(WINDOWS) || defined(CYGWIN)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
int flags = fcntl (connection->socket_fd, F_GETFL); |
|
|
|
if ( (-1 == flags) || |
|
|
|
(0 != fcntl (connection->socket_fd, F_SETFL, flags | O_NONBLOCK)) ) |
|
|
|
@@ -1797,7 +1797,7 @@ static void
|
|
|
|
make_nonblocking_noninheritable (struct MHD_Daemon *daemon, |
|
|
|
MHD_socket sock) |
|
|
|
{ |
|
|
|
-#ifdef WINDOWS
|
|
|
|
+#ifdef MHD_WINSOCK_SOCKETS
|
|
|
|
DWORD dwFlags; |
|
|
|
unsigned long flags = 1; |
|
|
|
|
|
|
|
@@ -3611,7 +3611,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
daemon->socket_fd = MHD_INVALID_SOCKET; |
|
|
|
daemon->listening_address_reuse = 0; |
|
|
|
daemon->options = flags; |
|
|
|
-#if WINDOWS
|
|
|
|
+#if defined(MHD_WINSOCK_SOCKETS) || defined(CYGWIN)
|
|
|
|
/* Winsock is broken with respect to 'shutdown'; |
|
|
|
this disables us calling 'shutdown' on W32. */ |
|
|
|
daemon->options |= MHD_USE_EPOLL_TURBO; |
|
|
|
@@ -3650,7 +3650,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
free (daemon); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
-#ifndef WINDOWS
|
|
|
|
+#ifndef MHD_WINSOCK_SOCKETS
|
|
|
|
if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) && |
|
|
|
(1 == use_pipe) && |
|
|
|
(daemon->wpipe[0] >= FD_SETSIZE) ) |
|
|
|
@@ -3934,7 +3934,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
(http://msdn.microsoft.com/en-us/library/ms738574%28v=VS.85%29.aspx); |
|
|
|
and may also be missing on older POSIX systems; good luck if you have any of those, |
|
|
|
your IPv6 socket may then also bind against IPv4 anyway... */ |
|
|
|
-#ifndef WINDOWS
|
|
|
|
+#ifndef MHD_WINSOCK_SOCKETS
|
|
|
|
const int |
|
|
|
#else |
|
|
|
const char |
|
|
|
@@ -4016,7 +4016,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
{ |
|
|
|
socket_fd = daemon->socket_fd; |
|
|
|
} |
|
|
|
-#ifndef WINDOWS
|
|
|
|
+#ifndef MHD_WINSOCK_SOCKETS
|
|
|
|
if ( (socket_fd >= FD_SETSIZE) && |
|
|
|
(0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY)) ) ) |
|
|
|
{ |
|
|
|
@@ -4121,7 +4121,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
if ( (daemon->worker_pool_size > 0) && |
|
|
|
(0 == (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) ) |
|
|
|
{ |
|
|
|
-#if !defined(WINDOWS) || defined(CYGWIN)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
int sk_flags; |
|
|
|
#else |
|
|
|
unsigned long sk_flags; |
|
|
|
@@ -4140,7 +4140,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
/* Accept must be non-blocking. Multiple children may wake up |
|
|
|
* to handle a new connection, but only one will win the race. |
|
|
|
* The others must immediately return. */ |
|
|
|
-#if !defined(WINDOWS) || defined(CYGWIN)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
sk_flags = fcntl (socket_fd, F_GETFL); |
|
|
|
if (sk_flags < 0) |
|
|
|
goto thread_failed; |
|
|
|
@@ -4150,7 +4150,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
sk_flags = 1; |
|
|
|
if (SOCKET_ERROR == ioctlsocket (socket_fd, FIONBIO, &sk_flags)) |
|
|
|
goto thread_failed; |
|
|
|
-#endif /* WINDOWS && !CYGWIN */
|
|
|
|
+#endif /* MHD_WINSOCK_SOCKETS */
|
|
|
|
|
|
|
|
/* Allocate memory for pooled objects */ |
|
|
|
daemon->worker_pool = malloc (sizeof (struct MHD_Daemon) |
|
|
|
@@ -4182,7 +4182,7 @@ MHD_start_daemon_va (unsigned int flags,
|
|
|
|
#endif |
|
|
|
goto thread_failed; |
|
|
|
} |
|
|
|
-#ifndef WINDOWS
|
|
|
|
+#ifndef MHD_WINSOCK_SOCKETS
|
|
|
|
if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) && |
|
|
|
(MHD_USE_SUSPEND_RESUME == (flags & MHD_USE_SUSPEND_RESUME)) && |
|
|
|
(d->wpipe[0] >= FD_SETSIZE) ) |
|
|
|
@@ -4343,7 +4343,7 @@ close_all_connections (struct MHD_Daemon
|
|
|
|
{ |
|
|
|
shutdown (pos->socket_fd, |
|
|
|
(pos->read_closed == MHD_YES) ? SHUT_WR : SHUT_RDWR); |
|
|
|
-#if WINDOWS
|
|
|
|
+#if MHD_WINSOCK_SOCKETS
|
|
|
|
if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) && |
|
|
|
(MHD_INVALID_PIPE_ != daemon->wpipe[1]) && |
|
|
|
(1 != MHD_pipe_write_ (daemon->wpipe[1], "e", 1)) ) |
|
|
|
--- a/src/include/microhttpd.h
|
|
|
|
+++ b/src/include/microhttpd.h
|
|
|
|
@@ -130,7 +130,7 @@ typedef intptr_t ssize_t;
|
|
|
|
* Current version of the library. |
|
|
|
* 0x01093001 = 1.9.30-1. |
|
|
|
*/ |
|
|
|
-#define MHD_VERSION 0x00094200
|
|
|
|
+#define MHD_VERSION 0x00094202
|
|
|
|
|
|
|
|
/** |
|
|
|
* MHD-internal return code for "YES". |
|
|
|
@@ -194,6 +194,53 @@ typedef SOCKET MHD_socket;
|
|
|
|
#endif /* MHD_SOCKET_DEFINED */ |
|
|
|
|
|
|
|
/** |
|
|
|
+ * Define MHD_NO_DEPRECATION before including "microhttpd.h" to disable deprecation messages
|
|
|
|
+ */
|
|
|
|
+#ifdef MHD_NO_DEPRECATION
|
|
|
|
+#define _MHD_DEPR_MACRO(msg)
|
|
|
|
+#define _MHD_DEPR_FUNC(msg)
|
|
|
|
+#endif /* MHD_NO_DEPRECATION */
|
|
|
|
+
|
|
|
|
+#ifndef _MHD_DEPR_MACRO
|
|
|
|
+#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1500
|
|
|
|
+/* Stringify macros */
|
|
|
|
+#define _MHD_INSTRMACRO(a) #a
|
|
|
|
+#define _MHD_STRMACRO(a) _MHD_INSTRMACRO(a)
|
|
|
|
+#define _MHD_DEPR_MACRO(msg) __pragma(message(__FILE__ "(" _MHD_STRMACRO(__LINE__)"): warning: " msg))
|
|
|
|
+#elif defined(__clang__) || defined (__GNUC_PATCHLEVEL__)
|
|
|
|
+#define _MHD_GCC_PRAG(x) _Pragma (#x)
|
|
|
|
+#if __clang_major__+0 >= 5 || \
|
|
|
|
+ (!defined(__apple_build_version__) && (__clang_major__+0 > 3 || (__clang_major__+0 == 3 && __clang_minor__ >= 3))) || \
|
|
|
|
+ __GNUC__+0 > 4 || (__GNUC__+0 == 4 && __GNUC_MINOR__+0 >= 8)
|
|
|
|
+#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(GCC warning msg)
|
|
|
|
+#else /* older clang or GCC */
|
|
|
|
+#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(message msg)
|
|
|
|
+#endif
|
|
|
|
+/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */
|
|
|
|
+#else /* other compilers */
|
|
|
|
+#define _MHD_DEPR_MACRO(msg)
|
|
|
|
+#endif
|
|
|
|
+#endif /* _MHD_DEPR_MACRO */
|
|
|
|
+
|
|
|
|
+#ifndef _MHD_DEPR_FUNC
|
|
|
|
+#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1400
|
|
|
|
+#define _MHD_DEPR_FUNC(msg) __declspec(deprecated(msg))
|
|
|
|
+#elif defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1310
|
|
|
|
+/* VS .NET 2003 deprecation do not support custom messages */
|
|
|
|
+#define _MHD_DEPR_FUNC(msg) __declspec(deprecated)
|
|
|
|
+#elif defined (__clang__) && \
|
|
|
|
+ (__clang_major__+0 >= 4 || (!defined(__apple_build_version__) && __clang_major__+0 >= 3))
|
|
|
|
+#define _MHD_DEPR_FUNC(msg) __attribute__((deprecated(msg)))
|
|
|
|
+#elif defined (__clang__) || __GNUC__+0 > 3 || (__GNUC__+0 == 3 && __GNUC_MINOR__+0 >= 1)
|
|
|
|
+/* GCC-style deprecation do not support custom messages */
|
|
|
|
+#define _MHD_DEPR_FUNC(msg) __attribute__((__deprecated__))
|
|
|
|
+/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */
|
|
|
|
+#else /* other compilers */
|
|
|
|
+#define _MHD_DEPR_FUNC(msg)
|
|
|
|
+#endif
|
|
|
|
+#endif /* _MHD_DEPR_FUNC */
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
* Not all architectures and `printf()`'s support the `long long` type. |
|
|
|
* This gives the ability to replace `long long` with just a `long`, |
|
|
|
* standard `int` or a `short`. |
|
|
|
@@ -204,6 +251,8 @@ typedef SOCKET MHD_socket;
|
|
|
|
*/ |
|
|
|
#define MHD_LONG_LONG long long |
|
|
|
#define MHD_UNSIGNED_LONG_LONG unsigned long long |
|
|
|
+#else /* MHD_LONG_LONG */
|
|
|
|
+_MHD_DEPR_MACRO("Macro MHD_LONG_LONG is deprecated, use MHD_UNSIGNED_LONG_LONG")
|
|
|
|
#endif |
|
|
|
/** |
|
|
|
* Format string for printing a variable of type #MHD_LONG_LONG. |
|
|
|
@@ -215,6 +264,8 @@ typedef SOCKET MHD_socket;
|
|
|
|
*/ |
|
|
|
#define MHD_LONG_LONG_PRINTF "ll" |
|
|
|
#define MHD_UNSIGNED_LONG_LONG_PRINTF "%llu" |
|
|
|
+#else /* MHD_LONG_LONG_PRINTF */
|
|
|
|
+_MHD_DEPR_MACRO("Macro MHD_LONG_LONG_PRINTF is deprecated, use MHD_UNSIGNED_LONG_LONG_PRINTF")
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
@@ -253,7 +304,8 @@ typedef SOCKET MHD_socket;
|
|
|
|
#define MHD_HTTP_METHOD_NOT_ALLOWED 405 |
|
|
|
#define MHD_HTTP_NOT_ACCEPTABLE 406 |
|
|
|
/** @deprecated */ |
|
|
|
-#define MHD_HTTP_METHOD_NOT_ACCEPTABLE 406
|
|
|
|
+#define MHD_HTTP_METHOD_NOT_ACCEPTABLE \
|
|
|
|
+ _MHD_DEPR_MACRO("Value MHD_HTTP_METHOD_NOT_ACCEPTABLE is deprecated, use MHD_HTTP_NOT_ACCEPTABLE") 406
|
|
|
|
#define MHD_HTTP_PROXY_AUTHENTICATION_REQUIRED 407 |
|
|
|
#define MHD_HTTP_REQUEST_TIMEOUT 408 |
|
|
|
#define MHD_HTTP_CONFLICT 409 |
|
|
|
@@ -1953,6 +2005,7 @@ MHD_create_response_from_callback (uint6
|
|
|
|
* @deprecated use #MHD_create_response_from_buffer instead |
|
|
|
* @ingroup response |
|
|
|
*/ |
|
|
|
+_MHD_DEPR_FUNC("MHD_create_response_from_data() is deprecated, use MHD_create_response_from_buffer()") \
|
|
|
|
_MHD_EXTERN struct MHD_Response * |
|
|
|
MHD_create_response_from_data (size_t size, |
|
|
|
void *data, |
|
|
|
@@ -2023,6 +2076,8 @@ MHD_create_response_from_buffer (size_t
|
|
|
|
* @return NULL on error (i.e. invalid arguments, out of memory) |
|
|
|
* @ingroup response |
|
|
|
*/ |
|
|
|
+/* NOTE: this should be 'uint64_t' instead of 'size_t', but changing
|
|
|
|
+ this would break API compatibility. */
|
|
|
|
_MHD_EXTERN struct MHD_Response * |
|
|
|
MHD_create_response_from_fd (size_t size, |
|
|
|
int fd); |
|
|
|
@@ -2044,6 +2099,8 @@ MHD_create_response_from_fd (size_t size
|
|
|
|
* @return NULL on error (i.e. invalid arguments, out of memory) |
|
|
|
* @ingroup response |
|
|
|
*/ |
|
|
|
+/* NOTE: this should be 'uint64_t' instead of 'size_t', but changing
|
|
|
|
+ this would break API compatibility. */
|
|
|
|
_MHD_EXTERN struct MHD_Response * |
|
|
|
MHD_create_response_from_fd_at_offset (size_t size, |
|
|
|
int fd, |
|
|
|
--- a/src/include/platform_interface.h
|
|
|
|
+++ b/src/include/platform_interface.h
|
|
|
|
@@ -82,14 +82,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
/* MHD_socket_close_(fd) close any FDs (non-W32) / close only socket FDs (W32) */ |
|
|
|
-#if !defined(_WIN32) || defined(__CYGWIN__)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
#define MHD_socket_close_(fd) close((fd)) |
|
|
|
#else |
|
|
|
#define MHD_socket_close_(fd) closesocket((fd)) |
|
|
|
#endif |
|
|
|
|
|
|
|
/* MHD_socket_errno_ is errno of last function (non-W32) / errno of last socket function (W32) */ |
|
|
|
-#if !defined(_WIN32) || defined(__CYGWIN__)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
#define MHD_socket_errno_ errno |
|
|
|
#else |
|
|
|
#define MHD_socket_errno_ MHD_W32_errno_from_winsock_() |
|
|
|
@@ -97,21 +97,21 @@
|
|
|
|
|
|
|
|
/* MHD_socket_last_strerr_ is description string of last errno (non-W32) / |
|
|
|
* description string of last socket error (W32) */ |
|
|
|
-#if !defined(_WIN32) || defined(__CYGWIN__)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
#define MHD_socket_last_strerr_() strerror(errno) |
|
|
|
#else |
|
|
|
#define MHD_socket_last_strerr_() MHD_W32_strerror_last_winsock_() |
|
|
|
#endif |
|
|
|
|
|
|
|
/* MHD_strerror_ is strerror (both non-W32/W32) */ |
|
|
|
-#if !defined(_WIN32) || defined(__CYGWIN__)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
#define MHD_strerror_(errnum) strerror((errnum)) |
|
|
|
#else |
|
|
|
#define MHD_strerror_(errnum) MHD_W32_strerror_((errnum)) |
|
|
|
#endif |
|
|
|
|
|
|
|
/* MHD_set_socket_errno_ set errno to errnum (non-W32) / set socket last error to errnum (W32) */ |
|
|
|
-#if !defined(_WIN32) || defined(__CYGWIN__)
|
|
|
|
+#if !defined(MHD_WINSOCK_SOCKETS)
|
|
|
|
#define MHD_set_socket_errno_(errnum) errno=(errnum) |
|
|
|
#else |
|
|
|
#define MHD_set_socket_errno_(errnum) MHD_W32_set_last_winsock_error_((errnum)) |
|
|
|
--- a/src/testcurl/test_digestauth.c
|
|
|
|
+++ b/src/testcurl/test_digestauth.c
|
|
|
|
@@ -73,7 +73,8 @@ ahc_echo (void *cls,
|
|
|
|
const char *url, |
|
|
|
const char *method, |
|
|
|
const char *version, |
|
|
|
- const char *upload_data, size_t *upload_data_size,
|
|
|
|
+ const char *upload_data,
|
|
|
|
+ size_t *upload_data_size,
|
|
|
|
void **unused) |
|
|
|
{ |
|
|
|
struct MHD_Response *response; |
|
|
|
@@ -82,44 +83,47 @@ ahc_echo (void *cls,
|
|
|
|
const char *realm = "test@example.com"; |
|
|
|
int ret; |
|
|
|
|
|
|
|
- username = MHD_digest_auth_get_username(connection);
|
|
|
|
+ username = MHD_digest_auth_get_username (connection);
|
|
|
|
if ( (username == NULL) || |
|
|
|
(0 != strcmp (username, "testuser")) ) |
|
|
|
{ |
|
|
|
- response = MHD_create_response_from_buffer(strlen (DENIED),
|
|
|
|
- DENIED,
|
|
|
|
- MHD_RESPMEM_PERSISTENT);
|
|
|
|
+ response = MHD_create_response_from_buffer (strlen (DENIED),
|
|
|
|
+ DENIED,
|
|
|
|
+ MHD_RESPMEM_PERSISTENT);
|
|
|
|
ret = MHD_queue_auth_fail_response(connection, realm, |
|
|
|
MY_OPAQUE, |
|
|
|
response, |
|
|
|
- MHD_NO);
|
|
|
|
- MHD_destroy_response(response);
|
|
|
|
+ MHD_NO);
|
|
|
|
+ MHD_destroy_response(response);
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
ret = MHD_digest_auth_check(connection, realm, |
|
|
|
- username,
|
|
|
|
- password,
|
|
|
|
+ username,
|
|
|
|
+ password,
|
|
|
|
300); |
|
|
|
free(username); |
|
|
|
if ( (ret == MHD_INVALID_NONCE) || |
|
|
|
(ret == MHD_NO) ) |
|
|
|
{ |
|
|
|
- response = MHD_create_response_from_buffer(strlen (DENIED),
|
|
|
|
+ response = MHD_create_response_from_buffer(strlen (DENIED),
|
|
|
|
DENIED, |
|
|
|
- MHD_RESPMEM_PERSISTENT);
|
|
|
|
- if (NULL == response)
|
|
|
|
+ MHD_RESPMEM_PERSISTENT);
|
|
|
|
+ if (NULL == response)
|
|
|
|
return MHD_NO; |
|
|
|
ret = MHD_queue_auth_fail_response(connection, realm, |
|
|
|
MY_OPAQUE, |
|
|
|
response, |
|
|
|
- (ret == MHD_INVALID_NONCE) ? MHD_YES : MHD_NO);
|
|
|
|
- MHD_destroy_response(response);
|
|
|
|
+ (ret == MHD_INVALID_NONCE) ? MHD_YES : MHD_NO);
|
|
|
|
+ MHD_destroy_response(response);
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
- response = MHD_create_response_from_buffer(strlen(PAGE), PAGE,
|
|
|
|
- MHD_RESPMEM_PERSISTENT);
|
|
|
|
- ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
|
|
|
|
- MHD_destroy_response(response);
|
|
|
|
+ response = MHD_create_response_from_buffer (strlen(PAGE),
|
|
|
|
+ PAGE,
|
|
|
|
+ MHD_RESPMEM_PERSISTENT);
|
|
|
|
+ ret = MHD_queue_response (connection,
|
|
|
|
+ MHD_HTTP_OK,
|
|
|
|
+ response);
|
|
|
|
+ MHD_destroy_response (response);
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -144,24 +148,24 @@ testDigestAuth ()
|
|
|
|
fd = open("/dev/urandom", O_RDONLY); |
|
|
|
if (-1 == fd) |
|
|
|
{ |
|
|
|
- fprintf(stderr, "Failed to open `%s': %s\n",
|
|
|
|
- "/dev/urandom",
|
|
|
|
- strerror(errno));
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
+ fprintf(stderr, "Failed to open `%s': %s\n",
|
|
|
|
+ "/dev/urandom",
|
|
|
|
+ strerror(errno));
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
while (off < 8) |
|
|
|
- {
|
|
|
|
- len = read(fd, rnd, 8);
|
|
|
|
- if (len == -1)
|
|
|
|
- {
|
|
|
|
- fprintf(stderr, "Failed to read `%s': %s\n",
|
|
|
|
- "/dev/urandom",
|
|
|
|
- strerror(errno));
|
|
|
|
- (void) close(fd);
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
- off += len;
|
|
|
|
- }
|
|
|
|
+ {
|
|
|
|
+ len = read(fd, rnd, 8);
|
|
|
|
+ if (len == -1)
|
|
|
|
+ {
|
|
|
|
+ fprintf(stderr, "Failed to read `%s': %s\n",
|
|
|
|
+ "/dev/urandom",
|
|
|
|
+ strerror(errno));
|
|
|
|
+ (void) close(fd);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ off += len;
|
|
|
|
+ }
|
|
|
|
(void) close(fd); |
|
|
|
#else |
|
|
|
{ |
|
|
|
@@ -193,7 +197,7 @@ testDigestAuth ()
|
|
|
|
if (d == NULL) |
|
|
|
return 1; |
|
|
|
c = curl_easy_init (); |
|
|
|
- curl_easy_setopt (c, CURLOPT_URL, "http://127.0.0.1:1337/");
|
|
|
|
+ curl_easy_setopt (c, CURLOPT_URL, "http://127.0.0.1:1337/bar%20 foo?a=bü%20");
|
|
|
|
curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, ©Buffer); |
|
|
|
curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); |
|
|
|
curl_easy_setopt (c, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); |
|
|
|
@@ -225,7 +229,6 @@ testDigestAuth ()
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
int |
|
|
|
main (int argc, char *const *argv) |
|
|
|
{ |
|
|
|
--- a/src/testcurl/https/test_https_time_out.c
|
|
|
|
+++ b/src/testcurl/https/test_https_time_out.c
|
|
|
|
@@ -64,7 +64,7 @@ test_tls_session_time_out (gnutls_sessio
|
|
|
|
|
|
|
|
gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) (intptr_t) sd); |
|
|
|
|
|
|
|
- ret = connect (sd, &sa, sizeof (struct sockaddr_in));
|
|
|
|
+ ret = connect (sd, (struct sockaddr *) &sa, sizeof (struct sockaddr_in));
|
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
{ |