Merge lp:~chipaca/snappy/fix-1438420 into lp:~snappy-dev/snappy/snappy-moved-to-github

Proposed by John Lenton
Status: Merged
Approved by: Michael Vogt
Approved revision: 338
Merged at revision: 347
Proposed branch: lp:~chipaca/snappy/fix-1438420
Merge into: lp:~snappy-dev/snappy/snappy-moved-to-github
Diff against target: 264 lines (+74/-38)
6 files modified
clickdeb/deb.go (+35/-17)
clickdeb/deb_test.go (+15/-10)
cmd/snappy/cmd_internal_unpack.go (+8/-6)
snappy/build.go (+6/-1)
snappy/click.go (+7/-3)
snappy/click_test.go (+3/-1)
To merge this branch: bzr merge lp:~chipaca/snappy/fix-1438420
Reviewer Review Type Date Requested Status
Michael Vogt (community) Approve
Review via email: mp+255917@code.launchpad.net

Commit message

Stop chowning the snapfile.

To post a comment you must log in.
Revision history for this message
John Lenton (chipaca) wrote :

Talked with Sergio about ownership and readibility of the snap, we've come up with a solution, implementing it now.

Revision history for this message
Michael Vogt (mvo) wrote :

Thanks for doing this! One inline comment about a possible way to make it simpler.

lp:~chipaca/snappy/fix-1438420 updated
337. By John Lenton

removed ClickDeb.Path

338. By John Lenton

close things you open

Revision history for this message
Michael Vogt (mvo) wrote :

