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
}
f, err := os.Open(path)
b, err := mergeRecords(path, recs)
if err != nil {
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)
_, err = content.ReadFrom(f)
if err != nil {
return err
if _, err := content.ReadFrom(f); err != nil {
return nil, err
}
for _, r := range recs {
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

View File

@ -275,7 +275,15 @@ func (sb *sandbox) updateDNS(ipv6Enabled bool) error {
if err != nil {
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 os.Rename(tmpHashFile.Name(), hashFile)

View File

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