diff options
-rw-r--r-- | trans/Makefile | 6 | ||||
-rw-r--r-- | trans/password.c | 30 |
2 files changed, 23 insertions, 13 deletions
diff --git a/trans/Makefile b/trans/Makefile index 291df2f3..c0386d08 100644 --- a/trans/Makefile +++ b/trans/Makefile @@ -1,6 +1,6 @@ # # Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2006, 2007, -# 2008 Free Software Foundation, Inc. +# 2008, 2013 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -32,6 +32,10 @@ OBJS = $(SRCS:.c=.o) fsysServer.o ifsockServer.o passwordServer.o \ HURDLIBS = ports netfs trivfs iohelp fshelp pipe ihash shouldbeinlibc LDLIBS += -lpthread password-LDLIBS = $(LIBCRYPT) +password-MIGSFLAGS=\ + "-DIO_INTRAN=trivfs_protid_t trivfs_begin_using_protid (io_t)" \ + "-DIO_DESTRUCTOR=trivfs_end_using_protid (trivfs_protid_t)" \ + "-DPASSWORD_IMPORTS=import <hurd/trivfs.h>;" include ../Makeconf diff --git a/trans/password.c b/trans/password.c index 6f15a9e8..344b78ba 100644 --- a/trans/password.c +++ b/trans/password.c @@ -1,5 +1,5 @@ /* Hurd standard password server. - Copyright (C) 1999 Free Software Foundation + Copyright (C) 1999, 2013 Free Software Foundation Written by Mark Kettenis. The GNU Hurd is free software; you can redistribute it and/or @@ -135,10 +135,9 @@ trivfs_goaway (struct trivfs_control *fsys, int flags) /* Implement password_check_user as described in <hurd/password.defs>. */ kern_return_t -S_password_check_user (io_t server, uid_t user, char *pw, +S_password_check_user (struct trivfs_protid *cred, uid_t user, char *pw, mach_port_t *port, mach_msg_type_name_t *port_type) { - struct trivfs_protid *cred; struct ugids ugids = UGIDS_INIT; auth_t auth; error_t err; @@ -150,10 +149,16 @@ S_password_check_user (io_t server, uid_t user, char *pw, return strdup (pw); } - cred = ports_lookup_port (port_bucket, server, trivfs_protid_portclasses[0]); if (! cred) return EOPNOTSUPP; + if (cred->pi.bucket != port_bucket || + cred->pi.class != trivfs_protid_portclasses[0]) + { + ports_port_deref (cred); + return EOPNOTSUPP; + } + /* Verify password. */ err = ugids_add_user (&ugids, user, 1); if (!err) @@ -173,17 +178,14 @@ S_password_check_user (io_t server, uid_t user, char *pw, } ugids_fini (&ugids); - - ports_port_deref (cred); return err; } /* Implement password_check_group as described in <hurd/password.defs>. */ kern_return_t -S_password_check_group (io_t server, uid_t group, char *pw, +S_password_check_group (struct trivfs_protid *cred, uid_t group, char *pw, mach_port_t *port, mach_msg_type_name_t *port_type) { - struct trivfs_protid *cred; struct ugids ugids = UGIDS_INIT; auth_t auth; error_t err; @@ -195,10 +197,16 @@ S_password_check_group (io_t server, uid_t group, char *pw, return strdup (pw); } - cred = ports_lookup_port (port_bucket, server, trivfs_protid_portclasses[0]); if (! cred) return EOPNOTSUPP; - + + if (cred->pi.bucket != port_bucket || + cred->pi.class != trivfs_protid_portclasses[0]) + { + ports_port_deref (cred); + return EOPNOTSUPP; + } + /* Verify password. */ err = ugids_add_gid (&ugids, group, 1); if (!err) @@ -218,7 +226,5 @@ S_password_check_group (io_t server, uid_t group, char *pw, } ugids_fini (&ugids); - - ports_port_deref (cred); return err; } |