Skip to content
This repository was archived by the owner on Feb 21, 2022. It is now read-only.

Commit 96ad402

Browse files
committed
cmd/plg: fix slice overwriting on expansion
1 parent 73f6141 commit 96ad402

File tree

6 files changed

+427
-7
lines changed

6 files changed

+427
-7
lines changed

cmd/plg/check_test.go

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,231 @@ func TestCheck(t *testing.T) {
973973
conflicts: true,
974974
err: nil,
975975
},
976+
{
977+
// NOTE(gbrlsnchs): Bug caught on my own dotfiles.
978+
name: "bug expand",
979+
drv: fstest.InMemoryDriver{
980+
CurrentDir: "home/dotfiles",
981+
Files: map[string]fstest.File{
982+
"home": {
983+
Linkname: "",
984+
Perm: os.ModePerm,
985+
Data: nil,
986+
Children: map[string]fstest.File{
987+
"dotfiles": {
988+
Linkname: "",
989+
Perm: os.ModePerm,
990+
Data: nil,
991+
Children: map[string]fstest.File{
992+
"root": {
993+
Linkname: "",
994+
Perm: os.ModePerm,
995+
Data: nil,
996+
Children: map[string]fstest.File{
997+
"dir": {
998+
Linkname: "",
999+
Perm: os.ModePerm,
1000+
Data: nil,
1001+
Children: map[string]fstest.File{
1002+
"subdir": {
1003+
Linkname: "",
1004+
Perm: os.ModePerm,
1005+
Data: nil,
1006+
Children: map[string]fstest.File{
1007+
"target_1": {
1008+
Linkname: "",
1009+
Perm: os.ModePerm,
1010+
Data: nil,
1011+
Children: map[string]fstest.File{
1012+
"foo": {Data: []byte("foo")},
1013+
"bar": {Data: []byte("bar")},
1014+
},
1015+
},
1016+
"target_2": {
1017+
Linkname: "",
1018+
Perm: os.ModePerm,
1019+
Data: nil,
1020+
Children: map[string]fstest.File{
1021+
"baz": {Data: []byte("baz")},
1022+
},
1023+
},
1024+
},
1025+
},
1026+
},
1027+
},
1028+
},
1029+
},
1030+
"bug_expand.yml": {
1031+
Linkname: "",
1032+
Perm: os.ModePerm,
1033+
Data: yamlData(config.Config{
1034+
Targets: []string{"root"},
1035+
Options: map[string]*config.Config{
1036+
"root": {
1037+
BaseDir: fstest.AbsPath("etc"),
1038+
Targets: []string{"dir"},
1039+
Options: map[string]*config.Config{
1040+
"dir": {
1041+
Targets: []string{"subdir"},
1042+
Flatten: true,
1043+
},
1044+
},
1045+
Flatten: true,
1046+
},
1047+
},
1048+
}),
1049+
Children: nil,
1050+
},
1051+
},
1052+
},
1053+
},
1054+
},
1055+
"etc": {
1056+
Linkname: "",
1057+
Perm: os.ModePerm,
1058+
Data: nil,
1059+
Children: map[string]fstest.File{
1060+
"subdir": {
1061+
Linkname: "",
1062+
Perm: os.ModePerm,
1063+
Data: nil,
1064+
Children: map[string]fstest.File{
1065+
"target_1": {
1066+
Linkname: "",
1067+
Perm: os.ModePerm,
1068+
Data: nil,
1069+
Children: map[string]fstest.File{
1070+
"foo": {Data: []byte("foo")},
1071+
"bar": {Data: []byte("bar")},
1072+
},
1073+
},
1074+
"target_2": {
1075+
Linkname: "",
1076+
Perm: os.ModePerm,
1077+
Data: nil,
1078+
Children: map[string]fstest.File{
1079+
"qux": {Data: []byte("qux")},
1080+
},
1081+
},
1082+
},
1083+
},
1084+
},
1085+
},
1086+
},
1087+
},
1088+
cmd: checkCmd{},
1089+
want: fstest.InMemoryDriver{
1090+
CurrentDir: "home/dotfiles",
1091+
Files: map[string]fstest.File{
1092+
"home": {
1093+
Linkname: "",
1094+
Perm: os.ModePerm,
1095+
Data: nil,
1096+
Children: map[string]fstest.File{
1097+
"dotfiles": {
1098+
Linkname: "",
1099+
Perm: os.ModePerm,
1100+
Data: nil,
1101+
Children: map[string]fstest.File{
1102+
"root": {
1103+
Linkname: "",
1104+
Perm: os.ModePerm,
1105+
Data: nil,
1106+
Children: map[string]fstest.File{
1107+
"dir": {
1108+
Linkname: "",
1109+
Perm: os.ModePerm,
1110+
Data: nil,
1111+
Children: map[string]fstest.File{
1112+
"subdir": {
1113+
Linkname: "",
1114+
Perm: os.ModePerm,
1115+
Data: nil,
1116+
Children: map[string]fstest.File{
1117+
"target_1": {
1118+
Linkname: "",
1119+
Perm: os.ModePerm,
1120+
Data: nil,
1121+
Children: map[string]fstest.File{
1122+
"foo": {Data: []byte("foo")},
1123+
"bar": {Data: []byte("bar")},
1124+
},
1125+
},
1126+
"target_2": {
1127+
Linkname: "",
1128+
Perm: os.ModePerm,
1129+
Data: nil,
1130+
Children: map[string]fstest.File{
1131+
"baz": {Data: []byte("baz")},
1132+
},
1133+
},
1134+
},
1135+
},
1136+
},
1137+
},
1138+
},
1139+
},
1140+
"bug_expand.yml": {
1141+
Linkname: "",
1142+
Perm: os.ModePerm,
1143+
Data: yamlData(config.Config{
1144+
Targets: []string{"root"},
1145+
Options: map[string]*config.Config{
1146+
"root": {
1147+
BaseDir: fstest.AbsPath("etc"),
1148+
Targets: []string{"dir"},
1149+
Options: map[string]*config.Config{
1150+
"dir": {
1151+
Targets: []string{"subdir"},
1152+
Flatten: true,
1153+
},
1154+
},
1155+
Flatten: true,
1156+
},
1157+
},
1158+
}),
1159+
Children: nil,
1160+
},
1161+
},
1162+
},
1163+
},
1164+
},
1165+
"etc": {
1166+
Linkname: "",
1167+
Perm: os.ModePerm,
1168+
Data: nil,
1169+
Children: map[string]fstest.File{
1170+
"subdir": {
1171+
Linkname: "",
1172+
Perm: os.ModePerm,
1173+
Data: nil,
1174+
Children: map[string]fstest.File{
1175+
"target_1": {
1176+
Linkname: "",
1177+
Perm: os.ModePerm,
1178+
Data: nil,
1179+
Children: map[string]fstest.File{
1180+
"foo": {Data: []byte("foo")},
1181+
"bar": {Data: []byte("bar")},
1182+
},
1183+
},
1184+
"target_2": {
1185+
Linkname: "",
1186+
Perm: os.ModePerm,
1187+
Data: nil,
1188+
Children: map[string]fstest.File{
1189+
"qux": {Data: []byte("qux")},
1190+
},
1191+
},
1192+
},
1193+
},
1194+
},
1195+
},
1196+
},
1197+
},
1198+
conflicts: false,
1199+
err: nil,
1200+
},
9761201
}
9771202
for _, tc := range testCases {
9781203
t.Run(tc.name, func(t *testing.T) {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.
2+
└── root (SKIP)
3+
└── dir (SKIP)
4+
└── subdir (EXPAND)
5+
├── target_1 (EXPAND)
6+
│ ├── bar <- ~etc/subdir/target_1/bar (CONFLICT)
7+
│ └── foo <- ~etc/subdir/target_1/foo (CONFLICT)
8+
└── target_2 (EXPAND)
9+
└── baz <- ~etc/subdir/target_2/baz (READY)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.
2+
└── root (SKIP)
3+
└── dir (SKIP)
4+
└── subdir (EXPAND)
5+
├── target_1 (EXPAND)
6+
│ ├── bar <- ~etc/subdir/target_1/bar (CONFLICT)
7+
│ └── foo <- ~etc/subdir/target_1/foo (CONFLICT)
8+
└── target_2 (EXPAND)
9+
└── baz <- ~etc/subdir/target_2/baz (READY)

linker/linker.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,16 @@ func expand(n *parser.Node, children []fs.FileInfo) {
145145
}
146146
n.Children = make([]*parser.Node, len(children))
147147
for i, c := range children {
148+
tg := append(make([]string, 0, len(n.Target.Path) + 1), n.Target.Path...)
149+
ln := append(make([]string, 0, len(n.Link.Path) + 1), n.Link.Path...)
148150
n.Children[i] = &parser.Node{
149151
Target: parser.File{
150152
BaseDir: n.Target.BaseDir,
151-
Path: append(n.Target.Path, c.Name()),
153+
Path: append(tg, c.Name()),
152154
},
153155
Link: parser.File{
154156
BaseDir: n.Link.BaseDir,
155-
Path: append(n.Link.Path, c.Name()),
157+
Path: append(ln, c.Name()),
156158
},
157159
Children: nil,
158160
}

0 commit comments

Comments
 (0)