Fix file descriptor leaks

Ensures network connections and file are closed when done writing.

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
This commit is contained in:
Derek McGowan 2016-07-01 16:29:51 -07:00
parent 8b042357ca
commit 075cbfd9c6
3 changed files with 26 additions and 7 deletions

View File

@ -119,25 +119,34 @@ func Add(path string, recs []Record) error {
return nil return nil
} }
f, err := os.Open(path) b, err := mergeRecords(path, recs)
if err != nil { if err != nil {
return err return err
} }
return ioutil.WriteFile(path, b, 0644)
}
func mergeRecords(path string, recs []Record) ([]byte, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
content := bytes.NewBuffer(nil) content := bytes.NewBuffer(nil)
_, err = content.ReadFrom(f) if _, err := content.ReadFrom(f); err != nil {
if err != nil { return nil, err
return err
} }
for _, r := range recs { for _, r := range recs {
if _, err := r.WriteTo(content); err != nil { if _, err := r.WriteTo(content); err != nil {
return err return nil, err
} }
} }
return ioutil.WriteFile(path, content.Bytes(), 0644) return content.Bytes(), nil
} }
// Delete deletes an arbitrary number of Records already existing in /etc/hosts file // Delete deletes an arbitrary number of Records already existing in /etc/hosts file

View File

@ -275,7 +275,15 @@ func (sb *sandbox) updateDNS(ipv6Enabled bool) error {
if err != nil { if err != nil {
return err return err
} }
if err = ioutil.WriteFile(tmpHashFile.Name(), []byte(newRC.Hash), filePerm); err != nil { if err = tmpHashFile.Chmod(filePerm); err != nil {
tmpHashFile.Close()
return err
}
_, err = tmpHashFile.Write([]byte(newRC.Hash))
if err1 := tmpHashFile.Close(); err == nil {
err = err1
}
if err != nil {
return err return err
} }
return os.Rename(tmpHashFile.Name(), hashFile) return os.Rename(tmpHashFile.Name(), hashFile)

View File

@ -135,6 +135,8 @@ func (c *controller) acceptClientConnections(sock string, l net.Listener) {
continue continue
} }
go func() { go func() {
defer conn.Close()
err := c.processExternalKey(conn) err := c.processExternalKey(conn)
ret := success ret := success
if err != nil { if err != nil {