[SCM] NSS Wrapper Repository - branch master updated
Andreas Schneider
asn at samba.org
Wed Jan 25 10:06:28 UTC 2023
The branch, master has been updated
via b33232f tests: Add test_initgroups
via 91974ea tests: Add more groups and groups members
via 0c90c43 tests: Implement _nss_nwrap_initgroups_dyn(), _nss_nwrap_getgrent_r(), _nss_nwrap_getgrnam_r() and _nss_nwrap_getgrgid_r()
via 1a010f2 nwrap,tests: Use nwrap_gr_copy_r() from lib nss_utils
via e60ad71 nwrap: Create library nss_utils
via 34a6808 nwrap: Implement initgroups() using nwrap_getgrouplist()
via 01b66b0 nwrap: Implement getgrouplist() correctly
via 5b60119 nwrap: Implement nwrap_files_initgroups_dyn()
via 666bd92 nwrap: Add MIN(), MAX() macros
via cce021a nwrap: Correctly implement initgroups_dyn() for the modules
via 24c7064 nwrap: Remove incorrect implementation of nwrap_initgroups()
via 5243f74 Add clang-format definitions
from 25a5a11 Avoid dclose(RTLD_NEXT)
https://git.samba.org/?p=nss_wrapper.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit b33232ff661cc377a0bb75b40dd5ea6b1754e4fb
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Thu Jan 19 22:35:00 2023 +0100
tests: Add test_initgroups
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 91974ea4b6985febe58aadaf9924bc62cdcbcbc4
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Jan 16 21:30:46 2023 +0100
tests: Add more groups and groups members
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 0c90c4380a52615460c5e98b3aed09f7e14de907
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Jan 16 21:27:05 2023 +0100
tests: Implement _nss_nwrap_initgroups_dyn(), _nss_nwrap_getgrent_r(), _nss_nwrap_getgrnam_r() and _nss_nwrap_getgrgid_r()
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 1a010f2c9de81e0ee2dc9b3e660ad65bcdddf7bd
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 17 11:50:08 2023 +0100
nwrap,tests: Use nwrap_gr_copy_r() from lib nss_utils
nss_utils must be added to both nwrap,tests at the same time
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit e60ad71576352995d91036f2555f672291837591
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 17 11:48:12 2023 +0100
nwrap: Create library nss_utils
Will be used to share function nwrap_gr_copy_r among src and test
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 34a6808f34f5ce805ec39ffea3657901434479d2
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Jan 16 20:58:17 2023 +0100
nwrap: Implement initgroups() using nwrap_getgrouplist()
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 01b66b0a51deb538cfc5a31230053cc5128b0a46
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Mon Jan 16 20:52:45 2023 +0100
nwrap: Implement getgrouplist() correctly
The main job is done in nwrap_getgrouplist() that will be used also by
initgroups() next.
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 5b601190c87f768f1bf77fd8b993f6b3ad98ac24
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 17 09:51:08 2023 +0100
nwrap: Implement nwrap_files_initgroups_dyn()
This implements the initgroups_dyn() for the files part correctly. We need to
reimplement initgroups() later.
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 666bd92a7f40c4930cb2b20bd81a8c66effad090
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 17 07:21:34 2023 +0100
nwrap: Add MIN(), MAX() macros
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit cce021aed6ab893eb131e6a47879d7333ff01d69
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 17 09:50:22 2023 +0100
nwrap: Correctly implement initgroups_dyn() for the modules
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 24c7064e7bfc8288028708af973cb793d6a1bba0
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 17 09:43:45 2023 +0100
nwrap: Remove incorrect implementation of nwrap_initgroups()
This will be correctly implemented later. The backends actually don't have an
initgroups() function but initgroups_dyn().
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 5243f743db1e43f8607403700c159a833eeef25a
Author: Pavel Filipenský <pfilipensky at samba.org>
Date: Tue Jan 17 09:34:50 2023 +0100
Add clang-format definitions
Signed-off-by: Pavel Filipenský <pfilipensky at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
-----------------------------------------------------------------------
Summary of changes:
.clang-format | 26 +++
src/CMakeLists.txt | 3 +-
src/nss_utils.c | 131 ++++++++++++++++
src/nss_utils.h | 46 ++++++
src/nss_wrapper.c | 409 ++++++++++++++++++++++--------------------------
tests/CMakeLists.txt | 19 ++-
tests/group.in | 3 +-
tests/nss_nwrap.c | 191 +++++++++++++++++-----
tests/test_initgroups.c | 52 ++++++
9 files changed, 618 insertions(+), 262 deletions(-)
create mode 100644 .clang-format
create mode 100644 src/nss_utils.c
create mode 100644 src/nss_utils.h
create mode 100644 tests/test_initgroups.c
Changeset truncated at 500 lines:
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..5385807
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,26 @@
+# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
+BasedOnStyle: LLVM
+IndentWidth: 8
+ContinuationIndentWidth: 8
+UseTab: true
+BreakBeforeBraces: Custom
+BraceWrapping:
+ AfterEnum: false
+ AfterFunction: true
+ AfterStruct: false
+ AfterUnion: false
+ AfterExternBlock: true
+ BeforeElse: false
+ BeforeWhile: false
+AllowShortIfStatementsOnASingleLine: false
+ColumnLimit: 80
+IndentCaseLabels: false
+AlignAfterOpenBracket: Align
+BinPackParameters: false
+BinPackArguments: false
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowAllArgumentsOnNextLine: false
+AllowShortFunctionsOnASingleLine: Empty
+AlwaysBreakAfterReturnType: None
+AlignEscapedNewlines: Left
+SortIncludes: false
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2103a0c..f56aad5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,6 @@
project(libnss_wrapper C)
+add_library(nss_utils STATIC nss_utils.c)
add_library(nss_wrapper SHARED nss_wrapper.c)
target_compile_options(nss_wrapper
PRIVATE
@@ -12,7 +13,7 @@ endif()
target_include_directories(nss_wrapper
PRIVATE
${CMAKE_BINARY_DIR})
-target_link_libraries(nss_wrapper ${NWRAP_REQUIRED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(nss_wrapper nss_utils ${NWRAP_REQUIRED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
set_target_properties(
nss_wrapper
diff --git a/src/nss_utils.c b/src/nss_utils.c
new file mode 100644
index 0000000..1d0a3d0
--- /dev/null
+++ b/src/nss_utils.c
@@ -0,0 +1,131 @@
+/*
+ * BSD 3-Clause License
+ *
+ * Copyright (c) 2007, Stefan Metzmacher <metze at samba.org>
+ * Copyright (c) 2009, Guenther Deschner <gd at samba.org>
+ * Copyright (c) 2014-2015, Michael Adam <obnox at samba.org>
+ * Copyright (c) 2015, Robin Hack <hack.robin at gmail.com>
+ * Copyright (c) 2013-2018, Andreas Schneider <asn at samba.org>
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * 3. Neither the name of the author nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * 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 <errno.h>
+#include <grp.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "nss_utils.h"
+
+int nwrap_gr_copy_r(const struct group *src, struct group *dst,
+ char *buf, size_t buflen, struct group **dstp)
+{
+ char *p = NULL;
+ uintptr_t align = 0;
+ unsigned int gr_mem_cnt = 0;
+ unsigned i;
+ size_t total_len;
+ size_t gr_name_len = strlen(src->gr_name) + 1;
+ size_t gr_passwd_len = strlen(src->gr_passwd) + 1;
+ union {
+ char *ptr;
+ char **data;
+ } g_mem;
+
+ for (i = 0; src->gr_mem[i] != NULL; i++) {
+ gr_mem_cnt++;
+ }
+
+ /* Align the memory for storing pointers */
+ align = __alignof__(char *) - ((p - (char *)0) % __alignof__(char *));
+ total_len = align +
+ (1 + gr_mem_cnt) * sizeof(char *) +
+ gr_name_len + gr_passwd_len;
+
+ if (total_len > buflen) {
+ errno = ERANGE;
+ return -1;
+ }
+ buflen -= total_len;
+
+ /* gr_mem */
+ p = buf + align;
+ g_mem.ptr = p;
+ dst->gr_mem = g_mem.data;
+
+ /* gr_name */
+ p += (1 + gr_mem_cnt) * sizeof(char *);
+ dst->gr_name = p;
+
+ /* gr_passwd */
+ p += gr_name_len;
+ dst->gr_passwd = p;
+
+ /* gr_mem[x] */
+ p += gr_passwd_len;
+
+ /* gr_gid */
+ dst->gr_gid = src->gr_gid;
+
+ memcpy(dst->gr_name, src->gr_name, gr_name_len);
+
+ memcpy(dst->gr_passwd, src->gr_passwd, gr_passwd_len);
+
+ /* Set the terminating entry */
+ dst->gr_mem[gr_mem_cnt] = NULL;
+
+ /* Now add the group members content */
+ total_len = 0;
+ for (i = 0; i < gr_mem_cnt; i++) {
+ size_t len = strlen(src->gr_mem[i]) + 1;
+
+ dst->gr_mem[i] = p;
+ total_len += len;
+ p += len;
+ }
+
+ if (total_len > buflen) {
+ errno = ERANGE;
+ return -1;
+ }
+
+ for (i = 0; i < gr_mem_cnt; i++) {
+ size_t len = strlen(src->gr_mem[i]) + 1;
+
+ memcpy(dst->gr_mem[i],
+ src->gr_mem[i],
+ len);
+ }
+
+ if (dstp != NULL) {
+ *dstp = dst;
+ }
+
+ return 0;
+}
diff --git a/src/nss_utils.h b/src/nss_utils.h
new file mode 100644
index 0000000..6a9c478
--- /dev/null
+++ b/src/nss_utils.h
@@ -0,0 +1,46 @@
+/*
+ * BSD 3-Clause License
+ *
+ * Copyright (c) 2007, Stefan Metzmacher <metze at samba.org>
+ * Copyright (c) 2009, Guenther Deschner <gd at samba.org>
+ * Copyright (c) 2014-2015, Michael Adam <obnox at samba.org>
+ * Copyright (c) 2015, Robin Hack <hack.robin at gmail.com>
+ * Copyright (c) 2013-2018, Andreas Schneider <asn at samba.org>
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * 3. Neither the name of the author nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * 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.
+ */
+
+#ifndef NSS_UTILS_H
+#define NSS_UTILS_H
+#include <grp.h>
+
+int nwrap_gr_copy_r(const struct group *src, struct group *dst,
+ char *buf, size_t buflen, struct group **dstp);
+
+#endif //NSS_UTILS_H
diff --git a/src/nss_wrapper.c b/src/nss_wrapper.c
index 0b2066c..3399f06 100644
--- a/src/nss_wrapper.c
+++ b/src/nss_wrapper.c
@@ -54,12 +54,14 @@
#include <string.h>
#include <unistd.h>
#include <ctype.h>
+#include <limits.h>
#include <netinet/in.h>
#include <search.h>
#include <assert.h>
+#include "nss_utils.h"
/*
* Defining _POSIX_PTHREAD_SEMANTICS before including pwd.h and grp.h gives us
* the posix getpwnam_r(), getpwuid_r(), getgrnam_r and getgrgid_r calls on
@@ -177,6 +179,9 @@ typedef nss_status_t NSS_STATUS;
#define NWRAP_INET_ADDRSTRLEN INET_ADDRSTRLEN
#endif
+#define MAX(a,b) ((a) < (b) ? (b) : (a))
+#define MIN(a,b) ((a) > (b) ? (b) : (a))
+
static bool nwrap_initialized = false;
static pthread_mutex_t nwrap_initialized_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -516,7 +521,7 @@ typedef NSS_STATUS (*__nss_getpwent_r)(struct passwd *result,
size_t buflen,
int *errnop);
typedef NSS_STATUS (*__nss_endpwent)(void);
-typedef NSS_STATUS (*__nss_initgroups)(const char *user,
+typedef NSS_STATUS (*__nss_initgroups_dyn)(const char *user,
gid_t group,
long int *start,
long int *size,
@@ -568,7 +573,7 @@ struct nwrap_nss_module_symbols {
NWRAP_NSS_MODULE_SYMBOL_ENTRY(getpwent_r);
NWRAP_NSS_MODULE_SYMBOL_ENTRY(endpwent);
- NWRAP_NSS_MODULE_SYMBOL_ENTRY(initgroups);
+ NWRAP_NSS_MODULE_SYMBOL_ENTRY(initgroups_dyn);
NWRAP_NSS_MODULE_SYMBOL_ENTRY(getgrnam_r);
NWRAP_NSS_MODULE_SYMBOL_ENTRY(getgrgid_r);
NWRAP_NSS_MODULE_SYMBOL_ENTRY(setgrent);
@@ -606,8 +611,14 @@ struct nwrap_ops {
struct passwd *pwdst, char *buf,
size_t buflen, struct passwd **pwdstp);
void (*nw_endpwent)(struct nwrap_backend *b);
- int (*nw_initgroups)(struct nwrap_backend *b,
- const char *user, gid_t group);
+ int (*nw_initgroups_dyn)(struct nwrap_backend *b,
+ const char *user,
+ gid_t group,
+ long int *start,
+ long int *size,
+ gid_t **groups,
+ long int limit,
+ int *errnop);
struct group * (*nw_getgrnam)(struct nwrap_backend *b,
const char *name);
int (*nw_getgrnam_r)(struct nwrap_backend *b,
@@ -663,8 +674,14 @@ static int nwrap_files_getpwent_r(struct nwrap_backend *b,
struct passwd *pwdst, char *buf,
size_t buflen, struct passwd **pwdstp);
static void nwrap_files_endpwent(struct nwrap_backend *b);
-static int nwrap_files_initgroups(struct nwrap_backend *b,
- const char *user, gid_t group);
+static int nwrap_files_initgroups_dyn(struct nwrap_backend *b,
+ const char *user,
+ gid_t group,
+ long int *start,
+ long int *size,
+ gid_t **groups,
+ long int limit,
+ int *errnop);
static struct group *nwrap_files_getgrnam(struct nwrap_backend *b,
const char *name);
static int nwrap_files_getgrnam_r(struct nwrap_backend *b,
@@ -730,8 +747,14 @@ static int nwrap_module_getgrgid_r(struct nwrap_backend *b,
char *buf, size_t buflen, struct group **grdstp);
static void nwrap_module_setgrent(struct nwrap_backend *b);
static void nwrap_module_endgrent(struct nwrap_backend *b);
-static int nwrap_module_initgroups(struct nwrap_backend *b,
- const char *user, gid_t group);
+static int nwrap_module_initgroups_dyn(struct nwrap_backend *b,
+ const char *user,
+ gid_t group,
+ long int *start,
+ long int *size,
+ gid_t **groups,
+ long int limit,
+ int *errnop);
static struct hostent *nwrap_module_gethostbyaddr(struct nwrap_backend *b,
const void *addr,
socklen_t len, int type);
@@ -754,7 +777,7 @@ struct nwrap_ops nwrap_files_ops = {
.nw_getpwent = nwrap_files_getpwent,
.nw_getpwent_r = nwrap_files_getpwent_r,
.nw_endpwent = nwrap_files_endpwent,
- .nw_initgroups = nwrap_files_initgroups,
+ .nw_initgroups_dyn = nwrap_files_initgroups_dyn,
.nw_getgrnam = nwrap_files_getgrnam,
.nw_getgrnam_r = nwrap_files_getgrnam_r,
.nw_getgrgid = nwrap_files_getgrgid,
@@ -780,7 +803,7 @@ struct nwrap_ops nwrap_module_ops = {
.nw_getpwent = nwrap_module_getpwent,
.nw_getpwent_r = nwrap_module_getpwent_r,
.nw_endpwent = nwrap_module_endpwent,
- .nw_initgroups = nwrap_module_initgroups,
+ .nw_initgroups_dyn = nwrap_module_initgroups_dyn,
.nw_getgrnam = nwrap_module_getgrnam,
.nw_getgrnam_r = nwrap_module_getgrnam_r,
.nw_getgrgid = nwrap_module_getgrgid,
@@ -820,6 +843,14 @@ static int nwrap_convert_he_ai(const struct hostent *he,
struct addrinfo **pai,
bool skip_canonname);
+#ifdef HAVE_GETGROUPLIST
+static int nwrap_getgrouplist(const char *user,
+ gid_t group,
+ long int *size,
+ gid_t **groupsp,
+ long int limit);
+#endif
+
/*
* VECTORS
*/
@@ -1826,7 +1857,7 @@ nwrap_bind_nss_module_symbols(struct nwrap_backend *b)
nwrap_nss_module_bind_symbol(setpwent);
nwrap_nss_module_bind_symbol(getpwent_r);
nwrap_nss_module_bind_symbol(endpwent);
- nwrap_nss_module_bind_symbol2(initgroups, initgroups_dyn);
+ nwrap_nss_module_bind_symbol(initgroups_dyn);
nwrap_nss_module_bind_symbol(getgrnam_r);
nwrap_nss_module_bind_symbol(getgrgid_r);
nwrap_nss_module_bind_symbol(setgrent);
@@ -2983,93 +3014,6 @@ static void nwrap_gr_unload(struct nwrap_cache *nwrap)
nwrap_gr->idx = 0;
}
-static int nwrap_gr_copy_r(const struct group *src, struct group *dst,
- char *buf, size_t buflen, struct group **dstp)
-{
- char *p = NULL;
- uintptr_t align = 0;
- unsigned int gr_mem_cnt = 0;
- unsigned i;
- size_t total_len;
- size_t gr_name_len = strlen(src->gr_name) + 1;
- size_t gr_passwd_len = strlen(src->gr_passwd) + 1;
- union {
- char *ptr;
- char **data;
- } g_mem;
-
- for (i = 0; src->gr_mem[i] != NULL; i++) {
- gr_mem_cnt++;
- }
-
- /* Align the memory for storing pointers */
- align = __alignof__(char *) - ((p - (char *)0) % __alignof__(char *));
- total_len = align +
- (1 + gr_mem_cnt) * sizeof(char *) +
- gr_name_len + gr_passwd_len;
-
- if (total_len > buflen) {
- errno = ERANGE;
- return -1;
- }
- buflen -= total_len;
-
- /* gr_mem */
- p = buf + align;
- g_mem.ptr = p;
- dst->gr_mem = g_mem.data;
-
- /* gr_name */
- p += (1 + gr_mem_cnt) * sizeof(char *);
- dst->gr_name = p;
-
- /* gr_passwd */
- p += gr_name_len;
- dst->gr_passwd = p;
-
- /* gr_mem[x] */
- p += gr_passwd_len;
-
- /* gr_gid */
- dst->gr_gid = src->gr_gid;
-
- memcpy(dst->gr_name, src->gr_name, gr_name_len);
-
- memcpy(dst->gr_passwd, src->gr_passwd, gr_passwd_len);
-
- /* Set the terminating entry */
- dst->gr_mem[gr_mem_cnt] = NULL;
-
- /* Now add the group members content */
- total_len = 0;
- for (i = 0; i < gr_mem_cnt; i++) {
- size_t len = strlen(src->gr_mem[i]) + 1;
-
- dst->gr_mem[i] = p;
- total_len += len;
- p += len;
- }
-
- if (total_len > buflen) {
- errno = ERANGE;
- return -1;
- }
-
- for (i = 0; i < gr_mem_cnt; i++) {
- size_t len = strlen(src->gr_mem[i]) + 1;
-
- memcpy(dst->gr_mem[i],
- src->gr_mem[i],
- len);
- }
-
- if (dstp != NULL) {
- *dstp = dst;
- }
-
- return 0;
-}
-
static struct nwrap_entlist *nwrap_entlist_init(struct nwrap_entdata *ed)
{
struct nwrap_entlist *el;
@@ -3691,27 +3635,21 @@ static struct spwd *nwrap_files_getspnam(const char *name)
#endif /* defined(HAVE_SHADOW_H) && defined(HAVE_GETSPNAM) */
/* misc functions */
-static int nwrap_files_initgroups(struct nwrap_backend *b,
- const char *user,
- gid_t group)
+static int nwrap_files_initgroups_dyn(struct nwrap_backend *b,
+ const char *user,
+ gid_t group,
+ long int *start,
+ long int *size,
+ gid_t **groups,
+ long int limit,
+ int *errnop)
{
struct group *grp;
- gid_t *groups;
- int size = 1;
- int rc;
-
- groups = (gid_t *)malloc(size * sizeof(gid_t));
- if (groups == NULL) {
- NWRAP_LOG(NWRAP_LOG_ERROR, "Out of memory");
- errno = ENOMEM;
--
NSS Wrapper Repository
More information about the samba-cvs
mailing list