Skip to content

Commit 0dfdf1d

Browse files
committed
[FAB-7428] Avoid reading links to dirs as files
Have getPemMaterialFromDir stat entries returned by ioutil.ReadDir to resolve symlinks prior to checking if the entry is for a directory. This avoids warnings that occur when treating links to directories as files. Change-Id: If4dd460bdce982da559f536435c7dd3bfb183889 Signed-off-by: Matthew Sykes <sykesmat@us.ibm.com>
1 parent 1c3d63b commit 0dfdf1d

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

msp/configbuilder.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,21 @@ func getPemMaterialFromDir(dir string) ([][]byte, error) {
9090
content := make([][]byte, 0)
9191
files, err := ioutil.ReadDir(dir)
9292
if err != nil {
93-
return nil, errors.Wrapf(err, "could not read directory %s", err)
93+
return nil, errors.Wrapf(err, "could not read directory %s", dir)
9494
}
9595

9696
for _, f := range files {
97+
fullName := filepath.Join(dir, f.Name())
98+
99+
f, err := os.Stat(fullName)
100+
if err != nil {
101+
mspLogger.Warningf("Failed to stat %s: %s", fullName, err)
102+
continue
103+
}
97104
if f.IsDir() {
98105
continue
99106
}
100107

101-
fullName := filepath.Join(dir, string(filepath.Separator), f.Name())
102108
mspLogger.Debugf("Inspecting file %s", fullName)
103109

104110
item, err := readPemFile(fullName)

msp/configbuilder_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ limitations under the License.
1717
package msp
1818

1919
import (
20+
"io/ioutil"
21+
"os"
22+
"path/filepath"
2023
"testing"
2124

2225
"github.com/hyperledger/fabric/core/config"
@@ -35,6 +38,41 @@ func TestGetLocalMspConfigFails(t *testing.T) {
3538
assert.Error(t, err)
3639
}
3740

41+
func TestGetPemMaterialFromDirWithFile(t *testing.T) {
42+
tempFile, err := ioutil.TempFile("", "fabric-msp-test")
43+
assert.NoError(t, err)
44+
err = tempFile.Close()
45+
assert.NoError(t, err)
46+
defer os.Remove(tempFile.Name())
47+
48+
_, err = getPemMaterialFromDir(tempFile.Name())
49+
assert.Error(t, err)
50+
}
51+
52+
func TestGetPemMaterialFromDirWithSymlinks(t *testing.T) {
53+
mspDir, err := config.GetDevMspDir()
54+
assert.NoError(t, err)
55+
56+
tempDir, err := ioutil.TempDir("", "fabric-msp-test")
57+
assert.NoError(t, err)
58+
defer os.RemoveAll(tempDir)
59+
60+
dirSymlinkName := filepath.Join(tempDir, "..data")
61+
err = os.Symlink(filepath.Join(mspDir, "signcerts"), dirSymlinkName)
62+
assert.NoError(t, err)
63+
64+
fileSymlinkTarget := filepath.Join("..data", "peer.pem")
65+
fileSymlinkName := filepath.Join(tempDir, "peer.pem")
66+
err = os.Symlink(fileSymlinkTarget, fileSymlinkName)
67+
assert.NoError(t, err)
68+
69+
pemdataSymlink, err := getPemMaterialFromDir(tempDir)
70+
assert.NoError(t, err)
71+
expected, err := getPemMaterialFromDir(filepath.Join(mspDir, "signcerts"))
72+
assert.NoError(t, err)
73+
assert.Equal(t, pemdataSymlink, expected)
74+
}
75+
3876
func TestReadFileUtils(t *testing.T) {
3977
// test that reading a file with an empty path doesn't crash
4078
_, err := readPemFile("")

0 commit comments

Comments
 (0)