summaryrefslogtreecommitdiffstats
path: root/lib/libalias/alias.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalias/alias.c')
-rw-r--r--lib/libalias/alias.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/lib/libalias/alias.c b/lib/libalias/alias.c
index a9c1e3b..c8ef65a 100644
--- a/lib/libalias/alias.c
+++ b/lib/libalias/alias.c
@@ -73,6 +73,8 @@
- Eliminated PacketAliasIn2() and
PacketAliasOut2() as poorly conceived.
+ See HISTORY file for additional revisions.
+
*/
#include <stdio.h>
@@ -149,12 +151,15 @@ TcpMonitorIn(struct ip *pip, struct alias_link *link)
switch (GetStateIn(link))
{
- case 0:
- if (tc->th_flags & TH_SYN) SetStateIn(link, 1);
+ case ALIAS_TCP_STATE_NOT_CONNECTED:
+ if (tc->th_flags & TH_SYN)
+ SetStateIn(link, ALIAS_TCP_STATE_CONNECTED);
break;
- case 1:
+ case ALIAS_TCP_STATE_CONNECTED:
if (tc->th_flags & TH_FIN
- || tc->th_flags & TH_RST) SetStateIn(link, 2);
+ || tc->th_flags & TH_RST)
+ SetStateIn(link, ALIAS_TCP_STATE_DISCONNECTED);
+ break;
}
}
@@ -167,12 +172,15 @@ TcpMonitorOut(struct ip *pip, struct alias_link *link)
switch (GetStateOut(link))
{
- case 0:
- if (tc->th_flags & TH_SYN) SetStateOut(link, 1);
+ case ALIAS_TCP_STATE_NOT_CONNECTED:
+ if (tc->th_flags & TH_SYN)
+ SetStateOut(link, ALIAS_TCP_STATE_CONNECTED);
break;
- case 1:
+ case ALIAS_TCP_STATE_CONNECTED:
if (tc->th_flags & TH_FIN
- || tc->th_flags & TH_RST) SetStateOut(link, 2);
+ || tc->th_flags & TH_RST)
+ SetStateOut(link, ALIAS_TCP_STATE_DISCONNECTED);
+ break;
}
}
@@ -776,7 +784,7 @@ TcpAliasOut(struct ip *pip, int maxpacketsize)
|| ntohs(tc->th_sport) == FTP_CONTROL_PORT_NUMBER)
AliasHandleFtpOut(pip, link, maxpacketsize);
if (ntohs(tc->th_dport) == IRC_CONTROL_PORT_NUMBER_1
- || ntohs(tc->th_dport) == IRC_CONTROL_PORT_NUMBER_2)
+ || ntohs(tc->th_dport) == IRC_CONTROL_PORT_NUMBER_2)
AliasHandleIrcOut(pip, link, maxpacketsize);
/* Adjust TCP checksum since source port is being aliased */
@@ -977,6 +985,11 @@ PacketAliasIn(char *ptr, int maxpacketsize)
pip = (struct ip *) ptr;
alias_addr = pip->ip_dst;
+ /* Defense against mangled packets */
+ if (ntohs(pip->ip_len) > maxpacketsize
+ || (pip->ip_hl<<2) > maxpacketsize)
+ return PKT_ALIAS_IGNORED;
+
iresult = PKT_ALIAS_IGNORED;
if ( (ntohs(pip->ip_off) & IP_OFFMASK) == 0 )
{
@@ -1002,7 +1015,7 @@ PacketAliasIn(char *ptr, int maxpacketsize)
{
iresult = PKT_ALIAS_FOUND_HEADER_FRAGMENT;
SetFragmentAddr(link, pip->ip_dst);
- }
+ }
else
{
iresult = PKT_ALIAS_ERROR;
@@ -1049,6 +1062,11 @@ PacketAliasOut(char *ptr, /* valid IP packet */
ClearCheckNewLink();
pip = (struct ip *) ptr;
+ /* Defense against mangled packets */
+ if (ntohs(pip->ip_len) > maxpacketsize
+ || (pip->ip_hl<<2) > maxpacketsize)
+ return PKT_ALIAS_IGNORED;
+
addr_save = GetDefaultAliasAddress();
if (packetAliasMode & PKT_ALIAS_UNREGISTERED_ONLY)
{
OpenPOWER on IntegriCloud