Date: Sat, 14 Sep 2013 19:30:09 GMT From: Derek Schrock <dereks@lifeofadishwasher.com> To: freebsd-gnats-submit@FreeBSD.org Subject: bin/182098: [patch] Change kldxref fts_open ordering so it produces a consistent linker.hints between machines of the same architecture. Message-ID: <201309141930.r8EJU9VS087871@oldred.freebsd.org> Resent-Message-ID: <201309141940.r8EJe0jY065331@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 182098 >Category: bin >Synopsis: [patch] Change kldxref fts_open ordering so it produces a consistent linker.hints between machines of the same architecture. >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sat Sep 14 19:40:00 UTC 2013 >Closed-Date: >Last-Modified: >Originator: Derek Schrock >Release: 9.1-RELEASE-p7 >Organization: >Environment: FreeBSD ircbsd 9.1-RELEASE-p7 FreeBSD 9.1-RELEASE-p7 #0: Mon Sep 9 21:34:37 UTC 2013 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64 >Description: Currently there an issue with linker.hints being different between machines that create binary update for freebsd-update. http://www.freebsd.org/cgi/query-pr.cgi?pr=amd64/178247 Use freebsd-update to update: $ freebsd-update fetch Looking up update.FreeBSD.org mirrors... 5 mirrors found. Fetching metadata signature for 9.1-RELEASE from update2.freebsd.org... done. Fetching metadata index... done. Inspecting system... done. Preparing to download files... done. The following files will be updated as part of updating to 9.1-RELEASE-p7: /boot/kernel/linker.hints $ freebsd-update install Installing updates... done. $ freebsd-update fetch Looking up update.FreeBSD.org mirrors... 5 mirrors found. Fetching metadata signature for 9.1-RELEASE from update5.freebsd.org... done. Fetching metadata index... done. Inspecting system... done. Preparing to download files... done. The following files will be updated as part of updating to 9.1-RELEASE-p7: /boot/kernel/linker.hints Looking at /boot/kernel on two different systems: Host A /boot/kernel/: $ sha256 /boot/kernel/* | sha256 6193fe0ea115ae745f8b99273906892d5a8714d7fd55f506f24064ef0396f1eb Host B /boot/kernel: $ sha256 /boot/kernel/* | sha256 6193fe0ea115ae745f8b99273906892d5a8714d7fd55f506f24064ef0396f1eb 'kldxref /boot/kernel/' will produce different linker.hints due to the way the fts_open() traverses the file system: Host A: $ kldxref /boot/kernel/ $ sha256 /boot/kernel/linker.hints SHA256 (/boot/kernel/linker.hints) = 3deeb3eb746b40b009f67238b924c32d1a6d0d586f127aded45bef0010345290 Host B: $ kldxref /boot/kernel/ $ sha256 /boot/kernel/linker.hints SHA256 (/boot/kernel/linker.hints) = ec6c0c80e745371f83faa100f1fe1a36062903c527d20dce7e0161ce26c82e54 If you change fts_open() to order the files in /boot/kernel/ the same linker.hints should be created between systems: Host A: $ ./patched.kldxref /boot/kernel/ $ sha256 /boot/kernel/linker.hints SHA256 (/boot/kernel/linker.hints) = 2bda1a7568108dfb511d5156efce2d4df173dc8e91124e0c9300a5fef90218c8 $ sha256 /boot/kernel/linker.hints SHA256 (/boot/kernel/linker.hints) = 2bda1a7568108dfb511d5156efce2d4df173dc8e91124e0c9300a5fef90218c8 >How-To-Repeat: Find a system the produces a different linker.hints than another system's. Host A: $ kldxref /boot/kernel/ $ sha256 /boot/kernel/linker.hints SHA256 (/boot/kernel/linker.hints) = 3deeb3eb746b40b009f67238b924c32d1a6d0d586f127aded45bef0010345290 Host B: $ kldxref /boot/kernel/ $ sha256 /boot/kernel/linker.hints SHA256 (/boot/kernel/linker.hints) = ec6c0c80e745371f83faa100f1fe1a36062903c527d20dce7e0161ce26c82e54 >Fix: patch kldxref.c to use fts_open() with a compare function to order the filenames. (another possible fix would be to not include linker.hints in freebsd-update binary updates) Patch attached with submission follows: --- kldxref.c.old 2013-09-14 00:31:05.000000000 -0400 +++ kldxref.c 2013-09-14 14:53:53.000000000 -0400 @@ -275,6 +275,16 @@ exit(1); } +int +compare(const FTSENT* const* a, const FTSENT* const* b) +{ + const char *pa = (const char *)((*a)->fts_name); + const char *pb = (const char *)((*b)->fts_name); + size_t as = (*a)->fts_namelen; + size_t bs = (*b)->fts_namelen; + return strncmp(pa, pb, as > bs ? bs : as); +} + int main(int argc, char *argv[]) { @@ -316,7 +326,7 @@ err(1, "%s", argv[0]); } - ftsp = fts_open(argv, fts_options, 0); + ftsp = fts_open(argv, fts_options, compare); if (ftsp == NULL) exit(1); >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309141930.r8EJU9VS087871>