Procházet zdrojové kódy

Use UTF8_PATH_MAX and UTF16_PATH_MAX instead of PATH_MAX (see #937)

bel2125 před 4 roky
rodič
revize
d02296ad4a
1 změnil soubory, kde provedl 37 přidání a 37 odebrání
  1. 37 37
      src/civetweb.c

+ 37 - 37
src/civetweb.c

@@ -532,19 +532,18 @@ typedef const char *SOCK_OPT_TYPE;
 /* For a detailed description of these defines, see
  * https://github.com/civetweb/civetweb/issues/937 (Nov 15, 2020). */
 
-/* The Microsoft SDK does not define PATH_MAX, but mingw does. */
-#ifdef PATH_MAX
-#undef PATH_MAX
-#endif
-/* PATH_MAX is a char buffer size for 259 BMP characters in UTF-8 plus
+/* UTF8_PATH_MAX is a char buffer size for 259 BMP characters in UTF-8 plus
  * null termination, rounded up to the next 4 bytes boundary */
-#define PATH_MAX (3 * 260)
-/* W_PATH_MAX is the wchar_t buffer size required for 259 BMP characters
- * plus termination. (Note: wchar_t is 16 bit on Windows) */
-#define W_PATH_MAX (260)
+#define UTF8_PATH_MAX (3 * 260)
+/* UTF16_PATH_MAX is the 16-bit wchar_t buffer size required for 259 BMP
+ * characters plus termination. (Note: wchar_t is 16 bit on Windows) */
+#define UTF16_PATH_MAX (260)
+#else
+/* Linux & co. already use UTF-8 */
+#define UTF8_PATH_MAX (PATH_MAX)
 #endif
 
-mg_static_assert(PATH_MAX >= 12, "path length must be a positive number");
+mg_static_assert(UTF8_PATH_MAX >= 12, "path length must be a positive number");
 
 
 #if !defined(_IN_PORT_T)
@@ -826,7 +825,7 @@ static const char *mg_fgets(char *buf, size_t size, struct mg_file *filep);
 
 /* POSIX dirent interface */
 struct dirent {
-	char d_name[PATH_MAX];
+	char d_name[UTF8_PATH_MAX];
 };
 
 typedef struct DIR {
@@ -1181,8 +1180,8 @@ FUNCTION_MAY_BE_UNUSED
 static int
 rename(const char *a, const char *b)
 {
-	wchar_t wa[W_PATH_MAX];
-	wchar_t wb[W_PATH_MAX];
+	wchar_t wa[UTF16_PATH_MAX];
+	wchar_t wb[UTF16_PATH_MAX];
 	path_to_unicode(NULL, a, wa, ARRAY_SIZE(wa));
 	path_to_unicode(NULL, b, wb, ARRAY_SIZE(wb));
 
@@ -1200,7 +1199,7 @@ FUNCTION_MAY_BE_UNUSED
 static int
 stat(const char *name, struct stat *st)
 {
-	wchar_t wbuf[W_PATH_MAX];
+	wchar_t wbuf[UTF16_PATH_MAX];
 	WIN32_FILE_ATTRIBUTE_DATA attr;
 	time_t creation_time, write_time;
 
@@ -3528,7 +3527,7 @@ mg_fopen(const struct mg_connection *conn,
 
 #if defined(_WIN32)
 	{
-		wchar_t wbuf[W_PATH_MAX];
+		wchar_t wbuf[UTF16_PATH_MAX];
 		path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf));
 		switch (mode) {
 		case MG_FOPEN_MODE_READ:
@@ -4985,7 +4984,7 @@ mg_send_http_error_impl(struct mg_connection *conn,
 	int has_body;
 
 #if !defined(NO_FILESYSTEMS)
-	char path_buf[PATH_MAX];
+	char path_buf[UTF8_PATH_MAX];
 	int len, i, page_handler_found, scope, truncated;
 	const char *error_handler = NULL;
 	struct mg_file error_page_file = STRUCT_FILE_INITIALIZER;
@@ -5581,8 +5580,8 @@ path_to_unicode(const struct mg_connection *conn,
                 wchar_t *wbuf,
                 size_t wbuf_len)
 {
-	char buf[PATH_MAX], buf2[PATH_MAX];
-	wchar_t wbuf2[W_PATH_MAX + 1];
+	char buf[UTF8_PATH_MAX], buf2[UTF8_PATH_MAX];
+	wchar_t wbuf2[UTF16_PATH_MAX + 1];
 	DWORD long_len, err;
 	int (*fcompare)(const wchar_t *, const wchar_t *) = mg_wcscasecmp;
 
@@ -5652,7 +5651,7 @@ mg_stat(const struct mg_connection *conn,
         const char *path,
         struct mg_file_stat *filep)
 {
-	wchar_t wbuf[W_PATH_MAX];
+	wchar_t wbuf[UTF16_PATH_MAX];
 	WIN32_FILE_ATTRIBUTE_DATA info;
 	time_t creation_time;
 	size_t len;
@@ -5700,7 +5699,7 @@ mg_stat(const struct mg_connection *conn,
 static int
 mg_remove(const struct mg_connection *conn, const char *path)
 {
-	wchar_t wbuf[W_PATH_MAX];
+	wchar_t wbuf[UTF16_PATH_MAX];
 	path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf));
 	return DeleteFileW(wbuf) ? 0 : -1;
 }
@@ -5709,7 +5708,7 @@ mg_remove(const struct mg_connection *conn, const char *path)
 static int
 mg_mkdir(const struct mg_connection *conn, const char *path, int mode)
 {
-	wchar_t wbuf[W_PATH_MAX];
+	wchar_t wbuf[UTF16_PATH_MAX];
 	(void)mode;
 	path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf));
 	return CreateDirectoryW(wbuf, NULL) ? 0 : -1;
@@ -5731,7 +5730,7 @@ static DIR *
 mg_opendir(const struct mg_connection *conn, const char *name)
 {
 	DIR *dir = NULL;
-	wchar_t wpath[W_PATH_MAX];
+	wchar_t wpath[UTF16_PATH_MAX];
 	DWORD attrs;
 
 	if (name == NULL) {
@@ -5970,7 +5969,7 @@ FUNCTION_MAY_BE_UNUSED
 static HANDLE
 dlopen(const char *dll_name, int flags)
 {
-	wchar_t wbuf[W_PATH_MAX];
+	wchar_t wbuf[UTF16_PATH_MAX];
 	(void)flags;
 	path_to_unicode(NULL, dll_name, wbuf, ARRAY_SIZE(wbuf));
 	return LoadLibraryW(wbuf);
@@ -6065,7 +6064,7 @@ spawn_process(struct mg_connection *conn,
 	HANDLE me;
 	char *interp;
 	char *interp_arg = 0;
-	char full_dir[PATH_MAX], cmdline[PATH_MAX], buf[PATH_MAX];
+	char full_dir[UTF8_PATH_MAX], cmdline[UTF8_PATH_MAX], buf[UTF8_PATH_MAX];
 	int truncated;
 	struct mg_file file = STRUCT_FILE_INITIALIZER;
 	STARTUPINFOA si;
@@ -7955,7 +7954,7 @@ interpret_uri(struct mg_connection *conn, /* in/out: request (must be valid) */
 	const char *rewrite;
 	struct vec a, b;
 	ptrdiff_t match_len;
-	char gz_path[PATH_MAX];
+	char gz_path[UTF8_PATH_MAX];
 	int truncated;
 #if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE)
 	char *tmp_str;
@@ -8138,7 +8137,8 @@ interpret_uri(struct mg_connection *conn, /* in/out: request (must be valid) */
 	/* Step 10: Script resources may handle sub-resources */
 	/* Support PATH_INFO for CGI scripts. */
 	tmp_str_len = strlen(filename);
-	tmp_str = (char *)mg_malloc_ctx(tmp_str_len + PATH_MAX + 1, conn->phys_ctx);
+	tmp_str =
+	    (char *)mg_malloc_ctx(tmp_str_len + UTF8_PATH_MAX + 1, conn->phys_ctx);
 	if (!tmp_str) {
 		/* Out of memory */
 		goto interpret_cleanup;
@@ -8176,7 +8176,7 @@ interpret_uri(struct mg_connection *conn, /* in/out: request (must be valid) */
 
 			if (allow_substitute_script_subresources) {
 				if (substitute_index_file(
-				        conn, tmp_str, tmp_str_len + PATH_MAX, filestat)) {
+				        conn, tmp_str, tmp_str_len + UTF8_PATH_MAX, filestat)) {
 
 					/* some intermediate directory has an index file */
 					if (extention_matches_script(conn, tmp_str)) {
@@ -8770,7 +8770,7 @@ open_auth_file(struct mg_connection *conn,
                struct mg_file *filep)
 {
 	if ((conn != NULL) && (conn->dom_ctx != NULL)) {
-		char name[PATH_MAX];
+		char name[UTF8_PATH_MAX];
 		const char *p, *e,
 		    *gpass = conn->dom_ctx->config[GLOBAL_PASSWORDS_FILE];
 		int truncated;
@@ -9161,7 +9161,7 @@ static int
 check_authorization(struct mg_connection *conn, const char *path)
 {
 #if !defined(NO_FILESYSTEMS)
-	char fname[PATH_MAX];
+	char fname[UTF8_PATH_MAX];
 	struct vec uri_vec, filename_vec;
 	const char *list;
 	struct mg_file file = STRUCT_FILE_INITIALIZER;
@@ -9302,7 +9302,7 @@ mg_modify_passwords_file(const char *fname,
                          const char *pass)
 {
 	int found, i;
-	char line[512], u[512] = "", d[512] = "", ha1[33], tmp[PATH_MAX + 8];
+	char line[512], u[512] = "", d[512] = "", ha1[33], tmp[UTF8_PATH_MAX + 8];
 	FILE *fp, *fp2;
 
 	found = 0;
@@ -9348,7 +9348,7 @@ mg_modify_passwords_file(const char *fname,
 	}
 
 	/* The maximum length of the path to the password file is limited */
-	if ((strlen(fname) + 4) >= PATH_MAX) {
+	if ((strlen(fname) + 4) >= UTF8_PATH_MAX) {
 		return 0;
 	}
 
@@ -9888,7 +9888,7 @@ scan_directory(struct mg_connection *conn,
                void *data,
                int (*cb)(struct de *, void *))
 {
-	char path[PATH_MAX];
+	char path[UTF8_PATH_MAX];
 	struct dirent *dp;
 	DIR *dirp;
 	struct de de;
@@ -9945,7 +9945,7 @@ scan_directory(struct mg_connection *conn,
 static int
 remove_directory(struct mg_connection *conn, const char *dir)
 {
-	char path[PATH_MAX];
+	char path[UTF8_PATH_MAX];
 	struct dirent *dp;
 	DIR *dirp;
 	struct de de;
@@ -10324,7 +10324,7 @@ handle_static_file_request(struct mg_connection *conn,
 	int64_t cl, r1, r2;
 	struct vec mime_vec;
 	int n, truncated;
-	char gz_path[PATH_MAX];
+	char gz_path[UTF8_PATH_MAX];
 	const char *encoding = 0;
 	const char *origin_hdr;
 	const char *cors_orig_cfg;
@@ -10686,7 +10686,7 @@ mg_send_mime_file2(struct mg_connection *conn,
 static int
 put_dir(struct mg_connection *conn, const char *path)
 {
-	char buf[PATH_MAX];
+	char buf[UTF8_PATH_MAX];
 	const char *s, *p;
 	struct mg_file file = STRUCT_FILE_INITIALIZER;
 	size_t len;
@@ -11697,7 +11697,7 @@ handle_cgi_request(struct mg_connection *conn, const char *prog)
 	int headers_len, data_len, i, truncated;
 	int fdin[2] = {-1, -1}, fdout[2] = {-1, -1}, fderr[2] = {-1, -1};
 	const char *status, *status_text, *connection_state;
-	char *pbuf, dir[PATH_MAX], *p;
+	char *pbuf, dir[UTF8_PATH_MAX], *p;
 	struct mg_request_info ri;
 	struct cgi_environment blk;
 	FILE *in = NULL, *out = NULL, *err = NULL;
@@ -14383,7 +14383,7 @@ static void
 handle_request(struct mg_connection *conn)
 {
 	struct mg_request_info *ri = &conn->request_info;
-	char path[PATH_MAX];
+	char path[UTF8_PATH_MAX];
 	int uri_len, ssl_index;
 	int is_found = 0, is_script_resource = 0, is_websocket_request = 0,
 	    is_put_or_delete_request = 0, is_callback_resource = 0,