Method: PDK::Module::Build#validate_ustar_path!
- Defined in:
- lib/pdk/module/build.rb
#validate_ustar_path!(path) ⇒ nil
Checks if the path length will fit into the POSIX.1-1998 (ustar) tar header format.
POSIX.1-2001 (which allows paths of infinite length) was adopted by GNU tar in 2004 and is supported by minitar 0.7 and above. Unfortunately much of the Puppet ecosystem still uses minitar 0.6.1.
POSIX.1-1998 tar format does not allow for paths greater than 256 bytes, or paths that can’t be split into a prefix of 155 bytes (max) and a suffix of 100 bytes (max).
This logic was pretty much copied from the private method Archive::Tar::Minitar::Writer#split_name.
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File 'lib/pdk/module/build.rb', line 185 def validate_ustar_path!(path) if path.bytesize > 256 raise ArgumentError, _("The path '%{path}' is longer than 256 bytes.") % { path: path, } end if path.bytesize <= 100 prefix = '' else parts = path.split(File::SEPARATOR) newpath = parts.pop nxt = '' loop do nxt = parts.pop || '' break if newpath.bytesize + 1 + nxt.bytesize >= 100 newpath = File.join(nxt, newpath) end prefix = File.join(*parts, nxt) path = newpath end return unless path.bytesize > 100 || prefix.bytesize > 155 raise ArgumentError, _( "'%{path}' could not be split at a directory separator into two " \ 'parts, the first having a maximum length of 155 bytes and the ' \ 'second having a maximum length of 100 bytes.', ) % { path: path } end |