summaryrefslogtreecommitdiffstats
path: root/runtime/dnscache.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/dnscache.c')
-rw-r--r--runtime/dnscache.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/runtime/dnscache.c b/runtime/dnscache.c
index c6e22833..5aa8a235 100644
--- a/runtime/dnscache.c
+++ b/runtime/dnscache.c
@@ -41,14 +41,15 @@
#include "unicode-helper.h"
#include "net.h"
#include "hashtable.h"
+#include "prop.h"
+#include "dnscache.h"
/* module data structures */
struct dnscache_entry_s {
struct sockaddr_storage addr;
uchar *pszHostFQDN;
- uchar *ip;
+ prop_t *ip;
rs_size_t lenHost;
- rs_size_t lenIP;
struct dnscache_entry_s *next;
unsigned nUsed;
};
@@ -59,14 +60,15 @@ struct dnscache_s {
unsigned nEntries;
};
typedef struct dnscache_s dnscache_t;
-#define MAX_CACHE_ENTRIES 1000
/* static data */
DEFobjStaticHelpers
DEFobjCurrIf(glbl)
DEFobjCurrIf(errmsg)
+DEFobjCurrIf(prop)
static dnscache_t dnsCache;
+static prop_t *staticErrIPValue;
/* Our hash function.
@@ -89,8 +91,6 @@ hash_from_key_fn(void *k)
static int
key_equals_fn(void *key1, void *key2)
{
-dbgprintf("DDDD: key_equals_fn: SALEN %d, result %d\n", SALEN((struct sockaddr*)key1),
-SALEN((struct sockaddr*)key1) == SALEN((struct sockaddr*) key2) && !memcmp(key1, key2, SALEN((struct sockaddr*) key1)));
return (SALEN((struct sockaddr*)key1) == SALEN((struct sockaddr*) key2)
&& !memcmp(key1, key2, SALEN((struct sockaddr*) key1)));
}
@@ -122,6 +122,11 @@ dnscacheInit(void)
CHKiRet(objGetObjInterface(&obj)); /* this provides the root pointer for all other queries */
CHKiRet(objUse(glbl, CORE_COMPONENT));
CHKiRet(objUse(errmsg, CORE_COMPONENT));
+ CHKiRet(objUse(prop, CORE_COMPONENT));
+
+ prop.Construct(&staticErrIPValue);
+ prop.SetString(staticErrIPValue, (uchar*)"???", 3);
+ prop.ConstructFinalize(staticErrIPValue);
finalize_it:
RETiRet;
}
@@ -131,10 +136,12 @@ rsRetVal
dnscacheDeinit(void)
{
DEFiRet;
+ prop.Destruct(&staticErrIPValue);
hashtable_destroy(dnsCache.ht, 1); /* 1 => free all values automatically */
pthread_rwlock_destroy(&dnsCache.rwlock);
objRelease(glbl, CORE_COMPONENT);
objRelease(errmsg, CORE_COMPONENT);
+ objRelease(prop, CORE_COMPONENT);
RETiRet;
}
@@ -176,18 +183,19 @@ mygetnameinfo(const struct sockaddr *sa, socklen_t salen,
* message should be processed (1) or discarded (0).
*/
static rsRetVal
-resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
+resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, prop_t **ip)
{
DEFiRet;
int error;
sigset_t omask, nmask;
struct addrinfo hints, *res;
+ char szIP[80]; /* large enough for IPv6 */
assert(addr != NULL);
assert(pszHostFQDN != NULL);
error = mygetnameinfo((struct sockaddr *)addr, SALEN((struct sockaddr *)addr),
- (char*) ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
+ (char*) szIP, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if(error) {
dbgprintf("Malformed from address %s\n", gai_strerror(error));
ABORT_FINALIZE(RS_RET_INVALID_SOURCE);
@@ -225,7 +233,7 @@ resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
snprintf((char*)szErrMsg, sizeof(szErrMsg) / sizeof(uchar),
"Malicious PTR record, message dropped "
"IP = \"%s\" HOST = \"%s\"",
- ip, pszHostFQDN);
+ szIP, pszHostFQDN);
errmsg.LogError(0, RS_RET_MALICIOUS_ENTITY, "%s", szErrMsg);
pthread_sigmask(SIG_SETMASK, &omask, NULL);
ABORT_FINALIZE(RS_RET_MALICIOUS_ENTITY);
@@ -240,7 +248,7 @@ resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
snprintf((char*)szErrMsg, sizeof(szErrMsg) / sizeof(uchar),
"Malicious PTR record (message accepted, but used IP "
"instead of PTR name: IP = \"%s\" HOST = \"%s\"",
- ip, pszHostFQDN);
+ szIP, pszHostFQDN);
errmsg.LogError(0, NO_ERRCODE, "%s", szErrMsg);
error = 1; /* that will trigger using IP address below. */
@@ -250,11 +258,19 @@ resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
}
if(error || glbl.GetDisableDNS()) {
- dbgprintf("Host name for your address (%s) unknown\n", ip);
- strcpy((char*) pszHostFQDN, (char*)ip);
+ dbgprintf("Host name for your address (%s) unknown\n", szIP);
+ strcpy((char*) pszHostFQDN, (char*)szIP);
}
finalize_it:
+ if(iRet != RS_RET_OK) {
+ strcpy(szIP, "?error.obtaining.ip?");
+ }
+ /* we need to create the inputName property (only once during our lifetime) */
+ prop.Construct(ip);
+ prop.SetString(*ip, (uchar*)szIP, strlen(szIP));
+ prop.ConstructFinalize(*ip);
+
RETiRet;
}
@@ -265,16 +281,15 @@ addEntry(struct sockaddr_storage *addr, dnscache_entry_t **pEtry)
int r;
struct sockaddr_storage *keybuf;
uchar pszHostFQDN[NI_MAXHOST];
- uchar ip[80]; /* 80 is safe for larges IPv6 addr */
+ prop_t *ip;
dnscache_entry_t *etry;
DEFiRet;
- CHKiRet(resolveAddr(addr, pszHostFQDN, ip));
+ CHKiRet(resolveAddr(addr, pszHostFQDN, &ip));
CHKmalloc(etry = MALLOC(sizeof(dnscache_entry_t)));
etry->lenHost = ustrlen(pszHostFQDN);
- etry->lenIP = ustrlen(ip);
CHKmalloc(etry->pszHostFQDN = ustrdup(pszHostFQDN));
- CHKmalloc(etry->ip = ustrdup(ip));
+ etry->ip = ip;
memcpy(&etry->addr, addr, SALEN((struct sockaddr*) addr));
etry->nUsed = 0;
*pEtry = etry;
@@ -313,7 +328,7 @@ validateEntry(dnscache_entry_t __attribute__((unused)) *etry, struct sockaddr_st
*/
rsRetVal
dnscacheLookup(struct sockaddr_storage *addr, uchar **pszHostFQDN, rs_size_t *lenHost,
- uchar **ip, rs_size_t *lenIP)
+ prop_t **ip)
{
dnscache_entry_t *etry;
DEFiRet;
@@ -326,11 +341,10 @@ dnscacheLookup(struct sockaddr_storage *addr, uchar **pszHostFQDN, rs_size_t *le
} else {
CHKiRet(validateEntry(etry, addr));
}
-dbgprintf("XXXX: hostn '%s', ip '%s'\n", etry->pszHostFQDN, etry->ip);
*pszHostFQDN = etry->pszHostFQDN;
*lenHost = etry->lenHost;
+ prop.AddRef(etry->ip);
*ip = etry->ip;
- *lenIP = etry->lenIP;
finalize_it:
pthread_rwlock_unlock(&dnsCache.rwlock);
@@ -339,8 +353,7 @@ dbgprintf("XXXX: dnscacheLookup finished, iRet=%d\n", iRet);
DBGPRINTF("dnscacheLookup failed with iRet %d\n", iRet);
*pszHostFQDN = (uchar*)"???";
*lenHost = 3;
- *ip = (uchar*)"???";
- *lenIP = 3;
+ *ip = staticErrIPValue;
}
RETiRet;
}