public inbox for cygwin-apps-cvs@sourceware.org help / color / mirror / Atom feed
From: corinna@sourceware.org To: cygwin-apps-cvs@sourceware.org Subject: [rebase - The rebase tool, core of the automatic rebase facility during postinstall] branch master, updated. 2b306dafb760311b04633e611e9931ed638ad15b Date: Thu, 11 Jan 2018 22:09:00 -0000 [thread overview] Message-ID: <20180111220920.4198.qmail@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/rebase.git;h=2b306dafb760311b04633e611e9931ed638ad15b commit 2b306dafb760311b04633e611e9931ed638ad15b Author: Corinna Vinschen <corinna@vinschen.de> Date: Thu Jan 11 23:07:57 2018 +0100 Bump to version 4.4.4 https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/rebase.git;h=bfd38364751b12596cf6d987ebcf7e4a7b595980 commit bfd38364751b12596cf6d987ebcf7e4a7b595980 Author: Corinna Vinschen <corinna@vinschen.de> Date: Thu Jan 11 23:07:34 2018 +0100 rework check if DLLs fit into memory * new function check_base_address_sanity, called min loop when trying to evaluate new address for a DLL, as well as checking validity of start address parameter. * Check for invalid `end' index only where it can occur. Signed-off-by: Corinna Vinschen <corinna@vinschen.de> https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/rebase.git;h=f5eb52bf39fb64e45282adf6afbe78371989631a commit f5eb52bf39fb64e45282adf6afbe78371989631a Author: Corinna Vinschen <corinna@vinschen.de> Date: Thu Jan 11 17:09:15 2018 +0100 Patch "out of available DLL slots" patch Commit a7d415a25c1b902a98dbc2b0e2fd8928b58e3f61 introduced a typo which handled the completly innocent situation of reaching the first array member (end ==0) as error. Fix this and only handle indices < 0 as out of slot error. Also, on 64 bit, don't allow rebasing DLLs beneath the Cygwin DLL address since that's reserved for stacks anyway. Signed-off-by: Corinna Vinschen <corinna@vinschen.de> https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/rebase.git;h=f7fcd7485c3da8483e20315d72fb9ac05e3fcc92 commit f7fcd7485c3da8483e20315d72fb9ac05e3fcc92 Author: Corinna Vinschen <corinna@vinschen.de> Date: Thu Jan 11 17:01:50 2018 +0100 merge_image_info: clear up usage of new_base Signed-off-by: Corinna Vinschen <corinna@vinschen.de> https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/rebase.git;h=ea650bfc9262f44de24667f8c96ccb775f7bdf77 commit ea650bfc9262f44de24667f8c96ccb775f7bdf77 Author: Corinna Vinschen <corinna@vinschen.de> Date: Thu Jan 11 17:01:23 2018 +0100 add tags to .gitignore Signed-off-by: Corinna Vinschen <corinna@vinschen.de> Diff: --- .gitignore | 1 + configure.ac | 2 +- rebase.c | 77 +++++++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index c153367..4a8b601 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ autom4te.cache configure +tags diff --git a/configure.ac b/configure.ac index 4c20bde..1dc9bf4 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # configure.ac for rebase AC_PREREQ([2.64]) -AC_INIT([rebase], [4.4.3], [cygwin@cygwin.com]) +AC_INIT([rebase], [4.4.4], [cygwin@cygwin.com]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_SRCDIR([peflags.c]) AC_PREFIX_DEFAULT([/usr]) diff --git a/rebase.c b/rebase.c index 5b52f76..6f98d37 100644 --- a/rebase.c +++ b/rebase.c @@ -67,6 +67,7 @@ WORD machine = IMAGE_FILE_MACHINE_AMD64; WORD machine = IMAGE_FILE_MACHINE_I386; #endif ULONG64 image_base = 0; +ULONG64 low_addr; BOOL down_flag = FALSE; BOOL image_info_flag = FALSE; BOOL image_storage_flag = FALSE; @@ -116,6 +117,30 @@ ULONG cygwin_dll_image_size = 0; #define LONG_PATH_MAX 32768 +int +check_base_address_sanity (ULONG64 addr, BOOL at_start) +{ +#if defined(__CYGWIN__) || defined(__MSYS__) + /* Sanity checks for Cygwin: + * + * - No DLLs below 0x38000000 on 32 bit, W10 1703+ rebase those on + * runtime anyway + * - No DLLs below 0x2:00000000, ever, on 64 bit. + */ + if (addr <= low_addr) + { + if (at_start) + fprintf (stderr, "%s: Invalid Baseaddress 0x%" PRIx64 ", must be > 0x%" PRIx64 "\n", + progname, (uint64_t) addr, (uint64_t) low_addr); + else + fprintf (stderr, "%s: Too many DLLs for available address space: %s\n", + progname, strerror (ENOMEM)); + return -1; + } +#endif + return 0; +} + void gen_progname (const char *arg0) { @@ -743,7 +768,7 @@ merge_image_info () end = img_info_size - 1; while (img_info_list[0].base == 0) { - ULONG64 new_base; + ULONG64 new_base = 0; /* Skip trailing entries as long as there is no hole. */ while (end > 0 @@ -753,28 +778,26 @@ merge_image_info () floating_image_base = img_info_list[end].base; --end; } - /* No hole? We're in serious trouble! */ - if (end <= 0) - { - fprintf (stderr, - "%s: Too many DLLs for available address space: %s\n", - progname, strerror (ENOMEM)); - return -1; - } + /* Test if one of the DLLs with address 0 fits into the hole. */ - for (i = 0, new_base = 0; img_info_list[i].base == 0; ++i, new_base = 0) + for (i = 0; img_info_list[i].base == 0; ++i) { - new_base = floating_image_base - img_info_list[i].slot_size - offset; - if (new_base >= img_info_list[end].base - + img_info_list[end].slot_size + ULONG64 base = floating_image_base - img_info_list[i].slot_size + - offset; + /* Check if address is still valid */ + if (check_base_address_sanity (base, FALSE)) + return -1; + if (base >= img_info_list[end].base + img_info_list[end].slot_size #if defined(__CYGWIN__) || defined(__MSYS__) /* Don't overlap the Cygwin/MSYS DLL. */ - && (new_base >= cygwin_dll_image_base + cygwin_dll_image_size - || new_base + img_info_list[i].slot_size - <= cygwin_dll_image_base) + && (base >= cygwin_dll_image_base + cygwin_dll_image_size + || base + img_info_list[i].slot_size <= cygwin_dll_image_base) #endif ) - break; + { + new_base = base; + break; + } } /* Found a match. Mount into list. */ if (new_base) @@ -791,12 +814,18 @@ merge_image_info () #if defined(__CYGWIN__) || defined(__MSYS__) if (floating_image_base >= cygwin_dll_image_base + cygwin_dll_image_size && img_info_list[end].base < cygwin_dll_image_base) - floating_image_base = cygwin_dll_image_base; + floating_image_base = cygwin_dll_image_base; else #endif { floating_image_base = img_info_list[end].base; - --end; + if (--end < 0) + { + fprintf (stderr, + "%s: Too many DLLs for available address space: %s\n", + progname, strerror (ENOMEM)); + return -1; + } } } @@ -1219,6 +1248,16 @@ parse_args (int argc, char *argv[]) exit (1); } + /* The low address for 32 bit is extremly low, and apparently + W10 1703 and later rebase all DLLs with start addresses < 0x38000000 + at runtime. However, we have so many DLLs that a hardcoded lowest + address of 0x38000000 is just not feasible. */ + low_addr = (machine == IMAGE_FILE_MACHINE_I386) ? 0x001000000ULL + : 0x200000000ULL; + + if (image_base && check_base_address_sanity (image_base, TRUE) < 0) + exit (1); + args_index = optind; /* Initialize db_file and tmp_file from pattern */
reply other threads:[~2018-01-11 22:09 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180111220920.4198.qmail@sourceware.org \ --to=corinna@sourceware.org \ --cc=cygwin-apps-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).