|  | @@ -50,6 +50,10 @@
 | 
	
		
			
				|  |  |  #define PATH_MAX FILENAME_MAX
 | 
	
		
			
				|  |  |  #endif // __SYMBIAN32__
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#ifndef IGNORE_UNUSED_RESULT
 | 
	
		
			
				|  |  | +#define IGNORE_UNUSED_RESULT(a) (void)((a) && 1)
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #ifndef _WIN32_WCE // Some ANSI #includes are not available on Windows CE
 | 
	
		
			
				|  |  |  #include <sys/types.h>
 | 
	
		
			
				|  |  |  #include <sys/stat.h>
 | 
	
	
		
			
				|  | @@ -254,7 +258,9 @@ typedef int SOCKET;
 | 
	
		
			
				|  |  |  #define CGI_ENVIRONMENT_SIZE 4096
 | 
	
		
			
				|  |  |  #define MAX_CGI_ENVIR_VARS 64
 | 
	
		
			
				|  |  |  #define MG_BUF_LEN 8192
 | 
	
		
			
				|  |  | +#ifndef MAX_REQUEST_SIZE
 | 
	
		
			
				|  |  |  #define MAX_REQUEST_SIZE 16384
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  |  #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #ifdef _WIN32
 | 
	
	
		
			
				|  | @@ -721,7 +727,7 @@ static char * mg_strdup(const char *str) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static const char *mg_strcasestr(const char *big_str, const char *small_str) {
 | 
	
		
			
				|  |  | -  int i, big_len = strlen(big_str), small_len = strlen(small_str);
 | 
	
		
			
				|  |  | +  int i, big_len = (int)strlen(big_str), small_len = (int)strlen(small_str);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    for (i = 0; i <= big_len - small_len; i++) {
 | 
	
		
			
				|  |  |      if (mg_strncasecmp(big_str + i, small_str, small_len) == 0) {
 | 
	
	
		
			
				|  | @@ -888,9 +894,9 @@ static int match_prefix(const char *pattern, int pattern_len, const char *str) {
 | 
	
		
			
				|  |  |    int i, j, len, res;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if ((or_str = (const char *) memchr(pattern, '|', pattern_len)) != NULL) {
 | 
	
		
			
				|  |  | -    res = match_prefix(pattern, or_str - pattern, str);
 | 
	
		
			
				|  |  | +    res = match_prefix(pattern, (int)(or_str - pattern), str);
 | 
	
		
			
				|  |  |      return res > 0 ? res :
 | 
	
		
			
				|  |  | -        match_prefix(or_str + 1, (pattern + pattern_len) - (or_str + 1), str);
 | 
	
		
			
				|  |  | +        match_prefix(or_str + 1, (int)((pattern + pattern_len) - (or_str + 1)), str);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    i = j = 0;
 | 
	
	
		
			
				|  | @@ -1256,7 +1262,7 @@ static int poll(struct pollfd *pfd, int n, int milliseconds) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if ((result = select(maxfd + 1, &set, NULL, NULL, &tv)) > 0) {
 | 
	
		
			
				|  |  | +  if ((result = select((int)maxfd + 1, &set, NULL, NULL, &tv)) > 0) {
 | 
	
		
			
				|  |  |      for (i = 0; i < n; i++) {
 | 
	
		
			
				|  |  |        if (FD_ISSET(pfd[i].fd, &set)) {
 | 
	
		
			
				|  |  |          pfd[i].revents = POLLIN;
 | 
	
	
		
			
				|  | @@ -1364,7 +1370,8 @@ static pid_t spawn_process(struct mg_connection *conn, const char *prog,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    (void) CloseHandle(si.hStdOutput);
 | 
	
		
			
				|  |  |    (void) CloseHandle(si.hStdInput);
 | 
	
		
			
				|  |  | -  (void) CloseHandle(pi.hThread);
 | 
	
		
			
				|  |  | +  if (pi.hThread != NULL)
 | 
	
		
			
				|  |  | +    (void) CloseHandle(pi.hThread);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return (pid_t) pi.hProcess;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -1570,7 +1577,7 @@ int mg_read(struct mg_connection *conn, void *buf, size_t len) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // Return buffered data
 | 
	
		
			
				|  |  |      body = conn->buf + conn->request_len + conn->consumed_content;
 | 
	
		
			
				|  |  | -    buffered_len = &conn->buf[conn->data_len] - body;
 | 
	
		
			
				|  |  | +    buffered_len = (int)(&conn->buf[conn->data_len] - body);
 | 
	
		
			
				|  |  |      if (buffered_len > 0) {
 | 
	
		
			
				|  |  |        if (len < (size_t) buffered_len) {
 | 
	
		
			
				|  |  |          buffered_len = (int) len;
 | 
	
	
		
			
				|  | @@ -1760,7 +1767,7 @@ int mg_get_var2(const char *data, size_t data_len, const char *name,
 | 
	
		
			
				|  |  |          assert(s >= p);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Decode variable into destination buffer
 | 
	
		
			
				|  |  | -        len = mg_url_decode(p, (size_t)(s - p), dst, dst_len, 1);
 | 
	
		
			
				|  |  | +        len = mg_url_decode(p, (int)(s - p), dst, (int)dst_len, 1);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Redirect error code from -1 to -2 (destination buffer too small).
 | 
	
		
			
				|  |  |          if (len == -1) {
 | 
	
	
		
			
				|  | @@ -1801,7 +1808,7 @@ int mg_get_cookie(const char *cookie_header, const char *var_name,
 | 
	
		
			
				|  |  |            p--;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if ((size_t) (p - s) < dst_size) {
 | 
	
		
			
				|  |  | -          len = p - s;
 | 
	
		
			
				|  |  | +          len = (int)(p - s);
 | 
	
		
			
				|  |  |            mg_strlcpy(dst, s, (size_t) len + 1);
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            len = -3;
 | 
	
	
		
			
				|  | @@ -1832,7 +1839,7 @@ static void convert_uri_to_file_name(struct mg_connection *conn, char *buf,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    rewrite = conn->ctx->config[REWRITE];
 | 
	
		
			
				|  |  |    while ((rewrite = next_option(rewrite, &a, &b)) != NULL) {
 | 
	
		
			
				|  |  | -    if ((match_len = match_prefix(a.ptr, a.len, uri)) > 0) {
 | 
	
		
			
				|  |  | +    if ((match_len = match_prefix(a.ptr, (int) a.len, uri)) > 0) {
 | 
	
		
			
				|  |  |        mg_snprintf(conn, buf, buf_len - 1, "%.*s%s", (int) b.len, b.ptr,
 | 
	
		
			
				|  |  |                    uri + match_len);
 | 
	
		
			
				|  |  |        break;
 | 
	
	
		
			
				|  | @@ -1862,7 +1869,7 @@ static void convert_uri_to_file_name(struct mg_connection *conn, char *buf,
 | 
	
		
			
				|  |  |      if (*p == '/') {
 | 
	
		
			
				|  |  |        *p = '\0';
 | 
	
		
			
				|  |  |        if (match_prefix(conn->ctx->config[CGI_EXTENSIONS],
 | 
	
		
			
				|  |  | -                       strlen(conn->ctx->config[CGI_EXTENSIONS]), buf) > 0 &&
 | 
	
		
			
				|  |  | +                       (int)strlen(conn->ctx->config[CGI_EXTENSIONS]), buf) > 0 &&
 | 
	
		
			
				|  |  |            mg_stat(conn, buf, filep)) {
 | 
	
		
			
				|  |  |          // Shift PATH_INFO block one character right, e.g.
 | 
	
		
			
				|  |  |          //  "/x.cgi/foo/bar\x00" => "/x.cgi\x00/foo/bar\x00"
 | 
	
	
		
			
				|  | @@ -2247,7 +2254,7 @@ static char *mg_fgets(char *buf, size_t size, struct file *filep, char **p) {
 | 
	
		
			
				|  |  |      *p += len;
 | 
	
		
			
				|  |  |      return len ? eof : NULL;
 | 
	
		
			
				|  |  |    } else if (filep->fp != NULL) {
 | 
	
		
			
				|  |  | -    return fgets(buf, size, filep->fp);
 | 
	
		
			
				|  |  | +    return fgets(buf, (int)size, filep->fp);
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      return NULL;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -2256,7 +2263,7 @@ static char *mg_fgets(char *buf, size_t size, struct file *filep, char **p) {
 | 
	
		
			
				|  |  |  // Authorize against the opened passwords file. Return 1 if authorized.
 | 
	
		
			
				|  |  |  static int authorize(struct mg_connection *conn, struct file *filep) {
 | 
	
		
			
				|  |  |    struct ah ah;
 | 
	
		
			
				|  |  | -  char line[256], f_user[256], ha1[256], f_domain[256], buf[MG_BUF_LEN], *p;
 | 
	
		
			
				|  |  | +  char line[256], f_user[256] = "", ha1[256] = "", f_domain[256] = "", buf[MG_BUF_LEN], *p;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (!parse_auth_header(conn, buf, sizeof(buf), &ah)) {
 | 
	
		
			
				|  |  |      return 0;
 | 
	
	
		
			
				|  | @@ -2337,7 +2344,7 @@ static int is_authorized_for_put(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |  int mg_modify_passwords_file(const char *fname, const char *domain,
 | 
	
		
			
				|  |  |                               const char *user, const char *pass) {
 | 
	
		
			
				|  |  |    int found;
 | 
	
		
			
				|  |  | -  char line[512], u[512], d[512], ha1[33], tmp[PATH_MAX];
 | 
	
		
			
				|  |  | +  char line[512], u[512] = "", d[512] ="", ha1[33], tmp[PATH_MAX+1];
 | 
	
		
			
				|  |  |    FILE *fp, *fp2;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    found = 0;
 | 
	
	
		
			
				|  | @@ -2348,7 +2355,8 @@ int mg_modify_passwords_file(const char *fname, const char *domain,
 | 
	
		
			
				|  |  |      pass = NULL;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  (void) snprintf(tmp, sizeof(tmp), "%s.tmp", fname);
 | 
	
		
			
				|  |  | +  (void) snprintf(tmp, sizeof(tmp) - 1, "%s.tmp", fname);
 | 
	
		
			
				|  |  | +  tmp[sizeof(tmp) - 1] = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Create the file if does not exist
 | 
	
		
			
				|  |  |    if ((fp = fopen(fname, "a+")) != NULL) {
 | 
	
	
		
			
				|  | @@ -2392,7 +2400,7 @@ int mg_modify_passwords_file(const char *fname, const char *domain,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Put the temp file in place of real file
 | 
	
		
			
				|  |  |    remove(fname);
 | 
	
		
			
				|  |  | -  rename(tmp, fname);
 | 
	
		
			
				|  |  | +  IGNORE_UNUSED_RESULT(rename(tmp, fname));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return 1;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -2513,8 +2521,8 @@ static int WINCDECL compare_dir_entries(const void *p1, const void *p2) {
 | 
	
		
			
				|  |  |  static int must_hide_file(struct mg_connection *conn, const char *path) {
 | 
	
		
			
				|  |  |    const char *pw_pattern = "**" PASSWORDS_FILE_NAME "$";
 | 
	
		
			
				|  |  |    const char *pattern = conn->ctx->config[HIDE_FILES];
 | 
	
		
			
				|  |  | -  return match_prefix(pw_pattern, strlen(pw_pattern), path) > 0 ||
 | 
	
		
			
				|  |  | -    (pattern != NULL && match_prefix(pattern, strlen(pattern), path) > 0);
 | 
	
		
			
				|  |  | +  return match_prefix(pw_pattern, (int)strlen(pw_pattern), path) > 0 ||
 | 
	
		
			
				|  |  | +    (pattern != NULL && match_prefix(pattern, (int)strlen(pattern), path) > 0);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static int scan_directory(struct mg_connection *conn, const char *dir,
 | 
	
	
		
			
				|  | @@ -2593,7 +2601,7 @@ static int remove_directory(struct mg_connection *conn, const char *dir) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      (void) closedir(dirp);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    rmdir(dir);
 | 
	
		
			
				|  |  | +    IGNORE_UNUSED_RESULT(rmdir(dir));
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return 1;
 | 
	
	
		
			
				|  | @@ -2707,7 +2715,7 @@ static void send_file_data(struct mg_connection *conn, struct file *filep,
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        // Read from file, exit the loop on error
 | 
	
		
			
				|  |  | -      if ((num_read = fread(buf, 1, (size_t) to_read, filep->fp)) <= 0) {
 | 
	
		
			
				|  |  | +      if ((num_read = (int) fread(buf, 1, (size_t) to_read, filep->fp)) <= 0) {
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2991,7 +2999,7 @@ static int forward_body_data(struct mg_connection *conn, FILE *fp,
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      body = conn->buf + conn->request_len + conn->consumed_content;
 | 
	
		
			
				|  |  | -    buffered_len = &conn->buf[conn->data_len] - body;
 | 
	
		
			
				|  |  | +    buffered_len = (int)(&conn->buf[conn->data_len] - body);
 | 
	
		
			
				|  |  |      assert(buffered_len >= 0);
 | 
	
		
			
				|  |  |      assert(conn->consumed_content == 0);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3199,9 +3207,9 @@ static void prepare_cgi_environment(struct mg_connection *conn,
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void handle_cgi_request(struct mg_connection *conn, const char *prog) {
 | 
	
		
			
				|  |  | -  int headers_len, data_len, i, fdin[2], fdout[2];
 | 
	
		
			
				|  |  | +  int headers_len, data_len, i, fdin[2] = { 0, 0 }, fdout[2] = { 0, 0 };
 | 
	
		
			
				|  |  |    const char *status, *status_text;
 | 
	
		
			
				|  |  | -  char buf[16384], *pbuf, dir[PATH_MAX], *p;
 | 
	
		
			
				|  |  | +  char buf[MAX_REQUEST_SIZE], *pbuf, dir[PATH_MAX], *p;
 | 
	
		
			
				|  |  |    struct mg_request_info ri;
 | 
	
		
			
				|  |  |    struct cgi_env_block blk;
 | 
	
		
			
				|  |  |    FILE *in = NULL, *out = NULL;
 | 
	
	
		
			
				|  | @@ -3363,7 +3371,7 @@ static int put_dir(struct mg_connection *conn, const char *path) {
 | 
	
		
			
				|  |  |    int len, res = 1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    for (s = p = path + 2; (p = strchr(s, '/')) != NULL; s = ++p) {
 | 
	
		
			
				|  |  | -    len = p - path;
 | 
	
		
			
				|  |  | +    len = (int)(p - path);
 | 
	
		
			
				|  |  |      if (len >= (int) sizeof(buf)) {
 | 
	
		
			
				|  |  |        res = -1;
 | 
	
		
			
				|  |  |        break;
 | 
	
	
		
			
				|  | @@ -3499,7 +3507,7 @@ static void do_ssi_include(struct mg_connection *conn, const char *ssi,
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      fclose_on_exec(&file);
 | 
	
		
			
				|  |  |      if (match_prefix(conn->ctx->config[SSI_EXTENSIONS],
 | 
	
		
			
				|  |  | -                     strlen(conn->ctx->config[SSI_EXTENSIONS]), path) > 0) {
 | 
	
		
			
				|  |  | +                     (int)strlen(conn->ctx->config[SSI_EXTENSIONS]), path) > 0) {
 | 
	
		
			
				|  |  |        send_ssi_file(conn, path, &file, include_level + 1);
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |        send_file_data(conn, &file, 0, INT64_MAX);
 | 
	
	
		
			
				|  | @@ -3510,7 +3518,7 @@ static void do_ssi_include(struct mg_connection *conn, const char *ssi,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #if !defined(NO_POPEN)
 | 
	
		
			
				|  |  |  static void do_ssi_exec(struct mg_connection *conn, char *tag) {
 | 
	
		
			
				|  |  | -  char cmd[MG_BUF_LEN];
 | 
	
		
			
				|  |  | +  char cmd[MG_BUF_LEN] = "";
 | 
	
		
			
				|  |  |    struct file file = STRUCT_FILE_INITIALIZER;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (sscanf(tag, " \"%[^\"]\"", cmd) != 1) {
 | 
	
	
		
			
				|  | @@ -3858,7 +3866,7 @@ static void send_websocket_handshake(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |    mg_snprintf(conn, buf, sizeof(buf), "%s%s",
 | 
	
		
			
				|  |  |                mg_get_header(conn, "Sec-WebSocket-Key"), magic);
 | 
	
		
			
				|  |  |    SHA1Init(&sha_ctx);
 | 
	
		
			
				|  |  | -  SHA1Update(&sha_ctx, (unsigned char *) buf, strlen(buf));
 | 
	
		
			
				|  |  | +  SHA1Update(&sha_ctx, (unsigned char *) buf, (uint32_t)strlen(buf));
 | 
	
		
			
				|  |  |    SHA1Final((unsigned char *) sha, &sha_ctx);
 | 
	
		
			
				|  |  |    base64_encode((unsigned char *) sha, sizeof(sha), b64_sha);
 | 
	
		
			
				|  |  |    mg_printf(conn, "%s%s%s",
 | 
	
	
		
			
				|  | @@ -3887,7 +3895,8 @@ static void read_websocket(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |    // data points to the place where the message is stored when passed to the websocket_data
 | 
	
		
			
				|  |  |    // callback.  This is either mem on the stack, or a dynamically allocated buffer if it is
 | 
	
		
			
				|  |  |    // too large.
 | 
	
		
			
				|  |  | -  char mem[4 * 1024], *data;
 | 
	
		
			
				|  |  | +  char mem[4096];
 | 
	
		
			
				|  |  | +  char *data = mem;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Loop continuously, reading messages from the socket, invoking the callback,
 | 
	
		
			
				|  |  |    // and waiting repeatedly until an error occurs.
 | 
	
	
		
			
				|  | @@ -3913,12 +3922,15 @@ static void read_websocket(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |      if (header_len > 0) {
 | 
	
		
			
				|  |  |        // Allocate space to hold websocket payload
 | 
	
		
			
				|  |  |        data = mem;
 | 
	
		
			
				|  |  | -      if (data_len > sizeof(mem) && (data = malloc(data_len)) == NULL) {
 | 
	
		
			
				|  |  | -        // Allocation failed, exit the loop and then close the connection
 | 
	
		
			
				|  |  | -        // TODO: notify user about the failure
 | 
	
		
			
				|  |  | -        break;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +	  if (data_len > sizeof(mem)) {
 | 
	
		
			
				|  |  | +		  data = (char *)malloc(data_len);
 | 
	
		
			
				|  |  | +          if (data == NULL) {
 | 
	
		
			
				|  |  | +            // Allocation failed, exit the loop and then close the connection
 | 
	
		
			
				|  |  | +            // TODO: notify user about the failure
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +	  }
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  |        // Copy the mask before we shift the queue and destroy it
 | 
	
		
			
				|  |  |        if (mask_len > 0) {
 | 
	
		
			
				|  |  |          *(uint32_t*)mask = *(uint32_t*)(buf + header_len - mask_len);
 | 
	
	
		
			
				|  | @@ -3934,7 +3946,7 @@ static void read_websocket(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |          len = body_len - header_len;
 | 
	
		
			
				|  |  |          memcpy(data, buf + header_len, len);
 | 
	
		
			
				|  |  |          // TODO: handle pull error
 | 
	
		
			
				|  |  | -        pull(NULL, conn, data + len, data_len - len);
 | 
	
		
			
				|  |  | +        pull(NULL, conn, data + len, (int)(data_len - len));
 | 
	
		
			
				|  |  |          conn->data_len = 0;
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          // Length of the message being read at the front of the queue
 | 
	
	
		
			
				|  | @@ -3947,7 +3959,7 @@ static void read_websocket(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |          memmove(buf, buf + len, body_len - len);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Mark the queue as advanced
 | 
	
		
			
				|  |  | -        conn->data_len -= len;
 | 
	
		
			
				|  |  | +        conn->data_len -= (int)len;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        // Apply mask if necessary
 | 
	
	
		
			
				|  | @@ -3992,12 +4004,12 @@ int mg_websocket_write(struct mg_connection* conn, int opcode, const char* data,
 | 
	
		
			
				|  |  |      // Frame format: http://tools.ietf.org/html/rfc6455#section-5.2
 | 
	
		
			
				|  |  |      if (dataLen < 126) {
 | 
	
		
			
				|  |  |          // inline 7-bit length field
 | 
	
		
			
				|  |  | -        header[1] = dataLen;
 | 
	
		
			
				|  |  | +        header[1] = (unsigned char)dataLen;
 | 
	
		
			
				|  |  |          headerLen = 2;
 | 
	
		
			
				|  |  |      } else if (dataLen <= 0xFFFF) {
 | 
	
		
			
				|  |  |          // 16-bit length field
 | 
	
		
			
				|  |  |          header[1] = 126;
 | 
	
		
			
				|  |  | -        *(uint16_t*)(header + 2) = htons(dataLen);
 | 
	
		
			
				|  |  | +        *(uint16_t*)(header + 2) = htons((uint16_t)dataLen);
 | 
	
		
			
				|  |  |          headerLen = 4;
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |          // 64-bit length field
 | 
	
	
		
			
				|  | @@ -4090,7 +4102,7 @@ static int set_throttle(const char *spec, uint32_t remote_ip, const char *uri) {
 | 
	
		
			
				|  |  |        if ((remote_ip & mask) == net) {
 | 
	
		
			
				|  |  |          throttle = (int) v;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -    } else if (match_prefix(vec.ptr, vec.len, uri) > 0) {
 | 
	
		
			
				|  |  | +    } else if (match_prefix(vec.ptr, (int)vec.len, uri) > 0) {
 | 
	
		
			
				|  |  |        throttle = (int) v;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -4138,7 +4150,7 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir) {
 | 
	
		
			
				|  |  |      return num_uploaded_files;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  boundary_len = strlen(boundary);
 | 
	
		
			
				|  |  | +  boundary_len = (int)strlen(boundary);
 | 
	
		
			
				|  |  |    bl = boundary_len + 4;  // \r\n--<boundary>
 | 
	
		
			
				|  |  |    for (;;) {
 | 
	
		
			
				|  |  |      // Pull in headers
 | 
	
	
		
			
				|  | @@ -4157,8 +4169,8 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir) {
 | 
	
		
			
				|  |  |          buf[i] = buf[i + 1] = '\0';
 | 
	
		
			
				|  |  |          // TODO(lsm): don't expect filename to be the 3rd field,
 | 
	
		
			
				|  |  |          // parse the header properly instead.
 | 
	
		
			
				|  |  | -        sscanf(&buf[j], "Content-Disposition: %*s %*s filename=\"%1023[^\"]",
 | 
	
		
			
				|  |  | -               fname);
 | 
	
		
			
				|  |  | +        IGNORE_UNUSED_RESULT(sscanf(&buf[j], "Content-Disposition: %*s %*s filename=\"%1023[^\"]",
 | 
	
		
			
				|  |  | +               fname));
 | 
	
		
			
				|  |  |          j = i + 2;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -4342,7 +4354,7 @@ static void handle_request(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #if !defined(NO_CGI)
 | 
	
		
			
				|  |  |    } else if (match_prefix(conn->ctx->config[CGI_EXTENSIONS],
 | 
	
		
			
				|  |  | -                          strlen(conn->ctx->config[CGI_EXTENSIONS]),
 | 
	
		
			
				|  |  | +                          (int)strlen(conn->ctx->config[CGI_EXTENSIONS]),
 | 
	
		
			
				|  |  |                            path) > 0) {
 | 
	
		
			
				|  |  |      if (strcmp(ri->request_method, "POST") &&
 | 
	
		
			
				|  |  |          strcmp(ri->request_method, "HEAD") &&
 | 
	
	
		
			
				|  | @@ -4354,7 +4366,7 @@ static void handle_request(struct mg_connection *conn) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  #endif // !NO_CGI
 | 
	
		
			
				|  |  |    } else if (match_prefix(conn->ctx->config[SSI_EXTENSIONS],
 | 
	
		
			
				|  |  | -                          strlen(conn->ctx->config[SSI_EXTENSIONS]),
 | 
	
		
			
				|  |  | +                          (int)strlen(conn->ctx->config[SSI_EXTENSIONS]),
 | 
	
		
			
				|  |  |                            path) > 0) {
 | 
	
		
			
				|  |  |      handle_ssi_file_request(conn, path);
 | 
	
		
			
				|  |  |    } else if (is_not_modified(conn, &file)) {
 | 
	
	
		
			
				|  | @@ -5168,11 +5180,16 @@ static void *master_thread(void *thread_func_param) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void free_context(struct mg_context *ctx) {
 | 
	
		
			
				|  |  |    int i;
 | 
	
		
			
				|  |  | +  if (ctx == NULL) 
 | 
	
		
			
				|  |  | +	  return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Deallocate config parameters
 | 
	
		
			
				|  |  |    for (i = 0; i < NUM_OPTIONS; i++) {
 | 
	
		
			
				|  |  | -    if (ctx->config[i] != NULL)
 | 
	
		
			
				|  |  | -      free(ctx->config[i]);
 | 
	
		
			
				|  |  | +	if (ctx->config[i] != NULL)
 | 
	
		
			
				|  |  | +#ifdef WIN32
 | 
	
		
			
				|  |  | + #pragma warning(suppress: 6001)
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +	  free(ctx->config[i]);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #ifndef NO_SSL
 | 
	
	
		
			
				|  | @@ -5214,6 +5231,7 @@ struct mg_context *mg_start(const struct mg_callbacks *callbacks,
 | 
	
		
			
				|  |  |  #if defined(_WIN32) && !defined(__SYMBIAN32__)
 | 
	
		
			
				|  |  |    WSADATA data;
 | 
	
		
			
				|  |  |    WSAStartup(MAKEWORD(2,2), &data);
 | 
	
		
			
				|  |  | +#pragma warning(suppress: 28125)
 | 
	
		
			
				|  |  |    InitializeCriticalSection(&global_log_file_lock);
 | 
	
		
			
				|  |  |  #endif // _WIN32
 | 
	
		
			
				|  |  |  
 |