281 lines
6.8 KiB
Diff
281 lines
6.8 KiB
Diff
From 5131708f0337fc90b03dad4d180f571c973d07c6 Mon Sep 17 00:00:00 2001
|
|
From: Faheem Pervez <trippin1@gmail.com>
|
|
Date: Thu, 18 Jun 2020 11:51:38 +0000
|
|
Subject: [PATCH 6/6] add berserker.{c,h}
|
|
|
|
The idea of berserker.c is to define missing functions:
|
|
wrapping getpwnam etc. to return only a root entry,
|
|
giving any user added to Samba full access.
|
|
|
|
getpasswd_wrapper is from JimmyChingala:
|
|
https://forum.xda-developers.com/showpost.php?p=8239139&postcount=128
|
|
|
|
The original berserker.c can be found here,
|
|
from Berserker's port for SambaDroid:
|
|
https://github.com/berserker/android_samba
|
|
|
|
elliott10 updated it for Samba 4:
|
|
https://github.com/elliott10/samba-4.5.1
|
|
|
|
I've made the following changes:
|
|
* Use Termux values for root user
|
|
* _Naively_ (really - I know volatile won't help much) prevent
|
|
getpwent inf. loops
|
|
* Wrap getgrnam and getgrgid, thanks
|
|
https://blog.csdn.net/jk198310/article/details/15809341
|
|
* Add a couple o' more Android groups
|
|
---
|
|
source3/include/berserker.c | 148 ++++++++++++++++++++++++++++++++++++
|
|
source3/include/berserker.h | 51 +++++++++++++
|
|
source3/include/includes.h | 1 +
|
|
source3/wscript_build | 2 +
|
|
4 files changed, 202 insertions(+)
|
|
create mode 100644 source3/include/berserker.c
|
|
create mode 100644 source3/include/berserker.h
|
|
|
|
diff --git a/source3/include/berserker.c b/source3/include/berserker.c
|
|
new file mode 100644
|
|
index 0000000..ac75cb7
|
|
--- /dev/null
|
|
+++ b/source3/include/berserker.c
|
|
@@ -0,0 +1,147 @@
|
|
+#define BERSERKER_USE_ORIG
|
|
+#include "includes.h"
|
|
+
|
|
+#ifndef AID_ROOT
|
|
+#define AID_ROOT 0
|
|
+#define AID_MEDIA_RW 1023
|
|
+#define AID_EVERYBODY 9997
|
|
+#endif
|
|
+
|
|
+//int getpwnam_r(const char* __name, struct passwd* __pwd, char* __buf, size_t __n, struct passwd** __result);
|
|
+
|
|
+static volatile int getpwent_ok = 1;
|
|
+
|
|
+static struct group *group_wrapper(gid_t __gid)
|
|
+{
|
|
+ static char *rootmem[] = {
|
|
+ "root",
|
|
+ NULL
|
|
+ };
|
|
+ static struct group rootgr = {
|
|
+ "root",
|
|
+ "x" /* NULL */,
|
|
+ AID_ROOT,
|
|
+ rootmem
|
|
+ };
|
|
+ static char *everybodymem[] = {
|
|
+ "everybody",
|
|
+ NULL
|
|
+ };
|
|
+ static struct group everybodygr = {
|
|
+ "everybody",
|
|
+ "x" /* NULL */,
|
|
+ AID_EVERYBODY,
|
|
+ everybodymem
|
|
+ };
|
|
+ static char *mediarwmem[] = {
|
|
+ "media_rw",
|
|
+ NULL
|
|
+ };
|
|
+ static struct group mediarwgr = {
|
|
+ "media_rw",
|
|
+ "x" /* NULL */,
|
|
+ AID_MEDIA_RW,
|
|
+ mediarwmem
|
|
+ };
|
|
+
|
|
+ if (__gid == AID_EVERYBODY)
|
|
+ return &everybodygr;
|
|
+ if (__gid == AID_MEDIA_RW)
|
|
+ return &mediarwgr;
|
|
+ return &rootgr;
|
|
+}
|
|
+
|
|
+static struct passwd *getpasswd_wrapper()
|
|
+{
|
|
+#if 0 /* Inconsistencies abound... */
|
|
+ static struct passwd pwd;
|
|
+ static struct passwd *result = NULL;
|
|
+ static char *buf = NULL;
|
|
+
|
|
+ if (!result) {
|
|
+ size_t bufsize;
|
|
+ memset(&pwd, 0, sizeof(pwd));
|
|
+
|
|
+ bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
+ if (bufsize == -1)
|
|
+ bufsize = 16384;
|
|
+
|
|
+ buf = malloc(bufsize);
|
|
+ if (buf == NULL)
|
|
+ return NULL;
|
|
+
|
|
+ (void) getpwnam_r("root", &pwd, buf, bufsize, &result);
|
|
+ if (!result) {
|
|
+ free(buf);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ if (!pwd.pw_passwd || pwd.pw_passwd[0] == '*')
|
|
+ pwd.pw_passwd = "x";
|
|
+ }
|
|
+
|
|
+ return result;
|
|
+#else
|
|
+ static struct passwd pw = {
|
|
+ .pw_name = "root",
|
|
+ .pw_passwd = "x",
|
|
+ .pw_uid = AID_ROOT,
|
|
+ .pw_gid = AID_ROOT,
|
|
+ .pw_dir = "@TERMUX_HOME@",
|
|
+ .pw_shell = "@TERMUX_PREFIX@/bin/login"
|
|
+ };
|
|
+ return &pw;
|
|
+#endif
|
|
+}
|
|
+
|
|
+/* getpwent restituisce il prossimo della lista */
|
|
+struct passwd *berserker_getpwnam(const char* __name)
|
|
+{
|
|
+ (void)__name;
|
|
+ return getpasswd_wrapper();
|
|
+}
|
|
+
|
|
+struct passwd *berserker_getpwuid(uid_t __uid)
|
|
+{
|
|
+ (void)__uid;
|
|
+ return getpasswd_wrapper();
|
|
+}
|
|
+
|
|
+/* setpwent resetta la lista per iterare su passwd */
|
|
+void berserker_setpwent()
|
|
+{
|
|
+ getpwent_ok = 1;
|
|
+}
|
|
+
|
|
+/* getpwent restituisce la prossima struttura passwd */
|
|
+struct passwd *berserker_getpwent()
|
|
+{
|
|
+ if (getpwent_ok) {
|
|
+ getpwent_ok = 0;
|
|
+ return getpasswd_wrapper();
|
|
+ }
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+/* termina il ciclo di iterazione su passwd */
|
|
+void berserker_endpwent()
|
|
+{
|
|
+ getpwent_ok = 1;
|
|
+}
|
|
+
|
|
+struct group *berserker_getgrnam(const char* __name)
|
|
+{
|
|
+ if (__name) {
|
|
+ if (!strcmp(__name, "everybody"))
|
|
+ return group_wrapper(AID_EVERYBODY);
|
|
+ if (!strcmp(__name, "media_rw"))
|
|
+ return group_wrapper(AID_MEDIA_RW);
|
|
+ }
|
|
+ return group_wrapper(AID_ROOT);
|
|
+}
|
|
+
|
|
+struct group *berserker_getgrgid(gid_t __gid)
|
|
+{
|
|
+ return group_wrapper(__gid);
|
|
+}
|
|
diff --git a/source3/include/berserker.h b/source3/include/berserker.h
|
|
new file mode 100644
|
|
index 0000000..7882380
|
|
--- /dev/null
|
|
+++ b/source3/include/berserker.h
|
|
@@ -0,0 +1,51 @@
|
|
+#ifndef __BERSERKER_H__
|
|
+#define __BERSERKER_H__
|
|
+
|
|
+#define _PWD_H_ /* disabilita l'inclusione del file pwd.h sotto android */
|
|
+#define _GRP_H_
|
|
+
|
|
+#include <unistd.h>
|
|
+#include <sys/types.h>
|
|
+
|
|
+struct passwd {
|
|
+ char* pw_name;
|
|
+ char* pw_passwd;
|
|
+ uid_t pw_uid;
|
|
+ gid_t pw_gid;
|
|
+#ifdef __LP64__
|
|
+ char* pw_gecos;
|
|
+#endif
|
|
+ char* pw_dir;
|
|
+ char* pw_shell;
|
|
+};
|
|
+
|
|
+struct group {
|
|
+ char* gr_name;
|
|
+ char* gr_passwd;
|
|
+ gid_t gr_gid;
|
|
+ char** gr_mem;
|
|
+};
|
|
+
|
|
+#ifndef BERSERKER_USE_ORIG
|
|
+#define getpwnam berserker_getpwnam
|
|
+struct passwd *berserker_getpwnam(const char* __name);
|
|
+#define getpwuid berserker_getpwuid
|
|
+struct passwd *berserker_getpwuid(uid_t __uid);
|
|
+#define setpwent berserker_setpwent
|
|
+void berserker_setpwent(void);
|
|
+#define getpwent berserker_getpwent
|
|
+struct passwd *berserker_getpwent(void);
|
|
+#define endpwent berserker_endpwent
|
|
+void berserker_endpwent(void);
|
|
+#define getgrnam berserker_getgrnam
|
|
+struct group *berserker_getgrnam(const char* __name);
|
|
+#define getgrgid berserker_getgrgid
|
|
+struct group *berserker_getgrgid(gid_t __gid);
|
|
+#endif
|
|
+
|
|
+/* fix per defines mancanti di utmp.ut_type */
|
|
+#ifndef DEAD_PROCESS
|
|
+#define DEAD_PROCESS 8
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/source3/include/includes.h b/source3/include/includes.h
|
|
index 2dafc65..6937912 100644
|
|
--- a/source3/include/includes.h
|
|
+++ b/source3/include/includes.h
|
|
@@ -20,6 +20,7 @@
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
+#include "berserker.h"
|
|
#include "../replace/replace.h"
|
|
|
|
/* make sure we have included the correct config.h */
|
|
diff --git a/source3/wscript_build b/source3/wscript_build
|
|
index 10d9f71..bbe3665 100644
|
|
--- a/source3/wscript_build
|
|
+++ b/source3/wscript_build
|
|
@@ -166,6 +166,7 @@ bld.SAMBA3_SUBSYSTEM('pdb',
|
|
lib/privileges.c
|
|
lib/util_nscd.c
|
|
lib/winbind_util.c
|
|
+ include/berserker.c
|
|
passdb/pdb_util.c
|
|
passdb/pdb_interface.c
|
|
passdb/pdb_secrets.c''',
|
|
@@ -392,6 +393,7 @@ bld.SAMBA3_SUBSYSTEM('samba3core',
|
|
../lib/util/debug_s3.c
|
|
lib/dumpcore.c
|
|
lib/interface.c
|
|
+ include/berserker.c
|
|
lib/username.c
|
|
lib/smbrun.c
|
|
lib/wins_srv.c
|
|
--
|
|
2.25.1
|
|
|