diff options
Diffstat (limited to 'Bugs.txt')
-rwxr-xr-x[-rw-r--r--] | Bugs.txt | 311 |
1 files changed, 180 insertions, 131 deletions
@@ -1,81 +1,16 @@ -When manually compiling FreeFileSync, you should also fix the following bugs in its dependent libraries. +When manually compiling FreeFileSync, you should also fix the following bugs in its library dependencies. FreeFileSync generally uses the latest library versions and works with upstream to get the bugs fixed that affect FreeFileSync. Therefore it is not recommended to compile against older library versions than the ones mentioned below. The remaining issues that are yet to be fixed are listed in the following: ------------------ -| libcurl 7.66.0 | +| libcurl 7.67.0 | ------------------ __________________________________________________________________________________________________________ -/lib/setopt.c -https://github.com/curl/curl/pull/4321 - -- if ((arg < CURLFTPMETHOD_DEFAULT) || (arg > CURLFTPMETHOD_SINGLECWD)) -+ if ((arg < CURLFTPMETHOD_DEFAULT) || (arg >= CURLFTPMETHOD_LAST)) - -__________________________________________________________________________________________________________ -https://github.com/curl/curl/pull/4331 - -/include/curl/curl.h - - CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ -+ CURLFTPMETHOD_FULLPATH, //AKA "CURLFTPMETHOD_NOCWD_BUT_THIS_TIME_FOR_REAL" - - -/lib/ftp.h - - FTPFILE_SINGLECWD = 3 /* make one CWD, then SIZE / RETR / STOR on the - file */ -+ FTPFILE_FULLPATH = 4 //AKA "FTPFILE_NOCWD_BUT_THIS_TIME_FOR_REAL" - - /lib/ftp.c - -- if ((data->set.ftp_filemethod == FTPFILE_NOCWD) && -+ if ((data->set.ftp_filemethod == FTPFILE_NOCWD || -+ data->set.ftp_filemethod == FTPFILE_FULLPATH) && - - -+ if (data->set.ftp_filemethod == FTPFILE_FULLPATH) -+ { -+ //no CWDs happened => remember old working dir -+ //ftpc->prevmethod = -+ //ftpc->prevpath = -+ } -+ else -+ { - /* now store a copy of the directory we are in */ - free(ftpc->prevpath); - - [...] - - else - { - ftpc->prevpath = NULL; /* no path */ - free(path); - } - } - -+ } - - - switch (data->set.ftp_filemethod) - { - case FTPFILE_NOCWD: -+ case FTPFILE_FULLPATH: - - -+ if (data->set.ftp_filemethod == FTPFILE_FULLPATH) -+ ftpc->cwddone = TRUE; -+ else - if (ftpc->prevpath) - -__________________________________________________________________________________________________________ https://github.com/curl/curl/issues/1455 -/lib/ftp.c: - Add: static bool is_routable_ip_v4(unsigned int ip[4]) { @@ -89,29 +24,19 @@ Add: } -Remove: if (data->set.ftp_skip_ip) - -Replace with: - - bool skipIp = data->set.ftp_skip_ip; - if (!skipIp && !is_routable_ip_v4(ip)) - { - unsigned int ip_ctrl[4]; - if (4 != sscanf(control_address(conn), "%u.%u.%u.%u", - &ip_ctrl[0], &ip_ctrl[1], &ip_ctrl[2], &ip_ctrl[3]) || - is_routable_ip_v4(ip_ctrl)) - skipIp = true; - } - - if (skipIp) - -__________________________________________________________________________________________________________ -/lib/ftp.c -https://github.com/curl/curl/pull/4332 +- if (data->set.ftp_skip_ip) -- else if (conn->bits.reuse && ftpc->entrypath) -+ else if (conn->bits.reuse && ftpc->entrypath && -+ !(ftpc->dirdepth && ftpc->dirs[0][0] == '/')) //no need to go to entrypath when we have an absolute path ++ bool skipIp = data->set.ftp_skip_ip; ++ if (!skipIp && !is_routable_ip_v4(ip)) ++ { ++ unsigned int ip_ctrl[4]; ++ if (4 != sscanf(control_address(conn), "%u.%u.%u.%u", ++ &ip_ctrl[0], &ip_ctrl[1], &ip_ctrl[2], &ip_ctrl[3]) || ++ is_routable_ip_v4(ip_ctrl)) ++ skipIp = true; ++ } ++ ++ if (skipIp) __________________________________________________________________________________________________________ /lib/ftp.c @@ -121,54 +46,181 @@ https://github.com/curl/curl/issues/4342 + result = ftp_nb_type(conn, data->set.prefer_ascii, FTP_LIST_TYPE); __________________________________________________________________________________________________________ -/lib/ftp.c -https://github.com/curl/curl/pull/4348 - - -- size_t n = strlen(inpath); -- /* Check if path does not end with /, as then we cut off the file part */ -- if (inpath[n - 1] != '/') -- { -- /* chop off the file part if format is dir/dir/file */ -- slashPos = strrchr(inpath, '/'); -- n = slashPos - inpath; -- } - -+ /* chop off the file part if format is dir/file -+ otherwise remove the trailing slash for dir/dir/ -+ and full paths like %2f/ except for / */ -+ size_t n = strrchr(inpath, '/') - inpath; -+ if(n == 0) -+ ++n; -__________________________________________________________________________________________________________ - -/lib/vtls/openssl.c -https://github.com/curl/curl/issues/4329 - - case SSL_ERROR_ZERO_RETURN: /* no more data */ - /* close_notify alert */ -+ if(num == FIRSTSOCKET) - connclose(conn, "TLS close_notify"); -__________________________________________________________________________________________________________ ----------------- | libssh2 1.9.0 | ----------------- __________________________________________________________________________________________________________ +src/session.c +memory leak: https://github.com/libssh2/libssh2/issues/28 + +-if (session->state & LIBSSH2_STATE_NEWKEYS) ++//if (session->state & LIBSSH2_STATE_NEWKEYS) + +__________________________________________________________________________________________________________ move the following constants from src/sftp.h to include/libssh2_sftp.h: #define MAX_SFTP_OUTGOING_SIZE 30000 #define MAX_SFTP_READ_SIZE 30000 + +__________________________________________________________________________________________________________ +src/comp.c +https://github.com/libssh2/libssh2/pull/418 + +_libssh2_comp_methods(LIBSSH2_SESSION* session) +{ ++ #undef compress + if (session->flag.compress) + return comp_methods; + else + return no_comp_methods; +} + +__________________________________________________________________________________________________________ +src/openssl.cpp +properly support ssh-ed25519: https://github.com/libssh2/libssh2/pull/416 + ++static int ++gen_publickey_from_ed_evp(LIBSSH2_SESSION* session, ++ unsigned char** method, ++ size_t* method_len, ++ unsigned char** pubkeydata, ++ size_t* pubkeydata_len, ++ EVP_PKEY* pk) ++{ ++ const char methodName[] = "ssh-ed25519"; ++ unsigned char* methodBuf = NULL; ++ unsigned char* pubKeyBuf = NULL; ++ size_t pubKeyLen = 0; ++ size_t edKeyLen = 0; ++ unsigned char* bufPos = NULL; ++ ++ _libssh2_debug(session, ++ LIBSSH2_TRACE_AUTH, ++ "Computing public key from ED private key envelop"); ++ ++ methodBuf = LIBSSH2_ALLOC(session, sizeof(methodName) - 1); ++ if (!methodBuf) ++ { ++ _libssh2_error(session, LIBSSH2_ERROR_ALLOC, ++ "Unable to allocate memory for private key data"); ++ goto cleanup; ++ } ++ ++ if (EVP_PKEY_get_raw_public_key(pk, NULL, &edKeyLen) != 1) ++ { ++ _libssh2_error(session, LIBSSH2_ERROR_PROTO, ++ "EVP_PKEY_get_raw_public_key failed"); ++ goto cleanup; ++ } ++ ++ pubKeyLen = 4 + sizeof(methodName) - 1 + 4 + edKeyLen; ++ bufPos = pubKeyBuf = LIBSSH2_ALLOC(session, pubKeyLen); ++ if (!pubKeyBuf) ++ { ++ _libssh2_error(session, LIBSSH2_ERROR_ALLOC, ++ "Unable to allocate memory for private key data"); ++ goto cleanup; ++ } ++ ++ _libssh2_store_str(&bufPos, methodName, sizeof(methodName) - 1); ++ _libssh2_store_u32(&bufPos, edKeyLen); ++ ++ if (EVP_PKEY_get_raw_public_key(pk, bufPos, &edKeyLen) != 1) ++ { ++ _libssh2_error(session, LIBSSH2_ERROR_PROTO, ++ "EVP_PKEY_get_raw_public_key failed"); ++ goto cleanup; ++ } ++ ++ memcpy(methodBuf, methodName, sizeof(methodName) - 1); ++ *method = methodBuf; ++ *method_len = sizeof(methodName) - 1; ++ *pubkeydata = pubKeyBuf; ++ *pubkeydata_len = pubKeyLen; ++ return 0; ++ ++cleanup: ++ if (methodBuf) ++ LIBSSH2_FREE(session, methodBuf); ++ if (pubKeyBuf) ++ LIBSSH2_FREE(session, pubKeyBuf); ++ return -1; ++} ++ +static int +gen_publickey_from_ed25519_openssh_priv_data(LIBSSH2_SESSION* session, + struct string_buf* decrypted, + unsigned char** method, + size_t* method_len, + unsigned char** pubkeydata, + + + + +int +_libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx** ed_ctx, + LIBSSH2_SESSION* session, + const char* filedata, + size_t filedata_len, + unsigned const char* passphrase) +{ ++ libssh2_ed25519_ctx* ctx = NULL; ++ ++ _libssh2_init_if_needed(); ++ ++ ctx = _libssh2_ed25519_new_ctx(); ++ if (!ctx) ++ return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, ++ "Unable to allocate memory for ed25519 key"); ++ ++ if (read_private_key_from_memory((void**)&ctx->private_key, (pem_read_bio_func)&PEM_read_bio_PrivateKey, ++ filedata, filedata_len, passphrase) == 0) ++ { ++ if (EVP_PKEY_id(ctx->private_key) != EVP_PKEY_ED25519) ++ { ++ _libssh2_ed25519_free(ctx); ++ return _libssh2_error(session, LIBSSH2_ERROR_PROTO, ++ "Private key is not an ed25519 key"); ++ } ++ ++ *ed_ctx = ctx; ++ return 0; ++ } ++ _libssh2_ed25519_free(ctx); + + return read_openssh_private_key_from_memory((void**)ed_ctx, session, + "ssh-ed25519", + filedata, filedata_len, + passphrase); + + + +#ifdef HAVE_OPAQUE_STRUCTS + pktype = EVP_PKEY_id(pk); +#else + pktype = pk->type; +#endif + + switch (pktype) + { ++#if LIBSSH2_ED25519 ++ case EVP_PKEY_ED25519 : ++ st = gen_publickey_from_ed_evp(session, method, method_len, ++ pubkeydata, pubkeydata_len, pk); ++ break; ++#endif /* LIBSSH2_ED25519 */ + case EVP_PKEY_RSA : + st = gen_publickey_from_rsa_evp(session, method, method_len, __________________________________________________________________________________________________________ - + ------------------------------- | wxWidgets master 2019-07-22 | ------------------------------- __________________________________________________________________________________________________________ -Fix incorrect pane height calculations: - /src/aui/framemanager.cpp: +Fix incorrect pane height calculations: - // determine the dock's minimum size - bool plus_border = false; @@ -202,8 +254,7 @@ Fix incorrect pane height calculations: - dock_min_size += (caption_size); - - dock.min_size = dock_min_size; - - + + // determine the dock's minimum size + int dock_min_size = 0; + for (j = 0; j < dock_pane_count; ++j) @@ -223,18 +274,17 @@ Fix incorrect pane height calculations: + } + + dock.min_size = dock_min_size; -__________________________________________________________________________________________________________ -/src/gtk/menu.cpp: +__________________________________________________________________________________________________________ +/src/gtk/menu.cpp -g_signal_connect(m_menu, "map", G_CALLBACK(menu_map), this); +g_signal_connect(m_menu, "show", G_CALLBACK(menu_map), this); //"map" is never called on Ubuntu Unity, but "show" is -__________________________________________________________________________________________________________ +__________________________________________________________________________________________________________ +/src/gtk/window.cpp Backspace not working in filter dialog: http://www.freefilesync.org/forum/viewtopic.php?t=347 -/src/gtk/window.cpp: - void wxWindowGTK::ConnectWidget( GtkWidget *widget ) { - static bool isSourceAttached; @@ -265,13 +315,12 @@ Backspace not working in filter dialog: http://www.freefilesync.org/forum/viewto +// g_source_set_priority(source, GDK_PRIORITY_EVENTS - 1); +// g_source_attach(source, NULL); +// } -__________________________________________________________________________________________________________ +__________________________________________________________________________________________________________ +/include/wx/window.h wxWidgets/GTK2 on some Linux systems incorrectly detects high DPI: https://freefilesync.org/forum/viewtopic.php?t=6114 => hack away high-DPI support for GTK2 (= pretend GTK2 has device independent pixels, which it clearly has not!) -/include/wx/window.h: - #include "wx/gtk/window.h" - #ifdef __WXGTK3__ + //#ifdef __WXGTK3__ |