When manually compiling FreeFileSync, you should also fix the following bugs in its dependent libraries. 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 | ------------------ __________________________________________________________________________________________________________ /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]) { if (ip[0] == 127 || //127.0.0.0/8 (localhost) ip[0] == 10 || //10.0.0.0/8 (private) (ip[0] == 192 && ip[1] == 168) || //192.168.0.0/16 (private) (ip[0] == 169 && ip[1] == 254) || //169.254.0.0/16 (link-local) (ip[0] == 172 && ip[1] / 16 == 1)) //172.16.0.0/12 (private) return false; return true; } 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 - 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 __________________________________________________________________________________________________________ /lib/ftp.c https://github.com/curl/curl/issues/4342 - result = ftp_nb_type(conn, TRUE, FTP_LIST_TYPE); + 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 | ----------------- __________________________________________________________________________________________________________ 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 __________________________________________________________________________________________________________ ------------------------------- | wxWidgets master 2019-07-22 | ------------------------------- __________________________________________________________________________________________________________ Fix incorrect pane height calculations: /src/aui/framemanager.cpp: - // determine the dock's minimum size - bool plus_border = false; - bool plus_caption = false; - int dock_min_size = 0; - for (j = 0; j < dock_pane_count; ++j) - { - wxAuiPaneInfo& pane = *dock.panes.Item(j); - if (pane.min_size != wxDefaultSize) - { - if (pane.HasBorder()) - plus_border = true; - if (pane.HasCaption()) - plus_caption = true; - if (dock.IsHorizontal()) - { - if (pane.min_size.y > dock_min_size) - dock_min_size = pane.min_size.y; - } - else - { - if (pane.min_size.x > dock_min_size) - dock_min_size = pane.min_size.x; - } - } - } - - if (plus_border) - dock_min_size += (pane_borderSize*2); - if (plus_caption && dock.IsHorizontal()) - 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) + { + wxAuiPaneInfo& pane = *dock.panes.Item(j); + if (pane.min_size != wxDefaultSize) + { + int paneSize = dock.IsHorizontal() ? pane.min_size.y : pane.min_size.x; + if (pane.HasBorder()) + paneSize += 2 * pane_borderSize; + if (pane.HasCaption() && dock.IsHorizontal()) + paneSize += caption_size; + + if (paneSize > dock_min_size) + dock_min_size = paneSize; + } + } + + dock.min_size = dock_min_size; __________________________________________________________________________________________________________ /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 __________________________________________________________________________________________________________ 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; - if (!isSourceAttached) - { - // attach GSource to detect new GDK events - isSourceAttached = true; - static GSourceFuncs funcs = { - source_prepare, source_check, source_dispatch, - NULL, NULL, NULL - }; - GSource* source = g_source_new(&funcs, sizeof(GSource)); - // priority slightly higher than GDK_PRIORITY_EVENTS - g_source_set_priority(source, GDK_PRIORITY_EVENTS - 1); - g_source_attach(source, NULL); - } +// +// if (!isSourceAttached) +// { +// // attach GSource to detect new GDK events +// isSourceAttached = true; +// static GSourceFuncs funcs = { +// source_prepare, source_check, source_dispatch, +// NULL, NULL, NULL +// }; +// GSource* source = g_source_new(&funcs, sizeof(GSource)); +// // priority slightly higher than GDK_PRIORITY_EVENTS +// g_source_set_priority(source, GDK_PRIORITY_EVENTS - 1); +// g_source_attach(source, NULL); +// } __________________________________________________________________________________________________________ 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__ #define wxHAVE_DPI_INDEPENDENT_PIXELS - #endif + //#endif __________________________________________________________________________________________________________