keywords: correctly handle time keywords
Previously, the time generation code would inexplicably drop parts of the nanotime -- potentially causing validation to succeed when it should fail. This was probably do to a bug in the remainder logic, but instead we should be using .Nanosecond() anyway. After changing the time of a file with a test case like this: // Change the time to something known with nanosec != 0. chtime := time.Unix(100, 987654321) if err := os.Chtimes("somefile", chtime, chtime); err != nil { // panic } timeKeywordFunc() would return the wrong value (time=100.000000021). This fixes the issue and adds a test case. Signed-off-by: Aleksa Sarai <asarai@suse.de>
This commit is contained in:
parent
c5fc89d0f1
commit
d0f7e8cb8b
2 changed files with 99 additions and 6 deletions
10
keywords.go
10
keywords.go
|
@ -287,14 +287,12 @@ var (
|
|||
}
|
||||
}
|
||||
tartimeKeywordFunc = func(path string, info os.FileInfo, r io.Reader) (string, error) {
|
||||
return fmt.Sprintf("tar_time=%d.000000000", info.ModTime().Unix()), nil
|
||||
return fmt.Sprintf("tar_time=%d.%9.9d", info.ModTime().Unix(), 0), nil
|
||||
}
|
||||
timeKeywordFunc = func(path string, info os.FileInfo, r io.Reader) (string, error) {
|
||||
t := info.ModTime().UnixNano()
|
||||
if t == 0 {
|
||||
return "time=0.000000000", nil
|
||||
}
|
||||
return fmt.Sprintf("time=%d.%9.9d", (t / 1e9), (t % (t / 1e9))), nil
|
||||
tSec := info.ModTime().Unix()
|
||||
tNano := info.ModTime().Nanosecond()
|
||||
return fmt.Sprintf("time=%d.%9.9d", tSec, tNano), nil
|
||||
}
|
||||
linkKeywordFunc = func(path string, info os.FileInfo, r io.Reader) (string, error) {
|
||||
if sys, ok := info.Sys().(*tar.Header); ok {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue