X-Git-Url: https://git.distorted.org.uk/~mdw/become/blobdiff_plain/318c0b91a9792fc47f72948a2898f0a6e4fbe440..de6b9020329097347f273787932426b45e94bc50:/src/check.c diff --git a/src/check.c b/src/check.c index a2d13b5..f4ac5e9 100644 --- a/src/check.c +++ b/src/check.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: check.c,v 1.7 1998/04/23 13:22:08 mdw Exp $ + * $Id: check.c,v 1.10 1999/05/04 16:17:12 mdw Exp $ * * Check validity of requests * @@ -29,6 +29,19 @@ /*----- Revision history --------------------------------------------------* * * $Log: check.c,v $ + * Revision 1.10 1999/05/04 16:17:12 mdw + * Change to header file name for parser. See log for `parse.h' for + * details. + * + * Revision 1.9 1998/06/19 13:48:16 mdw + * Set close-on-exec flag for UDP socket. + * + * Revision 1.8 1998/06/18 15:10:44 mdw + * SECURITY HOLE: the file descriptor for the secret key was left open and + * inherited by the target process. This is now fixed. Also set + * close-on-exec flags on key file, close config file carefully, and close + * UDP socket after receiving reply from server. + * * Revision 1.7 1998/04/23 13:22:08 mdw * Support no-network configuration option, and new interface to * configuration file parser. @@ -77,6 +90,7 @@ #include +#include #include #include @@ -90,7 +104,7 @@ #include "name.h" #include "netg.h" #include "rule.h" -#include "parser.h" +#include "parse.h" #include "tx.h" #include "userdb.h" #include "utils.h" @@ -166,7 +180,12 @@ static int check__ask(request *rq, struct sockaddr_in *serv, size_t n_serv) die("couldn't open key file `%s': %s", file_KEY, strerror(errno)); } + if (fcntl(fileno(fp), F_SETFD, 1) < 0) { + die("couldn't set close-on-exec on key file `%s': %s", file_KEY, + strerror(errno)); + } tx_getBits(k, 128, fp); + fclose(fp); /* --- Now build a request packet --- */ @@ -184,6 +203,8 @@ static int check__ask(request *rq, struct sockaddr_in *serv, size_t n_serv) if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) die("couldn't create socket: %s", strerror(errno)); + if (fcntl(fd, F_SETFD, 1) < 0) + die("couldn't set close-on-exec flag for socket: %s", strerror(errno)); /* --- Bind myself to some address --- */ @@ -300,7 +321,7 @@ static int check__ask(request *rq, struct sockaddr_in *serv, size_t n_serv) T( trace(TRACE_CLIENT, "client: reply from unknown host"); ) continue; } - + /* --- Unpack and verify the response --- */ answer = crypt_unpackReply(buff, sk, t, pid); @@ -309,6 +330,7 @@ static int check__ask(request *rq, struct sockaddr_in *serv, size_t n_serv) "client: invalid or corrupt reply packet"); ) continue; } + close(fd); return (answer); } } @@ -554,6 +576,7 @@ int check(request *rq) rule_init(); lexer_scan(fp); parse(); + fclose(fp); return (rule_check(rq)); }