daemon/config: ignore UTF-8 BOM in config JSON

[RFC 8259] allows for JSON implementations to optionally ignore a BOM
when it helps with interoperability; do so in Moby as Notepad (the only
text editor available out of the box in many versions of Windows Server)
insists on writing UTF-8 with a BOM.

  [RFC 8259]: https://tools.ietf.org/html/rfc8259#section-8.1

Signed-off-by: Bjorn Neergaard <bneergaard@mirantis.com>
(cherry picked from commit bb19265ba8)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Bjorn Neergaard 2023-01-09 09:32:36 -07:00 committed by Sebastiaan van Stijn
parent 8f5bbc24ef
commit def679d0e0
No known key found for this signature in database
GPG key ID: 76698F39D527CE8C
2 changed files with 21 additions and 2 deletions

View file

@ -426,10 +426,14 @@ func getConflictFreeConfiguration(configFile string, flags *pflag.FlagSet) (*Con
var config Config
// Strip the UTF-8 BOM if present ([RFC 8259] allows JSON implementations to optionally strip the BOM for
// interoperability; do so here as Notepad on older versions of Windows Server insists on a BOM).
// [RFC 8259]: https://tools.ietf.org/html/rfc8259#section-8.1
b = bytes.TrimPrefix(b, []byte("\xef\xbb\xbf"))
b = bytes.TrimSpace(b)
if len(b) == 0 {
// empty config file
return &config, nil
return &config, nil // early return on empty config
}
if flags != nil {

View file

@ -2,6 +2,7 @@ package config // import "github.com/docker/docker/daemon/config"
import (
"os"
"path/filepath"
"reflect"
"strings"
"testing"
@ -35,6 +36,20 @@ func TestDaemonBrokenConfiguration(t *testing.T) {
assert.ErrorContains(t, err, `invalid character ' ' in literal true`)
}
// TestDaemonConfigurationWithBOM ensures that the UTF-8 byte order mark is ignored when reading the configuration file.
func TestDaemonConfigurationWithBOM(t *testing.T) {
configFile := filepath.Join(t.TempDir(), "daemon.json")
f, err := os.Create(configFile)
assert.NilError(t, err)
f.Write([]byte("\xef\xbb\xbf{\"debug\": true}"))
f.Close()
_, err = MergeDaemonConfigurations(&Config{}, nil, configFile)
assert.NilError(t, err)
}
func TestFindConfigurationConflicts(t *testing.T) {
config := map[string]interface{}{"authorization-plugins": "foobar"}
flags := pflag.NewFlagSet("test", pflag.ContinueOnError)