From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from coleridge.vehk.de (coleridge.vehk.de [89.238.76.34]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id 232877e0 for ; Fri, 23 Feb 2018 14:28:13 -0500 (EST) Received: from tithonus.olympus (HSI-KBW-078-042-174-048.hsi3.kabel-badenwuerttemberg.de [78.42.174.48]) by coleridge.vehk.de (Postfix) with ESMTPSA id 6740FCE055E for ; Fri, 23 Feb 2018 19:28:10 +0000 (UTC) Date: Fri, 23 Feb 2018 19:28:10 +0000 From: Wolfgang =?utf-8?Q?M=C3=BCller?= To: tech@mandoc.bsd.lv Subject: read.c does not close gzipped files; leaks memory Message-ID: <20180223192810.GA11077@tithonus.olympus> X-Mailinglist: mandoc-tech Reply-To: tech@mandoc.bsd.lv MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="i9LlY+UWpKt15+FH" Content-Disposition: inline User-Agent: Mutt/1.9.3 (2018-01-21) --i9LlY+UWpKt15+FH Content-Type: multipart/mixed; boundary="sdtB3X0nJg68CQEu" Content-Disposition: inline --sdtB3X0nJg68CQEu Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, I'm using mandoc on a system with a significant quantity of gzipped manpages, and noticed its memory usage being unusually high. After investigating, I found that in read_whole_file, mandoc opens the gzipped file, but then never closes it before returning from the function. Find attached a patch which solves this issue. --=20 Wolfgang M=C3=BCller --sdtB3X0nJg68CQEu Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="mandoc-gzleak.patch" Content-Transfer-Encoding: quoted-printable --- read.c.orig 2018-02-18 07:27:07.124135724 +0000 +++ read.c 2018-02-18 07:34:02.832965838 +0000 @@ -556,6 +556,7 @@ gzFile gz; size_t off; ssize_t ssz; + int end; =20 if (fstat(fd, &st) =3D=3D -1) { mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, @@ -598,6 +599,7 @@ =20 *with_mmap =3D 0; off =3D 0; + end =3D 0; fb->sz =3D 0; fb->buf =3D NULL; for (;;) { @@ -614,7 +616,8 @@ read(fd, fb->buf + (int)off, fb->sz - off); if (ssz =3D=3D 0) { fb->sz =3D off; - return 1; + end =3D 1; + break; } if (ssz =3D=3D -1) { mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, @@ -624,6 +627,12 @@ off +=3D (size_t)ssz; } =20 + if (curp->gzip) + gzclose(gz); + + if (end) + return 1; + free(fb->buf); fb->buf =3D NULL; return 0; --sdtB3X0nJg68CQEu-- --i9LlY+UWpKt15+FH Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEgckA6PNTN7mdGJC29rDeSDhr3aIFAlqQayUACgkQ9rDeSDhr 3aLcog//TdRYfIn1m+YQk31d4mU11q6GUeC4ekBfOqJLOX96twnGHhVbgfyCBdqR fVmyWtenrxL6RyiQLcySc51+/XBnVjlSWkQ5v8uTvhmoUO2ZTHk69Q8Jqt2TDreB 3lUtfkjHg6VVa1+tcXEAIxl3DCk+EhqbXSOIms8ZHymWeNH37FW+W/hpT1rC3LY+ TKPPZTiSi5qSLANeWkCnSPhSCS4K6ZVY7Z4FDhw6qZeoBnsDCmq4sgJ+uLwj3ntS kuBozyDq+EA9jW4Za4aJ16/ejm2qrgtNc8e+GXPiWx/4nHw0dMaXybXkv3pKZFbw sc6S2uv7tvuWp73S3cRRb71AM/NNkgDI54Zu7XWIhTEVkJo/O2YheEEWAwuK4sw3 WGhjVR8vM9eIgQ3WBVaiWi3gzN9S9wuiPJ9yfzGrrGldG9W1IJSMKmyUzmVMF0Y7 4MiNHlbLbfHPkEJKUs6GN7xpiFK3MnKmbHvs9HVB15EouPVEIUqchXvWBovy7+LB n7rzy3zvepH+4FCsiFkjHRyhnqJoZCMFpMvVXOnlKgW7eY4YUIYZzrEH0KneCKWF daTmzAMxMqj9VKIp8B1cAG6IqDSQDngh7RC0Gcwf4/uU4Obmkldp6q73sB8it4Yh Af59mZDlt12W5iKT3+BaawYN9nqefAZzXzzfnOrAFPeFmtbO0XI= =SCYk -----END PGP SIGNATURE----- --i9LlY+UWpKt15+FH-- -- To unsubscribe send an email to tech+unsubscribe@mandoc.bsd.lv