X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fmisc%2Ftcpwrapper.c;h=e9eb1df91a3063c39f3e8b348125e0d92f09ee2d;hp=f7fd3a9cd2d1bfe5dc13051e00bbd42c7771262c;hb=4cacc965afc4fb03a465ffcc6cb3078aeadc3818;hpb=58e0a308fec476361dd21f7d3856faceb6e308ee diff --git a/support/misc/tcpwrapper.c b/support/misc/tcpwrapper.c index f7fd3a9..e9eb1df 100644 --- a/support/misc/tcpwrapper.c +++ b/support/misc/tcpwrapper.c @@ -45,6 +45,11 @@ #include #include #include +#include +#include + +#include "xlog.h" + #ifdef SYSV40 #include #include @@ -53,6 +58,8 @@ static void logit(int severity, struct sockaddr_in *addr, u_long procnum, u_long prognum, char *text); static void toggle_verboselog(int sig); +static int check_files(void); + int verboselog = 0; int allow_severity = LOG_INFO; int deny_severity = LOG_WARNING; @@ -115,7 +122,7 @@ inline unsigned int strtoint(char *str) return n; } -inline int hashint(unsigned int num) +static inline int hashint(unsigned int num) { return num % HASH_TABLE_SIZE; } @@ -176,17 +183,27 @@ struct sockaddr_in *addr; /* Now do the hostname lookup */ hp = gethostbyaddr ((const char *) &(addr->sin_addr), sizeof (addr->sin_addr), AF_INET); - if (!hp) + if (!hp) { + xlog(L_WARNING, + "Warning: Client IP address '%s' not found in host lookup", + inet_ntoa(addr->sin_addr)); return DENY; /* never heard of it. misconfigured DNS? */ + } /* Make sure the hostent is authorative. */ tmpname = strdup(hp->h_name); - if (!tmpname) + if (!tmpname) { + xlog(L_WARNING, "Warning: No memory for Host access check"); return DENY; + } hp = gethostbyname(tmpname); - free(tmpname); - if (!hp) + if (!hp) { + xlog(L_WARNING, + "Warning: Client hostname '%s' not found in host lookup", tmpname); + free(tmpname); return DENY; /* never heard of it. misconfigured DNS? */ + } + free(tmpname); /* Now make sure the address is on the list */ for (sp = hp->h_addr_list ; *sp ; sp++) { @@ -246,6 +263,33 @@ void check_startup(void) (void) signal(SIGINT, toggle_verboselog); } +/* check_files - check to see if either access files have changed */ + +static int check_files() +{ + static time_t allow_mtime, deny_mtime; + struct stat astat, dstat; + int changed = 0; + + if (stat("/etc/hosts.allow", &astat) < 0) + astat.st_mtime = 0; + if (stat("/etc/hosts.deny", &dstat) < 0) + dstat.st_mtime = 0; + + if(!astat.st_mtime || !dstat.st_mtime) + return changed; + + if (astat.st_mtime != allow_mtime) + changed = 1; + else if (dstat.st_mtime != deny_mtime) + changed = 1; + + allow_mtime = astat.st_mtime; + deny_mtime = dstat.st_mtime; + + return changed; +} + /* check_default - additional checks for NULL, DUMP, GETPORT and unknown */ int @@ -256,20 +300,27 @@ u_long proc; u_long prog; { haccess_t *acc = NULL; + int changed = check_files(); acc = haccess_lookup(addr, proc, prog); - if (acc) + if (acc && changed == 0) return (acc->access); if (!(from_local(addr) || good_client(daemon, addr))) { log_bad_host(addr, proc, prog); - haccess_add(addr, proc, prog, FALSE); + if (acc) + acc->access = FALSE; + else + haccess_add(addr, proc, prog, FALSE); return (FALSE); } if (verboselog) log_client(addr, proc, prog); - haccess_add(addr, proc, prog, TRUE); + if (acc) + acc->access = TRUE; + else + haccess_add(addr, proc, prog, TRUE); return (TRUE); }