When manually compiling FreeFileSync, you should also fix the following bugs in its dependent libraries: ---------------- | libcurl Bugs | ---------------- __________________________________________________________________________________________________________ /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/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 */ - connclose(conn, "TLS close_notify"); __________________________________________________________________________________________________________ ---------------- | libssh2 Bugs | ---------------- __________________________________________________________________________________________________________ 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 Bugs | ------------------ __________________________________________________________________________________________________________ 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 __________________________________________________________________________________________________________