add stronger protections for nil pointers in server join merge

This commit is contained in:
Chelsea Holland Komlo
2018-05-29 11:25:09 -04:00
committed by Alex Dadgar
parent 94cf42ec81
commit 236ac6592e
2 changed files with 73 additions and 21 deletions

View File

@@ -381,19 +381,31 @@ type ServerJoin struct {
RetryInterval time.Duration `mapstructure:"retry_interval"`
}
func (s *ServerJoin) Merge(b *ServerJoin) {
func (s *ServerJoin) Merge(b *ServerJoin) *ServerJoin {
if s == nil {
return b
}
result := *s
if b == nil {
return &result
}
if len(b.StartJoin) != 0 {
s.StartJoin = b.StartJoin
result.StartJoin = b.StartJoin
}
if len(b.RetryJoin) != 0 {
s.RetryJoin = b.RetryJoin
result.RetryJoin = b.RetryJoin
}
if b.RetryMaxAttempts != 0 {
s.RetryMaxAttempts = b.RetryMaxAttempts
result.RetryMaxAttempts = b.RetryMaxAttempts
}
if b.RetryInterval != 0 {
s.RetryInterval = b.RetryInterval
result.RetryInterval = b.RetryInterval
}
return &result
}
// EncryptBytes returns the encryption key configured.
@@ -1104,7 +1116,7 @@ func (a *ServerConfig) Merge(b *ServerConfig) *ServerConfig {
result.EncryptKey = b.EncryptKey
}
if b.ServerJoin != nil {
result.ServerJoin.Merge(b.ServerJoin)
result.ServerJoin = result.ServerJoin.Merge(b.ServerJoin)
}
// Add the schedulers

View File

@@ -926,11 +926,11 @@ func TestMergeServerJoin(t *testing.T) {
}
b := &ServerJoin{}
a.Merge(b)
require.Equal(a.RetryJoin, retryJoin)
require.Equal(a.StartJoin, startJoin)
require.Equal(a.RetryMaxAttempts, retryMaxAttempts)
require.Equal(a.RetryInterval, retryInterval)
result := a.Merge(b)
require.Equal(result.RetryJoin, retryJoin)
require.Equal(result.StartJoin, startJoin)
require.Equal(result.RetryMaxAttempts, retryMaxAttempts)
require.Equal(result.RetryInterval, retryInterval)
}
{
retryJoin := []string{"127.0.0.1", "127.0.0.2"}
@@ -946,11 +946,51 @@ func TestMergeServerJoin(t *testing.T) {
RetryInterval: time.Duration(retryInterval),
}
a.Merge(b)
require.Equal(a.RetryJoin, retryJoin)
require.Equal(a.StartJoin, startJoin)
require.Equal(a.RetryMaxAttempts, retryMaxAttempts)
require.Equal(a.RetryInterval, retryInterval)
result := a.Merge(b)
require.Equal(result.RetryJoin, retryJoin)
require.Equal(result.StartJoin, startJoin)
require.Equal(result.RetryMaxAttempts, retryMaxAttempts)
require.Equal(result.RetryInterval, retryInterval)
}
{
retryJoin := []string{"127.0.0.1", "127.0.0.2"}
startJoin := []string{"127.0.0.1", "127.0.0.2"}
retryMaxAttempts := 1
retryInterval := time.Duration(0)
var a *ServerJoin
b := &ServerJoin{
RetryJoin: retryJoin,
StartJoin: startJoin,
RetryMaxAttempts: retryMaxAttempts,
RetryInterval: time.Duration(retryInterval),
}
result := a.Merge(b)
require.Equal(result.RetryJoin, retryJoin)
require.Equal(result.StartJoin, startJoin)
require.Equal(result.RetryMaxAttempts, retryMaxAttempts)
require.Equal(result.RetryInterval, retryInterval)
}
{
retryJoin := []string{"127.0.0.1", "127.0.0.2"}
startJoin := []string{"127.0.0.1", "127.0.0.2"}
retryMaxAttempts := 1
retryInterval := time.Duration(0)
a := &ServerJoin{
RetryJoin: retryJoin,
StartJoin: startJoin,
RetryMaxAttempts: retryMaxAttempts,
RetryInterval: time.Duration(retryInterval),
}
var b *ServerJoin
result := a.Merge(b)
require.Equal(result.RetryJoin, retryJoin)
require.Equal(result.StartJoin, startJoin)
require.Equal(result.RetryMaxAttempts, retryMaxAttempts)
require.Equal(result.RetryInterval, retryInterval)
}
{
retryJoin := []string{"127.0.0.1", "127.0.0.2"}
@@ -967,10 +1007,10 @@ func TestMergeServerJoin(t *testing.T) {
RetryInterval: time.Duration(retryInterval),
}
a.Merge(b)
require.Equal(a.RetryJoin, retryJoin)
require.Equal(a.StartJoin, startJoin)
require.Equal(a.RetryMaxAttempts, retryMaxAttempts)
require.Equal(a.RetryInterval, retryInterval)
result := a.Merge(b)
require.Equal(result.RetryJoin, retryJoin)
require.Equal(result.StartJoin, startJoin)
require.Equal(result.RetryMaxAttempts, retryMaxAttempts)
require.Equal(result.RetryInterval, retryInterval)
}
}