Просмотр исходного кода

settings: Only call MkdirAll on save (#542)

settings: Only call MkdirAll on save

Previously settingsFileName() created the ~/.config/pprof directory
if it did not exist. However, this is not possible for user nobody,
since its home directory is set to "/nonexistent". Instead, only
create the directory when we actually attempt to save the file, so
the error will happen at the appropriate interaction. This als
prevents pprof from creating empty settings directories.

Fixes the following error when running pprof's web UI as user nobody:

    mkdir /nonexistent: permission denied
Evan Jones 4 лет назад
Родитель
Сommit
163a225fb6
Аккаунт пользователя с таким Email не найден
1 измененных файлов: 9 добавлений и 5 удалений
  1. 9
    5
      internal/driver/settings.go

+ 9
- 5
internal/driver/settings.go Просмотреть файл

28
 	if err != nil {
28
 	if err != nil {
29
 		return "", err
29
 		return "", err
30
 	}
30
 	}
31
-	dir = filepath.Join(dir, "pprof")
32
-	if err := os.MkdirAll(dir, 0755); err != nil {
33
-		return "", err
34
-	}
35
-	return filepath.Join(dir, "settings.json"), nil
31
+	return filepath.Join(dir, "pprof", "settings.json"), nil
36
 }
32
 }
37
 
33
 
38
 // readSettings reads settings from fname.
34
 // readSettings reads settings from fname.
60
 	if err != nil {
56
 	if err != nil {
61
 		return fmt.Errorf("could not encode settings: %w", err)
57
 		return fmt.Errorf("could not encode settings: %w", err)
62
 	}
58
 	}
59
+
60
+	// create the settings directory if it does not exist
61
+	// XDG specifies permissions 0700 when creating settings dirs:
62
+	// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
63
+	if err := os.MkdirAll(filepath.Dir(fname), 0700); err != nil {
64
+		return fmt.Errorf("failed to create settings directory: %w", err)
65
+	}
66
+
63
 	if err := ioutil.WriteFile(fname, data, 0644); err != nil {
67
 	if err := ioutil.WriteFile(fname, data, 0644); err != nil {
64
 		return fmt.Errorf("failed to write settings: %w", err)
68
 		return fmt.Errorf("failed to write settings: %w", err)
65
 	}
69
 	}