aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/cross-bootstrap-tools.yml2
-rw-r--r--bin/cat/cat.c10
-rw-r--r--contrib/capsicum-test/syscalls.h13
-rw-r--r--contrib/llvm-project/clang/lib/CodeGen/CGBuiltin.cpp25
-rw-r--r--contrib/llvm-project/clang/lib/CodeGen/CGCall.cpp5
-rw-r--r--contrib/llvm-project/clang/lib/CodeGen/CGObjCGNU.cpp34
-rw-r--r--contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h3
-rw-r--r--contrib/llvm-project/clang/lib/CodeGen/CoverageMappingGen.cpp11
-rw-r--r--contrib/llvm-project/clang/lib/CodeGen/MicrosoftCXXABI.cpp12
-rw-r--r--contrib/llvm-project/clang/lib/Format/ContinuationIndenter.cpp8
-rw-r--r--contrib/llvm-project/clang/lib/Format/TokenAnnotator.cpp10
-rw-r--r--contrib/llvm-project/clang/lib/Format/UnwrappedLineParser.cpp40
-rw-r--r--contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/Taint.cpp14
-rw-r--r--contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/cert/InvalidPtrChecker.cpp6
-rw-r--r--contrib/llvm-project/libcxx/modules/std.compat/cstdlib.inc2
-rw-r--r--contrib/llvm-project/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h20
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/CodeGenPrepare.cpp2
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp4
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp4
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LoadStoreOpt.cpp48
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp9
-rw-r--r--contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrInfo.td10
-rw-r--r--contrib/llvm-project/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp10
-rw-r--r--contrib/llvm-project/llvm/lib/Target/RISCV/RISCVISelLowering.cpp2
-rw-r--r--contrib/llvm-project/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp7
-rw-r--r--contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp29
-rw-r--r--contrib/llvm-project/llvm/lib/Target/X86/X86Subtarget.h3
-rw-r--r--contrib/llvm-project/llvm/lib/TargetParser/Host.cpp5
-rw-r--r--contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp2
-rw-r--r--contrib/llvm-project/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp3
-rw-r--r--contrib/llvm-project/openmp/runtime/src/kmp_settings.cpp2
-rw-r--r--contrib/llvm-project/openmp/runtime/src/z_Linux_util.cpp6
-rw-r--r--etc/mtree/BSD.usr.dist20
-rw-r--r--lib/clang/include/VCSVersion.inc6
-rw-r--r--lib/clang/include/clang/Basic/Version.inc6
-rw-r--r--lib/clang/include/lld/Common/Version.inc2
-rw-r--r--lib/clang/include/lldb/Version/Version.inc6
-rw-r--r--lib/clang/include/llvm/Config/AsmParsers.def3
-rw-r--r--lib/clang/include/llvm/Config/AsmPrinters.def3
-rw-r--r--lib/clang/include/llvm/Config/Disassemblers.def3
-rw-r--r--lib/clang/include/llvm/Config/Targets.def3
-rw-r--r--lib/clang/include/llvm/Config/config.h4
-rw-r--r--lib/clang/include/llvm/Config/llvm-config.h8
-rw-r--r--lib/clang/include/llvm/Support/VCSRevision.h2
-rw-r--r--lib/libc/gen/dlopen.38
-rw-r--r--lib/libc/stdlib/cxa_thread_atexit_impl.c2
-rw-r--r--lib/libc/sys/clock_gettime.245
-rw-r--r--lib/libpfctl/libpfctl.c2
-rw-r--r--lib/libpfctl/libpfctl.h2
-rw-r--r--libexec/rtld-elf/rtld.124
-rw-r--r--libexec/rtld-elf/rtld.c35
-rw-r--r--libexec/tftpd/tftpd.86
-rw-r--r--share/man/man4/Makefile1
-rw-r--r--share/man/man4/nfslockd.445
-rw-r--r--share/man/man4/smsc.412
-rw-r--r--share/man/man4/vmm.415
-rw-r--r--sys/dev/etherswitch/ip17x/ip17x.c4
-rw-r--r--sys/dev/etherswitch/ukswitch/ukswitch.c4
-rw-r--r--sys/dev/mlx5/mlx5_en/mlx5_en_main.c3
-rw-r--r--sys/dev/usb/net/if_smsc.c4
-rw-r--r--sys/fs/nfs/nfs_var.h2
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c12
-rw-r--r--sys/fs/nfsserver/nfs_nfsdserv.c11
-rw-r--r--sys/kern/kern_umtx.c30
-rw-r--r--sys/kern/sched_4bsd.c12
-rw-r--r--sys/kern/sched_ule.c10
-rw-r--r--sys/net/if_bridge.c113
-rw-r--r--sys/netinet/in_fib_dxr.c89
-rw-r--r--sys/netinet/ip_fw.h2
-rw-r--r--sys/netinet6/in6.c9
-rw-r--r--sys/netpfil/pf/pf.c4
-rw-r--r--usr.bin/expand/expand.18
-rw-r--r--usr.bin/split/split.c4
-rw-r--r--usr.sbin/adduser/adduser.sh43
-rw-r--r--usr.sbin/pw/pw.c13
-rw-r--r--usr.sbin/pw/pw.h24
-rw-r--r--usr.sbin/pw/pw_group.c37
-rw-r--r--usr.sbin/pw/pw_user.c51
-rwxr-xr-xusr.sbin/pw/tests/pw_useradd_test.sh17
-rw-r--r--usr.sbin/rpc.lockd/lockd.c3
-rw-r--r--usr.sbin/rpc.lockd/rpc.lockd.85
81 files changed, 723 insertions, 415 deletions
diff --git a/.github/workflows/cross-bootstrap-tools.yml b/.github/workflows/cross-bootstrap-tools.yml
index 47349a517a1f..78ba1560e5de 100644
--- a/.github/workflows/cross-bootstrap-tools.yml
+++ b/.github/workflows/cross-bootstrap-tools.yml
@@ -30,7 +30,7 @@ jobs:
pkgs: bmake libarchive-dev clang-14 lld-14
- os: macos-latest
compiler: clang-13
- cross-bindir: /usr/local/opt/llvm@13/bin
+ cross-bindir: /opt/homebrew/opt/llvm@13/bin
pkgs: bmake libarchive llvm@13
- target_arch: amd64
target: amd64
diff --git a/bin/cat/cat.c b/bin/cat/cat.c
index dc6e6417dc49..48294be5c5b5 100644
--- a/bin/cat/cat.c
+++ b/bin/cat/cat.c
@@ -138,7 +138,7 @@ init_casper_net(cap_channel_t *casper)
familylimit = AF_LOCAL;
cap_net_limit_name2addr_family(limit, &familylimit, 1);
- if (cap_net_limit(limit) < 0)
+ if (cap_net_limit(limit) != 0)
err(EXIT_FAILURE, "unable to apply limits");
}
#endif
@@ -211,7 +211,7 @@ main(int argc, char *argv[])
stdout_lock.l_start = 0;
stdout_lock.l_type = F_WRLCK;
stdout_lock.l_whence = SEEK_SET;
- if (fcntl(STDOUT_FILENO, F_SETLKW, &stdout_lock) == -1)
+ if (fcntl(STDOUT_FILENO, F_SETLKW, &stdout_lock) != 0)
err(EXIT_FAILURE, "stdout");
}
@@ -219,7 +219,7 @@ main(int argc, char *argv[])
caph_cache_catpages();
- if (caph_enter_casper() < 0)
+ if (caph_enter_casper() != 0)
err(EXIT_FAILURE, "capsicum");
if (bflag || eflag || nflag || sflag || tflag || vflag)
@@ -456,7 +456,7 @@ udom_open(const char *path, int flags)
errno = serrno;
return (-1);
}
- if (caph_rights_limit(fd, &rights) < 0) {
+ if (caph_rights_limit(fd, &rights) != 0) {
serrno = errno;
close(fd);
freeaddrinfo(res0);
@@ -494,7 +494,7 @@ udom_open(const char *path, int flags)
}
cap_rights_clear(&rights, CAP_CONNECT, CAP_SHUTDOWN);
- if (caph_rights_limit(fd, &rights) < 0) {
+ if (caph_rights_limit(fd, &rights) != 0) {
serrno = errno;
close(fd);
errno = serrno;
diff --git a/contrib/capsicum-test/syscalls.h b/contrib/capsicum-test/syscalls.h
index 592a1677e1f1..3ea8803c2f64 100644
--- a/contrib/capsicum-test/syscalls.h
+++ b/contrib/capsicum-test/syscalls.h
@@ -47,16 +47,29 @@ inline int bogus_mount_() {
/* Mappings for extended attribute functions */
#include <sys/extattr.h>
+#include <errno.h>
+static const char *fbsd_extattr_skip_prefix(const char *p) {
+ if (*p++ == 'u' && *p++ == 's' && *p++ == 'e' && *p++ == 'r' && *p++ == '.')
+ return p;
+ errno = EINVAL;
+ return NULL;
+}
inline ssize_t flistxattr_(int fd, char *list, size_t size) {
return extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, list, size);
}
inline ssize_t fgetxattr_(int fd, const char *name, void *value, size_t size) {
+ if (!(name = fbsd_extattr_skip_prefix(name)))
+ return -1;
return extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name, value, size);
}
inline int fsetxattr_(int fd, const char *name, const void *value, size_t size, int) {
+ if (!(name = fbsd_extattr_skip_prefix(name)))
+ return -1;
return extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, name, value, size);
}
inline int fremovexattr_(int fd, const char *name) {
+ if (!(name = fbsd_extattr_skip_prefix(name)))
+ return -1;
return extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name);
}
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CGBuiltin.cpp b/contrib/llvm-project/clang/lib/CodeGen/CGBuiltin.cpp
index a4f26a6f0eb1..44ddd2428b10 100644
--- a/contrib/llvm-project/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/contrib/llvm-project/clang/lib/CodeGen/CGBuiltin.cpp
@@ -823,29 +823,32 @@ const FieldDecl *CodeGenFunction::FindFlexibleArrayMemberField(
ASTContext &Ctx, const RecordDecl *RD, StringRef Name, uint64_t &Offset) {
const LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel =
getLangOpts().getStrictFlexArraysLevel();
- unsigned FieldNo = 0;
- bool IsUnion = RD->isUnion();
+ uint32_t FieldNo = 0;
- for (const Decl *D : RD->decls()) {
- if (const auto *Field = dyn_cast<FieldDecl>(D);
- Field && (Name.empty() || Field->getNameAsString() == Name) &&
+ if (RD->isImplicit())
+ return nullptr;
+
+ for (const FieldDecl *FD : RD->fields()) {
+ if ((Name.empty() || FD->getNameAsString() == Name) &&
Decl::isFlexibleArrayMemberLike(
- Ctx, Field, Field->getType(), StrictFlexArraysLevel,
+ Ctx, FD, FD->getType(), StrictFlexArraysLevel,
/*IgnoreTemplateOrMacroSubstitution=*/true)) {
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
Offset += Layout.getFieldOffset(FieldNo);
- return Field;
+ return FD;
}
- if (const auto *Record = dyn_cast<RecordDecl>(D))
- if (const FieldDecl *Field =
- FindFlexibleArrayMemberField(Ctx, Record, Name, Offset)) {
+ QualType Ty = FD->getType();
+ if (Ty->isRecordType()) {
+ if (const FieldDecl *Field = FindFlexibleArrayMemberField(
+ Ctx, Ty->getAsRecordDecl(), Name, Offset)) {
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
Offset += Layout.getFieldOffset(FieldNo);
return Field;
}
+ }
- if (!IsUnion && isa<FieldDecl>(D))
+ if (!RD->isUnion())
++FieldNo;
}
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CGCall.cpp b/contrib/llvm-project/clang/lib/CodeGen/CGCall.cpp
index 28c211aa631e..a6a2f3595fe7 100644
--- a/contrib/llvm-project/clang/lib/CodeGen/CGCall.cpp
+++ b/contrib/llvm-project/clang/lib/CodeGen/CGCall.cpp
@@ -1581,6 +1581,11 @@ bool CodeGenModule::ReturnTypeUsesSRet(const CGFunctionInfo &FI) {
return RI.isIndirect() || (RI.isInAlloca() && RI.getInAllocaSRet());
}
+bool CodeGenModule::ReturnTypeHasInReg(const CGFunctionInfo &FI) {
+ const auto &RI = FI.getReturnInfo();
+ return RI.getInReg();
+}
+
bool CodeGenModule::ReturnSlotInterferesWithArgs(const CGFunctionInfo &FI) {
return ReturnTypeUsesSRet(FI) &&
getTargetCodeGenInfo().doesReturnSlotInterfereWithArgs();
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CGObjCGNU.cpp b/contrib/llvm-project/clang/lib/CodeGen/CGObjCGNU.cpp
index a36b0cdddaf0..05e3f8d4bfc2 100644
--- a/contrib/llvm-project/clang/lib/CodeGen/CGObjCGNU.cpp
+++ b/contrib/llvm-project/clang/lib/CodeGen/CGObjCGNU.cpp
@@ -2903,23 +2903,29 @@ CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF,
break;
case CodeGenOptions::Mixed:
case CodeGenOptions::NonLegacy:
+ StringRef name = "objc_msgSend";
if (CGM.ReturnTypeUsesFPRet(ResultType)) {
- imp =
- CGM.CreateRuntimeFunction(llvm::FunctionType::get(IdTy, IdTy, true),
- "objc_msgSend_fpret")
- .getCallee();
+ name = "objc_msgSend_fpret";
} else if (CGM.ReturnTypeUsesSRet(MSI.CallInfo)) {
- // The actual types here don't matter - we're going to bitcast the
- // function anyway
- imp =
- CGM.CreateRuntimeFunction(llvm::FunctionType::get(IdTy, IdTy, true),
- "objc_msgSend_stret")
- .getCallee();
- } else {
- imp = CGM.CreateRuntimeFunction(
- llvm::FunctionType::get(IdTy, IdTy, true), "objc_msgSend")
- .getCallee();
+ name = "objc_msgSend_stret";
+
+ // The address of the memory block is be passed in x8 for POD type,
+ // or in x0 for non-POD type (marked as inreg).
+ bool shouldCheckForInReg =
+ CGM.getContext()
+ .getTargetInfo()
+ .getTriple()
+ .isWindowsMSVCEnvironment() &&
+ CGM.getContext().getTargetInfo().getTriple().isAArch64();
+ if (shouldCheckForInReg && CGM.ReturnTypeHasInReg(MSI.CallInfo)) {
+ name = "objc_msgSend_stret2";
+ }
}
+ // The actual types here don't matter - we're going to bitcast the
+ // function anyway
+ imp = CGM.CreateRuntimeFunction(llvm::FunctionType::get(IdTy, IdTy, true),
+ name)
+ .getCallee();
}
// Reset the receiver in case the lookup modified it
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h b/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h
index ec34680fd3f7..d9ece4d98eec 100644
--- a/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h
+++ b/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h
@@ -1239,6 +1239,9 @@ public:
/// Return true iff the given type uses 'sret' when used as a return type.
bool ReturnTypeUsesSRet(const CGFunctionInfo &FI);
+ /// Return true iff the given type has `inreg` set.
+ bool ReturnTypeHasInReg(const CGFunctionInfo &FI);
+
/// Return true iff the given type uses an argument slot when 'sret' is used
/// as a return type.
bool ReturnSlotInterferesWithArgs(const CGFunctionInfo &FI);
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CoverageMappingGen.cpp b/contrib/llvm-project/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0c43317642bc..ae4e6d4c88c0 100644
--- a/contrib/llvm-project/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/contrib/llvm-project/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -1207,6 +1207,12 @@ struct CounterCoverageMappingBuilder
/// Find a valid gap range between \p AfterLoc and \p BeforeLoc.
std::optional<SourceRange> findGapAreaBetween(SourceLocation AfterLoc,
SourceLocation BeforeLoc) {
+ // Some statements (like AttributedStmt and ImplicitValueInitExpr) don't
+ // have valid source locations. Do not emit a gap region if this is the case
+ // in either AfterLoc end or BeforeLoc end.
+ if (AfterLoc.isInvalid() || BeforeLoc.isInvalid())
+ return std::nullopt;
+
// If AfterLoc is in function-like macro, use the right parenthesis
// location.
if (AfterLoc.isMacroID()) {
@@ -1370,9 +1376,8 @@ struct CounterCoverageMappingBuilder
for (const Stmt *Child : S->children())
if (Child) {
// If last statement contains terminate statements, add a gap area
- // between the two statements. Skipping attributed statements, because
- // they don't have valid start location.
- if (LastStmt && HasTerminateStmt && !isa<AttributedStmt>(Child)) {
+ // between the two statements.
+ if (LastStmt && HasTerminateStmt) {
auto Gap = findGapAreaBetween(getEnd(LastStmt), getStart(Child));
if (Gap)
fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(),
diff --git a/contrib/llvm-project/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/contrib/llvm-project/clang/lib/CodeGen/MicrosoftCXXABI.cpp
index 172c4c937b97..4d0f4c63f843 100644
--- a/contrib/llvm-project/clang/lib/CodeGen/MicrosoftCXXABI.cpp
+++ b/contrib/llvm-project/clang/lib/CodeGen/MicrosoftCXXABI.cpp
@@ -1135,9 +1135,15 @@ static bool isTrivialForMSVC(const CXXRecordDecl *RD, QualType Ty,
return false;
if (RD->hasNonTrivialCopyAssignment())
return false;
- for (const CXXConstructorDecl *Ctor : RD->ctors())
- if (Ctor->isUserProvided())
- return false;
+ for (const Decl *D : RD->decls()) {
+ if (auto *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
+ if (Ctor->isUserProvided())
+ return false;
+ } else if (auto *Template = dyn_cast<FunctionTemplateDecl>(D)) {
+ if (isa<CXXConstructorDecl>(Template->getTemplatedDecl()))
+ return false;
+ }
+ }
if (RD->hasNonTrivialDestructor())
return false;
return true;
diff --git a/contrib/llvm-project/clang/lib/Format/ContinuationIndenter.cpp b/contrib/llvm-project/clang/lib/Format/ContinuationIndenter.cpp
index a3eb9138b218..53cd169b0590 100644
--- a/contrib/llvm-project/clang/lib/Format/ContinuationIndenter.cpp
+++ b/contrib/llvm-project/clang/lib/Format/ContinuationIndenter.cpp
@@ -674,7 +674,13 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
// arguments to function calls. We do this by ensuring that either all
// arguments (including any lambdas) go on the same line as the function
// call, or we break before the first argument.
- auto PrevNonComment = Current.getPreviousNonComment();
+ const auto *Prev = Current.Previous;
+ if (!Prev)
+ return false;
+ // For example, `/*Newline=*/false`.
+ if (Prev->is(TT_BlockComment) && Current.SpacesRequiredBefore == 0)
+ return false;
+ const auto *PrevNonComment = Current.getPreviousNonComment();
if (!PrevNonComment || PrevNonComment->isNot(tok::l_paren))
return false;
if (Current.isOneOf(tok::comment, tok::l_paren, TT_LambdaLSquare))
diff --git a/contrib/llvm-project/clang/lib/Format/TokenAnnotator.cpp b/contrib/llvm-project/clang/lib/Format/TokenAnnotator.cpp
index 4d482e6543d6..c1f166248192 100644
--- a/contrib/llvm-project/clang/lib/Format/TokenAnnotator.cpp
+++ b/contrib/llvm-project/clang/lib/Format/TokenAnnotator.cpp
@@ -3532,6 +3532,8 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) const {
}
} else if (ClosingParen) {
for (auto *Tok = ClosingParen->Next; Tok; Tok = Tok->Next) {
+ if (Tok->is(TT_CtorInitializerColon))
+ break;
if (Tok->is(tok::arrow)) {
Tok->setType(TT_TrailingReturnArrow);
break;
@@ -5157,12 +5159,8 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
return true;
if (Left.IsUnterminatedLiteral)
return true;
- // FIXME: Breaking after newlines seems useful in general. Turn this into an
- // option and recognize more cases like endl etc, and break independent of
- // what comes after operator lessless.
- if (Right.is(tok::lessless) && Right.Next &&
- Right.Next->is(tok::string_literal) && Left.is(tok::string_literal) &&
- Left.TokenText.ends_with("\\n\"")) {
+ if (Right.is(tok::lessless) && Right.Next && Left.is(tok::string_literal) &&
+ Right.Next->is(tok::string_literal)) {
return true;
}
if (Right.is(TT_RequiresClause)) {
diff --git a/contrib/llvm-project/clang/lib/Format/UnwrappedLineParser.cpp b/contrib/llvm-project/clang/lib/Format/UnwrappedLineParser.cpp
index 573919798870..a6eb18bb2b32 100644
--- a/contrib/llvm-project/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/contrib/llvm-project/clang/lib/Format/UnwrappedLineParser.cpp
@@ -489,18 +489,23 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
};
SmallVector<StackEntry, 8> LBraceStack;
assert(Tok->is(tok::l_brace));
+
do {
- // Get next non-comment, non-preprocessor token.
FormatToken *NextTok;
do {
NextTok = Tokens->getNextToken();
} while (NextTok->is(tok::comment));
- while (NextTok->is(tok::hash) && !Line->InMacroBody) {
- NextTok = Tokens->getNextToken();
- do {
- NextTok = Tokens->getNextToken();
- } while (NextTok->is(tok::comment) ||
- (NextTok->NewlinesBefore == 0 && NextTok->isNot(tok::eof)));
+
+ if (!Line->InMacroBody) {
+ // Skip PPDirective lines and comments.
+ while (NextTok->is(tok::hash)) {
+ do {
+ NextTok = Tokens->getNextToken();
+ } while (NextTok->NewlinesBefore == 0 && NextTok->isNot(tok::eof));
+
+ while (NextTok->is(tok::comment))
+ NextTok = Tokens->getNextToken();
+ }
}
switch (Tok->Tok.getKind()) {
@@ -534,16 +539,6 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
if (Style.Language == FormatStyle::LK_Proto) {
ProbablyBracedList = NextTok->isOneOf(tok::comma, tok::r_square);
} else {
- // Skip NextTok over preprocessor lines, otherwise we may not
- // properly diagnose the block as a braced intializer
- // if the comma separator appears after the pp directive.
- while (NextTok->is(tok::hash)) {
- ScopedMacroState MacroState(*Line, Tokens, NextTok);
- do {
- NextTok = Tokens->getNextToken();
- } while (NextTok->isNot(tok::eof));
- }
-
// Using OriginalColumn to distinguish between ObjC methods and
// binary operators is a bit hacky.
bool NextIsObjCMethod = NextTok->isOneOf(tok::plus, tok::minus) &&
@@ -602,6 +597,16 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
NextTok = Tokens->getNextToken();
ProbablyBracedList = NextTok->isNot(tok::l_square);
}
+
+ // Cpp macro definition body that is a nonempty braced list or block:
+ if (Style.isCpp() && Line->InMacroBody && PrevTok != FormatTok &&
+ !FormatTok->Previous && NextTok->is(tok::eof) &&
+ // A statement can end with only `;` (simple statement), a block
+ // closing brace (compound statement), or `:` (label statement).
+ // If PrevTok is a block opening brace, Tok ends an empty block.
+ !PrevTok->isOneOf(tok::semi, BK_Block, tok::colon)) {
+ ProbablyBracedList = true;
+ }
}
if (ProbablyBracedList) {
Tok->setBlockKind(BK_BracedInit);
@@ -631,6 +636,7 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
default:
break;
}
+
PrevTok = Tok;
Tok = NextTok;
} while (Tok->isNot(tok::eof) && !LBraceStack.empty());
diff --git a/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/Taint.cpp b/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/Taint.cpp
index 4edb671753bf..6362c82b009d 100644
--- a/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/Taint.cpp
+++ b/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/Taint.cpp
@@ -216,21 +216,17 @@ std::vector<SymbolRef> taint::getTaintedSymbolsImpl(ProgramStateRef State,
std::vector<SymbolRef> TaintedSymbols;
if (!Reg)
return TaintedSymbols;
- // Element region (array element) is tainted if either the base or the offset
- // are tainted.
+
+ // Element region (array element) is tainted if the offset is tainted.
if (const ElementRegion *ER = dyn_cast<ElementRegion>(Reg)) {
std::vector<SymbolRef> TaintedIndex =
getTaintedSymbolsImpl(State, ER->getIndex(), K, returnFirstOnly);
llvm::append_range(TaintedSymbols, TaintedIndex);
if (returnFirstOnly && !TaintedSymbols.empty())
return TaintedSymbols; // return early if needed
- std::vector<SymbolRef> TaintedSuperRegion =
- getTaintedSymbolsImpl(State, ER->getSuperRegion(), K, returnFirstOnly);
- llvm::append_range(TaintedSymbols, TaintedSuperRegion);
- if (returnFirstOnly && !TaintedSymbols.empty())
- return TaintedSymbols; // return early if needed
}
+ // Symbolic region is tainted if the corresponding symbol is tainted.
if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(Reg)) {
std::vector<SymbolRef> TaintedRegions =
getTaintedSymbolsImpl(State, SR->getSymbol(), K, returnFirstOnly);
@@ -239,6 +235,8 @@ std::vector<SymbolRef> taint::getTaintedSymbolsImpl(ProgramStateRef State,
return TaintedSymbols; // return early if needed
}
+ // Any subregion (including Element and Symbolic regions) is tainted if its
+ // super-region is tainted.
if (const SubRegion *ER = dyn_cast<SubRegion>(Reg)) {
std::vector<SymbolRef> TaintedSubRegions =
getTaintedSymbolsImpl(State, ER->getSuperRegion(), K, returnFirstOnly);
@@ -318,4 +316,4 @@ std::vector<SymbolRef> taint::getTaintedSymbolsImpl(ProgramStateRef State,
}
}
return TaintedSymbols;
-} \ No newline at end of file
+}
diff --git a/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/cert/InvalidPtrChecker.cpp b/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/cert/InvalidPtrChecker.cpp
index e5dd907c660d..b2947f590c4e 100644
--- a/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/cert/InvalidPtrChecker.cpp
+++ b/contrib/llvm-project/clang/lib/StaticAnalyzer/Checkers/cert/InvalidPtrChecker.cpp
@@ -205,8 +205,12 @@ void InvalidPtrChecker::postPreviousReturnInvalidatingCall(
CE, LCtx, CE->getType(), C.blockCount());
State = State->BindExpr(CE, LCtx, RetVal);
+ const auto *SymRegOfRetVal =
+ dyn_cast_or_null<SymbolicRegion>(RetVal.getAsRegion());
+ if (!SymRegOfRetVal)
+ return;
+
// Remember to this region.
- const auto *SymRegOfRetVal = cast<SymbolicRegion>(RetVal.getAsRegion());
const MemRegion *MR = SymRegOfRetVal->getBaseRegion();
State = State->set<PreviousCallResultMap>(FD, MR);
diff --git a/contrib/llvm-project/libcxx/modules/std.compat/cstdlib.inc b/contrib/llvm-project/libcxx/modules/std.compat/cstdlib.inc
index a45a0a1caf8b..4783cbf51623 100644
--- a/contrib/llvm-project/libcxx/modules/std.compat/cstdlib.inc
+++ b/contrib/llvm-project/libcxx/modules/std.compat/cstdlib.inc
@@ -25,7 +25,7 @@ export {
using ::system;
// [c.malloc], C library memory allocation
- using ::aligned_alloc;
+ using ::aligned_alloc _LIBCPP_USING_IF_EXISTS;
using ::calloc;
using ::free;
using ::malloc;
diff --git a/contrib/llvm-project/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h b/contrib/llvm-project/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h
index 0f20a33f3a75..7990997835d0 100644
--- a/contrib/llvm-project/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h
+++ b/contrib/llvm-project/llvm/include/llvm/CodeGen/GlobalISel/LoadStoreOpt.h
@@ -35,11 +35,23 @@ struct LegalityQuery;
class MachineRegisterInfo;
namespace GISelAddressing {
/// Helper struct to store a base, index and offset that forms an address
-struct BaseIndexOffset {
+class BaseIndexOffset {
+private:
Register BaseReg;
Register IndexReg;
- int64_t Offset = 0;
- bool IsIndexSignExt = false;
+ std::optional<int64_t> Offset;
+
+public:
+ BaseIndexOffset() = default;
+ Register getBase() { return BaseReg; }
+ Register getBase() const { return BaseReg; }
+ Register getIndex() { return IndexReg; }
+ Register getIndex() const { return IndexReg; }
+ void setBase(Register NewBase) { BaseReg = NewBase; }
+ void setIndex(Register NewIndex) { IndexReg = NewIndex; }
+ void setOffset(std::optional<int64_t> NewOff) { Offset = NewOff; }
+ bool hasValidOffset() const { return Offset.has_value(); }
+ int64_t getOffset() const { return *Offset; }
};
/// Returns a BaseIndexOffset which describes the pointer in \p Ptr.
@@ -89,7 +101,7 @@ private:
// order stores are writing to incremeneting consecutive addresses. So when
// we walk the block in reverse order, the next eligible store must write to
// an offset one store width lower than CurrentLowestOffset.
- uint64_t CurrentLowestOffset;
+ int64_t CurrentLowestOffset;
SmallVector<GStore *> Stores;
// A vector of MachineInstr/unsigned pairs to denote potential aliases that
// need to be checked before the candidate is considered safe to merge. The
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/CodeGenPrepare.cpp b/contrib/llvm-project/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 8ee1f19e083e..1cca56fc19cf 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -8154,6 +8154,7 @@ static bool optimizeBranch(BranchInst *Branch, const TargetLowering &TLI,
IRBuilder<> Builder(Branch);
if (UI->getParent() != Branch->getParent())
UI->moveBefore(Branch);
+ UI->dropPoisonGeneratingFlags();
Value *NewCmp = Builder.CreateCmp(ICmpInst::ICMP_EQ, UI,
ConstantInt::get(UI->getType(), 0));
LLVM_DEBUG(dbgs() << "Converting " << *Cmp << "\n");
@@ -8167,6 +8168,7 @@ static bool optimizeBranch(BranchInst *Branch, const TargetLowering &TLI,
IRBuilder<> Builder(Branch);
if (UI->getParent() != Branch->getParent())
UI->moveBefore(Branch);
+ UI->dropPoisonGeneratingFlags();
Value *NewCmp = Builder.CreateCmp(Cmp->getPredicate(), UI,
ConstantInt::get(UI->getType(), 0));
LLVM_DEBUG(dbgs() << "Converting " << *Cmp << "\n");
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 772229215e79..61ddc858ba44 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -591,8 +591,8 @@ bool CombinerHelper::matchCombineExtendingLoads(MachineInstr &MI,
UseMI.getOpcode() == TargetOpcode::G_ZEXT ||
(UseMI.getOpcode() == TargetOpcode::G_ANYEXT)) {
const auto &MMO = LoadMI->getMMO();
- // For atomics, only form anyextending loads.
- if (MMO.isAtomic() && UseMI.getOpcode() != TargetOpcode::G_ANYEXT)
+ // Don't do anything for atomics.
+ if (MMO.isAtomic())
continue;
// Check for legality.
if (!isPreLegalize()) {
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index c0c22e36004f..47d045ac4817 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -4180,6 +4180,10 @@ LegalizerHelper::fewerElementsVectorPhi(GenericMachineInstr &MI,
}
}
+ // Set the insert point after the existing PHIs
+ MachineBasicBlock &MBB = *MI.getParent();
+ MIRBuilder.setInsertPt(MBB, MBB.getFirstNonPHI());
+
// Merge small outputs into MI's def.
if (NumLeftovers) {
mergeMixedSubvectors(MI.getReg(0), OutputRegs);
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LoadStoreOpt.cpp b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LoadStoreOpt.cpp
index 246aa88b09ac..ee499c41c558 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LoadStoreOpt.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LoadStoreOpt.cpp
@@ -84,21 +84,20 @@ BaseIndexOffset GISelAddressing::getPointerInfo(Register Ptr,
MachineRegisterInfo &MRI) {
BaseIndexOffset Info;
Register PtrAddRHS;
- if (!mi_match(Ptr, MRI, m_GPtrAdd(m_Reg(Info.BaseReg), m_Reg(PtrAddRHS)))) {
- Info.BaseReg = Ptr;
- Info.IndexReg = Register();
- Info.IsIndexSignExt = false;
+ Register BaseReg;
+ if (!mi_match(Ptr, MRI, m_GPtrAdd(m_Reg(BaseReg), m_Reg(PtrAddRHS)))) {
+ Info.setBase(Ptr);
+ Info.setOffset(0);
return Info;
}
-
+ Info.setBase(BaseReg);
auto RHSCst = getIConstantVRegValWithLookThrough(PtrAddRHS, MRI);
if (RHSCst)
- Info.Offset = RHSCst->Value.getSExtValue();
+ Info.setOffset(RHSCst->Value.getSExtValue());
// Just recognize a simple case for now. In future we'll need to match
// indexing patterns for base + index + constant.
- Info.IndexReg = PtrAddRHS;
- Info.IsIndexSignExt = false;
+ Info.setIndex(PtrAddRHS);
return Info;
}
@@ -114,15 +113,16 @@ bool GISelAddressing::aliasIsKnownForLoadStore(const MachineInstr &MI1,
BaseIndexOffset BasePtr0 = getPointerInfo(LdSt1->getPointerReg(), MRI);
BaseIndexOffset BasePtr1 = getPointerInfo(LdSt2->getPointerReg(), MRI);
- if (!BasePtr0.BaseReg.isValid() || !BasePtr1.BaseReg.isValid())
+ if (!BasePtr0.getBase().isValid() || !BasePtr1.getBase().isValid())
return false;
int64_t Size1 = LdSt1->getMemSize();
int64_t Size2 = LdSt2->getMemSize();
int64_t PtrDiff;
- if (BasePtr0.BaseReg == BasePtr1.BaseReg) {
- PtrDiff = BasePtr1.Offset - BasePtr0.Offset;
+ if (BasePtr0.getBase() == BasePtr1.getBase() && BasePtr0.hasValidOffset() &&
+ BasePtr1.hasValidOffset()) {
+ PtrDiff = BasePtr1.getOffset() - BasePtr0.getOffset();
// If the size of memory access is unknown, do not use it to do analysis.
// One example of unknown size memory access is to load/store scalable
// vector objects on the stack.
@@ -151,8 +151,8 @@ bool GISelAddressing::aliasIsKnownForLoadStore(const MachineInstr &MI1,
// able to calculate their relative offset if at least one arises
// from an alloca. However, these allocas cannot overlap and we
// can infer there is no alias.
- auto *Base0Def = getDefIgnoringCopies(BasePtr0.BaseReg, MRI);
- auto *Base1Def = getDefIgnoringCopies(BasePtr1.BaseReg, MRI);
+ auto *Base0Def = getDefIgnoringCopies(BasePtr0.getBase(), MRI);
+ auto *Base1Def = getDefIgnoringCopies(BasePtr1.getBase(), MRI);
if (!Base0Def || !Base1Def)
return false; // Couldn't tell anything.
@@ -520,16 +520,20 @@ bool LoadStoreOpt::addStoreToCandidate(GStore &StoreMI,
Register StoreAddr = StoreMI.getPointerReg();
auto BIO = getPointerInfo(StoreAddr, *MRI);
- Register StoreBase = BIO.BaseReg;
- uint64_t StoreOffCst = BIO.Offset;
+ Register StoreBase = BIO.getBase();
if (C.Stores.empty()) {
+ C.BasePtr = StoreBase;
+ if (!BIO.hasValidOffset()) {
+ C.CurrentLowestOffset = 0;
+ } else {
+ C.CurrentLowestOffset = BIO.getOffset();
+ }
// This is the first store of the candidate.
// If the offset can't possibly allow for a lower addressed store with the
// same base, don't bother adding it.
- if (StoreOffCst < ValueTy.getSizeInBytes())
+ if (BIO.hasValidOffset() &&
+ BIO.getOffset() < static_cast<int64_t>(ValueTy.getSizeInBytes()))
return false;
- C.BasePtr = StoreBase;
- C.CurrentLowestOffset = StoreOffCst;
C.Stores.emplace_back(&StoreMI);
LLVM_DEBUG(dbgs() << "Starting a new merge candidate group with: "
<< StoreMI);
@@ -549,8 +553,12 @@ bool LoadStoreOpt::addStoreToCandidate(GStore &StoreMI,
// writes to the next lowest adjacent address.
if (C.BasePtr != StoreBase)
return false;
- if ((C.CurrentLowestOffset - ValueTy.getSizeInBytes()) !=
- static_cast<uint64_t>(StoreOffCst))
+ // If we don't have a valid offset, we can't guarantee to be an adjacent
+ // offset.
+ if (!BIO.hasValidOffset())
+ return false;
+ if ((C.CurrentLowestOffset -
+ static_cast<int64_t>(ValueTy.getSizeInBytes())) != BIO.getOffset())
return false;
// This writes to an adjacent address. Allow it.
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index e806e0f0731f..5038f8a1fc15 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -9636,8 +9636,15 @@ static SDValue combineShiftOfShiftedLogic(SDNode *Shift, SelectionDAG &DAG) {
if (ShiftAmtVal->getBitWidth() != C1Val.getBitWidth())
return false;
+ // The fold is not valid if the sum of the shift values doesn't fit in the
+ // given shift amount type.
+ bool Overflow = false;
+ APInt NewShiftAmt = C1Val.uadd_ov(*ShiftAmtVal, Overflow);
+ if (Overflow)
+ return false;
+
// The fold is not valid if the sum of the shift values exceeds bitwidth.
- if ((*ShiftAmtVal + C1Val).uge(V.getScalarValueSizeInBits()))
+ if (NewShiftAmt.uge(V.getScalarValueSizeInBits()))
return false;
return true;
diff --git a/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 03baa7497615..ac61dd8745d4 100644
--- a/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -4885,19 +4885,9 @@ defm UABDL : SIMDLongThreeVectorBHSabdl<1, 0b0111, "uabdl",
def : Pat<(abs (v8i16 (sub (zext (v8i8 V64:$opA)),
(zext (v8i8 V64:$opB))))),
(UABDLv8i8_v8i16 V64:$opA, V64:$opB)>;
-def : Pat<(xor (v8i16 (AArch64vashr v8i16:$src, (i32 15))),
- (v8i16 (add (sub (zext (v8i8 V64:$opA)),
- (zext (v8i8 V64:$opB))),
- (AArch64vashr v8i16:$src, (i32 15))))),
- (UABDLv8i8_v8i16 V64:$opA, V64:$opB)>;
def : Pat<(abs (v8i16 (sub (zext (extract_high_v16i8 (v16i8 V128:$opA))),
(zext (extract_high_v16i8 (v16i8 V128:$opB)))))),
(UABDLv16i8_v8i16 V128:$opA, V128:$opB)>;
-def : Pat<(xor (v8i16 (AArch64vashr v8i16:$src, (i32 15))),
- (v8i16 (add (sub (zext (extract_high_v16i8 (v16i8 V128:$opA))),
- (zext (extract_high_v16i8 (v16i8 V128:$opB)))),
- (AArch64vashr v8i16:$src, (i32 15))))),
- (UABDLv16i8_v8i16 V128:$opA, V128:$opB)>;
def : Pat<(abs (v4i32 (sub (zext (v4i16 V64:$opA)),
(zext (v4i16 V64:$opB))))),
(UABDLv4i16_v4i32 V64:$opA, V64:$opB)>;
diff --git a/contrib/llvm-project/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp b/contrib/llvm-project/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp
index 84b9330ef963..50d8bfa87508 100644
--- a/contrib/llvm-project/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp
+++ b/contrib/llvm-project/llvm/lib/Target/AMDGPU/SIMemoryLegalizer.cpp
@@ -2358,6 +2358,11 @@ bool SIGfx12CacheControl::enableVolatileAndOrNonTemporal(
bool Changed = false;
+ if (IsNonTemporal) {
+ // Set non-temporal hint for all cache levels.
+ Changed |= setTH(MI, AMDGPU::CPol::TH_NT);
+ }
+
if (IsVolatile) {
Changed |= setScope(MI, AMDGPU::CPol::SCOPE_SYS);
@@ -2370,11 +2375,6 @@ bool SIGfx12CacheControl::enableVolatileAndOrNonTemporal(
Position::AFTER);
}
- if (IsNonTemporal) {
- // Set non-temporal hint for all cache levels.
- Changed |= setTH(MI, AMDGPU::CPol::TH_NT);
- }
-
return Changed;
}
diff --git a/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index a0cec426002b..d46093b9e260 100644
--- a/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -14559,7 +14559,7 @@ static SDValue tryFoldSelectIntoOp(SDNode *N, SelectionDAG &DAG,
EVT VT = N->getValueType(0);
SDLoc DL(N);
SDValue OtherOp = TrueVal.getOperand(1 - OpToFold);
- EVT OtherOpVT = OtherOp->getValueType(0);
+ EVT OtherOpVT = OtherOp.getValueType();
SDValue IdentityOperand =
DAG.getNeutralElement(Opc, DL, OtherOpVT, N->getFlags());
if (!Commutative)
diff --git a/contrib/llvm-project/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/contrib/llvm-project/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index 833f058253d8..553d338b7790 100644
--- a/contrib/llvm-project/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/contrib/llvm-project/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -2923,11 +2923,10 @@ bool X86DAGToDAGISel::selectAddr(SDNode *Parent, SDValue N, SDValue &Base,
}
bool X86DAGToDAGISel::selectMOV64Imm32(SDValue N, SDValue &Imm) {
- // Cannot use 32 bit constants to reference objects in kernel code model.
- // Cannot use 32 bit constants to reference objects in large PIC mode since
- // GOTOFF is 64 bits.
+ // Cannot use 32 bit constants to reference objects in kernel/large code
+ // model.
if (TM.getCodeModel() == CodeModel::Kernel ||
- (TM.getCodeModel() == CodeModel::Large && TM.isPositionIndependent()))
+ TM.getCodeModel() == CodeModel::Large)
return false;
// In static codegen with small code model, we can get the address of a label
diff --git a/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp b/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp
index 96bbd981ff24..201dd8382536 100644
--- a/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -47038,10 +47038,13 @@ static SDValue combineShiftRightArithmetic(SDNode *N, SelectionDAG &DAG,
if (SDValue V = combineShiftToPMULH(N, DAG, Subtarget))
return V;
- // fold (ashr (shl, a, [56,48,32,24,16]), SarConst)
- // into (shl, (sext (a), [56,48,32,24,16] - SarConst)) or
- // into (lshr, (sext (a), SarConst - [56,48,32,24,16]))
- // depending on sign of (SarConst - [56,48,32,24,16])
+ // fold (SRA (SHL X, ShlConst), SraConst)
+ // into (SHL (sext_in_reg X), ShlConst - SraConst)
+ // or (sext_in_reg X)
+ // or (SRA (sext_in_reg X), SraConst - ShlConst)
+ // depending on relation between SraConst and ShlConst.
+ // We only do this if (Size - ShlConst) is equal to 8, 16 or 32. That allows
+ // us to do the sext_in_reg from corresponding bit.
// sexts in X86 are MOVs. The MOVs have the same code size
// as above SHIFTs (only SHIFT on 1 has lower code size).
@@ -47057,29 +47060,29 @@ static SDValue combineShiftRightArithmetic(SDNode *N, SelectionDAG &DAG,
SDValue N00 = N0.getOperand(0);
SDValue N01 = N0.getOperand(1);
APInt ShlConst = N01->getAsAPIntVal();
- APInt SarConst = N1->getAsAPIntVal();
+ APInt SraConst = N1->getAsAPIntVal();
EVT CVT = N1.getValueType();
- if (SarConst.isNegative())
+ if (CVT != N01.getValueType())
+ return SDValue();
+ if (SraConst.isNegative())
return SDValue();
for (MVT SVT : { MVT::i8, MVT::i16, MVT::i32 }) {
unsigned ShiftSize = SVT.getSizeInBits();
- // skipping types without corresponding sext/zext and
- // ShlConst that is not one of [56,48,32,24,16]
+ // Only deal with (Size - ShlConst) being equal to 8, 16 or 32.
if (ShiftSize >= Size || ShlConst != Size - ShiftSize)
continue;
SDLoc DL(N);
SDValue NN =
DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, VT, N00, DAG.getValueType(SVT));
- SarConst = SarConst - (Size - ShiftSize);
- if (SarConst == 0)
+ if (SraConst.eq(ShlConst))
return NN;
- if (SarConst.isNegative())
+ if (SraConst.ult(ShlConst))
return DAG.getNode(ISD::SHL, DL, VT, NN,
- DAG.getConstant(-SarConst, DL, CVT));
+ DAG.getConstant(ShlConst - SraConst, DL, CVT));
return DAG.getNode(ISD::SRA, DL, VT, NN,
- DAG.getConstant(SarConst, DL, CVT));
+ DAG.getConstant(SraConst - ShlConst, DL, CVT));
}
return SDValue();
}
diff --git a/contrib/llvm-project/llvm/lib/Target/X86/X86Subtarget.h b/contrib/llvm-project/llvm/lib/Target/X86/X86Subtarget.h
index a458b5f9ec8f..4d55a084b730 100644
--- a/contrib/llvm-project/llvm/lib/Target/X86/X86Subtarget.h
+++ b/contrib/llvm-project/llvm/lib/Target/X86/X86Subtarget.h
@@ -244,7 +244,8 @@ public:
// TODO: Currently we're always allowing widening on CPUs without VLX,
// because for many cases we don't have a better option.
bool canExtendTo512DQ() const {
- return hasAVX512() && (!hasVLX() || getPreferVectorWidth() >= 512);
+ return hasAVX512() && hasEVEX512() &&
+ (!hasVLX() || getPreferVectorWidth() >= 512);
}
bool canExtendTo512BW() const {
return hasBWI() && canExtendTo512DQ();
diff --git a/contrib/llvm-project/llvm/lib/TargetParser/Host.cpp b/contrib/llvm-project/llvm/lib/TargetParser/Host.cpp
index 4466d50458e1..1adef15771fa 100644
--- a/contrib/llvm-project/llvm/lib/TargetParser/Host.cpp
+++ b/contrib/llvm-project/llvm/lib/TargetParser/Host.cpp
@@ -1266,8 +1266,10 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
setFeature(X86::FEATURE_AVX2);
if (HasLeaf7 && ((EBX >> 8) & 1))
setFeature(X86::FEATURE_BMI2);
- if (HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save)
+ if (HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save) {
setFeature(X86::FEATURE_AVX512F);
+ setFeature(X86::FEATURE_EVEX512);
+ }
if (HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save)
setFeature(X86::FEATURE_AVX512DQ);
if (HasLeaf7 && ((EBX >> 19) & 1))
@@ -1772,6 +1774,7 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
Features["rtm"] = HasLeaf7 && ((EBX >> 11) & 1);
// AVX512 is only supported if the OS supports the context save for it.
Features["avx512f"] = HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save;
+ Features["evex512"] = Features["avx512f"];
Features["avx512dq"] = HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save;
Features["rdseed"] = HasLeaf7 && ((EBX >> 18) & 1);
Features["adx"] = HasLeaf7 && ((EBX >> 19) & 1);
diff --git a/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 9f220ec003ec..8cc7901cbac7 100644
--- a/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -2606,7 +2606,7 @@ static Instruction *foldSelectWithSRem(SelectInst &SI, InstCombinerImpl &IC,
// %cnd = icmp slt i32 %rem, 0
// %add = add i32 %rem, %n
// %sel = select i1 %cnd, i32 %add, i32 %rem
- if (match(TrueVal, m_Add(m_Value(RemRes), m_Value(Remainder))) &&
+ if (match(TrueVal, m_Add(m_Specific(RemRes), m_Value(Remainder))) &&
match(RemRes, m_SRem(m_Value(Op), m_Specific(Remainder))) &&
IC.isKnownToBeAPowerOfTwo(Remainder, /*OrZero*/ true) &&
FalseVal == RemRes)
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/contrib/llvm-project/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
index 9df28747570c..104e8ceb7967 100644
--- a/contrib/llvm-project/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ b/contrib/llvm-project/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -279,6 +279,9 @@ bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
Value *LHS = ICI->getOperand(0);
Value *RHS = ICI->getOperand(1);
+ if (!LHS->getType()->isIntegerTy())
+ return false;
+
// Canonicalize to the `Index Pred Invariant` comparison
if (IsLoopInvariant(LHS)) {
std::swap(LHS, RHS);
diff --git a/contrib/llvm-project/openmp/runtime/src/kmp_settings.cpp b/contrib/llvm-project/openmp/runtime/src/kmp_settings.cpp
index ec86ee07472c..58f19ea5b8ab 100644
--- a/contrib/llvm-project/openmp/runtime/src/kmp_settings.cpp
+++ b/contrib/llvm-project/openmp/runtime/src/kmp_settings.cpp
@@ -6426,6 +6426,8 @@ void __kmp_env_initialize(char const *string) {
}
if ((__kmp_nested_proc_bind.bind_types[0] != proc_bind_intel) &&
(__kmp_nested_proc_bind.bind_types[0] != proc_bind_default)) {
+ if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_false)
+ __kmp_affinity.type = affinity_none;
if (__kmp_affinity.type == affinity_default) {
__kmp_affinity.type = affinity_compact;
__kmp_affinity.flags.dups = FALSE;
diff --git a/contrib/llvm-project/openmp/runtime/src/z_Linux_util.cpp b/contrib/llvm-project/openmp/runtime/src/z_Linux_util.cpp
index b9ff96873702..97ddb8a608b7 100644
--- a/contrib/llvm-project/openmp/runtime/src/z_Linux_util.cpp
+++ b/contrib/llvm-project/openmp/runtime/src/z_Linux_util.cpp
@@ -2129,10 +2129,10 @@ int __kmp_is_address_mapped(void *addr) {
// We pass from number of vm entry's semantic
// to size of whole entry map list.
lstsz = lstsz * 4 / 3;
- buf = reinterpret_cast<char *>(kmpc_malloc(lstsz));
+ buf = reinterpret_cast<char *>(KMP_INTERNAL_MALLOC(lstsz));
rc = sysctl(mib, 4, buf, &lstsz, NULL, 0);
if (rc < 0) {
- kmpc_free(buf);
+ KMP_INTERNAL_FREE(buf);
return 0;
}
@@ -2156,7 +2156,7 @@ int __kmp_is_address_mapped(void *addr) {
}
lw += cursz;
}
- kmpc_free(buf);
+ KMP_INTERNAL_FREE(buf);
#elif KMP_OS_DARWIN
diff --git a/etc/mtree/BSD.usr.dist b/etc/mtree/BSD.usr.dist
index 0630708b9024..6e6b733c141d 100644
--- a/etc/mtree/BSD.usr.dist
+++ b/etc/mtree/BSD.usr.dist
@@ -196,26 +196,6 @@
..
..
calendar
- de_AT.ISO_8859-15
- ..
- de_DE.ISO8859-1
- ..
- fr_FR.ISO8859-1
- ..
- hr_HR.ISO8859-2
- ..
- hu_HU.ISO8859-2
- ..
- pt_BR.ISO8859-1
- ..
- pt_BR.UTF-8
- ..
- ru_RU.KOI8-R
- ..
- ru_RU.UTF-8
- ..
- uk_UA.KOI8-U
- ..
..
certs
blacklisted tags=package=caroot
diff --git a/lib/clang/include/VCSVersion.inc b/lib/clang/include/VCSVersion.inc
index 687fb1656937..c4bb0df4e3a5 100644
--- a/lib/clang/include/VCSVersion.inc
+++ b/lib/clang/include/VCSVersion.inc
@@ -1,8 +1,8 @@
-#define LLVM_REVISION "llvmorg-18.1.4-0-ge6c3289804a6"
+#define LLVM_REVISION "llvmorg-18.1.5-0-g617a15a9eac9"
#define LLVM_REPOSITORY "https://github.com/llvm/llvm-project.git"
-#define CLANG_REVISION "llvmorg-18.1.4-0-ge6c3289804a6"
+#define CLANG_REVISION "llvmorg-18.1.5-0-g617a15a9eac9"
#define CLANG_REPOSITORY "https://github.com/llvm/llvm-project.git"
-#define LLDB_REVISION "llvmorg-18.1.4-0-ge6c3289804a6"
+#define LLDB_REVISION "llvmorg-18.1.5-0-g617a15a9eac9"
#define LLDB_REPOSITORY "https://github.com/llvm/llvm-project.git"
diff --git a/lib/clang/include/clang/Basic/Version.inc b/lib/clang/include/clang/Basic/Version.inc
index 536f72efec52..c243016c5f73 100644
--- a/lib/clang/include/clang/Basic/Version.inc
+++ b/lib/clang/include/clang/Basic/Version.inc
@@ -1,8 +1,8 @@
-#define CLANG_VERSION 18.1.4
-#define CLANG_VERSION_STRING "18.1.4"
+#define CLANG_VERSION 18.1.5
+#define CLANG_VERSION_STRING "18.1.5"
#define CLANG_VERSION_MAJOR 18
#define CLANG_VERSION_MAJOR_STRING "18"
#define CLANG_VERSION_MINOR 1
-#define CLANG_VERSION_PATCHLEVEL 4
+#define CLANG_VERSION_PATCHLEVEL 5
#define CLANG_VENDOR "FreeBSD "
diff --git a/lib/clang/include/lld/Common/Version.inc b/lib/clang/include/lld/Common/Version.inc
index 65838f76ba5d..4079a361ce8d 100644
--- a/lib/clang/include/lld/Common/Version.inc
+++ b/lib/clang/include/lld/Common/Version.inc
@@ -1,4 +1,4 @@
// Local identifier in __FreeBSD_version style
#define LLD_FREEBSD_VERSION 1400006
-#define LLD_VERSION_STRING "18.1.4 (FreeBSD llvmorg-18.1.4-0-ge6c3289804a6-" __XSTRING(LLD_FREEBSD_VERSION) ")"
+#define LLD_VERSION_STRING "18.1.5 (FreeBSD llvmorg-18.1.5-0-g617a15a9eac9-" __XSTRING(LLD_FREEBSD_VERSION) ")"
diff --git a/lib/clang/include/lldb/Version/Version.inc b/lib/clang/include/lldb/Version/Version.inc
index 1fc1a4d88b7b..0e86bd2e01ba 100644
--- a/lib/clang/include/lldb/Version/Version.inc
+++ b/lib/clang/include/lldb/Version/Version.inc
@@ -1,6 +1,6 @@
-#define LLDB_VERSION 18.1.4
-#define LLDB_VERSION_STRING "18.1.4"
+#define LLDB_VERSION 18.1.5
+#define LLDB_VERSION_STRING "18.1.5"
#define LLDB_VERSION_MAJOR 18
#define LLDB_VERSION_MINOR 1
-#define LLDB_VERSION_PATCH 4
+#define LLDB_VERSION_PATCH 5
/* #undef LLDB_FULL_VERSION_STRING */
diff --git a/lib/clang/include/llvm/Config/AsmParsers.def b/lib/clang/include/llvm/Config/AsmParsers.def
index afd86d898673..3dccab75a285 100644
--- a/lib/clang/include/llvm/Config/AsmParsers.def
+++ b/lib/clang/include/llvm/Config/AsmParsers.def
@@ -42,9 +42,6 @@ LLVM_ASM_PARSER(PowerPC)
#ifdef LLVM_TARGET_ENABLE_RISCV
LLVM_ASM_PARSER(RISCV)
#endif
-#ifdef LLVM_TARGET_ENABLE_SPARC
-LLVM_ASM_PARSER(Sparc)
-#endif
#ifdef LLVM_TARGET_ENABLE_X86
LLVM_ASM_PARSER(X86)
#endif
diff --git a/lib/clang/include/llvm/Config/AsmPrinters.def b/lib/clang/include/llvm/Config/AsmPrinters.def
index ffcca0730101..649b8353c926 100644
--- a/lib/clang/include/llvm/Config/AsmPrinters.def
+++ b/lib/clang/include/llvm/Config/AsmPrinters.def
@@ -42,9 +42,6 @@ LLVM_ASM_PRINTER(PowerPC)
#ifdef LLVM_TARGET_ENABLE_RISCV
LLVM_ASM_PRINTER(RISCV)
#endif
-#ifdef LLVM_TARGET_ENABLE_SPARC
-LLVM_ASM_PRINTER(Sparc)
-#endif
#ifdef LLVM_TARGET_ENABLE_X86
LLVM_ASM_PRINTER(X86)
#endif
diff --git a/lib/clang/include/llvm/Config/Disassemblers.def b/lib/clang/include/llvm/Config/Disassemblers.def
index 18e29e3a09ff..c44fa4e303e2 100644
--- a/lib/clang/include/llvm/Config/Disassemblers.def
+++ b/lib/clang/include/llvm/Config/Disassemblers.def
@@ -42,9 +42,6 @@ LLVM_DISASSEMBLER(PowerPC)
#ifdef LLVM_TARGET_ENABLE_RISCV
LLVM_DISASSEMBLER(RISCV)
#endif
-#ifdef LLVM_TARGET_ENABLE_SPARC
-LLVM_DISASSEMBLER(Sparc)
-#endif
#ifdef LLVM_TARGET_ENABLE_X86
LLVM_DISASSEMBLER(X86)
#endif
diff --git a/lib/clang/include/llvm/Config/Targets.def b/lib/clang/include/llvm/Config/Targets.def
index 604fd9337048..d3332a51a2cc 100644
--- a/lib/clang/include/llvm/Config/Targets.def
+++ b/lib/clang/include/llvm/Config/Targets.def
@@ -41,9 +41,6 @@ LLVM_TARGET(PowerPC)
#ifdef LLVM_TARGET_ENABLE_RISCV
LLVM_TARGET(RISCV)
#endif
-#ifdef LLVM_TARGET_ENABLE_SPARC
-LLVM_TARGET(Sparc)
-#endif
#ifdef LLVM_TARGET_ENABLE_X86
LLVM_TARGET(X86)
#endif
diff --git a/lib/clang/include/llvm/Config/config.h b/lib/clang/include/llvm/Config/config.h
index a017437dc568..0760c0b17a87 100644
--- a/lib/clang/include/llvm/Config/config.h
+++ b/lib/clang/include/llvm/Config/config.h
@@ -344,10 +344,10 @@
#define PACKAGE_NAME "LLVM"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "LLVM 18.1.4"
+#define PACKAGE_STRING "LLVM 18.1.5"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "18.1.4"
+#define PACKAGE_VERSION "18.1.5"
/* Define to the vendor of this package. */
/* #undef PACKAGE_VENDOR */
diff --git a/lib/clang/include/llvm/Config/llvm-config.h b/lib/clang/include/llvm/Config/llvm-config.h
index fb878ccdde4d..049529efdd7f 100644
--- a/lib/clang/include/llvm/Config/llvm-config.h
+++ b/lib/clang/include/llvm/Config/llvm-config.h
@@ -130,11 +130,7 @@
#endif
/* Define if the Sparc target is built in */
-#ifdef LLVM_TARGET_ENABLE_SPARC
-#define LLVM_HAS_SPARC_TARGET 1
-#else
#define LLVM_HAS_SPARC_TARGET 0
-#endif
/* Define if the SPIRV target is built in */
#define LLVM_HAS_SPIRV_TARGET 0
@@ -180,10 +176,10 @@
#define LLVM_VERSION_MINOR 1
/* Patch version of the LLVM API */
-#define LLVM_VERSION_PATCH 4
+#define LLVM_VERSION_PATCH 5
/* LLVM version string */
-#define LLVM_VERSION_STRING "18.1.4"
+#define LLVM_VERSION_STRING "18.1.5"
/* Whether LLVM records statistics for use with GetStatistics(),
* PrintStatistics() or PrintStatisticsJSON()
diff --git a/lib/clang/include/llvm/Support/VCSRevision.h b/lib/clang/include/llvm/Support/VCSRevision.h
index e324de0f9fc6..433b2b53b8fe 100644
--- a/lib/clang/include/llvm/Support/VCSRevision.h
+++ b/lib/clang/include/llvm/Support/VCSRevision.h
@@ -1,2 +1,2 @@
-#define LLVM_REVISION "llvmorg-18.1.4-0-ge6c3289804a6"
+#define LLVM_REVISION "llvmorg-18.1.5-0-g617a15a9eac9"
#define LLVM_REPOSITORY "https://github.com/llvm/llvm-project.git"
diff --git a/lib/libc/gen/dlopen.3 b/lib/libc/gen/dlopen.3
index 94dd1864c126..4719d2733fe5 100644
--- a/lib/libc/gen/dlopen.3
+++ b/lib/libc/gen/dlopen.3
@@ -29,9 +29,7 @@
.\"
.\" Copyright (c) 1991 Sun Microsystems, Inc.
.\"
-.\" @(#) dlopen.3 1.6 90/01/31 SMI
-.\"
-.Dd May 14, 2020
+.Dd May 7, 2024
.Dt DLOPEN 3
.Os
.Sh NAME
@@ -201,6 +199,10 @@ The
function can be used by the code that needs to perform
additional checks on the loaded objects, to prevent races with
symlinking or renames.
+Applications sandboxed using
+.Xr capsicum 4
+can also make beneficial use of
+.Fn fdlopen .
.Pp
The
.Fn dlsym
diff --git a/lib/libc/stdlib/cxa_thread_atexit_impl.c b/lib/libc/stdlib/cxa_thread_atexit_impl.c
index 2ebf20ef7fd9..ef9f3567d483 100644
--- a/lib/libc/stdlib/cxa_thread_atexit_impl.c
+++ b/lib/libc/stdlib/cxa_thread_atexit_impl.c
@@ -103,7 +103,7 @@ walk_cb_call(struct cxa_thread_dtor *dtor)
{
struct dl_phdr_info phdr_info;
- if (_rtld_addr_phdr(dtor->dso, &phdr_info) &&
+ if (_rtld_addr_phdr(dtor->func, &phdr_info) &&
__elf_phdr_match_addr(&phdr_info, dtor->func))
dtor->func(dtor->obj);
else
diff --git a/lib/libc/sys/clock_gettime.2 b/lib/libc/sys/clock_gettime.2
index 7b325a2bb394..c8bef4c5424f 100644
--- a/lib/libc/sys/clock_gettime.2
+++ b/lib/libc/sys/clock_gettime.2
@@ -94,20 +94,29 @@ Returns the execution time of the calling thread.
.El
.Pp
The clock IDs
-.Fa CLOCK_REALTIME_FAST ,
-.Fa CLOCK_MONOTONIC_FAST ,
-.Fa CLOCK_UPTIME_FAST
-are analogs of corresponding IDs without _FAST suffix but do not perform
+.Dv CLOCK_REALTIME ,
+.Dv CLOCK_MONOTONIC ,
+and
+.Dv CLOCK_UPTIME
+perform a full time counter query.
+The clock IDs with the _FAST suffix, i.e.,
+.Dv CLOCK_REALTIME_FAST ,
+.Dv CLOCK_MONOTONIC_FAST ,
+and
+.Dv CLOCK_UPTIME_FAST ,
+do not perform
a full time counter query, so their accuracy is one timer tick.
Similarly,
-.Fa CLOCK_REALTIME_PRECISE ,
-.Fa CLOCK_MONOTONIC_PRECISE ,
-.Fa CLOCK_UPTIME_PRECISE
+.Dv CLOCK_REALTIME_PRECISE ,
+.Dv CLOCK_MONOTONIC_PRECISE ,
+and
+.Dv CLOCK_UPTIME_PRECISE
are used to get the most exact value as possible, at the expense of
execution time.
The clock IDs
-.Fa CLOCK_REALTIME_COARSE ,
-.Fa CLOCK_MONOTONIC_COARSE
+.Dv CLOCK_REALTIME_COARSE
+and
+.Dv CLOCK_MONOTONIC_COARSE
are aliases of corresponding IDs with _FAST suffix for compatibility with other
systems.
Finally,
@@ -129,7 +138,7 @@ struct timespec {
.Ed
.Pp
Only the super-user may set the time of day, using only
-.Fa CLOCK_REALTIME .
+.Dv CLOCK_REALTIME .
If the system
.Xr securelevel 7
is greater than 1 (see
@@ -177,14 +186,14 @@ and
system calls conform to
.St -p1003.1b-93 .
The clock IDs
-.Fa CLOCK_REALTIME_FAST ,
-.Fa CLOCK_REALTIME_PRECISE ,
-.Fa CLOCK_MONOTONIC_FAST ,
-.Fa CLOCK_MONOTONIC_PRECISE ,
-.Fa CLOCK_UPTIME ,
-.Fa CLOCK_UPTIME_FAST ,
-.Fa CLOCK_UPTIME_PRECISE ,
-.Fa CLOCK_SECOND
+.Dv CLOCK_REALTIME_FAST ,
+.Dv CLOCK_REALTIME_PRECISE ,
+.Dv CLOCK_MONOTONIC_FAST ,
+.Dv CLOCK_MONOTONIC_PRECISE ,
+.Dv CLOCK_UPTIME ,
+.Dv CLOCK_UPTIME_FAST ,
+.Dv CLOCK_UPTIME_PRECISE ,
+.Dv CLOCK_SECOND
are
.Fx
extensions to the POSIX interface.
diff --git a/lib/libpfctl/libpfctl.c b/lib/libpfctl/libpfctl.c
index be45746368de..f5ddbba79bfd 100644
--- a/lib/libpfctl/libpfctl.c
+++ b/lib/libpfctl/libpfctl.c
@@ -249,7 +249,7 @@ pfctl_get_status(int dev)
_pfctl_get_status_counters(nvlist_get_nvlist(nvl, "scounters"),
&status->scounters);
- pf_nvuint_64_array(nvl, "pcounters", 2 * 2 * 3,
+ pf_nvuint_64_array(nvl, "pcounters", 2 * 2 * 2,
(uint64_t *)status->pcounters, NULL);
pf_nvuint_64_array(nvl, "bcounters", 2 * 2,
(uint64_t *)status->bcounters, NULL);
diff --git a/lib/libpfctl/libpfctl.h b/lib/libpfctl/libpfctl.h
index 78d981c2d769..308be03fbd1a 100644
--- a/lib/libpfctl/libpfctl.h
+++ b/lib/libpfctl/libpfctl.h
@@ -60,7 +60,7 @@ struct pfctl_status {
struct pfctl_status_counters lcounters;
struct pfctl_status_counters fcounters;
struct pfctl_status_counters scounters;
- uint64_t pcounters[2][2][3];
+ uint64_t pcounters[2][2][2];
uint64_t bcounters[2][2];
};
diff --git a/libexec/rtld-elf/rtld.1 b/libexec/rtld-elf/rtld.1
index a152dd444bd7..4cc5b639c89a 100644
--- a/libexec/rtld-elf/rtld.1
+++ b/libexec/rtld-elf/rtld.1
@@ -26,7 +26,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd October 29, 2023
+.Dd April 28, 2024
.Dt RTLD 1
.Os
.Sh NAME
@@ -352,6 +352,7 @@ The syntax of the direct invocation is
.Op Fl b Ar exe
.Op Fl d
.Op Fl f Ar fd
+.Op Fl o Ar OPT=NAME
.Op Fl p
.Op Fl u
.Op Fl v
@@ -387,6 +388,23 @@ If this option is specified,
is only used to provide the
.Va argv[0]
value to the program.
+.It Fl o Ar OPT=VALUE
+Set the
+.Ar OPT
+configuration variable to the value
+.Ar VALUE .
+The possible variable names are listed above as
+.Ev LD_
+prefixed environment variables, but here are referenced without the
+.Ev LD_
+prefix.
+A configuration variable set this way does not leak into
+the activated image's environment.
+.Pp
+The option can be repeated as many times as needed to set
+all configuration parameters.
+The parameters set using this option have priority over
+the same parameters assigned via environment.
.It Fl p
If the
.Pa image_path
@@ -400,7 +418,9 @@ to find the binary to execute.
.It Fl u
Ignore all
.Ev LD_
-environment variables that otherwise affect the dynamic
+environment variables and previous command line
+.Fl o
+options that otherwise affect the dynamic
linker behavior.
.It Fl v
Display information about this run-time linker binary, then exit.
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 1078ddd0551a..7110ba6c4c1a 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -6201,10 +6201,42 @@ parse_args(char* argv[], int argc, bool *use_pathp, int *fdp,
*fdp = fd;
seen_f = true;
break;
+ } else if (opt == 'o') {
+ struct ld_env_var_desc *l;
+ char *n, *v;
+ u_int ll;
+
+ if (j != arglen - 1) {
+ _rtld_error("Invalid options: %s", arg);
+ rtld_die();
+ }
+ i++;
+ n = argv[i];
+ v = strchr(n, '=');
+ if (v == NULL) {
+ _rtld_error("No '=' in -o parameter");
+ rtld_die();
+ }
+ for (ll = 0; ll < nitems(ld_env_vars); ll++) {
+ l = &ld_env_vars[ll];
+ if (v - n == (ptrdiff_t)strlen(l->n) &&
+ strncmp(n, l->n, v - n) == 0) {
+ l->val = v + 1;
+ break;
+ }
+ }
+ if (ll == nitems(ld_env_vars)) {
+ _rtld_error("Unknown LD_ option %s",
+ n);
+ rtld_die();
+ }
} else if (opt == 'p') {
*use_pathp = true;
} else if (opt == 'u') {
- trust = false;
+ u_int ll;
+
+ for (ll = 0; ll < nitems(ld_env_vars); ll++)
+ ld_env_vars[ll].val = NULL;
} else if (opt == 'v') {
machine[0] = '\0';
mib[0] = CTL_HW;
@@ -6284,6 +6316,7 @@ print_usage(const char *argv0)
" -b <exe> Execute <exe> instead of <binary>, arg0 is <binary>\n"
" -d Ignore lack of exec permissions for the binary\n"
" -f <FD> Execute <FD> instead of searching for <binary>\n"
+ " -o <OPT>=<VAL> Set LD_<OPT> to <VAL>, without polluting env\n"
" -p Search in PATH for named binary\n"
" -u Ignore LD_ environment variables\n"
" -v Display identification information\n"
diff --git a/libexec/tftpd/tftpd.8 b/libexec/tftpd/tftpd.8
index 3de042197618..24a743a92e14 100644
--- a/libexec/tftpd/tftpd.8
+++ b/libexec/tftpd/tftpd.8
@@ -27,7 +27,7 @@
.\"
.\" @(#)tftpd.8 8.1 (Berkeley) 6/4/93
.\"
-.Dd July 20, 2023
+.Dd May 8, 2024
.Dt TFTPD 8
.Os
.Sh NAME
@@ -35,11 +35,11 @@
.Nd Internet Trivial File Transfer Protocol server
.Sh SYNOPSIS
.Nm tftpd
-.Op Fl cdClnow
+.Op Fl CcdlnoSw
.Op Fl F Ar strftime-format
.Op Fl s Ar directory
-.Op Fl u Ar user
.Op Fl U Ar umask
+.Op Fl u Ar user
.Op Ar directory ...
.Sh DESCRIPTION
The
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
index 83bec8e9f66a..1ea3431c859a 100644
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -343,6 +343,7 @@ MAN= aac.4 \
netlink.4 \
netmap.4 \
${_nfe.4} \
+ nfslockd.4 \
${_nfsmb.4} \
ng_async.4 \
ngatmbase.4 \
diff --git a/share/man/man4/nfslockd.4 b/share/man/man4/nfslockd.4
new file mode 100644
index 000000000000..770d9b8736b0
--- /dev/null
+++ b/share/man/man4/nfslockd.4
@@ -0,0 +1,45 @@
+.\"-
+.\" Copyright (c) 2024 Dag-Erling Smørgrav
+.\"
+.\" SPDX-License-Identifier: BSD-2-Clause
+.\"
+.Dd May 8, 2024
+.Dt NFSLOCKD 4
+.Os
+.Sh NAME
+.Nm nfslockd
+.Nd NFS advisory locking
+.Sh SYNOPSIS
+To compile this driver into the kernel, place the following lines in
+your kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "options NFSLOCKD"
+.Ed
+.Pp
+Alternatively, to load the driver as a module at boot time, place the
+following line in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+nfslockd_load="YES"
+.Ed
+.Sh DESCRIPTION
+The
+.Nm
+driver provides kernel support for NFSv3 advisory locking.
+It works in tandem with
+.Xr rpc.lockd 8 ,
+which will normally load it on startup if it is not already loaded or
+compiled-in.
+.Sh SEE ALSO
+.Xr rpc.lockd 8
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 6.4 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+driver was written by
+.An Doug Rabson Aq Mt dfr@FreeBSD.org .
diff --git a/share/man/man4/smsc.4 b/share/man/man4/smsc.4
index 56c1556e5f83..61b12c7d230c 100644
--- a/share/man/man4/smsc.4
+++ b/share/man/man4/smsc.4
@@ -25,12 +25,12 @@
.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd November 24, 2015
+.Dd May 7, 2024
.Dt SMSC 4
.Os
.Sh NAME
.Nm smsc
-.Nd "USB SMSC LAN9xxx Fast Ethernet driver"
+.Nd "USB Microchip LAN9xxx Fast Ethernet driver"
.Sh SYNOPSIS
To load the driver as a module at boot time, place the
following line in
@@ -53,7 +53,7 @@ following lines in your kernel configuration file:
The
.Nm
device driver provides support for USB Fast Ethernet adapters based
-on the SMSC LAN9xxx chipsets.
+on the Microchip (formerly SMSC) LAN9xxx chipsets.
.Pp
For more information on configuring this device, see
.Xr ifconfig 8 .
@@ -64,11 +64,11 @@ driver:
.Pp
.Bl -bullet -compact
.It
-SMSC LAN9500, LAN9500A, LAN9505 and LAN9505A based Ethernet adapters
+LAN9500, LAN9500A, LAN9505 and LAN9505A based Ethernet adapters
.It
-SMSC LAN89530, LAN9530 and LAN9730 based Ethernet adapters
+LAN89530, LAN9530 and LAN9730 based Ethernet adapters
.It
-SMSC LAN951x Ethernet adapters with integrated USB hub
+LAN951x Ethernet adapters with integrated USB hub
.El
.Sh SEE ALSO
.Xr arp 4 ,
diff --git a/share/man/man4/vmm.4 b/share/man/man4/vmm.4
index fbbd5fc8b300..11c2d4bb0ed4 100644
--- a/share/man/man4/vmm.4
+++ b/share/man/man4/vmm.4
@@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd October 12, 2023
+.Dd March 6, 2024
.Dt VMM 4
.Os
.Sh NAME
@@ -70,6 +70,19 @@ See the
.Sx EXAMPLES
section below for sample usage.
.Pp
+Note that
+.Nm vmm
+must be given first the right of refusal to all
+.Xr pci 4
+devices it may need to claim.
+As a result, the
+.Nm vmm
+kernel module almost certainly needs to be loaded from
+.Xr loader.conf 5
+rather than by adding it to
+.Va kld_list in
+.Xr rc.conf 5 .
+.Pp
A large number of PCI device entries may require a string longer than the
128-character limit of
.Xr loader.conf 5
diff --git a/sys/dev/etherswitch/ip17x/ip17x.c b/sys/dev/etherswitch/ip17x/ip17x.c
index 66e74b098e7b..cf118b0bc2cf 100644
--- a/sys/dev/etherswitch/ip17x/ip17x.c
+++ b/sys/dev/etherswitch/ip17x/ip17x.c
@@ -556,7 +556,7 @@ ip17x_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
static int
ip17x_readreg(device_t dev, int addr)
{
- struct ip17x_softc *sc;
+ struct ip17x_softc *sc __diagused;
sc = device_get_softc(dev);
IP17X_LOCK_ASSERT(sc, MA_OWNED);
@@ -568,7 +568,7 @@ ip17x_readreg(device_t dev, int addr)
static int
ip17x_writereg(device_t dev, int addr, int value)
{
- struct ip17x_softc *sc;
+ struct ip17x_softc *sc __diagused;
sc = device_get_softc(dev);
IP17X_LOCK_ASSERT(sc, MA_OWNED);
diff --git a/sys/dev/etherswitch/ukswitch/ukswitch.c b/sys/dev/etherswitch/ukswitch/ukswitch.c
index a5d2de94a13e..ab22ac5f97e9 100644
--- a/sys/dev/etherswitch/ukswitch/ukswitch.c
+++ b/sys/dev/etherswitch/ukswitch/ukswitch.c
@@ -514,7 +514,7 @@ ukswitch_writephy(device_t dev, int phy, int reg, int data)
static int
ukswitch_readreg(device_t dev, int addr)
{
- struct ukswitch_softc *sc;
+ struct ukswitch_softc *sc __diagused;
sc = device_get_softc(dev);
UKSWITCH_LOCK_ASSERT(sc, MA_OWNED);
@@ -526,7 +526,7 @@ ukswitch_readreg(device_t dev, int addr)
static int
ukswitch_writereg(device_t dev, int addr, int value)
{
- struct ukswitch_softc *sc;
+ struct ukswitch_softc *sc __diagused;
sc = device_get_softc(dev);
UKSWITCH_LOCK_ASSERT(sc, MA_OWNED);
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
index 75786d313fc9..fb1c8ede424f 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
@@ -3642,6 +3642,9 @@ out:
/* Check if module is present before doing an access */
module_status = mlx5_query_module_status(priv->mdev, module_num);
if (module_status != MLX5_MODULE_STATUS_PLUGGED_ENABLED) {
+ mlx5_en_err(ifp,
+ "Query module %d status: not plugged (%d), eeprom reading is not supported\n",
+ module_num, module_status);
error = EINVAL;
goto err_i2c;
}
diff --git a/sys/dev/usb/net/if_smsc.c b/sys/dev/usb/net/if_smsc.c
index e6f811754555..e57e5e044a18 100644
--- a/sys/dev/usb/net/if_smsc.c
+++ b/sys/dev/usb/net/if_smsc.c
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
/*
- * SMSC LAN9xxx devices (http://www.smsc.com/)
+ * Microchip LAN9xxx devices (https://www.microchip.com/en-us/product/lan9500a)
*
* The LAN9500 & LAN9500A devices are stand-alone USB to Ethernet chips that
* support USB 2.0 and 10/100 Mbps Ethernet.
@@ -38,7 +38,7 @@
* supports the hub part.
*
* This driver is closely modelled on the Linux driver written and copyrighted
- * by SMSC.
+ * by SMSC (later acquired by Microchip).
*
*
*
diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h
index 8cdc08fba433..083a974516b0 100644
--- a/sys/fs/nfs/nfs_var.h
+++ b/sys/fs/nfs/nfs_var.h
@@ -707,7 +707,7 @@ int nfsvno_rmdirsub(struct nameidata *, int, struct ucred *, NFSPROC_T *,
struct nfsexstuff *);
int nfsvno_rename(struct nameidata *, struct nameidata *, u_int32_t,
u_int32_t, struct ucred *, NFSPROC_T *);
-int nfsvno_link(struct nameidata *, vnode_t, struct ucred *,
+int nfsvno_link(struct nameidata *, vnode_t, nfsquad_t, struct ucred *,
NFSPROC_T *, struct nfsexstuff *);
int nfsvno_fsync(vnode_t, u_int64_t, int, struct ucred *, NFSPROC_T *);
int nfsvno_statfs(vnode_t, struct statfs *);
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index ebc560836205..46be3e051056 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -1675,8 +1675,8 @@ out1:
* Link vnode op.
*/
int
-nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
- struct thread *p, struct nfsexstuff *exp)
+nfsvno_link(struct nameidata *ndp, struct vnode *vp, nfsquad_t clientid,
+ struct ucred *cred, struct thread *p, struct nfsexstuff *exp)
{
struct vnode *xp;
int error = 0;
@@ -1691,9 +1691,11 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
}
if (!error) {
NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
- if (!VN_IS_DOOMED(vp))
- error = VOP_LINK(ndp->ni_dvp, vp, &ndp->ni_cnd);
- else
+ if (!VN_IS_DOOMED(vp)) {
+ error = nfsrv_checkremove(vp, 0, NULL, clientid, p);
+ if (error == 0)
+ error = VOP_LINK(ndp->ni_dvp, vp, &ndp->ni_cnd);
+ } else
error = EPERM;
if (ndp->ni_dvp == vp) {
vrele(ndp->ni_dvp);
diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c
index 437f4b1c685d..ccaeb4153253 100644
--- a/sys/fs/nfsserver/nfs_nfsdserv.c
+++ b/sys/fs/nfsserver/nfs_nfsdserv.c
@@ -1799,6 +1799,7 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
char *bufp;
u_long *hashp;
struct thread *p = curthread;
+ nfsquad_t clientid;
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
@@ -1861,8 +1862,14 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
NULL);
}
}
- if (!nd->nd_repstat)
- nd->nd_repstat = nfsvno_link(&named, vp, nd->nd_cred, p, exp);
+ if (!nd->nd_repstat) {
+ clientid.qval = 0;
+ if ((nd->nd_flag & (ND_IMPLIEDCLID | ND_NFSV41)) ==
+ (ND_IMPLIEDCLID | ND_NFSV41))
+ clientid.qval = nd->nd_clientid.qval;
+ nd->nd_repstat = nfsvno_link(&named, vp, clientid, nd->nd_cred,
+ p, exp);
+ }
if (nd->nd_flag & ND_NFSV3)
getret = nfsvno_getattr(vp, &at, nd, p, 0, NULL);
if (dirp) {
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
index 94050beee7dd..d8587c51e6fd 100644
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -2521,7 +2521,8 @@ do_lock_pp(struct thread *td, struct umutex *m, uint32_t flags,
struct umtx_pi *pi;
uint32_t ceiling;
uint32_t owner, id;
- int error, pri, old_inherited_pri, su, rv;
+ int error, pri, old_inherited_pri, new_pri, rv;
+ bool su;
id = td->td_tid;
uq = td->td_umtxq;
@@ -2550,21 +2551,23 @@ do_lock_pp(struct thread *td, struct umutex *m, uint32_t flags,
error = EINVAL;
goto out;
}
+ new_pri = PRI_MIN_REALTIME + ceiling;
- mtx_lock(&umtx_lock);
- if (UPRI(td) < PRI_MIN_REALTIME + ceiling) {
- mtx_unlock(&umtx_lock);
+ if (td->td_base_user_pri < new_pri) {
error = EINVAL;
goto out;
}
- if (su && PRI_MIN_REALTIME + ceiling < uq->uq_inherited_pri) {
- uq->uq_inherited_pri = PRI_MIN_REALTIME + ceiling;
- thread_lock(td);
- if (uq->uq_inherited_pri < UPRI(td))
- sched_lend_user_prio(td, uq->uq_inherited_pri);
- thread_unlock(td);
+ if (su) {
+ mtx_lock(&umtx_lock);
+ if (new_pri < uq->uq_inherited_pri) {
+ uq->uq_inherited_pri = new_pri;
+ thread_lock(td);
+ if (new_pri < UPRI(td))
+ sched_lend_user_prio(td, new_pri);
+ thread_unlock(td);
+ }
+ mtx_unlock(&umtx_lock);
}
- mtx_unlock(&umtx_lock);
rv = casueword32(&m->m_owner, UMUTEX_CONTESTED, &owner,
id | UMUTEX_CONTESTED);
@@ -2685,7 +2688,8 @@ do_unlock_pp(struct thread *td, struct umutex *m, uint32_t flags, bool rb)
struct umtx_q *uq, *uq2;
struct umtx_pi *pi;
uint32_t id, owner, rceiling;
- int error, pri, new_inherited_pri, su;
+ int error, pri, new_inherited_pri;
+ bool su;
id = td->td_tid;
uq = td->td_umtxq;
@@ -2740,7 +2744,7 @@ do_unlock_pp(struct thread *td, struct umutex *m, uint32_t flags, bool rb)
error = EFAULT;
else {
mtx_lock(&umtx_lock);
- if (su != 0)
+ if (su || new_inherited_pri == PRI_MAX)
uq->uq_inherited_pri = new_inherited_pri;
pri = PRI_MAX;
TAILQ_FOREACH(pi, &uq->uq_pi_contested, pi_link) {
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c
index 700f0dca93aa..ca615098c1df 100644
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -953,15 +953,9 @@ void
sched_lend_user_prio_cond(struct thread *td, u_char prio)
{
- if (td->td_lend_user_pri != prio)
- goto lend;
- if (td->td_user_pri != min(prio, td->td_base_user_pri))
- goto lend;
- if (td->td_priority != td->td_user_pri)
- goto lend;
- return;
-
-lend:
+ if (td->td_lend_user_pri == prio)
+ return;
+
thread_lock(td);
sched_lend_user_prio(td, prio);
thread_unlock(td);
diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c
index 9220b4700af7..b53c2f57c908 100644
--- a/sys/kern/sched_ule.c
+++ b/sys/kern/sched_ule.c
@@ -1996,15 +1996,9 @@ void
sched_lend_user_prio_cond(struct thread *td, u_char prio)
{
- if (td->td_lend_user_pri != prio)
- goto lend;
- if (td->td_user_pri != min(prio, td->td_base_user_pri))
- goto lend;
- if (td->td_priority != td->td_user_pri)
- goto lend;
- return;
+ if (td->td_lend_user_pri == prio)
+ return;
-lend:
thread_lock(td);
sched_lend_user_prio(td, prio);
thread_unlock(td);
diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c
index e0fe45e3d326..6dea0f046bfb 100644
--- a/sys/net/if_bridge.c
+++ b/sys/net/if_bridge.c
@@ -142,6 +142,31 @@ extern void nd6_setmtu(struct ifnet *);
#endif
/*
+ * At various points in the code we need to know if we're hooked into the INET
+ * and/or INET6 pfil. Define some macros to do that based on which IP versions
+ * are enabled in the kernel. This avoids littering the rest of the code with
+ * #ifnet INET6 to avoid referencing V_inet6_pfil_head.
+ */
+#ifdef INET6
+#define PFIL_HOOKED_IN_INET6 PFIL_HOOKED_IN(V_inet6_pfil_head)
+#define PFIL_HOOKED_OUT_INET6 PFIL_HOOKED_OUT(V_inet6_pfil_head)
+#else
+#define PFIL_HOOKED_IN_INET6 false
+#define PFIL_HOOKED_OUT_INET6 false
+#endif
+
+#ifdef INET
+#define PFIL_HOOKED_IN_INET PFIL_HOOKED_IN(V_inet_pfil_head)
+#define PFIL_HOOKED_OUT_INET PFIL_HOOKED_OUT(V_inet_pfil_head)
+#else
+#define PFIL_HOOKED_IN_INET false
+#define PFIL_HOOKED_OUT_INET false
+#endif
+
+#define PFIL_HOOKED_IN_46 (PFIL_HOOKED_IN_INET6 || PFIL_HOOKED_IN_INET)
+#define PFIL_HOOKED_OUT_46 (PFIL_HOOKED_OUT_INET6 || PFIL_HOOKED_OUT_INET)
+
+/*
* Size of the route hash table. Must be a power of two.
*/
#ifndef BRIDGE_RTHASH_SIZE
@@ -382,12 +407,14 @@ static int bridge_ioctl_sproto(struct bridge_softc *, void *);
static int bridge_ioctl_stxhc(struct bridge_softc *, void *);
static int bridge_pfil(struct mbuf **, struct ifnet *, struct ifnet *,
int);
+#ifdef INET
static int bridge_ip_checkbasic(struct mbuf **mp);
+static int bridge_fragment(struct ifnet *, struct mbuf **mp,
+ struct ether_header *, int, struct llc *);
+#endif /* INET */
#ifdef INET6
static int bridge_ip6_checkbasic(struct mbuf **mp);
#endif /* INET6 */
-static int bridge_fragment(struct ifnet *, struct mbuf **mp,
- struct ether_header *, int, struct llc *);
static void bridge_linkstate(struct ifnet *ifp);
static void bridge_linkcheck(struct bridge_softc *sc);
@@ -2097,11 +2124,7 @@ bridge_dummynet(struct mbuf *m, struct ifnet *ifp)
return;
}
- if (PFIL_HOOKED_OUT(V_inet_pfil_head)
-#ifdef INET6
- || PFIL_HOOKED_OUT(V_inet6_pfil_head)
-#endif
- ) {
+ if (PFIL_HOOKED_OUT_46) {
if (bridge_pfil(&m, sc->sc_ifp, ifp, PFIL_OUT) != 0)
return;
if (m == NULL)
@@ -2385,11 +2408,7 @@ bridge_forward(struct bridge_softc *sc, struct bridge_iflist *sbif,
ETHER_BPF_MTAP(ifp, m);
/* run the packet filter */
- if (PFIL_HOOKED_IN(V_inet_pfil_head)
-#ifdef INET6
- || PFIL_HOOKED_IN(V_inet6_pfil_head)
-#endif
- ) {
+ if (PFIL_HOOKED_IN_46) {
if (bridge_pfil(&m, ifp, src_if, PFIL_IN) != 0)
return;
if (m == NULL)
@@ -2421,11 +2440,7 @@ bridge_forward(struct bridge_softc *sc, struct bridge_iflist *sbif,
dbif->bif_stp.bp_state == BSTP_IFSTATE_DISCARDING)
goto drop;
- if (PFIL_HOOKED_OUT(V_inet_pfil_head)
-#ifdef INET6
- || PFIL_HOOKED_OUT(V_inet6_pfil_head)
-#endif
- ) {
+ if (PFIL_HOOKED_OUT_46) {
if (bridge_pfil(&m, ifp, dst_if, PFIL_OUT) != 0)
return;
if (m == NULL)
@@ -2551,12 +2566,6 @@ bridge_input(struct ifnet *ifp, struct mbuf *m)
#define CARP_CHECK_WE_ARE_SRC(iface) false
#endif
-#ifdef INET6
-#define PFIL_HOOKED_INET6 PFIL_HOOKED_IN(V_inet6_pfil_head)
-#else
-#define PFIL_HOOKED_INET6 false
-#endif
-
#define GRAB_OUR_PACKETS(iface) \
if ((iface)->if_type == IFT_GIF) \
continue; \
@@ -2581,8 +2590,7 @@ bridge_input(struct ifnet *ifp, struct mbuf *m)
if_inc_counter(bifp, IFCOUNTER_IPACKETS, 1); \
if_inc_counter(bifp, IFCOUNTER_IBYTES, m->m_pkthdr.len); \
/* Filter on the physical interface. */ \
- if (V_pfil_local_phys && (PFIL_HOOKED_IN(V_inet_pfil_head) || \
- PFIL_HOOKED_INET6)) { \
+ if (V_pfil_local_phys && PFIL_HOOKED_IN_46) { \
if (bridge_pfil(&m, NULL, ifp, \
PFIL_IN) != 0 || m == NULL) { \
return (NULL); \
@@ -2621,7 +2629,6 @@ bridge_input(struct ifnet *ifp, struct mbuf *m)
#undef CARP_CHECK_WE_ARE_DST
#undef CARP_CHECK_WE_ARE_SRC
-#undef PFIL_HOOKED_INET6
#undef GRAB_OUR_PACKETS
/* Perform the bridge forwarding function. */
@@ -2653,11 +2660,7 @@ bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if,
sbif = bridge_lookup_member_if(sc, src_if);
/* Filter on the bridge interface before broadcasting */
- if (runfilt && (PFIL_HOOKED_OUT(V_inet_pfil_head)
-#ifdef INET6
- || PFIL_HOOKED_OUT(V_inet6_pfil_head)
-#endif
- )) {
+ if (runfilt && PFIL_HOOKED_OUT_46) {
if (bridge_pfil(&m, sc->sc_ifp, NULL, PFIL_OUT) != 0)
return;
if (m == NULL)
@@ -2700,11 +2703,7 @@ bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if,
* pointer so we do not redundantly filter on the bridge for
* each interface we broadcast on.
*/
- if (runfilt && (PFIL_HOOKED_OUT(V_inet_pfil_head)
-#ifdef INET6
- || PFIL_HOOKED_OUT(V_inet6_pfil_head)
-#endif
- )) {
+ if (runfilt && PFIL_HOOKED_OUT_46) {
if (used == 0) {
/* Keep the layer3 header aligned */
i = min(mc->m_pkthdr.len, max_protohdr);
@@ -3285,12 +3284,15 @@ bridge_state_change(struct ifnet *ifp, int state)
static int
bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir)
{
- int snap, error, i, hlen;
+ int snap, error, i;
struct ether_header *eh1, eh2;
- struct ip *ip;
struct llc llc1;
u_int16_t ether_type;
pfil_return_t rv;
+#ifdef INET
+ struct ip *ip = NULL;
+ int hlen = 0;
+#endif
snap = 0;
error = -1; /* Default error if not error == 0 */
@@ -3331,31 +3333,36 @@ bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir)
}
/*
- * If we're trying to filter bridge traffic, don't look at anything
- * other than IP and ARP traffic. If the filter doesn't understand
- * IPv6, don't allow IPv6 through the bridge either. This is lame
- * since if we really wanted, say, an AppleTalk filter, we are hosed,
- * but of course we don't have an AppleTalk filter to begin with.
- * (Note that since pfil doesn't understand ARP it will pass *ALL*
- * ARP traffic.)
+ * If we're trying to filter bridge traffic, only look at traffic for
+ * protocols available in the kernel (IPv4 and/or IPv6) to avoid
+ * passing traffic for an unsupported protocol to the filter. This is
+ * lame since if we really wanted, say, an AppleTalk filter, we are
+ * hosed, but of course we don't have an AppleTalk filter to begin
+ * with. (Note that since pfil doesn't understand ARP it will pass
+ * *ALL* ARP traffic.)
*/
switch (ether_type) {
+#ifdef INET
case ETHERTYPE_ARP:
case ETHERTYPE_REVARP:
if (V_pfil_ipfw_arp == 0)
return (0); /* Automatically pass */
- break;
+ /* FALLTHROUGH */
case ETHERTYPE_IP:
+#endif
#ifdef INET6
case ETHERTYPE_IPV6:
#endif /* INET6 */
break;
+
default:
/*
- * Check to see if the user wants to pass non-ip
- * packets, these will not be checked by pfil(9) and
- * passed unconditionally so the default is to drop.
+ * We get here if the packet isn't from a supported
+ * protocol. Check to see if the user wants to pass
+ * non-IP packets, these will not be checked by pfil(9)
+ * and passed unconditionally so the default is to
+ * drop.
*/
if (V_pfil_onlyip)
goto bad;
@@ -3387,9 +3394,11 @@ bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir)
*/
if (dir == PFIL_IN) {
switch (ether_type) {
+#ifdef INET
case ETHERTYPE_IP:
error = bridge_ip_checkbasic(mp);
break;
+#endif
#ifdef INET6
case ETHERTYPE_IPV6:
error = bridge_ip6_checkbasic(mp);
@@ -3409,6 +3418,7 @@ bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir)
*/
rv = PFIL_PASS;
switch (ether_type) {
+#ifdef INET
case ETHERTYPE_IP:
/*
* Run pfil on the member interface and the bridge, both can
@@ -3463,6 +3473,7 @@ bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir)
ip->ip_sum = in_cksum(*mp, hlen);
break;
+#endif /* INET */
#ifdef INET6
case ETHERTYPE_IPV6:
if (V_pfil_bridge && dir == PFIL_OUT && bifp != NULL && (rv =
@@ -3517,6 +3528,7 @@ bad:
return (error);
}
+#ifdef INET
/*
* Perform basic checks on header size since
* pfil assumes ip_input has already processed
@@ -3617,6 +3629,7 @@ bad:
*mp = m;
return (-1);
}
+#endif /* INET */
#ifdef INET6
/*
@@ -3672,6 +3685,7 @@ bad:
}
#endif /* INET6 */
+#ifdef INET
/*
* bridge_fragment:
*
@@ -3748,6 +3762,7 @@ dropit:
}
return (error);
}
+#endif /* INET */
static void
bridge_linkstate(struct ifnet *ifp)
diff --git a/sys/netinet/in_fib_dxr.c b/sys/netinet/in_fib_dxr.c
index e7eede53ea51..82245ecf6e66 100644
--- a/sys/netinet/in_fib_dxr.c
+++ b/sys/netinet/in_fib_dxr.c
@@ -474,8 +474,7 @@ chunk_ref(struct dxr_aux *da, uint32_t chunk)
cdp->cd_max_size = size;
cdp->cd_base = fdesc->base;
LIST_INSERT_HEAD(&da->all_chunks, cdp, cd_all_le);
- KASSERT(cdp->cd_base + cdp->cd_max_size == da->rtbl_top,
- ("dxr: %s %d", __FUNCTION__, __LINE__));
+ MPASS(cdp->cd_base + cdp->cd_max_size == da->rtbl_top);
}
cdp->cd_hash = hash;
@@ -497,8 +496,11 @@ chunk_ref(struct dxr_aux *da, uint32_t chunk)
da->range_tbl = realloc(da->range_tbl,
sizeof(*da->range_tbl) * da->rtbl_size + FRAGS_PREF_SHORT,
M_DXRAUX, M_NOWAIT);
- if (da->range_tbl == NULL)
+ if (da->range_tbl == NULL) {
+ FIB_PRINTF(LOG_NOTICE, da->fd,
+ "Unable to allocate DXR range table");
return (1);
+ }
}
return (0);
@@ -522,7 +524,7 @@ chunk_unref(struct dxr_aux *da, uint32_t chunk)
sizeof(struct range_entry_long) * size) == 0)
break;
- KASSERT(cdp != NULL, ("dxr: dangling chunk"));
+ MPASS(cdp != NULL);
if (--cdp->cd_refcnt > 0)
return;
@@ -533,8 +535,7 @@ chunk_unref(struct dxr_aux *da, uint32_t chunk)
/* Attempt to merge with the preceding chunk, if empty */
cdp2 = LIST_NEXT(cdp, cd_all_le);
if (cdp2 != NULL && cdp2->cd_cur_size == 0) {
- KASSERT(cdp2->cd_base + cdp2->cd_max_size == cdp->cd_base,
- ("dxr: %s %d", __FUNCTION__, __LINE__));
+ MPASS(cdp2->cd_base + cdp2->cd_max_size == cdp->cd_base);
LIST_REMOVE(cdp, cd_all_le);
LIST_REMOVE(cdp2, cd_hash_le);
cdp2->cd_max_size += cdp->cd_max_size;
@@ -545,8 +546,7 @@ chunk_unref(struct dxr_aux *da, uint32_t chunk)
/* Attempt to merge with the subsequent chunk, if empty */
cdp2 = LIST_PREV(cdp, &da->all_chunks, chunk_desc, cd_all_le);
if (cdp2 != NULL && cdp2->cd_cur_size == 0) {
- KASSERT(cdp->cd_base + cdp->cd_max_size == cdp2->cd_base,
- ("dxr: %s %d", __FUNCTION__, __LINE__));
+ MPASS(cdp->cd_base + cdp->cd_max_size == cdp2->cd_base);
LIST_REMOVE(cdp, cd_all_le);
LIST_REMOVE(cdp2, cd_hash_le);
cdp2->cd_max_size += cdp->cd_max_size;
@@ -557,8 +557,7 @@ chunk_unref(struct dxr_aux *da, uint32_t chunk)
if (cdp->cd_base + cdp->cd_max_size == da->rtbl_top) {
/* Free the chunk on the top of the range heap, trim the heap */
- KASSERT(cdp == LIST_FIRST(&da->all_chunks),
- ("dxr: %s %d", __FUNCTION__, __LINE__));
+ MPASS(cdp == LIST_FIRST(&da->all_chunks));
da->rtbl_top -= cdp->cd_max_size;
da->unused_chunks_size -= cdp->cd_max_size;
LIST_REMOVE(cdp, cd_all_le);
@@ -632,8 +631,11 @@ trie_ref(struct dxr_aux *da, uint32_t index)
da->xtbl_size += XTBL_SIZE_INCR;
da->x_tbl = realloc(da->x_tbl,
sizeof(*da->x_tbl) * da->xtbl_size, M_DXRAUX, M_NOWAIT);
- if (da->x_tbl == NULL)
+ if (da->x_tbl == NULL) {
+ FIB_PRINTF(LOG_NOTICE, da->fd,
+ "Unable to allocate DXR extension table");
return (-1);
+ }
}
return(tp->td_index);
}
@@ -869,14 +871,18 @@ dxr_build(struct dxr *dxr)
uint32_t trie_frag;
#endif
- KASSERT(dxr->d == NULL, ("dxr: d not free"));
+ MPASS(dxr->d == NULL);
if (da == NULL) {
da = malloc(sizeof(*dxr->aux), M_DXRAUX, M_NOWAIT);
- if (da == NULL)
+ if (da == NULL) {
+ FIB_PRINTF(LOG_NOTICE, dxr->fd,
+ "Unable to allocate DXR aux struct");
return;
+ }
dxr->aux = da;
da->fibnum = dxr->fibnum;
+ da->fd = dxr->fd;
da->refcnt = 1;
LIST_INIT(&da->all_chunks);
LIST_INIT(&da->all_trie);
@@ -894,20 +900,25 @@ dxr_build(struct dxr *dxr)
if (da->range_tbl == NULL) {
da->range_tbl = malloc(sizeof(*da->range_tbl) * da->rtbl_size
+ FRAGS_PREF_SHORT, M_DXRAUX, M_NOWAIT);
- if (da->range_tbl == NULL)
+ if (da->range_tbl == NULL) {
+ FIB_PRINTF(LOG_NOTICE, da->fd,
+ "Unable to allocate DXR range table");
return;
+ }
range_rebuild = 1;
}
#ifdef DXR2
if (da->x_tbl == NULL) {
da->x_tbl = malloc(sizeof(*da->x_tbl) * da->xtbl_size,
M_DXRAUX, M_NOWAIT);
- if (da->x_tbl == NULL)
+ if (da->x_tbl == NULL) {
+ FIB_PRINTF(LOG_NOTICE, da->fd,
+ "Unable to allocate DXR extension table");
return;
+ }
trie_rebuild = 1;
}
#endif
- da->fd = dxr->fd;
microuptime(&t0);
@@ -1039,8 +1050,11 @@ dxr2_try_squeeze:
#endif
dxr->d = malloc(dxr_tot_size, M_DXRLPM, M_NOWAIT);
- if (dxr->d == NULL)
+ if (dxr->d == NULL) {
+ FIB_PRINTF(LOG_NOTICE, da->fd,
+ "Unable to allocate DXR lookup table");
return;
+ }
#ifdef DXR2
memcpy(dxr->d, da->d_tbl, d_size);
dxr->x = ((char *) dxr->d) + d_size;
@@ -1098,7 +1112,7 @@ dxr2_try_squeeze:
}
/*
- * Glue functions for attaching to FreeBSD 13 fib_algo infrastructure.
+ * Glue functions for attaching to the FIB_ALGO infrastructure.
*/
static struct nhop_object *
@@ -1118,8 +1132,11 @@ dxr_init(uint32_t fibnum, struct fib_data *fd, void *old_data, void **data)
struct dxr *dxr;
dxr = malloc(sizeof(*dxr), M_DXRAUX, M_NOWAIT);
- if (dxr == NULL)
+ if (dxr == NULL) {
+ FIB_PRINTF(LOG_NOTICE, fd,
+ "Unable to allocate DXR container struct");
return (FLM_REBUILD);
+ }
/* Check whether we may reuse the old auxiliary structures */
if (old_dxr != NULL && old_dxr->aux != NULL) {
@@ -1140,14 +1157,11 @@ static void
dxr_destroy(void *data)
{
struct dxr *dxr = data;
- struct dxr_aux *da;
+ struct dxr_aux *da = dxr->aux;
struct chunk_desc *cdp;
struct trie_desc *tp;
- if (dxr->d != NULL)
- free(dxr->d, M_DXRLPM);
-
- da = dxr->aux;
+ free(dxr->d, M_DXRLPM);
free(dxr, M_DXRAUX);
if (da == NULL || atomic_fetchadd_int(&da->refcnt, -1) > 1)
@@ -1213,17 +1227,12 @@ dxr_dump_end(void *data, struct fib_dp *dp)
dxr_build(dxr);
da = dxr->aux;
- if (da == NULL)
+ if (da == NULL || dxr->d == NULL)
return (FLM_REBUILD);
- /* Structural limit exceeded, hard error */
if (da->rtbl_top >= BASE_MAX)
return (FLM_ERROR);
- /* A malloc(,, M_NOWAIT) failed somewhere, retry later */
- if (dxr->d == NULL)
- return (FLM_REBUILD);
-
dp->f = choose_lookup_fn(da);
dp->arg = dxr;
@@ -1260,13 +1269,14 @@ dxr_change_rib_batch(struct rib_head *rnh, struct fib_change_queue *q,
int update_delta = 0;
#endif
- KASSERT(data != NULL, ("%s: NULL data", __FUNCTION__));
- KASSERT(q != NULL, ("%s: NULL q", __FUNCTION__));
- KASSERT(q->count < q->size, ("%s: q->count %d q->size %d",
- __FUNCTION__, q->count, q->size));
+ MPASS(data != NULL);
+ MPASS(q != NULL);
+ MPASS(q->count < q->size);
da = dxr->aux;
- KASSERT(da != NULL, ("%s: NULL dxr->aux", __FUNCTION__));
+ MPASS(da != NULL);
+ MPASS(da->fd != NULL);
+ MPASS(da->refcnt > 0);
FIB_PRINTF(LOG_INFO, da->fd, "processing %d update(s)", q->count);
for (ui = 0; ui < q->count; ui++) {
@@ -1299,8 +1309,7 @@ dxr_change_rib_batch(struct rib_head *rnh, struct fib_change_queue *q,
#ifdef INVARIANTS
fib_get_rtable_info(fib_get_rh(da->fd), &rinfo);
- KASSERT(da->prefixes + update_delta == rinfo.num_prefixes,
- ("%s: update count mismatch", __FUNCTION__));
+ MPASS(da->prefixes + update_delta == rinfo.num_prefixes);
#endif
res = dxr_init(0, dxr->fd, data, (void **) &new_dxr);
@@ -1310,12 +1319,9 @@ dxr_change_rib_batch(struct rib_head *rnh, struct fib_change_queue *q,
dxr_build(new_dxr);
/* Structural limit exceeded, hard error */
- if (da->rtbl_top >= BASE_MAX) {
- dxr_destroy(new_dxr);
+ if (da->rtbl_top >= BASE_MAX)
return (FLM_ERROR);
- }
- /* A malloc(,, M_NOWAIT) failed somewhere, retry later */
if (new_dxr->d == NULL) {
dxr_destroy(new_dxr);
return (FLM_REBUILD);
@@ -1329,6 +1335,7 @@ dxr_change_rib_batch(struct rib_head *rnh, struct fib_change_queue *q,
return (FLM_SUCCESS);
}
+ FIB_PRINTF(LOG_NOTICE, dxr->fd, "fib_set_datapath_ptr() failed");
dxr_destroy(new_dxr);
return (FLM_REBUILD);
}
diff --git a/sys/netinet/ip_fw.h b/sys/netinet/ip_fw.h
index 332d6e2db0b8..ba2bb06b2416 100644
--- a/sys/netinet/ip_fw.h
+++ b/sys/netinet/ip_fw.h
@@ -972,7 +972,7 @@ typedef struct _ipfw_range_tlv {
#define IPFW_RCFLAG_USER (IPFW_RCFLAG_RANGE | IPFW_RCFLAG_ALL | \
IPFW_RCFLAG_SET | IPFW_RCFLAG_DYNAMIC)
/* Internally used flags */
-#define IPFW_RCFLAG_DEFAULT 0x0100 /* Do not skip defaul rule */
+#define IPFW_RCFLAG_DEFAULT 0x0100 /* Do not skip default rule */
typedef struct _ipfw_ta_tinfo {
uint32_t flags; /* Format flags */
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 946a49030920..acf04e1e56bb 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -163,6 +163,9 @@ static int in6_broadcast_ifa(struct ifnet *, struct in6_aliasreq *,
#define ifa2ia6(ifa) ((struct in6_ifaddr *)(ifa))
#define ia62ifa(ia6) (&((ia6)->ia_ifa))
+static struct sx in6_control_sx;
+SX_SYSINIT(in6_control_sx, &in6_control_sx, "in6_control");
+
void
in6_newaddrmsg(struct in6_ifaddr *ia, int cmd)
{
@@ -251,6 +254,7 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
int carp_attached = 0;
int error;
u_long ocmd = cmd;
+ bool control_locked = false;
/*
* Compat to make pre-10.x ifconfig(8) operable.
@@ -406,6 +410,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
if (td != NULL && (error = prison_check_ip6(td->td_ucred,
&sa6->sin6_addr)) != 0)
return (error);
+ sx_xlock(&in6_control_sx);
+ control_locked = true;
ia = in6ifa_ifpwithaddr(ifp, &sa6->sin6_addr);
} else
ia = NULL;
@@ -710,6 +716,9 @@ aifaddr_out:
error = 0;
out:
+ if (control_locked)
+ sx_xunlock(&in6_control_sx);
+
if (ia != NULL)
ifa_free(&ia->ia_ifa);
return (error);
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index 1fd5803117bd..2c171514e946 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -1283,6 +1283,7 @@ keyattach:
sk : NULL);
printf("\n");
}
+ s->timeout = PFTM_UNLINKED;
PF_HASHROW_UNLOCK(ih);
KEYS_UNLOCK();
uma_zfree(V_pf_state_key_z, sk);
@@ -1350,6 +1351,8 @@ pf_detach_state(struct pf_kstate *s)
struct pf_state_key *sks = s->key[PF_SK_STACK];
struct pf_keyhash *kh;
+ MPASS(s->timeout >= PFTM_MAX);
+
pf_sctp_multihome_detach_addr(s);
if (sks != NULL) {
@@ -1478,6 +1481,7 @@ pf_state_insert(struct pfi_kkif *kif, struct pfi_kkif *orig_kif,
break;
if (cur != NULL) {
+ s->timeout = PFTM_UNLINKED;
PF_HASHROW_UNLOCK(ih);
if (V_pf_status.debug >= PF_DEBUG_MISC) {
printf("pf: state ID collision: "
diff --git a/usr.bin/expand/expand.1 b/usr.bin/expand/expand.1
index 9a49deb1a948..c1e19891b1ab 100644
--- a/usr.bin/expand/expand.1
+++ b/usr.bin/expand/expand.1
@@ -80,9 +80,15 @@ If the
.Fl a
option is given, then tabs are inserted whenever they would compress the
resultant file by replacing two or more characters.
-.It Fl t \&Sm Ar tab1 , tab2 , ... , tabn \&Sm
+.It Fl t Xo
+.Sm off
+.Ar tab1 , tab2 , ... , tabn
+.Sm on
+.Xc
Set tab stops at column positions
+.Sm off
.Ar tab1 , tab2 , ... , tabn .
+.Sm on
If only a single number is given, tab stops are set that number of
column positions apart instead of the default number of 8.
.El
diff --git a/usr.bin/split/split.c b/usr.bin/split/split.c
index e246a0d4adfc..52374c93efca 100644
--- a/usr.bin/split/split.c
+++ b/usr.bin/split/split.c
@@ -401,6 +401,10 @@ newfile(void)
*/
if (!dflag && autosfx && (fpnt[0] == 'y') &&
strspn(fpnt+1, "z") == strlen(fpnt+1)) {
+ /* Ensure the generated filenames will fit into the buffer. */
+ if (strlen(fname) + 2 >= sizeof(fname))
+ errx(EX_USAGE, "combined filenames would be too long");
+
fpnt = fname + strlen(fname) - sufflen;
fpnt[sufflen + 2] = '\0';
fpnt[0] = end;
diff --git a/usr.sbin/adduser/adduser.sh b/usr.sbin/adduser/adduser.sh
index e9027b6b7876..7c3fdb418179 100644
--- a/usr.sbin/adduser/adduser.sh
+++ b/usr.sbin/adduser/adduser.sh
@@ -53,7 +53,7 @@ info() {
# by pw(8).
#
get_nextuid () {
- local _uid=$1 _nextuid
+ local _uid=$1 _nextuid=
if [ -z "$_uid" ]; then
_nextuid="$(${PWCMD} usernext | cut -f1 -d:)"
@@ -101,7 +101,7 @@ show_usage() {
# basename of the shell is output.
#
valid_shells() {
- local _prefix
+ local _prefix=
${GREPCMD} '^[^#]' ${ETCSHELLS} |
while read _path _junk ; do
@@ -119,7 +119,7 @@ valid_shells() {
# full path to the shell from the /etc/shells file.
#
fullpath_from_shell() {
- local _shell=$1 _fullpath
+ local _shell=$1 _fullpath=
if [ -z "$_shell" ]; then
return
@@ -154,7 +154,7 @@ fullpath_from_shell() {
# will emit an informational message saying so.
#
shell_exists() {
- local _sh="$1"
+ local _sh=$1
if [ -z "$(fullpath_from_shell "$_sh")" ] ; then
err "Invalid shell ($_sh) for user $username."
@@ -193,8 +193,9 @@ save_config() {
# message or lock the account, do so.
#
add_user() {
- local _uid _name _comment _gecos _home _group _grouplist _shell _class
- local _dotdir _expire _pwexpire _passwd _upasswd _passwdmethod
+ local _uid= _name= _comment= _gecos= _home= _group= _grouplist=
+ local _shell= _class= _dotdir= _expire= _pwexpire= _passwd= _upasswd=
+ local _passwdmethod= _pwcmd=
# Is this a configuration run? If so, don't modify user database.
#
@@ -299,7 +300,7 @@ add_user() {
fi
fi
- local _line _owner _perms _file _dir
+ local _line= _owner= _perms= _file= _dir=
if [ -n "$msgflag" ]; then
if [ -r "$msgfile" ]; then
# We're evaluating the contents of an external file.
@@ -331,7 +332,7 @@ add_user() {
# a file it will output an error message and return to the caller.
#
get_user() {
- local _input
+ local _input=
# No need to take down user names if this is a configuration saving run.
[ -n "$configflag" ] && return
@@ -366,7 +367,7 @@ get_user() {
# and batch (from file) mode.
#
get_gecos() {
- local _input
+ local _input=
# No need to take down additional user information for a configuration run.
[ -n "$configflag" ] && return
@@ -386,7 +387,7 @@ get_gecos() {
# If an invalid shell is entered it will simply use the default shell.
#
get_shell() {
- local _input _fullpath
+ local _input= _fullpath=
ushell="$defaultshell"
# Make sure the current value of the shell is a valid one
@@ -424,7 +425,7 @@ get_shell() {
# and batch input.
#
get_homedir() {
- _input=
+ local _input=
if [ -z "$fflag" ]; then
echo -n "Home directory [${homeprefix}/${username}]: "
read _input
@@ -450,7 +451,7 @@ get_homedir() {
# Reads the account's home directory permissions.
#
get_homeperm() {
- local _input _prompt
+ local _input= _prompt=
uhomeperm=$defaultHomePerm
if [ -n "$uhomeperm" ]; then
@@ -473,7 +474,7 @@ get_homeperm() {
# so, enable ZFS home dataset creation.
#
get_zfs_home() {
- local _prefix
+ local _prefix=
# check if zfs kernel module is loaded before attempting to run zfs to
# prevent loading the kernel module on systems that don't use ZFS
@@ -494,7 +495,7 @@ get_zfs_home() {
# allocates one if it is not specified.
#
get_uid() {
- local _input _prompt
+ local _input= _prompt=
uuid=${uidstart}
if [ -n "$uuid" ]; then
@@ -519,7 +520,7 @@ get_uid() {
# Reads login class of account. Can be used in interactive or batch mode.
#
get_class() {
- local _input _uclass
+ local _input= _class=
uclass="$defaultclass"
_class=${uclass:-"default"}
@@ -541,7 +542,7 @@ get_class() {
# will then provide a login group with the same name as the username.
#
get_logingroup() {
- local _input
+ local _input=
ulogingroup="$defaultLgroup"
if [ -z "$fflag" ]; then
@@ -560,7 +561,7 @@ get_logingroup() {
# and batch modes.
#
get_groups() {
- local _input _group
+ local _input= _group=
ugroups="$defaultgroups"
_group=${ulogingroup:-"${username}"}
@@ -626,7 +627,7 @@ get_password() {
# Ask user if they want to enable encryption on their ZFS home dataset.
#
get_zfs_encryption() {
- local _input _prompt
+ local _input= _prompt=
_prompt="Enable ZFS encryption? (yes/no) [${Zencrypt}]: "
while : ; do
echo -n "$_prompt"
@@ -702,7 +703,7 @@ set_zfs_perms() {
# adds it to the user database.
#
input_from_file() {
- local _field
+ local _field=
while read -r fileline ; do
case "$fileline" in
@@ -733,14 +734,13 @@ input_from_file() {
# the user database.
#
input_interactive() {
- local _disable _pass _passconfirm _input
+ local _disable= _pass= _passconfirm= _input=
local _random="no"
local _emptypass="no"
local _usepass="yes"
local _logingroup_ok="no"
local _groups_ok="no"
local _all_ok="yes"
- local _another_user="no"
case $passwdtype in
none)
_emptypass="yes"
@@ -1129,6 +1129,7 @@ if [ -n "$fflag" ]; then
else
input_interactive
while : ; do
+ _another_user="no"
if [ -z "$configflag" ]; then
echo -n "Add another user? (yes/no) [$_another_user]: "
else
diff --git a/usr.sbin/pw/pw.c b/usr.sbin/pw/pw.c
index 063553dd084f..fc17f6dba022 100644
--- a/usr.sbin/pw/pw.c
+++ b/usr.sbin/pw/pw.c
@@ -101,13 +101,16 @@ static int (*cmdfunc[W_NUM][M_NUM])(int argc, char **argv, char *_name) = {
struct pwconf conf;
+static int mode = -1;
+static int which = -1;
+
static int getindex(const char *words[], const char *word);
static void cmdhelp(int mode, int which);
int
main(int argc, char *argv[])
{
- int mode = -1, which = -1, tmp;
+ int tmp;
struct stat st;
char arg, *arg1;
bool relocated, nis;
@@ -375,5 +378,11 @@ cmdhelp(int mode, int which)
fprintf(stderr, "%s", help[which][mode]);
}
- exit(EXIT_FAILURE);
+ exit(EX_USAGE);
+}
+
+void
+usage(void)
+{
+ cmdhelp(mode, which);
}
diff --git a/usr.sbin/pw/pw.h b/usr.sbin/pw/pw.h
index 54a49f3d691a..c3725693f91d 100644
--- a/usr.sbin/pw/pw.h
+++ b/usr.sbin/pw/pw.h
@@ -36,14 +36,14 @@
enum _mode
{
- M_ADD,
- M_DELETE,
- M_UPDATE,
- M_PRINT,
+ M_ADD,
+ M_DELETE,
+ M_MODIFY,
+ M_SHOW,
M_NEXT,
M_LOCK,
M_UNLOCK,
- M_NUM
+ M_NUM
};
enum _passmode
@@ -56,13 +56,13 @@ enum _passmode
enum _which
{
- W_USER,
- W_GROUP,
- W_NUM
+ W_USER,
+ W_GROUP,
+ W_NUM
};
-#define _DEF_DIRMODE (S_IRWXU | S_IRWXG | S_IRWXO)
-#define _PW_CONF "pw.conf"
+#define _DEF_DIRMODE (S_IRWXU | S_IRWXG | S_IRWXO)
+#define _PW_CONF "pw.conf"
#define _UC_MAXLINE 1024
#define _UC_MAXSHELLS 32
@@ -112,3 +112,7 @@ extern const char *Which[];
uintmax_t strtounum(const char * __restrict, uintmax_t, uintmax_t,
const char ** __restrict);
+
+bool grp_has_member(struct group *grp, const char *name);
+
+void usage(void);
diff --git a/usr.sbin/pw/pw_group.c b/usr.sbin/pw/pw_group.c
index 91300afe3c23..1941c03aa2c5 100644
--- a/usr.sbin/pw/pw_group.c
+++ b/usr.sbin/pw/pw_group.c
@@ -273,9 +273,13 @@ pw_group_next(int argc, char **argv, char *arg1 __unused)
quiet = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
@@ -332,9 +336,13 @@ pw_group_show(int argc, char **argv, char *arg1)
all = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
@@ -391,9 +399,13 @@ pw_group_del(int argc, char **argv, char *arg1)
nis = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
@@ -413,7 +425,7 @@ pw_group_del(int argc, char **argv, char *arg1)
return (EXIT_SUCCESS);
}
-static bool
+bool
grp_has_member(struct group *grp, const char *name)
{
int j;
@@ -551,9 +563,13 @@ pw_group_add(int argc, char **argv, char *arg1)
nis = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
@@ -645,9 +661,14 @@ pw_group_mod(int argc, char **argv, char *arg1)
nis = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
+
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
cnf = get_userconfig(cfg);
@@ -697,11 +718,11 @@ pw_group_mod(int argc, char **argv, char *arg1)
if ((grp = GETGRNAM(name)) == NULL)
errx(EX_SOFTWARE, "group disappeared during update");
- pw_log(cnf, M_UPDATE, W_GROUP, "%s(%ju)", grp->gr_name,
+ pw_log(cnf, M_MODIFY, W_GROUP, "%s(%ju)", grp->gr_name,
(uintmax_t)grp->gr_gid);
if (nis && nis_update() == 0)
- pw_log(cnf, M_UPDATE, W_GROUP, "NIS maps updated");
+ pw_log(cnf, M_MODIFY, W_GROUP, "NIS maps updated");
return (EXIT_SUCCESS);
}
diff --git a/usr.sbin/pw/pw_user.c b/usr.sbin/pw/pw_user.c
index 78cdfc98c447..ebe80977fa0e 100644
--- a/usr.sbin/pw/pw_user.c
+++ b/usr.sbin/pw/pw_user.c
@@ -163,7 +163,7 @@ create_and_populate_homedir(struct userconf *cnf, struct passwd *pwd,
copymkdir(conf.rootfd, pwd->pw_dir, skelfd, homemode, pwd->pw_uid,
pwd->pw_gid, 0);
- pw_log(cnf, update ? M_UPDATE : M_ADD, W_USER, "%s(%ju) home %s made",
+ pw_log(cnf, update ? M_MODIFY : M_ADD, W_USER, "%s(%ju) home %s made",
pwd->pw_name, (uintmax_t)pwd->pw_uid, pwd->pw_dir);
}
@@ -756,9 +756,13 @@ pw_user_next(int argc, char **argv, char *name __unused)
quiet = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
@@ -820,9 +824,13 @@ pw_user_show(int argc, char **argv, char *arg1)
v7 = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
@@ -903,9 +911,13 @@ pw_user_del(int argc, char **argv, char *arg1)
nis = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (quiet)
freopen(_PATH_DEVNULL, "w", stderr);
@@ -1055,9 +1067,13 @@ pw_user_lock(int argc, char **argv, char *arg1)
/* compatibility */
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
return (pw_userlock(arg1, M_LOCK));
}
@@ -1074,9 +1090,13 @@ pw_user_unlock(int argc, char **argv, char *arg1)
/* compatibility */
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
return (pw_userlock(arg1, M_UNLOCK));
}
@@ -1343,9 +1363,13 @@ pw_user_add(int argc, char **argv, char *arg1)
nis = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (geteuid() != 0 && ! dryrun)
errx(EX_NOPERM, "you must be root");
@@ -1454,6 +1478,9 @@ pw_user_add(int argc, char **argv, char *arg1)
if (cmdcnf->groups != NULL) {
for (i = 0; i < cmdcnf->groups->sl_cur; i++) {
grp = GETGRNAM(cmdcnf->groups->sl_str[i]);
+ /* gr_add doesn't check if new member is already in group */
+ if (grp_has_member(grp, pwd->pw_name))
+ continue;
grp = gr_add(grp, pwd->pw_name);
/*
* grp can only be NULL in 2 cases:
@@ -1653,9 +1680,13 @@ pw_user_mod(int argc, char **argv, char *arg1)
nis = true;
break;
default:
- exit(EX_USAGE);
+ usage();
}
}
+ argc -= optind;
+ argv += optind;
+ if (argc > 0)
+ usage();
if (geteuid() != 0 && ! dryrun)
errx(EX_NOPERM, "you must be root");
@@ -1836,7 +1867,7 @@ pw_user_mod(int argc, char **argv, char *arg1)
if (pwd == NULL)
errx(EX_NOUSER, "user '%s' disappeared during update", name);
grp = GETGRGID(pwd->pw_gid);
- pw_log(cnf, M_UPDATE, W_USER, "%s(%ju):%s(%ju):%s:%s:%s",
+ pw_log(cnf, M_MODIFY, W_USER, "%s(%ju):%s(%ju):%s:%s:%s",
pwd->pw_name, (uintmax_t)pwd->pw_uid,
grp ? grp->gr_name : "unknown",
(uintmax_t)(grp ? grp->gr_gid : (uid_t)-1),
@@ -1857,7 +1888,7 @@ pw_user_mod(int argc, char **argv, char *arg1)
}
if (nis && nis_update() == 0)
- pw_log(cnf, M_UPDATE, W_USER, "NIS maps updated");
+ pw_log(cnf, M_MODIFY, W_USER, "NIS maps updated");
return (EXIT_SUCCESS);
}
diff --git a/usr.sbin/pw/tests/pw_useradd_test.sh b/usr.sbin/pw/tests/pw_useradd_test.sh
index b191d51104f7..93a192c59409 100755
--- a/usr.sbin/pw/tests/pw_useradd_test.sh
+++ b/usr.sbin/pw/tests/pw_useradd_test.sh
@@ -305,6 +305,22 @@ user_add_R_symlink_body() {
atf_check -s exit:0 -o inline:"usr/home\n" readlink ${HOME}/home
}
+atf_test_case user_add_dir
+user_add_dir_body() {
+ populate_root_etc_skel
+
+ atf_check -s exit:0 ${RPW} useradd foo -M 0705 -m
+ atf_check grep -q '^foo:' $HOME/etc/master.passwd
+ atf_check test -d ${HOME}/home/foo
+ atf_check -o save:ugid \
+ awk -F: '$1 == "foo" { print $3, $4 }' \
+ $HOME/etc/master.passwd
+ atf_check -o file:ugid \
+ stat -f '%u %g' ${HOME}/home/foo
+ atf_check -o inline:"40705\n" \
+ stat -f '%p' ${HOME}/home/foo
+}
+
atf_test_case user_add_skel
user_add_skel_body() {
populate_root_etc_skel
@@ -479,6 +495,7 @@ atf_init_test_cases() {
atf_add_test_case user_add_password_from_h
atf_add_test_case user_add_R
atf_add_test_case user_add_R_symlink
+ atf_add_test_case user_add_dir
atf_add_test_case user_add_skel
atf_add_test_case user_add_uid0
atf_add_test_case user_add_uid_too_large
diff --git a/usr.sbin/rpc.lockd/lockd.c b/usr.sbin/rpc.lockd/lockd.c
index 35953f32692e..15448b651749 100644
--- a/usr.sbin/rpc.lockd/lockd.c
+++ b/usr.sbin/rpc.lockd/lockd.c
@@ -188,7 +188,8 @@ main(int argc, char **argv)
kernel_lockd_client = FALSE;
if (modfind("nfslockd") < 0) {
if (kldload("nfslockd") < 0) {
- fprintf(stderr, "Can't find or load kernel support for rpc.lockd - using non-kernel implementation\n");
+ fprintf(stderr, "Unable to load nfslockd(4), "
+ "using userland implementation\n");
} else {
kernel_lockd = TRUE;
}
diff --git a/usr.sbin/rpc.lockd/rpc.lockd.8 b/usr.sbin/rpc.lockd/rpc.lockd.8
index 89f55087901d..89592a1cceaf 100644
--- a/usr.sbin/rpc.lockd/rpc.lockd.8
+++ b/usr.sbin/rpc.lockd/rpc.lockd.8
@@ -27,7 +27,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd November 21, 2019
+.Dd May 8, 2024
.Dt RPC.LOCKD 8
.Os
.Sh NAME
@@ -44,7 +44,7 @@
The
.Nm
utility provides monitored and unmonitored file and record locking services
-in an NFS environment.
+in an NFSv3 environment.
To monitor the status of hosts requesting locks,
the locking daemon typically operates in conjunction
with
@@ -137,6 +137,7 @@ RPC protocol specification for the network lock manager protocol.
.El
.Sh SEE ALSO
.Xr syslog 3 ,
+.Xr nfslockd 4 ,
.Xr rc.conf 5 ,
.Xr rpc.statd 8
.Sh STANDARDS