mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-31 21:06:18 +01:00
Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a4327739c | ||
|
|
8d0c6fc226 | ||
|
|
fbcab568df | ||
|
|
84a603b232 | ||
|
|
710985d25a | ||
|
|
021dc5c364 | ||
|
|
7cc4540e39 | ||
|
|
90c934b892 | ||
|
|
1baa48a657 |
No files matched your search
@@ -8,6 +8,60 @@ Items affecting the ports and packages system can be found in
|
||||
/usr/ports/UPDATING. Please read that file before running
|
||||
portupgrade.
|
||||
|
||||
20100526: p8 FreeBSD-SA-10:05.opie, FreeBSD-SA-10:06.nfsclient
|
||||
Fix a one-NUL-byte buffer overflow in libopie. [10:05]
|
||||
|
||||
Correctly sanity-check a buffer length in nfs mount. [10:06]
|
||||
|
||||
20100227: p7 FreeBSD-EN-10:02.sched_ule
|
||||
Fix a deadlock in the ULE scheduler.
|
||||
|
||||
20100106: p6 FreeBSD-SA-10:01.bind, FreeBSD-SA-10:02.ntpd,
|
||||
FreeBSD-SA-10:03.zfs
|
||||
Fix BIND named(8) cache poisoning with DNSSEC validation.
|
||||
[SA-10:01]
|
||||
|
||||
Fix ntpd mode 7 denial of service. [SA-10:02]
|
||||
|
||||
Fix ZFS ZIL playback with insecure permissions. [SA-10:03]
|
||||
|
||||
20091203: p5 FreeBSD-SA-09:15.ssl, FreeBSD-SA-09:16.rtld,
|
||||
FreeBSD-SA-09:17.freebsd-update
|
||||
Disable SSL renegotiation in order to protect against a serious
|
||||
protocol flaw. [09:15]
|
||||
|
||||
Correctly handle failures from unsetenv resulting from a corrupt
|
||||
environment in rtld-elf. [09:16]
|
||||
|
||||
Fix permissions in freebsd-update in order to prevent leakage of
|
||||
sensitive files. [09:17]
|
||||
|
||||
20091002: p4 FreeBSD-SA-09:14.devfs FreeBSD-EN-09:05.null
|
||||
Fix devfs / VFS NULL pointer race condition. [SA-09:14]
|
||||
|
||||
Add no zero mapping feature. [EN-09:05]
|
||||
|
||||
20090729: p3 FreeBSD-SA-09:12.bind
|
||||
Fix BIND named(8) dynamic update message remote DoS.
|
||||
|
||||
20090624: p2 FreeBSD-EN-09:02.bce, FreeBSD-EN-09:03.fxp,
|
||||
FreeBSD-EN-09:04.fork
|
||||
Fix packet length calculation in bce(4). [EN-09:02]
|
||||
|
||||
Correctly set IP packet length for TSO in fxp(4). [EN-09:03]
|
||||
|
||||
Fix a lock order reversal bug that could cause deadlock during
|
||||
fork(2). [EN-09:04]
|
||||
|
||||
20090610: p1 FreeBSD-SA-09:09.pipe, FreeBSD-SA-09:10.ipv6,
|
||||
FreeBSD-SA-09:11.ntpd
|
||||
Prevent integer overflow in direct pipe write code from circumventing
|
||||
virtual-to-physical page lookups. [09:09]
|
||||
|
||||
Add missing permissions check for SIOCSIFINFO_IN6 ioctl. [09:10]
|
||||
|
||||
Fix buffer overflow in "autokey" negotiation in ntpd(8). [09:11]
|
||||
|
||||
20090504:
|
||||
FreeBSD 7.2-RELEASE
|
||||
|
||||
|
||||
@@ -109,6 +109,8 @@
|
||||
#define DNS_GETDB_NOLOG 0x02U
|
||||
#define DNS_GETDB_PARTIAL 0x04U
|
||||
|
||||
#define PENDINGOK(x) (((x) & DNS_DBFIND_PENDINGOK) != 0)
|
||||
|
||||
typedef struct client_additionalctx {
|
||||
ns_client_t *client;
|
||||
dns_rdataset_t *rdataset;
|
||||
@@ -1721,8 +1723,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) {
|
||||
*/
|
||||
if (result == ISC_R_SUCCESS &&
|
||||
additionaltype == dns_rdatasetadditional_fromcache &&
|
||||
(rdataset->trust == dns_trust_pending ||
|
||||
rdataset->trust == dns_trust_glue) &&
|
||||
(DNS_TRUST_PENDING(rdataset->trust) ||
|
||||
DNS_TRUST_GLUE(rdataset->trust)) &&
|
||||
!validate(client, db, fname, rdataset, sigrdataset)) {
|
||||
dns_rdataset_disassociate(rdataset);
|
||||
if (dns_rdataset_isassociated(sigrdataset))
|
||||
@@ -1761,8 +1763,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) {
|
||||
*/
|
||||
if (result == ISC_R_SUCCESS &&
|
||||
additionaltype == dns_rdatasetadditional_fromcache &&
|
||||
(rdataset->trust == dns_trust_pending ||
|
||||
rdataset->trust == dns_trust_glue) &&
|
||||
(DNS_TRUST_PENDING(rdataset->trust) ||
|
||||
DNS_TRUST_GLUE(rdataset->trust)) &&
|
||||
!validate(client, db, fname, rdataset, sigrdataset)) {
|
||||
dns_rdataset_disassociate(rdataset);
|
||||
if (dns_rdataset_isassociated(sigrdataset))
|
||||
@@ -2547,14 +2549,14 @@ query_addbestns(ns_client_t *client) {
|
||||
/*
|
||||
* Attempt to validate RRsets that are pending or that are glue.
|
||||
*/
|
||||
if ((rdataset->trust == dns_trust_pending ||
|
||||
(sigrdataset != NULL && sigrdataset->trust == dns_trust_pending))
|
||||
if ((DNS_TRUST_PENDING(rdataset->trust) ||
|
||||
(sigrdataset != NULL && DNS_TRUST_PENDING(sigrdataset->trust)))
|
||||
&& !validate(client, db, fname, rdataset, sigrdataset) &&
|
||||
(client->query.dboptions & DNS_DBFIND_PENDINGOK) == 0)
|
||||
!PENDINGOK(client->query.dboptions))
|
||||
goto cleanup;
|
||||
|
||||
if ((rdataset->trust == dns_trust_glue ||
|
||||
(sigrdataset != NULL && sigrdataset->trust == dns_trust_glue)) &&
|
||||
if ((DNS_TRUST_GLUE(rdataset->trust) ||
|
||||
(sigrdataset != NULL && DNS_TRUST_GLUE(sigrdataset->trust))) &&
|
||||
!validate(client, db, fname, rdataset, sigrdataset) &&
|
||||
SECURE(client) && WANTDNSSEC(client))
|
||||
goto cleanup;
|
||||
@@ -3344,6 +3346,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
|
||||
isc_boolean_t empty_wild;
|
||||
dns_rdataset_t *noqname;
|
||||
isc_boolean_t resuming;
|
||||
dns_rdataset_t tmprdataset;
|
||||
unsigned int dboptions;
|
||||
|
||||
CTRACE("query_find");
|
||||
|
||||
@@ -3555,9 +3559,49 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
|
||||
/*
|
||||
* Now look for an answer in the database.
|
||||
*/
|
||||
dboptions = client->query.dboptions;
|
||||
if (sigrdataset == NULL && client->view->enablednssec) {
|
||||
/*
|
||||
* If the client doesn't want DNSSEC we still want to
|
||||
* look for any data pending validation to save a remote
|
||||
* lookup if possible.
|
||||
*/
|
||||
dns_rdataset_init(&tmprdataset);
|
||||
sigrdataset = &tmprdataset;
|
||||
dboptions |= DNS_DBFIND_PENDINGOK;
|
||||
}
|
||||
refind:
|
||||
result = dns_db_find(db, client->query.qname, version, type,
|
||||
client->query.dboptions, client->now,
|
||||
&node, fname, rdataset, sigrdataset);
|
||||
dboptions, client->now, &node, fname,
|
||||
rdataset, sigrdataset);
|
||||
/*
|
||||
* If we have found pending data try to validate it.
|
||||
* If the data does not validate as secure and we can't
|
||||
* use the unvalidated data requery the database with
|
||||
* pending disabled to prevent infinite looping.
|
||||
*/
|
||||
if (result != ISC_R_SUCCESS || !DNS_TRUST_PENDING(rdataset->trust))
|
||||
goto validation_done;
|
||||
if (validate(client, db, fname, rdataset, sigrdataset))
|
||||
goto validation_done;
|
||||
if (rdataset->trust != dns_trust_pending_answer ||
|
||||
!PENDINGOK(client->query.dboptions)) {
|
||||
dns_rdataset_disassociate(rdataset);
|
||||
if (sigrdataset != NULL &&
|
||||
dns_rdataset_isassociated(sigrdataset))
|
||||
dns_rdataset_disassociate(sigrdataset);
|
||||
if (sigrdataset == &tmprdataset)
|
||||
sigrdataset = NULL;
|
||||
dns_db_detachnode(db, &node);
|
||||
dboptions &= ~DNS_DBFIND_PENDINGOK;
|
||||
goto refind;
|
||||
}
|
||||
validation_done:
|
||||
if (sigrdataset == &tmprdataset) {
|
||||
if (dns_rdataset_isassociated(sigrdataset))
|
||||
dns_rdataset_disassociate(sigrdataset);
|
||||
sigrdataset = NULL;
|
||||
}
|
||||
|
||||
resume:
|
||||
CTRACE("query_find: resume");
|
||||
|
||||
@@ -865,7 +865,11 @@ temp_check(isc_mem_t *mctx, dns_diff_t *temp, dns_db_t *db,
|
||||
if (type == dns_rdatatype_rrsig ||
|
||||
type == dns_rdatatype_sig)
|
||||
covers = dns_rdata_covers(&t->rdata);
|
||||
else
|
||||
else if (type == dns_rdatatype_any) {
|
||||
dns_db_detachnode(db, &node);
|
||||
dns_diff_clear(&trash);
|
||||
return (DNS_R_NXRRSET);
|
||||
} else
|
||||
covers = 0;
|
||||
|
||||
/*
|
||||
|
||||
@@ -241,40 +241,52 @@ enum {
|
||||
dns_trust_none = 0,
|
||||
#define dns_trust_none ((dns_trust_t)dns_trust_none)
|
||||
|
||||
/*% Subject to DNSSEC validation but has not yet been validated */
|
||||
dns_trust_pending = 1,
|
||||
#define dns_trust_pending ((dns_trust_t)dns_trust_pending)
|
||||
|
||||
/*%
|
||||
* Subject to DNSSEC validation but has not yet been validated
|
||||
* dns_trust_pending_additional (from the additional section).
|
||||
*/
|
||||
dns_trust_pending_additional = 1,
|
||||
#define dns_trust_pending_additional \
|
||||
((dns_trust_t)dns_trust_pending_additional)
|
||||
|
||||
dns_trust_pending_answer = 2,
|
||||
#define dns_trust_pending_answer ((dns_trust_t)dns_trust_pending_answer)
|
||||
|
||||
/*% Received in the additional section of a response. */
|
||||
dns_trust_additional = 2,
|
||||
dns_trust_additional = 3,
|
||||
#define dns_trust_additional ((dns_trust_t)dns_trust_additional)
|
||||
|
||||
/* Received in a referral response. */
|
||||
dns_trust_glue = 3,
|
||||
|
||||
/* Received in a referral response. */
|
||||
dns_trust_glue = 4,
|
||||
#define dns_trust_glue ((dns_trust_t)dns_trust_glue)
|
||||
|
||||
/* Answser from a non-authoritative server */
|
||||
dns_trust_answer = 4,
|
||||
|
||||
/* Answer from a non-authoritative server */
|
||||
dns_trust_answer = 5,
|
||||
#define dns_trust_answer ((dns_trust_t)dns_trust_answer)
|
||||
|
||||
|
||||
/* Received in the authority section as part of an
|
||||
authoritative response */
|
||||
dns_trust_authauthority = 5,
|
||||
dns_trust_authauthority = 6,
|
||||
#define dns_trust_authauthority ((dns_trust_t)dns_trust_authauthority)
|
||||
|
||||
/* Answser from an authoritative server */
|
||||
dns_trust_authanswer = 6,
|
||||
/* Answer from an authoritative server */
|
||||
dns_trust_authanswer = 7,
|
||||
#define dns_trust_authanswer ((dns_trust_t)dns_trust_authanswer)
|
||||
|
||||
/* Successfully DNSSEC validated */
|
||||
dns_trust_secure = 7,
|
||||
|
||||
/* Successfully DNSSEC validated */
|
||||
dns_trust_secure = 8,
|
||||
#define dns_trust_secure ((dns_trust_t)dns_trust_secure)
|
||||
|
||||
/* This server is authoritative */
|
||||
dns_trust_ultimate = 8
|
||||
dns_trust_ultimate = 9
|
||||
#define dns_trust_ultimate ((dns_trust_t)dns_trust_ultimate)
|
||||
};
|
||||
|
||||
#define DNS_TRUST_PENDING(x) ((x) == dns_trust_pending_answer || \
|
||||
(x) == dns_trust_pending_additional)
|
||||
#define DNS_TRUST_GLUE(x) ((x) == dns_trust_glue)
|
||||
|
||||
|
||||
/*%
|
||||
* Name checking severites.
|
||||
*/
|
||||
|
||||
@@ -774,7 +774,8 @@ dump_order_compare(const void *a, const void *b) {
|
||||
|
||||
static const char *trustnames[] = {
|
||||
"none",
|
||||
"pending",
|
||||
"pending-additional",
|
||||
"pending-answer",
|
||||
"additional",
|
||||
"glue",
|
||||
"answer",
|
||||
|
||||
@@ -3072,7 +3072,7 @@ cache_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) {
|
||||
}
|
||||
|
||||
if (dname_header != NULL &&
|
||||
(dname_header->trust != dns_trust_pending ||
|
||||
(!DNS_TRUST_PENDING(dname_header->trust) ||
|
||||
(search->options & DNS_DBFIND_PENDINGOK) != 0)) {
|
||||
/*
|
||||
* We increment the reference count on node to ensure that
|
||||
@@ -3586,7 +3586,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
||||
if (found == NULL ||
|
||||
(found->trust == dns_trust_glue &&
|
||||
((options & DNS_DBFIND_GLUEOK) == 0)) ||
|
||||
(found->trust == dns_trust_pending &&
|
||||
(DNS_TRUST_PENDING(found->trust) &&
|
||||
((options & DNS_DBFIND_PENDINGOK) == 0))) {
|
||||
/*
|
||||
* If there is an NS rdataset at this node, then this is the
|
||||
|
||||
@@ -3887,6 +3887,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
|
||||
* for it, unless it is glue.
|
||||
*/
|
||||
if (secure_domain && rdataset->trust != dns_trust_glue) {
|
||||
dns_trust_t trust;
|
||||
/*
|
||||
* RRSIGs are validated as part of validating the
|
||||
* type they cover.
|
||||
@@ -3923,12 +3924,34 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
|
||||
}
|
||||
|
||||
/*
|
||||
* Cache this rdataset/sigrdataset pair as
|
||||
* pending data.
|
||||
* Reject out of bailiwick additional records
|
||||
* without RRSIGs as they can't possibly validate
|
||||
* as "secure" and as we will never never want to
|
||||
* store these as "answers" after validation.
|
||||
*/
|
||||
rdataset->trust = dns_trust_pending;
|
||||
if (rdataset->trust == dns_trust_additional &&
|
||||
sigrdataset == NULL && EXTERNAL(rdataset))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* XXXMPA: If we store as "answer" after validating
|
||||
* then we need to do bailiwick processing and
|
||||
* also need to track whether RRsets are in or
|
||||
* out of bailiwick. This will require a another
|
||||
* pending trust level.
|
||||
*
|
||||
* Cache this rdataset/sigrdataset pair as
|
||||
* pending data. Track whether it was additional
|
||||
* or not.
|
||||
*/
|
||||
if (rdataset->trust == dns_trust_additional)
|
||||
trust = dns_trust_pending_additional;
|
||||
else
|
||||
trust = dns_trust_pending_answer;
|
||||
|
||||
rdataset->trust = trust;
|
||||
if (sigrdataset != NULL)
|
||||
sigrdataset->trust = dns_trust_pending;
|
||||
sigrdataset->trust = trust;
|
||||
if (!need_validation)
|
||||
addedrdataset = ardataset;
|
||||
else
|
||||
@@ -4276,7 +4299,7 @@ ncache_message(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
|
||||
for (trdataset = ISC_LIST_HEAD(tname->list);
|
||||
trdataset != NULL;
|
||||
trdataset = ISC_LIST_NEXT(trdataset, link))
|
||||
trdataset->trust = dns_trust_pending;
|
||||
trdataset->trust = dns_trust_pending_answer;
|
||||
result = dns_message_nextname(fctx->rmessage,
|
||||
DNS_SECTION_AUTHORITY);
|
||||
}
|
||||
|
||||
@@ -1174,7 +1174,7 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) {
|
||||
* We have an rrset for the given keyname.
|
||||
*/
|
||||
val->keyset = &val->frdataset;
|
||||
if (val->frdataset.trust == dns_trust_pending &&
|
||||
if (DNS_TRUST_PENDING(val->frdataset.trust) &&
|
||||
dns_rdataset_isassociated(&val->fsigrdataset))
|
||||
{
|
||||
/*
|
||||
@@ -1189,7 +1189,7 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) {
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
return (DNS_R_WAIT);
|
||||
} else if (val->frdataset.trust == dns_trust_pending) {
|
||||
} else if (DNS_TRUST_PENDING(val->frdataset.trust)) {
|
||||
/*
|
||||
* Having a pending key with no signature means that
|
||||
* something is broken.
|
||||
@@ -1805,7 +1805,7 @@ validatezonekey(dns_validator_t *val) {
|
||||
* We have DS records.
|
||||
*/
|
||||
val->dsset = &val->frdataset;
|
||||
if (val->frdataset.trust == dns_trust_pending &&
|
||||
if (DNS_TRUST_PENDING(val->frdataset.trust) &&
|
||||
dns_rdataset_isassociated(&val->fsigrdataset))
|
||||
{
|
||||
result = create_validator(val,
|
||||
@@ -1818,7 +1818,7 @@ validatezonekey(dns_validator_t *val) {
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
return (DNS_R_WAIT);
|
||||
} else if (val->frdataset.trust == dns_trust_pending) {
|
||||
} else if (DNS_TRUST_PENDING(val->frdataset.trust)) {
|
||||
/*
|
||||
* There should never be an unsigned DS.
|
||||
*/
|
||||
@@ -2667,7 +2667,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
|
||||
* There is no DS. If this is a delegation,
|
||||
* we maybe done.
|
||||
*/
|
||||
if (val->frdataset.trust == dns_trust_pending) {
|
||||
if (DNS_TRUST_PENDING(val->frdataset.trust)) {
|
||||
result = create_fetch(val, tname,
|
||||
dns_rdatatype_ds,
|
||||
dsfetched2,
|
||||
|
||||
@@ -570,7 +570,7 @@ crypto_recv(
|
||||
peer->issuer = emalloc(vallen + 1);
|
||||
strcpy(peer->issuer, peer->subject);
|
||||
temp32 = (fstamp >> 16) & 0xffff;
|
||||
sprintf(statstr,
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"flags 0x%x host %s signature %s", fstamp,
|
||||
peer->subject, OBJ_nid2ln(temp32));
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
@@ -636,7 +636,8 @@ crypto_recv(
|
||||
}
|
||||
peer->flash &= ~TEST8;
|
||||
temp32 = cinfo->nid;
|
||||
sprintf(statstr, "cert %s 0x%x %s (%u) fs %u",
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"cert %s 0x%x %s (%u) fs %u",
|
||||
cinfo->subject, cinfo->flags,
|
||||
OBJ_nid2ln(temp32), temp32,
|
||||
ntohl(ep->fstamp));
|
||||
@@ -685,7 +686,7 @@ crypto_recv(
|
||||
peer->crypto |= CRYPTO_FLAG_VRFY |
|
||||
CRYPTO_FLAG_PROV;
|
||||
peer->flash &= ~TEST8;
|
||||
sprintf(statstr, "iff fs %u",
|
||||
snprintf(statstr, NTP_MAXSTRLEN, "iff fs %u",
|
||||
ntohl(ep->fstamp));
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
#ifdef DEBUG
|
||||
@@ -733,7 +734,7 @@ crypto_recv(
|
||||
peer->crypto |= CRYPTO_FLAG_VRFY |
|
||||
CRYPTO_FLAG_PROV;
|
||||
peer->flash &= ~TEST8;
|
||||
sprintf(statstr, "gq fs %u",
|
||||
snprintf(statstr, NTP_MAXSTRLEN, "gq fs %u",
|
||||
ntohl(ep->fstamp));
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
#ifdef DEBUG
|
||||
@@ -774,7 +775,7 @@ crypto_recv(
|
||||
peer->crypto |= CRYPTO_FLAG_VRFY |
|
||||
CRYPTO_FLAG_PROV;
|
||||
peer->flash &= ~TEST8;
|
||||
sprintf(statstr, "mv fs %u",
|
||||
snprintf(statstr, NTP_MAXSTRLEN, "mv fs %u",
|
||||
ntohl(ep->fstamp));
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
#ifdef DEBUG
|
||||
@@ -828,7 +829,7 @@ crypto_recv(
|
||||
peer->crypto &= ~CRYPTO_FLAG_AUTO;
|
||||
peer->crypto |= CRYPTO_FLAG_AGREE;
|
||||
peer->flash &= ~TEST8;
|
||||
sprintf(statstr, "cook %x ts %u fs %u",
|
||||
snprintf(statstr, NTP_MAXSTRLEN, "cook %x ts %u fs %u",
|
||||
peer->pcookie, ntohl(ep->tstamp),
|
||||
ntohl(ep->fstamp));
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
@@ -893,7 +894,7 @@ crypto_recv(
|
||||
peer->crypto &= ~CRYPTO_FLAG_AUTO;
|
||||
peer->crypto |= CRYPTO_FLAG_AGREE;
|
||||
peer->flash &= ~TEST8;
|
||||
sprintf(statstr, "cook %x ts %u fs %u",
|
||||
snprintf(statstr, NTP_MAXSTRLEN, "cook %x ts %u fs %u",
|
||||
peer->pcookie, ntohl(ep->tstamp),
|
||||
ntohl(ep->fstamp));
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
@@ -944,7 +945,7 @@ crypto_recv(
|
||||
peer->pkeyid = bp->key;
|
||||
peer->crypto |= CRYPTO_FLAG_AUTO;
|
||||
peer->flash &= ~TEST8;
|
||||
sprintf(statstr,
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"auto seq %d key %x ts %u fs %u", bp->seq,
|
||||
bp->key, ntohl(ep->tstamp),
|
||||
ntohl(ep->fstamp));
|
||||
@@ -987,7 +988,8 @@ crypto_recv(
|
||||
peer->crypto |= CRYPTO_FLAG_SIGN;
|
||||
peer->flash &= ~TEST8;
|
||||
temp32 = cinfo->nid;
|
||||
sprintf(statstr, "sign %s 0x%x %s (%u) fs %u",
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"sign %s 0x%x %s (%u) fs %u",
|
||||
cinfo->issuer, cinfo->flags,
|
||||
OBJ_nid2ln(temp32), temp32,
|
||||
ntohl(ep->fstamp));
|
||||
@@ -1071,7 +1073,8 @@ crypto_recv(
|
||||
crypto_flags |= CRYPTO_FLAG_TAI;
|
||||
peer->crypto |= CRYPTO_FLAG_LEAP;
|
||||
peer->flash &= ~TEST8;
|
||||
sprintf(statstr, "leap %u ts %u fs %u", vallen,
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"leap %u ts %u fs %u", vallen,
|
||||
ntohl(ep->tstamp), ntohl(ep->fstamp));
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
#ifdef DEBUG
|
||||
@@ -1127,7 +1130,7 @@ crypto_recv(
|
||||
* cheerfully ignored, as the message is not sent.
|
||||
*/
|
||||
if (rval > XEVNT_TSP) {
|
||||
sprintf(statstr,
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"error %x opcode %x ts %u fs %u", rval,
|
||||
code, tstamp, fstamp);
|
||||
record_crypto_stats(&peer->srcadr, statstr);
|
||||
@@ -1453,7 +1456,8 @@ crypto_xmit(
|
||||
*/
|
||||
if (rval != XEVNT_OK) {
|
||||
opcode |= CRYPTO_ERROR;
|
||||
sprintf(statstr, "error %x opcode %x", rval, opcode);
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"error %x opcode %x", rval, opcode);
|
||||
record_crypto_stats(srcadr_sin, statstr);
|
||||
report_event(rval, NULL);
|
||||
#ifdef DEBUG
|
||||
@@ -1952,7 +1956,8 @@ crypto_update(void)
|
||||
if (EVP_SignFinal(&ctx, tai_leap.sig, &len, sign_pkey))
|
||||
tai_leap.siglen = htonl(len);
|
||||
}
|
||||
sprintf(statstr, "update ts %u", ntohl(hostval.tstamp));
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"update ts %u", ntohl(hostval.tstamp));
|
||||
record_crypto_stats(NULL, statstr);
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
@@ -3606,7 +3611,7 @@ crypto_key(
|
||||
*/
|
||||
if ((ptr = strrchr(linkname, '\n')) != NULL)
|
||||
*ptr = '\0';
|
||||
sprintf(statstr, "%s mod %d", &linkname[2],
|
||||
snprintf(statstr, NTP_MAXSTRLEN, "%s mod %d", &linkname[2],
|
||||
EVP_PKEY_size(pkey) * 8);
|
||||
record_crypto_stats(NULL, statstr);
|
||||
#ifdef DEBUG
|
||||
@@ -3715,8 +3720,8 @@ crypto_cert(
|
||||
|
||||
if ((ptr = strrchr(linkname, '\n')) != NULL)
|
||||
*ptr = '\0';
|
||||
sprintf(statstr, "%s 0x%x len %lu", &linkname[2], ret->flags,
|
||||
len);
|
||||
snprintf(statstr, NTP_MAXSTRLEN,
|
||||
"%s 0x%x len %lu", &linkname[2], ret->flags, len);
|
||||
record_crypto_stats(NULL, statstr);
|
||||
#ifdef DEBUG
|
||||
if (debug)
|
||||
@@ -3832,7 +3837,7 @@ crypto_tai(
|
||||
for (j = 0; j < i; j++)
|
||||
*ptr++ = htonl(leapsec[j]);
|
||||
crypto_flags |= CRYPTO_FLAG_TAI;
|
||||
sprintf(statstr, "%s fs %u leap %u len %u", cp, fstamp,
|
||||
snprintf(statstr, NTP_MAXSTRLEN, "%s fs %u leap %u len %u", cp, fstamp,
|
||||
leapsec[--j], len);
|
||||
record_crypto_stats(NULL, statstr);
|
||||
#ifdef DEBUG
|
||||
|
||||
@@ -409,6 +409,7 @@ process_private(
|
||||
int mod_okay
|
||||
)
|
||||
{
|
||||
static u_long quiet_until;
|
||||
struct req_pkt *inpkt;
|
||||
struct req_pkt_tail *tailinpkt;
|
||||
struct sockaddr_storage *srcadr;
|
||||
@@ -444,8 +445,14 @@ process_private(
|
||||
|| (++ec, INFO_MBZ(inpkt->mbz_itemsize) != 0)
|
||||
|| (++ec, rbufp->recv_length < REQ_LEN_HDR)
|
||||
) {
|
||||
msyslog(LOG_ERR, "process_private: INFO_ERR_FMT: test %d failed, pkt from %s", ec, stoa(srcadr));
|
||||
req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
|
||||
NLOG(NLOG_SYSEVENT)
|
||||
if (current_time >= quiet_until) {
|
||||
msyslog(LOG_ERR,
|
||||
"process_private: drop test %d"
|
||||
" failed, pkt from %s",
|
||||
ec, stoa(srcadr));
|
||||
quiet_until = current_time + 60;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -141,10 +141,8 @@ int __opiereadrec FUNCTION((opie), struct opie *opie)
|
||||
|
||||
if (c = strchr(opie->opie_principal, ':'))
|
||||
*c = 0;
|
||||
if (strlen(opie->opie_principal) > OPIE_PRINCIPAL_MAX)
|
||||
(opie->opie_principal)[OPIE_PRINCIPAL_MAX] = 0;
|
||||
|
||||
strcpy(principal, opie->opie_principal);
|
||||
strlcpy(principal, opie->opie_principal, sizeof(principal));
|
||||
|
||||
do {
|
||||
if ((opie->opie_recstart = ftell(f)) < 0)
|
||||
|
||||
@@ -2375,6 +2375,9 @@ int ssl3_renegotiate(SSL *s)
|
||||
if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)
|
||||
return(0);
|
||||
|
||||
if (1)
|
||||
return(0);
|
||||
|
||||
s->s3->renegotiate=1;
|
||||
return(1);
|
||||
}
|
||||
|
||||
@@ -976,9 +976,7 @@ start:
|
||||
if (s->msg_callback)
|
||||
s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->s3->handshake_fragment, 4, s, s->msg_callback_arg);
|
||||
|
||||
if (SSL_is_init_finished(s) &&
|
||||
!(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
|
||||
!s->s3->renegotiate)
|
||||
if (0)
|
||||
{
|
||||
ssl3_renegotiate(s);
|
||||
if (ssl3_renegotiate_check(s))
|
||||
@@ -1109,8 +1107,7 @@ start:
|
||||
/* Unexpected handshake message (Client Hello, or protocol violation) */
|
||||
if ((s->s3->handshake_fragment_len >= 4) && !s->in_handshake)
|
||||
{
|
||||
if (((s->state&SSL_ST_MASK) == SSL_ST_OK) &&
|
||||
!(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
|
||||
if (0)
|
||||
{
|
||||
#if 0 /* worked only because C operator preferences are not as expected (and
|
||||
* because this is not really needed for clients except for detecting
|
||||
|
||||
@@ -672,6 +672,13 @@ int ssl3_get_client_hello(SSL *s)
|
||||
#endif
|
||||
STACK_OF(SSL_CIPHER) *ciphers=NULL;
|
||||
|
||||
if (s->new_session)
|
||||
{
|
||||
al=SSL_AD_HANDSHAKE_FAILURE;
|
||||
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
|
||||
goto f_err;
|
||||
}
|
||||
|
||||
/* We do this so that we will respond with our native type.
|
||||
* If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
|
||||
* This down switching should be handled by a different method.
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
db
|
||||
entropy uname=operator gname=operator mode=0700
|
||||
..
|
||||
freebsd-update
|
||||
freebsd-update mode=0700
|
||||
..
|
||||
ipf mode=0700
|
||||
..
|
||||
|
||||
+38
-12
@@ -4715,16 +4715,41 @@ _malloc_thread_cleanup(void)
|
||||
void
|
||||
_malloc_prefork(void)
|
||||
{
|
||||
unsigned i;
|
||||
bool again;
|
||||
unsigned i, j;
|
||||
arena_t *larenas[narenas], *tarenas[narenas];
|
||||
|
||||
/* Acquire all mutexes in a safe order. */
|
||||
|
||||
malloc_spin_lock(&arenas_lock);
|
||||
for (i = 0; i < narenas; i++) {
|
||||
if (arenas[i] != NULL)
|
||||
malloc_spin_lock(&arenas[i]->lock);
|
||||
}
|
||||
malloc_spin_unlock(&arenas_lock);
|
||||
/*
|
||||
* arenas_lock must be acquired after all of the arena mutexes, in
|
||||
* order to avoid potential deadlock with arena_lock_balance[_hard]().
|
||||
* Since arenas_lock protects the arenas array, the following code has
|
||||
* to race with arenas_extend() callers until it succeeds in locking
|
||||
* all arenas before locking arenas_lock.
|
||||
*/
|
||||
memset(larenas, 0, sizeof(arena_t *) * narenas);
|
||||
do {
|
||||
again = false;
|
||||
|
||||
malloc_spin_lock(&arenas_lock);
|
||||
for (i = 0; i < narenas; i++) {
|
||||
if (arenas[i] != larenas[i]) {
|
||||
memcpy(tarenas, arenas, sizeof(arena_t *) *
|
||||
narenas);
|
||||
malloc_spin_unlock(&arenas_lock);
|
||||
for (j = 0; j < narenas; j++) {
|
||||
if (larenas[j] != tarenas[j]) {
|
||||
larenas[j] = tarenas[j];
|
||||
malloc_spin_lock(
|
||||
&larenas[j]->lock);
|
||||
}
|
||||
}
|
||||
again = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (again);
|
||||
|
||||
malloc_mutex_lock(&base_mtx);
|
||||
|
||||
@@ -4739,6 +4764,7 @@ void
|
||||
_malloc_postfork(void)
|
||||
{
|
||||
unsigned i;
|
||||
arena_t *larenas[narenas];
|
||||
|
||||
/* Release all mutexes, now that fork() has completed. */
|
||||
|
||||
@@ -4750,12 +4776,12 @@ _malloc_postfork(void)
|
||||
|
||||
malloc_mutex_unlock(&base_mtx);
|
||||
|
||||
malloc_spin_lock(&arenas_lock);
|
||||
for (i = 0; i < narenas; i++) {
|
||||
if (arenas[i] != NULL)
|
||||
malloc_spin_unlock(&arenas[i]->lock);
|
||||
}
|
||||
memcpy(larenas, arenas, sizeof(arena_t *) * narenas);
|
||||
malloc_spin_unlock(&arenas_lock);
|
||||
for (i = 0; i < narenas; i++) {
|
||||
if (larenas[i] != NULL)
|
||||
malloc_spin_unlock(&larenas[i]->lock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -107,7 +107,7 @@ This restriction can be removed by setting the
|
||||
.Va vfs.usermount
|
||||
.Xr sysctl 8
|
||||
variable
|
||||
to a non-zero value.
|
||||
to a non-zero value; see the BUGS section for more information.
|
||||
.Pp
|
||||
The following
|
||||
.Fa flags
|
||||
@@ -370,3 +370,10 @@ functions appeared in
|
||||
.At v6 .
|
||||
.Sh BUGS
|
||||
Some of the error codes need translation to more obvious messages.
|
||||
.Pp
|
||||
Allowing untrusted users to mount arbitrary media, e.g. by enabling
|
||||
.Va vfs.usermount ,
|
||||
should not be considered safe.
|
||||
Most file systems in
|
||||
.Fx
|
||||
were not built to safeguard against malicious devices.
|
||||
@@ -360,11 +360,12 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
|
||||
* future processes to honor the potentially un-safe variables.
|
||||
*/
|
||||
if (!trust) {
|
||||
unsetenv(LD_ "PRELOAD");
|
||||
unsetenv(LD_ "LIBMAP");
|
||||
unsetenv(LD_ "LIBRARY_PATH");
|
||||
unsetenv(LD_ "LIBMAP_DISABLE");
|
||||
unsetenv(LD_ "DEBUG");
|
||||
if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP") ||
|
||||
unsetenv(LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||
|
||||
unsetenv(LD_ "DEBUG")) {
|
||||
_rtld_error("environment corrupt; aborting");
|
||||
die();
|
||||
}
|
||||
}
|
||||
ld_debug = getenv(LD_ "DEBUG");
|
||||
libmap_disable = getenv(LD_ "LIBMAP_DISABLE") != NULL;
|
||||
|
||||
@@ -59,10 +59,14 @@ zfs_init_vattr(vattr_t *vap, uint64_t mask, uint64_t mode,
|
||||
{
|
||||
VATTR_NULL(vap);
|
||||
vap->va_mask = (uint_t)mask;
|
||||
vap->va_type = IFTOVT(mode);
|
||||
vap->va_mode = mode & MODEMASK;
|
||||
vap->va_uid = (uid_t)uid;
|
||||
vap->va_gid = (gid_t)gid;
|
||||
if (mask & AT_TYPE)
|
||||
vap->va_type = IFTOVT(mode);
|
||||
if (mask & AT_MODE)
|
||||
vap->va_mode = mode & MODEMASK;
|
||||
if (mask & AT_UID)
|
||||
vap->va_uid = (uid_t)uid;
|
||||
if (mask & AT_GID)
|
||||
vap->va_gid = (gid_t)gid;
|
||||
vap->va_rdev = zfs_cmpldev(rdev);
|
||||
vap->va_nodeid = nodeid;
|
||||
}
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@
|
||||
|
||||
TYPE="FreeBSD"
|
||||
REVISION="7.2"
|
||||
BRANCH="RELEASE"
|
||||
BRANCH="RELEASE-p8"
|
||||
if [ "X${BRANCH_OVERRIDE}" != "X" ]; then
|
||||
BRANCH=${BRANCH_OVERRIDE}
|
||||
fi
|
||||
|
||||
@@ -5895,6 +5895,9 @@ bce_rx_intr(struct bce_softc *sc)
|
||||
/* Set the total packet length. */
|
||||
m0->m_pkthdr.len = m0->m_len = pkt_len;
|
||||
}
|
||||
#else
|
||||
/* Set the total packet length. */
|
||||
m0->m_pkthdr.len = m0->m_len = pkt_len;
|
||||
#endif
|
||||
|
||||
/* Remove the trailing Ethernet FCS. */
|
||||
|
||||
@@ -1486,7 +1486,8 @@ fxp_encap(struct fxp_softc *sc, struct mbuf **m_head)
|
||||
* checksum in the first frame driver should compute it.
|
||||
*/
|
||||
ip->ip_sum = 0;
|
||||
ip->ip_len = htons(ifp->if_mtu);
|
||||
ip->ip_len = htons(m->m_pkthdr.tso_segsz + (ip->ip_hl << 2) +
|
||||
(tcp->th_off << 2));
|
||||
tcp->th_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr,
|
||||
htons(IPPROTO_TCP + (tcp->th_off << 2) +
|
||||
m->m_pkthdr.tso_segsz));
|
||||
|
||||
@@ -890,6 +890,7 @@ devfs_open(struct vop_open_args *ap)
|
||||
if (fp != NULL) {
|
||||
FILE_LOCK(fp);
|
||||
fp->f_data = dev;
|
||||
fp->f_vnode = vp;
|
||||
FILE_UNLOCK(fp);
|
||||
}
|
||||
fpop = td->td_fpop;
|
||||
|
||||
+12
-3
@@ -122,6 +122,11 @@ u_long ps_arg_cache_limit = PAGE_SIZE / 16;
|
||||
SYSCTL_ULONG(_kern, OID_AUTO, ps_arg_cache_limit, CTLFLAG_RW,
|
||||
&ps_arg_cache_limit, 0, "");
|
||||
|
||||
static int map_at_zero = 1;
|
||||
TUNABLE_INT("security.bsd.map_at_zero", &map_at_zero);
|
||||
SYSCTL_INT(_security_bsd, OID_AUTO, map_at_zero, CTLFLAG_RW, &map_at_zero, 0,
|
||||
"Permit processes to map an object at virtual address 0.");
|
||||
|
||||
static int
|
||||
sysctl_kern_ps_strings(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
@@ -939,7 +944,7 @@ exec_new_vmspace(imgp, sv)
|
||||
int error;
|
||||
struct proc *p = imgp->proc;
|
||||
struct vmspace *vmspace = p->p_vmspace;
|
||||
vm_offset_t stack_addr;
|
||||
vm_offset_t sv_minuser, stack_addr;
|
||||
vm_map_t map;
|
||||
u_long ssiz;
|
||||
|
||||
@@ -955,13 +960,17 @@ exec_new_vmspace(imgp, sv)
|
||||
* not disrupted
|
||||
*/
|
||||
map = &vmspace->vm_map;
|
||||
if (vmspace->vm_refcnt == 1 && vm_map_min(map) == sv->sv_minuser &&
|
||||
if (map_at_zero)
|
||||
sv_minuser = sv->sv_minuser;
|
||||
else
|
||||
sv_minuser = MAX(sv->sv_minuser, PAGE_SIZE);
|
||||
if (vmspace->vm_refcnt == 1 && vm_map_min(map) == sv_minuser &&
|
||||
vm_map_max(map) == sv->sv_maxuser) {
|
||||
shmexit(vmspace);
|
||||
pmap_remove_pages(vmspace_pmap(vmspace));
|
||||
vm_map_remove(map, vm_map_min(map), vm_map_max(map));
|
||||
} else {
|
||||
error = vmspace_exec(p, sv->sv_minuser, sv->sv_maxuser);
|
||||
error = vmspace_exec(p, sv_minuser, sv->sv_maxuser);
|
||||
if (error)
|
||||
return (error);
|
||||
vmspace = p->p_vmspace;
|
||||
|
||||
+15
-9
@@ -1822,18 +1822,24 @@ sched_switch_migrate(struct tdq *tdq, struct thread *td, int flags)
|
||||
*/
|
||||
spinlock_enter();
|
||||
thread_block_switch(td); /* This releases the lock on tdq. */
|
||||
TDQ_LOCK(tdn);
|
||||
tdq_add(tdn, td, flags);
|
||||
tdq_notify(td->td_sched);
|
||||
|
||||
/*
|
||||
* After we unlock tdn the new cpu still can't switch into this
|
||||
* thread until we've unblocked it in cpu_switch(). The lock
|
||||
* pointers may match in the case of HTT cores. Don't unlock here
|
||||
* or we can deadlock when the other CPU runs the IPI handler.
|
||||
* Acquire both run-queue locks before placing the thread on the new
|
||||
* run-queue to avoid deadlocks created by placing a thread with a
|
||||
* blocked lock on the run-queue of a remote processor. The deadlock
|
||||
* occurs when a third processor attempts to lock the two queues in
|
||||
* question while the target processor is spinning with its own
|
||||
* run-queue lock held while waiting for the blocked lock to clear.
|
||||
*/
|
||||
if (TDQ_LOCKPTR(tdn) != TDQ_LOCKPTR(tdq)) {
|
||||
TDQ_UNLOCK(tdn);
|
||||
if (TDQ_LOCKPTR(tdn) == TDQ_LOCKPTR(tdq)) {
|
||||
TDQ_LOCK(tdq);
|
||||
tdq_add(tdn, td, flags);
|
||||
tdq_notify(td->td_sched);
|
||||
} else {
|
||||
tdq_lock_pair(tdn, tdq);
|
||||
tdq_add(tdn, td, flags);
|
||||
tdq_notify(td->td_sched);
|
||||
TDQ_UNLOCK(tdn);
|
||||
}
|
||||
spinlock_exit();
|
||||
#endif
|
||||
|
||||
@@ -755,6 +755,8 @@ pipe_build_write_buffer(wpipe, uio)
|
||||
pmap = vmspace_pmap(curproc->p_vmspace);
|
||||
endaddr = round_page((vm_offset_t)uio->uio_iov->iov_base + size);
|
||||
addr = trunc_page((vm_offset_t)uio->uio_iov->iov_base);
|
||||
if (endaddr < addr)
|
||||
return (EFAULT);
|
||||
for (i = 0; addr < endaddr; addr += PAGE_SIZE, i++) {
|
||||
/*
|
||||
* vm_fault_quick() can sleep. Consequently,
|
||||
|
||||
+1
-1
@@ -354,6 +354,7 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
|
||||
case SIOCSRTRFLUSH_IN6:
|
||||
case SIOCSDEFIFACE_IN6:
|
||||
case SIOCSIFINFO_FLAGS:
|
||||
case SIOCSIFINFO_IN6:
|
||||
if (td != NULL) {
|
||||
error = priv_check(td, PRIV_NETINET_ND6);
|
||||
if (error)
|
||||
@@ -362,7 +363,6 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
|
||||
/* FALLTHROUGH */
|
||||
case OSIOCGIFINFO_IN6:
|
||||
case SIOCGIFINFO_IN6:
|
||||
case SIOCSIFINFO_IN6:
|
||||
case SIOCGDRLST_IN6:
|
||||
case SIOCGPRLST_IN6:
|
||||
case SIOCGNBRINFO_IN6:
|
||||
|
||||
@@ -1002,6 +1002,11 @@ nfs_mount(struct mount *mp, struct thread *td)
|
||||
nfs_decode_args(mp, nmp, &args, NULL);
|
||||
goto out;
|
||||
}
|
||||
if (args.fhsize < 0 || args.fhsize > NFSX_V3FHMAX) {
|
||||
vfs_mount_error(mp, "Bad file handle");
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Make the nfs_ip_paranoia sysctl serve as the default connection
|
||||
|
||||
@@ -533,6 +533,7 @@ fetch_check_params () {
|
||||
echo ${WORKDIR}
|
||||
exit 1
|
||||
fi
|
||||
chmod 700 ${WORKDIR}
|
||||
cd ${WORKDIR} || exit 1
|
||||
|
||||
# Generate release number. The s/SECURITY/RELEASE/ bit exists
|
||||
|
||||
Reference in new issue
Block a user