Skip to content

Commit b16bfe1

Browse files
committed
[Bug] Set file mode explicitly for regular files (nginx#1323)
Set file mode explicitly for regular files * As shown in the following code snippet, the function `ensureFiles` checks the file mode for both regular files and secret files. https://github.com/nginxinc/nginx-gateway-fabric/blob/6d4cfd7f0de32e9f98dae358cb6cec93529109a5/internal/mode/static/nginx/file/manager_test.go#L43-L47 * The function `ReplaceFiles` in `nginx/file/manager.go` creates files by internally calling [os.Create](https://pkg.go.dev/os#Create), which, by default, creates files with mode 0666 (before applying `umask`). See the [source code](https://github.com/golang/go/blob/de5b418bea70aaf27de1f47e9b5813940d1e15a4/src/os/file.go#L357-L364) of `os.Create` for more details. * The function `writeFile` changes the mode of secret files to 0640 by calling `chmod`, but does nothing for regular files. Hence, the check `Expect(info.Mode()).To(Equal(os.FileMode(0o644))) ` in `nginx/file/manager_test.go` only passes for `umask` with specific values. * In my environment, the `umask` value is 002. Therefore, the mode for regular files will be 0666 - 0002 = 0664, causing the unit test to fail. In the following screenshot, 420 is 0o644, and 436 is 0o664. ![Screen Shot 2023-12-02 at 6 05 36 PM](https://github.com/nginxinc/nginx-gateway-fabric/assets/20109646/b621c7de-2465-4c5a-988b-4cf625e5dca7) * Solution: This PR sets the file mode explicitly.
1 parent fdf5995 commit b16bfe1

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

Diff for: internal/mode/static/nginx/file/manager.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
)
1111

1212
const (
13+
// regularFileMode defines the default file mode for regular files.
14+
regularFileMode = 0o644
1315
// secretFileMode defines the default file mode for files with secrets.
1416
secretFileMode = 0o640
1517
)
@@ -136,11 +138,20 @@ func writeFile(fileMgr OSFileManager, file File) error {
136138
}
137139
}()
138140

139-
if file.Type == TypeSecret {
141+
switch file.Type {
142+
case TypeRegular:
143+
if err := fileMgr.Chmod(f, regularFileMode); err != nil {
144+
resultErr = fmt.Errorf(
145+
"failed to set file mode to %#o for %q: %w", regularFileMode, file.Path, err)
146+
return resultErr
147+
}
148+
case TypeSecret:
140149
if err := fileMgr.Chmod(f, secretFileMode); err != nil {
141-
resultErr = fmt.Errorf("failed to set file mode for %q: %w", file.Path, err)
150+
resultErr = fmt.Errorf("failed to set file mode to %#o for %q: %w", secretFileMode, file.Path, err)
142151
return resultErr
143152
}
153+
default:
154+
panic(fmt.Sprintf("unknown file type %d", file.Type))
144155
}
145156

146157
if err := fileMgr.Write(f, file.Content); err != nil {

0 commit comments

Comments
 (0)