Add SA-17:05 and EN-17:06.

This commit is contained in:
Xin LI 2017-07-12 08:31:16 +00:00
parent 561ae58612
commit 4bce46b170
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=50475
8 changed files with 888 additions and 0 deletions

View file

@ -0,0 +1,133 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
=============================================================================
FreeBSD-EN-17:06.hyperv Errata Notice
The FreeBSD Project
Topic: Boot compatibility improvements with Azure VMs
Category: core
Module: hyperv/storvsc
Announced: 2017-07-12
Credits: Microsoft OSTC
Affects: FreeBSD 10.3
Corrected: 2016-10-19 08:45:19 UTC (stable/10, 10.3-STABLE)
2017-07-12 08:07:55 UTC (releng/10.3, 10.3-RELEASE-p20)
For general information regarding FreeBSD Errata Notices and Security
Advisories, including descriptions of the fields above, security
branches, and the following sections, please visit
<URL:https://security.FreeBSD.org/>.
I. Background
Hyper-V is a default hypervisor provided on Windows server by Microsoft.
ATA driver is the legacy storage driver for FreeBSD on Hyperv, now they
are replaced by synthetic driver which has better performance.
There are issues when attaching multiple synthetic storage driver for
FreeBSD 10.3 on some of Hyper-V hosts.
CD/DVD cannot be detected in some circumstances which cause provisioning
fail on Azure.
II. Problem Description
The disk INQUIRY response is not complete for FreeBSD 10.3 on some
Hyper-V hosts, which will cause the disks will be detached during boot.
An interrupt is missing if we allow intr_shuffle_irqs on Hyper-V.
III. Impact
FreeBSD 10.3 can not be boot properly on a guest system on Hyper-V host.
IV. Workaround
No workaround is available.
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.
A reboot is required.
2) To update your 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
A reboot is required.
3) To update your 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-17:06/hyperv.patch
# fetch https://security.FreeBSD.org/patches/EN-17:06/hyperv.patch.asc
# gpg --verify hyperv.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
<URL:https://www.FreeBSD.org/handbook/kernelconfig.html> and reboot the
system.
VI. Correction details
The following list contains the correction revision numbers for each
affected branch.
Branch/path Revision
- -------------------------------------------------------------------------
stable/10/ r307623
releng/10.3/ r320912
- -------------------------------------------------------------------------
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:
<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>
VII. References
<URL:https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=212721>
The latest revision of this advisory is available at
<URL:https://security.FreeBSD.org/advisories/FreeBSD-EN-17:06.hyperv.asc>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.1.21 (FreeBSD)
iQIzBAEBCgAdFiEEHPf/b631yp++G4yy7Wfs1l3PaucFAlll2psACgkQ7Wfs1l3P
audtKRAA2OiRehFvElfsMARX+nBZazgKUGXfFRmWO8v8MCpI9jQtB9T8HItDWVHh
ZPbgM/AV3osUAmzdZOFwTpHbVbPQ8nO14n5inhC9u0J0wA0c5apfp54F2EXdgm6+
+ckf+2lkisBI1YVewH8aPRNSIhueRJPEX79g7Z/EqxHJhq1wfGaJ6zDT8royE1F8
q8uyawClGL1vS7ofW4IPVYQOgebf+s7vSF845JWQcqXeqpPU6Qt1kGP+wkTSx7HE
3tuRowym5EmzweP+U5DqE34Ryli7/jsDr0rgmVkVh5JEQfHznSadAAWsHj9bMimc
4Y2TSYdOhrPKV6Id/el5XWTSetUVPHMmQh6TTIWg10Ygr6CK0folZWnR5t2ym4np
HfzEdaUXJXZyj/5qy1mcFzR8JRifj9lmlRzBqZOOOwMakhSSYD7daouLK76SvH0K
gf4AgG0X6FUETD8N+rM+1RpvSfbeA9zktcPmxE/WCTtc8lIcQc/9CZY7zNOoi+du
LKU1MhWBQTk8zP5AHzAmHL+O+C6sF7uYVaUL6Ui3hqq2AjhnK+sxVX1QNT4kwgJ4
h3sBliNUQ6kz1e2yTROj2v66OkFKYaSugLwyg15Qa6pfE7R448lCwZOe65rYYTyZ
u4yd5mACaO9mkYmQulxIO/Eit19kGvapBXF4CEHBt+WvqG8Cbdk=
=a6m2
-----END PGP SIGNATURE-----

View file

