Skip to content

Commit 399567d

Browse files
authored
x/ref/lib/security: explicitly create a read lock file if it does not exist already (#179)
* x/ref/lib/security: explicitly create a read lock file if it does not exist already
1 parent cb85103 commit 399567d

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

go.mod

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go 1.13
55
require (
66
github.com/DATA-DOG/go-sqlmock v1.3.3
77
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
8-
github.com/cosnicolaou/go-bindata/v3 v3.0.8 // indirect
98
github.com/go-ole/go-ole v1.2.4 // indirect
109
github.com/go-sql-driver/mysql v1.4.1
1110
github.com/golang/protobuf v1.3.2
@@ -22,7 +21,6 @@ require (
2221
golang.org/x/net v0.0.0-20201021035429-f5854403a974
2322
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
2423
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
25-
golang.org/x/tools v0.0.0-20201109182053-3db8fd265862 // indirect
2624
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
2725
google.golang.org/api v0.9.0
2826
v.io/x/lib v0.1.7

go.sum

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q
88
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
99
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
1010
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
11-
github.com/cosnicolaou/go-bindata/v3 v3.0.8 h1:TFkRvB8gs11F8cTN+txbTQ27uH5/nKmANv9VWjMFFhw=
12-
github.com/cosnicolaou/go-bindata/v3 v3.0.8/go.mod h1:0iCg7gGrUDn2i+XhRcis0RDdNsccqPBLJECyrlpJ21M=
1311
github.com/creack/pty v1.1.7 h1:6pwm8kMQKCmgUg0ZHTm5+/YvRK0s3THD/28+T6/kk4A=
1412
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
1513
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
@@ -60,7 +58,6 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd
6058
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
6159
github.com/vanadium/go-mdns-sd v0.0.0-20181006014439-f1a1ccd1252e h1:pHSeCN6iUoIWXqaMgi9TeKuESVQY1zThuhVjAHq3GpI=
6260
github.com/vanadium/go-mdns-sd v0.0.0-20181006014439-f1a1ccd1252e/go.mod h1:35fXDjvKtzyf89fHHhyTTNLHaG2CkI7u/GvO59PIjP4=
63-
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
6461
go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
6562
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
6663
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -125,8 +122,6 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c h1:97SnQk1GYRXJgvwZ8fadnxD
125122
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
126123
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e h1:aZzprAO9/8oim3qStq3wc1Xuxx4QmAGriC4VU4ojemQ=
127124
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
128-
golang.org/x/tools v0.0.0-20201109182053-3db8fd265862 h1:LeKnBqBqKuA2WEVPhyr22inXOMgckBKHfUvD0n5kyCg=
129-
golang.org/x/tools v0.0.0-20201109182053-3db8fd265862/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
130125
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
131126
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
132127
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

x/ref/lib/security/principal_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ func TestReadonlyAccess(t *testing.T) {
138138
}
139139

140140
// Read-only access without a dir.lock file should succeed for a read-only
141-
// filesystem, but not otherwise.
141+
// filesystem, but fail otherwise after attempting to create a lock file.
142142
_, err = LoadPersistentPrincipalDaemon(gocontext.TODO(), dir, nil, true, time.Second)
143-
if err == nil || !strings.Contains(err.Error(), "dir.lock: no such file or directory") {
143+
if err == nil || !strings.Contains(err.Error(), "failed to create new read lock") {
144144
t.Fatalf("missing or incorrect error: %v", err)
145145
}
146146

x/ref/lib/security/util.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ func NewPrivateKey(keyType string) (interface{}, error) {
4141
}
4242
}
4343

44+
// createReadLockfile ensures that a lockfile for read-only access
45+
// exists by first creating a lockfile for writes, unlocking it
46+
// and then relocking for reads only.
47+
func createReadLockfile(flock *lockedfile.Mutex) (func(), error) {
48+
unlock, err := flock.Lock()
49+
if err != nil {
50+
return func() {}, err
51+
}
52+
unlock()
53+
unlock, err = flock.RLock()
54+
return unlock, err
55+
}
56+
4457
// lockAndLoad only needs to read the credentials information.
4558
func readLockAndLoad(flock *lockedfile.Mutex, loader func() error) (func(), error) {
4659
if flock == nil {
@@ -53,7 +66,13 @@ func readLockAndLoad(flock *lockedfile.Mutex, loader func() error) (func(), erro
5366
}
5467
unlock, err := flock.RLock()
5568
if err != nil {
56-
return nil, err
69+
if !os.IsNotExist(err) {
70+
return nil, err
71+
}
72+
unlock, err = createReadLockfile(flock)
73+
if err != nil {
74+
return nil, fmt.Errorf("failed to create new read lock: %v", err)
75+
}
5776
}
5877
return unlock, loader()
5978
}

0 commit comments

Comments
 (0)