mirror of
https://github.com/immortalwrt/immortalwrt
synced 2025-01-09 04:29:03 +08:00
Merge Mainline
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
fe57bfc559
@ -0,0 +1,134 @@
|
||||
From: Matt Johnston <matt@ucc.asn.au>
|
||||
Date: Wed, 8 Jun 2022 21:26:20 +0800
|
||||
Subject: Fix MAX_UNAUTH_CLIENTS regression
|
||||
|
||||
Since re-exec change in 2022.82 Dropbear count
|
||||
treat authenticated sessions towards the unauthenticated
|
||||
session limit. This is fixed by passing the childpipe FD
|
||||
through to the re-execed process.
|
||||
---
|
||||
runopts.h | 5 +++--
|
||||
svr-main.c | 21 +++++++++++----------
|
||||
svr-runopts.c | 15 ++++++++++++---
|
||||
3 files changed, 26 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/runopts.h
|
||||
+++ b/runopts.h
|
||||
@@ -79,8 +79,9 @@ typedef struct svr_runopts {
|
||||
char *addresses[DROPBEAR_MAX_PORTS];
|
||||
|
||||
int inetdmode;
|
||||
- /* Hidden "-2" flag indicates it's re-executing itself */
|
||||
- int reexec_child;
|
||||
+ /* Hidden "-2 childpipe_fd" flag indicates it's re-executing itself,
|
||||
+ stores the childpipe preauth file descriptor. Set to -1 otherwise. */
|
||||
+ int reexec_childpipe;
|
||||
|
||||
/* Flags indicating whether to use ipv4 and ipv6 */
|
||||
/* not used yet
|
||||
--- a/svr-main.c
|
||||
+++ b/svr-main.c
|
||||
@@ -71,7 +71,7 @@ int main(int argc, char ** argv)
|
||||
#endif
|
||||
|
||||
#if DROPBEAR_DO_REEXEC
|
||||
- if (svr_opts.reexec_child) {
|
||||
+ if (svr_opts.reexec_childpipe >= 0) {
|
||||
#ifdef PR_SET_NAME
|
||||
/* Fix the "Name:" in /proc/pid/status, otherwise it's
|
||||
a FD number from fexecve.
|
||||
@@ -102,7 +102,7 @@ static void main_inetd() {
|
||||
|
||||
seedrandom();
|
||||
|
||||
- if (!svr_opts.reexec_child) {
|
||||
+ if (svr_opts.reexec_childpipe < 0) {
|
||||
/* In case our inetd was lax in logging source addresses */
|
||||
get_socket_address(0, NULL, NULL, &host, &port, 0);
|
||||
dropbear_log(LOG_INFO, "Child connection from %s:%s", host, port);
|
||||
@@ -115,10 +115,8 @@ static void main_inetd() {
|
||||
setsid();
|
||||
}
|
||||
|
||||
- /* Start service program
|
||||
- * -1 is a dummy childpipe, just something we can close() without
|
||||
- * mattering. */
|
||||
- svr_session(0, -1);
|
||||
+ /* -1 for childpipe in the inetd case is discarded */
|
||||
+ svr_session(0, svr_opts.reexec_childpipe);
|
||||
|
||||
/* notreached */
|
||||
}
|
||||
@@ -347,9 +345,10 @@ static void main_noinetd(int argc, char
|
||||
|
||||
if (execfd >= 0) {
|
||||
#if DROPBEAR_DO_REEXEC
|
||||
- /* Add "-2" to the args and re-execute ourself. */
|
||||
- char **new_argv = m_malloc(sizeof(char*) * (argc+3));
|
||||
- int pos0 = 0, new_argc = argc+1;
|
||||
+ /* Add "-2 childpipe[1]" to the args and re-execute ourself. */
|
||||
+ char **new_argv = m_malloc(sizeof(char*) * (argc+4));
|
||||
+ char buf[10];
|
||||
+ int pos0 = 0, new_argc = argc+2;
|
||||
|
||||
/* We need to specially handle "dropbearmulti dropbear". */
|
||||
if (multipath) {
|
||||
@@ -359,7 +358,9 @@ static void main_noinetd(int argc, char
|
||||
}
|
||||
|
||||
memcpy(&new_argv[pos0], argv, sizeof(char*) * argc);
|
||||
- new_argv[new_argc-1] = "-2";
|
||||
+ new_argv[new_argc-2] = "-2";
|
||||
+ snprintf(buf, sizeof(buf), "%d", childpipe[1]);
|
||||
+ new_argv[new_argc-1] = buf;
|
||||
new_argv[new_argc] = NULL;
|
||||
|
||||
if ((dup2(childsock, STDIN_FILENO) < 0)) {
|
||||
--- a/svr-runopts.c
|
||||
+++ b/svr-runopts.c
|
||||
@@ -138,6 +138,7 @@ void svr_getopts(int argc, char ** argv)
|
||||
char* keepalive_arg = NULL;
|
||||
char* idle_timeout_arg = NULL;
|
||||
char* maxauthtries_arg = NULL;
|
||||
+ char* reexec_fd_arg = NULL;
|
||||
char* keyfile = NULL;
|
||||
char c;
|
||||
#if DROPBEAR_PLUGIN
|
||||
@@ -175,6 +176,7 @@ void svr_getopts(int argc, char ** argv)
|
||||
svr_opts.pubkey_plugin_options = NULL;
|
||||
#endif
|
||||
svr_opts.pass_on_env = 0;
|
||||
+ svr_opts.reexec_childpipe = -1;
|
||||
|
||||
#ifndef DISABLE_ZLIB
|
||||
opts.compress_mode = DROPBEAR_COMPRESS_DELAYED;
|
||||
@@ -250,12 +252,12 @@ void svr_getopts(int argc, char ** argv)
|
||||
#if DROPBEAR_DO_REEXEC && NON_INETD_MODE
|
||||
/* For internal use by re-exec */
|
||||
case '2':
|
||||
- svr_opts.reexec_child = 1;
|
||||
+ next = &reexec_fd_arg;
|
||||
break;
|
||||
#endif
|
||||
case 'p':
|
||||
- nextisport = 1;
|
||||
- break;
|
||||
+ nextisport = 1;
|
||||
+ break;
|
||||
case 'P':
|
||||
next = &svr_opts.pidfile;
|
||||
break;
|
||||
@@ -426,6 +428,13 @@ void svr_getopts(int argc, char ** argv)
|
||||
dropbear_log(LOG_INFO, "Forced command set to '%s'", svr_opts.forced_command);
|
||||
}
|
||||
|
||||
+ if (reexec_fd_arg) {
|
||||
+ if (m_str_to_uint(reexec_fd_arg, &svr_opts.reexec_childpipe) == DROPBEAR_FAILURE
|
||||
+ || svr_opts.reexec_childpipe < 0) {
|
||||
+ dropbear_exit("Bad -2");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
#if INETD_MODE
|
||||
if (svr_opts.inetdmode && (
|
||||
opts.usingsyslog == 0
|
@ -8,13 +8,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ethtool
|
||||
PKG_VERSION:=5.16
|
||||
PKG_VERSION:=5.18
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=@KERNEL/software/network/ethtool
|
||||
PKG_HASH:=aa2fef1936dd4a11755dfa0bdb93f0ec5bea45208d27c9754bc3abe1aa42c1cb
|
||||
PKG_HASH:=9577b2ffbce710b659fb239598ec92bced1ca400ca0f1286762bfa44e4784270
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
|
@ -79,14 +79,14 @@ define Package/block-mount
|
||||
SECTION:=base
|
||||
CATEGORY:=Base system
|
||||
TITLE:=Block device mounting and checking
|
||||
DEPENDS:=+ubox +libubox +libuci +libblobmsg-json +libjson-c
|
||||
DEPENDS:=+ubox +libubox +libuci +libblobmsg-json +libjson-c +fstools
|
||||
endef
|
||||
|
||||
define Package/blockd
|
||||
SECTION:=base
|
||||
CATEGORY:=Base system
|
||||
TITLE:=Block device automounting
|
||||
DEPENDS:=+block-mount +fstools +libubus +kmod-fs-autofs4 +libblobmsg-json +libjson-c
|
||||
DEPENDS:=+block-mount +libubus +kmod-fs-autofs4 +libblobmsg-json +libjson-c
|
||||
endef
|
||||
|
||||
define Package/fstools/install
|
||||
|
@ -0,0 +1,123 @@
|
||||
From: Qi Liu <liuqi_colin@msn.com>
|
||||
|
||||
In order to support extroot, block extroot command has to be able to
|
||||
discover and properly mount the rootfs_data volume in order to discover
|
||||
the extroot volume. Currently this process can only discover MTD devices.
|
||||
This patch leverages libfstools in a similar way as mount_root to
|
||||
discover, initialize, and mount rootfs_data volume. It would enable any
|
||||
device with non-MTD rootfs_data volume to support extroot, including x86.
|
||||
|
||||
Signed-off-by: Qi Liu <liuqi_colin@msn.com>
|
||||
---
|
||||
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -77,9 +77,9 @@ INSTALL(TARGETS blockd RUNTIME DESTINATION sbin)
|
||||
ADD_EXECUTABLE(block block.c probe.c probe-libblkid.c)
|
||||
IF(DEFINED CMAKE_UBIFS_EXTROOT)
|
||||
ADD_DEFINITIONS(-DUBIFS_EXTROOT)
|
||||
- TARGET_LINK_LIBRARIES(block blkid-tiny dl uci ubox ubus blobmsg_json ubi-utils ${json})
|
||||
+ TARGET_LINK_LIBRARIES(block blkid-tiny dl fstools uci ubox ubus blobmsg_json ubi-utils ${json})
|
||||
ELSE(DEFINED CMAKE_UBIFS_EXTROOT)
|
||||
- TARGET_LINK_LIBRARIES(block blkid-tiny dl uci ubox ubus blobmsg_json ${json})
|
||||
+ TARGET_LINK_LIBRARIES(block blkid-tiny dl fstools uci ubox ubus blobmsg_json ${json})
|
||||
ENDIF(DEFINED CMAKE_UBIFS_EXTROOT)
|
||||
INSTALL(TARGETS block RUNTIME DESTINATION sbin)
|
||||
|
||||
--- a/block.c
|
||||
+++ b/block.c
|
||||
@@ -46,6 +46,9 @@
|
||||
#include <libubox/vlist.h>
|
||||
#include <libubus.h>
|
||||
|
||||
+#include "libfstools/fstype.h"
|
||||
+#include "libfstools/volume.h"
|
||||
+
|
||||
#include "probe.h"
|
||||
|
||||
#define AUTOFS_MOUNT_PATH "/tmp/run/blockd/"
|
||||
@@ -1600,6 +1603,44 @@ static int main_extroot(int argc, char **argv)
|
||||
}
|
||||
#endif
|
||||
|
||||
+ /* Find volume using libfstools */
|
||||
+ struct volume *data = volume_find("rootfs_data");
|
||||
+ if (data) {
|
||||
+ volume_init(data);
|
||||
+
|
||||
+ switch (volume_identify(data)) {
|
||||
+ case FS_EXT4: {
|
||||
+ char cfg[] = "/tmp/ext4_cfg";
|
||||
+
|
||||
+ /* Mount volume and try extroot (using fstab from that vol) */
|
||||
+ mkdir_p(cfg, 0755);
|
||||
+ if (!mount(data->blk, cfg, "ext4", MS_NOATIME, NULL)) {
|
||||
+ err = mount_extroot(cfg);
|
||||
+ umount2(cfg, MNT_DETACH);
|
||||
+ }
|
||||
+ if (err < 0)
|
||||
+ rmdir("/tmp/overlay");
|
||||
+ rmdir(cfg);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ case FS_F2FS: {
|
||||
+ char cfg[] = "/tmp/f2fs_cfg";
|
||||
+
|
||||
+ /* Mount volume and try extroot (using fstab from that vol) */
|
||||
+ mkdir_p(cfg, 0755);
|
||||
+ if (!mount(data->blk, cfg, "f2fs", MS_NOATIME, NULL)) {
|
||||
+ err = mount_extroot(cfg);
|
||||
+ umount2(cfg, MNT_DETACH);
|
||||
+ }
|
||||
+ if (err < 0)
|
||||
+ rmdir("/tmp/overlay");
|
||||
+ rmdir(cfg);
|
||||
+ return err;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* As a last resort look for /etc/config/fstab on "rootfs" partition */
|
||||
return mount_extroot(NULL);
|
||||
}
|
||||
--- /dev/null
|
||||
+++ b/libfstools/fstype.h
|
||||
@@ -0,0 +1,13 @@
|
||||
+#ifndef _FS_TYPE_H__
|
||||
+#define _FS_TYPE_H__
|
||||
+enum {
|
||||
+ FS_NONE,
|
||||
+ FS_SNAPSHOT,
|
||||
+ FS_JFFS2,
|
||||
+ FS_DEADCODE,
|
||||
+ FS_UBIFS,
|
||||
+ FS_F2FS,
|
||||
+ FS_EXT4,
|
||||
+ FS_TARGZ,
|
||||
+};
|
||||
+#endif
|
||||
--- a/libfstools/libfstools.h
|
||||
+++ b/libfstools/libfstools.h
|
||||
@@ -18,20 +18,10 @@
|
||||
#include <libubox/blob.h>
|
||||
#include <libubox/ulog.h>
|
||||
#include <libubox/utils.h>
|
||||
+#include "fstype.h"
|
||||
|
||||
struct volume;
|
||||
|
||||
-enum {
|
||||
- FS_NONE,
|
||||
- FS_SNAPSHOT,
|
||||
- FS_JFFS2,
|
||||
- FS_DEADCODE,
|
||||
- FS_UBIFS,
|
||||
- FS_F2FS,
|
||||
- FS_EXT4,
|
||||
- FS_TARGZ,
|
||||
-};
|
||||
-
|
||||
enum fs_state {
|
||||
FS_STATE_UNKNOWN,
|
||||
FS_STATE_PENDING,
|
Loading…
Reference in New Issue
Block a user