@ -0,0 +1,146 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
=============================================================================
FreeBSD-SA-17:05.heimdal Security Advisory
The FreeBSD Project
Topic: heimdal KDC-REP service name validation vulnerability
Category: contrib
Module: heimdal
Announced: 2017-07-12
Affects: All supported versions of FreeBSD.
Corrected: 2017-07-12 07:26:07 UTC (stable/11, 11.1-PRERELEASE)
2017-07-12 08:07:16 UTC (releng/11.1, 11.1-RC2-p1)
2017-07-12 08:07:16 UTC (releng/11.1, 11.1-RC1-p1)
2017-07-12 07:26:07 UTC (stable/11, 11.1-BETA3-p1)
2017-07-12 08:07:36 UTC (releng/11.0, 11.0-RELEASE-p11)
2017-07-12 07:26:07 UTC (stable/10, 10.3-STABLE)
2017-07-12 08:07:36 UTC (releng/10.3, 10.3-RELEASE-p20)
CVE Name: CVE-2017-11103
For general information regarding FreeBSD Security Advisories,
including descriptions of the fields above, security branches, and the
following sections, please visit <URL:https://security.FreeBSD.org/>.
I. Background
Heimdal implements the Kerberos 5 network authentication protocols.
The Kerberos protocol uses "ticket" to authenticate a client to a
service.
A Key Distribution Center (KDC) is trusted by all principals registered
in that administrative "realm" to store a secret key in confidence, of
which, the proof of knowledge is used to verify the authenticity of a
principal.
II. Problem Description
There is a programming error in Heimdal implementation that used an
unauthenticated, plain-text version of the KDC-REP service name found
in a ticket.
III. Impact
An attacker who has control to the network between a client and the
service it talks to will be able to impersonate the service, allowing
a successful man-in-the-middle (MITM) attack that circumvents the mutual
authentication.
IV. Workaround
No workaround is available, but only Kerberos enabled clients are
affected.
V. Solution
Perform one of the following:
1) Upgrade your vulnerable system to a supported FreeBSD stable or
release / security branch (releng) dated after the correction date.
A reboot is recommended.
2) To update your vulnerable 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
A reboot is recommended.
3) To update your vulnerable 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/SA-17:05/heimdal.patch
# fetch https://security.FreeBSD.org/patches/SA-17:05/heimdal.patch.asc
# gpg --verify heimdal.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 <URL:https://www.FreeBSD.org/handbook/makeworld.html>.
Restart all daemons that use the library, or reboot the system.
VI. Correction details
The following list contains the correction revision numbers for each
affected branch.
Branch/path Revision
- -------------------------------------------------------------------------
stable/10/ r320907
releng/10.3/ r320912
stable/11/ r320907
releng/11.0/ r320911
releng/11.1/ r320910
- -------------------------------------------------------------------------
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:
<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>
VII. References
<URL:https://www.orpheus-lyre.info/>
<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11103>
The latest revision of this advisory is available at
<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-17:05.heimdal.asc>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.1.21 (FreeBSD)
iQIzBAEBCgAdFiEEHPf/b631yp++G4yy7Wfs1l3PaucFAlll2poACgkQ7Wfs1l3P
auf+8BAA13v5XSuifFibb4T+UY6tnCJgeRoCKYzwYIgx6glcDZyDUAuK0OtT5Skc
2EK24SUe2371sKYkLJ0pULKU5suRqWmzVKvSXGpexcYj8h+B9VCHuQc6tM87v3nA
/Nct5Svwxf+oBcI2MkVrn80NXsi5AfkBMzbgzXKGp3yGdMgbSpUx1uixN8QNtYSb
9nuZZPlXRa7GJDqLuVZwkZQVq1EXnSWwSNH/Oq8DuW7VrTWGJHflS0i/azxTvT+2
6zZCtCRkYd/875Bn7COxN5F597xwT76XDz5cQzOBH9hk0p+0hxfjAVSf7m5tbl1A
g3qBvXmAhavLvtJfwVFtkwZeAzkLiU1FlcNdoFTFmBwzUYvob41K+JPud1sEUFmu
4w5PXWPq3CbjvwzabOwFRlaA9XMBv8JSgATET3rk6ECjQ6I9+ptYkAXtpiCFXtxq
09kw5dbsqwJ3RQsw/ZtNdbQhhoEG3rNTOCLkLYM3VPwPaCaDAFXN2OGRf6lE21HX
QZQ57OypjTfd7OaSeM6kVeF/xYxh3AoxPsPdqTxphBOF+Ih0zCwcSVdXumuSqufq
daNo+qLV7/IqvY9p0YmHtLKGhwss8jVQBTObNW8JESxmWrDAwtUke0fxnqK9LKMT
vWbvNsgUaLFNEisMkY25VZCzgUiIDJu5JyhTMQtlqQOSNYB686k=
=enb2
-----END PGP SIGNATURE-----