Thanks for doing this work, not only does it fix the bug, I think the code looks much nicer now than the previous version. I really like the clickdeb.Create() and clickdeb.Open() in build/unpack, its much eaiser to read this way.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'clickdeb/deb.go'
2--- clickdeb/deb.go 2015-04-08 16:11:33 +0000
3+++ clickdeb/deb.go 2015-04-13 21:00:55 +0000
4@@ -105,7 +105,35 @@
5 // ClickDeb provides support for the "click" containers (a special kind of
6 // deb package)
7 type ClickDeb struct {
8- Path string
9+ file *os.File
10+}
11+
12+// Open calls os.Open and uses that file for the backing file.
13+func Open(path string) (*ClickDeb, error) {
14+ f, err := os.Open(path)
15+ if err != nil {
16+ return nil, err
17+ }
18+ return &ClickDeb{f}, nil
19+}
20+
21+// Create calls os.Create and uses that file for the backing file.
22+func Create(path string) (*ClickDeb, error) {
23+ f, err := os.Create(path)
24+ if err != nil {
25+ return nil, err
26+ }
27+ return &ClickDeb{f}, nil
28+}
29+
30+// Name returns the Name of the backing file
31+func (d *ClickDeb) Name() string {
32+ return d.file.Name()
33+}
34+
35+// Close closes the backing file
36+func (d *ClickDeb) Close() error {
37+ return d.file.Close()
38 }
39
40 // ControlMember returns the content of the given control member file
41@@ -125,13 +153,12 @@
42 //
43 // Confused? look at ControlMember and MetaMember, which this generalises.
44 func (d *ClickDeb) member(arMember, tarMember string) (content []byte, err error) {
45- file, err := os.Open(d.Path)
46- if err != nil {
47+
48+ if _, err := d.file.Seek(0, 0); err != nil {
49 return nil, err
50 }
51- defer file.Close()
52
53- arReader := ar.NewReader(file)
54+ arReader := ar.NewReader(d.file)
55 dataReader, err := skipToArMember(arReader, arMember)
56 if err != nil {
57 return nil, err
58@@ -161,13 +188,11 @@
59 func (d *ClickDeb) Unpack(targetDir string) error {
60 var err error
61
62- file, err := os.Open(d.Path)
63- if err != nil {
64+ if _, err := d.file.Seek(0, 0); err != nil {
65 return err
66 }
67- defer file.Close()
68
69- arReader := ar.NewReader(file)
70+ arReader := ar.NewReader(d.file)
71 dataReader, err := skipToArMember(arReader, "data.tar")
72 if err != nil {
73 return err
74@@ -327,13 +352,6 @@
75 func (d *ClickDeb) Build(sourceDir string, dataTarFinishedCallback func(dataName string) error) error {
76 var err error
77
78- // create file
79- file, err := os.Create(d.Path)
80- if err != nil {
81- return err
82- }
83- defer file.Close()
84-
85 // tmp
86 tempdir, err := ioutil.TempDir("", "data")
87 if err != nil {
88@@ -365,7 +383,7 @@
89 }
90
91 // create ar
92- arWriter := ar.NewWriter(file)
93+ arWriter := ar.NewWriter(d.file)
94 arWriter.WriteGlobalHeader()
95
96 // debian magic
97
98=== modified file 'clickdeb/deb_test.go'
99--- clickdeb/deb_test.go 2015-03-30 12:08:58 +0000
100+++ clickdeb/deb_test.go 2015-04-13 21:00:55 +0000
101@@ -86,19 +86,21 @@
102 builddir := makeTestDebDir(c)
103
104 debDir := c.MkDir()
105- d := ClickDeb{Path: filepath.Join(debDir, "foo_1.0_all.deb")}
106- err := d.Build(builddir, nil)
107- c.Assert(err, IsNil)
108- c.Assert(helpers.FileExists(d.Path), Equals, true)
109+ path := filepath.Join(debDir, "foo_1.0_all.deb")
110+ d, err := Create(path)
111+ c.Assert(err, IsNil)
112+ err = d.Build(builddir, nil)
113+ c.Assert(err, IsNil)
114+ c.Assert(helpers.FileExists(path), Equals, true)
115
116 // control
117- cmd := exec.Command("dpkg-deb", "-I", d.Path)
118+ cmd := exec.Command("dpkg-deb", "-I", path)
119 output, err := cmd.CombinedOutput()
120 c.Assert(err, IsNil)
121 c.Assert(strings.Contains(string(output), "Package: foo\n"), Equals, true)
122
123 // data
124- cmd = exec.Command("dpkg-deb", "-c", d.Path)
125+ cmd = exec.Command("dpkg-deb", "-c", path)
126 output, err = cmd.CombinedOutput()
127 c.Assert(err, IsNil)
128 c.Assert(strings.Contains(string(output), "./usr/bin/foo"), Equals, true)
129@@ -108,7 +110,8 @@
130 func (s *ClickDebTestSuite) TestSnapDebControlMember(c *C) {
131 debName := makeTestDeb(c, "gzip")
132
133- d := ClickDeb{Path: debName}
134+ d, err := Open(debName)
135+ c.Assert(err, IsNil)
136 content, err := d.ControlMember("control")
137 c.Assert(err, IsNil)
138 c.Assert(string(content), Equals, string(testDebControl))
139@@ -116,7 +119,8 @@
140
141 func (s *ClickDebTestSuite) TestSnapDebMetaMember(c *C) {
142 debName := makeTestDeb(c, "gzip")
143- d := ClickDeb{Path: debName}
144+ d, err := Open(debName)
145+ c.Assert(err, IsNil)
146 yaml, err := d.MetaMember("package.yaml")
147 c.Assert(err, IsNil)
148 c.Assert(string(yaml), Equals, "name: foo")
149@@ -127,8 +131,9 @@
150
151 for _, comp := range []string{"gzip", "bzip2", "xz"} {
152 debName := makeTestDeb(c, comp)
153- d := ClickDeb{Path: debName}
154- err := d.Unpack(targetDir)
155+ d, err := Open(debName)
156+ c.Assert(err, IsNil)
157+ err = d.Unpack(targetDir)
158 c.Assert(err, IsNil)
159 expectedFile := filepath.Join(targetDir, "usr", "bin", "foo")
160 c.Assert(helpers.FileExists(expectedFile), Equals, true)
161
162=== modified file 'cmd/snappy/cmd_internal_unpack.go'
163--- cmd/snappy/cmd_internal_unpack.go 2015-04-01 03:11:44 +0000
164+++ cmd/snappy/cmd_internal_unpack.go 2015-04-13 21:00:55 +0000
165@@ -90,6 +90,12 @@
166
167 func unpackAndDropPrivs(snapFile, targetDir, rootDir string) error {
168
169+ d, err := clickdeb.Open(snapFile)
170+ if err != nil {
171+ return err
172+ }
173+ defer d.Close()
174+
175 if helpers.ShouldDropPrivs() {
176
177 passFile := passwdFile(rootDir, "passwd")
178@@ -108,10 +114,8 @@
179 return err
180 }
181
182- for _, p := range []string{snapFile, targetDir} {
183- if err := os.Chown(p, uid, gid); err != nil {
184- return err
185- }
186+ if err := os.Chown(targetDir, uid, gid); err != nil {
187+ return err
188 }
189
190 // run prctl(PR_SET_NO_NEW_PRIVS)
191@@ -137,8 +141,6 @@
192 }
193 }
194
195- d := clickdeb.ClickDeb{Path: snapFile}
196-
197 return d.Unpack(targetDir)
198 }
199
200
201=== modified file 'snappy/build.go'
202--- snappy/build.go 2015-04-08 18:15:27 +0000
203+++ snappy/build.go 2015-04-13 21:00:55 +0000
204@@ -507,7 +507,12 @@
205 }
206
207 // build it
208- d := clickdeb.ClickDeb{Path: snapName}
209+ d, err := clickdeb.Create(snapName)
210+ if err != nil {
211+ return "", err
212+ }
213+ defer d.Close()
214+
215 err = d.Build(buildDir, func(dataTar string) error {
216 // write hashes of the files plus the generated data tar
217 return writeHashes(buildDir, dataTar)
218
219=== modified file 'snappy/click.go'
220--- snappy/click.go 2015-04-08 18:53:49 +0000
221+++ snappy/click.go 2015-04-13 21:00:55 +0000
222@@ -631,12 +631,12 @@
223 return ErrUnpackHelperNotFound
224 }
225
226- cmd := exec.Command(privHelper, "internal-unpack", d.Path, instDir, globalRootDir)
227+ cmd := exec.Command(privHelper, "internal-unpack", d.Name(), instDir, globalRootDir)
228 cmd.Stdout = os.Stdout
229 cmd.Stderr = os.Stderr
230 if err := cmd.Run(); err != nil {
231 return &ErrUnpackFailed{
232- snapFile: d.Path,
233+ snapFile: d.Name(),
234 instDir: instDir,
235 origErr: err,
236 }
237@@ -662,7 +662,11 @@
238 //return SnapAuditError
239 }
240
241- d := &clickdeb.ClickDeb{Path: snapFile}
242+ d, err := clickdeb.Open(snapFile)
243+ if err != nil {
244+ return "", err
245+ }
246+ defer d.Close()
247 manifestData, err := d.ControlMember("manifest")
248 if err != nil {
249 log.Printf("Snap inspect failed: %s", snapFile)
250
251=== modified file 'snappy/click_test.go'
252--- snappy/click_test.go 2015-04-08 18:53:49 +0000
253+++ snappy/click_test.go 2015-04-13 21:00:55 +0000
254@@ -882,7 +882,9 @@
255 c.Assert(writeDebianControl(tmpdir, m), IsNil)
256 c.Assert(writeClickManifest(tmpdir, m), IsNil)
257 snapName := fmt.Sprintf("%s_%s_all.snap", m.Name, m.Version)
258- d := &clickdeb.ClickDeb{Path: snapName}
259+ d, err := clickdeb.Create(snapName)
260+ c.Assert(err, IsNil)
261+ defer d.Close()
262 c.Assert(d.Build(tmpdir, func(dataTar string) error {
263 return writeHashes(tmpdir, dataTar)
264 }), IsNil)

Subscribers

People subscribed via source and target branches