diff options
94 files changed, 1821 insertions, 732 deletions
diff --git a/Makefile.inc1 b/Makefile.inc1 index e341599ac505..81af336ecfa2 100644 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -471,7 +471,7 @@ SUBDIR+=	${_DIR}  # by calling 'makedb' in share/man.  This is only relevant for  # install/distribute so they build the whatis file after every manpage is  # installed. -.if make(installworld) || make(install) +.if make(installworld) || make(install) || make(distributeworld) || make(distribute)  SUBDIR+=.WAIT  .endif  SUBDIR+=etc @@ -27,6 +27,11 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 16.x IS SLOW:  	world, or to merely disable the most expensive debugging functionality  	at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20251102: +	Commit e5aa60d06958 changed the internal KAPI between +	the NFS modules.  As such, they all need to be rebuilt +	from sources.  __FreeBSD_version was bumped to 1600004 for this. +  20251025:  	flua(1) has moved to the new FreeBSD-flua package.  If you use flua,  	you may want to install this package if it's not otherwise installed diff --git a/cddl/contrib/opensolaris/cmd/dtrace/dtrace.1 b/cddl/contrib/opensolaris/cmd/dtrace/dtrace.1 index e263b936700d..f09cbe1ac27b 100644 --- a/cddl/contrib/opensolaris/cmd/dtrace/dtrace.1 +++ b/cddl/contrib/opensolaris/cmd/dtrace/dtrace.1 @@ -20,7 +20,7 @@  .\"  .\" $FreeBSD$  .\" -.Dd July 30, 2025 +.Dd November 3, 2025  .Dt DTRACE 1  .Os  .Sh NAME @@ -1305,6 +1305,7 @@ in  .Xr dtrace_tcp 4 ,  .Xr dtrace_udp 4 ,  .Xr dtrace_udplite 4 , +.Xr dtrace_vfs 4 ,  .Xr elf 5 ,  .Xr d 7 ,  .Xr tracing 7 , diff --git a/contrib/bsddialog/CHANGELOG b/contrib/bsddialog/CHANGELOG index 7800098644d7..503f70c73daa 100644 --- a/contrib/bsddialog/CHANGELOG +++ b/contrib/bsddialog/CHANGELOG @@ -1,3 +1,13 @@ +2025-08-15 Version 1.1 + +	Library: +	* add: bsddialog_slider(). +	  Thanks to https://gitlab.com/alfix/bsddialog/-/merge_requests/7 + +	Utility: +	* add: --slider dialog. +	  Thanks to https://gitlab.com/alfix/bsddialog/-/merge_requests/7 +  2025-06-22 Version 1.0.5  	Manual: diff --git a/contrib/bsddialog/Makefile b/contrib/bsddialog/Makefile index 335b693470e6..7eb5938ff291 100644 --- a/contrib/bsddialog/Makefile +++ b/contrib/bsddialog/Makefile @@ -4,7 +4,7 @@  # Written in 2023 by Alfonso Sabato Siciliano  OUTPUT = bsddialog -export VERSION=1.0.5 +export VERSION=1.1  .CURDIR ?= ${CURDIR}  LIBPATH = ${.CURDIR}/lib  LIBBSDDIALOG = ${LIBPATH}/libbsddialog.so diff --git a/contrib/bsddialog/README.md b/contrib/bsddialog/README.md index 5a25109775fe..f7552c303c09 100644 --- a/contrib/bsddialog/README.md +++ b/contrib/bsddialog/README.md @@ -1,4 +1,4 @@ -# BSDDialog 1.0.5 +# BSDDialog 1.1  This project provides **bsddialog** and **libbsddialog**, an utility  and a library to build scripts and tools with TUI dialogs and widgets. @@ -31,7 +31,8 @@ Output:  --calendar, --checklist, --datebox, --form, --gauge, --infobox, --inputbox,  --menu, --mixedform, --mixedgauge, --msgbox, --passwordbox, --passwordform, ---pause, --radiolist, --rangebox, --textbox, --timebox, --treeview, --yesno. +--pause, --radiolist, --rangebox, --slider, --textbox, --timebox, --treeview, +--yesno.  **Manual** @@ -69,6 +70,7 @@ in the _Public Domain_ to build new projects:  % sh ./examples_utility/pause.sh  % sh ./examples_utility/radiolist.sh  % sh ./examples_utility/rangebox.sh +% sh ./examples_utility/slider.sh  % sh ./examples_utility/timebox.sh  % sh ./examples_utility/yesno.sh  ``` @@ -106,6 +108,7 @@ in the _Public Domain_ to build new projects:  % ./pause  % ./radiolist  % ./rangebox +% ./slider  % ./theme  % ./timebox  % ./yesno diff --git a/contrib/bsddialog/examples_library/compile b/contrib/bsddialog/examples_library/compile index 1a68313090f6..b5e08f740784 100755 --- a/contrib/bsddialog/examples_library/compile +++ b/contrib/bsddialog/examples_library/compile @@ -12,7 +12,7 @@ set -x  libpath=../lib  examples="menu checklist radiolist mixedlist theme infobox yesno msgbox \ -datebox form timebox rangebox pause calendar gauge mixedgauge textbox" +datebox form timebox rangebox pause calendar gauge mixedgauge textbox slider"  rm -f $examples diff --git a/contrib/bsddialog/examples_library/slider.c b/contrib/bsddialog/examples_library/slider.c new file mode 100644 index 000000000000..2292f0e8efed --- /dev/null +++ b/contrib/bsddialog/examples_library/slider.c @@ -0,0 +1,44 @@ +/*- + * SPDX-License-Identifier: CC0-1.0 + * + * Written in 2025 by Alfonso Sabato Siciliano. + * To the extent possible under law, the author has dedicated all copyright + * and related and neighboring rights to this software to the public domain + * worldwide. This software is distributed without any warranty, see: + *   <http://creativecommons.org/publicdomain/zero/1.0/>. + */ + +#include <bsddialog.h> +#include <stdio.h> + +int main() +{ +	int output; +	unsigned long start, end, blocks[2][2]; +	struct bsddialog_conf conf; + +	start = 20; +	end = 70; +	blocks[0][0] = 5; +	blocks[0][1] = 10; +	blocks[1][0] = 80; +	blocks[1][1] = 90; + +	if (bsddialog_init() == BSDDIALOG_ERROR) { +		printf("Error: %s\n", bsddialog_geterror()); +		return (1); +	} +	bsddialog_initconf(&conf); +	conf.title = "slider"; + +	output = bsddialog_slider(&conf, "Example", 0, 0, "GiB", 100, &start, +	    &end, false, 2, blocks); +	bsddialog_end(); +	if (output == BSDDIALOG_ERROR) { +		printf("Error: %s\n", bsddialog_geterror()); +		return (1); +	} +	printf("Start: %lu, End: %lu\n", start, end); + +	return (0); +} diff --git a/contrib/bsddialog/examples_utility/slider.sh b/contrib/bsddialog/examples_utility/slider.sh new file mode 100644 index 000000000000..bd037e13c977 --- /dev/null +++ b/contrib/bsddialog/examples_utility/slider.sh @@ -0,0 +1,34 @@ +#!/bin/sh +#- +# SPDX-License-Identifier: CC0-1.0 +# +# Written in 2025 by Braulio Rivas. +# +# To the extent possible under law, the author has dedicated all copyright +# and related and neighboring rights to this software to the public domain +# worldwide. This software is distributed without any warranty, see: +#	<http://creativecommons.org/publicdomain/zero/1.0/>. + +: ${BSDDIALOG_ERROR=255} +: ${BSDDIALOG_OK=0} +: ${BSDDIALOG_CANCEL=1} +: ${BSDDIALOG_ESC=5} + +STARTEND=$(./bsddialog --slider "Choose a new partition location" 0 0 MiB \ +  30000 5000 6000 0 1000 3000 25000 30000 \ +3>&1 1>&2 2>&3 3>&-) + +case $? in +	$BSDDIALOG_ERROR ) +		exit 1 +	;; +	$BSDDIALOG_ESC ) +		echo "[ESC]" +	;; +	$BSDDIALOG_CANCEL ) +		echo "[Cancel]" +	;; +	$BSDDIALOG_OK ) +		echo "[OK] $STARTEND" +	;; +esac diff --git a/contrib/bsddialog/lib/Makefile b/contrib/bsddialog/lib/Makefile index c728541a9f7a..b5a3c1a8afc4 100644 --- a/contrib/bsddialog/lib/Makefile +++ b/contrib/bsddialog/lib/Makefile @@ -8,7 +8,7 @@ LIBRARY_SO = lib${LIBRARY:=.so}  LIBRARY_A = lib${LIBRARY:=.a}  HEADERS = bsddialog.h bsddialog_theme.h bsddialog_progressview.h  SOURCES = barbox.c datebox.c formbox.c libbsddialog.c lib_util.c \ -	menubox.c messagebox.c textbox.c theme.c timebox.c +	menubox.c messagebox.c slider.c textbox.c theme.c timebox.c  OBJECTS = ${SOURCES:.c=.o}  PREFIX = /usr/local diff --git a/contrib/bsddialog/lib/bsddialog.h b/contrib/bsddialog/lib/bsddialog.h index fc59071c6fa0..4b387d993363 100644 --- a/contrib/bsddialog/lib/bsddialog.h +++ b/contrib/bsddialog/lib/bsddialog.h @@ -30,7 +30,7 @@  #include <stdbool.h> -#define LIBBSDDIALOG_VERSION     "1.0.5" +#define LIBBSDDIALOG_VERSION     "1.1"  /* Return values */  #define BSDDIALOG_ERROR          -1 @@ -245,6 +245,12 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,      int cols, int min, int max, int *value);  int +bsddialog_slider(struct bsddialog_conf *conf, const char *text, int rows, +    int cols, const char *unit, unsigned long length, unsigned long *start, +    unsigned long *end, bool resize, unsigned int nblocks, +    unsigned long blocks[][2]); + +int  bsddialog_textbox(struct bsddialog_conf *conf, const char *file, int rows,      int cols); diff --git a/contrib/bsddialog/lib/slider.c b/contrib/bsddialog/lib/slider.c new file mode 100644 index 000000000000..534253470849 --- /dev/null +++ b/contrib/bsddialog/lib/slider.c @@ -0,0 +1,670 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2025 Braulio Rivas + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <curses.h> +#include <stdlib.h> +#include <string.h> + +#include "bsddialog.h" +#include "bsddialog_theme.h" +#include "lib_util.h" + +#define MINHSLIDER 13 +#define MINWSLIDER 36 + +#define NULLWIN -1 +#define START_WIN 0 +#define END_WIN 1 +#define STEP_WIN 2 +#define SLIDER_WIN 3 +#define NWIN 4 + +enum operation { +	MOVERIGHT, +	MOVEFARRIGHT, +	MOVEFASTRIGHT, +	MOVELEFT, +	MOVEFARLEFT, +	MOVEFASTLEFT, +	INCREASELEFT, +	DECREASELEFT, +	INCREASERIGHT, +	DECREASERIGHT, +	INCREASESTEP, +	DECREASESTEP, +}; + +struct sliderctl { +	enum operation op; +	unsigned long (*spaces)[2]; +	int nspaces; /* api unsigned, but segfault handlesliderctl():MOVELEFT */ +	unsigned long length; +	unsigned long *start; +	unsigned long *end; +	unsigned long step; +}; + +static int crashes(long x, long y, long a, long b) +{ +	return ((x <= a && a <= y) || (x <= b && b <= y)); +} + +static int fits(long x, long y, long a, long b) +{ +	return ((x <= a) && (b <= y)); +} + +static void handlesliderctl(struct sliderctl *sliderctl) +{ +	int i, step, tmpstep; +	unsigned long x, y, size, old_start, old_end; +	signed long new_start, new_end; + +	step = sliderctl->step; +	old_start = *(sliderctl->start); +	new_start = old_start; +	old_end = *(sliderctl->end); +	new_end = old_end; +	size = old_end - old_start + 1; + +	switch (sliderctl->op) { +	case MOVERIGHT: +		new_start = old_start + step; +		new_end = old_end + step; + +		for (i = 0; i < sliderctl->nspaces; i++) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_start = y + 1; +				new_end = new_start + size - 1; +				break; +			} +		} +		break; +	case MOVELEFT: +		new_start = old_start - step; +		new_end = old_end - step; + +		for (i = sliderctl->nspaces - 1; i >= 0; i--) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_end = x - 1; +				new_start = new_end - size + 1; +				break; +			} +		} +		break; +	case INCREASELEFT: +		new_start = old_start + step; +		break; +	case DECREASELEFT: +		new_start = old_start - step; +		for (i = 0; i < sliderctl->nspaces; i++) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_start = old_start; +				break; +			} +		} +		break; +	case INCREASERIGHT: +		new_end = old_end + step; +		for (i = 0; i < sliderctl->nspaces; i++) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_end = old_end; +				break; +			} +		} +		break; +	case DECREASERIGHT: +		new_end = old_end - step; +		break; +	case MOVEFARLEFT: +		new_start = 0; +		new_end = size - 1; +		for (i = 0; i < sliderctl->nspaces; i++) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_start = y + 1; +				new_end = new_start + size - 1; +				break; +			} +		} +		break; +	case MOVEFARRIGHT: +		new_end = (sliderctl->length) - 1; +		new_start = new_end - size + 1; +		for (i = sliderctl->nspaces - 1; i >= 0; i--) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_end = x - 1; +				new_start = new_end - size + 1; +				break; +			} +		} +		break; +	case MOVEFASTLEFT: +		if (size < 10) { +			tmpstep = 1; +		} else { +			tmpstep = ((sliderctl->length) * 10) / 100; +		} +		new_start = old_start - tmpstep; +		new_end = old_end - tmpstep; + +		for (i = sliderctl->nspaces - 1; i >= 0; i--) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_end = x - 1; +				new_start = new_end - size + 1; +				break; +			} +		} +		break; +	case MOVEFASTRIGHT: +		if (size < 10) { +			tmpstep = 1; +		} else { +			tmpstep = ((sliderctl->length) * 10) / 100; +		} +		new_start = old_start + tmpstep; +		new_end = old_end + tmpstep; + +		for (i = 0; i < sliderctl->nspaces; i++) { +			x = (sliderctl->spaces)[i][0]; +			y = (sliderctl->spaces)[i][1]; + +			if (crashes(x, y, new_start, new_end)) { +				new_start = y + 1; +				new_end = new_start + size - 1; +				break; +			} +		} +		break; +	case INCREASESTEP: +		++step; +		break; +	case DECREASESTEP: +		if (step > 1) { +			--step; +		} +		break; +	} + +	if (fits(0, (sliderctl->length) - 1, new_start, new_end) != 1) { +		new_start = old_start; +		new_end = old_end; +	} + +	if (new_start > new_end) { +		new_start = old_start; +		new_end = old_end; +	} + +	sliderctl->step = step; + +	*(sliderctl->start) = new_start; +	*(sliderctl->end) = new_end; +} + +static void +drawsquare(struct bsddialog_conf *conf, WINDOW *win, enum elevation elev, +    bool focus, const char *fmt, unsigned long value) +{ +	int h, l, w; + +	getmaxyx(win, h, w); +	draw_borders(conf, win, elev); +	if (focus) { +		l = 2 + w % 2; +		wattron(win, t.dialog.arrowcolor); +		mvwhline(win, 0, w / 2 - l / 2, UARROW(conf), l); +		mvwhline(win, h - 1, w / 2 - l / 2, DARROW(conf), l); +		wattroff(win, t.dialog.arrowcolor); +	} + +	if (focus) +		wattron(win, t.menu.f_namecolor); + +	mvwprintw(win, 1, 1, fmt, value); + +	if (focus) +		wattroff(win, t.menu.f_namecolor); + +	wnoutrefresh(win); +} + +static void +print_slider(struct bsddialog_conf *conf, WINDOW *win, +    unsigned long spaces[][2], int nspaces, unsigned long length, +    unsigned long *start, unsigned long *end, bool active) +{ +	int i, y, x, l, height, width; +	unsigned long s, e; +	chtype ch; + +	getmaxyx(win, height, width); +	wclear(win); +	draw_borders(conf, win, RAISED); + +	if (active) { +		wattron(win, t.dialog.arrowcolor); +		mvwvline(win, 1, 0, LARROW(conf), 1); +		mvwvline(win, 1, width - 1, RARROW(conf), 1); +		wattroff(win, t.dialog.arrowcolor); +	} + +	y = height / 2; +	width -= 1; + +	ch = ' ' | bsddialog_color(BSDDIALOG_RED, BSDDIALOG_RED, 0); +	for (i = 0; i < nspaces; i++) { +		s = spaces[i][0]; +		e = spaces[i][1]; + +		x = (s * width) / length; +		l = ((e - s) * width) / length; + +		if ((e - s) == 0) { +			l = 0; +		} else if (l == 0) { +			l = 1; +		} + +		mvwhline(win, y, x + 1, ch, l); +	} + +	ch = ' ' | t.bar.f_color; +	s = ((*start) * width) / length; +	l = (((*end) - (*start)) * width) / length; +	if ((*end - *start) == 0) { +		l = 0; +	} else if (l == 0) { +		l = 1; +	} +	mvwhline(win, y, s + 1, ch, l); + +	wnoutrefresh(win); +} + +static int +slider_draw(struct dialog *d, bool redraw, WINDOW *start_win, WINDOW *end_win, +    WINDOW *size_win, WINDOW *step_win, WINDOW *slider_win, const char *unit) +{ +	char *buf; +	int yslider, xslider; + +	if (redraw) { +		hide_dialog(d); +		refresh(); /* Important for decreasing screen */ +	} +	if (dialog_size_position(d, MINHSLIDER, MINWSLIDER, NULL) != 0) +		return (BSDDIALOG_ERROR); +	if (draw_dialog(d) != 0) /* doupdate in main loop */ +		return (BSDDIALOG_ERROR); +	if (redraw) +		refresh(); /* Important to fix grey lines expanding screen */ +	TEXTPAD(d, MINHSLIDER + HBUTTONS); + +	yslider = d->y + d->h - 15; +	xslider = d->x + d->w / 2 - 17; +	asprintf(&buf, "Start (%s)", unit); +	mvwaddstr(d->widget, d->h - 16, d->w / 2 - 17, buf); +	free(buf); +	update_box(d->conf, start_win, yslider, xslider, 3, 17, RAISED); +	asprintf(&buf, "End (%s)", unit); +	mvwaddstr(d->widget, d->h - 16, d->w / 2, buf); +	free(buf); +	update_box(d->conf, end_win, yslider, xslider + 17, 3, 17, RAISED); +	asprintf(&buf, "Size (%s)", unit); +	mvwaddstr(d->widget, d->h - 12, d->w / 2 - 17, buf); +	free(buf); +	update_box(d->conf, size_win, yslider + 4, xslider, 3, 17, RAISED); +	asprintf(&buf, "Step (%s)", unit); +	mvwaddstr(d->widget, d->h - 12, d->w / 2, buf); +	free(buf); +	update_box(d->conf, step_win, yslider + 4, xslider + 17, 3, 17, RAISED); + +	update_box(d->conf, slider_win, yslider + 7, xslider, 3, 34, RAISED); +	wnoutrefresh(d->widget); + +	return (0); +} + +/* API */ +int +bsddialog_slider(struct bsddialog_conf *conf, const char *text, int rows, +    int cols, const char *unit, unsigned long length, unsigned long *start, +    unsigned long *end, bool resize, unsigned int nblocks, +    unsigned long blocks[][2]) +{ +	struct sliderctl ctl; +	bool loop, focusbuttons; +	int retval, sel; +	wint_t input; +	unsigned long size; +	WINDOW *start_win, *end_win, *size_win, *step_win, *slider_win; +	struct dialog dialog; + +	CHECK_PTR(start); +	CHECK_PTR(end); + +	ctl.spaces = blocks; +	ctl.nspaces = nblocks; +	ctl.length = length; +	ctl.start = start; +	ctl.end = end; +	ctl.step = 1; + +	if (prepare_dialog(conf, text, rows, cols, &dialog) != 0) +		return (BSDDIALOG_ERROR); +	set_buttons(&dialog, true, OK_LABEL, CANCEL_LABEL); + +	if ((start_win = newwin(1, 1, 1, 1)) == NULL) +		RETURN_ERROR("Cannot build WINDOW for start"); +	wbkgd(start_win, t.dialog.color); + +	if ((end_win = newwin(1, 1, 1, 1)) == NULL) +		RETURN_ERROR("Cannot build WINDOW for end"); +	wbkgd(end_win, t.dialog.color); + +	if ((step_win = newwin(1, 1, 1, 1)) == NULL) +		RETURN_ERROR("Cannot build WINDOW for step"); +	wbkgd(step_win, t.dialog.color); + +	if ((size_win = newwin(1, 1, 1, 1)) == NULL) +		RETURN_ERROR("Cannot build WINDOW for size"); +	wbkgd(size_win, t.dialog.color); + +	if ((slider_win = newwin(1, 1, 1, 1)) == NULL) +		RETURN_ERROR("Cannot build WINDOW for slider"); +	wbkgd(slider_win, t.dialog.color); + +	if (slider_draw(&dialog, false, start_win, end_win, size_win, step_win, +	    slider_win, unit) != 0) +		return (BSDDIALOG_ERROR); + +	sel = NULLWIN; +	loop = focusbuttons = true; +	while (loop) { +		size = *(ctl.end) - *(ctl.start) + 1; +		drawsquare(conf, start_win, RAISED, sel == START_WIN, "%15lu", *start);  +		drawsquare(conf, end_win, RAISED, sel == END_WIN, "%15lu", *end); +		drawsquare(conf, size_win, RAISED, 0, "%15lu", size); +		drawsquare(conf, step_win, RAISED, sel == STEP_WIN, "%15d", ctl.step); +		print_slider(conf, slider_win, blocks, nblocks, length, start, +		    end, sel == SLIDER_WIN); +		doupdate(); + +		if (get_wch(&input) == ERR) +			continue; +		switch (input) { +		case KEY_ENTER: +		case 10: /* Enter */ +			if (focusbuttons || conf->button.always_active) { +				retval = BUTTONVALUE(dialog.bs); +				loop = false; +			} +			break; +		case 27: /* Esc */ +			if (conf->key.enable_esc) { +				retval = BSDDIALOG_ESC; +				loop = false; +			} +			break; +		case '\t': /* TAB */ +			if (focusbuttons) { +				dialog.bs.curr++; +				if (dialog.bs.curr >= (int)dialog.bs.nbuttons) { +					focusbuttons = false; +					sel = START_WIN; +					dialog.bs.curr = +					    conf->button.always_active ? 0 : -1; +				} +			} else { +				sel++; +				if ((sel + 1) > NWIN) { +					focusbuttons = true; +					sel = NULLWIN; +					dialog.bs.curr = 0; +				} +			} +			DRAW_BUTTONS(dialog); +			break; +		case KEY_CTRL('n'): +		case KEY_RIGHT: +			if (focusbuttons) { +				dialog.bs.curr++; +				if (dialog.bs.curr >= (int)dialog.bs.nbuttons) { +					focusbuttons = false; +					sel = START_WIN; +					dialog.bs.curr = +					    conf->button.always_active ? 0 : -1; +				} +			} else if (sel == SLIDER_WIN) { +				ctl.op = MOVERIGHT; +				handlesliderctl(&ctl); +			} else { +				sel++; +			} +			DRAW_BUTTONS(dialog); +			break; +		case KEY_CTRL('p'): +		case KEY_LEFT: +			if (focusbuttons) { +				dialog.bs.curr--; +				if (dialog.bs.curr < 0) { +					focusbuttons = false; +					sel = SLIDER_WIN; +					dialog.bs.curr = +					    conf->button.always_active ? 0 : -1; +				} +			} else if (sel == SLIDER_WIN) { +				ctl.op = MOVELEFT; +				handlesliderctl(&ctl); +			} else if (sel == END_WIN) { +				sel = START_WIN; +			} else { +				focusbuttons = true; +				sel = NULLWIN; +				dialog.bs.curr = 0; +			} +			DRAW_BUTTONS(dialog); +			break; +		case KEY_UP: +			if (focusbuttons) { +				sel = SLIDER_WIN; +				focusbuttons = false; +				dialog.bs.curr = +				     conf->button.always_active ? 0 : -1; +				DRAW_BUTTONS(dialog); +			} else if (sel == START_WIN) { +				if (resize) { +					ctl.op = INCREASELEFT; +				} else { +					ctl.op = MOVERIGHT; +				} +				handlesliderctl(&ctl); +			} else if (sel == END_WIN) { +				if (resize) { +					ctl.op = INCREASERIGHT; +				} else { +					ctl.op = MOVERIGHT; +				} +				handlesliderctl(&ctl); +			} else if (sel == STEP_WIN) { +				ctl.op = INCREASESTEP; +				handlesliderctl(&ctl); +			} +			break; +		case KEY_DOWN: +			if (focusbuttons) { +				break; +			} else if (sel == START_WIN) { +				if (resize) { +					ctl.op = DECREASELEFT; +				} else { +					ctl.op = MOVELEFT; +				} +				handlesliderctl(&ctl); +			} else if (sel == END_WIN) { +				if (resize) { +					ctl.op = DECREASERIGHT; +				} else { +					ctl.op = MOVELEFT; +				} +				handlesliderctl(&ctl); +			} else if (sel == STEP_WIN) { +				ctl.op = DECREASESTEP; +				handlesliderctl(&ctl); +			} +			break; +		case '-': +			if (focusbuttons) { +				break; +			} else if (sel == START_WIN) { +				if (resize) { +					ctl.op = DECREASELEFT; +				} else { +					ctl.op = MOVELEFT; +				} +				handlesliderctl(&ctl); +			} else if (sel == END_WIN) { +				if (resize) { +					ctl.op = DECREASERIGHT; +				} else { +					ctl.op = MOVELEFT; +				} +				handlesliderctl(&ctl); +			} else if (sel == STEP_WIN) { +				ctl.op = DECREASESTEP; +				handlesliderctl(&ctl); +			} +			break; +		case '+': +			if (focusbuttons) { +				break; +			} else if (sel == START_WIN) { +				if (resize) { +					ctl.op = INCREASELEFT; +				} else { +					ctl.op = MOVERIGHT; +				} +				handlesliderctl(&ctl); +			} else if (sel == END_WIN) { +				if (resize) { +					ctl.op = INCREASERIGHT; +				} else { +					ctl.op = MOVERIGHT; +				} +				handlesliderctl(&ctl); +			} else if (sel == STEP_WIN) { +				ctl.op = INCREASESTEP; +				handlesliderctl(&ctl); +			} +			break; +		case KEY_HOME: +			if (focusbuttons) { +				break; +			} else if (sel == SLIDER_WIN) { +				ctl.op = MOVEFARLEFT; +				handlesliderctl(&ctl); +			} +			break; +		case KEY_END: +			if (focusbuttons) { +				break; +			} else if (sel == SLIDER_WIN) { +				ctl.op = MOVEFARRIGHT; +				handlesliderctl(&ctl); +			} +			break; +		case KEY_PPAGE: +			if (focusbuttons) { +				break; +			} else if (sel == SLIDER_WIN) { +				ctl.op = MOVEFASTLEFT; +				handlesliderctl(&ctl); +			} +			break; +		case KEY_NPAGE: +			if (focusbuttons) { +				break; +			} else if (sel == SLIDER_WIN) { +				ctl.op = MOVEFASTRIGHT; +				handlesliderctl(&ctl); +			} +			break; +		case KEY_F(1): +			if (conf->key.f1_file == NULL && +			    conf->key.f1_message == NULL) +				break; +			if (f1help_dialog(conf) != 0) +				return (BSDDIALOG_ERROR); +			if (slider_draw(&dialog, true, start_win, end_win, size_win, +			    step_win, slider_win, unit) != 0) +				return (BSDDIALOG_ERROR); +			break; +		case KEY_CTRL('l'): +		case KEY_RESIZE: +			if (slider_draw(&dialog, true, start_win, end_win, size_win, +			    step_win, slider_win, unit) != 0) +				return (BSDDIALOG_ERROR); +			break; +		default: +			if (shortcut_buttons(input, &dialog.bs)) { +				DRAW_BUTTONS(dialog); +				doupdate(); +				retval = BUTTONVALUE(dialog.bs); +				loop = false; +			} +		} +	} + +	delwin(start_win); +	delwin(end_win); +	delwin(step_win); +	delwin(slider_win); +	end_dialog(&dialog); + +	return (retval); +} diff --git a/contrib/bsddialog/utility/bsddialog.1 b/contrib/bsddialog/utility/bsddialog.1 index 0ec2a96952bd..d03a4ce8881a 100644 --- a/contrib/bsddialog/utility/bsddialog.1 +++ b/contrib/bsddialog/utility/bsddialog.1 @@ -22,7 +22,7 @@  .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  .\" SUCH DAMAGE.  .\" -.Dd June 22, 2025 +.Dd June 24, 2025  .Dt BSDDIALOG 1  .Os  .Sh NAME @@ -851,6 +851,10 @@ utility first appeared in  was written by  .An Alfonso Sabato Siciliano  .Aq Mt asiciliano@FreeBSD.org . +.An Braulio Rivas +.Aq Mt brauliorivas@FreeBSD.org +implemented the slider dialog for the +.Dq GSoC 2025 Full Disk Administration Tool for FreeBSD .  .Pp  .Nm bsddialog  provides also a subset of the functionality described in the diff --git a/contrib/bsddialog/utility/util.h b/contrib/bsddialog/utility/util.h index d1f7793c9755..5e5cba3f82f7 100644 --- a/contrib/bsddialog/utility/util.h +++ b/contrib/bsddialog/utility/util.h @@ -108,6 +108,7 @@ int passwordform_builder(BUILDER_ARGS);  int pause_builder(BUILDER_ARGS);  int radiolist_builder(BUILDER_ARGS);  int rangebox_builder(BUILDER_ARGS); +int slider_builder(BUILDER_ARGS);  int textbox_builder(BUILDER_ARGS);  int timebox_builder(BUILDER_ARGS);  int treeview_builder(BUILDER_ARGS); diff --git a/contrib/bsddialog/utility/util_builders.c b/contrib/bsddialog/utility/util_builders.c index 0a968d4319f9..9784b1a5e563 100644 --- a/contrib/bsddialog/utility/util_builders.c +++ b/contrib/bsddialog/utility/util_builders.c @@ -608,12 +608,12 @@ int form_builder(BUILDER_ARGS)  		exit_error(false, "cannot allocate memory for form items");  	j = 0;  	for (i = 0; i < nitems; i++) { -		items[i].label	= argv[j++]; +		items[i].label  = argv[j++];  		items[i].ylabel = (unsigned int)strtoul(argv[j++], NULL, 10);  		items[i].xlabel = (unsigned int)strtoul(argv[j++], NULL, 10); -		items[i].init	= argv[j++]; -		items[i].yfield	= (unsigned int)strtoul(argv[j++], NULL, 10); -		items[i].xfield	= (unsigned int)strtoul(argv[j++], NULL, 10); +		items[i].init   = argv[j++]; +		items[i].yfield = (unsigned int)strtoul(argv[j++], NULL, 10); +		items[i].xfield = (unsigned int)strtoul(argv[j++], NULL, 10);  		fieldlen = (int)strtol(argv[j++], NULL, 10);  		if (fieldlen == 0) @@ -651,15 +651,15 @@ int inputbox_builder(BUILDER_ARGS)  	if (argc > 1)  		error_args("--inputbox", argc - 1, argv + 1); -	item.label	 = ""; -	item.ylabel	 = 0; -	item.xlabel	 = 0; -	item.init	 = argc > 0 ? argv[0] : ""; -	item.yfield	 = 0; -	item.xfield	 = 0; +	item.label       = ""; +	item.ylabel      = 0; +	item.xlabel      = 0; +	item.init        = argc > 0 ? argv[0] : ""; +	item.yfield      = 0; +	item.xfield      = 0;  	item.fieldlen    = 1;  	item.maxvaluelen = opt->max_input_form; -	item.flags	 = BSDDIALOG_FIELDNOCOLOR; +	item.flags       = BSDDIALOG_FIELDNOCOLOR;  	item.flags      |= BSDDIALOG_FIELDCURSOREND;  	item.flags      |= BSDDIALOG_FIELDEXTEND;  	item.bottomdesc  = ""; @@ -691,12 +691,12 @@ int mixedform_builder(BUILDER_ARGS)  		exit_error(false, "cannot allocate memory for form items");  	j = 0;  	for (i = 0; i < nitems; i++) { -		items[i].label	= argv[j++]; +		items[i].label  = argv[j++];  		items[i].ylabel = (unsigned int)strtoul(argv[j++], NULL, 10);  		items[i].xlabel = (unsigned int)strtoul(argv[j++], NULL, 10); -		items[i].init	= argv[j++]; -		items[i].yfield	= (unsigned int)strtoul(argv[j++], NULL, 10); -		items[i].xfield	= (unsigned int)strtoul(argv[j++], NULL, 10); +		items[i].init   = argv[j++]; +		items[i].yfield = (unsigned int)strtoul(argv[j++], NULL, 10); +		items[i].xfield = (unsigned int)strtoul(argv[j++], NULL, 10);  		fieldlen        = (int)strtol(argv[j++], NULL, 10);  		if (fieldlen == 0)  			items[i].fieldlen = strcols(items[i].init); @@ -737,13 +737,13 @@ int passwordbox_builder(BUILDER_ARGS)  	if (argc > 1)  		error_args("--passwordbox", argc - 1, argv + 1); -	item.label	 = ""; -	item.ylabel	 = 0; -	item.xlabel	 = 0; -	item.init	 = argc > 0 ? argv[0] : ""; -	item.yfield	 = 0; -	item.xfield	 = 0; -	item.fieldlen	 = 1; +	item.label       = ""; +	item.ylabel      = 0; +	item.xlabel      = 0; +	item.init        = argc > 0 ? argv[0] : ""; +	item.yfield      = 0; +	item.xfield      = 0; +	item.fieldlen    = 1;  	item.maxvaluelen = opt->max_input_form;  	item.flags       = BSDDIALOG_FIELDHIDDEN;  	item.flags      |= BSDDIALOG_FIELDNOCOLOR; @@ -779,12 +779,12 @@ int passwordform_builder(BUILDER_ARGS)  		exit_error(false, "cannot allocate memory for form items");  	j = 0;  	for (i = 0; i < nitems; i++) { -		items[i].label	= argv[j++]; +		items[i].label  = argv[j++];  		items[i].ylabel = (unsigned int)strtoul(argv[j++], NULL, 10);  		items[i].xlabel = (unsigned int)strtoul(argv[j++], NULL, 10); -		items[i].init	= argv[j++]; -		items[i].yfield	= (unsigned int)strtoul(argv[j++], NULL, 10); -		items[i].xfield	= (unsigned int)strtoul(argv[j++], NULL, 10); +		items[i].init   = argv[j++]; +		items[i].yfield = (unsigned int)strtoul(argv[j++], NULL, 10); +		items[i].xfield = (unsigned int)strtoul(argv[j++], NULL, 10);  		fieldlen = (int)strtol(argv[j++], NULL, 10);  		items[i].fieldlen = abs(fieldlen); @@ -809,3 +809,41 @@ int passwordform_builder(BUILDER_ARGS)  	return (output);  } + +int slider_builder(BUILDER_ARGS) +{ +	bool resize; +	int output; +  char *unit; +	unsigned int i, nblocks; +	unsigned long length, start, end, (*blocks)[2]; + +	if (argc < 5) +		exit_error(true, "--slider requires: <unit> <lenght> <start> <end> <resize>"); +  unit = argv[0]; +	length = strtoul(argv[1], NULL, 10); +	start = strtoul(argv[2], NULL, 10); +	end = strtoul(argv[3], NULL, 10); +	resize = strtoul(argv[4], NULL, 10) == 0 ? false : true; + +	argc -= 5; +	argv += 5; +	if (argc & 1) +		exit_error(true, "bad [<start_block> <end_block> ...] number"); +	nblocks = argc / 2; +	if ((blocks = malloc(nblocks * sizeof(*blocks))) == NULL) +		exit_error(false, "Cannot allocate memory for blocks"); +	for (i = 0; i < nblocks; i++) { +		blocks[i][0] = strtoul(argv[2 * i], NULL, 10); +		blocks[i][1] = strtoul(argv[2 * i + 1], NULL, 10); +	} + +	output = bsddialog_slider(conf, text, rows, cols, unit, length, &start, &end, +	    resize, nblocks, blocks); +	free(blocks); + +	if (output != BSDDIALOG_ERROR) +		dprintf(opt->output_fd, "%lu %lu", start, end); + +	return (output); +} diff --git a/contrib/bsddialog/utility/util_cli.c b/contrib/bsddialog/utility/util_cli.c index 01b6fc31f065..7e76ec84654f 100644 --- a/contrib/bsddialog/utility/util_cli.c +++ b/contrib/bsddialog/utility/util_cli.c @@ -143,7 +143,8 @@ enum OPTS {  	TEXTBOX,  	TIMEBOX,  	TREEVIEW, -	YESNO +	YESNO, +	SLIDER,  };  /* options descriptor */ @@ -264,6 +265,7 @@ static struct option longopts[] = {  	{"pause",        no_argument, NULL, PAUSE},  	{"radiolist",    no_argument, NULL, RADIOLIST},  	{"rangebox",     no_argument, NULL, RANGEBOX}, +	{"slider",       no_argument, NULL, SLIDER},  	{"textbox",      no_argument, NULL, TEXTBOX},  	{"timebox",      no_argument, NULL, TIMEBOX},  	{"treeview",     no_argument, NULL, TREEVIEW}, @@ -801,6 +803,13 @@ parseargs(int argc, char **argv, struct bsddialog_conf *conf,  			opt->name = "--rangebox";  			opt->dialogbuilder = rangebox_builder;  			break; +		case SLIDER: +			if (opt->dialogbuilder != NULL) +				exit_error(true, "%s and --slider without " +				    "--and-dialog", opt->name); +			opt->name = "--slider"; +			opt->dialogbuilder = slider_builder; +			break;  		case TEXTBOX:  			if (opt->dialogbuilder != NULL)  				exit_error(true, "%s and --textbox without " diff --git a/contrib/tzcode/localtime.c b/contrib/tzcode/localtime.c index 1668475ea646..58099d234e2b 100644 --- a/contrib/tzcode/localtime.c +++ b/contrib/tzcode/localtime.c @@ -1583,15 +1583,15 @@ tzdata_is_fresh(void)  	struct timespec now;  	if (clock_gettime(CLOCK_MONOTONIC, &now) < 0) -		return 0; +		return 1; -	if ((now.tv_sec - last_checked >= __tz_change_interval) || -	    (last_checked > now.tv_sec)) { +	if (last_checked == 0 || last_checked > now.tv_sec || +	    now.tv_sec - last_checked >= __tz_change_interval) {  		last_checked = now.tv_sec; -		return 1; +		return 0;  	} -	return 0; +	return 1;  }  #endif /* DETECT_TZ_CHANGES */ @@ -1642,7 +1642,7 @@ tzset_unlocked_name(char const *name)        ? lcl_is_set < 0        : 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0)  #ifdef DETECT_TZ_CHANGES -    if (tzdata_is_fresh() == 0) +    if (tzdata_is_fresh())  #endif /* DETECT_TZ_CHANGES */      return;  # ifdef ALL_STATE diff --git a/crypto/openssh/misc.c b/crypto/openssh/misc.c index dd0bd032ae3c..1ed71646ebe4 100644 --- a/crypto/openssh/misc.c +++ b/crypto/openssh/misc.c @@ -2535,8 +2535,10 @@ format_absolute_time(uint64_t t, char *buf, size_t len)  	time_t tt = t > SSH_TIME_T_MAX ? SSH_TIME_T_MAX : t;  	struct tm tm; -	localtime_r(&tt, &tm); -	strftime(buf, len, "%Y-%m-%dT%H:%M:%S", &tm); +	if (localtime_r(&tt, &tm) == NULL) +		strlcpy(buf, "UNKNOWN-TIME", len); +	else +		strftime(buf, len, "%Y-%m-%dT%H:%M:%S", &tm);  }  /* diff --git a/lib/libbsddialog/Makefile b/lib/libbsddialog/Makefile index 2ec633b25147..54390cf87f71 100644 --- a/lib/libbsddialog/Makefile +++ b/lib/libbsddialog/Makefile @@ -13,6 +13,7 @@ SRCS=	barbox.c \  	libbsddialog.c \  	menubox.c \  	messagebox.c \ +	slider.c \  	textbox.c \  	theme.c \  	timebox.c diff --git a/lib/libpam/static_libpam/Makefile b/lib/libpam/static_libpam/Makefile index 8830f09ef0da..703e6a4a2f00 100644 --- a/lib/libpam/static_libpam/Makefile +++ b/lib/libpam/static_libpam/Makefile @@ -45,6 +45,7 @@ MAN=  MANNODEV=  INCS=  MLINKS= +MANNODEVLINKS=  MK_TESTS=	no  # diff --git a/lib/libsys/pathconf.2 b/lib/libsys/pathconf.2 index 5a983a3a13e2..5348128be706 100644 --- a/lib/libsys/pathconf.2 +++ b/lib/libsys/pathconf.2 @@ -25,7 +25,7 @@  .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  .\" SUCH DAMAGE.  .\" -.Dd August 6, 2025 +.Dd October 31, 2025  .Dt PATHCONF 2  .Os  .Sh NAME @@ -180,7 +180,8 @@ Return 1 if named attributes are enabled for the file system, otherwise 0.  .It Li _PC_HAS_NAMEDATTR  Return 1 if one or more named attributes exist for the file, otherwise 0.  .It Li _PC_HAS_HIDDENSYSTEM -Return 1 if both +Return 1 if all of the +.Dv UF_ARCHIVE ,  .Dv UF_HIDDEN  and  .Dv UF_SYSTEM @@ -192,6 +193,9 @@ Returns the block size required for block cloning via  .Xr copy_file_range 2  for a file system if block cloning is supported,  otherwise 0. +.It Li _PC_CASE_INSENSITIVE +Return 1 if the file system performs case insensitive lookups, +otherwise 0.  .El  .Sh RETURN VALUES  If the call to diff --git a/release/Makefile.vm b/release/Makefile.vm index a04f779ebebb..142fd6e7bdf5 100644 --- a/release/Makefile.vm +++ b/release/Makefile.vm @@ -129,6 +129,13 @@ ${_CW:tu}${_FS:tu}${_FMT:tu}IMAGE=	${_CW:tl}.${_FS}.${_FMT}  cw-${_CW:tl}-${_FS}-${_FMT}: cw-ec2-base-${_FS}-${_FMT}  .endif +# Special handling: GCE images ingest src.txz and ports.txz and expect them +# to be in the /ftp/ directory.  Note: This will need to be reworked before +# distribution sets go away! +.if ${_CW} == GCE +cw-${_CW:tl}-${_FS}-${_FMT}: ftp +.endif +  cw-${_CW:tl}-${_FS}-${_FMT}: ${QEMUTGT} ${PKGBASE_REPO_DIR}  	mkdir -p ${.OBJDIR}/${.TARGET}  	env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ diff --git a/release/tools/gce.conf b/release/tools/gce.conf index a7ccfc27a75c..2fa23f6e54f4 100644 --- a/release/tools/gce.conf +++ b/release/tools/gce.conf @@ -21,7 +21,7 @@ vm_extra_install_base() {  	echo 'search google.internal' > ${DESTDIR}/etc/resolv.conf  	echo 'nameserver 169.254.169.254' >> ${DESTDIR}/etc/resolv.conf  	echo 'nameserver 8.8.8.8' >> ${DESTDIR}/etc/resolv.conf -	metalog_add ./etc/resolv.conf +	metalog_add_data ./etc/resolv.conf  }  vm_extra_pre_umount() { @@ -100,11 +100,12 @@ EOF  	fi  	if [ -e "${DESTDIR}/../ftp/ports.txz" ]; then  		tar fxJ ${DESTDIR}/../ftp/ports.txz -C ${DESTDIR} -		_INSTALLED_PACKAGES=$(pkg -r ${DESTDIR} info -o -q -a) +		_INSTALLED_PACKAGES=$(pkg -r ${DESTDIR} info -o -q -a | grep -v ^base/)  		for PACKAGE in ${_INSTALLED_PACKAGES}; do  			make -C ${DESTDIR}/usr/ports/${PACKAGE} fetch \ -			    DISTDIR=${DESTDIR}/usr/ports/distfiles - +			    DISTDIR=${DESTDIR}/usr/ports/distfiles \ +			    DISABLE_VULNERABILITIES=YES \ +			    I_DONT_CARE_IF_MY_BUILDS_TARGET_THE_WRONG_RELEASE=YES  		done  	fi diff --git a/release/tools/vmimage.subr b/release/tools/vmimage.subr index 3bfef585f613..8531e9b8f2d6 100644 --- a/release/tools/vmimage.subr +++ b/release/tools/vmimage.subr @@ -212,6 +212,13 @@ vm_extra_install_packages() {  			    -r ${DESTDIR} \  			    install -y -r ${PKG_REPO_NAME} $pkg  		done +		INSTALL_AS_USER=yes \ +		${PKG_CMD} \ +		    -o ABI=${PKG_ABI} \ +		    -o REPOS_DIR=${PKG_REPOS_DIR} \ +		    -o PKG_DBDIR=${DESTDIR}/var/db/pkg \ +		    -r ${DESTDIR} \ +		    autoremove  		metalog_add_data ./var/db/pkg/local.sqlite  	else  		if [ -n "${WITHOUT_QEMU}" ]; then @@ -224,6 +231,8 @@ vm_extra_install_packages() {  			chroot ${DESTDIR} ${EMULATOR} env ASSUME_ALWAYS_YES=yes \  				/usr/sbin/pkg install -y ${p}  		done +		chroot ${DESTDIR} ${EMULATOR} env ASSUME_ALWAYS_YES=yes \ +		    /usr/sbin/pkg autoremove  	fi  	return 0 diff --git a/sbin/geom/core/geom.c b/sbin/geom/core/geom.c index 2de696ce6a43..51ea52a3e858 100644 --- a/sbin/geom/core/geom.c +++ b/sbin/geom/core/geom.c @@ -897,23 +897,23 @@ list_one_provider(struct gprovider *pp, const char *padding)  	struct gconfig *conf;  	char buf[5]; -	xo_emit("{Lcw:Name}{:Name}\n", pp->lg_name); +	xo_emit("{Lcw:Name}{:name}\n", pp->lg_name);  	humanize_number(buf, sizeof(buf), (int64_t)pp->lg_mediasize, "",  	    HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); -	xo_emit("{P:/%s}{Lcw:Mediasize}{:Mediasize/%jd} ({N:/%s})\n", +	xo_emit("{P:/%s}{Lcw:Mediasize}{:mediasize/%jd} ({N:/%s})\n",  	    padding, (intmax_t)pp->lg_mediasize, buf); -	xo_emit("{P:/%s}{Lcw:Sectorsize}{:Sectorsize/%u} \n", +	xo_emit("{P:/%s}{Lcw:Sectorsize}{:sectorsize/%u}\n",  	    padding, pp->lg_sectorsize);  	if (pp->lg_stripesize > 0 || pp->lg_stripeoffset > 0) { -		xo_emit("{P:/%s}{Lcw:Stripesize}{Stripesize/%ju}\n", +		xo_emit("{P:/%s}{Lcw:Stripesize}{:stripesize/%ju}\n",  		    padding, pp->lg_stripesize); -		xo_emit("{P:/%s}{Lcw:Stripeoffset}{Stripeoffset/%ju}\n", +		xo_emit("{P:/%s}{Lcw:Stripeoffset}{:stripeoffset/%ju}\n",  		    padding, pp->lg_stripeoffset);  	} -	xo_emit("{P:/%s}{Lcw:Mode}{Mode}\n", padding, pp->lg_mode); +	xo_emit("{P:/%s}{Lcw:Mode}{:mode}\n", padding, pp->lg_mode);  	LIST_FOREACH(conf, &pp->lg_config, lg_config) {  		xo_emit("{P:/%s}{Lcwa:}{a:}\n", padding, conf->lg_name, -		    conf->lg_name, conf->lg_val); +		    conf->lg_name, conf->lg_val ? conf->lg_val : "");  	}  } @@ -929,24 +929,24 @@ list_one_consumer(struct gconsumer *cp, const char *padding)  	else {  		char buf[5]; -		xo_emit("{Lcw:Name}{:Name}\n", pp->lg_name); +		xo_emit("{Lcw:Name}{:name}\n", pp->lg_name);  		humanize_number(buf, sizeof(buf), (int64_t)pp->lg_mediasize, "",  		    HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); -		xo_emit("{P:/%s}{Lcw:Mediasize}{:Mediasize/%jd} ({N:/%s})\n", +		xo_emit("{P:/%s}{Lcw:Mediasize}{:mediasize/%jd} ({N:/%s})\n",  		    padding, (intmax_t)pp->lg_mediasize, buf); -		xo_emit("{P:/%s}{Lcw:Sectorsize}{:Sectorsize/%u}\n", +		xo_emit("{P:/%s}{Lcw:Sectorsize}{:sectorsize/%u}\n",  		    padding, pp->lg_sectorsize);  		if (pp->lg_stripesize > 0 || pp->lg_stripeoffset > 0) { -			xo_emit("{P:/%s}{Lcw:Stripesize}{:Stripesize/%ju}\n", +			xo_emit("{P:/%s}{Lcw:Stripesize}{:stripesize/%ju}\n",  			    padding, pp->lg_stripesize); -			xo_emit("{P:/%s}{Lcw:Stripeoffset}{:Stripesize/%ju}\n", +			xo_emit("{P:/%s}{Lcw:Stripeoffset}{:stripeoffset/%ju}\n",  			    padding, pp->lg_stripeoffset);  		} -		xo_emit("{P:/%s}{Lcw:Mode}{:Mode}\n", padding, pp->lg_mode); +		xo_emit("{P:/%s}{Lcw:Mode}{:mode}\n", padding, pp->lg_mode);  	}  	LIST_FOREACH(conf, &cp->lg_config, lg_config) {  		xo_emit("{P:/%s}{Lcwa:}{a:}\n", padding, conf->lg_name, -		    conf->lg_name, conf->lg_val); +		    conf->lg_name, conf->lg_val ? conf->lg_val : "");  	}  } @@ -958,13 +958,13 @@ list_one_geom(struct ggeom *gp)  	struct gconfig *conf;  	unsigned n; -	xo_emit("{Lcw:Geom name}{:Name}\n", gp->lg_name); +	xo_emit("{Lcw:Geom name}{:name}\n", gp->lg_name);  	LIST_FOREACH(conf, &gp->lg_config, lg_config) {  		xo_emit("{Lcwa:}{a:}\n", conf->lg_name, conf->lg_name, -		    conf->lg_val); +		    conf->lg_val ? conf->lg_val : "");  	}  	if (!LIST_EMPTY(&gp->lg_provider)) { -		xo_open_list("Providers"); +		xo_open_list("providers");  		xo_emit("{Tc:Providers}\n");  		n = 1;  		LIST_FOREACH(pp, &gp->lg_provider, lg_provider) { @@ -973,10 +973,10 @@ list_one_geom(struct ggeom *gp)  			list_one_provider(pp, "   ");  			xo_close_instance("provider");  		} -		xo_close_list("Providers"); +		xo_close_list("providers");  	}  	if (!LIST_EMPTY(&gp->lg_consumer)) { -		xo_open_list("Consumers"); +		xo_open_list("consumers");  		xo_emit("{Tc:Consumers}\n");  		n = 1;  		LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) { @@ -985,7 +985,7 @@ list_one_geom(struct ggeom *gp)  			list_one_consumer(cp, "   ");  			xo_close_instance("consumer");  		} -		xo_close_list("Consumers"); +		xo_close_list("consumers");  	}  	xo_emit("\n");  } @@ -1005,10 +1005,10 @@ list_one_geom_by_provider(const char *provider_name)  	if (gp == NULL)  		errx(EXIT_FAILURE, "Cannot find provider '%s'.", provider_name); -	xo_open_container("Geom"); -	xo_emit("{Lwc:Geom class}{:Class}\n", gp->lg_class->lg_name); +	xo_open_container(provider_name); +	xo_emit("{Lwc:Geom class}{:class}\n", gp->lg_class->lg_name);  	list_one_geom(gp); -	xo_close_container("Geom"); +	xo_close_container(provider_name);  }  static void @@ -1067,12 +1067,12 @@ std_list(struct gctl_req *req, unsigned flags __unused)  				    "an instance named '%s'.",  				    gclass_name, name);  			} -			xo_open_container("Geom"); +			xo_open_container(gclass_name);  			list_one_geom(gp); -			xo_close_container("Geom"); +			xo_close_container(gclass_name);  		}  	} else { -		xo_open_list("Geoms"); +		xo_open_list(gclass_name);  		LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {  			if (LIST_EMPTY(&gp->lg_provider) && !all)  				continue; @@ -1080,7 +1080,7 @@ std_list(struct gctl_req *req, unsigned flags __unused)  			list_one_geom(gp);  			xo_close_instance("geom");  		} -		xo_close_list("Geoms"); +		xo_close_list(gclass_name);  	}  	geom_deletetree(&mesh);  } @@ -1175,6 +1175,7 @@ status_one_geom(struct ggeom *gp, int script, int name_len, int status_len)  {  	struct gconsumer *cp;  	struct gconfig *conf; +	char fmt[64];  	const char *name, *status, *cstate, *csyncr;  	int gotone, len; @@ -1196,28 +1197,36 @@ status_one_geom(struct ggeom *gp, int script, int name_len, int status_len)  		csyncr = status_one_consumer(cp, "synchronized");  		if (!gotone || script) {  			if (!gotone) { -				xo_emit("{:name/%*s}  {:status/%*s}  ", +				xo_emit("{t:name/%*s}  {t:status/%*s}  ",  				    name_len, name, status_len, status); +				xo_open_list("components");  			} else { -				xo_emit("{d:name/%*s}  {d:status/%*s}  ", +				/* +				 * XXX: running the same xo_emit() as above or +				 * variations of it will cause the XML/JSON to +				 * produce extra "components" lists in script +				 * mode +				 */ + +				snprintf(fmt, sizeof(fmt), "%*s  %*s  ",  				    name_len, name, status_len, status); +				xo_emit(fmt);  			} -			xo_open_list("components");  		}  		xo_open_instance("components");  		if (cstate != NULL && csyncr != NULL) {  			xo_emit("{P:/%*s}{:component} ({:state}, {:synchronized})\n", -			len, "", cp->lg_provider->lg_name, cstate, csyncr); +			    len, "", cp->lg_provider->lg_name, cstate, csyncr);  		} else if (cstate != NULL) {  			xo_emit("{P:/%*s}{:component} ({:state})\n", -			len, "", cp->lg_provider->lg_name, cstate); +			    len, "", cp->lg_provider->lg_name, cstate);  		} else if (csyncr != NULL) {  			xo_emit("{P:/%*s}{:component} ({:synchronized})\n", -			len, "", cp->lg_provider->lg_name, csyncr); +			    len, "", cp->lg_provider->lg_name, csyncr);  		} else {  			xo_emit("{P:/%*s}{:component}\n", -			len, "", cp->lg_provider->lg_name); +			    len, "", cp->lg_provider->lg_name);  		}  		xo_close_instance("components");  		gotone = 1; @@ -1225,13 +1234,11 @@ status_one_geom(struct ggeom *gp, int script, int name_len, int status_len)  			len = name_len + status_len + 4;  	}  	if (!gotone) { -		xo_emit("{:name/%*s}  {:status/%*s}  ", name_len, name, status_len, status); -		xo_open_list("components"); -		xo_open_instance("components"); -		xo_emit("{P:/%*s}{d:component}\n", len, "", "N/A"); -		xo_close_instance("components"); +		xo_emit("{t:name/%*s}  {t:status/%*s}  N/A\n", +		    name_len, name, status_len, status); +	} else { +		xo_close_list("components");  	} -	xo_close_list("components");  	xo_close_instance("status");  } @@ -1242,6 +1249,7 @@ status_one_geom_prs(struct ggeom *gp, int script, int name_len, int status_len)  	struct gconsumer *cp;  	struct gconfig *conf;  	const char *name, *status, *cstate, *csyncr; +	char fmt[64];  	int gotone, len;  	xo_open_instance("status"); @@ -1269,28 +1277,37 @@ status_one_geom_prs(struct ggeom *gp, int script, int name_len, int status_len)  			csyncr = status_one_consumer(cp, "synchronized");  			if (!gotone || script) {  				if (!gotone) { -					xo_emit("{:name/%*s}  {:status/%*s}  ", +					xo_emit("{t:name/%*s}  {t:status/%*s}  ",  					    name_len, name, status_len, status); +					xo_open_list("components");  				} else { -					xo_emit("{d:name/%*s}  {d:status/%*s}  ", +					/* +					 * XXX: running the same xo_emit() as +					 * above or variations of it will +					 * cause the XML/JSON to produce +					 * extra "components" lists in +					 * script mode +					 */ + +					snprintf(fmt, sizeof(fmt), "%*s  %*s  ",  					    name_len, name, status_len, status); +					xo_emit(fmt);  				} -				xo_open_list("components");  			}  			xo_open_instance("component");  			if (cstate != NULL && csyncr != NULL) {  				xo_emit("{P:/%*s}{:component} ({:state}, {:synchronized})\n", -				len, "", cp->lg_provider->lg_name, cstate, csyncr); +				    len, "", cp->lg_provider->lg_name, cstate, csyncr);  			} else if (cstate != NULL) {  				xo_emit("{P:/%*s}{:component} ({:state})\n", -				len, "", cp->lg_provider->lg_name, cstate); +				    len, "", cp->lg_provider->lg_name, cstate);  			} else if (csyncr != NULL) {  				xo_emit("{P:/%*s}{:component} ({:synchronized})\n", -				len, "", cp->lg_provider->lg_name, csyncr); +				    len, "", cp->lg_provider->lg_name, csyncr);  			} else {  				xo_emit("{P:/%*s}{:component}\n", -				len, "", cp->lg_provider->lg_name); +				    len, "", cp->lg_provider->lg_name);  			}  			xo_close_instance("component");  			gotone = 1; @@ -1298,13 +1315,11 @@ status_one_geom_prs(struct ggeom *gp, int script, int name_len, int status_len)  				len = name_len + status_len + 4;  		}  		if (!gotone) { -			xo_emit("{:name/%*s}  {:status/%*s}  ", name_len, name, status_len, status); -			xo_open_list("components"); -			xo_open_instance("components"); -			xo_emit("{P:/%*s}{d:component}\n", len, "", "N/A"); -			xo_close_instance("components"); +			xo_emit("{t:name/%*s}  {t:status/%*s}  N/A\n", +			    name_len, name, status_len, status); +		} else { +			xo_close_list("components");  		} -		xo_close_list("components");  	}  	xo_close_instance("status");  } @@ -1370,7 +1385,7 @@ std_status(struct gctl_req *req, unsigned flags __unused)  		xo_emit("{T:/%*s}  {T:/%*s}  {T:Components}\n",  		    name_len, "Name", status_len, "Status");  	} -	xo_open_list("status"); +	xo_open_list(gclass_name);  	if (nargs > 0) {  		for (i = 0; i < nargs; i++) {  			name = gctl_get_ascii(req, "arg%d", i); @@ -1398,7 +1413,7 @@ std_status(struct gctl_req *req, unsigned flags __unused)  			}  		}  	} -	xo_close_list("status"); +	xo_close_list(gclass_name);  end:  	geom_deletetree(&mesh);  } diff --git a/sbin/ifconfig/ifbridge.c b/sbin/ifconfig/ifbridge.c index eff443447c13..8bcf4a638adf 100644 --- a/sbin/ifconfig/ifbridge.c +++ b/sbin/ifconfig/ifbridge.c @@ -811,7 +811,7 @@ unsetbridge_private(if_ctx *ctx, const char *val, int dummy __unused)  static int  parse_vlans(ifbvlan_set_t *set, const char *str)  { -	char *s, *token; +	char *s, *free_s, *token;  	/* "none" means the empty vlan set */  	if (strcmp(str, "none") == 0) { @@ -829,6 +829,8 @@ parse_vlans(ifbvlan_set_t *set, const char *str)  	if ((s = strdup(str)) == NULL)  		return (-1); +	/* Keep the original value of s, since strsep() will modify it */ +	free_s = s;  	while ((token = strsep(&s, ",")) != NULL) {  		unsigned long first, last; @@ -856,11 +858,11 @@ parse_vlans(ifbvlan_set_t *set, const char *str)  			BRVLAN_SET(set, vlan);  	} -	free(s); +	free(free_s);  	return (0);  err: -	free(s); +	free(free_s);  	return (-1);  } diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index fe744776d9b3..95618227a010 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -1017,7 +1017,8 @@ _dtrace_provs=	dtrace_audit.4 \  		dtrace_sctp.4 \  		dtrace_tcp.4 \  		dtrace_udp.4 \ -		dtrace_udplite.4 +		dtrace_udplite.4 \ +		dtrace_vfs.4  MLINKS+=	dtrace_audit.4 dtaudit.4  .endif diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4 index 3c4894c03d62..a882a5204fb2 100644 --- a/share/man/man4/ddb.4 +++ b/share/man/man4/ddb.4 @@ -24,7 +24,7 @@  .\" any improvements or extensions that they make and grant Carnegie Mellon  .\" the rights to redistribute these changes.  .\" -.Dd June 10, 2025 +.Dd October 31, 2025  .Dt DDB 4  .Os  .Sh NAME @@ -604,12 +604,15 @@ The  modifier will print command line arguments for each process.  .\"  .Pp -.It Ic show Cm all tcpcbs Ns Op Li / Ns Cm b Ns Cm l +.It Ic show Cm all tcpcbs Ns Op Li / Ns Cm b Ns Cm i Ns Cm l  Show the same output as "show tcpcb" does, but for all  TCP control blocks within the system.  The  .Cm b  modifier will request BBLog entries to be printed. +If the +.Cm i +modifier is provided, the corresponding IP control block is also shown.  Using the  .Cm l  modifier will limit the output to TCP control blocks, which are locked. @@ -1106,7 +1109,7 @@ on i386.)  Not present on some platforms.  .\"  .Pp -.It Ic show Cm tcpcb Ns Oo Li / Ns Cm b Oc Ar addr +.It Ic show Cm tcpcb Ns Oo Li / Ns Cm b Ns Cm i Oc Ar addr  Print TCP control block  .Vt struct tcpcb  lying at address @@ -1117,6 +1120,9 @@ header file.  The  .Cm b  modifier will request BBLog entries to be printed. +If the +.Cm i +modifier is provided, the corresponding IP control block is also shown.  .\"  .Pp  .It Ic show Cm thread Op Ar addr | tid diff --git a/share/man/man4/dtrace_vfs.4 b/share/man/man4/dtrace_vfs.4 new file mode 100644 index 000000000000..528d5da42f3d --- /dev/null +++ b/share/man/man4/dtrace_vfs.4 @@ -0,0 +1,97 @@ +.\" +.\" Copyright (c) 2025 Mateusz Piotrowski <0mp@FreeBSD.org> +.\" +.\" SPDX-License-Identifier: BSD-2-Clause +.\" +.Dd November 3, 2025 +.Dt DTRACE_VFS 4 +.Os +.Sh NAME +.Nm dtrace_vfs +.Nd a DTrace provider for Virtual File System +.Sh SYNOPSIS +.Sm off +.Nm vfs Cm : fplookup : Ar function Cm : Ar name +.Nm vfs Cm : namecache : Ar function Cm : Ar name +.Nm vfs Cm : namei : Ar function Cm : Ar name +.Nm vfs Cm : vop : Ar function Cm : Ar name +.Sm on +.Sh DESCRIPTION +The DTrace +.Nm vfs +provider allows users to trace events in the +.Xr VFS 9 +layer, the kernel interface for file systems on +.Fx . +.Pp +Run +.Ql dtrace -l -P vfs +to list all +.Nm vfs +probes. +Add +.Fl v +to generate program stability reports, +which contain information about the number of probe arguments and their types. +.Pp +The +.Cm fplookup +module defines a single probe, +.Fn vfs:fplookup:lookup:done "struct nameidata *ndp" "int line" "bool status_code" , +that instruments the fast path lookup code in +.Xr VFS 9 . +.Pp +The +.Cm namecache +module provides probes related to the +.Xr VFS 9 +cache. +Consult the source code in +.Pa src/sys/kern/vfs_cache.c +for more details. +.Pp +The +.Cm namei +module manages probes related to pathname translation and lookup operations. +Refer to +.Xr namei 9 +to learn more. +.Pp +The +.Cm vop +module contains probes related to the functions responsible for +.Xr vnode 9 +operations. +.Sh COMPATIBILITY +This provider is specific to +.Fx . +.Sh EXAMPLES +Check what lookups failed to be handled in a lockless manner: +.Bd -literal -offset 2n +# dtrace -n 'vfs:fplookup:lookup:done { @[arg1, arg2] = count(); }' +.Ed +.Sh SEE ALSO +.Xr dtrace 1 , +.Xr d 7 , +.Xr SDT 9 , +.Xr namei 9 , +.Xr VFS 9 +.Rs +.%A Brendan Gregg +.%A Jim Mauro +.%B DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD +.%I Prentice Hall +.%P pp. 335\(en351 +.%D 2011 +.%U https://www.brendangregg.com/dtracebook/ +.Re +.Sh AUTHORS +.An -nosplit +The +.Fx +.Nm vfs +provider was written by +.An Robert Watson Aq Mt rwatson@FreeBSD.org . +.Pp +This manual page was written by +.An Mateusz Piotrowski Aq Mt 0mp@FreeBSD.org . diff --git a/share/man/man4/u3g.4 b/share/man/man4/u3g.4 index 51c883b8378e..c7bf1f98880a 100644 --- a/share/man/man4/u3g.4 +++ b/share/man/man4/u3g.4 @@ -94,14 +94,14 @@ Qualcomm Inc. GOBI 1000, 2000 and 3000 devices with MDM1000 or MDM2000 chipsets  .It  QUECTEL BGX, ECX, EGX, EMX, EPX, RGX series  .It -Quectel EM160R +Quectel EM160R, EM060K  .Pq see Sx CAVEATS  .It  Huawei B190, E180v, E220, E3372, E3372v153, E5573Cs322, ('<Huawei Mobile>')  .It  Novatel U740, MC950D, X950D, etc.  .It -Sierra MC875U, MC8775U, etc. +Sierra MC875U, MC8775U, EM7590, etc.  .It  Panasonic CF-F9 GOBI  .El diff --git a/share/man/man5/pf.conf.5 b/share/man/man5/pf.conf.5 index be46b1a47291..c22d983d33e8 100644 --- a/share/man/man5/pf.conf.5 +++ b/share/man/man5/pf.conf.5 @@ -27,7 +27,7 @@  .\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  .\" POSSIBILITY OF SUCH DAMAGE.  .\" -.Dd October 7, 2025 +.Dd November 3, 2025  .Dt PF.CONF 5  .Os  .Sh NAME @@ -3460,6 +3460,12 @@ filteropt      = user | group | flags | icmp-type | icmp6-type | "tos" tos |                   "dnpipe" ( number | "(" number "," number ")" ) |                   "dnqueue" ( number | "(" number "," number ")" ) |                   "ridentifier" number | +                 "binat-to" ( redirhost | "{" redirhost-list "}" ) +                 [ portspec ] [ pooltype ] | +                 "rdr-to" ( redirhost | "{" redirhost-list "}" ) +                 [ portspec ] [ pooltype ] | +                 "nat-to" ( redirhost | "{" redirhost-list "}" ) +                 [ portspec ] [ pooltype ] [ "static-port" ] |                   [ ! ] "received-on" ( interface-name | interface-group )  nat-rule       = [ "no" ] "nat" [ "pass" [ "log" [ "(" logopts ")" ] ] ] diff --git a/share/man/man7/d.7 b/share/man/man7/d.7 index 4b00d3d71c79..59b3389b121b 100644 --- a/share/man/man7/d.7 +++ b/share/man/man7/d.7 @@ -198,6 +198,130 @@ The number of nanoseconds since the Epoch  Suitable for timestamping logs.  .El  .Sh BUILT-IN FUNCTIONS +.\" Keep the indentation wide enough for the reader to be able to skim through +.\" function names quickly. +.Bl -tag -width "size_t strlen" +.It Ft string Fn strchr "string s" "char c" +Return a substring of +.Fa s +starting at the first occurance of +.Fa c +in +.Fa s . +Return +.Dv NULL +if +.Fa c +does not occur in +.Fa s . +.Pp +For example, +.Bd -literal -compact -offset indent +strchr("abc", 'b'); +.Ed +returns +.Ql "bc" +and +.Bd -literal -compact -offset indent +strchr("abc", 'd'); +.Ed +returns +.Dv NULL . +.It Ft string Fn strjoin "string s1" "string s2" +Return a string resulting from concatenating +.Fa s1 +and +.Fa s2 . +.Pp +For example, +.Bd -literal -compact -offset indent +strjoin("abc", "def") +.Ed +returns +.Ql abcdef . +.It Ft string Fn strrchr "string s" "char c" +Return a substring of +.Fa s +starting at the last occurance of +.Fa c +in +.Fa s . +Similar to +.Fn strchr . +.It Ft string Fn strstr "string haystack" "string needle" +Return a substring of +.Fa haystack +starting at the first occurrence of +.Fa needle . +Return +.Dv NULL +if +.Fa needle +is not a substring of +.Fa haystack . +.Pp +For example, +.Bd -literal -compact -offset indent +strstr("abc1bc2", "bc") +.Ed +returns +.Ql bc1bc2 +and +.Bd -literal -compact -offset indent +strstr("abc", "xy") +.Ed +returns +.Dv NULL . +.It Ft string Fn strtok "string s" "string separators" +Tokenize +.Fa s +with +.Fa separators . +.Pp +For example, +.Bd -literal -compact -offset indent +strtok("abcdefg", "xyzd") +.Ed +returns +.Ql abc . +.It Ft size_t Fn strlen "string s" +Return the length of string +.Fa s . +.It Ft string Fn substr "string s" "int position" "[int length]" +Return a +substring of string +.Fa s +starting at +.Fa position . +The substring will be at most +.Fa length Ns -long . +If +.Fa length +is not specified, use the rest of the string. +If +.Fa position +is greater than +the size of +.Fa s , +return an empty string. +.Pp +For example, +.Bd -literal -compact -offset indent +substr("abcd", 2) +.Ed +returns +.Ql cd , +.Bd -literal -compact -offset indent +substr("abcd", 2, 1) +.Ed +returns +.Ql c , +and +.Bd -literal -compact -offset indent +substr("abcd", 99) +.Ed +returns an empty string. +.El  .Ss Aggregation Functions  .Bl -tag -compact -width "llquantize(value, factor, low, high, nsteps)"  .It Fn avg value diff --git a/share/man/man9/VFS.9 b/share/man/man9/VFS.9 index a1d0a19bec13..6ea6570bbf6e 100644 --- a/share/man/man9/VFS.9 +++ b/share/man/man9/VFS.9 @@ -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 February 9, 2010 +.Dd November 3, 2025  .Dt VFS 9  .Os  .Sh NAME @@ -42,6 +42,7 @@ function from  rather than implementing empty functions or casting to  .Fa eopnotsupp .  .Sh SEE ALSO +.Xr dtrace_vfs 4 ,  .Xr VFS_CHECKEXP 9 ,  .Xr VFS_FHTOVP 9 ,  .Xr VFS_MOUNT 9 , diff --git a/share/man/man9/atomic.9 b/share/man/man9/atomic.9 index c9133c6311a5..b027a0ff0bca 100644 --- a/share/man/man9/atomic.9 +++ b/share/man/man9/atomic.9 @@ -182,35 +182,42 @@ This variant is the default.  The second variant has acquire semantics, and the third variant has release  semantics.  .Pp -When an atomic operation has acquire semantics, the operation must have +An atomic operation can only have +.Em acquire +semantics if it performs a load +from memory. +When an atomic operation has acquire semantics, a load performed as +part of the operation must have  completed before any subsequent load or store (by program order) is  performed.  Conversely, acquire semantics do not require that prior loads or stores have -completed before the atomic operation is performed. -An atomic operation can only have acquire semantics if it performs a load -from memory. +completed before a load from the atomic operation is performed.  To denote acquire semantics, the suffix  .Dq Li _acq  is inserted into the function name immediately prior to the  .Dq Li _ Ns Aq Fa type  suffix. -For example, to subtract two integers ensuring that the subtraction is +For example, to subtract two integers ensuring that the load of +the value from memory is  completed before any subsequent loads and stores are performed, use  .Fn atomic_subtract_acq_int .  .Pp +An atomic operation can only have +.Em release +semantics if it performs a store to memory.  When an atomic operation has release semantics, all prior loads or stores -(by program order) must have completed before the operation is performed. -Conversely, release semantics do not require that the atomic operation must +(by program order) must have completed before a store executed as part of +the operation that is performed. +Conversely, release semantics do not require that a store from the atomic +operation must  have completed before any subsequent load or store is performed. -An atomic operation can only have release semantics if it performs a store -to memory.  To denote release semantics, the suffix  .Dq Li _rel  is inserted into the function name immediately prior to the  .Dq Li _ Ns Aq Fa type  suffix.  For example, to add two long integers ensuring that all prior loads and -stores are completed before the addition is performed, use +stores are completed before the store of the result is performed, use  .Fn atomic_add_rel_long .  .Pp  When a release operation by one thread @@ -235,6 +242,33 @@ section.  However, they will not prevent the compiler or processor from moving loads  or stores into the critical section, which does not violate the semantics of  a mutex. +.Ss Architecture-dependent caveats for compare-and-swap +The +.Fn atomic_[f]cmpset_<type> +operations, specifically those without explicitly specified memory +ordering, are defined as relaxed. +Consequently, a thread's accesses to memory locations different from +that of the atomic operation can be reordered in relation to the +atomic operation. +.Pp +However, the implementation on the +.Sy amd64 +and +.Sy i386 +architectures provide sequentially consistent semantics. +In particular, the reordering mentioned above cannot occur. +.Pp +On the +.Sy arm64/aarch64 +architecture, the operation may include either acquire +semantics on the constituent load or release semantics +on the constituent store. +This means that accesses to other locations in program order +before the atomic, might be observed as executed after the load +that is the part of the atomic operation (but not after the store +from the operation due to release). +Similarly, accesses after the atomic might be observed as executed +before the store.  .Ss Thread Fence Operations  Alternatively, a programmer can use atomic thread fence operations to  constrain the reordering of accesses. diff --git a/share/misc/bsd-family-tree b/share/misc/bsd-family-tree index b0502dfc7925..82e9ac45c495 100644 --- a/share/misc/bsd-family-tree +++ b/share/misc/bsd-family-tree @@ -479,7 +479,10 @@ FreeBSD 5.2           |      |                 |                       |   |     |              |      |                    |            DragonFly 6.4.1   |     |              |      |                    |            DragonFly 6.4.2   |  FreeBSD           |      |                    |                    | - |   14.3             |      |                OpenBSD 7.8              | + |   14.3             |      |                    |                    | + |                  macOS    |                    |                    | + |                   26      |                    |                    | + |                    |      |                OpenBSD 7.8              |   |                    |      |                    |                    |  FreeBSD 16 -current   |  NetBSD -current   OpenBSD -current    DragonFly -current   |                    |      |                    |                    | @@ -925,6 +928,7 @@ OpenBSD 7.7		2025-04-28 [OBD]  DragonFly 6.4.1		2025-04-30 [DFB]  DragonFly 6.4.2		2025-05-09 [DFB]  FreeBSD 14.3		2025-06-10 [FBD] +macOS 26		2025-09-15 [APL]  OpenBSD 7.8		2025-10-22 [OBD]  Bibliography diff --git a/share/mk/bsd.prog.mk b/share/mk/bsd.prog.mk index 10e1c177e2b2..5697845079e2 100644 --- a/share/mk/bsd.prog.mk +++ b/share/mk/bsd.prog.mk @@ -49,9 +49,11 @@ CXXFLAGS+= -mretpoline  LDFLAGS+= -Wl,-zretpolineplt  .endif  .else +.if !defined(_NO_INCLUDE_COMPILERMK)  .warning Retpoline requested but not supported by compiler or linker  .endif  .endif +.endif  # LLD sensibly defaults to -znoexecstack, so do the same for BFD  LDFLAGS.bfd+= -Wl,-znoexecstack  .if ${MK_BRANCH_PROTECTION} != "no" @@ -71,9 +73,11 @@ CFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clan  CXXFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang  .endif  .else +.if !defined(_NO_INCLUDE_COMPILERMK)  .warning INIT_ALL (${OPT_INIT_ALL}) requested but not supported by compiler  .endif  .endif +.endif  # Zero used registers on return (mitigate some ROP)  .if ${MK_ZEROREGS} != "no" diff --git a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c index f4aee12dec53..185e81e71bdc 100644 --- a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c +++ b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c @@ -546,7 +546,9 @@ free_pagelist(BULKINFO_T *bi, int actual)  	pagelist = bi->pagelist;  	vchiq_log_trace(vchiq_arm_log_level, -		"free_pagelist - %zx, %d (%u bytes @%p)", (size_t)pagelist, actual, pagelist->length, bi->buf); +	    "free_pagelist - %zx, %d (%lu bytes @%p)", +	    (size_t)pagelist, (int)actual, (unsigned long)pagelist->length, +	    bi->buf);  	num_pages =  		(pagelist->length + pagelist->offset + PAGE_SIZE - 1) / diff --git a/sys/dev/amdtemp/amdtemp.c b/sys/dev/amdtemp/amdtemp.c index 79ccdc8c79fb..b1ecb014a2b0 100644 --- a/sys/dev/amdtemp/amdtemp.c +++ b/sys/dev/amdtemp/amdtemp.c @@ -642,7 +642,7 @@ amdtemp_intrhook(void *arg)  			    OID_AUTO, "temperature",  			    CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,  			    dev, sensor, amdtemp_sysctl, "IK", -			    "Current temparature"); +			    "Current temperature");  		}  	}  	if (sc->sc_ich.ich_arg != NULL) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c index a0c27828bbc1..50d7cc0aa7a8 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c @@ -76,7 +76,7 @@ ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains)  		HALDEBUG(ah, HAL_DEBUG_PERCAL,  		    "Start IQ Cal and Correction for Chain %d\n", i);  		HALDEBUG(ah, HAL_DEBUG_PERCAL, -		    "Orignal: iq_corr_meas = 0x%08x\n", iqCorrMeas); +		    "Original: iq_corr_meas = 0x%08x\n", iqCorrMeas);  		iqCorrNeg = 0;  		/* iqCorrMeas is always negative. */  diff --git a/sys/dev/bwi/if_bwi.c b/sys/dev/bwi/if_bwi.c index 85146d4c4010..80fc5e9e47af 100644 --- a/sys/dev/bwi/if_bwi.c +++ b/sys/dev/bwi/if_bwi.c @@ -2900,7 +2900,7 @@ bwi_plcp_header(const struct ieee80211_rate_table *rt,  	else if (modtype == IEEE80211_T_DS)  		bwi_ds_plcp_header(plcp, pkt_len, rate);  	else -		panic("unsupport modulation type %u\n", modtype); +		panic("unsupported modulation type %u\n", modtype);  }  static int diff --git a/sys/dev/cesa/cesa.c b/sys/dev/cesa/cesa.c index 405b619d6e5b..7439dcdbc1ee 100644 --- a/sys/dev/cesa/cesa.c +++ b/sys/dev/cesa/cesa.c @@ -286,7 +286,7 @@ cesa_alloc_tdesc(struct cesa_softc *sc)  	CESA_GENERIC_ALLOC_LOCKED(sc, ctd, tdesc);  	if (!ctd) -		device_printf(sc->sc_dev, "TDMA descriptors pool exhaused. " +		device_printf(sc->sc_dev, "TDMA descriptors pool exhausted. "  		    "Consider increasing CESA_TDMA_DESCRIPTORS.\n");  	return (ctd); @@ -299,7 +299,7 @@ cesa_alloc_sdesc(struct cesa_softc *sc, struct cesa_request *cr)  	CESA_GENERIC_ALLOC_LOCKED(sc, csd, sdesc);  	if (!csd) { -		device_printf(sc->sc_dev, "SA descriptors pool exhaused. " +		device_printf(sc->sc_dev, "SA descriptors pool exhausted. "  		    "Consider increasing CESA_SA_DESCRIPTORS.\n");  		return (NULL);  	} diff --git a/sys/dev/ciss/ciss.c b/sys/dev/ciss/ciss.c index d4ede91f6b35..dd3df631119a 100644 --- a/sys/dev/ciss/ciss.c +++ b/sys/dev/ciss/ciss.c @@ -3140,7 +3140,7 @@ ciss_cam_action(struct cam_sim *sim, union ccb *ccb)      }      default:		/* we can't do this */ -	debug(1, "unspported func_code = 0x%x", ccb->ccb_h.func_code); +	debug(1, "unsupported func_code = 0x%x", ccb->ccb_h.func_code);  	ccb->ccb_h.status = CAM_REQ_INVALID;  	break;      } diff --git a/sys/dev/igc/if_igc.c b/sys/dev/igc/if_igc.c index f199a128c783..d6c06803990f 100644 --- a/sys/dev/igc/if_igc.c +++ b/sys/dev/igc/if_igc.c @@ -2816,7 +2816,7 @@ igc_add_hw_stats(struct igc_softc *sc)  	    "Oversized Packets Received");  	SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_jabber",  	    CTLFLAG_RD, &sc->stats.rjc, -	    "Recevied Jabber"); +	    "Received Jabber");  	SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_errs",  	    CTLFLAG_RD, &sc->stats.rxerrc,  	    "Receive Errors"); diff --git a/sys/dev/isci/scil/scic_sds_remote_node_context.c b/sys/dev/isci/scil/scic_sds_remote_node_context.c index aa1e8d840282..42dd81aa1874 100644 --- a/sys/dev/isci/scil/scic_sds_remote_node_context.c +++ b/sys/dev/isci/scil/scic_sds_remote_node_context.c @@ -663,7 +663,7 @@ SCI_STATUS scic_sds_remote_node_context_invalidating_state_event_handler(                 SCIC_LOG_OBJECT_SSP_REMOTE_TARGET |                    SCIC_LOG_OBJECT_SMP_REMOTE_TARGET |                    SCIC_LOG_OBJECT_STP_REMOTE_TARGET, -               "SCIC Remote Node Context 0x%x was suspeneded by hardware while being invalidated.\n", +               "SCIC Remote Node Context 0x%x was suspended by hardware while being invalidated.\n",                 this_rnc                    ));              status = SCI_SUCCESS; @@ -718,7 +718,7 @@ SCI_STATUS scic_sds_remote_node_context_resuming_state_event_handler(                 SCIC_LOG_OBJECT_SSP_REMOTE_TARGET |                    SCIC_LOG_OBJECT_SMP_REMOTE_TARGET |                    SCIC_LOG_OBJECT_STP_REMOTE_TARGET, -               "SCIC Remote Node Context 0x%x was suspeneded by hardware while being resumed.\n", +               "SCIC Remote Node Context 0x%x was suspended by hardware while being resumed.\n",                 this_rnc                    ));              status = SCI_SUCCESS; diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c index 13e5dfc84fd1..a7d98f06aea3 100644 --- a/sys/dev/mfi/mfi.c +++ b/sys/dev/mfi/mfi.c @@ -2829,7 +2829,7 @@ mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm)  			if (ld->ld_id == cm->cm_frame->dcmd.mbox[0])  				break;  		} -		KASSERT(ld != NULL, ("volume dissappeared")); +		KASSERT(ld != NULL, ("volume disappeared"));  		if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) {  			mtx_unlock(&sc->mfi_io_lock);  			bus_topo_lock(); diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c index 5b9cb93c7b31..f2965048b285 100644 --- a/sys/dev/mmc/mmcsd.c +++ b/sys/dev/mmc/mmcsd.c @@ -1422,7 +1422,7 @@ mmcsd_task(void *arg)  	struct mmcsd_softc *sc;  	struct bio *bp;  	device_t dev, mmcbus; -	int bio_error, err, sz; +	int abio_error, err, sz;  	part = arg;  	sc = part->sc; @@ -1430,7 +1430,7 @@ mmcsd_task(void *arg)  	mmcbus = sc->mmcbus;  	while (1) { -		bio_error = 0; +		abio_error = 0;  		MMCSD_DISK_LOCK(part);  		do {  			if (part->running == 0) @@ -1475,11 +1475,11 @@ mmcsd_task(void *arg)  		} else if (bp->bio_cmd == BIO_DELETE)  			block = mmcsd_delete(part, bp);  		else -			bio_error = EOPNOTSUPP; +			abio_error = EOPNOTSUPP;  release:  		MMCBUS_RELEASE_BUS(mmcbus, dev);  		if (block < end) { -			bp->bio_error = (bio_error == 0) ? EIO : bio_error; +			bp->bio_error = (abio_error == 0) ? EIO : abio_error;  			bp->bio_resid = (end - block) * sz;  			bp->bio_flags |= BIO_ERROR;  		} else diff --git a/sys/dev/nvme/nvme_ns.c b/sys/dev/nvme/nvme_ns.c index f4a588373c98..17684cc14ba2 100644 --- a/sys/dev/nvme/nvme_ns.c +++ b/sys/dev/nvme/nvme_ns.c @@ -45,7 +45,7 @@  #include "nvme_private.h"  #include "nvme_linux.h" -static void		nvme_bio_child_inbed(struct bio *parent, int bio_error); +static void		nvme_bio_child_inbed(struct bio *parent, int abio_error);  static void		nvme_bio_child_done(void *arg,  					    const struct nvme_completion *cpl);  static uint32_t		nvme_get_num_segments(uint64_t addr, uint64_t size, @@ -275,14 +275,14 @@ nvme_ns_bio_done(void *arg, const struct nvme_completion *status)  }  static void -nvme_bio_child_inbed(struct bio *parent, int bio_error) +nvme_bio_child_inbed(struct bio *parent, int abio_error)  {  	struct nvme_completion	parent_cpl;  	int			children, inbed; -	if (bio_error != 0) { +	if (abio_error != 0) {  		parent->bio_flags |= BIO_ERROR; -		parent->bio_error = bio_error; +		parent->bio_error = abio_error;  	}  	/* @@ -309,12 +309,12 @@ nvme_bio_child_done(void *arg, const struct nvme_completion *cpl)  {  	struct bio		*child = arg;  	struct bio		*parent; -	int			bio_error; +	int			abio_error;  	parent = child->bio_parent;  	g_destroy_bio(child); -	bio_error = nvme_completion_is_error(cpl) ? EIO : 0; -	nvme_bio_child_inbed(parent, bio_error); +	abio_error = nvme_completion_is_error(cpl) ? EIO : 0; +	nvme_bio_child_inbed(parent, abio_error);  }  static uint32_t diff --git a/sys/dev/oce/oce_sysctl.c b/sys/dev/oce/oce_sysctl.c index 1b903d8d027a..544bec9438c4 100644 --- a/sys/dev/oce/oce_sysctl.c +++ b/sys/dev/oce/oce_sysctl.c @@ -716,7 +716,7 @@ oce_add_stats_sysctls_be3(POCE_SOFTC sc,  			"Total Received Bytes");  	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",  			CTLFLAG_RD, &stats->rx.t_rx_frags, 0, -			"Total Received Fragements"); +			"Total Received Fragments");  	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",  			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,  			"Total Received Multicast Packets"); @@ -748,7 +748,7 @@ oce_add_stats_sysctls_be3(POCE_SOFTC sc,  			"Receive Packets");  		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",  			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, -			"Recived Bytes"); +			"Received Bytes");  		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",  			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,  			"Received Fragments"); @@ -786,7 +786,7 @@ oce_add_stats_sysctls_be3(POCE_SOFTC sc,  			"ERX Errors");  	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "alignment_errors",  			CTLFLAG_RD, &stats->u0.be.rx_drops_too_many_frags, 0, -			"RX Alignmnet Errors"); +			"RX Alignment Errors");  	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",  			CTLFLAG_RD, &stats->u0.be.rx_in_range_errors, 0,  			"In Range Errors"); @@ -932,7 +932,7 @@ oce_add_stats_sysctls_xe201(POCE_SOFTC sc,  			"Total Received Bytes");  	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_frags",  			CTLFLAG_RD, &stats->rx.t_rx_frags, 0, -			"Total Received Fragements"); +			"Total Received Fragments");  	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "total_mcast_pkts",  			CTLFLAG_RD, &stats->rx.t_rx_mcast_pkts, 0,  			"Total Received Multicast Packets"); @@ -961,7 +961,7 @@ oce_add_stats_sysctls_xe201(POCE_SOFTC sc,  			"Receive Packets");  		SYSCTL_ADD_QUAD(ctx, queue_stats_list, OID_AUTO, "rx_bytes",  			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_bytes, -			"Recived Bytes"); +			"Received Bytes");  		SYSCTL_ADD_UINT(ctx, queue_stats_list, OID_AUTO, "rx_frags",  			CTLFLAG_RD, &sc->rq[i]->rx_stats.rx_frags, 0,  			"Received Fragments"); @@ -989,7 +989,7 @@ oce_add_stats_sysctls_xe201(POCE_SOFTC sc,  			"CRC Errors");  	SYSCTL_ADD_UQUAD(ctx, rx_stat_list, OID_AUTO, "alignment_errors",  			CTLFLAG_RD, &stats->u0.xe201.rx_alignment_errors, -			"RX Alignmnet Errors"); +			"RX Alignment Errors");  	SYSCTL_ADD_UINT(ctx, rx_stat_list, OID_AUTO, "in_range_errors",  			CTLFLAG_RD, &stats->u0.xe201.rx_in_range_errors, 0,  			"In Range Errors"); diff --git a/sys/dev/random/fenestrasX/fx_pool.c b/sys/dev/random/fenestrasX/fx_pool.c index 8e63b345a1bd..b6ffc202769e 100644 --- a/sys/dev/random/fenestrasX/fx_pool.c +++ b/sys/dev/random/fenestrasX/fx_pool.c @@ -127,7 +127,7 @@ static const struct fxrng_ent_cls fxrng_garbage = {   */  static const struct fxrng_ent_char {  	const struct fxrng_ent_cls	*entc_cls; -} fxrng_ent_char[ENTROPYSOURCE] = { +} fxrng_ent_char[/*ENTROPYSOURCE*/] = {  	[RANDOM_CACHED] = {  		.entc_cls = &fxrng_hi_push,  	}, @@ -213,6 +213,7 @@ static const struct fxrng_ent_char {  		.entc_cls = &fxrng_hi_pull,  	},  }; +CTASSERT(nitems(fxrng_ent_char) == ENTROPYSOURCE);  /* Useful for single-bit-per-source state. */  BITSET_DEFINE(fxrng_bits, ENTROPYSOURCE); diff --git a/sys/dev/random/random_harvestq.c b/sys/dev/random/random_harvestq.c index 643dbac1fc8b..b591ffd3b544 100644 --- a/sys/dev/random/random_harvestq.c +++ b/sys/dev/random/random_harvestq.c @@ -88,7 +88,7 @@ static void random_sources_feed(void);  static __read_mostly bool epoch_inited;  static __read_mostly epoch_t rs_epoch; -static const char *random_source_descr[ENTROPYSOURCE]; +static const char *random_source_descr[];  /*   * How many events to queue up. We create this many items in @@ -109,6 +109,7 @@ volatile int random_kthread_control;   * Updates are synchronized by the harvest mutex.   */  __read_frequently u_int hc_source_mask; +CTASSERT(ENTROPYSOURCE <= sizeof(hc_source_mask) * NBBY);  struct random_sources {  	CK_LIST_ENTRY(random_sources)	 rrs_entries; @@ -647,7 +648,7 @@ SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask_bin,      random_print_harvestmask, "A",      "Entropy harvesting mask (printable)"); -static const char *random_source_descr[ENTROPYSOURCE] = { +static const char *random_source_descr[/*ENTROPYSOURCE*/] = {  	[RANDOM_CACHED] = "CACHED",  	[RANDOM_ATTACH] = "ATTACH",  	[RANDOM_KEYBOARD] = "KEYBOARD", @@ -678,6 +679,7 @@ static const char *random_source_descr[ENTROPYSOURCE] = {  	[RANDOM_PURE_ARM_TRNG] = "PURE_ARM_TRNG",  	/* "ENTROPYSOURCE" */  }; +CTASSERT(nitems(random_source_descr) == ENTROPYSOURCE);  static int  random_print_harvestmask_symbolic(SYSCTL_HANDLER_ARGS) diff --git a/sys/dev/thunderbolt/tb_pcib.c b/sys/dev/thunderbolt/tb_pcib.c index 00738984ad1c..bc4fc1ce00ec 100644 --- a/sys/dev/thunderbolt/tb_pcib.c +++ b/sys/dev/thunderbolt/tb_pcib.c @@ -557,8 +557,20 @@ static int  tb_pci_probe(device_t dev)  {  	struct tb_pcib_ident *n; +	device_t parent; +	devclass_t dc; -	if ((n = tb_pcib_find_ident(device_get_parent(dev))) != NULL) { +	/* +	 * This driver is only valid if the parent device is a PCI-PCI +	 * bridge.  To determine that, check if the grandparent is a +	 * PCI bus. +	 */ +	parent = device_get_parent(dev); +	dc = device_get_devclass(device_get_parent(parent)); +	if (strcmp(devclass_get_name(dc), "pci") != 0) +		return (ENXIO); + +	if ((n = tb_pcib_find_ident(parent)) != NULL) {  		switch (n->flags & TB_GEN_MASK) {  		case TB_GEN_TB1:  			device_set_desc(dev, "Thunderbolt 1 Link"); diff --git a/sys/dev/vnic/nicvf_main.c b/sys/dev/vnic/nicvf_main.c index dd44e420c78f..59f7abeacdd5 100644 --- a/sys/dev/vnic/nicvf_main.c +++ b/sys/dev/vnic/nicvf_main.c @@ -1402,7 +1402,7 @@ nicvf_allocate_net_interrupts(struct nicvf *nic)  	/* MSI-X must be configured by now */  	if (!nic->msix_enabled) { -		device_printf(nic->dev, "Cannot alloacte queue interrups. " +		device_printf(nic->dev, "Cannot alloacte queue interrupts. "  		    "MSI-X interrupts disabled.\n");  		return (ENXIO);  	} diff --git a/sys/fs/fuse/fuse_internal.c b/sys/fs/fuse/fuse_internal.c index 61fe2ed032f6..eba0a8a79ff3 100644 --- a/sys/fs/fuse/fuse_internal.c +++ b/sys/fs/fuse/fuse_internal.c @@ -1063,6 +1063,8 @@ fuse_internal_init_callback(struct fuse_ticket *tick, struct uio *uio)  	if (!fuse_libabi_geq(data, 7, 28))  		fsess_set_notimpl(data->mp, FUSE_COPY_FILE_RANGE); +	if (fuse_libabi_geq(data, 7, 33) && (fiio->flags & FUSE_SETXATTR_EXT)) +		data->dataflags |= FSESS_SETXATTR_EXT;  out:  	if (err) {  		fdata_set_dead(data); @@ -1115,7 +1117,8 @@ fuse_internal_send_init(struct fuse_data *data, struct thread *td)  	 */  	fiii->flags = FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_EXPORT_SUPPORT  		| FUSE_BIG_WRITES | FUSE_WRITEBACK_CACHE -		| FUSE_NO_OPEN_SUPPORT | FUSE_NO_OPENDIR_SUPPORT; +		| FUSE_NO_OPEN_SUPPORT | FUSE_NO_OPENDIR_SUPPORT +		| FUSE_SETXATTR_EXT;  	fuse_insert_callback(fdi.tick, fuse_internal_init_callback);  	fuse_insert_message(fdi.tick, false); diff --git a/sys/fs/fuse/fuse_ipc.h b/sys/fs/fuse/fuse_ipc.h index 3bfc859dbac9..d9d79f38c269 100644 --- a/sys/fs/fuse/fuse_ipc.h +++ b/sys/fs/fuse/fuse_ipc.h @@ -243,6 +243,7 @@ struct fuse_data {  #define FSESS_MNTOPTS_MASK	( \  	FSESS_DAEMON_CAN_SPY | FSESS_PUSH_SYMLINKS_IN | \  	FSESS_DEFAULT_PERMISSIONS | FSESS_INTR) +#define	FSESS_SETXATTR_EXT	  0x8000000 /* extended fuse_setxattr_in */  extern int fuse_data_cache_mode; diff --git a/sys/fs/fuse/fuse_vnops.c b/sys/fs/fuse/fuse_vnops.c index 97aa23bfb0b0..6c79e646d2f3 100644 --- a/sys/fs/fuse/fuse_vnops.c +++ b/sys/fs/fuse/fuse_vnops.c @@ -2777,7 +2777,7 @@ fuse_vnop_setextattr(struct vop_setextattr_args *ap)  	    strlen(ap->a_name) + 1;  	/* older FUSE servers  use a smaller fuse_setxattr_in struct*/ -	if (fuse_libabi_geq(fuse_get_mpdata(mp), 7, 33)) +	if (fuse_get_mpdata(mp)->dataflags & FSESS_SETXATTR_EXT)  		struct_size = sizeof(*set_xattr_in);  	fdisp_init(&fdi, len + struct_size + uio->uio_resid); @@ -2786,7 +2786,7 @@ fuse_vnop_setextattr(struct vop_setextattr_args *ap)  	set_xattr_in = fdi.indata;  	set_xattr_in->size = uio->uio_resid; -	if (fuse_libabi_geq(fuse_get_mpdata(mp), 7, 33)) { +	if (fuse_get_mpdata(mp)->dataflags & FSESS_SETXATTR_EXT) {  		set_xattr_in->setxattr_flags = 0;  		set_xattr_in->padding = 0;  	} diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c index f580a394a735..707ad5749ab2 100644 --- a/sys/fs/nfs/nfs_commonsubs.c +++ b/sys/fs/nfs/nfs_commonsubs.c @@ -658,7 +658,7 @@ nfscl_fillsattr(struct nfsrv_descript *nd, struct vattr *vap,  			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMECREATE);  		(void) nfsv4_fillattr(nd, vp->v_mount, vp, NULL, vap, NULL, 0,  		    &attrbits, NULL, NULL, 0, 0, 0, 0, (uint64_t)0, NULL, -		    false, false, false, 0); +		    false, false, false, 0, NULL, false);  		break;  	}  } @@ -1706,11 +1706,18 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,  			attrsum += NFSX_UNSIGNED;  			break;  		case NFSATTRBIT_CASEINSENSITIVE: -			NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED); +			NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED);  			if (compare) {  				if (!(*retcmpp)) { -				    if (*tl != newnfs_false) -					*retcmpp = NFSERR_NOTSAME; +					if (vp == NULL || VOP_PATHCONF(vp, +					    _PC_CASE_INSENSITIVE, +					    &has_pathconf) != 0) +						has_pathconf = 0; +					if ((has_pathconf != 0 && +					     *tl != newnfs_true) || +					    (has_pathconf == 0 && +					    *tl != newnfs_false)) +						*retcmpp = NFSERR_NOTSAME;  				}  			} else if (pc != NULL) {  				pc->pc_caseinsensitive = @@ -2690,7 +2697,8 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount *mp, vnode_t vp,      nfsattrbit_t *attrbitp, struct ucred *cred, NFSPROC_T *p, int isdgram,      int reterr, int supports_nfsv4acls, int at_root, uint64_t mounted_on_fileno,      struct statfs *pnfssf, bool xattrsupp, bool has_hiddensystem, -    bool has_namedattr, uint32_t clone_blksize) +    bool has_namedattr, uint32_t clone_blksize, fsid_t *fsidp, +    bool has_caseinsensitive)  {  	int bitpos, retnum = 0;  	u_int32_t *tl; @@ -2865,10 +2873,12 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount *mp, vnode_t vp,  			break;  		case NFSATTRBIT_FSID:  			NFSM_BUILD(tl, u_int32_t *, NFSX_V4FSID); +			if (fsidp == NULL) +				fsidp = &mp->mnt_stat.f_fsid;  			*tl++ = 0; -			*tl++ = txdr_unsigned(mp->mnt_stat.f_fsid.val[0]); +			*tl++ = txdr_unsigned(fsidp->val[0]);  			*tl++ = 0; -			*tl = txdr_unsigned(mp->mnt_stat.f_fsid.val[1]); +			*tl = txdr_unsigned(fsidp->val[1]);  			retnum += NFSX_V4FSID;  			break;  		case NFSATTRBIT_UNIQUEHANDLES: @@ -2914,8 +2924,11 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount *mp, vnode_t vp,  			retnum += NFSX_UNSIGNED;  			break;  		case NFSATTRBIT_CASEINSENSITIVE: -			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED); -			*tl = newnfs_false; +			NFSM_BUILD(tl, uint32_t *, NFSX_UNSIGNED); +			if (has_caseinsensitive) +				*tl = newnfs_true; +			else +				*tl = newnfs_false;  			retnum += NFSX_UNSIGNED;  			break;  		case NFSATTRBIT_CASEPRESERVING: diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h index 16a76c060e78..7db3952ecf5c 100644 --- a/sys/fs/nfs/nfs_var.h +++ b/sys/fs/nfs/nfs_var.h @@ -398,7 +398,7 @@ void nfsrv_wcc(struct nfsrv_descript *, int, struct nfsvattr *, int,  int nfsv4_fillattr(struct nfsrv_descript *, struct mount *, vnode_t, NFSACL_T *,      struct vattr *, fhandle_t *, int, nfsattrbit_t *, struct ucred *,      NFSPROC_T *, int, int, int, int, uint64_t, struct statfs *, bool, bool, -    bool, uint32_t); +    bool, uint32_t, fsid_t *, bool);  void nfsrv_fillattr(struct nfsrv_descript *, struct nfsvattr *);  struct mbuf *nfsrv_adj(struct mbuf *, int, int);  void nfsrv_postopattr(struct nfsrv_descript *, int, struct nfsvattr *); @@ -740,7 +740,7 @@ int nfsvno_updfilerev(vnode_t, struct nfsvattr *, struct nfsrv_descript *,  int nfsvno_fillattr(struct nfsrv_descript *, struct mount *, vnode_t,      struct nfsvattr *, fhandle_t *, int, nfsattrbit_t *,      struct ucred *, NFSPROC_T *, int, int, int, int, uint64_t, bool, bool, -    bool, uint32_t); +    bool, uint32_t, bool);  int nfsrv_sattr(struct nfsrv_descript *, vnode_t, struct nfsvattr *, nfsattrbit_t *,      NFSACL_T *, NFSPROC_T *);  int nfsv4_sattr(struct nfsrv_descript *, vnode_t, struct nfsvattr *, nfsattrbit_t *, diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c index b61218958550..f5deef183efb 100644 --- a/sys/fs/nfsclient/nfs_clrpcops.c +++ b/sys/fs/nfsclient/nfs_clrpcops.c @@ -5452,7 +5452,7 @@ nfsrpc_setaclrpc(vnode_t vp, struct ucred *cred, NFSPROC_T *p,  	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_ACL);  	(void) nfsv4_fillattr(nd, vp->v_mount, vp, aclp, NULL, NULL, 0,  	    &attrbits, NULL, NULL, 0, 0, 0, 0, (uint64_t)0, NULL, false, false, -	    false, 0); +	    false, 0, NULL, false);  	error = nfscl_request(nd, vp, p, cred);  	if (error)  		return (error); diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c index aa9d01fc4632..712d49c7160c 100644 --- a/sys/fs/nfsclient/nfs_clstate.c +++ b/sys/fs/nfsclient/nfs_clstate.c @@ -3701,7 +3701,8 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)  			if (!error)  				(void) nfsv4_fillattr(nd, NULL, NULL, NULL, &va,  				    NULL, 0, &rattrbits, NULL, p, 0, 0, 0, 0, -				    (uint64_t)0, NULL, false, false, false, 0); +				    (uint64_t)0, NULL, false, false, false, 0, +				    NULL, false);  			break;  		case NFSV4OP_CBRECALL:  			NFSCL_DEBUG(4, "cbrecall\n"); diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c index f80cf30669ca..795a8d106051 100644 --- a/sys/fs/nfsclient/nfs_clvnops.c +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -4677,12 +4677,13 @@ nfs_pathconf(struct vop_pathconf_args *ap)  	clone_blksize = 0;  	if ((NFS_ISV34(vp) && (ap->a_name == _PC_LINK_MAX ||  	    ap->a_name == _PC_NAME_MAX || ap->a_name == _PC_CHOWN_RESTRICTED || -	    ap->a_name == _PC_NO_TRUNC)) || +	    ap->a_name == _PC_NO_TRUNC || +	    ap->a_name == _PC_CASE_INSENSITIVE)) ||  	    (NFS_ISV4(vp) && (ap->a_name == _PC_ACL_NFS4 ||  	     ap->a_name == _PC_HAS_NAMEDATTR ||  	     ap->a_name == _PC_CLONE_BLKSIZE))) {  		/* -		 * Since only the above 4 a_names are returned by the NFSv3 +		 * Since only the above 5 a_names are returned by the NFSv3  		 * Pathconf RPC, there is no point in doing it for others.  		 * For NFSv4, the Pathconf RPC (actually a Getattr Op.) can  		 * be used for _PC_ACL_NFS4, _PC_HAS_NAMEDATTR and @@ -4849,6 +4850,9 @@ nfs_pathconf(struct vop_pathconf_args *ap)  	case _PC_CLONE_BLKSIZE:  		*ap->a_retval = clone_blksize;  		break; +	case _PC_CASE_INSENSITIVE: +		*ap->a_retval = pc.pc_caseinsensitive; +		break;  	default:  		error = vop_stdpathconf(ap); diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 9fe3f4426124..841ec2315f1c 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -2114,7 +2114,7 @@ nfsvno_fillattr(struct nfsrv_descript *nd, struct mount *mp, struct vnode *vp,      struct ucred *cred, struct thread *p, int isdgram, int reterr,      int supports_nfsv4acls, int at_root, uint64_t mounted_on_fileno,      bool xattrsupp, bool has_hiddensystem, bool has_namedattr, -    uint32_t clone_blksize) +    uint32_t clone_blksize, bool has_caseinsensitive)  {  	struct statfs *sf;  	int error; @@ -2135,7 +2135,7 @@ nfsvno_fillattr(struct nfsrv_descript *nd, struct mount *mp, struct vnode *vp,  	error = nfsv4_fillattr(nd, mp, vp, NULL, &nvap->na_vattr, fhp, rderror,  	    attrbitp, cred, p, isdgram, reterr, supports_nfsv4acls, at_root,  	    mounted_on_fileno, sf, xattrsupp, has_hiddensystem, has_namedattr, -	    clone_blksize); +	    clone_blksize, NULL, has_caseinsensitive);  	free(sf, M_TEMP);  	NFSEXITCODE2(0, nd);  	return (error); @@ -2468,7 +2468,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,  	int bextpg0, bextpg1, bextpgsiz0, bextpgsiz1;  	size_t atsiz;  	long pathval; -	bool has_hiddensystem, has_namedattr, xattrsupp; +	bool has_caseinsensitive, has_hiddensystem, has_namedattr, xattrsupp;  	if (nd->nd_repstat) {  		nfsrv_postopattr(nd, getret, &at); @@ -2949,6 +2949,7 @@ ateof:  				xattrsupp = false;  				has_hiddensystem = false;  				has_namedattr = false; +				has_caseinsensitive = false;  				clone_blksize = 0;  				if (nvp != NULL) {  					supports_nfsv4acls = @@ -2978,6 +2979,11 @@ ateof:  					    &pathval) != 0)  						pathval = 0;  					clone_blksize = pathval; +					if (VOP_PATHCONF(nvp, +					    _PC_CASE_INSENSITIVE, +					    &pathval) != 0) +						pathval = 0; +					has_caseinsensitive = pathval > 0;  					NFSVOPUNLOCK(nvp);  				} else  					supports_nfsv4acls = 0; @@ -2999,7 +3005,7 @@ ateof:  					    supports_nfsv4acls, at_root,  					    mounted_on_fileno, xattrsupp,  					    has_hiddensystem, has_namedattr, -					    clone_blksize); +					    clone_blksize, has_caseinsensitive);  				} else {  					dirlen += nfsvno_fillattr(nd, new_mp,  					    nvp, nvap, &nfh, r, &attrbits, @@ -3007,7 +3013,7 @@ ateof:  					    supports_nfsv4acls, at_root,  					    mounted_on_fileno, xattrsupp,  					    has_hiddensystem, has_namedattr, -					    clone_blksize); +					    clone_blksize, has_caseinsensitive);  				}  				if (nvp != NULL)  					vrele(nvp); @@ -6405,7 +6411,7 @@ nfsrv_setacldsdorpc(fhandle_t *fhp, struct ucred *cred, NFSPROC_T *p,  	 * the same type (VREG).  	 */  	nfsv4_fillattr(nd, NULL, vp, aclp, NULL, NULL, 0, &attrbits, NULL, -	    NULL, 0, 0, 0, 0, 0, NULL, false, false, false, 0); +	    NULL, 0, 0, 0, 0, 0, NULL, false, false, false, 0, NULL, false);  	error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred,  	    NFS_PROG, NFS_VER4, NULL, 1, NULL, NULL);  	if (error != 0) { diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index 67af0cf71175..394b63c2ab07 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -252,7 +252,7 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,  	struct thread *p = curthread;  	size_t atsiz;  	long pathval; -	bool has_hiddensystem, has_namedattr, xattrsupp; +	bool has_caseinsensitive, has_hiddensystem, has_namedattr, xattrsupp;  	uint32_t clone_blksize;  	if (nd->nd_repstat) @@ -336,6 +336,10 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,  				    &pathval) != 0)  					pathval = 0;  				clone_blksize = pathval; +				if (VOP_PATHCONF(vp, _PC_CASE_INSENSITIVE, +				    &pathval) != 0) +					pathval = 0; +				has_caseinsensitive = pathval > 0;  				mp = vp->v_mount;  				if (nfsrv_enable_crossmntpt != 0 &&  				    vp->v_type == VDIR && @@ -371,7 +375,8 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,  					    isdgram, 1, supports_nfsv4acls,  					    at_root, mounted_on_fileno,  					    xattrsupp, has_hiddensystem, -					    has_namedattr, clone_blksize); +					    has_namedattr, clone_blksize, +					    has_caseinsensitive);  					vfs_unbusy(mp);  				}  				vrele(vp); diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index db0bc77a752f..a723d06334a0 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -734,6 +734,10 @@ g_dev_done(struct bio *bp2)  		g_trace(G_T_BIO, "g_dev_done(%p) had error %d",  		    bp2, bp2->bio_error);  		bp->bio_flags |= BIO_ERROR; +		if ((bp2->bio_flags & BIO_EXTERR) != 0) { +			bp->bio_flags |= BIO_EXTERR; +			bp->bio_exterr = bp2->bio_exterr; +		}  	} else {  		if (bp->bio_cmd == BIO_READ)  			KNOTE_UNLOCKED(&sc->sc_selinfo.si_note, NOTE_READ); diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c index 9dbf00371dba..b267130d1e0c 100644 --- a/sys/geom/geom_disk.c +++ b/sys/geom/geom_disk.c @@ -235,8 +235,14 @@ g_disk_done(struct bio *bp)  	bp2 = bp->bio_parent;  	binuptime(&now);  	mtx_lock(&sc->done_mtx); -	if (bp2->bio_error == 0) -		bp2->bio_error = bp->bio_error; +	if (bp2->bio_error == 0) { +		if ((bp->bio_flags & BIO_EXTERR) != 0) { +			bp2->bio_flags |= BIO_EXTERR; +			bp2->bio_exterr = bp->bio_exterr; +		} else { +			bp2->bio_error = bp->bio_error; +		} +	}  	bp2->bio_completed += bp->bio_length - bp->bio_resid;  	if (bp->bio_cmd == BIO_READ) diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index 2a6ce1ab6486..c70d55c6c321 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -1162,8 +1162,14 @@ g_std_done(struct bio *bp)  	struct bio *bp2;  	bp2 = bp->bio_parent; -	if (bp2->bio_error == 0) -		bp2->bio_error = bp->bio_error; +	if (bp2->bio_error == 0) { +		if ((bp->bio_flags & BIO_EXTERR) != 0) { +			bp2->bio_flags |= BIO_EXTERR; +			bp2->bio_exterr = bp->bio_exterr; +		} else { +			bp2->bio_error = bp->bio_error; +		} +	}  	bp2->bio_completed += bp->bio_completed;  	g_destroy_bio(bp);  	bp2->bio_inbed++; diff --git a/sys/geom/geom_vfs.c b/sys/geom/geom_vfs.c index 9b5e5a84191f..122e2f6a02ec 100644 --- a/sys/geom/geom_vfs.c +++ b/sys/geom/geom_vfs.c @@ -26,9 +26,11 @@   * SUCH DAMAGE.   */ +#define	EXTERR_CATEGORY	EXTERR_CAT_GEOMVFS  #include <sys/param.h>  #include <sys/systm.h>  #include <sys/bio.h> +#include <sys/exterrvar.h>  #include <sys/kernel.h>  #include <sys/lock.h>  #include <sys/malloc.h> @@ -156,10 +158,13 @@ g_vfs_done(struct bio *bip)  			    " suppressing further ENXIO");  		}  	} -	bp->b_error = bip->bio_error;  	bp->b_ioflags = bip->bio_flags;  	if (bip->bio_error)  		bp->b_ioflags |= BIO_ERROR; +	if ((bp->b_ioflags & BIO_EXTERR) != 0) +		bp->b_exterr = bip->bio_exterr; +	else +		bp->b_error = bip->bio_error;  	bp->b_resid = bp->b_bcount - bip->bio_completed;  	g_destroy_bio(bip); @@ -195,6 +200,8 @@ g_vfs_strategy(struct bufobj *bo, struct buf *bp)  		mtx_unlock(&sc->sc_mtx);  		bp->b_error = ENXIO;  		bp->b_ioflags |= BIO_ERROR; +		EXTERROR_KE(&bp->b_exterr, ENXIO, +		    "orphaned or enxio active");  		bufdone(bp);  		return;  	} diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 267b60ffb5bc..523b7e314a10 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -3047,6 +3047,8 @@ do_jail_attach(struct thread *td, struct prison *pr, int drflags)  	setsugid(p);  #ifdef RACCT  	racct_proc_ucred_changed(p, oldcred, newcred); +#endif +#ifdef RCTL  	crhold(newcred);  #endif  	PROC_UNLOCK(p); diff --git a/sys/kern/kern_loginclass.c b/sys/kern/kern_loginclass.c index 55db6c28a1db..0c111c4f78d8 100644 --- a/sys/kern/kern_loginclass.c +++ b/sys/kern/kern_loginclass.c @@ -225,6 +225,8 @@ sys_setloginclass(struct thread *td, struct setloginclass_args *uap)  	proc_set_cred(p, newcred);  #ifdef RACCT  	racct_proc_ucred_changed(p, oldcred, newcred); +#endif +#ifdef RCTL  	crhold(newcred);  #endif  	PROC_UNLOCK(p); diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c index a4c5bcc52529..3c145851b683 100644 --- a/sys/kern/kern_prot.c +++ b/sys/kern/kern_prot.c @@ -696,7 +696,7 @@ kern_setcred(struct thread *const td, const u_int flags,  	gid_t *groups = NULL;  	gid_t smallgroups[CRED_SMALLGROUPS_NB];  	int error; -	bool cred_set; +	bool cred_set = false;  	/* Bail out on unrecognized flags. */  	if (flags & ~SETCREDF_MASK) @@ -839,17 +839,32 @@ kern_setcred(struct thread *const td, const u_int flags,  	if (cred_set) {  		setsugid(p);  		to_free_cred = old_cred; +#ifdef RACCT +		racct_proc_ucred_changed(p, old_cred, new_cred); +#endif +#ifdef RCTL +		crhold(new_cred); +#endif  		MPASS(error == 0);  	} else  		error = EAGAIN;  unlock_finish:  	PROC_UNLOCK(p); +  	/*  	 * Part 3: After releasing the process lock, we perform cleanups and  	 * finishing operations.  	 */ +#ifdef RCTL +	if (cred_set) { +		rctl_proc_ucred_changed(p, new_cred); +		/* Paired with the crhold() just above. */ +		crfree(new_cred); +	} +#endif +  #ifdef MAC  	if (mac_set_proc_data != NULL)  		mac_set_proc_finish(td, proc_label_set, mac_set_proc_data); @@ -982,6 +997,8 @@ sys_setuid(struct thread *td, struct setuid_args *uap)  	proc_set_cred(p, newcred);  #ifdef RACCT  	racct_proc_ucred_changed(p, oldcred, newcred); +#endif +#ifdef RCTL  	crhold(newcred);  #endif  	PROC_UNLOCK(p); @@ -1390,6 +1407,8 @@ sys_setreuid(struct thread *td, struct setreuid_args *uap)  	proc_set_cred(p, newcred);  #ifdef RACCT  	racct_proc_ucred_changed(p, oldcred, newcred); +#endif +#ifdef RCTL  	crhold(newcred);  #endif  	PROC_UNLOCK(p); @@ -1536,6 +1555,8 @@ sys_setresuid(struct thread *td, struct setresuid_args *uap)  	proc_set_cred(p, newcred);  #ifdef RACCT  	racct_proc_ucred_changed(p, oldcred, newcred); +#endif +#ifdef RCTL  	crhold(newcred);  #endif  	PROC_UNLOCK(p); diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c index 2aab151aba08..17b64ad00bb5 100644 --- a/sys/kern/kern_racct.c +++ b/sys/kern/kern_racct.c @@ -1236,16 +1236,20 @@ racct_updatepcpu_containers(void)  	    racct_updatepcpu_post, NULL, NULL);  } +static bool +racct_proc_to_skip(const struct proc *p) +{ +	PROC_LOCK_ASSERT(p, MA_OWNED); +	return (p->p_state != PRS_NORMAL || (p->p_flag & P_IDLEPROC) != 0); +} +  static void  racctd(void)  {  	struct proc *p; -	struct proc *idle;  	ASSERT_RACCT_ENABLED(); -	idle = STAILQ_FIRST(&cpuhead)->pc_idlethread->td_proc; -  	for (;;) {  		racct_decay(); @@ -1253,12 +1257,7 @@ racctd(void)  		FOREACH_PROC_IN_SYSTEM(p) {  			PROC_LOCK(p); -			if (p == idle) { -				PROC_UNLOCK(p); -				continue; -			} -			if (p->p_state != PRS_NORMAL || -			    (p->p_flag & P_IDLEPROC) != 0) { +			if (racct_proc_to_skip(p)) {  				PROC_UNLOCK(p);  				continue;  			} @@ -1284,7 +1283,7 @@ racctd(void)  		 */  		FOREACH_PROC_IN_SYSTEM(p) {  			PROC_LOCK(p); -			if (p->p_state != PRS_NORMAL) { +			if (racct_proc_to_skip(p)) {  				PROC_UNLOCK(p);  				continue;  			} diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c index d5b3b62f0821..48896529f685 100644 --- a/sys/kern/subr_syscall.c +++ b/sys/kern/subr_syscall.c @@ -55,8 +55,8 @@ syscallenter(struct thread *td)  	struct proc *p;  	struct syscall_args *sa;  	struct sysent *se; -	int error, traced; -	bool sy_thr_static; +	int error; +	bool sy_thr_static, traced;  	VM_CNT_INC(v_syscall);  	p = td->td_proc; @@ -219,7 +219,7 @@ syscallret(struct thread *td)  	struct proc *p;  	struct syscall_args *sa;  	ksiginfo_t ksi; -	int traced; +	bool traced;  	KASSERT(td->td_errno != ERELOOKUP,  	    ("ERELOOKUP not consumed syscall %d", td->td_sa.code)); @@ -250,9 +250,9 @@ syscallret(struct thread *td)  	}  #endif -	traced = 0; +	traced = false;  	if (__predict_false(p->p_flag & P_TRACED)) { -		traced = 1; +		traced = true;  		PROC_LOCK(p);  		td->td_dbgflags |= TDB_SCX;  		PROC_UNLOCK(p); diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 7d666da9f88b..a61341df436c 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -2345,3 +2345,22 @@ exterr_set(int eerror, int category, const char *mmsg, uintptr_t pp1,  	}  	return (eerror);  } + +int +exterr_set_from(const struct kexterr *ke) +{ +	struct thread *td; + +	td = curthread; +	if ((td->td_pflags2 & TDP2_UEXTERR) != 0) { +		td->td_pflags2 |= TDP2_EXTERR; +		td->td_kexterr = *ke; +	} +	return (td->td_kexterr.error); +} + +void +exterr_clear(struct kexterr *ke) +{ +	memset(ke, 0, sizeof(*ke)); +} diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 60916a9fbd32..02d4b8426757 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -2487,7 +2487,7 @@ aio_biowakeup(struct bio *bp)  	long bcount = bp->bio_bcount;  	long resid = bp->bio_resid;  	int opcode, nblks; -	int bio_error = bp->bio_error; +	int abio_error = bp->bio_error;  	uint16_t flags = bp->bio_flags;  	opcode = job->uaiocb.aio_lio_opcode; @@ -2503,16 +2503,16 @@ aio_biowakeup(struct bio *bp)  	 * error of whichever failed bio completed last.  	 */  	if (flags & BIO_ERROR) -		atomic_store_int(&job->error, bio_error); +		atomic_store_int(&job->error, abio_error);  	if (opcode & LIO_WRITE)  		atomic_add_int(&job->outblock, nblks);  	else  		atomic_add_int(&job->inblock, nblks);  	if (refcount_release(&job->nbio)) { -		bio_error = atomic_load_int(&job->error); -		if (bio_error != 0) -			aio_complete(job, -1, bio_error); +		abio_error = atomic_load_int(&job->error); +		if (abio_error != 0) +			aio_complete(job, -1, abio_error);  		else  			aio_complete(job, atomic_load_long(&job->nbytes), 0);  	} diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 19c39e42bafa..22b7fe8d059a 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -44,6 +44,7 @@   * see man buf(9) for more info.   */ +#define	EXTERR_CATEGORY	EXTERR_CAT_VFSBIO  #include <sys/param.h>  #include <sys/systm.h>  #include <sys/asan.h> @@ -55,6 +56,7 @@  #include <sys/counter.h>  #include <sys/devicestat.h>  #include <sys/eventhandler.h> +#include <sys/exterrvar.h>  #include <sys/fail.h>  #include <sys/ktr.h>  #include <sys/limits.h> @@ -1775,7 +1777,6 @@ buf_alloc(struct bufdomain *bd)  	bp->b_blkno = bp->b_lblkno = 0;  	bp->b_offset = NOOFFSET;  	bp->b_iodone = 0; -	bp->b_error = 0;  	bp->b_resid = 0;  	bp->b_bcount = 0;  	bp->b_npages = 0; @@ -1785,6 +1786,7 @@ buf_alloc(struct bufdomain *bd)  	bp->b_fsprivate1 = NULL;  	bp->b_fsprivate2 = NULL;  	bp->b_fsprivate3 = NULL; +	exterr_clear(&bp->b_exterr);  	LIST_INIT(&bp->b_dep);  	return (bp); @@ -2276,7 +2278,7 @@ breadn_flags(struct vnode *vp, daddr_t blkno, daddr_t dblkno, int size,  		}  		if ((flags & GB_CVTENXIO) != 0)  			bp->b_xflags |= BX_CVTENXIO; -		bp->b_ioflags &= ~BIO_ERROR; +		bp->b_ioflags &= ~(BIO_ERROR | BIO_EXTERR);  		if (bp->b_rcred == NOCRED && cred != NOCRED)  			bp->b_rcred = crhold(cred);  		vfs_busy_pages(bp, 0); @@ -2353,7 +2355,7 @@ bufwrite(struct buf *bp)  	bundirty(bp);  	bp->b_flags &= ~B_DONE; -	bp->b_ioflags &= ~BIO_ERROR; +	bp->b_ioflags &= ~(BIO_ERROR | BIO_EXTERR);  	bp->b_flags |= B_CACHE;  	bp->b_iocmd = BIO_WRITE; @@ -4520,8 +4522,11 @@ biowait(struct bio *bp, const char *wmesg)  	while ((bp->bio_flags & BIO_DONE) == 0)  		msleep(bp, mtxp, PRIBIO, wmesg, 0);  	mtx_unlock(mtxp); -	if (bp->bio_error != 0) +	if (bp->bio_error != 0) { +		if ((bp->bio_flags & BIO_EXTERR) != 0) +			return (exterr_set_from(&bp->bio_exterr));  		return (bp->bio_error); +	}  	if (!(bp->bio_flags & BIO_ERROR))  		return (0);  	return (EIO); @@ -4568,6 +4573,8 @@ bufwait(struct buf *bp)  		return (EINTR);  	}  	if (bp->b_ioflags & BIO_ERROR) { +		if ((bp->b_ioflags & BIO_EXTERR) != 0) +			exterr_set_from(&bp->b_exterr);  		return (bp->b_error ? bp->b_error : EIO);  	} else {  		return (0); diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 712ff28768dc..b7dae78fb2c2 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -3058,143 +3058,7 @@ db_print_inconninfo(struct in_conninfo *inc, const char *name, int indent)  	    ntohs(inc->inc_fport));  } -static void -db_print_inpflags(int inp_flags) -{ -	int comma; - -	comma = 0; -	if (inp_flags & INP_RECVOPTS) { -		db_printf("%sINP_RECVOPTS", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_RECVRETOPTS) { -		db_printf("%sINP_RECVRETOPTS", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_RECVDSTADDR) { -		db_printf("%sINP_RECVDSTADDR", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_ORIGDSTADDR) { -		db_printf("%sINP_ORIGDSTADDR", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_HDRINCL) { -		db_printf("%sINP_HDRINCL", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_HIGHPORT) { -		db_printf("%sINP_HIGHPORT", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_LOWPORT) { -		db_printf("%sINP_LOWPORT", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_ANONPORT) { -		db_printf("%sINP_ANONPORT", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_RECVIF) { -		db_printf("%sINP_RECVIF", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_MTUDISC) { -		db_printf("%sINP_MTUDISC", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_RECVTTL) { -		db_printf("%sINP_RECVTTL", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_DONTFRAG) { -		db_printf("%sINP_DONTFRAG", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_RECVTOS) { -		db_printf("%sINP_RECVTOS", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_IPV6_V6ONLY) { -		db_printf("%sIN6P_IPV6_V6ONLY", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_PKTINFO) { -		db_printf("%sIN6P_PKTINFO", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_HOPLIMIT) { -		db_printf("%sIN6P_HOPLIMIT", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_HOPOPTS) { -		db_printf("%sIN6P_HOPOPTS", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_DSTOPTS) { -		db_printf("%sIN6P_DSTOPTS", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_RTHDR) { -		db_printf("%sIN6P_RTHDR", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_RTHDRDSTOPTS) { -		db_printf("%sIN6P_RTHDRDSTOPTS", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_TCLASS) { -		db_printf("%sIN6P_TCLASS", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_AUTOFLOWLABEL) { -		db_printf("%sIN6P_AUTOFLOWLABEL", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & INP_ONESBCAST) { -		db_printf("%sINP_ONESBCAST", comma ? ", " : ""); -		comma  = 1; -	} -	if (inp_flags & INP_DROPPED) { -		db_printf("%sINP_DROPPED", comma ? ", " : ""); -		comma  = 1; -	} -	if (inp_flags & INP_SOCKREF) { -		db_printf("%sINP_SOCKREF", comma ? ", " : ""); -		comma  = 1; -	} -	if (inp_flags & IN6P_RFC2292) { -		db_printf("%sIN6P_RFC2292", comma ? ", " : ""); -		comma = 1; -	} -	if (inp_flags & IN6P_MTU) { -		db_printf("IN6P_MTU%s", comma ? ", " : ""); -		comma = 1; -	} -} - -static void -db_print_inpvflag(u_char inp_vflag) -{ -	int comma; - -	comma = 0; -	if (inp_vflag & INP_IPV4) { -		db_printf("%sINP_IPV4", comma ? ", " : ""); -		comma  = 1; -	} -	if (inp_vflag & INP_IPV6) { -		db_printf("%sINP_IPV6", comma ? ", " : ""); -		comma  = 1; -	} -	if (inp_vflag & INP_IPV6PROTO) { -		db_printf("%sINP_IPV6PROTO", comma ? ", " : ""); -		comma  = 1; -	} -} - -static void +void  db_print_inpcb(struct inpcb *inp, const char *name, int indent)  { @@ -3204,38 +3068,39 @@ db_print_inpcb(struct inpcb *inp, const char *name, int indent)  	indent += 2;  	db_print_indent(indent); -	db_printf("inp_flow: 0x%x\n", inp->inp_flow); +	db_printf("inp_flow: 0x%x   inp_label: %p\n", inp->inp_flow, +	    inp->inp_label);  	db_print_inconninfo(&inp->inp_inc, "inp_conninfo", indent);  	db_print_indent(indent); -	db_printf("inp_label: %p   inp_flags: 0x%x (", -	   inp->inp_label, inp->inp_flags); -	db_print_inpflags(inp->inp_flags); -	db_printf(")\n"); +	db_printf("inp_flags: 0x%b\n", inp->inp_flags, INP_FLAGS_BITS);  	db_print_indent(indent); -	db_printf("inp_sp: %p   inp_vflag: 0x%x (", inp->inp_sp, -	    inp->inp_vflag); -	db_print_inpvflag(inp->inp_vflag); -	db_printf(")\n"); +	db_printf("inp_flags2: 0x%b\n", inp->inp_flags2, INP_FLAGS2_BITS); + +	db_print_indent(indent); +	db_printf("inp_sp: %p   inp_vflag: 0x%b\n", inp->inp_sp, +	    inp->inp_vflag, INP_VFLAGS_BITS);  	db_print_indent(indent);  	db_printf("inp_ip_ttl: %d   inp_ip_p: %d   inp_ip_minttl: %d\n",  	    inp->inp_ip_ttl, inp->inp_ip_p, inp->inp_ip_minttl); -	db_print_indent(indent);  #ifdef INET6  	if (inp->inp_vflag & INP_IPV6) { +		db_print_indent(indent);  		db_printf("in6p_options: %p   in6p_outputopts: %p   "  		    "in6p_moptions: %p\n", inp->in6p_options,  		    inp->in6p_outputopts, inp->in6p_moptions); +		db_print_indent(indent);  		db_printf("in6p_icmp6filt: %p   in6p_cksum %d   "  		    "in6p_hops %u\n", inp->in6p_icmp6filt, inp->in6p_cksum,  		    inp->in6p_hops);  	} else  #endif  	{ +		db_print_indent(indent);  		db_printf("inp_ip_tos: %d   inp_ip_options: %p   "  		    "inp_ip_moptions: %p\n", inp->inp_ip_tos,  		    inp->inp_options, inp->inp_moptions); diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h index 9e0618e87601..975b8129c70d 100644 --- a/sys/netinet/in_pcb.h +++ b/sys/netinet/in_pcb.h @@ -539,6 +539,9 @@ void 	inp_4tuple_get(struct inpcb *inp, uint32_t *laddr, uint16_t *lp,  #define	INP_IPV6	0x2  #define	INP_IPV6PROTO	0x4		/* opened under IPv6 protocol */ +/* inp_vflags description for use with printf(9) %b identifier. */ +#define	INP_VFLAGS_BITS	"\20\1INP_IPV4\2INP_IPV6\3INP_IPV6PROTO" +  /*   * Flags for inp_flags.   */ @@ -582,6 +585,17 @@ void 	inp_4tuple_get(struct inpcb *inp, uint32_t *laddr, uint16_t *lp,  				 IN6P_TCLASS|IN6P_AUTOFLOWLABEL|IN6P_RFC2292|\  				 IN6P_MTU) +/* inp_flags description for use with printf(9) %b identifier. */ +#define	INP_FLAGS_BITS	"\20" \ +    "\1INP_RECVOPTS\2INP_RECVRETOPTS\3INP_RECVDSTADDR\4INP_HDRINCL" \ +    "\5INP_HIGHPORT\6INP_LOWPORT\7INP_ANONPORT\10INP_RECVIF" \ +    "\11INP_MTUDISC\12INP_FREED\13INP_RECVTTL\14INP_DONTFRAG" \ +    "\15INP_BINDANY\16INP_INHASHLIST\17INP_RECVTOS\20IN6P_IPV6_V6ONLY" \ +    "\21IN6P_PKTINFO\22IN6P_HOPLIMIT\23IN6P_HOPOPTS\24IN6P_DSTOPTS" \ +    "\25IN6P_RTHDR\26IN6P_RTHDRDSTOPTS\27IN6P_TCLASS\30IN6P_AUTOFLOWLABEL" \ +    "\31INP_INLBGROUP\32INP_ONESBCAST\33INP_DROPPED\34INP_SOCKREF" \ +    "\35INP_RESERVED_0\36INP_BOUNDFIB\37IN6P_RFC2292\40IN6P_MTU" +  /*   * Flags for inp_flags2.   */ @@ -610,6 +624,13 @@ void 	inp_4tuple_get(struct inpcb *inp, uint32_t *laddr, uint16_t *lp,  #define INP_2PCP_MASK	(INP_2PCP_BIT0 | INP_2PCP_BIT1 | INP_2PCP_BIT2)  #define INP_2PCP_SHIFT		18         /* shift PCP field in/out of inp_flags2 */ +/* inp_flags2 description for use with printf(9) %b identifier. */ +#define	INP_FLAGS2_BITS	"\20" \ +    "\11INP_RECVFLOWID\12INP_RECVRSSBUCKETID" \ +    "\13INP_RATE_LIMIT_CHANGED\14INP_ORIGDSTADDR" \ +    "\22INP_2PCP_SET\23INP_2PCP_BIT0\24INP_2PCP_BIT1" \ +    "\25INP_2PCP_BIT2" +  /*   * Flags passed to in_pcblookup*(), inp_smr_lock() and inp_next().   */ @@ -730,6 +751,9 @@ int	in_pcbquery_txrlevel(struct inpcb *, uint32_t *);  void	in_pcboutput_txrtlmt(struct inpcb *, struct ifnet *, struct mbuf *);  void	in_pcboutput_eagain(struct inpcb *);  #endif +#ifdef DDB +void	db_print_inpcb(struct inpcb *, const char *, int); +#endif  #endif /* _KERNEL */  #endif /* !_NETINET_IN_PCB_H_ */ diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 2146b0cac48f..9c58c2815d13 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1192,11 +1192,10 @@ tfo_socket_result:  		if (thflags & TH_ACK) {  			if ((s = tcp_log_addrs(&inc, th, NULL, NULL)))  				log(LOG_DEBUG, "%s; %s: Listen socket: " -				    "SYN|ACK invalid, segment rejected\n", +				    "SYN|ACK invalid, segment ignored\n",  				    s, __func__); -			syncache_badack(&inc, port);	/* XXX: Not needed! */  			TCPSTAT_INC(tcps_badsyn); -			goto dropwithreset; +			goto dropunlock;  		}  		/*  		 * If the drop_synfin option is enabled, drop all diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c index 3a7755e9f09e..fa7035771714 100644 --- a/sys/netinet/tcp_syncache.c +++ b/sys/netinet/tcp_syncache.c @@ -713,23 +713,6 @@ done:  }  void -syncache_badack(struct in_conninfo *inc, uint16_t port) -{ -	struct syncache *sc; -	struct syncache_head *sch; - -	if (syncache_cookiesonly()) -		return; -	sc = syncache_lookup(inc, &sch);	/* returns locked sch */ -	SCH_LOCK_ASSERT(sch); -	if ((sc != NULL) && (sc->sc_port == port)) { -		syncache_drop(sc, sch); -		TCPSTAT_INC(tcps_sc_badack); -	} -	SCH_UNLOCK(sch); -} - -void  syncache_unreach(struct in_conninfo *inc, tcp_seq th_seq, uint16_t port)  {  	struct syncache *sc; diff --git a/sys/netinet/tcp_syncache.h b/sys/netinet/tcp_syncache.h index 37f6ff3d6ca9..c916b4de6ae0 100644 --- a/sys/netinet/tcp_syncache.h +++ b/sys/netinet/tcp_syncache.h @@ -45,7 +45,6 @@ struct socket *	 syncache_add(struct in_conninfo *, struct tcpopt *,  	     void *, void *, uint8_t, uint16_t);  void	 syncache_chkrst(struct in_conninfo *, struct tcphdr *, struct mbuf *,  	     uint16_t); -void	 syncache_badack(struct in_conninfo *, uint16_t);  int	 syncache_pcblist(struct sysctl_req *);  struct syncache { diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 98c934955121..4d1a6455d09e 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -2799,258 +2799,6 @@ db_print_tstate(int t_state)  }  static void -db_print_tflags(u_int t_flags) -{ -	int comma; - -	comma = 0; -	if (t_flags & TF_ACKNOW) { -		db_printf("%sTF_ACKNOW", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_DELACK) { -		db_printf("%sTF_DELACK", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_NODELAY) { -		db_printf("%sTF_NODELAY", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_NOOPT) { -		db_printf("%sTF_NOOPT", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_SENTFIN) { -		db_printf("%sTF_SENTFIN", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_REQ_SCALE) { -		db_printf("%sTF_REQ_SCALE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_RCVD_SCALE) { -		db_printf("%sTF_RECVD_SCALE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_REQ_TSTMP) { -		db_printf("%sTF_REQ_TSTMP", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_RCVD_TSTMP) { -		db_printf("%sTF_RCVD_TSTMP", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_SACK_PERMIT) { -		db_printf("%sTF_SACK_PERMIT", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_NEEDSYN) { -		db_printf("%sTF_NEEDSYN", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_NEEDFIN) { -		db_printf("%sTF_NEEDFIN", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_NOPUSH) { -		db_printf("%sTF_NOPUSH", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_PREVVALID) { -		db_printf("%sTF_PREVVALID", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_WAKESOR) { -		db_printf("%sTF_WAKESOR", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_GPUTINPROG) { -		db_printf("%sTF_GPUTINPROG", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_MORETOCOME) { -		db_printf("%sTF_MORETOCOME", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_SONOTCONN) { -		db_printf("%sTF_SONOTCONN", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_LASTIDLE) { -		db_printf("%sTF_LASTIDLE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_RXWIN0SENT) { -		db_printf("%sTF_RXWIN0SENT", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_FASTRECOVERY) { -		db_printf("%sTF_FASTRECOVERY", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_WASFRECOVERY) { -		db_printf("%sTF_WASFRECOVERY", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_SIGNATURE) { -		db_printf("%sTF_SIGNATURE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_FORCEDATA) { -		db_printf("%sTF_FORCEDATA", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_TSO) { -		db_printf("%sTF_TSO", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_TOE) { -		db_printf("%sTF_TOE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_CLOSED) { -		db_printf("%sTF_CLOSED", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_SENTSYN) { -		db_printf("%sTF_SENTSYN", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_LRD) { -		db_printf("%sTF_LRD", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_CONGRECOVERY) { -		db_printf("%sTF_CONGRECOVERY", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_WASCRECOVERY) { -		db_printf("%sTF_WASCRECOVERY", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags & TF_FASTOPEN) { -		db_printf("%sTF_FASTOPEN", comma ? ", " : ""); -		comma = 1; -	} -} - -static void -db_print_tflags2(u_int t_flags2) -{ -	int comma; - -	comma = 0; -	if (t_flags2 & TF2_PLPMTU_BLACKHOLE) { -		db_printf("%sTF2_PLPMTU_BLACKHOLE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_PLPMTU_PMTUD) { -		db_printf("%sTF2_PLPMTU_PMTUD", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_PLPMTU_MAXSEGSNT) { -		db_printf("%sTF2_PLPMTU_MAXSEGSNT", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_LOG_AUTO) { -		db_printf("%sTF2_LOG_AUTO", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_DROP_AF_DATA) { -		db_printf("%sTF2_DROP_AF_DATA", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_ECN_PERMIT) { -		db_printf("%sTF2_ECN_PERMIT", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_ECN_SND_CWR) { -		db_printf("%sTF2_ECN_SND_CWR", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_ECN_SND_ECE) { -		db_printf("%sTF2_ECN_SND_ECE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_ACE_PERMIT) { -		db_printf("%sTF2_ACE_PERMIT", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_HPTS_CPU_SET) { -		db_printf("%sTF2_HPTS_CPU_SET", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_FBYTES_COMPLETE) { -		db_printf("%sTF2_FBYTES_COMPLETE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_ECN_USE_ECT1) { -		db_printf("%sTF2_ECN_USE_ECT1", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_TCP_ACCOUNTING) { -		db_printf("%sTF2_TCP_ACCOUNTING", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_HPTS_CALLS) { -		db_printf("%sTF2_HPTS_CALLS", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_MBUF_L_ACKS) { -		db_printf("%sTF2_MBUF_L_ACKS", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_MBUF_ACKCMP) { -		db_printf("%sTF2_MBUF_ACKCMP", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_SUPPORTS_MBUFQ) { -		db_printf("%sTF2_SUPPORTS_MBUFQ", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_MBUF_QUEUE_READY) { -		db_printf("%sTF2_MBUF_QUEUE_READY", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_DONT_SACK_QUEUE) { -		db_printf("%sTF2_DONT_SACK_QUEUE", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_CANNOT_DO_ECN) { -		db_printf("%sTF2_CANNOT_DO_ECN", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_PROC_SACK_PROHIBIT) { -		db_printf("%sTF2_PROC_SACK_PROHIBIT", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_IPSEC_TSO) { -		db_printf("%sTF2_IPSEC_TSO", comma ? ", " : ""); -		comma = 1; -	} -	if (t_flags2 & TF2_NO_ISS_CHECK) { -		db_printf("%sTF2_NO_ISS_CHECK", comma ? ", " : ""); -		comma = 1; -	} -} - -static void -db_print_toobflags(char t_oobflags) -{ -	int comma; - -	comma = 0; -	if (t_oobflags & TCPOOB_HAVEDATA) { -		db_printf("%sTCPOOB_HAVEDATA", comma ? ", " : ""); -		comma = 1; -	} -	if (t_oobflags & TCPOOB_HADDATA) { -		db_printf("%sTCPOOB_HADDATA", comma ? ", " : ""); -		comma = 1; -	} -} - -static void  db_print_bblog_state(int state)  {  	switch (state) { @@ -3088,7 +2836,8 @@ db_print_bblog_state(int state)  }  static void -db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog) +db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog, +    bool show_inpcb)  {  	db_print_indent(indent); @@ -3096,6 +2845,9 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog)  	indent += 2; +	if (show_inpcb) +		db_print_inpcb(tptoinpcb(tp), "t_inpcb", indent); +  	db_print_indent(indent);  	db_printf("t_segq first: %p   t_segqlen: %d   t_dupacks: %d\n",  	   TAILQ_FIRST(&tp->t_segq), tp->t_segqlen, tp->t_dupacks); @@ -3110,14 +2862,10 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog)  	db_printf(")\n");  	db_print_indent(indent); -	db_printf("t_flags: 0x%x (", tp->t_flags); -	db_print_tflags(tp->t_flags); -	db_printf(")\n"); +	db_printf("t_flags: 0x%b\n", tp->t_flags, TF_BITS);  	db_print_indent(indent); -	db_printf("t_flags2: 0x%x (", tp->t_flags2); -	db_print_tflags2(tp->t_flags2); -	db_printf(")\n"); +	db_printf("t_flags2: 0x%b\n", tp->t_flags2, TF2_BITS);  	db_print_indent(indent);  	db_printf("snd_una: 0x%08x   snd_max: 0x%08x   snd_nxt: 0x%08x\n", @@ -3164,9 +2912,8 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog)  	    tp->t_rttupdated, tp->max_sndwnd, tp->t_softerror);  	db_print_indent(indent); -	db_printf("t_oobflags: 0x%x (", tp->t_oobflags); -	db_print_toobflags(tp->t_oobflags); -	db_printf(")   t_iobc: 0x%02x\n", tp->t_iobc); +	db_printf("t_oobflags: 0x%b   t_iobc: 0x%02x\n", tp->t_oobflags, +	    TCPOOB_BITS, tp->t_iobc);  	db_print_indent(indent);  	db_printf("snd_scale: %u   rcv_scale: %u   request_r_scale: %u\n", @@ -3227,33 +2974,36 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog)  DB_SHOW_COMMAND(tcpcb, db_show_tcpcb)  {  	struct tcpcb *tp; -	bool show_bblog; +	bool show_bblog, show_inpcb;  	if (!have_addr) { -		db_printf("usage: show tcpcb <addr>\n"); +		db_printf("usage: show tcpcb[/bi] <addr>\n");  		return;  	}  	show_bblog = strchr(modif, 'b') != NULL; +	show_inpcb = strchr(modif, 'i') != NULL;  	tp = (struct tcpcb *)addr; - -	db_print_tcpcb(tp, "tcpcb", 0, show_bblog); +	db_print_tcpcb(tp, "tcpcb", 0, show_bblog, show_inpcb);  }  DB_SHOW_ALL_COMMAND(tcpcbs, db_show_all_tcpcbs)  {  	VNET_ITERATOR_DECL(vnet_iter);  	struct inpcb *inp; -	bool only_locked, show_bblog; +	struct tcpcb *tp; +	bool only_locked, show_bblog, show_inpcb;  	only_locked = strchr(modif, 'l') != NULL;  	show_bblog = strchr(modif, 'b') != NULL; +	show_inpcb = strchr(modif, 'i') != NULL;  	VNET_FOREACH(vnet_iter) {  		CURVNET_SET(vnet_iter);  		CK_LIST_FOREACH(inp, &V_tcbinfo.ipi_listhead, inp_list) {  			if (only_locked &&  			    inp->inp_lock.rw_lock == RW_UNLOCKED)  				continue; -			db_print_tcpcb(intotcpcb(inp), "tcpcb", 0, show_bblog); +			tp = intotcpcb(inp); +			db_print_tcpcb(tp, "tcpcb", 0, show_bblog, show_inpcb);  			if (db_pager_quit)  				break;  		} diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index c3be95c80798..f9297be46af7 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -795,6 +795,17 @@ tcp_packets_this_ack(struct tcpcb *tp, tcp_seq ack)  #define	TF_WASCRECOVERY	0x40000000	/* was in congestion recovery */  #define	TF_FASTOPEN	0x80000000	/* TCP Fast Open indication */ +/* t_flags description for use with printf(9) %b identifier. */ +#define	TF_BITS	"\20" \ +    "\1TF_ACKNOW\2TF_DELACK\3TF_NODELAY\4TF_NOOPT" \ +    "\5TF_SENTFIN\6TF_REQ_SCALE\7TF_RCVD_SCALE\10TF_REQ_TSTMP" \ +    "\11TF_RCVD_TSTMP\12TF_SACK_PERMIT\13TF_NEEDSYN\14TF_NEEDFIN" \ +    "\15TF_NOPUSH\16TF_PREVVALID\17TF_WAKESOR\20TF_GPUTINPROG" \ +    "\21TF_MORETOCOME\22TF_SONOTCONN\23TF_LASTIDLE\24TF_RXWIN0SENT" \ +    "\25TF_FASTRECOVERY\26TF_WASFRECOVERY\27TF_SIGNATURE\30TF_FORCEDATA" \ +    "\31TF_TSO\32TF_TOE\33TF_CLOSED\34TF_SENTSYN" \ +    "\35TF_LRD\36TF_CONGRECOVERY\37TF_WASCRECOVERY\40TF_FASTOPEN" +  #define	IN_FASTRECOVERY(t_flags)	(t_flags & TF_FASTRECOVERY)  #define	ENTER_FASTRECOVERY(t_flags)	t_flags |= TF_FASTRECOVERY  #define	EXIT_FASTRECOVERY(t_flags)	t_flags &= ~TF_FASTRECOVERY @@ -815,6 +826,9 @@ tcp_packets_this_ack(struct tcpcb *tp, tcp_seq ack)  #define	TCPOOB_HAVEDATA	0x01  #define	TCPOOB_HADDATA	0x02 +/* t_oobflags description for use with printf(9) %b identifier. */ +#define	TCPOOB_BITS	"\20\1TCPOOB_HAVEDATA\2TCPOOB_HADDATA" +  /*   * Flags for the extended TCP flags field, t_flags2   */ @@ -842,6 +856,21 @@ tcp_packets_this_ack(struct tcpcb *tp, tcp_seq ack)  #define	TF2_IPSEC_TSO		0x00200000 /* IPSEC + TSO supported */  #define	TF2_NO_ISS_CHECK	0x00400000 /* Don't check SEG.ACK against ISS */ +/* t_flags2 description for use with printf(9) %b identifier. */ +#define	TF2_BITS	"\20" \ +    "\1TF2_PLPMTU_BLACKHOLE\2TF2_PLPMTU_PMTUD" \ +    "\3TF2_PLPMTU_MAXSEGSNT\4TF2_LOG_AUTO" \ +    "\5TF2_DROP_AF_DATA\6TF2_ECN_PERMIT" \ +    "\7TF2_ECN_SND_CWR\10TF2_ECN_SND_ECE" \ +    "\11TF2_ACE_PERMIT\12TF2_HPTS_CPU_SET" \ +    "\13TF2_FBYTES_COMPLETE\14TF2_ECN_USE_ECT1" \ +    "\15TF2_TCP_ACCOUNTING\16TF2_HPTS_CALLS" \ +    "\17TF2_MBUF_L_ACKS\20TF2_MBUF_ACKCMP" \ +    "\21TF2_SUPPORTS_MBUFQ\22TF2_MBUF_QUEUE_READY" \ +    "\23TF2_DONT_SACK_QUEUE\24TF2_CANNOT_DO_ECN" \ +    "\25TF2_PROC_SACK_PROHIBIT\26TF2_IPSEC_TSO" \ +    "\27TF2_NO_ISS_CHECK" +  /*   * Structure to hold TCP options that are only used during segment   * processing (in tcp_input), but not held in the tcpcb. diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c index a825658bd9ee..5dfe48908a4f 100644 --- a/sys/netinet6/mld6.c +++ b/sys/netinet6/mld6.c @@ -3267,6 +3267,7 @@ mld_init(void *unused __unused)  	mld_po.ip6po_hbh = &mld_ra.hbh;  	mld_po.ip6po_prefer_tempaddr = IP6PO_TEMPADDR_NOTPREFER;  	mld_po.ip6po_flags = IP6PO_DONTFRAG; +	mld_po.ip6po_valid = IP6PO_VALID_HLIM | IP6PO_VALID_HBH;  	callout_init(&mldslow_callout, 1);  	callout_reset(&mldslow_callout, hz / MLD_SLOWHZ, mld_slowtimo, NULL); diff --git a/sys/netpfil/ipfw/pmod/tcpmod.c b/sys/netpfil/ipfw/pmod/tcpmod.c index 0338dc792c64..50074ee98cca 100644 --- a/sys/netpfil/ipfw/pmod/tcpmod.c +++ b/sys/netpfil/ipfw/pmod/tcpmod.c @@ -57,7 +57,8 @@ VNET_DEFINE_STATIC(uint32_t, tcpmod_setmss_eid) = 0;  #define	V_tcpmod_setmss_eid	VNET(tcpmod_setmss_eid)  static int -tcpmod_setmss(struct mbuf **mp, struct tcphdr *tcp, int tlen, uint16_t mss) +tcpmod_setmss(struct mbuf **mp, struct tcphdr *tcp, int tlen, uint16_t mss, +    int *done)  {  	struct mbuf *m;  	u_char *cp; @@ -72,8 +73,10 @@ tcpmod_setmss(struct mbuf **mp, struct tcphdr *tcp, int tlen, uint16_t mss)  		 * TCP header with options.  		 */  		*mp = m = m_pullup(m, m->m_pkthdr.len); -		if (m == NULL) +		if (m == NULL) { +			*done = 1;  			return (ret); +		}  	}  	/* Parse TCP options. */  	for (tlen -= sizeof(struct tcphdr), cp = (u_char *)(tcp + 1); @@ -114,7 +117,7 @@ tcpmod_setmss(struct mbuf **mp, struct tcphdr *tcp, int tlen, uint16_t mss)  #ifdef INET6  static int -tcpmod_ipv6_setmss(struct mbuf **mp, uint16_t mss) +tcpmod_ipv6_setmss(struct mbuf **mp, uint16_t mss, int *done)  {  	struct ip6_hdr *ip6;  	struct ip6_hbh *hbh; @@ -142,13 +145,13 @@ tcpmod_ipv6_setmss(struct mbuf **mp, uint16_t mss)  	/* We must have TCP options and enough data in a packet. */  	if (hlen <= sizeof(struct tcphdr) || hlen > plen)  		return (IP_FW_DENY); -	return (tcpmod_setmss(mp, tcp, hlen, mss)); +	return (tcpmod_setmss(mp, tcp, hlen, mss, done));  }  #endif /* INET6 */  #ifdef INET  static int -tcpmod_ipv4_setmss(struct mbuf **mp, uint16_t mss) +tcpmod_ipv4_setmss(struct mbuf **mp, uint16_t mss, int *done)  {  	struct tcphdr *tcp;  	struct ip *ip; @@ -162,7 +165,7 @@ tcpmod_ipv4_setmss(struct mbuf **mp, uint16_t mss)  	/* We must have TCP options and enough data in a packet. */  	if (hlen <= sizeof(struct tcphdr) || hlen > plen)  		return (IP_FW_DENY); -	return (tcpmod_setmss(mp, tcp, hlen, mss)); +	return (tcpmod_setmss(mp, tcp, hlen, mss, done));  }  #endif /* INET */ @@ -206,19 +209,23 @@ ipfw_tcpmod(struct ip_fw_chain *chain, struct ip_fw_args *args,  	switch (args->f_id.addr_type) {  #ifdef INET  		case 4: -			ret = tcpmod_ipv4_setmss(&args->m, htons(icmd->arg1)); +			ret = tcpmod_ipv4_setmss(&args->m, htons(icmd->arg1), +			    done);  			break;  #endif  #ifdef INET6  		case 6: -			ret = tcpmod_ipv6_setmss(&args->m, htons(icmd->arg1)); +			ret = tcpmod_ipv6_setmss(&args->m, htons(icmd->arg1), +			    done);  			break;  #endif  	}  	/*  	 * We return zero in both @ret and @done on success, and ipfw_chk()  	 * will update rule counters. Otherwise a packet will not be matched -	 * by rule. +	 * by rule. We passed @done around above in case we hit a fatal error +	 * somewhere, we'll return non-zero but signal that rule processing +	 * cannot succeed.  	 */  	return (ret);  } diff --git a/sys/sys/bio.h b/sys/sys/bio.h index 74d2b03bd180..fa7f19961ebd 100644 --- a/sys/sys/bio.h +++ b/sys/sys/bio.h @@ -37,6 +37,7 @@  #ifndef _SYS_BIO_H_  #define	_SYS_BIO_H_ +#include <sys/_exterr.h>  #include <sys/queue.h>  #include <sys/disk_zone.h> @@ -65,6 +66,7 @@  #define	BIO_TRANSIENT_MAPPING	0x20  #define	BIO_VLIST	0x40  #define	BIO_SWAP	0x200	/* Swap-related I/O */ +#define	BIO_EXTERR	0x2000  #define BIO_SPEEDUP_WRITE	0x4000	/* Resource shortage at upper layers */  #define BIO_SPEEDUP_TRIM	0x8000	/* Resource shortage at upper layers */ @@ -94,7 +96,6 @@ struct bio {  	struct vm_page **bio_ma;	/* Or unmapped. */  	int	bio_ma_offset;		/* Offset in the first page of bio_ma. */  	int	bio_ma_n;		/* Number of pages in bio_ma. */ -	int	bio_error;		/* Errno for BIO_ERROR. */  	long	bio_resid;		/* Remaining I/O in bytes. */  	void	(*bio_done)(struct bio *);  	void	*bio_driver1;		/* Private use by the provider. */ @@ -130,8 +131,12 @@ struct bio {  	/* XXX: these go away when bio chaining is introduced */  	daddr_t bio_pblkno;               /* physical block number */ +	struct kexterr bio_exterr;  }; +/* Errno for BIO_ERROR. */ +#define	bio_error	bio_exterr.error +  struct uio;  struct devstat; diff --git a/sys/sys/buf.h b/sys/sys/buf.h index 064d5cb05214..f08f05e6d50f 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -37,6 +37,7 @@  #ifndef _SYS_BUF_H_  #define	_SYS_BUF_H_ +#include <sys/_exterr.h>  #include <sys/bufobj.h>  #include <sys/queue.h>  #include <sys/lock.h> @@ -98,7 +99,6 @@ struct buf {  	long		b_bcount;  	void		*b_caller1;  	caddr_t		b_data; -	int		b_error;  	uint16_t	b_iocmd;	/* BIO_* bio_cmd from bio.h */  	uint16_t	b_ioflags;	/* BIO_* bio_flags from bio.h */  	off_t		b_iooffset; @@ -153,10 +153,12 @@ struct buf {  #elif defined(BUF_TRACKING)  	const char	*b_io_tracking;  #endif +	struct	kexterr b_exterr;  	struct	vm_page *b_pages[];  };  #define b_object	b_bufobj->bo_object +#define	b_error		b_exterr.error  /*   * These flags are kept in b_flags. @@ -390,6 +392,12 @@ struct buf {  	_lockmgr_disown(&(bp)->b_lock, LOCK_FILE, LOCK_LINE)  #endif +#define	BUF_EXTERR_FROM_CURTHR(bp)					\ +	bp->b_exterr = curthread->td_kexterr + +#define	BUF_EXTERR_TO_CURTHR(bp)					\ +	curthread->td_kexterr = bp->b_exterr +  #endif /* _KERNEL */  struct buf_queue_head { diff --git a/sys/sys/exterr_cat.h b/sys/sys/exterr_cat.h index 43f31e1d5dd6..34a4b9f86694 100644 --- a/sys/sys/exterr_cat.h +++ b/sys/sys/exterr_cat.h @@ -21,6 +21,8 @@  #define	EXTERR_CAT_BRIDGE	7  #define	EXTERR_CAT_SWAP		8  #define	EXTERR_CAT_VFSSYSCALL	9 +#define	EXTERR_CAT_VFSBIO	10 +#define	EXTERR_CAT_GEOMVFS	11  #endif diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h index 6783a0d2d84f..1e07f6afb547 100644 --- a/sys/sys/exterrvar.h +++ b/sys/sys/exterrvar.h @@ -37,6 +37,26 @@  #define	SET_ERROR_MSG(mmsg)	NULL  #endif +#define	_SET_ERROR2_KE(kep, eerror, mmsg, pp1, pp2)	({		\ +	(kep)->error = (eerror);					\ +	(kep)->cat = EXTERR_CATEGORY;					\ +	(kep)->msg = SET_ERROR_MSG(mmsg);				\ +	(kep)->p1 = (pp1);						\ +	(kep)->p2 = (pp2);						\ +	(kep)->src_line = __LINE__;					\ +	(kep)->error;					       		\ +}) +#define	_SET_ERROR0_KE(kep, eerror, mmsg)				\ +	_SET_ERROR2_KE(kep, eerror, mmsg, 0, 0) +#define	_SET_ERROR1_KE(kep, eerror, mmsg, pp1)				\ +	_SET_ERROR2_KE(kep, eerror, mmsg, pp1, 0) + +#define	_EXTERROR_MACRO_KE(kep, eerror, mmsg, _1, _2, NAME, ...)	\ +	NAME +#define	EXTERROR_KE(...)						\ +	_EXTERROR_MACRO_KE(__VA_ARGS__, _SET_ERROR2_KE, _SET_ERROR1_KE,	\ +	    _SET_ERROR0_KE)(__VA_ARGS__) +  #define	_SET_ERROR2(eerror, mmsg, pp1, pp2)				\  	exterr_set(eerror, EXTERR_CATEGORY, SET_ERROR_MSG(mmsg),	\  	    (uintptr_t)(pp1), (uintptr_t)(pp2), __LINE__) @@ -49,6 +69,8 @@  	_EXTERROR_MACRO(__VA_ARGS__, _SET_ERROR2, _SET_ERROR1,		\  	    _SET_ERROR0)(__VA_ARGS__) +void exterr_clear(struct kexterr *ke); +int exterr_set_from(const struct kexterr *ke);  int exterr_set(int eerror, int category, const char *mmsg, uintptr_t pp1,      uintptr_t pp2, int line);  int exterr_to_ue(struct thread *td, struct uexterror *ue); diff --git a/sys/sys/param.h b/sys/sys/param.h index 957f1762a17c..bdfe4a1cfde3 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -74,7 +74,7 @@   * cannot include sys/param.h and should only be updated here.   */  #undef __FreeBSD_version -#define __FreeBSD_version 1600003 +#define __FreeBSD_version 1600004  /*   * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD, diff --git a/tests/sys/fs/fusefs/xattr.cc b/tests/sys/fs/fusefs/xattr.cc index 0ab203c96254..afeacd4a249e 100644 --- a/tests/sys/fs/fusefs/xattr.cc +++ b/tests/sys/fs/fusefs/xattr.cc @@ -100,7 +100,11 @@ void expect_removexattr(uint64_t ino, const char *attr, int error)  	).WillOnce(Invoke(ReturnErrno(error)));  } -void expect_setxattr(uint64_t ino, const char *attr, const char *value, +/* + * Expect a FUSE_SETXATTR request in the format used by protocol 7.33 and + * later, with the FUSE_SETXATTR_EXT bit set. + */ +void expect_setxattr_ext(uint64_t ino, const char *attr, const char *value,  	ProcessMockerT r)  {  	EXPECT_CALL(*m_mock, process( @@ -119,16 +123,10 @@ void expect_setxattr(uint64_t ino, const char *attr, const char *value,  	).WillOnce(Invoke(r));  } -}; - -class Xattr_7_32:public FuseTest { -public: -virtual void SetUp() -{ -	m_kernel_minor_version = 32; -	FuseTest::SetUp(); -} - +/* + * Expect a FUSE_SETXATTR request in the format used by protocol 7.32 and + * earlier. + */  void expect_setxattr_7_32(uint64_t ino, const char *attr, const char *value,  	ProcessMockerT r)  { @@ -148,6 +146,15 @@ void expect_setxattr_7_32(uint64_t ino, const char *attr, const char *value,  }  }; +class Xattr_7_32: public Xattr { +public: +virtual void SetUp() +{ +	m_kernel_minor_version = 32; +	Xattr::SetUp(); +} +}; +  class Getxattr: public Xattr {};  class Listxattr: public Xattr {}; @@ -182,6 +189,13 @@ void TearDown() {  class Removexattr: public Xattr {};  class Setxattr: public Xattr {}; +class SetxattrExt: public Setxattr { +public: +virtual void SetUp() { +	m_init_flags |= FUSE_SETXATTR_EXT; +	Setxattr::SetUp(); +} +};  class Setxattr_7_32:public Xattr_7_32 {};  class RofsXattr: public Xattr {  public: @@ -773,7 +787,7 @@ TEST_F(Setxattr, enosys)  	ssize_t r;  	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 2); -	expect_setxattr(ino, "user.foo", value, ReturnErrno(ENOSYS)); +	expect_setxattr_7_32(ino, "user.foo", value, ReturnErrno(ENOSYS));  	r = extattr_set_file(FULLPATH, ns, "foo", (const void*)value,  		value_len); @@ -800,7 +814,7 @@ TEST_F(Setxattr, enotsup)  	ssize_t r;  	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 1); -	expect_setxattr(ino, "user.foo", value, ReturnErrno(ENOTSUP)); +	expect_setxattr_7_32(ino, "user.foo", value, ReturnErrno(ENOTSUP));  	r = extattr_set_file(FULLPATH, ns, "foo", (const void*)value,  		value_len); @@ -820,7 +834,7 @@ TEST_F(Setxattr, user)  	ssize_t r;  	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 1); -	expect_setxattr(ino, "user.foo", value, ReturnErrno(0)); +	expect_setxattr_7_32(ino, "user.foo", value, ReturnErrno(0));  	r = extattr_set_file(FULLPATH, ns, "foo", (const void*)value,  		value_len); @@ -839,7 +853,7 @@ TEST_F(Setxattr, system)  	ssize_t r;  	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 1); -	expect_setxattr(ino, "system.foo", value, ReturnErrno(0)); +	expect_setxattr_7_32(ino, "system.foo", value, ReturnErrno(0));  	r = extattr_set_file(FULLPATH, ns, "foo", (const void*)value,  		value_len); @@ -847,6 +861,10 @@ TEST_F(Setxattr, system)  } +/* + * For servers using protocol 7.32 and older, the kernel should use the older + * FUSE_SETXATTR format. + */  TEST_F(Setxattr_7_32, ok)  {  	uint64_t ino = 42; @@ -863,6 +881,25 @@ TEST_F(Setxattr_7_32, ok)  	ASSERT_EQ(value_len, r) << strerror(errno);  } +/* + * Successfully set a user attribute using the extended format + */ +TEST_F(SetxattrExt, user) +{ +	uint64_t ino = 42; +	const char value[] = "whatever"; +	ssize_t value_len = strlen(value) + 1; +	int ns = EXTATTR_NAMESPACE_USER; +	ssize_t r; + +	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 1); +	expect_setxattr_ext(ino, "user.foo", value, ReturnErrno(0)); + +	r = extattr_set_file(FULLPATH, ns, "foo", (const void*)value, +		value_len); +	ASSERT_EQ(value_len, r) << strerror(errno); +} +  TEST_F(RofsXattr, deleteextattr_erofs)  {  	uint64_t ino = 42; diff --git a/usr.bin/cut/cut.1 b/usr.bin/cut/cut.1 index 4f5b7b9bb9a5..42a1726e6e24 100644 --- a/usr.bin/cut/cut.1 +++ b/usr.bin/cut/cut.1 @@ -1,3 +1,6 @@ +.\" +.\" SPDX-License-Identifier: BSD-3-Clause +.\"  .\" Copyright (c) 1989, 1990, 1993  .\"	The Regents of the University of California.  All rights reserved.  .\" @@ -86,7 +89,7 @@ It is not an error to select columns or fields not present in the  input line.  .Pp  The options are as follows: -.Bl -tag -width indent +.Bl -tag -width "-d delim"  .It Fl b Ar list  The  .Ar list diff --git a/usr.bin/id/id.c b/usr.bin/id/id.c index 5f9d2670caa3..7ba07daad11e 100644 --- a/usr.bin/id/id.c +++ b/usr.bin/id/id.c @@ -67,19 +67,13 @@ main(int argc, char *argv[])  {  	struct group *gr;  	struct passwd *pw; -#ifdef USE_BSM_AUDIT -	bool Aflag; -#endif -	bool Gflag, Mflag, Pflag; +	bool Aflag, Gflag, Mflag, Pflag;  	bool cflag, dflag, gflag, nflag, pflag, rflag, sflag, uflag;  	int ch, combo, error, id;  	const char *myname, *optstr;  	char loginclass[MAXLOGNAME]; -#ifdef USE_BSM_AUDIT -	Aflag = false; -#endif -	Gflag = Mflag = Pflag = false; +	Aflag = Gflag = Mflag = Pflag = false;  	cflag = dflag = gflag = nflag = pflag = rflag = sflag = uflag = false;  	myname = getprogname(); diff --git a/usr.bin/sockstat/main.c b/usr.bin/sockstat/main.c index 07663e54534d..1f174d827e1a 100644 --- a/usr.bin/sockstat/main.c +++ b/usr.bin/sockstat/main.c @@ -88,6 +88,7 @@ static bool	 opt_A;		/* Show kernel address of pcb */  static bool	 opt_b;		/* Show BBLog state */  static bool	 opt_C;		/* Show congestion control */  static bool	 opt_c;		/* Show connected sockets */ +static bool	 opt_F;		/* Show sockets for selected user only */  static bool	 opt_f;		/* Show FIB numbers */  static bool	 opt_I;		/* Show spliced socket addresses */  static bool	 opt_i;		/* Show inp_gencnt */ @@ -115,6 +116,12 @@ static size_t	   default_numprotos = nitems(default_protos);  static int	*protos;	/* protocols to use */  static size_t	 numprotos;	/* allocated size of protos[] */ +/* + * Show sockets for user username or UID specified + */ +static char	*filter_user_optarg = NULL;	/* saved optarg for username/UID resolving */ +static uid_t	filter_user_uid;		/* UID to show sockets for */ +  struct addr {  	union {  		struct sockaddr_storage address; @@ -217,6 +224,18 @@ _enforce_ksize(size_t received_size, size_t expected_size, const char *struct_na  }  #define enforce_ksize(_sz, _struct)	(_enforce_ksize(_sz, sizeof(_struct), #_struct)) +static inline bool +filtered_uid(uid_t i_uid) +{ +	return ((i_uid) == filter_user_uid); +} + +static inline bool +need_nosocks(void) +{ +	return !(opt_F || (opt_j >= 0)); +} +  static int  get_proto_type(const char *proto)  { @@ -758,7 +777,8 @@ gather_inet(int proto)  		if (sock->socket != 0)  			RB_INSERT(socks_t, &socks, sock);  		else -			SLIST_INSERT_HEAD(&nosocks, sock, socket_list); +			if (need_nosocks()) +				SLIST_INSERT_HEAD(&nosocks, sock, socket_list);  	}  out:  	free(buf); @@ -862,6 +882,8 @@ getfiles(void)  	struct xfile *xfiles;  	size_t len, olen; +	int filenum = 0; +  	olen = len = sizeof(*xfiles);  	if ((xfiles = malloc(len)) == NULL)  		xo_err(1, "malloc()"); @@ -880,14 +902,23 @@ getfiles(void)  	if ((files = malloc(nfiles * sizeof(struct file))) == NULL)  		xo_err(1, "malloc()"); +	/* Fill files structure, optionally for specified user */  	for (int i = 0; i < nfiles; i++) { -		files[i].xf_data = xfiles[i].xf_data; -		files[i].xf_pid = xfiles[i].xf_pid; -		files[i].xf_uid = xfiles[i].xf_uid; -		files[i].xf_fd = xfiles[i].xf_fd; -		RB_INSERT(files_t, &ftree, &files[i]); +		if (opt_F && !filtered_uid(xfiles[i].xf_uid)) +				continue; +		files[filenum].xf_data = xfiles[i].xf_data; +		files[filenum].xf_pid = xfiles[i].xf_pid; +		files[filenum].xf_uid = xfiles[i].xf_uid; +		files[filenum].xf_fd = xfiles[i].xf_fd; +		RB_INSERT(files_t, &ftree, &files[filenum]); +		filenum++;  	} +	/* Adjust global nfiles to match the number of files we +	 * actually filled into files[] array +	 */ +	nfiles = filenum; +  	free(xfiles);  } @@ -1584,6 +1615,24 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize)  static void  display(void)  { +	static const char *__HDR_USER="USER", +			  *__HDR_COMMAND="COMMAND", +			  *__HDR_PID="PID", +			  *__HDR_FD="FD", +			  *__HDR_PROTO="PROTO", +			  *__HDR_LOCAL_ADDRESS="LOCAL ADDRESS", +			  *__HDR_FOREIGN_ADDRESS="FOREIGN ADDRESS", +			  *__HDR_PCB_KVA="PCB KVA", +			  *__HDR_FIB="FIB", +			  *__HDR_SPLICE_ADDRESS="SPLICE ADDRESS", +			  *__HDR_ID="ID", +			  *__HDR_ENCAPS="ENCAPS", +			  *__HDR_PATH_STATE="PATH STATE", +			  *__HDR_CONN_STATE="CONN STATE", +			  *__HDR_BBLOG_STATE="BBLOG STATE", +			  *__HDR_STACK="STACK", +			  *__HDR_CC="CC"; +  	struct passwd *pwd;  	struct file *xf;  	struct sock *s; @@ -1598,23 +1647,23 @@ display(void)  	if (!is_xo_style_encoding) {  		cw = (struct col_widths) { -			.user = strlen("USER"), +			.user = strlen(__HDR_USER),  			.command = 10, -			.pid = strlen("PID"), -			.fd = strlen("FD"), -			.proto = strlen("PROTO"), -			.local_addr = opt_w ? strlen("LOCAL ADDRESS") : 21, -			.foreign_addr = opt_w ? strlen("FOREIGN ADDRESS") : 21, +			.pid = strlen(__HDR_PID), +			.fd = strlen(__HDR_FD), +			.proto = strlen(__HDR_PROTO), +			.local_addr = opt_w ? strlen(__HDR_LOCAL_ADDRESS) : 21, +			.foreign_addr = opt_w ? strlen(__HDR_FOREIGN_ADDRESS) : 21,  			.pcb_kva = 18, -			.fib = strlen("FIB"), -			.splice_address = strlen("SPLICE ADDRESS"), -			.inp_gencnt = strlen("ID"), -			.encaps = strlen("ENCAPS"), -			.path_state = strlen("PATH STATE"), -			.conn_state = strlen("CONN STATE"), -			.bblog_state = strlen("BBLOG STATE"), -			.stack = strlen("STACK"), -			.cc = strlen("CC"), +			.fib = strlen(__HDR_FIB), +			.splice_address = strlen(__HDR_SPLICE_ADDRESS), +			.inp_gencnt = strlen(__HDR_ID), +			.encaps = strlen(__HDR_ENCAPS), +			.path_state = strlen(__HDR_PATH_STATE), +			.conn_state = strlen(__HDR_CONN_STATE), +			.bblog_state = strlen(__HDR_BBLOG_STATE), +			.stack = strlen(__HDR_STACK), +			.cc = strlen(__HDR_CC),  		};  		calculate_column_widths(&cw);  	} else @@ -1625,34 +1674,34 @@ display(void)  	xo_open_list("socket");  	if (!opt_q) {  		xo_emit("{T:/%-*s} {T:/%-*s} {T:/%*s} {T:/%*s} {T:/%-*s} " -			"{T:/%-*s} {T:/%-*s}", cw.user, "USER", cw.command, -			"COMMAND", cw.pid, "PID", cw.fd, "FD", cw.proto, -			"PROTO", cw.local_addr, "LOCAL ADDRESS", -			cw.foreign_addr, "FOREIGN ADDRESS"); +			"{T:/%-*s} {T:/%-*s}", cw.user, __HDR_USER, cw.command, +			__HDR_COMMAND, cw.pid, __HDR_PID, cw.fd, __HDR_FD, cw.proto, +			__HDR_PROTO, cw.local_addr, __HDR_LOCAL_ADDRESS, +			cw.foreign_addr, __HDR_FOREIGN_ADDRESS);  		if (opt_A) -			xo_emit(" {T:/%-*s}", cw.pcb_kva, "PCB KVA"); +			xo_emit(" {T:/%-*s}", cw.pcb_kva, __HDR_PCB_KVA);  		if (opt_f)  			/* RT_MAXFIBS is 65535. */ -			xo_emit(" {T:/%*s}", cw.fib, "FIB"); +			xo_emit(" {T:/%*s}", cw.fib, __HDR_FIB);  		if (opt_I)  			xo_emit(" {T:/%-*s}", cw.splice_address, -			    "SPLICE ADDRESS"); +			    __HDR_SPLICE_ADDRESS);  		if (opt_i) -			xo_emit(" {T:/%*s}", cw.inp_gencnt, "ID"); +			xo_emit(" {T:/%*s}", cw.inp_gencnt, __HDR_ID);  		if (opt_U) -			xo_emit(" {T:/%*s}", cw.encaps, "ENCAPS"); +			xo_emit(" {T:/%*s}", cw.encaps, __HDR_ENCAPS);  		if (opt_s) {  			if (show_path_state)  				xo_emit(" {T:/%-*s}", cw.path_state, -				    "PATH STATE"); -			xo_emit(" {T:/%-*s}", cw.conn_state, "CONN STATE"); +				    __HDR_PATH_STATE); +			xo_emit(" {T:/%-*s}", cw.conn_state, __HDR_CONN_STATE);  		}  		if (opt_b) -			xo_emit(" {T:/%-*s}", cw.bblog_state, "BBLOG STATE"); +			xo_emit(" {T:/%-*s}", cw.bblog_state, __HDR_BBLOG_STATE);  		if (opt_S) -			xo_emit(" {T:/%-*s}", cw.stack, "STACK"); +			xo_emit(" {T:/%-*s}", cw.stack, __HDR_STACK);  		if (opt_C) -			xo_emit(" {T:/%-*s}", cw.cc, "CC"); +			xo_emit(" {T:/%-*s}", cw.cc, __HDR_CC);  		xo_emit("\n");  	}  	cap_setpassent(cappwd, 1); @@ -1684,7 +1733,7 @@ display(void)  			xo_close_instance("socket");  		}  	} -	if (opt_j >= 0) +	if (!need_nosocks())  		goto out;  	SLIST_FOREACH(s, &nosocks, socket_list) {  		if (!check_ports(s)) @@ -1775,11 +1824,44 @@ jail_getvnet(int jid)  	return (vnet);  } +/* + * Parse username and/or UID + */ +static bool +parse_filter_user(void) +{ +	struct passwd *pwd; +	char *ep; +	uid_t uid; +	bool rv = false; + +	uid = (uid_t)strtol(filter_user_optarg, &ep, 10); + +	/* Open and/or rewind capsicumized password file */ +	cap_setpassent(cappwd, 1); + +	if (*ep == '\0') { +		/* We have an UID specified, check if it's valid */ +		if ((pwd = cap_getpwuid(cappwd, uid)) == NULL)  +			goto out; +		filter_user_uid = uid; +	} else { +		/* Check if we have a valid username */ +		if ((pwd = cap_getpwnam(cappwd, filter_user_optarg)) == NULL)  +			goto out; +		filter_user_uid = pwd->pw_uid; +	} + +	rv = true; +out: +	return (rv); +} +  static void  usage(void)  {  	xo_error( -"usage: sockstat [--libxo ...] [-46AbCcfIiLlnqSsUuvw] [-j jid] [-p ports]\n" +"usage: sockstat [--libxo ...] [-46AbCcfIiLlnqSsUuvw] [-F uid/username] [-j jid] [-p ports]\n"  "                [-P protocols]\n");  	exit(1);  } @@ -1789,8 +1871,8 @@ main(int argc, char *argv[])  {  	cap_channel_t *capcas;  	cap_net_limit_t *limit; -	const char *pwdcmds[] = { "setpassent", "getpwuid" }; -	const char *pwdfields[] = { "pw_name" }; +	const char *pwdcmds[] = { "setpassent", "getpwuid", "getpwnam" }; +	const char *pwdfields[] = { "pw_name", "pw_uid" };  	int protos_defined = -1;  	int o, i, err; @@ -1803,7 +1885,7 @@ main(int argc, char *argv[])  			is_xo_style_encoding = true;  	}  	opt_j = -1; -	while ((o = getopt(argc, argv, "46AbCcfIij:Llnp:P:qSsUuvw")) != -1) +	while ((o = getopt(argc, argv, "46AbCcF:fIij:Llnp:P:qSsUuvw")) != -1)  		switch (o) {  		case '4':  			opt_4 = true; @@ -1823,6 +1905,11 @@ main(int argc, char *argv[])  		case 'c':  			opt_c = true;  			break; +		case 'F': +			/* Save optarg for later use when we enter capabilities mode */ +			filter_user_optarg = optarg; +			opt_F = true; +			break;  		case 'f':  			opt_f = true;  			break; @@ -1934,6 +2021,9 @@ main(int argc, char *argv[])  	if (cap_pwd_limit_fields(cappwd, pwdfields, nitems(pwdfields)) < 0)  		xo_err(1, "Unable to apply pwd commands limits"); +	if (opt_F && !parse_filter_user()) +		xo_errx(1, "Invalid username or UID specified"); +  	if ((!opt_4 && !opt_6) && protos_defined != -1)  		opt_4 = opt_6 = true;  	if (!opt_4 && !opt_6 && !opt_u) diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1 index 1498fb1d88f7..b0fae81ee566 100644 --- a/usr.bin/sockstat/sockstat.1 +++ b/usr.bin/sockstat/sockstat.1 @@ -25,7 +25,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 14, 2025 +.Dd October 29, 2025  .Dt SOCKSTAT 1  .Os  .Sh NAME @@ -35,6 +35,7 @@  .Nm  .Op Fl -libxo  .Op Fl 46AbCcfIiLlnqSsUuvw +.Op Fl F Ar user  .Op Fl j Ar jail  .Op Fl p Ar ports  .Op Fl P Ar protocols @@ -73,6 +74,10 @@ Display the congestion control module, if applicable.  This is currently only implemented for TCP.  .It Fl c  Show connected sockets. +.It Fl F Ar user +Show sockets for specified +.Ar user +(user name or UID) only.  .It Fl f  Show the FIB number of each socket.  .It Fl I diff --git a/usr.sbin/cron/lib/env.c b/usr.sbin/cron/lib/env.c index 287dd8636293..5a2d7ad60756 100644 --- a/usr.sbin/cron/lib/env.c +++ b/usr.sbin/cron/lib/env.c @@ -55,7 +55,7 @@ env_copy(char **envp)  	for (count = 0;  envp[count] != NULL;  count++)  		; -	p = (char **) malloc((count+1) * sizeof(char *)); /* 1 for the NULL */ +	p = (char **) reallocarray(NULL, count+1, sizeof(char *)); /* 1 for the NULL */  	if (p == NULL) {  		errno = ENOMEM;  		return NULL; @@ -112,8 +112,7 @@ env_set(char **envp, char *envstr)  	 * one, save our string over the old null pointer, and return resized  	 * array.  	 */ -	p = (char **) realloc((void *) envp, -			      (unsigned) ((count+1) * sizeof(char *))); +	p = (char **) reallocarray(envp, count+1, sizeof(char *));  	if (p == NULL) 	{  		/* XXX env_free(envp); */  		errno = ENOMEM;  | 
