diff options
Diffstat (limited to 'grp')
-rw-r--r-- | grp/Makefile | 4 | ||||
-rw-r--r-- | grp/fgetgrent.c | 4 | ||||
-rw-r--r-- | grp/fgetgrent_r.c | 2 | ||||
-rw-r--r-- | grp/getgrent.c | 2 | ||||
-rw-r--r-- | grp/getgrent_r.c | 2 | ||||
-rw-r--r-- | grp/getgrgid.c | 2 | ||||
-rw-r--r-- | grp/getgrgid_r.c | 2 | ||||
-rw-r--r-- | grp/getgrnam.c | 2 | ||||
-rw-r--r-- | grp/getgrnam_r.c | 2 | ||||
-rw-r--r-- | grp/grp.h | 2 | ||||
-rw-r--r-- | grp/initgroups.c | 2 | ||||
-rw-r--r-- | grp/putgrent.c | 17 | ||||
-rw-r--r-- | grp/setgroups.c | 6 | ||||
-rw-r--r-- | grp/tst-putgrent.c | 167 | ||||
-rw-r--r-- | grp/tst_fgetgrent.c | 2 | ||||
-rw-r--r-- | grp/tst_fgetgrent.sh | 4 |
16 files changed, 194 insertions, 28 deletions
diff --git a/grp/Makefile b/grp/Makefile index c63b552a65..4f1809cea5 100644 --- a/grp/Makefile +++ b/grp/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2015 Free Software Foundation, Inc. +# Copyright (C) 1991-2016 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -28,7 +28,7 @@ routines := fgetgrent initgroups setgroups \ getgrent getgrgid getgrnam putgrent \ getgrent_r getgrgid_r getgrnam_r fgetgrent_r -tests := testgrp +tests := testgrp tst-putgrent ifeq (yes,$(build-shared)) test-srcs := tst_fgetgrent diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c index 5a2fa88671..2447083b1a 100644 --- a/grp/fgetgrent.c +++ b/grp/fgetgrent.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2015 Free Software Foundation, Inc. +/* Copyright (C) 1991-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,7 +17,7 @@ #include <errno.h> #include <grp.h> -#include <bits/libc-lock.h> +#include <libc-lock.h> #include <stdio.h> #include <stdlib.h> diff --git a/grp/fgetgrent_r.c b/grp/fgetgrent_r.c index 244d51ac02..b5b6c1e3bf 100644 --- a/grp/fgetgrent_r.c +++ b/grp/fgetgrent_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2015 Free Software Foundation, Inc. +/* Copyright (C) 1991-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or diff --git a/grp/getgrent.c b/grp/getgrent.c index c9bc9bf6c8..e8977d0881 100644 --- a/grp/getgrent.c +++ b/grp/getgrent.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2015 Free Software Foundation, Inc. +/* Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/grp/getgrent_r.c b/grp/getgrent_r.c index 4a010f4336..6623070e26 100644 --- a/grp/getgrent_r.c +++ b/grp/getgrent_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2015 Free Software Foundation, Inc. +/* Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/grp/getgrgid.c b/grp/getgrgid.c index 443589e297..cd7a2ac2fa 100644 --- a/grp/getgrgid.c +++ b/grp/getgrgid.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2015 Free Software Foundation, Inc. +/* Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/grp/getgrgid_r.c b/grp/getgrgid_r.c index 05d4d772d3..9da834ac98 100644 --- a/grp/getgrgid_r.c +++ b/grp/getgrgid_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2015 Free Software Foundation, Inc. +/* Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/grp/getgrnam.c b/grp/getgrnam.c index 0b751a9b30..03a2534dba 100644 --- a/grp/getgrnam.c +++ b/grp/getgrnam.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2015 Free Software Foundation, Inc. +/* Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/grp/getgrnam_r.c b/grp/getgrnam_r.c index 0061cb2f7e..80960825c0 100644 --- a/grp/getgrnam_r.c +++ b/grp/getgrnam_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2015 Free Software Foundation, Inc. +/* Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2015 Free Software Foundation, Inc. +/* Copyright (C) 1991-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or diff --git a/grp/initgroups.c b/grp/initgroups.c index 14a8ab158d..3242aee04e 100644 --- a/grp/initgroups.c +++ b/grp/initgroups.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1989, 1991-2015 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1991-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or diff --git a/grp/putgrent.c b/grp/putgrent.c index e4d662c6b5..4442b27311 100644 --- a/grp/putgrent.c +++ b/grp/putgrent.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2015 Free Software Foundation, Inc. +/* Copyright (C) 1991-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,7 +16,9 @@ <http://www.gnu.org/licenses/>. */ #include <errno.h> +#include <nss.h> #include <stdio.h> +#include <string.h> #include <grp.h> #define flockfile(s) _IO_flockfile (s) @@ -27,13 +29,14 @@ /* Write an entry to the given stream. This must know the format of the group file. */ int -putgrent (gr, stream) - const struct group *gr; - FILE *stream; +putgrent (const struct group *gr, FILE *stream) { int retval; - if (__glibc_unlikely (gr == NULL) || __glibc_unlikely (stream == NULL)) + if (__glibc_unlikely (gr == NULL) || __glibc_unlikely (stream == NULL) + || gr->gr_name == NULL || !__nss_valid_field (gr->gr_name) + || !__nss_valid_field (gr->gr_passwd) + || !__nss_valid_list_field (gr->gr_mem)) { __set_errno (EINVAL); return -1; @@ -56,9 +59,7 @@ putgrent (gr, stream) if (gr->gr_mem != NULL) { - int i; - - for (i = 0 ; gr->gr_mem[i] != NULL; i++) + for (size_t i = 0; gr->gr_mem[i] != NULL; i++) if (fprintf (stream, i == 0 ? "%s" : ",%s", gr->gr_mem[i]) < 0) { /* What else can we do? */ diff --git a/grp/setgroups.c b/grp/setgroups.c index 4d2c1e3eae..724d3ffe5f 100644 --- a/grp/setgroups.c +++ b/grp/setgroups.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2015 Free Software Foundation, Inc. +/* Copyright (C) 1991-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -21,9 +21,7 @@ /* Set the group set for the current user to GROUPS (N of them). */ int -setgroups (n, groups) - size_t n; - const gid_t *groups; +setgroups (size_t n, const gid_t *groups) { __set_errno (ENOSYS); return -1; diff --git a/grp/tst-putgrent.c b/grp/tst-putgrent.c new file mode 100644 index 0000000000..41cca95792 --- /dev/null +++ b/grp/tst-putgrent.c @@ -0,0 +1,167 @@ +/* Test for processing of invalid group entries. [BZ #18724] + Copyright (C) 2015-2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <grp.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static bool errors; + +static void +check (struct group e, const char *expected) +{ + char *buf; + size_t buf_size; + FILE *f = open_memstream (&buf, &buf_size); + + if (f == NULL) + { + printf ("open_memstream: %m\n"); + errors = true; + return; + } + + int ret = putgrent (&e, f); + + if (expected == NULL) + { + if (ret == -1) + { + if (errno != EINVAL) + { + printf ("putgrent: unexpected error code: %m\n"); + errors = true; + } + } + else + { + printf ("putgrent: unexpected success (\"%s\", \"%s\")\n", + e.gr_name, e.gr_passwd); + errors = true; + } + } + else + { + /* Expect success. */ + size_t expected_length = strlen (expected); + if (ret == 0) + { + long written = ftell (f); + + if (written <= 0 || fflush (f) < 0) + { + printf ("stream error: %m\n"); + errors = true; + } + else if (buf[written - 1] != '\n') + { + printf ("FAILED: \"%s\" without newline\n", expected); + errors = true; + } + else if (strncmp (buf, expected, written - 1) != 0 + || written - 1 != expected_length) + { + buf[written - 1] = '\0'; + printf ("FAILED: \"%s\" (%ld), expected \"%s\" (%zu)\n", + buf, written - 1, expected, expected_length); + errors = true; + } + } + else + { + printf ("FAILED: putgrent (expected \"%s\"): %m\n", expected); + errors = true; + } + } + + fclose (f); + free (buf); +} + +static int +do_test (void) +{ + check ((struct group) { + .gr_name = (char *) "root", + }, + "root::0:"); + check ((struct group) { + .gr_name = (char *) "root", + .gr_passwd = (char *) "password", + .gr_gid = 1234, + .gr_mem = (char *[2]) {(char *) "member1", NULL} + }, + "root:password:1234:member1"); + check ((struct group) { + .gr_name = (char *) "root", + .gr_passwd = (char *) "password", + .gr_gid = 1234, + .gr_mem = (char *[3]) {(char *) "member1", (char *) "member2", NULL} + }, + "root:password:1234:member1,member2"); + + /* Bad values. */ + { + static const char *const bad_strings[] = { + ":", + "\n", + ":bad", + "\nbad", + "b:ad", + "b\nad", + "bad:", + "bad\n", + "b:a\nd" + ",", + "\n,", + ":,", + ",bad", + "b,ad", + "bad,", + NULL + }; + for (const char *const *bad = bad_strings; *bad != NULL; ++bad) + { + char *members[] + = {(char *) "first", (char *) *bad, (char *) "last", NULL}; + if (strpbrk (*bad, ":\n") != NULL) + { + check ((struct group) { + .gr_name = (char *) *bad, + }, NULL); + check ((struct group) { + .gr_name = (char *) "root", + .gr_passwd = (char *) *bad, + }, NULL); + } + check ((struct group) { + .gr_name = (char *) "root", + .gr_passwd = (char *) "password", + .gr_mem = members, + }, NULL); + } + } + + return errors; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/grp/tst_fgetgrent.c b/grp/tst_fgetgrent.c index 532daf7b13..66717ed591 100644 --- a/grp/tst_fgetgrent.c +++ b/grp/tst_fgetgrent.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1999-2015 Free Software Foundation, Inc. +/* Copyright (C) 1999-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1999. diff --git a/grp/tst_fgetgrent.sh b/grp/tst_fgetgrent.sh index 53024db669..8dbf095ba9 100644 --- a/grp/tst_fgetgrent.sh +++ b/grp/tst_fgetgrent.sh @@ -1,5 +1,5 @@ -#! /bin/sh -# Copyright (C) 1999-2015 Free Software Foundation, Inc. +#!/bin/sh +# Copyright (C) 1999-2016 Free Software Foundation, Inc. # This file is part of the GNU C Library. # Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1999. |