hopefully fixed the checklist bug, and a few mem leaks caught

This commit is contained in:
fishwaldo 2002-09-06 04:33:28 +00:00
parent 114d5a78e2
commit 8481897fb7
4 changed files with 61 additions and 18 deletions

View file

@ -4,6 +4,8 @@ Open Proxy Scanning Bot Module for NeoStats Changelog.
- Added GPL headers and credit to BOPM authors
- A few fixes in a attempt to find this socket/checklist bug
- Stopped setting Glines multiple times if we find a multiple open proxies, or host is listed in OPM
- Think I finally fixed the socket/checklist bug
- Fixed a few mem leaks I believe
* Version 1.0Beta1 * 31/8/2002 * Fish
- Initial Release

36
opsb.c
View file

@ -18,7 +18,7 @@
** USA
**
** NeoStats CVS Identification
** $Id: opsb.c,v 1.3 2002/09/04 08:52:34 fishwaldo Exp $
** $Id: opsb.c,v 1.4 2002/09/06 04:33:28 fishwaldo Exp $
*/
@ -195,6 +195,7 @@ int __Bot_Message(char *origin, char **argv, int argc)
scandata = malloc(sizeof(scaninfo));
scandata->doneban = 0;
scandata->u = u;
scandata->socks = NULL;
if ((u2 = finduser(argv[2])) != NULL) {
/* don't scan users from my server */
if (!strcasecmp(u2->server->name, me.name)) {
@ -738,13 +739,16 @@ static int ScanNick(char **av, int ac) {
scannode = list_find(opsbl, av[0], findscan);
if (!scannode) scannode = list_find(opsbq, av[0], findscan);
if (scannode) {
#ifdef DEBUG
log("ScanNick(): Not scanning %s as we are already scanning them", av[0]);
#endif
return -1;
}
prefmsg(u->nick, s_opsb, "%s", opsb.scanmsg);
scandata = malloc(sizeof(scaninfo));
scandata->u = NULL;
scandata->doneban = 0;
scandata->socks = NULL;
strncpy(scandata->who, u->nick, MAXHOST);
strncpy(scandata->lookup, u->hostname, MAXHOST);
strncpy(scandata->server, u->server->name, MAXHOST);
@ -759,9 +763,10 @@ static int ScanNick(char **av, int ac) {
scandata->ipaddr.s_addr = 0;
}
}
if (!startscan(scandata))
if (!startscan(scandata)) {
chanalert(s_opsb, "Warning Can't scan %s", u->nick);
log("OBSB ScanNick(): Can't scan %s. Check logs for possible errors", u->nick);
}
return 1;
@ -781,17 +786,22 @@ int startscan(scaninfo *scandata) {
strcpy(segv_location, "OPSB:Startscan");
i = checkcache(scandata);
if ((i > 0) && (!scandata->u)) {
free(scandata);
return 1;
/* only check the cache when we have IP addy */
if (scandata->dnsstate == DO_OPM_LOOKUP && scandata->u == NULL) {
i = checkcache(scandata);
if (i > 0) {
free(scandata);
return 1;
}
}
switch(scandata->dnsstate) {
case GET_NICK_IP:
if (list_isfull(opsbl)) {
if (list_isfull(opsbq)) {
chanalert(s_opsb, "Warning, Both Current and queue lists are full. Not Adding additional scans");
#ifdef DEBUG
log("OPSB: dropped scaning of %s, as queue is full", scandata->who);
#endif
if (scandata->u) prefmsg(scandata->u->nick, s_opsb, "To Busy. Try again later");
free(scandata);
return 0;
@ -846,6 +856,7 @@ int startscan(scaninfo *scandata) {
if (dns_lookup(buf, adns_r_a, dnsblscan, scandata->who) != 1) {
log("DNS: startscan() DO_OPM_LOOKUP dns_lookup() failed");
free(scandata);
free(buf);
checkqueue();
return 0;
}
@ -911,6 +922,7 @@ void dnsblscan(char *data, adns_answer *a) {
startscan(scandata);
} else {
log("DNS: dnsblscan() GETNICKIP failed-> %s", show);
chanalert(s_opsb, "Warning, Couldn't get the address for %s", scandata->who);
list_delete(opsbl, scannode);
lnode_destroy(scannode);
free(scandata);
@ -919,6 +931,7 @@ void dnsblscan(char *data, adns_answer *a) {
} else {
log("DNS: dnsblscan GETNICKIP rr_info failed");
chanalert(s_opsb, "Warning, Couldnt get the address for %s. rr_info failed", scandata->who);
list_delete(opsbl, scannode);
lnode_destroy(scannode);
free(scandata);
@ -930,11 +943,18 @@ void dnsblscan(char *data, adns_answer *a) {
if (a->nrrs > 0) {
/* TODO: print out what type of open proxy it is based on IP address returned */
if (scandata->u) prefmsg(scandata->u->nick, s_opsb, "%s apears in DNS blacklist", scandata->lookup);
#ifdef DEBUG
log("Got Positive OPM lookup for %s (%s)", scandata->who, scandata->lookup);
#endif
scandata->dnsstate = OPMLIST;
do_ban(scandata);
checkqueue();
} else
if (scandata->u) prefmsg(scandata->u->nick, s_opsb, "%s does not appear in DNS black list", scandata->lookup);
#ifdef DEBUG
log("Got Negative OPM lookup for %s (%s)", scandata->who, scandata->lookup);
#endif
scandata->dnsstate = NOOPMLIST;
break;
default:
log("Warning, Unknown Status in dnsblscan()");

3
opsb.h
View file

@ -4,7 +4,7 @@
** Based from GeoStats 1.1.0 by Johnathan George net@lite.net
*
** NetStats CVS Identification
** $Id: opsb.h,v 1.2 2002/09/04 08:52:34 fishwaldo Exp $
** $Id: opsb.h,v 1.3 2002/09/06 04:33:28 fishwaldo Exp $
*/
@ -112,6 +112,7 @@ list_t *exempt;
#define DOING_SCAN 0x0008
#define GOTOPENPROXY 0x0010
#define OPMLIST 0x0020
#define NOOPMLIST 0x0040
/* this is some socklist flags */
#define CONNECTING 0x0001

38
proxy.c
View file

@ -20,7 +20,7 @@
** USA
**
** NeoStats CVS Identification
** $Id: proxy.c,v 1.3 2002/09/04 08:52:34 fishwaldo Exp $
** $Id: proxy.c,v 1.4 2002/09/06 04:33:28 fishwaldo Exp $
*/
@ -65,7 +65,6 @@ proxy_types proxy_list[] = {
void do_ban(scaninfo *scandata) {
lnode_t *socknode;
socklist *sockdata;
int doneban = 0;
FILE *fp;
strcpy(segv_location, "OPSB:dns_lookup");
@ -120,6 +119,7 @@ scaninfo *find_scandata(char *sockname) {
cmd = strtok(buf, " ");
scannode = list_find(opsbl, cmd, findscan);
free(buf);
if (scannode)
return lnode_get(scannode);
else
@ -146,12 +146,13 @@ void cleanlist() {
savescan = 1;
if (scandata->dnsstate == OPMLIST) savescan = 0;
/* if this is not valid, exit */
if (!scandata->socks) break;
/* if this is not valid, exit (ie, the scan hasn't started yet) */
if (scandata->socks == NULL) break;
/* check for open sockets */
socknode = list_first(scandata->socks);
finished = 1;
while (socknode) {
sockdata = lnode_get(socknode);
/* if it was a open proxy, don't save the cache */
if (sockdata->flags == OPENPROXY) savescan = 0;
@ -169,10 +170,10 @@ void cleanlist() {
if (scandata->u) prefmsg(scandata->u->nick, s_opsb, "Timeout Connecting to Proxy %s on port %d", proxy_list[sockdata->type].type, proxy_list[sockdata->type].port);
sock_disconnect(sockname);
free(sockdata);
}
/* free the socket struct as its timed out and un-connected by now */
}
socknode = list_next(scandata->socks, socknode);
}
@ -183,8 +184,20 @@ void cleanlist() {
#endif
if (savescan == 1)
addtocache(scandata->ipaddr.s_addr);
/* destory all the nodes in the sock list */
list_destroy_nodes(scandata->socks);
if (scandata->socks != NULL) {
socknode = list_first(scandata->socks);
while (socknode) {
sockdata = lnode_get(socknode);
#ifdef DEBUG
log("freeing sockdata %s %d", scandata->who, sockdata->type);
#endif
free(sockdata);
socknode = list_next(scandata->socks, socknode);
}
list_destroy_nodes(scandata->socks);
}
scannode2 = list_next(opsbl, scannode);
list_delete(opsbl, scannode);
lnode_destroy(scannode);
@ -232,6 +245,12 @@ void send_status(User *u) {
case DO_OPM_LOOKUP:
prefmsg(u->nick, s_opsb, "Looking up DNS blacklist");
break;
case OPMLIST:
prefmsg(u->nick, s_opsb, "Host is listed in %s", opsb.opmdomain);
break;
case NOOPMLIST:
prefmsg(u->nick, s_opsb, "Host is Not listed in %s", opsb.opmdomain);
break;
default:
prefmsg(u->nick, s_opsb, "Unknown State (DNS)");
}
@ -386,6 +405,7 @@ int sock5_proxy(int sock) {
);
len = send(sock, buf, len, MSG_NOSIGNAL);
free(buf);
return(len);
@ -445,7 +465,7 @@ int proxy_read(int socknum, char *sockname) {
socknode = list_next(scandata->socks, socknode);
}
if (i == 0) {
log("ehh can't find socket info for proxy_read()");
log("ehh can't find socket info %s (%d) for proxy_read()", sockname, socknum);
return 1;
}
buf = malloc(512);
@ -534,7 +554,7 @@ int proxy_write(int socknum, char *sockname) {
socknode = list_next(scandata->socks, socknode);
}
if (i == 0) {
log("ehhh, can't find socket for proxy_write()");
log("ehhh, can't find socket %s %d for proxy_write()", sockname, socknum);
return 1;
}
if (sockdata->flags == CONNECTING || sockdata->flags == SOCKCONNECTED) {