Fixed missing check for zero-length packets on IFAC-enabled interfaces. Fixes #65.
This commit is contained in:
parent
214ee9d771
commit
2685e043ea
@ -26,7 +26,6 @@ import time
|
|||||||
import math
|
import math
|
||||||
import struct
|
import struct
|
||||||
import threading
|
import threading
|
||||||
import traceback
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from .vendor import umsgpack as umsgpack
|
from .vendor import umsgpack as umsgpack
|
||||||
|
|
||||||
@ -285,9 +284,6 @@ class Transport:
|
|||||||
outgoing = []
|
outgoing = []
|
||||||
Transport.jobs_running = True
|
Transport.jobs_running = True
|
||||||
|
|
||||||
# TODO: Remove at some point
|
|
||||||
# start_time = time.time()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not Transport.jobs_locked:
|
if not Transport.jobs_locked:
|
||||||
# Process receipts list for timed-out packets
|
# Process receipts list for timed-out packets
|
||||||
@ -508,17 +504,9 @@ class Transport:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
RNS.log("An exception occurred while running Transport jobs.", RNS.LOG_ERROR)
|
RNS.log("An exception occurred while running Transport jobs.", RNS.LOG_ERROR)
|
||||||
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||||
traceback.print_exc()
|
|
||||||
|
|
||||||
Transport.jobs_running = False
|
Transport.jobs_running = False
|
||||||
|
|
||||||
# TODO: Remove at some point
|
|
||||||
# end_time = time.time()
|
|
||||||
# if RNS.loglevel >= RNS.LOG_EXTREME:
|
|
||||||
# duration = round((end_time - start_time) * 1000, 2)
|
|
||||||
# if duration > 1:
|
|
||||||
# RNS.log("Transport jobs took "+str(duration)+"ms", RNS.LOG_EXTREME)
|
|
||||||
|
|
||||||
for packet in outgoing:
|
for packet in outgoing:
|
||||||
packet.send()
|
packet.send()
|
||||||
|
|
||||||
@ -822,42 +810,43 @@ class Transport:
|
|||||||
def inbound(raw, interface=None):
|
def inbound(raw, interface=None):
|
||||||
# If interface access codes are enabled,
|
# If interface access codes are enabled,
|
||||||
# we must authenticate each packet.
|
# we must authenticate each packet.
|
||||||
if interface != None and hasattr(interface, "ifac_identity") and interface.ifac_identity != None:
|
if len(raw) > 1:
|
||||||
# Check that IFAC flag is set
|
if interface != None and hasattr(interface, "ifac_identity") and interface.ifac_identity != None:
|
||||||
if raw[0] & 0x80 == 0x80:
|
# Check that IFAC flag is set
|
||||||
if len(raw) > 2+interface.ifac_size:
|
if raw[0] & 0x80 == 0x80:
|
||||||
# Extract IFAC
|
if len(raw) > 2+interface.ifac_size:
|
||||||
ifac = raw[2:2+interface.ifac_size]
|
# Extract IFAC
|
||||||
|
ifac = raw[2:2+interface.ifac_size]
|
||||||
|
|
||||||
# Unset IFAC flag
|
# Unset IFAC flag
|
||||||
new_header = bytes([raw[0] & 0x7f, raw[1]])
|
new_header = bytes([raw[0] & 0x7f, raw[1]])
|
||||||
|
|
||||||
# Re-assemble packet
|
# Re-assemble packet
|
||||||
new_raw = new_header+raw[2+interface.ifac_size:]
|
new_raw = new_header+raw[2+interface.ifac_size:]
|
||||||
|
|
||||||
# Calculate expected IFAC
|
# Calculate expected IFAC
|
||||||
expected_ifac = interface.ifac_identity.sign(new_raw)[-interface.ifac_size:]
|
expected_ifac = interface.ifac_identity.sign(new_raw)[-interface.ifac_size:]
|
||||||
|
|
||||||
|
# Check it
|
||||||
|
if ifac == expected_ifac:
|
||||||
|
raw = new_raw
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
# Check it
|
|
||||||
if ifac == expected_ifac:
|
|
||||||
raw = new_raw
|
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
# If the IFAC flag is not set, but should be,
|
||||||
|
# drop the packet.
|
||||||
return
|
return
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# If the IFAC flag is not set, but should be,
|
# If the interface does not have IFAC enabled,
|
||||||
# drop the packet.
|
# check the received packet IFAC flag.
|
||||||
return
|
if raw[0] & 0x80 == 0x80:
|
||||||
|
# If the flag is set, drop the packet
|
||||||
else:
|
return
|
||||||
# If the interface does not have IFAC enabled,
|
|
||||||
# check the received packet IFAC flag.
|
|
||||||
if raw[0] & 0x80 == 0x80:
|
|
||||||
# If the flag is set, drop the packet
|
|
||||||
return
|
|
||||||
|
|
||||||
while (Transport.jobs_running):
|
while (Transport.jobs_running):
|
||||||
sleep(0.0005)
|
sleep(0.0005)
|
||||||
|
Loading…
Reference in New Issue
Block a user