{"record":{"id":"e0c4a0dfeb1a8f0f","repo":"siyuan-note/siyuan","slug":"clone-new-item-template-failed","errorCode":null,"errorMessage":"clone new item template failed","messagePattern":"clone new item template failed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/av/new_item_template.go","lineNumber":52,"sourceCode":"\tValues     []string\n}\n\n// SetNewItemTemplates 校验并替换数据库的新增条目模板配置。\nfunc (av *AttributeView) SetNewItemTemplates(config *NewItemTemplatesConfig) error {\n\tif nil == config {\n\t\treturn errors.New(\"new item templates config is nil\")\n\t}\n\n\ttemplates := make([]*NewItemTemplate, 0, len(config.Templates))\n\ttemplateIDs := map[string]bool{}\n\tdefaultTemplateID := config.DefaultTemplateID\n\tfor _, itemTemplate := range config.Templates {\n\t\tif nil == itemTemplate {\n\t\t\tcontinue\n\t\t}\n\t\titemTemplate = cloneNewItemTemplate(itemTemplate)\n\t\tif nil == itemTemplate {\n\t\t\treturn errors.New(\"clone new item template failed\")\n\t\t}\n\t\titemTemplate.Name = strings.TrimSpace(itemTemplate.Name)\n\t\titemTemplate.Icon = strings.TrimSpace(itemTemplate.Icon)\n\t\tif filteredIcon, valid := util.FilterIconValue(itemTemplate.Icon); valid {\n\t\t\titemTemplate.Icon = filteredIcon\n\t\t} else {\n\t\t\t// 非法图标值置空，防止存储可执行标记\n\t\t\t// https://github.com/siyuan-note/siyuan/security/advisories/GHSA-vx5w-qrvp-mmcq\n\t\t\titemTemplate.Icon = \"\"\n\t\t}\n\t\tif \"\" == itemTemplate.Name {\n\t\t\treturn errors.New(\"new item template name is empty\")\n\t\t}\n\t\tif !ast.IsNodeIDPattern(itemTemplate.ID) {\n\t\t\treturn fmt.Errorf(\"invalid new item template id [%s]\", itemTemplate.ID)\n\t\t}\n\t\tif templateIDs[itemTemplate.ID] {\n\t\t\treturn fmt.Errorf(\"duplicated new item template id [%s]\", itemTemplate.ID)","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/av/new_item_template.go#L34-L70","documentation":"cloneNewItemTemplate returned nil. In the current implementation cloneNewItemTemplate only returns nil when its input is nil (new_item_template.go:469), and the loop above already does `if nil == itemTemplate { continue }`. So through the public API this branch is effectively unreachable; it exists as a defensive guard against a future clone failure mode.","triggerScenarios":"Not reachable via SetNewItemTemplates today. Would only fire if cloneNewItemTemplate grew a new failure path (e.g. deep-copy allocation failure) and returned nil for non-nil input.","commonSituations":"Should not occur in practice; if it does, suspect a kernel regression in cloneNewItemTemplate or memory pressure during a future deep-copy change.","solutions":["If you see this in production, inspect cloneNewItemTemplate for newly added failure paths.","Report to kernel maintainers with the template payload, since current code cannot produce it."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Defensive: verify clone result before relying on it (mirrors the kernel guard).\ncloned := cloneNewItemTemplate(t)\nif cloned == nil {\n    return errors.New(\"clone new item template failed\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat this error as a kernel bug if observed — current code cannot produce it.","Pin kernel version when relying on cloneNewItemTemplate in plugins."],"tags":["av","new-item-template","defensive","unreachable"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}