From 04b260571910a69925615a70a2b7dad35eb1f86b Mon Sep 17 00:00:00 2001 From: Xin LI Date: Wed, 13 May 2015 23:07:20 +0000 Subject: [PATCH] Add two recent errata notices. --- .../FreeBSD-EN-15:04.freebsd-update.asc | 156 ++++++ .../advisories/FreeBSD-EN-15:05.ufs.asc | 138 ++++++ .../patches/EN-15:04/freebsd-update-8.patch | 458 ++++++++++++++++++ .../EN-15:04/freebsd-update-8.patch.asc | 17 + .../patches/EN-15:04/freebsd-update.patch | 152 ++++++ .../patches/EN-15:04/freebsd-update.patch.asc | 17 + share/security/patches/EN-15:05/ufs.patch | 313 ++++++++++++ share/security/patches/EN-15:05/ufs.patch.asc | 17 + share/xml/notices.xml | 16 + 9 files changed, 1284 insertions(+) create mode 100644 share/security/advisories/FreeBSD-EN-15:04.freebsd-update.asc create mode 100644 share/security/advisories/FreeBSD-EN-15:05.ufs.asc create mode 100644 share/security/patches/EN-15:04/freebsd-update-8.patch create mode 100644 share/security/patches/EN-15:04/freebsd-update-8.patch.asc create mode 100644 share/security/patches/EN-15:04/freebsd-update.patch create mode 100644 share/security/patches/EN-15:04/freebsd-update.patch.asc create mode 100644 share/security/patches/EN-15:05/ufs.patch create mode 100644 share/security/patches/EN-15:05/ufs.patch.asc diff --git a/share/security/advisories/FreeBSD-EN-15:04.freebsd-update.asc b/share/security/advisories/FreeBSD-EN-15:04.freebsd-update.asc new file mode 100644 index 0000000000..ff1657a23a --- /dev/null +++ b/share/security/advisories/FreeBSD-EN-15:04.freebsd-update.asc @@ -0,0 +1,156 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +============================================================================= +FreeBSD-EN-15:04.freebsd-update Errata Notice + The FreeBSD Project + +Topic: freebsd-update(8) does not ensure the previous upgrade was + completed + +Category: core +Module: freebsd-update +Announced: 2015-05-13 +Credits: Allan Jude +Affects: All supported versions of FreeBSD. +Corrected: 2015-05-13 22:36:00 UTC (stable/10, 10.1-STABLE) + 2015-05-13 22:52:35 UTC (releng/10.1, 10.1-RELEASE-p10) + 2015-05-13 22:36:52 UTC (stable/9, 9.3-STABLE) + 2015-05-13 22:52:51 UTC (releng/9.3, 9.3-RELEASE-p14) + 2015-05-13 22:39:29 UTC (stable/8, 8.4-STABLE) + 2015-05-13 22:52:51 UTC (releng/8.4, 8.4-RELEASE-p28) + +For general information regarding FreeBSD Errata Notices and Security +Advisories, including descriptions of the fields above, security +branches, and the following sections, please visit +. + +I. Background + +The freebsd-update(8) utility is used to apply binary patches to FreeBSD +systems installed from official release images, as an alternative to +rebuilding from source. A freebsd-update(8) build server generates the +signed update packages, consisting of an index of files and directories +with checksums before the update, a set of binary patches, and an +index of files and directories with checksums after the update. The +client downloads the indexes, verifies the signatures and checksums, +then downloads and applies the required patches. + +II. Problem Description + +Binary upgrades using the freebsd-update(8) utility consist of several +invocations of the freebsd-update(8) utility itself. Each invocation +performs a different task that depends on the previous invocation being +successfully completed. + +If an upgrade is not thoroughly completed, it is possible for the +freebsd-update(8) utility to download a subsequent patchset to a system +with an inconsistent userland and/or kernel. In the case of such an +incomplete upgrade, the freebsd-update(8) utility may incorrectly +evaluate the running userland and/or kernel, which can cause binary +patches to be incorrectly applied. In some situations, it is possible +for patches to be applied for the incorrect FreeBSD version. + +III. Impact + +If incorrect patches are applied to the system as a result of a previous +incomplete upgrade, it is possible that some system services may fail to +start after rebooting the system, such as if the service is started by an +executable that depends on a shared library that has been relocated as +part of the upgrade. + +IV. Workaround + +No workaround is available, but systems that do not use FreeBSD-provided +binary updates to upgrade are not affected. + +V. Solution + +Perform one of the following: + +1) Upgrade your system to a supported FreeBSD stable or release / security +branch (releng) dated after the correction date. + +2) To update your present system via a binary patch: + +Systems running a RELEASE version of FreeBSD on the i386 or amd64 +platforms can be updated via the freebsd-update(8) utility: + +# freebsd-update fetch +# freebsd-update install + +3) To update your present system via a source code patch: + +The following patches have been verified to apply to the applicable +FreeBSD release branches. + +a) Download the relevant patch from the location below, and verify the +detached PGP signature using your PGP utility. + +[FreeBSD 9.3 and 10.1] +# fetch https://security.FreeBSD.org/patches/EN-15:04/freebsd-update.patch +# fetch https://security.FreeBSD.org/patches/EN-15:04/freebsd-update.patch.asc +# gpg --verify freebsd-update.patch.asc + +[FreeBSD 8.4] +# fetch https://security.FreeBSD.org/patches/EN-15:04/freebsd-update-8.patch +# fetch https://security.FreeBSD.org/patches/EN-15:04/freebsd-update-8.patch.asc +# gpg --verify freebsd-update-8.patch.asc + +b) Apply the patch. Execute the following commands as root: + +# cd /usr/src +# patch < /path/to/patch + +c) Recompile the operating system using buildworld and installworld as +described in . + +VI. Correction details + +The following list contains the correction revision numbers for each +affected branch. + +Branch/path Revision +- ------------------------------------------------------------------------- +stable/8/ r282872 +releng/8.4/ r282874 +stable/9/ r282871 +releng/9.3/ r282874 +stable/10/ r282870 +releng/10.1/ r282873 +- ------------------------------------------------------------------------- + +To see which files were modified by a particular revision, run the +following command, replacing NNNNNN with the revision number, on a +machine with Subversion installed: + +# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base + +Or visit the following URL, replacing NNNNNN with the revision number: + + + +VII. References + + + +The latest revision of this Errata Notice is available at +https://security.FreeBSD.org/advisories/FreeBSD-EN-15:04.freebsd-update.asc + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.1.2 (FreeBSD) + +iQIcBAEBCgAGBQJVU9dbAAoJEO1n7NZdz2rnCewQAM51TcFY4IZvSJbSe5RLDGRr +4KsAwkgNW45Z+iUjvg5wnnkXZYau1fadMyQilbrKLk9d0MY1dQlJ7lW0Jkk9q+Oq +JhXjanQYvIZKK9eYi0gpVVqp9sN57dpv96ZP+CDiJX9FDow7OPGKmEiJgoavahpb +kg5kOywjDEv/DkttLJgHHmEBK41Gad2Jrz16N6k7mlHFSpFmEGRefaqqPqmLdzs0 +t0liDFI+fIAYOOKgIDG8Gqe3FCqbhnAf3bmkU/gyJKf1o5vPWowo9O5CvGH+mHPl +hmQBD70d+6kkv6ZH5RxMa38Vc3FpZXmaipdObJyoIoOjBw1UqEV6OwS+810xNDCx +bwN5q8QP5l/M7SHDO1n/FyP8BVbk6TXVKJ1R+t1bsKd07synL12gVTe0VVm+w0rh ++TVdF7cFRWB1Rp3JFw7cGz47ZFv08AaZ3CzdoH9qCEKOTnJnkyW3L4hceTWjkF8H +c5gas5Wp3UZeUZ2LT+LcB89W4LSn3Xv3y7AJDsVP9MGHSkjSDGIJKfWiXl/GWHql +M/zT6WeraOZyOwNr4F9QFp1hYSxvR+Izh7C0nFefBNf8YID3/hiKYNjxkf5Dz+fN +4A+RVt3COUteAeF5ikPVUiMfJljubingmN5NvTVmKQN6nRm5Pn6rrOouJqf3W0Mh +QE8Ps/3y/Sw1e/m45snD +=IdxG +-----END PGP SIGNATURE----- diff --git a/share/security/advisories/FreeBSD-EN-15:05.ufs.asc b/share/security/advisories/FreeBSD-EN-15:05.ufs.asc new file mode 100644 index 0000000000..8cebb87208 --- /dev/null +++ b/share/security/advisories/FreeBSD-EN-15:05.ufs.asc @@ -0,0 +1,138 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +============================================================================= +FreeBSD-EN-15:05.ufs Errata Notice + The FreeBSD Project + +Topic: Deadlock on reboot with UFS tuned with SU+J + +Category: core +Module: ufs +Announced: 2015-05-13 +Credits: Konstantin Belousov +Affects: FreeBSD 10.1 +Corrected: 2015-04-10 02:23:44 UTC (stable/10, 10.1-STABLE) + 2015-05-13 22:52:35 UTC (releng/10.1, 10.1-RELEASE-p10) + +For general information regarding FreeBSD Errata Notices and Security +Advisories, including descriptions of the fields above, security +branches, and the following sections, please visit +. + +I. Background + +The Unix File System (UFS) is one of several filesystems available on +FreeBSD. UFS supports several optimization features, such as soft updates +and journaling, both of which keep track of filesystem metadata to ensure +a consistent state in the event of a crash or power failure. + +II. Problem Description + +When the root filesystem is configured with soft updates and journaling +both enabled, which is the default for FreeBSD 10.1-RELEASE installations, +the system may deadlock after a source-based or binary upgrade when the +init(8) binary is replaced. The deadlock occurs when issuing reboot(8) +or shutdown(8), after which the system becomes unresponsive when syncing +the filesystem. + +III. Impact + +When the deadlock occurs, a hard system reset or power cycle may be +required. + +IV. Workaround + +Systems that do not have soft updates and journaling enabled on a UFS root +filesystem are unaffected. + +It is possible to work around the issue by waiting before issuing reboot(8) +or shutdown(8) after upgrading the userland. It has been observed that +deferring the reboot(8) for a period of 60 seconds to be sufficient. It is +encouraged to issue several sync(8) commands during this period, to help +ensure the filesystem writes have completed. + +Additionally, disabling soft update journaling on the root filesystem can +also work around the issue. + +V. Solution + +Perform one of the following: + +1) Upgrade your system to a supported FreeBSD stable or release / security +branch (releng) dated after the correction date. + +2) To update your present system via a binary patch: + +Systems running a RELEASE version of FreeBSD on the i386 or amd64 +platforms can be updated via the freebsd-update(8) utility: + +# freebsd-update fetch +# freebsd-update install + +3) To update your present system via a source code patch: + +The following patches have been verified to apply to the applicable +FreeBSD release branches. + +a) Download the relevant patch from the location below, and verify the +detached PGP signature using your PGP utility. + +# fetch https://security.FreeBSD.org/patches/EN-15:05/ufs.patch +# fetch https://security.FreeBSD.org/patches/EN-15:05/ufs.patch.asc +# gpg --verify ufs.patch.asc + +b) Apply the patch. Execute the following commands as root: + +# cd /usr/src +# patch < /path/to/patch + +c) Recompile your kernel as described in + and reboot the +system. + +VI. Correction details + +The following list contains the correction revision numbers for each +affected branch. + +Branch/path Revision +- ------------------------------------------------------------------------- +stable/10/ r281350 +releng/10.1/ r282873 +- ------------------------------------------------------------------------- + +To see which files were modified by a particular revision, run the +following command, replacing NNNNNN with the revision number, on a +machine with Subversion installed: + +# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base + +Or visit the following URL, replacing NNNNNN with the revision number: + + + +VII. References + + + +The latest revision of this Errata Notice is available at +https://security.FreeBSD.org/advisories/FreeBSD-EN-15:05.ufs.asc + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.1.2 (FreeBSD) + +iQIcBAEBCgAGBQJVU9dbAAoJEO1n7NZdz2rn3JYP/2HeyHsGEAwl+1NCVLu/Eimj +wl/jK7Pl2SMWCEAkynkP8Cs5ibCbtzA4SV1RP8OPCF42yQJmk/kzR0Rmuq+LboFC +QGmus/0Q/JCXqabDEzNx7/tHibeJInveGDf4a4/rg38Q+zO7MYZFmGsWoFEC2RKn +lEWb/kh5AxMagaj5lns4WHmo0TFlyOUFaJijGxXhHu3IFZwuZB60a5cXJ8OjBulk +FO7uIcZ7OTP43y4VvvBsFV6bxeFyoMNF8tgB+dsBzatNQhl7yAxWMMEiDUNBEaqV +mfjKZxHRkB+GGjQwv2Cq4463kNQvwknN9vms536fS7HuecFMITbyD37ySR3pSRoi +KVGopfpDr0NWjn1/N7UyAsY+6CAYqpsilYvq2slBu2J/Aj6jCyDhPUTnjHKz1m91 +rdyBjkHod9XkLYqwCkJlWjIxnLxCDlv8vwUjOe2/TjCUFO6FIO6lgvCVkgekIlwG +rPxx+bqfKSarQQSL6a4MWFFYwt79c292A3nodS0sLIL4YRNwQnFvuYVB/qxIWD1x +ecKJmbL0bm3S1T/qWa89Xh55NWFKs0bxVmjQCWu84re/20+oWcaXFg8Oeqnq+xFV +ke4EzbxhoU4KWzvsFbc+U+EZhTVLVlnjbAW073Z6QyykfBs2RhudUGB51T/3XB3I +jAU8LNkMBjZhe7khLFLD +=BTx0 +-----END PGP SIGNATURE----- diff --git a/share/security/patches/EN-15:04/freebsd-update-8.patch b/share/security/patches/EN-15:04/freebsd-update-8.patch new file mode 100644 index 0000000000..5bfe2383ea --- /dev/null +++ b/share/security/patches/EN-15:04/freebsd-update-8.patch @@ -0,0 +1,458 @@ +Index: usr.sbin/freebsd-update/freebsd-update.8 +=================================================================== +--- usr.sbin/freebsd-update/freebsd-update.8 (revision 282245) ++++ usr.sbin/freebsd-update/freebsd-update.8 (working copy) +@@ -25,7 +25,7 @@ + .\" + .\" $FreeBSD$ + .\" +-.Dd July 14, 2010 ++.Dd March 2, 2015 + .Dt FREEBSD-UPDATE 8 + .Os FreeBSD + .Sh NAME +@@ -36,10 +36,12 @@ + .Op Fl b Ar basedir + .Op Fl d Ar workdir + .Op Fl f Ar conffile ++.Op Fl F + .Op Fl k Ar KEY + .Op Fl r Ar newrelease + .Op Fl s Ar server + .Op Fl t Ar address ++.Op Fl -not-running-from-cron + .Cm command ... + .Sh DESCRIPTION + The +@@ -49,21 +51,21 @@ updates to the FreeBSD base system. + Note that updates are only available if they are being built for the + FreeBSD release and architecture being used; in particular, the + .Fx +-Security Team only builds updates for releases shipped in binary form ++Security Team only builds updates for releases shipped in binary form + by the + .Fx + Release Engineering Team, e.g., + .Fx +-7.3-RELEASE and ++9.3-RELEASE and + .Fx +-8.0, but not ++10.1-RELEASE, but not + .Fx +-6.3-STABLE or ++9.3-STABLE or + .Fx +-9.0-CURRENT. ++11-CURRENT. + .Sh OPTIONS + The following options are supported: +-.Bl -tag -width "-f conffile" ++.Bl -tag -width "-r newrelease" + .It Fl b Ar basedir + Operate on a system mounted at + .Ar basedir . +@@ -81,6 +83,10 @@ Read configuration options from + .Ar conffile . + (default: + .Pa /etc/freebsd-update.conf ) ++.It Fl F ++Force ++.Nm Cm fetch ++to proceed where it normally would not, such as an unfinished upgrade + .It Fl k Ar KEY + Trust an RSA key with SHA256 of + .Ar KEY . +@@ -98,13 +104,21 @@ Mail output of + command, if any, to + .Ar address . + (default: root, or as given in the configuration file.) ++.It Fl -not-running-from-cron ++Force ++.Nm Cm fetch ++to proceed when there is no controlling tty. ++This is for use by automated scripts and orchestration tools. ++Please do not run ++.Nm Cm fetch ++from crontab or similar using this flag, see: ++.Nm Cm cron + .El + .Sh COMMANDS + The + .Cm command + can be any one of the following: +-.Pp +-.Bl -tag -width "-f conffile" ++.Bl -tag -width "rollback" + .It Cm fetch + Based on the currently installed world and the configuration + options set, fetch all available binary updates. +@@ -128,6 +142,11 @@ Fetch files necessary for upgrading to a + Before using this command, make sure that you read the + announcement and release notes for the new release in + case there are any special steps needed for upgrading. ++Note that this command may require up to 500 MB of space in ++.Ar workdir ++depending on which components of the ++.Fx ++base system are installed. + .It Cm install + Install the most recently fetched updates or upgrade. + .It Cm rollback +@@ -149,7 +168,7 @@ other than 3AM, to avoid overly imposing + on the server(s) hosting the updates. + .It + In spite of its name, +-.Cm ++.Nm + IDS should not be relied upon as an "Intrusion Detection + System", since if the system has been tampered with + it cannot be trusted to operate correctly. +@@ -158,11 +177,11 @@ purposes, make sure you boot from a secu + .El + .Sh FILES + .Bl -tag -width "/etc/freebsd-update.conf" +-.It /etc/freebsd-update.conf ++.It Pa /etc/freebsd-update.conf + Default location of the + .Nm + configuration file. +-.It /var/db/freebsd-update/ ++.It Pa /var/db/freebsd-update/ + Default location where + .Nm + stores temporary files and downloaded updates. +@@ -170,4 +189,4 @@ stores temporary files and downloaded up + .Sh SEE ALSO + .Xr freebsd-update.conf 5 + .Sh AUTHORS +-.An Colin Percival Aq cperciva@FreeBSD.org ++.An Colin Percival Aq Mt cperciva@FreeBSD.org +Index: usr.sbin/freebsd-update/freebsd-update.sh +=================================================================== +--- usr.sbin/freebsd-update/freebsd-update.sh (revision 282245) ++++ usr.sbin/freebsd-update/freebsd-update.sh (working copy) +@@ -43,12 +43,15 @@ Options: + (default: /var/db/freebsd-update/) + -f conffile -- Read configuration options from conffile + (default: /etc/freebsd-update.conf) ++ -F -- Force a fetch operation to proceed + -k KEY -- Trust an RSA key with SHA256 hash of KEY + -r release -- Target for upgrade (e.g., 6.2-RELEASE) + -s server -- Server from which to fetch updates + (default: update.FreeBSD.org) + -t address -- Mail output of cron command, if any, to address + (default: root) ++ --not-running-from-cron ++ -- Run without a tty, for use by automated tools + Commands: + fetch -- Fetch updates from server + cron -- Sleep rand(3600) seconds, fetch updates, and send an +@@ -284,6 +287,9 @@ config_TargetRelease () { + else + return 1 + fi ++ if echo ${TARGETRELEASE} | grep -qE '^[0-9.]+$'; then ++ TARGETRELEASE="${TARGETRELEASE}-RELEASE" ++ fi + } + + # Define what happens to output of utilities +@@ -396,6 +402,12 @@ init_params () { + + # No commands specified yet + COMMANDS="" ++ ++ # Force fetch to proceed ++ FORCEFETCH=0 ++ ++ # Run without a TTY ++ NOTTYOK=0 + } + + # Parse the command line +@@ -408,6 +420,12 @@ parse_cmdline () { + if [ ! -z "${CONFFILE}" ]; then usage; fi + shift; CONFFILE="$1" + ;; ++ -F) ++ FORCEFETCH=1 ++ ;; ++ --not-running-from-cron) ++ NOTTYOK=1 ++ ;; + + # Configuration file equivalents + -b) +@@ -569,7 +587,7 @@ fetch_setup_verboselevel () { + # running *-p[0-9]+, strip off the last part; if the + # user is running -SECURITY, call it -RELEASE. Chdir + # into the working directory. +-fetch_check_params () { ++fetchupgrade_check_params () { + export HTTP_USER_AGENT="freebsd-update (${COMMAND}, `uname -r`)" + + _SERVERNAME_z=\ +@@ -577,6 +595,7 @@ fetch_check_params () { + _KEYPRINT_z="Key must be given via -k option or configuration file." + _KEYPRINT_bad="Invalid key fingerprint: " + _WORKDIR_bad="Directory does not exist or is not writable: " ++ _WORKDIR_bad2="Directory is not on a persistent filesystem: " + + if [ -z "${SERVERNAME}" ]; then + echo -n "`basename $0`: " +@@ -600,6 +619,13 @@ fetch_check_params () { + echo ${WORKDIR} + exit 1 + fi ++ case `df -T ${WORKDIR}` in */dev/md[0-9]* | *tmpfs*) ++ echo -n "`basename $0`: " ++ echo -n "${_WORKDIR_bad2}" ++ echo ${WORKDIR} ++ exit 1 ++ ;; ++ esac + chmod 700 ${WORKDIR} + cd ${WORKDIR} || exit 1 + +@@ -652,9 +678,29 @@ fetch_check_params () { + BDHASH=`echo ${BASEDIR} | sha256 -q` + } + ++# Perform sanity checks etc. before fetching updates. ++fetch_check_params () { ++ fetchupgrade_check_params ++ ++ if ! [ -z "${TARGETRELEASE}" ]; then ++ echo -n "`basename $0`: " ++ echo -n "-r option is meaningless with 'fetch' command. " ++ echo "(Did you mean 'upgrade' instead?)" ++ exit 1 ++ fi ++ ++ # Check that we have updates ready to install ++ if [ -f ${BDHASH}-install/kerneldone -a $FORCEFETCH -eq 0 ]; then ++ echo "You have a partially completed upgrade pending" ++ echo "Run '$0 install' first." ++ echo "Run '$0 fetch -F' to proceed anyway." ++ exit 1 ++ fi ++} ++ + # Perform sanity checks etc. before fetching upgrades. + upgrade_check_params () { +- fetch_check_params ++ fetchupgrade_check_params + + # Unless set otherwise, we're upgrading to the same kernel config. + NKERNCONF=${KERNCONF} +@@ -1185,7 +1231,7 @@ fetch_metadata_sanity () { + # Some aliases to save space later: ${P} is a character which can + # appear in a path; ${M} is the four numeric metadata fields; and + # ${H} is a sha256 hash. +- P="[-+./:=%@_[~[:alnum:]]" ++ P="[-+./:=,%@_[~[:alnum:]]" + M="[0-9]+\|[0-9]+\|[0-9]+\|[0-9]+" + H="[0-9a-f]{64}" + +@@ -1456,7 +1502,7 @@ fetch_inspect_system () { + sort -k 3,3 -t '|' > $2.tmp + rm filelist + +- # Check if an error occured during system inspection ++ # Check if an error occurred during system inspection + if [ -f .err ]; then + return 1 + fi +@@ -2240,6 +2286,19 @@ upgrade_oldall_to_oldnew () { + mv $2 $3 + } + ++# Helper for upgrade_merge: Return zero true iff the two files differ only ++# in the contents of their RCS tags. ++samef () { ++ X=`sed -E 's/\\$FreeBSD.*\\$/\$FreeBSD\$/' < $1 | ${SHA256}` ++ Y=`sed -E 's/\\$FreeBSD.*\\$/\$FreeBSD\$/' < $2 | ${SHA256}` ++ ++ if [ $X = $Y ]; then ++ return 0; ++ else ++ return 1; ++ fi ++} ++ + # From the list of "old" files in $1, merge changes in $2 with those in $3, + # and update $3 to reflect the hashes of merged files. + upgrade_merge () { +@@ -2323,6 +2382,14 @@ upgrade_merge () { + + # Ask the user to handle any files which didn't merge. + while read F; do ++ # If the installed file differs from the version in ++ # the old release only due to RCS tag expansion ++ # then just use the version in the new release. ++ if samef merge/old/${F} merge/${OLDRELNUM}/${F}; then ++ cp merge/${RELNUM}/${F} merge/new/${F} ++ continue ++ fi ++ + cat <<-EOF + + The following file could not be merged automatically: ${F} +@@ -2337,9 +2404,18 @@ manually... + # Ask the user to confirm that he likes how the result + # of merging files. + while read F; do +- # Skip files which haven't changed. +- if [ -f merge/new/${F} ] && +- cmp -s merge/old/${F} merge/new/${F}; then ++ # Skip files which haven't changed except possibly ++ # in their RCS tags. ++ if [ -f merge/old/${F} ] && [ -f merge/new/${F} ] && ++ samef merge/old/${F} merge/new/${F}; then ++ continue ++ fi ++ ++ # Skip files where the installed file differs from ++ # the old file only due to RCS tags. ++ if [ -f merge/old/${F} ] && ++ [ -f merge/${OLDRELNUM}/${F} ] && ++ samef merge/old/${F} merge/${OLDRELNUM}/${F}; then + continue + fi + +@@ -2526,6 +2602,10 @@ upgrade_run () { + # Leave a note behind to tell the "install" command that the kernel + # needs to be installed before the world. + touch ${BDHASH}-install/kernelfirst ++ ++ # Remind the user that they need to run "freebsd-update install" ++ # to install the downloaded bits, in case they didn't RTFM. ++ echo "To install the downloaded upgrades, run \"$0 install\"." + } + + # Make sure that all the file hashes mentioned in $@ have corresponding +@@ -2577,14 +2657,14 @@ backup_kernel_finddir () { + while true ; do + # Pathname does not exist, so it is OK use that name + # for backup directory. +- if [ ! -e $BACKUPKERNELDIR ]; then ++ if [ ! -e $BASEDIR/$BACKUPKERNELDIR ]; then + return 0 + fi + + # If directory do exist, we only use if it has our + # marker file. +- if [ -d $BACKUPKERNELDIR -a \ +- -e $BACKUPKERNELDIR/.freebsd-update ]; then ++ if [ -d $BASEDIR/$BACKUPKERNELDIR -a \ ++ -e $BASEDIR/$BACKUPKERNELDIR/.freebsd-update ]; then + return 0 + fi + +@@ -2592,7 +2672,7 @@ backup_kernel_finddir () { + # the end and try again. + CNT=$((CNT + 1)) + if [ $CNT -gt 9 ]; then +- echo "Could not find valid backup dir ($BACKUPKERNELDIR)" ++ echo "Could not find valid backup dir ($BASEDIR/$BACKUPKERNELDIR)" + exit 1 + fi + BACKUPKERNELDIR="`echo $BACKUPKERNELDIR | sed -Ee 's/[0-9]\$//'`" +@@ -2619,17 +2699,17 @@ backup_kernel () { + # Remove old kernel backup files. If $BACKUPKERNELDIR was + # "not ours", backup_kernel_finddir would have exited, so + # deleting the directory content is as safe as we can make it. +- if [ -d $BACKUPKERNELDIR ]; then +- rm -fr $BACKUPKERNELDIR ++ if [ -d $BASEDIR/$BACKUPKERNELDIR ]; then ++ rm -fr $BASEDIR/$BACKUPKERNELDIR + fi + + # Create directories for backup. +- mkdir -p $BACKUPKERNELDIR +- mtree -cdn -p "${KERNELDIR}" | \ +- mtree -Ue -p "${BACKUPKERNELDIR}" > /dev/null ++ mkdir -p $BASEDIR/$BACKUPKERNELDIR ++ mtree -cdn -p "${BASEDIR}/${KERNELDIR}" | \ ++ mtree -Ue -p "${BASEDIR}/${BACKUPKERNELDIR}" > /dev/null + + # Mark the directory as having been created by freebsd-update. +- touch $BACKUPKERNELDIR/.freebsd-update ++ touch $BASEDIR/$BACKUPKERNELDIR/.freebsd-update + if [ $? -ne 0 ]; then + echo "Could not create kernel backup directory" + exit 1 +@@ -2647,8 +2727,8 @@ backup_kernel () { + fi + + # Backup all the kernel files using hardlinks. +- (cd $KERNELDIR && find . -type f $FINDFILTER -exec \ +- cp -pl '{}' ${BACKUPKERNELDIR}/'{}' \;) ++ (cd ${BASEDIR}/${KERNELDIR} && find . -type f $FINDFILTER -exec \ ++ cp -pl '{}' ${BASEDIR}/${BACKUPKERNELDIR}/'{}' \;) + + # Re-enable patchname expansion. + set +f +@@ -2746,7 +2826,7 @@ install_files () { + + # Update linker.hints if necessary + if [ -s INDEX-OLD -o -s INDEX-NEW ]; then +- kldxref -R /boot/ 2>/dev/null ++ kldxref -R ${BASEDIR}/boot/ 2>/dev/null + fi + + # We've finished updating the kernel. +@@ -2797,14 +2877,14 @@ Kernel updates have been installed. Ple + install_delete INDEX-OLD INDEX-NEW || return 1 + + # Rebuild /etc/spwd.db and /etc/pwd.db if necessary. +- if [ /etc/master.passwd -nt /etc/spwd.db ] || +- [ /etc/master.passwd -nt /etc/pwd.db ]; then +- pwd_mkdb /etc/master.passwd ++ if [ ${BASEDIR}/etc/master.passwd -nt ${BASEDIR}/etc/spwd.db ] || ++ [ ${BASEDIR}/etc/master.passwd -nt ${BASEDIR}/etc/pwd.db ]; then ++ pwd_mkdb -d ${BASEDIR}/etc ${BASEDIR}/etc/master.passwd + fi + + # Rebuild /etc/login.conf.db if necessary. +- if [ /etc/login.conf -nt /etc/login.conf.db ]; then +- cap_mkdb /etc/login.conf ++ if [ ${BASEDIR}/etc/login.conf -nt ${BASEDIR}/etc/login.conf.db ]; then ++ cap_mkdb ${BASEDIR}/etc/login.conf + fi + + # We've finished installing the world and deleting old files +@@ -3011,21 +3091,8 @@ IDS_compare () { + mv INDEX-NOTMATCHING.tmp INDEX-NOTMATCHING + + # Go through the lines and print warnings. +- while read LINE; do +- FPATH=`echo "${LINE}" | cut -f 1 -d '|'` +- TYPE=`echo "${LINE}" | cut -f 2 -d '|'` +- OWNER=`echo "${LINE}" | cut -f 3 -d '|'` +- GROUP=`echo "${LINE}" | cut -f 4 -d '|'` +- PERM=`echo "${LINE}" | cut -f 5 -d '|'` +- HASH=`echo "${LINE}" | cut -f 6 -d '|'` +- LINK=`echo "${LINE}" | cut -f 7 -d '|'` +- P_TYPE=`echo "${LINE}" | cut -f 8 -d '|'` +- P_OWNER=`echo "${LINE}" | cut -f 9 -d '|'` +- P_GROUP=`echo "${LINE}" | cut -f 10 -d '|'` +- P_PERM=`echo "${LINE}" | cut -f 11 -d '|'` +- P_HASH=`echo "${LINE}" | cut -f 12 -d '|'` +- P_LINK=`echo "${LINE}" | cut -f 13 -d '|'` +- ++ local IFS='|' ++ while read FPATH TYPE OWNER GROUP PERM HASH LINK P_TYPE P_OWNER P_GROUP P_PERM P_HASH P_LINK; do + # Warn about different object types. + if ! [ "${TYPE}" = "${P_TYPE}" ]; then + echo -n "${FPATH} is a " +@@ -3153,7 +3220,7 @@ get_params () { + # Fetch command. Make sure that we're being called + # interactively, then run fetch_check_params and fetch_run + cmd_fetch () { +- if [ ! -t 0 ]; then ++ if [ ! -t 0 -a $NOTTYOK -eq 0 ]; then + echo -n "`basename $0` fetch should not " + echo "be run non-interactively." + echo "Run `basename $0` cron instead." diff --git a/share/security/patches/EN-15:04/freebsd-update-8.patch.asc b/share/security/patches/EN-15:04/freebsd-update-8.patch.asc new file mode 100644 index 0000000000..3af027502f --- /dev/null +++ b/share/security/patches/EN-15:04/freebsd-update-8.patch.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.1.2 (FreeBSD) + +iQIcBAABCgAGBQJVU9dpAAoJEO1n7NZdz2rnLP8QAIxBQd1NKef3YVnFMGuppEoy +Tc9/vhtEZfiI78fvMaLK9uLwKZWLx+JS6HTXNmEWzy6Tg+WX4pYMzGGDxGG2RVSz +C/Ur1bZVqNvcyKPK5+xO94asFVYcrcuYSbxMbjYPUjH5WTrySznPvjCF3E4puGvZ +e+FFTvoQ7bwY/qs5drAYo6nK74/rm4YuESxH/3t056vuhSVj8bM12ADHZ+evOzRE +4DFtxDB+9CdtGmqCfvaF0kJn+6IhwqGsRx1pUvriYdvVYzDa+tJBPDk82P0xphgq +Lsid+fjQl/3q0c8CgNNvDArYQACqZUZtqrDzxIx+UOvCz5FeowIhWypEPy5Je2YK +Qnzj6bd4cwF/WwncXGnZDj4Sybv+EJAF+l4s18B9B4v84/M91Gmq+9JgjJQtWPw7 +mI/G7jD3TrYXzzfyIBJJV/6yH/oOwZXZrhHaHHb6s2PuOhEZw5RzG2qXaWhvVQ3p +3X6+zs2okCrzOm9VYDFJIgVJOo8zVjgX+rqH0A/qjhcZK64sr5gh6F0I4LNwE+AV +9DFC9ysIG+Cay28XnEQy0lHpA6MBFWpDZnm/qX4jhIscPGG/3mhLpn7N+L62pgxu +eCAO8wW11w2fcJ575SADcHmQa8rXR/wIbDIx2tmgOFDmJI6MGKj4tU4SUJCm5Blf +GPWANnnxoBwF2Pe/NLCs +=vvQY +-----END PGP SIGNATURE----- diff --git a/share/security/patches/EN-15:04/freebsd-update.patch b/share/security/patches/EN-15:04/freebsd-update.patch new file mode 100644 index 0000000000..ab86a66a45 --- /dev/null +++ b/share/security/patches/EN-15:04/freebsd-update.patch @@ -0,0 +1,152 @@ +Index: usr.sbin/freebsd-update/freebsd-update.8 +=================================================================== +--- usr.sbin/freebsd-update/freebsd-update.8 (revision 282245) ++++ usr.sbin/freebsd-update/freebsd-update.8 (working copy) +@@ -25,7 +25,7 @@ + .\" + .\" $FreeBSD$ + .\" +-.Dd July 14, 2010 ++.Dd March 2, 2015 + .Dt FREEBSD-UPDATE 8 + .Os FreeBSD + .Sh NAME +@@ -36,10 +36,12 @@ + .Op Fl b Ar basedir + .Op Fl d Ar workdir + .Op Fl f Ar conffile ++.Op Fl F + .Op Fl k Ar KEY + .Op Fl r Ar newrelease + .Op Fl s Ar server + .Op Fl t Ar address ++.Op Fl -not-running-from-cron + .Cm command ... + .Sh DESCRIPTION + The +@@ -54,16 +56,16 @@ by the + .Fx + Release Engineering Team, e.g., + .Fx +-7.3-RELEASE and ++9.3-RELEASE and + .Fx +-8.0-RELEASE, but not ++10.1-RELEASE, but not + .Fx +-6.3-STABLE or ++9.3-STABLE or + .Fx +-9.0-CURRENT. ++11-CURRENT. + .Sh OPTIONS + The following options are supported: +-.Bl -tag -width "-f conffile" ++.Bl -tag -width "-r newrelease" + .It Fl b Ar basedir + Operate on a system mounted at + .Ar basedir . +@@ -81,6 +83,10 @@ Read configuration options from + .Ar conffile . + (default: + .Pa /etc/freebsd-update.conf ) ++.It Fl F ++Force ++.Nm Cm fetch ++to proceed where it normally would not, such as an unfinished upgrade + .It Fl k Ar KEY + Trust an RSA key with SHA256 of + .Ar KEY . +@@ -98,12 +104,21 @@ Mail output of + command, if any, to + .Ar address . + (default: root, or as given in the configuration file.) ++.It Fl -not-running-from-cron ++Force ++.Nm Cm fetch ++to proceed when there is no controlling tty. ++This is for use by automated scripts and orchestration tools. ++Please do not run ++.Nm Cm fetch ++from crontab or similar using this flag, see: ++.Nm Cm cron + .El + .Sh COMMANDS + The + .Cm command + can be any one of the following: +-.Bl -tag -width "-f conffile" ++.Bl -tag -width "rollback" + .It Cm fetch + Based on the currently installed world and the configuration + options set, fetch all available binary updates. +Index: usr.sbin/freebsd-update/freebsd-update.sh +=================================================================== +--- usr.sbin/freebsd-update/freebsd-update.sh (revision 282245) ++++ usr.sbin/freebsd-update/freebsd-update.sh (working copy) +@@ -43,12 +43,15 @@ Options: + (default: /var/db/freebsd-update/) + -f conffile -- Read configuration options from conffile + (default: /etc/freebsd-update.conf) ++ -F -- Force a fetch operation to proceed + -k KEY -- Trust an RSA key with SHA256 hash of KEY + -r release -- Target for upgrade (e.g., 6.2-RELEASE) + -s server -- Server from which to fetch updates + (default: update.FreeBSD.org) + -t address -- Mail output of cron command, if any, to address + (default: root) ++ --not-running-from-cron ++ -- Run without a tty, for use by automated tools + Commands: + fetch -- Fetch updates from server + cron -- Sleep rand(3600) seconds, fetch updates, and send an +@@ -399,6 +402,12 @@ init_params () { + + # No commands specified yet + COMMANDS="" ++ ++ # Force fetch to proceed ++ FORCEFETCH=0 ++ ++ # Run without a TTY ++ NOTTYOK=0 + } + + # Parse the command line +@@ -411,6 +420,12 @@ parse_cmdline () { + if [ ! -z "${CONFFILE}" ]; then usage; fi + shift; CONFFILE="$1" + ;; ++ -F) ++ FORCEFETCH=1 ++ ;; ++ --not-running-from-cron) ++ NOTTYOK=1 ++ ;; + + # Configuration file equivalents + -b) +@@ -665,6 +680,14 @@ fetch_check_params () { + echo "(Did you mean 'upgrade' instead?)" + exit 1 + fi ++ ++ # Check that we have updates ready to install ++ if [ -f ${BDHASH}-install/kerneldone -a $FORCEFETCH -eq 0 ]; then ++ echo "You have a partially completed upgrade pending" ++ echo "Run '$0 install' first." ++ echo "Run '$0 fetch -F' to proceed anyway." ++ exit 1 ++ fi + } + + # Perform sanity checks etc. before fetching upgrades. +@@ -3202,7 +3225,7 @@ get_params () { + # Fetch command. Make sure that we're being called + # interactively, then run fetch_check_params and fetch_run + cmd_fetch () { +- if [ ! -t 0 ]; then ++ if [ ! -t 0 -a $NOTTYOK -eq 0 ]; then + echo -n "`basename $0` fetch should not " + echo "be run non-interactively." + echo "Run `basename $0` cron instead." diff --git a/share/security/patches/EN-15:04/freebsd-update.patch.asc b/share/security/patches/EN-15:04/freebsd-update.patch.asc new file mode 100644 index 0000000000..acad5b8190 --- /dev/null +++ b/share/security/patches/EN-15:04/freebsd-update.patch.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.1.2 (FreeBSD) + +iQIcBAABCgAGBQJVU9dqAAoJEO1n7NZdz2rnZggQAKiJ0+2WY1gDvdWDkj0BcIcY +OCig1qDeuZLwDEFfqdqwoEJb7XoYI2tRQu4D/edxe5WAGQNOdIe3cOk/hIvC0Ozi +O/EpsZSf1RBrDBXdIDXc8C3BPeqcr5OYdc/XMZAoW14BTKU8K6ZsZyvoFcEInp5y +Qf0MvMB5QwO4e1LSJEVaT3kNLJuEVdoFzYh6h1e5Tlh7tcnrys9eReKO1SsRIEmp +zmCjfxaAjtftJyw+hxDuid0xkyyi8azPnl3U4JeIMsZE/KIrpAiMTjfnUPznIaai +x6SgIkKQaK7+43mZ92UOqWM3ELHaxWx55aNfX49aDWBIw4SpFqZAkfKt0FPd3Ws1 +Qdo06D8861mT9klQUsYNPrLed6cku6T1PA+bY6dBE3HpL0wlzm8PGdbPe3lLTcM9 +SP5SMMg8Jwy8oi7foyWeD2cibU5VzZRQEIwcQoI/d0Cayj85Oz6KDEtgwpUYDVL/ +sjrRr6ViA8b3qoS7+Ek9nksGUHg5DPOV9sllWZi2JWYn5tR0boRe16Ecb92chylS +VIEz0gwCy46VxAXmrTSa4qUM6uIeoMZXx84b/E8R92KvPXdBGMNhCXoEqEFYertd +prk3LlwUyXbuhkgziBJK6b+zN9ZshL/jY4kjjHCpjd7aNruRnUr9qr43dEJuMOPj +DuwqCaCT3VTyEObhW6Io +=bxKG +-----END PGP SIGNATURE----- diff --git a/share/security/patches/EN-15:05/ufs.patch b/share/security/patches/EN-15:05/ufs.patch new file mode 100644 index 0000000000..6b20fdee80 --- /dev/null +++ b/share/security/patches/EN-15:05/ufs.patch @@ -0,0 +1,313 @@ +Index: sys/ufs/ffs/ffs_softdep.c +=================================================================== +--- sys/ufs/ffs/ffs_softdep.c (revision 282245) ++++ sys/ufs/ffs/ffs_softdep.c (working copy) +@@ -735,9 +735,10 @@ static struct malloc_type *memtype[] = { + static void check_clear_deps(struct mount *); + static void softdep_error(char *, int); + static int softdep_process_worklist(struct mount *, int); +-static int softdep_waitidle(struct mount *); ++static int softdep_waitidle(struct mount *, int); + static void drain_output(struct vnode *); + static struct buf *getdirtybuf(struct buf *, struct rwlock *, int); ++static int check_inodedep_free(struct inodedep *); + static void clear_remove(struct mount *); + static void clear_inodedeps(struct mount *); + static void unlinked_inodedep(struct mount *, struct inodedep *); +@@ -1377,6 +1378,10 @@ softdep_flush(addr) + mp = (struct mount *)addr; + ump = VFSTOUFS(mp); + atomic_add_int(&stat_flush_threads, 1); ++ ACQUIRE_LOCK(ump); ++ ump->softdep_flags &= ~FLUSH_STARTING; ++ wakeup(&ump->softdep_flushtd); ++ FREE_LOCK(ump); + if (print_threads) { + if (stat_flush_threads == 1) + printf("Running %s at pid %d\n", bufdaemonproc->p_comm, +@@ -1389,7 +1394,7 @@ softdep_flush(addr) + VFSTOUFS(mp)->softdep_jblocks->jb_suspended)) + kthread_suspend_check(); + ACQUIRE_LOCK(ump); +- if ((ump->softdep_flags & FLUSH_CLEANUP) == 0) ++ if ((ump->softdep_flags & (FLUSH_CLEANUP | FLUSH_EXIT)) == 0) + msleep(&ump->softdep_flushtd, LOCK_PTR(ump), PVM, + "sdflush", hz / 2); + ump->softdep_flags &= ~FLUSH_CLEANUP; +@@ -1419,11 +1424,9 @@ worklist_speedup(mp) + + ump = VFSTOUFS(mp); + LOCK_OWNED(ump); +- if ((ump->softdep_flags & (FLUSH_CLEANUP | FLUSH_EXIT)) == 0) { ++ if ((ump->softdep_flags & (FLUSH_CLEANUP | FLUSH_EXIT)) == 0) + ump->softdep_flags |= FLUSH_CLEANUP; +- if (ump->softdep_flushtd->td_wchan == &ump->softdep_flushtd) +- wakeup(&ump->softdep_flushtd); +- } ++ wakeup(&ump->softdep_flushtd); + } + + static int +@@ -1468,14 +1471,10 @@ softdep_speedup(ump) + TAILQ_INSERT_TAIL(&softdepmounts, sdp, sd_next); + FREE_GBLLOCK(&lk); + if ((altump->softdep_flags & +- (FLUSH_CLEANUP | FLUSH_EXIT)) == 0) { ++ (FLUSH_CLEANUP | FLUSH_EXIT)) == 0) + altump->softdep_flags |= FLUSH_CLEANUP; +- altump->um_softdep->sd_cleanups++; +- if (altump->softdep_flushtd->td_wchan == +- &altump->softdep_flushtd) { +- wakeup(&altump->softdep_flushtd); +- } +- } ++ altump->um_softdep->sd_cleanups++; ++ wakeup(&altump->softdep_flushtd); + FREE_LOCK(altump); + } + } +@@ -1887,8 +1886,8 @@ softdep_flushworklist(oldmnt, countp, td + struct thread *td; + { + struct vnode *devvp; +- int count, error = 0; + struct ufsmount *ump; ++ int count, error; + + /* + * Alternately flush the block device associated with the mount +@@ -1897,6 +1896,7 @@ softdep_flushworklist(oldmnt, countp, td + * are found. + */ + *countp = 0; ++ error = 0; + ump = VFSTOUFS(oldmnt); + devvp = ump->um_devvp; + while ((count = softdep_process_worklist(oldmnt, 1)) > 0) { +@@ -1904,36 +1904,47 @@ softdep_flushworklist(oldmnt, countp, td + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); + error = VOP_FSYNC(devvp, MNT_WAIT, td); + VOP_UNLOCK(devvp, 0); +- if (error) ++ if (error != 0) + break; + } + return (error); + } + ++#define SU_WAITIDLE_RETRIES 20 + static int +-softdep_waitidle(struct mount *mp) ++softdep_waitidle(struct mount *mp, int flags __unused) + { + struct ufsmount *ump; +- int error; +- int i; ++ struct vnode *devvp; ++ struct thread *td; ++ int error, i; + + ump = VFSTOUFS(mp); ++ devvp = ump->um_devvp; ++ td = curthread; ++ error = 0; + ACQUIRE_LOCK(ump); +- for (i = 0; i < 10 && ump->softdep_deps; i++) { ++ for (i = 0; i < SU_WAITIDLE_RETRIES && ump->softdep_deps != 0; i++) { + ump->softdep_req = 1; +- if (ump->softdep_on_worklist) +- panic("softdep_waitidle: work added after flush."); +- msleep(&ump->softdep_deps, LOCK_PTR(ump), PVM, "softdeps", 1); ++ KASSERT((flags & FORCECLOSE) == 0 || ++ ump->softdep_on_worklist == 0, ++ ("softdep_waitidle: work added after flush")); ++ msleep(&ump->softdep_deps, LOCK_PTR(ump), PVM | PDROP, ++ "softdeps", 10 * hz); ++ vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); ++ error = VOP_FSYNC(devvp, MNT_WAIT, td); ++ VOP_UNLOCK(devvp, 0); ++ if (error != 0) ++ break; ++ ACQUIRE_LOCK(ump); + } + ump->softdep_req = 0; +- FREE_LOCK(ump); +- error = 0; +- if (i == 10) { ++ if (i == SU_WAITIDLE_RETRIES && error == 0 && ump->softdep_deps != 0) { + error = EBUSY; + printf("softdep_waitidle: Failed to flush worklist for %p\n", + mp); + } +- ++ FREE_LOCK(ump); + return (error); + } + +@@ -1990,7 +2001,7 @@ retry_flush: + error = EBUSY; + } + if (!error) +- error = softdep_waitidle(oldmnt); ++ error = softdep_waitidle(oldmnt, flags); + if (!error) { + if (oldmnt->mnt_kern_flag & MNTK_UNMOUNT) { + retry = 0; +@@ -2490,9 +2501,18 @@ softdep_mount(devvp, mp, fs, cred) + /* + * Start our flushing thread in the bufdaemon process. + */ ++ ACQUIRE_LOCK(ump); ++ ump->softdep_flags |= FLUSH_STARTING; ++ FREE_LOCK(ump); + kproc_kthread_add(&softdep_flush, mp, &bufdaemonproc, + &ump->softdep_flushtd, 0, 0, "softdepflush", "%s worker", + mp->mnt_stat.f_mntonname); ++ ACQUIRE_LOCK(ump); ++ while ((ump->softdep_flags & FLUSH_STARTING) != 0) { ++ msleep(&ump->softdep_flushtd, LOCK_PTR(ump), PVM, "sdstart", ++ hz / 2); ++ } ++ FREE_LOCK(ump); + /* + * When doing soft updates, the counters in the + * superblock may have gotten out of sync. Recomputation +@@ -7629,17 +7649,13 @@ check_inode_unwritten(inodedep) + return (1); + } + +-/* +- * Try to free an inodedep structure. Return 1 if it could be freed. +- */ + static int +-free_inodedep(inodedep) ++check_inodedep_free(inodedep) + struct inodedep *inodedep; + { + + LOCK_OWNED(VFSTOUFS(inodedep->id_list.wk_mp)); +- if ((inodedep->id_state & (ONWORKLIST | UNLINKED)) != 0 || +- (inodedep->id_state & ALLCOMPLETE) != ALLCOMPLETE || ++ if ((inodedep->id_state & ALLCOMPLETE) != ALLCOMPLETE || + !LIST_EMPTY(&inodedep->id_dirremhd) || + !LIST_EMPTY(&inodedep->id_pendinghd) || + !LIST_EMPTY(&inodedep->id_bufwait) || +@@ -7654,6 +7670,21 @@ free_inodedep(inodedep) + inodedep->id_nlinkdelta != 0 || + inodedep->id_savedino1 != NULL) + return (0); ++ return (1); ++} ++ ++/* ++ * Try to free an inodedep structure. Return 1 if it could be freed. ++ */ ++static int ++free_inodedep(inodedep) ++ struct inodedep *inodedep; ++{ ++ ++ LOCK_OWNED(VFSTOUFS(inodedep->id_list.wk_mp)); ++ if ((inodedep->id_state & (ONWORKLIST | UNLINKED)) != 0 || ++ !check_inodedep_free(inodedep)) ++ return (0); + if (inodedep->id_state & ONDEPLIST) + LIST_REMOVE(inodedep, id_deps); + LIST_REMOVE(inodedep, id_hash); +@@ -13838,7 +13869,8 @@ softdep_check_suspend(struct mount *mp, + { + struct bufobj *bo; + struct ufsmount *ump; +- int error; ++ struct inodedep *inodedep; ++ int error, unlinked; + + bo = &devvp->v_bufobj; + ASSERT_BO_WLOCKED(bo); +@@ -13899,6 +13931,20 @@ softdep_check_suspend(struct mount *mp, + break; + } + ++ unlinked = 0; ++ if (MOUNTEDSUJ(mp)) { ++ for (inodedep = TAILQ_FIRST(&ump->softdep_unlinked); ++ inodedep != NULL; ++ inodedep = TAILQ_NEXT(inodedep, id_unlinked)) { ++ if ((inodedep->id_state & (UNLINKED | UNLINKLINKS | ++ UNLINKONLIST)) != (UNLINKED | UNLINKLINKS | ++ UNLINKONLIST) || ++ !check_inodedep_free(inodedep)) ++ continue; ++ unlinked++; ++ } ++ } ++ + /* + * Reasons for needing more work before suspend: + * - Dirty buffers on devvp. +@@ -13908,8 +13954,8 @@ softdep_check_suspend(struct mount *mp, + error = 0; + if (bo->bo_numoutput > 0 || + bo->bo_dirty.bv_cnt > 0 || +- softdep_depcnt != 0 || +- ump->softdep_deps != 0 || ++ softdep_depcnt != unlinked || ++ ump->softdep_deps != unlinked || + softdep_accdepcnt != ump->softdep_accdeps || + secondary_writes != 0 || + mp->mnt_secondary_writes != 0 || +Index: sys/ufs/ffs/ffs_vfsops.c +=================================================================== +--- sys/ufs/ffs/ffs_vfsops.c (revision 282245) ++++ sys/ufs/ffs/ffs_vfsops.c (working copy) +@@ -1502,8 +1502,11 @@ ffs_sync(mp, waitfor) + if (fs->fs_fmod != 0 && fs->fs_ronly != 0 && ump->um_fsckpid == 0) + panic("%s: ffs_sync: modification on read-only filesystem", + fs->fs_fsmnt); +- if (waitfor == MNT_LAZY) +- return (ffs_sync_lazy(mp)); ++ if (waitfor == MNT_LAZY) { ++ if (!rebooting) ++ return (ffs_sync_lazy(mp)); ++ waitfor = MNT_NOWAIT; ++ } + + /* + * Write back each (modified) inode. +@@ -1560,7 +1563,7 @@ loop: + /* + * Force stale filesystem control information to be flushed. + */ +- if (waitfor == MNT_WAIT) { ++ if (waitfor == MNT_WAIT || rebooting) { + if ((error = softdep_flushworklist(ump->um_mountp, &count, td))) + allerror = error; + /* Flushed work items may create new vnodes to clean */ +@@ -1577,9 +1580,12 @@ loop: + if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) { + BO_UNLOCK(bo); + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); +- if ((error = VOP_FSYNC(devvp, waitfor, td)) != 0) +- allerror = error; ++ error = VOP_FSYNC(devvp, waitfor, td); + VOP_UNLOCK(devvp, 0); ++ if (MOUNTEDSOFTDEP(mp) && (error == 0 || error == EAGAIN)) ++ error = ffs_sbupdate(ump, waitfor, 0); ++ if (error != 0) ++ allerror = error; + if (allerror == 0 && waitfor == MNT_WAIT) + goto loop; + } else if (suspend != 0) { +Index: sys/ufs/ffs/softdep.h +=================================================================== +--- sys/ufs/ffs/softdep.h (revision 282245) ++++ sys/ufs/ffs/softdep.h (working copy) +@@ -1063,6 +1063,8 @@ struct mount_softdeps { + */ + #define FLUSH_EXIT 0x0001 /* time to exit */ + #define FLUSH_CLEANUP 0x0002 /* need to clear out softdep structures */ ++#define FLUSH_STARTING 0x0004 /* flush thread not yet started */ ++ + /* + * Keep the old names from when these were in the ufsmount structure. + */ diff --git a/share/security/patches/EN-15:05/ufs.patch.asc b/share/security/patches/EN-15:05/ufs.patch.asc new file mode 100644 index 0000000000..d90043d028 --- /dev/null +++ b/share/security/patches/EN-15:05/ufs.patch.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.1.2 (FreeBSD) + +iQIcBAABCgAGBQJVU9dqAAoJEO1n7NZdz2rn4AsP/1YMzPQWyU+S2wKQ22VWkD2+ +xk/sPNdvX76ADLgT9Ig0BbvotH0fHL2MP/w/1HtWxxlSPBRqz8bnFZC3wMT6olYu +Dg1z7kdg5kQjQkfii0zjZeQxGp5GnsLM9gZHTytX384rc6W6fZ0ty7iQIwQGyix5 +8deIafhloJZ5qs4uVDvzAwjDWfqzIEpGRuMnNqv0BYZIEZBALvkOTTMbp3QCxdoF +11Uze730XDYuo0i8fHlvsFdFcorChkvQIC5yNBmi6w03WY09b6LMIQd/c4jq9K+O +at8kOG61a9eLj6+zKhUIDlWamVowTxYglqUE3HnlRnARAU7lIFoFmwl+JIGLmYPk +pz6UlyA6Bw3RWwoKmPYjTzlm2DUMjxHcA/zrbzugMa2bJr2Ia1hFMPk4xy8OVRyB +earApidrkWJfN0R1kXiVNhSHqMSbwWp2Tt8hdd9xzt6bS2+NXbfL0lXOCwXuuf2k +EJKA1+7+Qc5/u82ZgO+OiXTecdUhj861d8u858KqOknRXpVu07U2FQ1zHcvJbrET +mxQ1deIOYTt9GXXSV6TV30+LF+NlwgnW1WGgk9/PZC6BgMSrbU92H6JZHSuB2dyl +TSkgFc8Dgj7LHk/2eIGctUZUFIQ2L0S3+lWjzuZ7cssuFs5dxXpaX8owR46cEZSp +P4ySVF+hVkcbSSeMNDXg +=7cpN +-----END PGP SIGNATURE----- diff --git a/share/xml/notices.xml b/share/xml/notices.xml index f01a3f903b..a2a10df087 100644 --- a/share/xml/notices.xml +++ b/share/xml/notices.xml @@ -7,6 +7,22 @@ 2015 + + 5 + + + 25 + + + FreeBSD-EN-15:05.ufs + + + + FreeBSD-EN-15:04.freebsd-update + + + + 2