diff --git a/acme/autocert/cache.go b/acme/autocert/cache.go index aa9aa84..03f6302 100644 --- a/acme/autocert/cache.go +++ b/acme/autocert/cache.go @@ -77,6 +77,7 @@ func (d DirCache) Put(ctx context.Context, name string, data []byte) error { if tmp, err = d.writeTempFile(name, data); err != nil { return } + defer os.Remove(tmp) select { case <-ctx.Done(): // Don't overwrite the file if the context was canceled. @@ -116,12 +117,17 @@ func (d DirCache) Delete(ctx context.Context, name string) error { } // writeTempFile writes b to a temporary file, closes the file and returns its path. -func (d DirCache) writeTempFile(prefix string, b []byte) (string, error) { +func (d DirCache) writeTempFile(prefix string, b []byte) (name string, reterr error) { // TempFile uses 0600 permissions f, err := ioutil.TempFile(string(d), prefix) if err != nil { return "", err } + defer func() { + if reterr != nil { + os.Remove(f.Name()) + } + }() if _, err := f.Write(b); err != nil { f.Close() return "", err diff --git a/acme/autocert/cache_test.go b/acme/autocert/cache_test.go index 653b05b..4d0b162 100644 --- a/acme/autocert/cache_test.go +++ b/acme/autocert/cache_test.go @@ -48,6 +48,15 @@ func TestDirCache(t *testing.T) { t.Error(err) } + // test put deletes temp file + tmp, err := filepath.Glob(name + "?*") + if err != nil { + t.Error(err) + } + if tmp != nil { + t.Errorf("temp file exists: %s", tmp) + } + // test delete if err := cache.Delete(ctx, "dummy"); err != nil { t.Fatalf("delete: %v", err)