Skip to content

Commit 7fabd68

Browse files
committed
openpgp/*: properly invoke .Close on errors
Fixes resource leak bugs identified by Orijtech Cyber's internal team and tooling. Reported in golang/go#53526
1 parent 50d29ed commit 7fabd68

File tree

4 files changed

+26
-9
lines changed

4 files changed

+26
-9
lines changed

openpgp/clearsign/clearsign.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,9 @@ func (d *dashEscaper) Write(data []byte) (n int, err error) {
265265
return
266266
}
267267

268-
func (d *dashEscaper) Close() (err error) {
268+
func (d *dashEscaper) Close() (rerr error) {
269269
if !d.atBeginningOfLine {
270-
if err = d.buffered.WriteByte(lf); err != nil {
270+
if err := d.buffered.WriteByte(lf); err != nil {
271271
return
272272
}
273273
}
@@ -276,6 +276,11 @@ func (d *dashEscaper) Close() (err error) {
276276
if err != nil {
277277
return
278278
}
279+
defer func() {
280+
if rerr != nil {
281+
out.Close()
282+
}
283+
}()
279284

280285
t := d.config.Now()
281286
for i, k := range d.privateKeys {
@@ -297,10 +302,7 @@ func (d *dashEscaper) Close() (err error) {
297302
if err = out.Close(); err != nil {
298303
return
299304
}
300-
if err = d.buffered.Flush(); err != nil {
301-
return
302-
}
303-
return
305+
return d.buffered.Flush()
304306
}
305307

306308
// Encode returns a WriteCloser which will clear-sign a message with privateKey

openpgp/packet/compressed.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,16 @@ func (cwc compressedWriteCloser) Close() (err error) {
8787
// can be written and which MUST be closed on completion. If cc is
8888
// nil, sensible defaults will be used to configure the compression
8989
// algorithm.
90-
func SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, err error) {
90+
func SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, rerr error) {
9191
compressed, err := serializeStreamHeader(w, packetTypeCompressed)
9292
if err != nil {
9393
return
9494
}
95+
defer func() {
96+
if rerr != nil {
97+
compressed.Close()
98+
}
99+
}()
95100

96101
_, err = compressed.Write([]byte{uint8(algo)})
97102
if err != nil {

openpgp/packet/literal.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (l *LiteralData) parse(r io.Reader) (err error) {
5454
// SerializeLiteral serializes a literal data packet to w and returns a
5555
// WriteCloser to which the data itself can be written and which MUST be closed
5656
// on completion. The fileName is truncated to 255 bytes.
57-
func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) {
57+
func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, rerr error) {
5858
var buf [4]byte
5959
buf[0] = 't'
6060
if isBinary {
@@ -69,6 +69,11 @@ func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uin
6969
if err != nil {
7070
return
7171
}
72+
defer func() {
73+
if rerr != nil {
74+
inner.Close()
75+
}
76+
}()
7277

7378
_, err = inner.Write(buf[:2])
7479
if err != nil {

openpgp/packet/symmetrically_encrypted.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ func (c noOpCloser) Close() error {
253253
// to w and returns a WriteCloser to which the to-be-encrypted packets can be
254254
// written.
255255
// If config is nil, sensible defaults will be used.
256-
func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte, config *Config) (contents io.WriteCloser, err error) {
256+
func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte, config *Config) (contents io.WriteCloser, rerr error) {
257257
if c.KeySize() != len(key) {
258258
return nil, errors.InvalidArgumentError("SymmetricallyEncrypted.Serialize: bad key length")
259259
}
@@ -262,6 +262,11 @@ func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte,
262262
if err != nil {
263263
return
264264
}
265+
defer func() {
266+
if rerr != nil {
267+
ciphertext.Close()
268+
}
269+
}()
265270

266271
_, err = ciphertext.Write([]byte{symmetricallyEncryptedVersion})
267272
if err != nil {

0 commit comments

Comments
 (0)