aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/luarocks/tools/tar.lua14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/luarocks/tools/tar.lua b/src/luarocks/tools/tar.lua
index 03f7de3c..cedcceee 100644
--- a/src/luarocks/tools/tar.lua
+++ b/src/luarocks/tools/tar.lua
@@ -31,9 +31,10 @@ local function octal_to_number(octal)
31 local number = 0 31 local number = 0
32 for i = #octal,1,-1 do 32 for i = #octal,1,-1 do
33 local digit = tonumber(octal:sub(i,i)) 33 local digit = tonumber(octal:sub(i,i))
34 if not digit then break end 34 if digit then
35 number = number + (digit * 8^exp) 35 number = number + (digit * 8^exp)
36 exp = exp + 1 36 exp = exp + 1
37 end
37 end 38 end
38 return number 39 return number
39end 40end
@@ -56,10 +57,11 @@ end
56local function read_header_block(block) 57local function read_header_block(block)
57 local header = {} 58 local header = {}
58 header.name = nullterm(block:sub(1,100)) 59 header.name = nullterm(block:sub(1,100))
59 header.mode = nullterm(block:sub(101,108)) 60 header.mode = nullterm(block:sub(101,108)):gsub(" ", "")
60 header.uid = octal_to_number(nullterm(block:sub(109,116))) 61 header.uid = octal_to_number(nullterm(block:sub(109,116)))
61 header.gid = octal_to_number(nullterm(block:sub(117,124))) 62 header.gid = octal_to_number(nullterm(block:sub(117,124)))
62 header.size = octal_to_number(nullterm(block:sub(125,136))) 63 header.size = octal_to_number(nullterm(block:sub(125,136)))
64print("{"..block:sub(125,136).."}", "{"..nullterm(block:sub(125,136)).."}", "{"..octal_to_number(nullterm(block:sub(125,136))).."}", header.size)
63 header.mtime = octal_to_number(nullterm(block:sub(137,148))) 65 header.mtime = octal_to_number(nullterm(block:sub(137,148)))
64 header.chksum = octal_to_number(nullterm(block:sub(149,156))) 66 header.chksum = octal_to_number(nullterm(block:sub(149,156)))
65 header.typeflag = get_typeflag(block:sub(157,157)) 67 header.typeflag = get_typeflag(block:sub(157,157))
@@ -93,13 +95,14 @@ function tar.untar(filename, destdir)
93 local long_name, long_link_name 95 local long_name, long_link_name
94 while true do 96 while true do
95 local block 97 local block
96 repeat 98 repeat
97 block = tar_handle:read(blocksize) 99 block = tar_handle:read(blocksize)
98 until (not block) or checksum_header(block) > 256 100 until (not block) or checksum_header(block) > 256
99 if not block then break end 101 if not block then break end
100 local header, err = read_header_block(block) 102 local header, err = read_header_block(block)
101 if not header then 103 if not header then
102 util.printerr(err) 104 util.printerr(err)
105 return nil, err
103 end 106 end
104 107
105 local file_data = tar_handle:read(math.ceil(header.size / blocksize) * blocksize):sub(1,header.size) 108 local file_data = tar_handle:read(math.ceil(header.size / blocksize) * blocksize):sub(1,header.size)
@@ -143,6 +146,7 @@ function tar.untar(filename, destdir)
143 util.printout() 146 util.printout()
144 --]] 147 --]]
145 end 148 end
149 tar_handle:close()
146 return true 150 return true
147end 151end
148 152