From: Shamil Garatuev Date: Tue, 27 Feb 2018 18:26:17 +0000 (+0300) Subject: internal/syscall/windows/registry: improve ReadSubKeyNames permissions X-Git-Tag: go1.11beta1~1364 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e658b85f26f1de6f49578b7dac95eee0da880ab9;p=gostls13.git internal/syscall/windows/registry: improve ReadSubKeyNames permissions Make ReadSubKeyNames work even if key is opened with only ENUMERATE_SUB_KEYs access rights mask. Fixes #23869 Change-Id: I138bd51715fdbc3bda05607c64bde1150f4fe6b2 Reviewed-on: https://go-review.googlesource.com/97435 Reviewed-by: Alex Brainman --- diff --git a/src/internal/syscall/windows/registry/key.go b/src/internal/syscall/windows/registry/key.go index 62144d39b7..cc3d0c774b 100644 --- a/src/internal/syscall/windows/registry/key.go +++ b/src/internal/syscall/windows/registry/key.go @@ -93,12 +93,10 @@ func OpenKey(k Key, path string, access uint32) (Key, error) { // The parameter n controls the number of returned names, // analogous to the way os.File.Readdirnames works. func (k Key) ReadSubKeyNames(n int) ([]string, error) { - ki, err := k.Stat() - if err != nil { - return nil, err - } - names := make([]string, 0, ki.SubKeyCount) - buf := make([]uint16, ki.MaxSubKeyLen+1) // extra room for terminating zero byte + names := make([]string, 0) + // Registry key size limit is 255 bytes and described there: + // https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx + buf := make([]uint16, 256) //plus extra room for terminating zero byte loopItems: for i := uint32(0); ; i++ { if n > 0 { diff --git a/src/internal/syscall/windows/registry/registry_test.go b/src/internal/syscall/windows/registry/registry_test.go index 56069d7684..c77329cb1e 100644 --- a/src/internal/syscall/windows/registry/registry_test.go +++ b/src/internal/syscall/windows/registry/registry_test.go @@ -28,7 +28,7 @@ func randKeyName(prefix string) string { } func TestReadSubKeyNames(t *testing.T) { - k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE) + k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS) if err != nil { t.Fatal(err) }