[PATCH] support for setting permissions on unix domain sockets

Paul Lindner lindner at inuus.com
Tue Oct 16 01:14:23 UTC 2007


I applied this, along with changes to the manual page and ChangeLog.

Regards.

On Sun, Oct 14, 2007 at 12:36:56PM +0200, bremner at unb.ca wrote:
> 
> The following patch adds a new command line option "-a" which takes an
> octal permission mask (like chmod) sets the permissions on the unix
> domain socket (specified by "-s").  I think this makes unix domain
> sockets more useful from a security perspective, since it allows the
> creation of a group to control access to a given memcached instance.
> 
> #! /bin/sh /usr/share/dpatch/dpatch-run
> ## umask-unix-socket.dpatch by  <David Bremner <bremner at unb.ca>>
> ##
> ## All lines beginning with `## DP:' are a description of the patch.
> ## DP: No description.
> 
> @DPATCH@
> diff -urNad memcached-1.2.2~/memcached.c memcached-1.2.2/memcached.c
> +++ memcached-1.2.2/memcached.c	2007-10-14 09:10:40.000000000 +0200
> @@ -166,6 +166,7 @@
>  }
>  
>  static void settings_init(void) {
> +    settings.access=0700;
>      settings.port = 11211;
>      settings.udpport = 0;
>      settings.interf.s_addr = htonl(INADDR_ANY);
> @@ -2186,12 +2187,13 @@
>      return sfd;
>  }
>  
> -static int server_socket_unix(const char *path) {
> +static int server_socket_unix(const char *path, int access_mask) {
>      int sfd;
>      struct linger ling = {0, 0};
>      struct sockaddr_un addr;
>      struct stat tstat;
>      int flags =1;
> +    int old_umask;
>  
>      if (!path) {
>          return -1;
> @@ -2221,11 +2223,14 @@
>  
>      addr.sun_family = AF_UNIX;
>      strcpy(addr.sun_path, path);
> +    old_umask=umask( ~(access_mask&0777));
>      if (bind(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
>          perror("bind()");
>          close(sfd);
> +        umask(old_umask);
>          return -1;
>      }
> +    umask(old_umask);
>      if (listen(sfd, 1024) == -1) {
>          perror("listen()");
>          close(sfd);
> @@ -2475,8 +2480,13 @@
>      setbuf(stderr, NULL);
>  
>      /* process arguments */
> -    while ((c = getopt(argc, argv, "bp:s:U:m:Mc:khirvdl:u:P:f:s:n:t:D:")) != -1) {
> +    while ((c = getopt(argc, argv, "a:bp:s:U:m:Mc:khirvdl:u:P:f:s:n:t:D:")) != -1) {
>          switch (c) {
> +        case 'a':
> +            /* access for unix domain socket, as octal mask (like chmod)*/
> +            settings.access= strtol(optarg,NULL,8);
> +            break;
> +
>          case 'U':
>              settings.udpport = atoi(optarg);
>              break;
> @@ -2654,7 +2664,7 @@
>  
>      /* create unix mode sockets after dropping privileges */
>      if (settings.socketpath != NULL) {
> -        l_socket = server_socket_unix(settings.socketpath);
> +        l_socket = server_socket_unix(settings.socketpath,settings.access);
>          if (l_socket == -1) {
>              fprintf(stderr, "failed to listen\n");
>              exit(EXIT_FAILURE);
> diff -urNad memcached-1.2.2~/memcached.h memcached-1.2.2/memcached.h
> +++ memcached-1.2.2/memcached.h	2007-10-14 09:09:38.000000000 +0200
> @@ -74,6 +74,7 @@
>      bool managed;          /* if 1, a tracker manages virtual buckets */
>      int evict_to_free;
>      char *socketpath;   /* path to unix socket if using local socket */
> +    int access;  /* access mask (a la chmod) for unix domain socket */
>      double factor;          /* chunk size growth factor */
>      int chunk_size;
>      int num_threads;        /* number of libevent threads to run */
> 
> 
> 

-- 
Paul Lindner        ||||| | | | |  |  |  |   |   |
lindner at inuus.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.danga.com/pipermail/memcached/attachments/20071015/fd3c85cc/attachment.pgp


More information about the memcached mailing list