diff options
-rw-r--r-- | src/luarocks/tools/tar.lua | 14 |
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 |
39 | end | 40 | end |
@@ -56,10 +57,11 @@ end | |||
56 | local function read_header_block(block) | 57 | local 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))) |
64 | print("{"..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 |
147 | end | 151 | end |
148 | 152 | ||