View file

@ -0,0 +1,538 @@
--- sys/cam/ata/ata_xpt.c.orig
+++ sys/cam/ata/ata_xpt.c
@@ -40,6 +40,7 @@
#include <sys/interrupt.h>
#include <sys/sbuf.h>
+#include <sys/eventhandler.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/sysctl.h>
@@ -827,6 +828,7 @@
{
struct ccb_pathinq cpi;
int16_t *ptr;
+ int veto = 0;
ident_buf = &softc->ident_data;
for (ptr = (int16_t *)ident_buf;
@@ -833,6 +835,11 @@
ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) {
*ptr = le16toh(*ptr);
}
+ EVENTHANDLER_INVOKE(ada_probe_veto, path, ident_buf, &veto);
+ if (veto) {
+ goto device_fail;
+ }
+
if (strncmp(ident_buf->model, "FX", 2) &&
strncmp(ident_buf->model, "NEC", 3) &&
strncmp(ident_buf->model, "Pioneer", 7) &&
--- sys/conf/files.amd64.orig
+++ sys/conf/files.amd64
@@ -262,7 +262,6 @@
dev/hyperv/netvsc/hv_net_vsc.c optional hyperv
dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c optional hyperv
dev/hyperv/netvsc/hv_rndis_filter.c optional hyperv
-dev/hyperv/stordisengage/hv_ata_pci_disengage.c optional hyperv
dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c optional hyperv
dev/hyperv/utilities/hv_kvp.c optional hyperv
dev/hyperv/utilities/hv_util.c optional hyperv
--- sys/conf/files.i386.orig
+++ sys/conf/files.i386
@@ -240,7 +240,6 @@
dev/hyperv/netvsc/hv_net_vsc.c optional hyperv
dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c optional hyperv
dev/hyperv/netvsc/hv_rndis_filter.c optional hyperv
-dev/hyperv/stordisengage/hv_ata_pci_disengage.c optional hyperv
dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c optional hyperv
dev/hyperv/utilities/hv_kvp.c optional hyperv
dev/hyperv/utilities/hv_util.c optional hyperv
--- sys/dev/hyperv/include/hyperv.h.orig
+++ sys/dev/hyperv/include/hyperv.h
@@ -124,6 +124,8 @@
unsigned char data[16];
} __packed hv_guid;
+int snprintf_hv_guid(char *, size_t, const hv_guid *);
+
#define HV_NIC_GUID \
.data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, \
0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}
--- sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c.orig
+++ sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
@@ -58,6 +58,7 @@
#include <sys/lock.h>
#include <sys/sema.h>
#include <sys/sglist.h>
+#include <sys/eventhandler.h>
#include <machine/bus.h>
#include <sys/bus_dma.h>
@@ -198,6 +199,7 @@
STORVSC_RINGBUFFER_SIZE}
};
+static eventhandler_tag storvsc_handler_tag;
/*
* Sense buffer size changed in win8; have a run-time
* variable to track the size we should use.
@@ -818,6 +820,7 @@
* because the fields will be used later in storvsc_io_done().
*/
request->vstor_packet.u.vm_srb.scsi_status = vm_srb->scsi_status;
+ request->vstor_packet.u.vm_srb.srb_status = vm_srb->srb_status;
request->vstor_packet.u.vm_srb.transfer_len = vm_srb->transfer_len;
if (((vm_srb->scsi_status & 0xFF) == SCSI_STATUS_CHECK_COND) &&
@@ -966,20 +969,13 @@
static int
storvsc_probe(device_t dev)
{
- int ata_disk_enable = 0;
int ret = ENXIO;
switch (storvsc_get_storage_type(dev)) {
case DRIVER_BLKVSC:
if(bootverbose)
- device_printf(dev, "DRIVER_BLKVSC-Emulated ATA/IDE probe\n");
- if (!getenv_int("hw.ata.disk_enable", &ata_disk_enable)) {
- if(bootverbose)
- device_printf(dev,
- "Enlightened ATA/IDE detected\n");
- ret = BUS_PROBE_DEFAULT;
- } else if(bootverbose)
- device_printf(dev, "Emulated ATA/IDE set (hw.ata.disk_enable set)\n");
+ device_printf(dev, "Enlightened ATA/IDE detected\n");
+ ret = BUS_PROBE_DEFAULT;
break;
case DRIVER_STORVSC:
if(bootverbose)
@@ -1967,28 +1963,17 @@
return(0);
}
-/*
- * SCSI Inquiry checks qualifier and type.
- * If qualifier is 011b, means the device server is not capable
- * of supporting a peripheral device on this logical unit, and
- * the type should be set to 1Fh.
- *
- * Return 1 if it is valid, 0 otherwise.
- */
-static inline int
-is_inquiry_valid(const struct scsi_inquiry_data *inq_data)
+static uint32_t
+is_scsi_valid(const struct scsi_inquiry_data *inq_data)
{
- uint8_t type;
- if (SID_QUAL(inq_data) != SID_QUAL_LU_CONNECTED) {
- return (0);
- }
+ u_int8_t type;
type = SID_TYPE(inq_data);
- if (type == T_NODEVICE) {
+ if (type == T_NODEVICE)
return (0);
- }
+ if (SID_QUAL(inq_data) == SID_QUAL_BAD_LU)
+ return (0);
return (1);
}
-
/**
* @brief completion function before returning to CAM
*
@@ -2057,75 +2042,108 @@
callout_drain(&reqp->callout);
}
#endif
-
ccb->ccb_h.status &= ~CAM_SIM_QUEUED;
ccb->ccb_h.status &= ~CAM_STATUS_MASK;
if (vm_srb->scsi_status == SCSI_STATUS_OK) {
const struct scsi_generic *cmd;
- /*
- * Check whether the data for INQUIRY cmd is valid or
- * not. Windows 10 and Windows 2016 send all zero
- * inquiry data to VM even for unpopulated slots.
- */
cmd = (const struct scsi_generic *)
((ccb->ccb_h.flags & CAM_CDB_POINTER) ?
csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes);
- if (cmd->opcode == INQUIRY) {
- /*
- * The host of Windows 10 or 2016 server will response
- * the inquiry request with invalid data for unexisted device:
- [0x7f 0x0 0x5 0x2 0x1f ... ]
- * But on windows 2012 R2, the response is:
- [0x7f 0x0 0x0 0x0 0x0 ]
- * That is why here wants to validate the inquiry response.
- * The validation will skip the INQUIRY whose response is short,
- * which is less than SHORT_INQUIRY_LENGTH (36).
- *
- * For more information about INQUIRY, please refer to:
- * ftp://ftp.avc-pioneer.com/Mtfuji_7/Proposal/Jun09/INQUIRY.pdf
- */
- const struct scsi_inquiry_data *inq_data =
- (const struct scsi_inquiry_data *)csio->data_ptr;
- uint8_t* resp_buf = (uint8_t*)csio->data_ptr;
- /* Get the buffer length reported by host */
- int resp_xfer_len = vm_srb->transfer_len;
- /* Get the available buffer length */
- int resp_buf_len = resp_xfer_len >= 5 ? resp_buf[4] + 5 : 0;
- int data_len = (resp_buf_len < resp_xfer_len) ? resp_buf_len : resp_xfer_len;
- if (data_len < SHORT_INQUIRY_LENGTH) {
- ccb->ccb_h.status |= CAM_REQ_CMP;
- if (bootverbose && data_len >= 5) {
- mtx_lock(&sc->hs_lock);
- xpt_print(ccb->ccb_h.path,
- "storvsc skips the validation for short inquiry (%d)"
- " [%x %x %x %x %x]\n",
- data_len,resp_buf[0],resp_buf[1],resp_buf[2],
- resp_buf[3],resp_buf[4]);
- mtx_unlock(&sc->hs_lock);
- }
- } else if (is_inquiry_valid(inq_data) == 0) {
- ccb->ccb_h.status |= CAM_DEV_NOT_THERE;
- if (bootverbose && data_len >= 5) {
- mtx_lock(&sc->hs_lock);
- xpt_print(ccb->ccb_h.path,
- "storvsc uninstalled invalid device"
- " [%x %x %x %x %x]\n",
- resp_buf[0],resp_buf[1],resp_buf[2],resp_buf[3],resp_buf[4]);
- mtx_unlock(&sc->hs_lock);
- }
- } else {
- ccb->ccb_h.status |= CAM_REQ_CMP;
+ if (vm_srb->srb_status != SRB_STATUS_SUCCESS) {
+ /*
+ * If there are errors, for example, invalid LUN,
+ * host will inform VM through SRB status.
+ */
if (bootverbose) {
- mtx_lock(&sc->hs_lock);
- xpt_print(ccb->ccb_h.path,
- "storvsc has passed inquiry response (%d) validation\n",
- data_len);
- mtx_unlock(&sc->hs_lock);
+ if (vm_srb->srb_status == SRB_STATUS_INVALID_LUN) {
+ xpt_print(ccb->ccb_h.path,
+ "invalid LUN %d for op: %s\n",
+ vm_srb->lun,
+ scsi_op_desc(cmd->opcode, NULL));
+ } else {
+ xpt_print(ccb->ccb_h.path,
+ "Unknown SRB flag: %d for op: %s\n",
+ vm_srb->srb_status,
+ scsi_op_desc(cmd->opcode, NULL));
+ }
}
- }
+
+ /*
+ * XXX For a selection timeout, all of the LUNs
+ * on the target will be gone. It works for SCSI
+ * disks, but does not work for IDE disks.
+ *
+ * For CAM_DEV_NOT_THERE, CAM will only get
+ * rid of the device(s) specified by the path.
+ */
+ if (storvsc_get_storage_type(sc->hs_dev->device) ==
+ DRIVER_STORVSC)
+ ccb->ccb_h.status |= CAM_SEL_TIMEOUT;
+ else
+ ccb->ccb_h.status |= CAM_DEV_NOT_THERE;
} else {
ccb->ccb_h.status |= CAM_REQ_CMP;
}
+
+ if (cmd->opcode == INQUIRY &&
+ vm_srb->srb_status == SRB_STATUS_SUCCESS) {
+ int resp_xfer_len, resp_buf_len, data_len;
+ struct scsi_inquiry_data *inq_data =
+ (struct scsi_inquiry_data *)csio->data_ptr;
+ /* Get the buffer length reported by host */
+ resp_xfer_len = vm_srb->transfer_len;
+ uint8_t *resp_buf = (uint8_t *)csio->data_ptr;
+
+ /* Get the available buffer length */
+ resp_buf_len = resp_xfer_len >= 5 ? resp_buf[4] + 5 : 0;
+ data_len = (resp_buf_len < resp_xfer_len) ?
+ resp_buf_len : resp_xfer_len;
+ if (bootverbose && data_len >= 5) {
+ xpt_print(ccb->ccb_h.path, "storvsc inquiry "
+ "(%d) [%x %x %x %x %x ... ]\n", data_len,
+ resp_buf[0], resp_buf[1], resp_buf[2],
+ resp_buf[3], resp_buf[4]);
+ }
+ /*
+ * XXX: Manually fix the wrong response returned from WS2012
+ */
+ if (!is_scsi_valid(inq_data) &&
+ (vmstor_proto_version == VMSTOR_PROTOCOL_VERSION_WIN8_1 ||
+ vmstor_proto_version == VMSTOR_PROTOCOL_VERSION_WIN8 ||
+ vmstor_proto_version == VMSTOR_PROTOCOL_VERSION_WIN7)) {
+ if (data_len >= 4 &&
+ (resp_buf[2] == 0 || resp_buf[3] == 0)) {
+ resp_buf[2] = 5; // verion=5 means SPC-3
+ resp_buf[3] = 2; // resp fmt must be 2
+ if (bootverbose)
+ xpt_print(ccb->ccb_h.path,
+ "fix version and resp fmt for 0x%x\n",
+ vmstor_proto_version);
+ }
+ } else if (data_len >= SHORT_INQUIRY_LENGTH) {
+ char vendor[16];
+
+ cam_strvis(vendor, inq_data->vendor,
+ sizeof(inq_data->vendor), sizeof(vendor));
+ /*
+ * XXX: Upgrade SPC2 to SPC3 if host is WIN8 or
+ * WIN2012 R2 in order to support UNMAP feature.
+ */
+ if (!strncmp(vendor, "Msft", 4) &&
+ SID_ANSI_REV(inq_data) == SCSI_REV_SPC2 &&
+ (vmstor_proto_version ==
+ VMSTOR_PROTOCOL_VERSION_WIN8_1 ||
+ vmstor_proto_version ==
+ VMSTOR_PROTOCOL_VERSION_WIN8)) {
+ inq_data->version = SCSI_REV_SPC3;
+ if (bootverbose) {
+ xpt_print(ccb->ccb_h.path,
+ "storvsc upgrades "
+ "SPC2 to SPC3\n");
+ }
+ }
+ }
+ }
} else {
mtx_lock(&sc->hs_lock);
xpt_print(ccb->ccb_h.path,
@@ -2193,3 +2211,51 @@
return (DRIVER_UNKNOWN);
}
+#define PCI_VENDOR_INTEL 0x8086
+#define PCI_PRODUCT_PIIX4 0x7111
+
+static void
+storvsc_ada_probe_veto(void *arg __unused, struct cam_path *path,
+ struct ata_params *ident_buf __unused, int *veto)
+{
+ /*
+ * Hyper-V should ignore ATA
+ */
+ if (path->device->protocol == PROTO_ATA) {
+ struct ccb_pathinq cpi;
+
+ bzero(&cpi, sizeof(cpi));
+ xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE);
+ cpi.ccb_h.func_code = XPT_PATH_INQ;
+ xpt_action((union ccb *)&cpi);
+ if (cpi.ccb_h.status == CAM_REQ_CMP &&
+ cpi.hba_vendor == PCI_VENDOR_INTEL &&
+ cpi.hba_device == PCI_PRODUCT_PIIX4) {
+ (*veto)++;
+ xpt_print(path,
+ "Disable ATA for vendor: %x, device: %x\n",
+ cpi.hba_vendor, cpi.hba_device);
+ }
+ }
+}
+
+static void
+storvsc_sysinit(void *arg __unused)
+{
+ if (vm_guest == VM_GUEST_HV) {
+ storvsc_handler_tag = EVENTHANDLER_REGISTER(ada_probe_veto,
+ storvsc_ada_probe_veto, NULL, EVENTHANDLER_PRI_ANY);
+ }
+}
+SYSINIT(storvsc_sys_init, SI_SUB_DRIVERS, SI_ORDER_SECOND, storvsc_sysinit,
+ NULL);
+
+static void
+storvsc_sysuninit(void *arg __unused)
+{
+ if (storvsc_handler_tag != NULL) {
+ EVENTHANDLER_DEREGISTER(ada_probe_veto, storvsc_handler_tag);
+ }
+}
+SYSUNINIT(storvsc_sys_uninit, SI_SUB_DRIVERS, SI_ORDER_SECOND,
+ storvsc_sysuninit, NULL);
--- sys/dev/hyperv/storvsc/hv_vstorage.h.orig
+++ sys/dev/hyperv/storvsc/hv_vstorage.h
@@ -249,10 +249,10 @@
/**
* SRB Status Masks (can be combined with above status codes)
*/
-#define SRB_STATUS_QUEUE_FROZEN 0x40
-#define SRB_STATUS_AUTOSENSE_VALID 0x80
+#define SRB_STATUS_QUEUE_FROZEN 0x40
+#define SRB_STATUS_AUTOSENSE_VALID 0x80
+#define SRB_STATUS_INVALID_LUN 0X20
-
/**
* Packet flags
*/
--- sys/dev/hyperv/utilities/hv_kvp.c.orig
+++ sys/dev/hyperv/utilities/hv_kvp.c
@@ -311,28 +311,11 @@
{
int err_ip, err_subnet, err_gway, err_dns, err_adap;
int UNUSED_FLAG = 1;
- int guid_index;
struct hv_device *hv_dev; /* GUID Data Structure */
hn_softc_t *sc; /* hn softc structure */
char if_name[4];
- unsigned char guid_instance[40];
- char *guid_data = NULL;
char buf[39];
- struct guid_extract {
- char a1[2];
- char a2[2];
- char a3[2];
- char a4[2];
- char b1[2];
- char b2[2];
- char c1[2];
- char c2[2];
- char d[4];
- char e[12];
- };
-
- struct guid_extract *id;
device_t *devs;
int devcnt;
@@ -359,17 +342,7 @@
/* Trying to find GUID of Network Device */
hv_dev = sc->hn_dev_obj;
- for (guid_index = 0; guid_index < 16; guid_index++) {
- sprintf(&guid_instance[guid_index * 2], "%02x",
- hv_dev->device_id.data[guid_index]);
- }
-
- guid_data = (char *)guid_instance;
- id = (struct guid_extract *)guid_data;
- snprintf(buf, sizeof(buf), "{%.2s%.2s%.2s%.2s-%.2s%.2s-%.2s%.2s-%.4s-%s}",
- id->a4, id->a3, id->a2, id->a1,
- id->b2, id->b1, id->c2, id->c1, id->d, id->e);
- guid_data = NULL;
+ snprintf_hv_guid(buf, sizeof(buf), &hv_dev->device_id);
sprintf(if_name, "%s%d", "hn", device_get_unit(devs[devcnt]));
if (strncmp(buf, (char *)umsg->body.kvp_ip_val.adapter_id, 39) == 0) {
--- sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c.orig
+++ sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
@@ -59,6 +59,7 @@
#include <sys/pcpu.h>
#include <machine/apicvar.h>
+#include <dev/hyperv/include/hyperv.h>
#include "hv_vmbus_priv.h"
#include <contrib/dev/acpica/include/acpi.h>
@@ -298,6 +299,23 @@
return (ENOENT);
}
+static int
+vmbus_child_pnpinfo_str(device_t dev, device_t child, char *buf, size_t buflen)
+{
+ char guidbuf[40];
+ struct hv_device *dev_ctx = device_get_ivars(child);
+
+ strlcat(buf, "classid=", buflen);
+ snprintf_hv_guid(guidbuf, sizeof(guidbuf), &dev_ctx->class_id);
+ strlcat(buf, guidbuf, buflen);
+
+ strlcat(buf, " deviceid=", buflen);
+ snprintf_hv_guid(guidbuf, sizeof(guidbuf), &dev_ctx->device_id);
+ strlcat(buf, guidbuf, buflen);
+
+ return (0);
+}
+
struct hv_device*
hv_vmbus_child_device_create(
hv_guid type,
@@ -324,15 +342,17 @@
return (child_dev);
}
-static void
-print_dev_guid(struct hv_device *dev)
+int
+snprintf_hv_guid(char *buf, size_t sz, const hv_guid *guid)
{
- int i;
- unsigned char guid_name[100];
- for (i = 0; i < 32; i += 2)
- sprintf(&guid_name[i], "%02x", dev->class_id.data[i / 2]);
- if(bootverbose)
- printf("VMBUS: Class ID: %s\n", guid_name);
+ int cnt;
+ const unsigned char *d = guid->data;
+
+ cnt = snprintf(buf, sz,
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ d[3], d[2], d[1], d[0], d[5], d[4], d[7], d[6],
+ d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);
+ return (cnt);
}
int
@@ -341,9 +361,12 @@
device_t child;
int ret = 0;
- print_dev_guid(child_dev);
+ if (bootverbose) {
+ char name[40];
+ snprintf_hv_guid(name, sizeof(name), &child_dev->class_id);
+ printf("VMBUS: Class ID: %s\n", name);
+ }
-
child = device_add_child(vmbus_devp, NULL, -1);
child_dev->device = child;
device_set_ivars(child, child_dev);
@@ -747,6 +770,7 @@
DEVMETHOD(bus_print_child, bus_generic_print_child),
DEVMETHOD(bus_read_ivar, vmbus_read_ivar),
DEVMETHOD(bus_write_ivar, vmbus_write_ivar),
+ DEVMETHOD(bus_child_pnpinfo_str, vmbus_child_pnpinfo_str),
{ 0, 0 } };
--- sys/sys/eventhandler.h.orig
+++ sys/sys/eventhandler.h
@@ -283,4 +283,11 @@
EVENTHANDLER_DECLARE(register_framebuffer, register_framebuffer_fn);
EVENTHANDLER_DECLARE(unregister_framebuffer, unregister_framebuffer_fn);
+/* veto ada probing */
+struct cam_path;
+struct ata_params;
+typedef void (*ada_probe_veto_fn)(void *, struct cam_path *,
+ struct ata_params *, int *);
+EVENTHANDLER_DECLARE(ada_probe_veto, ada_probe_veto_fn);
+
#endif /* SYS_EVENTHANDLER_H */
--- sys/x86/x86/intr_machdep.c.orig
+++ sys/x86/x86/intr_machdep.c
@@ -535,6 +535,9 @@
if (mp_ncpus == 1)
return;
+ /* Does not work properly on Hyper-V. */
+ if (vm_guest == VM_GUEST_HV)
+ return;
/* Round-robin assign a CPU to each enabled source. */
mtx_lock(&intr_table_lock);
assign_cpu = 1;

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.1.21 (FreeBSD)
iQIzBAABCgAdFiEEHPf/b631yp++G4yy7Wfs1l3PaucFAlll2rgACgkQ7Wfs1l3P
aueyXRAAmp/GRpfdn8f9xMXP0W4QOsODfV7xVgxvaVTXLkBxT4o1710I2oVEh959
7uXoXjJbGRepdj8U1CLrbusKjuTRM88hUR+QMrw0A82Iz+0FP1EQJU/kwLhl/CrJ
Uhrnjqr0pHfNlGczym35Qii6gRD1Kvt8A6EhpzQhXVWPhpooPGnjpJsJ/cPPbJmN
ywoi66JpgJHAJ94zH1qcdaKghirZ0D3f3rErWqZmAI7b4UGGGtHWtg04GcOXHdW5
6cKuqRcn3cniWCs/dlHm/QEbhrsYYDKVAexzIxKlKnZt4L2b1od4Nwt2g5T0KNGD
kVRIeIi4gfQNLiymS1jtUK/2l9ryZwMNDgDKXXbCGYFDVlGjhF/zV24J56owq24a
9xUrA/eIt2aDkMXjbg/hCFooaaUW9bIEkfE7oGPZWOiv57Xl8tcVfxaCQhg7D7NI
cacKTep4pfXezD5nm5Jv/CIZhdgfs73kUuhknf3Aje7lGaQDGGjJm0Izpr5CDU09
fybWoyzEkMdD41Yuf0JgRqh0fC+kWmu9fRAe9v6UBJWnhFnKUeUrC5fidVXCR5c0
CdgV3kYUK2cH0jDGeQrjcZybR52WFfeHa9Wj8Ea7fzOfsEu1qr+mCg7Vnbqt1Rbx
WW8ob+UcPrxEYMSRJrg33Xr/EiTVpv2VA2zSwJIO7WNsR8NirbQ=
=wx6c
-----END PGP SIGNATURE-----

View file

@ -0,0 +1,13 @@
--- crypto/heimdal/lib/krb5/ticket.c.orig
+++ crypto/heimdal/lib/krb5/ticket.c
@@ -713,8 +713,8 @@
/* check server referral and save principal */
ret = _krb5_principalname2krb5_principal (context,
&tmp_principal,
- rep->kdc_rep.ticket.sname,
- rep->kdc_rep.ticket.realm);
+ rep->enc_part.sname,
+ rep->enc_part.srealm);
if (ret)
goto out;
if((flags & EXTRACT_TICKET_ALLOW_SERVER_MISMATCH) == 0){

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.1.21 (FreeBSD)
iQIzBAABCgAdFiEEHPf/b631yp++G4yy7Wfs1l3PaucFAlll2rgACgkQ7Wfs1l3P
audDPBAA2J6IvRsymXj8EzCdEYI/DeoooD5wP2EuGxw166XH/UJgJC95LLEhpGsi
sZ6ePOCEIDqUlWhYZjJT6uI3ww8ZLzIQ6gHIlA+J9/IfLimlFhG6J2E6D+IKwAcC
4bhQOWeUT+HmiE3rRBtGsiND4Eos/LCzinSZR1oQMuiNpC+Z+Os+47EsDAM7zCRd
HQo7Ko+8VUpI47E8jNeummjziHnmczpXsSVuuord8gpegLFYFaAqKmhJoD8O33Cf
gVigMl/Oo039XlibJ6kivs+jY93iDAFb1ahQE1n/M8G0oMR1vExm6/ILDfjebA9z
rS/6DNvbEBPfx9QSjnE1l9KVbIaWJjIQYU0Mia0Bu2h83mtk8zPoG2q2nfFpAP4I
01wqv+zzVJjr3LULwZcAOGSTUSuXgZrnc5KBSM3ULs5ZZMgoCJ54oQjFXUkzQAqQ
DXyHX3Oq6abG2YUOyErlt2mqUvbUJl4XU3nC0Hdw76UIK46/ksXwfabt+W3ICeEf
ZX4YjMGWZU0XOJIfhmhgS6/Yr+F37ldac5D38I6AcnbgfBW8CiebtWyn5QNjoMOT
jxSSz3Rl5Lt1M2xjPP4jg2a5ivq7gz2JmNOjBtNCVWeq1hAP+0EryghDFENMQDhL
PZ7H+/201FUlxO9BQ5tOluGL0Nu4mtaLyeDUHZCwHYxQb+cz4/c=
=Wwzw
-----END PGP SIGNATURE-----

View file

@ -7,6 +7,18 @@
<year>
<name>2017</name>
<month>
<name>7</name>
<day>
<name>12</name>
<advisory>
<name>FreeBSD-SA-17:05.heimdal</name>
</advisory>
</day>
</month>
<month>
<name>4</name>

View file

@ -7,6 +7,18 @@
<year>
<name>2017</name>
<month>
<name>7</name>
<day>
<name>12</name>
<notice>
<name>FreeBSD-EN-17:06.hyperv</name>
</notice>
</day>
</month>
<month>
<name>4</name>