hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit d055862a41e60a336104bf7719cba726641b1da0
parent 8b0c3b9b271c7f3eaa812f7a98bb738fe9cc1846
Author: Tristan Rice <rice@fn.lc>
Date:   Sun, 25 Dec 2016 04:43:50 -0800

tpl: Fix crash when using imageConfig

defaultImageConfigCache is now initialized statically instead of relying on it
being initialized in the reset function.

Fixes #2806
Diffstat:
Mtpl/template_funcs.go | 26+++++++++++++++-----------
Mtpl/template_funcs_test.go | 19+++++++++++++++----
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/tpl/template_funcs.go b/tpl/template_funcs.go
@@ -393,19 +393,23 @@ func ResetCaches() {
 
 // imageConfigCache is a lockable cache for image.Config objects. It must be
 // locked before reading or writing to config.
-var imageConfigCache struct {
-	sync.RWMutex
+type imageConfigCache struct {
 	config map[string]image.Config
+	sync.RWMutex
+}
+
+var defaultImageConfigCache = imageConfigCache{
+	config: map[string]image.Config{},
 }
 
 // resetImageConfigCache initializes and resets the imageConfig cache for the
 // imageConfig template function. This should be run once before every batch of
 // template renderers so the cache is cleared for new data.
 func resetImageConfigCache() {
-	imageConfigCache.Lock()
-	defer imageConfigCache.Unlock()
+	defaultImageConfigCache.Lock()
+	defer defaultImageConfigCache.Unlock()
 
-	imageConfigCache.config = map[string]image.Config{}
+	defaultImageConfigCache.config = map[string]image.Config{}
 }
 
 // imageConfig returns the image.Config for the specified path relative to the
@@ -421,9 +425,9 @@ func imageConfig(path interface{}) (image.Config, error) {
 	}
 
 	// Check cache for image config.
-	imageConfigCache.RLock()
-	config, ok := imageConfigCache.config[filename]
-	imageConfigCache.RUnlock()
+	defaultImageConfigCache.RLock()
+	config, ok := defaultImageConfigCache.config[filename]
+	defaultImageConfigCache.RUnlock()
 
 	if ok {
 		return config, nil
@@ -436,9 +440,9 @@ func imageConfig(path interface{}) (image.Config, error) {
 
 	config, _, err = image.DecodeConfig(f)
 
-	imageConfigCache.Lock()
-	imageConfigCache.config[filename] = config
-	imageConfigCache.Unlock()
+	defaultImageConfigCache.Lock()
+	defaultImageConfigCache.config[filename] = config
+	defaultImageConfigCache.Unlock()
 
 	return config, err
 }
diff --git a/tpl/template_funcs_test.go b/tpl/template_funcs_test.go
@@ -629,6 +629,17 @@ func TestImageConfig(t *testing.T) {
 		input      []byte
 		expected   image.Config
 	}{
+		// Make sure that the cache is initialized by default.
+		{
+			resetCache: false,
+			path:       "a.png",
+			input:      blankImage(10, 10),
+			expected: image.Config{
+				Width:      10,
+				Height:     10,
+				ColorModel: color.NRGBAModel,
+			},
+		},
 		{
 			resetCache: true,
 			path:       "a.png",
@@ -685,8 +696,8 @@ func TestImageConfig(t *testing.T) {
 			t.Errorf("[%d] imageConfig: expected '%v', got '%v'", i, this.expected, result)
 		}
 
-		if len(imageConfigCache.config) == 0 {
-			t.Error("imageConfigCache should have at least 1 item")
+		if len(defaultImageConfigCache.config) == 0 {
+			t.Error("defaultImageConfigCache should have at least 1 item")
 		}
 	}
 
@@ -705,8 +716,8 @@ func TestImageConfig(t *testing.T) {
 	// test cache clearing
 	ResetCaches()
 
-	if len(imageConfigCache.config) != 0 {
-		t.Error("ResetCaches should have cleared imageConfigCache")
+	if len(defaultImageConfigCache.config) != 0 {
+		t.Error("ResetCaches should have cleared defaultImageConfigCache")
 	}
 }