checkgid.c revision cee52fb06eb61191ce5d495abda58a75a9bb1c4f
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe/* ====================================================================
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * The Apache Software License, Version 1.1
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Copyright (c) 2001 The Apache Software Foundation. All rights
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * reserved.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Redistribution and use in source and binary forms, with or without
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * modification, are permitted provided that the following conditions
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * are met:
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * 1. Redistributions of source code must retain the above copyright
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * notice, this list of conditions and the following disclaimer.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * 2. Redistributions in binary form must reproduce the above copyright
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * notice, this list of conditions and the following disclaimer in
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * the documentation and/or other materials provided with the
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * distribution.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * 3. The end-user documentation included with the redistribution,
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * if any, must include the following acknowledgment:
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * "This product includes software developed by the
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Apache Software Foundation (http://www.apache.org/)."
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Alternately, this acknowledgment may appear in the software itself,
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * if and wherever such third-party acknowledgments normally appear.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * 4. The names "Apache" and "Apache Software Foundation" must
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * not be used to endorse or promote products derived from this
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * software without prior written permission. For written
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * permission, please contact apache@apache.org.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * 5. Products derived from this software may not be called "Apache",
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * nor may "Apache" appear in their name, without prior written
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * permission of the Apache Software Foundation.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * SUCH DAMAGE.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * ====================================================================
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * This software consists of voluntary contributions made by many
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * individuals on behalf of the Apache Software Foundation. For more
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * information on the Apache Software Foundation, please see
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * <http://www.apache.org/>.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe/*
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Given one or more group identifers on the command line (e.g.,
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * "httpd" or "#-1"), figure out whether they'll be valid for
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * the server to use at run-time.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * If a groupname isn't found, or we can't setgid() to it, return
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * -1. If all groups are valid, return 0.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe *
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * This may need to be run as the superuser for the setgid() to
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * succeed; running it as any other user may result in a false
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * negative.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#include "ap_config.h"
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#if APR_HAVE_STDIO_H
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#include <stdio.h>
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#endif
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#if APR_HAVE_SYS_TYPES_H
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#include <sys/types.h>
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#endif
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#if HAVE_GRP_H
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#include <grp.h>
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#endif
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#if APR_HAVE_UNISTD_H
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#include <unistd.h>
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe#endif
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wroweint main(int argc, char *argv[])
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe{
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe int i;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe int result;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe gid_t gid;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe struct group *grent;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe struct group fake_grent;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe /*
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Assume success. :-)
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe result = 0;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe for (i = 1; i < argc; ++i) {
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe char *arg;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe arg = argv[i];
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe /*
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * If it's from a 'Group #-1' statement, get the numeric value
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * and skip the group lookup stuff.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe if (*arg == '#') {
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe gid = atoi(&arg[1]);
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe fake_grent.gr_gid = gid;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe grent = &fake_grent;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe }
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe else {
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe grent = getgrnam(arg);
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe }
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe /*
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * A NULL return means no such group was found, so we're done
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * with this one.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe if (grent == NULL) {
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe fprintf(stderr, "%s: group '%s' not found\n", argv[0], arg);
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe result = -1;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe }
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe else {
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe int check;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe /*
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * See if we can switch to the numeric GID we have. If so,
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * all well and good; if not, well..
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe gid = grent->gr_gid;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe check = setgid(gid);
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe if (check != 0) {
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe fprintf(stderr, "%s: invalid group '%s'\n", argv[0], arg);
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe perror(argv[0]);
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe result = -1;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe }
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe }
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe }
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe /*
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Worst-case return value.
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe return result;
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe}
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe/*
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * Local Variables:
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * mode: C
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * c-file-style: "bsd"
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe * End:
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe */
fc32fe886201ffcf1ca557bdf7d34a7468ab3374wrowe