refactor(system): move locale env collection to system package for child process reuse#419
Conversation
…ild process reuse Export CollectAndClearLocaleEnvs and OriginalLocaleEnvs to allow child processes (e.g. apt commands) to inherit locale environment variables from the daemon process. 将语言环境变量收集函数迁移至 system 包并导出,使子进程(如 apt 命令) 能够从守护进程继承语言环境变量。 Log: 将语言环境变量收集函数迁移至 system 包 PMS: BUG-361139 Influence: 子进程执行 apt 命令时可正确继承语言环境变量,确保输出信息语言一致。
|
CLA Assistant Lite bot: |
deepin pr auto review这份代码变更的主要目的是将收集和清理本地化环境变量的逻辑从 整体来看,代码逻辑清晰,测试覆盖也较为完善。但从语法逻辑、代码质量、性能和安全性角度,仍有以下改进建议: 1. 语法与逻辑1.1 环境变量注入方式不一致 cmd.Env = append(os.Environ(), "IMMUTABLE_DISABLE_REMOUNT=false")
cmd.Env = append(cmd.Env, system.OriginalLocaleEnvs...)而在 environ := map[string]string{...}
for _, env := range system.OriginalLocaleEnvs {
parts := strings.SplitN(env, "=", 2)
environ[parts[0]] = parts[1]
}问题: 建议:统一环境变量的存储和传递结构。建议将 2. 代码质量2.1 全局变量的并发安全性
2.2 错误处理被忽略 _ = utils.UnsetEnv(localeEnvName)问题:虽然清理环境变量失败通常不影响主流程,但完全忽略错误可能会在极端情况下掩盖系统环境异常。 3. 代码性能3.1 字符串拆分与解析开销 for k, v := range system.OriginalLocaleEnvs {
environ[k] = v
}不仅代码更简洁,性能也更好。 4. 代码安全4.1 环境变量注入风险 cmd.Env = append(os.Environ(), "IMMUTABLE_DISABLE_REMOUNT=false")
cmd.Env = append(cmd.Env, system.OriginalLocaleEnvs...)问题:如果 建议:如果 综合改进后的代码示例基于以上建议,以下是重构后的代码片段:
// OriginalLocaleEnvs stores the locale environment variables collected at startup.
// It is recommended to use sync.RWMutex if concurrent access is possible.
var OriginalLocaleEnvs map[string]string
// CollectAndClearLocaleEnvs stores current locale envs for child processes that
// still need them, then clears them from the daemon process environment.
// Note: This function should only be called once during initialization.
func CollectAndClearLocaleEnvs() {
OriginalLocaleEnvs = make(map[string]string)
for _, localeEnvName := range []string{"LC_ALL", "LANGUAGE", "LC_MESSAGES", "LANG"} {
localeEnvValue, exists := os.LookupEnv(localeEnvName)
if exists {
OriginalLocaleEnvs[localeEnvName] = localeEnvValue
}
// Ignore error as clearing env is non-critical for daemon execution
_ = utils.UnsetEnv(localeEnvName)
}
}
// EnvsAsSlice returns the locale envs in KEY=VALUE format for exec.Cmd.Env
func EnvsAsSlice() []string {
envs := make([]string, 0, len(OriginalLocaleEnvs))
for k, v := range OriginalLocaleEnvs {
envs = append(envs, k+"="+v)
}
return envs
}
environ := map[string]string{
"IMMUTABLE_DISABLE_REMOUNT": "false",
}
// 直接遍历 Map,无需 SplitN
for k, v := range system.OriginalLocaleEnvs {
environ[k] = v
}
if system.NormalFileExists(system.DeepinImmutableCtlPath) {
cmd := exec.Command(system.DeepinImmutableCtlPath, args...) // #nosec G204
// 构建安全且不重复的子进程环境变量
cmd.Env = append(os.Environ(), "IMMUTABLE_DISABLE_REMOUNT=false")
cmd.Env = append(cmd.Env, system.EnvsAsSlice()...)
// ... 后续逻辑
}
assert.Equal(t, map[string]string{
"LC_ALL": "zh_CN.UTF-8",
"LANGUAGE": "zh_CN:en_US",
"LC_MESSAGES":"zh_CN.UTF-8",
"LANG": "zh_CN.UTF-8",
}, OriginalLocaleEnvs)通过以上改进,代码的数据结构更加合理,避免了不必要的字符串解析,增强了环境变量注入的安全性,并在注释中明确了并发使用的约束。 |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: electricface, zhaohuiw42 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Export CollectAndClearLocaleEnvs and OriginalLocaleEnvs to allow child processes (e.g. apt commands) to inherit locale environment variables from the daemon process.
将语言环境变量收集函数迁移至 system 包并导出,使子进程(如 apt 命令)
能够从守护进程继承语言环境变量。
Log: 将语言环境变量收集函数迁移至 system 包
PMS: BUG-361139
Influence: 子进程执行 apt 命令时可正确继承语言环境变量,确保输出信息语言一致。