[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