]> Cypherpunks repositories - gostls13.git/commitdiff
internal/syscall/windows/registry: improve ReadSubKeyNames permissions
authorShamil Garatuev <garatuev@gmail.com>
Tue, 27 Feb 2018 18:26:17 +0000 (21:26 +0300)
committerAlex Brainman <alex.brainman@gmail.com>
Fri, 2 Mar 2018 22:58:33 +0000 (22:58 +0000)
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 <alex.brainman@gmail.com>
src/internal/syscall/windows/registry/key.go
src/internal/syscall/windows/registry/registry_test.go

index 62144d39b76c485012dd94f975a687c14b1c8e5c..cc3d0c774bdac37eccfbcc6f81d6ba5429348315 100644 (file)
@@ -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 {
index 56069d7684d2880f471fb5d7f5f5c3dcb8defec3..c77329cb1e4036b65bbd9a15636da63dc6c90466 100644 (file)
@@ -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)
        }