Please answer these questions before submitting your issue. Thanks!
What version of Go are you using (go version)?
go version go1.7.1 darwin/amd64
Does this issue reproduce with the latest release?
Don't know
What operating system and processor architecture are you using (go env)?
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/pivotal/go"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.7.1/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.7.1/libexec/pkg/tool/darwin_amd64"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/60/czc9bh9j6w17gl13v_g9vxs80000gn/T/go-build433256889=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
What did you do?
This is fun.
-
Create a zip file on Windows, or any other platform where the
directory entries don't have the 'd' bit set. Here's the one we worked on: https://github.com/cloudfoundry/cf-acceptance-tests/blob/master/assets/java-spring/java-spring.jar
-
Copy bad-win.zip to orig-bad-win.zip, so you can run step 3 repeatedly:
-
Run the zip file through some ruby code like this:
require 'zip'
def get_dirs_from_zip(zip_path)
Zip::File.open(zip_path) do |in_zip|
in_zip.select(&:directory?)
end
end
dir_list = get_dirs_from_zip(zip_path)
Zip::File.open(zip_file) do |in_zip|
dir_list.each do |dir|
in_zip.remove(dir)
end
end
-
The go code is attached in a file called transform.go
-
I ran this command (note that the code wants ok-win.tar to exist in advance):
touch ok-win.tar ; go run transform.go bad-win.zip ok-win.tar
What did you expect to see?
I expected to see a tar file called ok-win.tar
What did you see instead?
"zip: checksum error"
Notes
There are three likely sources for this error (4 but we're allowing winzip to not set the 'd' bit because zip is weird about directories anyway):
- Our ruby code
- The ruby zip library
- The go archive/zip library
Our ruby code seems ok, because it's not a problem with the zip files where the 'd' bit is set.
The error might be in the ruby zip library, but I can't really report it until I have a better idea
of the cause of the checksum error. I left some printf's in the code, so you can see the error occurs in the call io.Copy(tarWriter, zipFileReader), and not earlier calls that read the zip file.
Please answer these questions before submitting your issue. Thanks!
What version of Go are you using (
go version)?go version go1.7.1 darwin/amd64
Does this issue reproduce with the latest release?
Don't know
What operating system and processor architecture are you using (
go env)?What did you do?
This is fun.
Create a zip file on Windows, or any other platform where the
directory entries don't have the 'd' bit set. Here's the one we worked on: https://github.com/cloudfoundry/cf-acceptance-tests/blob/master/assets/java-spring/java-spring.jar
Copy bad-win.zip to orig-bad-win.zip, so you can run step 3 repeatedly:
Run the zip file through some ruby code like this:
require 'zip'
def get_dirs_from_zip(zip_path)
Zip::File.open(zip_path) do |in_zip|
in_zip.select(&:directory?)
end
end
dir_list = get_dirs_from_zip(zip_path)
Zip::File.open(zip_file) do |in_zip|
dir_list.each do |dir|
in_zip.remove(dir)
end
end
The go code is attached in a file called transform.go
I ran this command (note that the code wants ok-win.tar to exist in advance):
touch ok-win.tar ; go run transform.go bad-win.zip ok-win.tarWhat did you expect to see?
I expected to see a tar file called
ok-win.tarWhat did you see instead?
"zip: checksum error"
Notes
There are three likely sources for this error (4 but we're allowing winzip to not set the 'd' bit because zip is weird about directories anyway):
Our ruby code seems ok, because it's not a problem with the zip files where the 'd' bit is set.
The error might be in the ruby zip library, but I can't really report it until I have a better idea
of the cause of the checksum error. I left some printf's in the code, so you can see the error occurs in the call
io.Copy(tarWriter, zipFileReader), and not earlier calls that read the zip file.