mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
Remove some more bin.lua packings
This commit is contained in:
@@ -1,9 +1,9 @@
|
|||||||
local base64 = require "base64"
|
local base64 = require "base64"
|
||||||
local bin = require "bin"
|
|
||||||
local http = require "http"
|
local http = require "http"
|
||||||
local match = require "match"
|
local match = require "match"
|
||||||
local nmap = require "nmap"
|
local nmap = require "nmap"
|
||||||
local stdnse = require "stdnse"
|
local stdnse = require "stdnse"
|
||||||
|
local string = require "string"
|
||||||
local table = require "table"
|
local table = require "table"
|
||||||
local url = require "url"
|
local url = require "url"
|
||||||
_ENV = stdnse.module("ajp", stdnse.seeall)
|
_ENV = stdnse.module("ajp", stdnse.seeall)
|
||||||
@@ -127,9 +127,9 @@ AJP = {
|
|||||||
-- as the zero terminator should not be counted in the length
|
-- as the zero terminator should not be counted in the length
|
||||||
local function encstr(str)
|
local function encstr(str)
|
||||||
if ( not(str) or #str == 0 ) then
|
if ( not(str) or #str == 0 ) then
|
||||||
return bin.pack(">S", 0xFFFF)
|
return "\xFF\xFF"
|
||||||
end
|
end
|
||||||
return bin.pack(">Sz", #str, str)
|
return string.pack(">I2z", #str, str)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- count the number of headers
|
-- count the number of headers
|
||||||
@@ -152,35 +152,37 @@ AJP = {
|
|||||||
local p_url = url.parse(self.uri)
|
local p_url = url.parse(self.uri)
|
||||||
|
|
||||||
-- save the magic and data for last
|
-- save the magic and data for last
|
||||||
local data = bin.pack(">CCAAAAASCS", self.code, self.method,
|
local data = {
|
||||||
|
string.pack(">BB", self.code, self.method),
|
||||||
encstr(self.version), encstr(p_url.path), encstr(self.raddr),
|
encstr(self.version), encstr(p_url.path), encstr(self.raddr),
|
||||||
encstr(self.rhost), encstr(self.srv),
|
encstr(self.rhost), encstr(self.srv),
|
||||||
self.port, (self.is_ssl and 1 or 0),
|
string.pack(">I2BI2", self.port, (self.is_ssl and 1 or 0), headerCount()),
|
||||||
headerCount())
|
}
|
||||||
|
|
||||||
-- encode headers
|
-- encode headers
|
||||||
for k, v in pairs(self.headers) do
|
for k, v in pairs(self.headers) do
|
||||||
local header = AJP.ForwardRequest.Header[k:lower()] or k
|
local header = AJP.ForwardRequest.Header[k:lower()] or k
|
||||||
if ( "string" == type(header) ) then
|
if ( "string" == type(header) ) then
|
||||||
data = data .. bin.pack(">Sz", #header, header)
|
data[#data+1] = string.pack(">I2z", #header, header)
|
||||||
else
|
else
|
||||||
data = data .. bin.pack(">S", header)
|
data[#data+1] = string.pack(">I2", header)
|
||||||
end
|
end
|
||||||
|
|
||||||
data = data .. encstr(v)
|
data[#data+1] = encstr(v)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- encode attributes
|
-- encode attributes
|
||||||
if ( p_url.query ) then
|
if ( p_url.query ) then
|
||||||
data = data .. bin.pack("C", AJP.Attribute.QUERY_STRING)
|
data[#data+1] = string.pack("B", AJP.Attribute.QUERY_STRING)
|
||||||
data = data .. encstr(p_url.query)
|
data[#data+1] = encstr(p_url.query)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- terminate the attribute list
|
-- terminate the attribute list
|
||||||
data = data .. bin.pack("C", AJP.Attribute.ARE_DONE)
|
data[#data+1] = string.pack("B", AJP.Attribute.ARE_DONE)
|
||||||
|
|
||||||
-- returns the AJP request as a string
|
-- returns the AJP request as a string
|
||||||
return bin.pack(">SSA", AJP.Magic, #data, data)
|
data = table.concat(data)
|
||||||
|
return string.pack(">I2s2", AJP.Magic, data)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
},
|
},
|
||||||
@@ -215,12 +217,11 @@ AJP = {
|
|||||||
local pos = 6
|
local pos = 6
|
||||||
local status_msg, hdr_count
|
local status_msg, hdr_count
|
||||||
|
|
||||||
pos, sh.status = bin.unpack(">S", data, pos)
|
sh.status, status_msg, pos = string.unpack(">I2s2", data, pos)
|
||||||
pos, status_msg = bin.unpack(">P", data, pos)
|
|
||||||
pos = pos + 1
|
pos = pos + 1
|
||||||
sh.status_line = ("AJP/1.3 %d %s"):format(sh.status, status_msg)
|
sh.status_line = ("AJP/1.3 %d %s"):format(sh.status, status_msg)
|
||||||
|
|
||||||
pos, hdr_count = bin.unpack(">S", data, pos)
|
hdr_count, pos = string.unpack(">I2", data, pos)
|
||||||
|
|
||||||
local function headerById(id)
|
local function headerById(id)
|
||||||
for k, v in pairs(AJP.Response.Header) do
|
for k, v in pairs(AJP.Response.Header) do
|
||||||
@@ -231,16 +232,16 @@ AJP = {
|
|||||||
|
|
||||||
for i=1, hdr_count do
|
for i=1, hdr_count do
|
||||||
local key, val, len
|
local key, val, len
|
||||||
pos, len = bin.unpack(">S", data, pos)
|
len, pos = string.unpack(">I2", data, pos)
|
||||||
|
|
||||||
if ( len < 0xA000 ) then
|
if ( len < 0xA000 ) then
|
||||||
pos, key = bin.unpack("A"..len, data, pos)
|
key, pos = string.unpack("c"..len, data, pos)
|
||||||
pos = pos + 1
|
pos = pos + 1
|
||||||
else
|
else
|
||||||
key = headerById(len)
|
key = headerById(len)
|
||||||
end
|
end
|
||||||
|
|
||||||
pos, val = bin.unpack(">P", data, pos)
|
val, pos = string.unpack(">s2", data, pos)
|
||||||
pos = pos + 1
|
pos = pos + 1
|
||||||
|
|
||||||
sh.headers[key:lower()] = val
|
sh.headers[key:lower()] = val
|
||||||
@@ -316,7 +317,7 @@ Comm = {
|
|||||||
if ( not(status) ) then
|
if ( not(status) ) then
|
||||||
return false, "Failed to receive response from server"
|
return false, "Failed to receive response from server"
|
||||||
end
|
end
|
||||||
local pos, magic, length = bin.unpack(">A2S", buf)
|
local magic, length, pos = string.unpack(">c2I2", buf)
|
||||||
if ( magic ~= "AB" ) then
|
if ( magic ~= "AB" ) then
|
||||||
return false, ("Invalid magic received from server (%s)"):format(magic)
|
return false, ("Invalid magic received from server (%s)"):format(magic)
|
||||||
end
|
end
|
||||||
@@ -325,12 +326,12 @@ Comm = {
|
|||||||
return false, "Failed to receive response from server"
|
return false, "Failed to receive response from server"
|
||||||
end
|
end
|
||||||
|
|
||||||
local pos, code = bin.unpack("C", data)
|
local code, pos = string.unpack("B", data)
|
||||||
if ( AJP.Code.SEND_HEADERS == code ) then
|
if ( AJP.Code.SEND_HEADERS == code ) then
|
||||||
local sh = AJP.Response.SendHeaders.parse(buf .. data)
|
local sh = AJP.Response.SendHeaders.parse(buf .. data)
|
||||||
response = sh
|
response = sh
|
||||||
elseif( AJP.Code.SEND_BODY == code ) then
|
elseif( AJP.Code.SEND_BODY == code ) then
|
||||||
response.body = select(2, bin.unpack(">P", data, pos))
|
response.body = string.unpack(">s2", data, pos)
|
||||||
elseif( AJP.Code.END_RESPONSE == code ) then
|
elseif( AJP.Code.END_RESPONSE == code ) then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,11 +6,11 @@
|
|||||||
--
|
--
|
||||||
-- @author Patrik Karlsson <patrik@cqure.net>
|
-- @author Patrik Karlsson <patrik@cqure.net>
|
||||||
--
|
--
|
||||||
local bin = require "bin"
|
|
||||||
local datetime = require "datetime"
|
local datetime = require "datetime"
|
||||||
local ipOps = require "ipOps"
|
local ipOps = require "ipOps"
|
||||||
local nmap = require "nmap"
|
local nmap = require "nmap"
|
||||||
local stdnse = require "stdnse"
|
local stdnse = require "stdnse"
|
||||||
|
local string = require "string"
|
||||||
_ENV = stdnse.module("natpmp", stdnse.seeall)
|
_ENV = stdnse.module("natpmp", stdnse.seeall)
|
||||||
|
|
||||||
local ResultCode = {
|
local ResultCode = {
|
||||||
@@ -43,7 +43,7 @@ Request = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
__tostring = function(self)
|
__tostring = function(self)
|
||||||
return bin.pack(">CC", self.version, self.op)
|
return string.pack(">BB", self.version, self.op)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
},
|
},
|
||||||
@@ -65,7 +65,7 @@ Request = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
__tostring = function(self)
|
__tostring = function(self)
|
||||||
return bin.pack(">CCSSSI",
|
return string.pack(">BBI2I2I2I4",
|
||||||
self.version,
|
self.version,
|
||||||
(self.proto=="udp" and 1 or 2),
|
(self.proto=="udp" and 1 or 2),
|
||||||
0, -- reserved
|
0, -- reserved
|
||||||
@@ -96,13 +96,13 @@ Response = {
|
|||||||
end
|
end
|
||||||
|
|
||||||
local pos
|
local pos
|
||||||
pos, self.version, self.op, self.rescode = bin.unpack(">CCS", self.data)
|
self.version, self.op, self.rescode, pos = string.unpack(">BBI2", self.data)
|
||||||
|
|
||||||
if ( self.rescode ~= ResultCode.SUCCESS or self.op ~= 128 ) then
|
if ( self.rescode ~= ResultCode.SUCCESS or self.op ~= 128 ) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
pos, self.time, self.ip = bin.unpack(">II", self.data, pos)
|
self.time, self.ip, pos = string.unpack(">I4I4", self.data, pos)
|
||||||
self.ip = ipOps.fromdword(self.ip)
|
self.ip = ipOps.fromdword(self.ip)
|
||||||
self.time = datetime.format_timestamp(self.time)
|
self.time = datetime.format_timestamp(self.time)
|
||||||
return true
|
return true
|
||||||
@@ -127,13 +127,13 @@ Response = {
|
|||||||
end
|
end
|
||||||
|
|
||||||
local pos
|
local pos
|
||||||
pos, self.version, self.op, self.rescode = bin.unpack(">CCS", self.data)
|
self.version, self.op, self.rescode, pos = string.unpack(">BBI2", self.data)
|
||||||
|
|
||||||
if ( self.rescode ~= ResultCode.SUCCESS ) then
|
if ( self.rescode ~= ResultCode.SUCCESS ) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
pos, self.time, self.privport, self.pubport, self.lifetime = bin.unpack(">ISSI", self.data, pos)
|
self.time, self.privport, self.pubport, self.lifetime, pos = string.unpack(">I4I2I2I4", self.data, pos)
|
||||||
return true
|
return true
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
-- @author Ron Bowes <ron@skullsecurity.net>
|
-- @author Ron Bowes <ron@skullsecurity.net>
|
||||||
-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
|
-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
|
||||||
|
|
||||||
local bin = require "bin"
|
|
||||||
local dns = require "dns"
|
local dns = require "dns"
|
||||||
local math = require "math"
|
local math = require "math"
|
||||||
local nmap = require "nmap"
|
local nmap = require "nmap"
|
||||||
@@ -316,14 +315,14 @@ function do_nbstat(host)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Create the query header
|
-- Create the query header
|
||||||
local query = bin.pack(">SSSSSS",
|
local query = string.pack(">I2I2I2I2I2I2",
|
||||||
0x1337, -- Transaction id
|
0x1337, -- Transaction id
|
||||||
0x0000, -- Flags
|
0x0000, -- Flags
|
||||||
1, -- Questions
|
1, -- Questions
|
||||||
0, -- Answers
|
0, -- Answers
|
||||||
0, -- Authority
|
0, -- Authority
|
||||||
0 -- Extra
|
0 -- Extra
|
||||||
) .. bin.pack(">zSS",
|
) .. string.pack(">zI2I2",
|
||||||
encoded_name, -- Encoded name
|
encoded_name, -- Encoded name
|
||||||
0x0021, -- Query type (0x21 = NBSTAT)
|
0x0021, -- Query type (0x21 = NBSTAT)
|
||||||
0x0001 -- Class = IN
|
0x0001 -- Class = IN
|
||||||
@@ -354,7 +353,7 @@ function do_nbstat(host)
|
|||||||
local pos, TRN_ID, FLAGS, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT, rr_name, rr_type, rr_class, rr_ttl
|
local pos, TRN_ID, FLAGS, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT, rr_name, rr_type, rr_class, rr_ttl
|
||||||
local rrlength, name_count
|
local rrlength, name_count
|
||||||
|
|
||||||
pos, TRN_ID, FLAGS, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT = bin.unpack(">SSSSSS", result)
|
TRN_ID, FLAGS, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT, pos = string.unpack(">I2I2I2I2I2I2", result)
|
||||||
|
|
||||||
-- Sanity check the result (has to have the same TRN_ID, 1 answer, and proper flags)
|
-- Sanity check the result (has to have the same TRN_ID, 1 answer, and proper flags)
|
||||||
if(TRN_ID ~= 0x1337) then
|
if(TRN_ID ~= 0x1337) then
|
||||||
@@ -371,7 +370,7 @@ function do_nbstat(host)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Start parsing the answer field
|
-- Start parsing the answer field
|
||||||
pos, rr_name, rr_type, rr_class, rr_ttl = bin.unpack(">zSSI", result, pos)
|
rr_name, rr_type, rr_class, rr_ttl, pos = string.unpack(">zI2I2I4", result, pos)
|
||||||
|
|
||||||
-- More sanity checks
|
-- More sanity checks
|
||||||
if(rr_name ~= encoded_name) then
|
if(rr_name ~= encoded_name) then
|
||||||
@@ -384,7 +383,7 @@ function do_nbstat(host)
|
|||||||
return false, "Server returned incorrect query type"
|
return false, "Server returned incorrect query type"
|
||||||
end
|
end
|
||||||
|
|
||||||
pos, rrlength, name_count = bin.unpack(">SC", result, pos)
|
rrlength, name_count, pos = string.unpack(">I2B", result, pos)
|
||||||
|
|
||||||
local names = {}
|
local names = {}
|
||||||
for i = 1, name_count do
|
for i = 1, name_count do
|
||||||
@@ -392,7 +391,7 @@ function do_nbstat(host)
|
|||||||
|
|
||||||
-- Instead of reading the 16-byte name and pulling off the suffix,
|
-- Instead of reading the 16-byte name and pulling off the suffix,
|
||||||
-- we read the first 15 bytes and then the 1-byte suffix.
|
-- we read the first 15 bytes and then the 1-byte suffix.
|
||||||
pos, name, suffix, flags = bin.unpack(">A15CS", result, pos)
|
name, suffix, flags, pos = string.unpack(">c15BI2", result, pos)
|
||||||
name = string.gsub(name, "[ ]*$", "")
|
name = string.gsub(name, "[ ]*$", "")
|
||||||
|
|
||||||
names[i] = {}
|
names[i] = {}
|
||||||
@@ -407,7 +406,7 @@ function do_nbstat(host)
|
|||||||
if(rrlength > 0) then
|
if(rrlength > 0) then
|
||||||
rrlength = rrlength - 1
|
rrlength = rrlength - 1
|
||||||
end
|
end
|
||||||
pos, statistics = bin.unpack(string.format(">A%d", rrlength), result, pos)
|
statistics, pos = string.unpack(string.format(">c%d", rrlength), result, pos)
|
||||||
|
|
||||||
-- Put it in the registry, in case anybody else needs it
|
-- Put it in the registry, in case anybody else needs it
|
||||||
reg["nbstat_names"] = names
|
reg["nbstat_names"] = names
|
||||||
|
|||||||
@@ -38,7 +38,6 @@
|
|||||||
--
|
--
|
||||||
|
|
||||||
|
|
||||||
local bin = require "bin"
|
|
||||||
local match = require "match"
|
local match = require "match"
|
||||||
local nmap = require "nmap"
|
local nmap = require "nmap"
|
||||||
local stdnse = require "stdnse"
|
local stdnse = require "stdnse"
|
||||||
@@ -67,14 +66,14 @@ DominoPacket = {
|
|||||||
-- @return Error code (if status is false).
|
-- @return Error code (if status is false).
|
||||||
read = function( self, domsock )
|
read = function( self, domsock )
|
||||||
local status, data = domsock:receive_buf(match.numbytes(2), true)
|
local status, data = domsock:receive_buf(match.numbytes(2), true)
|
||||||
local pos, len = bin.unpack( "<S", data )
|
local len = string.unpack( "<I2", data )
|
||||||
|
|
||||||
return domsock:receive_buf(match.numbytes(len), true)
|
return domsock:receive_buf(match.numbytes(len), true)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
--- converts the packet to a string
|
--- converts the packet to a string
|
||||||
__tostring = function(self)
|
__tostring = function(self)
|
||||||
return bin.pack("<SA", #self.data, self.data )
|
return string.pack("<s2", self.data )
|
||||||
end,
|
end,
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -124,7 +123,7 @@ Helper = {
|
|||||||
isValidUser = function( self, username )
|
isValidUser = function( self, username )
|
||||||
local data = stdnse.fromhex("00001e00000001000080000007320000700104020000fb2b2d00281f1e000000124c010000000000")
|
local data = stdnse.fromhex("00001e00000001000080000007320000700104020000fb2b2d00281f1e000000124c010000000000")
|
||||||
local status, id_data
|
local status, id_data
|
||||||
local data_len, pos, total_len, pkt_type, valid_user
|
local data_len, total_len, pkt_type, valid_user
|
||||||
|
|
||||||
self.domsock:send( tostring(DominoPacket:new( data )) )
|
self.domsock:send( tostring(DominoPacket:new( data )) )
|
||||||
data = DominoPacket:new():read( self.domsock )
|
data = DominoPacket:new():read( self.domsock )
|
||||||
@@ -137,9 +136,9 @@ Helper = {
|
|||||||
self.domsock:send( tostring(DominoPacket:new( data ) ) )
|
self.domsock:send( tostring(DominoPacket:new( data ) ) )
|
||||||
status, id_data = DominoPacket:new():read( self.domsock )
|
status, id_data = DominoPacket:new():read( self.domsock )
|
||||||
|
|
||||||
pos, pkt_type = bin.unpack("C", id_data, 3)
|
pkt_type = string.unpack("B", id_data, 3)
|
||||||
pos, valid_user = bin.unpack("C", id_data, 11)
|
valid_user = string.unpack("B", id_data, 11)
|
||||||
pos, total_len = bin.unpack("<S", id_data, 13)
|
total_len = string.unpack("<I2", id_data, 13)
|
||||||
|
|
||||||
if ( pkt_type == 0x16 ) then
|
if ( pkt_type == 0x16 ) then
|
||||||
if ( valid_user == 0x19 ) then
|
if ( valid_user == 0x19 ) then
|
||||||
|
|||||||
@@ -27,11 +27,11 @@
|
|||||||
--
|
--
|
||||||
-- 2011-01-22 - re-wrote library to use coroutines instead of new_thread code.
|
-- 2011-01-22 - re-wrote library to use coroutines instead of new_thread code.
|
||||||
|
|
||||||
local bin = require "bin"
|
|
||||||
local coroutine = require "coroutine"
|
local coroutine = require "coroutine"
|
||||||
local nmap = require "nmap"
|
local nmap = require "nmap"
|
||||||
local os = require "os"
|
local os = require "os"
|
||||||
local stdnse = require "stdnse"
|
local stdnse = require "stdnse"
|
||||||
|
local string = require "string"
|
||||||
local table = require "table"
|
local table = require "table"
|
||||||
_ENV = stdnse.module("tftp", stdnse.seeall)
|
_ENV = stdnse.module("tftp", stdnse.seeall)
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ Packet = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
__tostring = function( self )
|
__tostring = function( self )
|
||||||
return bin.pack(">SS", OpCode.ACK, self.block)
|
return string.pack(">I2I2", OpCode.ACK, self.block)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
},
|
},
|
||||||
@@ -85,7 +85,7 @@ Packet = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
__tostring = function( self )
|
__tostring = function( self )
|
||||||
return bin.pack(">SSz", OpCode.ERROR, self.code, self.msg)
|
return string.pack(">I2I2z", OpCode.ERROR, self.code, self.msg)
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,7 +168,7 @@ end
|
|||||||
-- @param port containing the port of the initiating host
|
-- @param port containing the port of the initiating host
|
||||||
-- @param data string containing the initial data passed to the server
|
-- @param data string containing the initial data passed to the server
|
||||||
local function processConnection( host, port, data )
|
local function processConnection( host, port, data )
|
||||||
local pos, op = bin.unpack(">S", data)
|
local op, pos = string.unpack(">I2", data)
|
||||||
local socket = nmap.new_socket("udp")
|
local socket = nmap.new_socket("udp")
|
||||||
|
|
||||||
socket:set_timeout(1000)
|
socket:set_timeout(1000)
|
||||||
@@ -183,7 +183,7 @@ local function processConnection( host, port, data )
|
|||||||
socket:send( tostring(Packet.ERROR:new(0, "TFTP server has write-only support")))
|
socket:send( tostring(Packet.ERROR:new(0, "TFTP server has write-only support")))
|
||||||
end
|
end
|
||||||
|
|
||||||
local pos, filename, enctype = bin.unpack("zz", data, pos)
|
local filename, enctype, pos = string.unpack("zz", data, pos)
|
||||||
status, err = socket:send( tostring( Packet.ACK:new(0) ) )
|
status, err = socket:send( tostring( Packet.ACK:new(0) ) )
|
||||||
|
|
||||||
local blocks = {}
|
local blocks = {}
|
||||||
@@ -201,13 +201,13 @@ local function processConnection( host, port, data )
|
|||||||
else
|
else
|
||||||
-- record last time we had a successful read
|
-- record last time we had a successful read
|
||||||
lastread = os.time()
|
lastread = os.time()
|
||||||
pos, op = bin.unpack(">S", pdata)
|
op, pos = string.unpack(">I2", pdata)
|
||||||
if ( OpCode.DATA ~= op ) then
|
if ( OpCode.DATA ~= op ) then
|
||||||
stdnse.debug1("Expected a data packet, terminating TFTP transfer")
|
stdnse.debug1("Expected a data packet, terminating TFTP transfer")
|
||||||
end
|
end
|
||||||
|
|
||||||
local block, data
|
local block, data
|
||||||
pos, block, data = bin.unpack(">SA" .. #pdata - 4, pdata, pos )
|
block, data, pos = string.unpack(">I2 c" .. #pdata - 4, pdata, pos )
|
||||||
|
|
||||||
blocks[block] = data
|
blocks[block] = data
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user