From 475f37ea037b06faafdb2f76a8511746c358f27c Mon Sep 17 00:00:00 2001 From: Jules Villard Date: Wed, 14 Dec 2016 11:34:07 -0800 Subject: [PATCH] [java] do not leak file descriptors when redirecting stderr to /dev/null Summary: Turns out I forgot to close the fd returned by dup(2) so we were leaking a lot. Reviewed By: jeremydubreil Differential Revision: D4327389 fbshipit-source-id: 74574ac --- infer/src/base/Utils.ml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/infer/src/base/Utils.ml b/infer/src/base/Utils.ml index 3f8671a40..6a81a976b 100644 --- a/infer/src/base/Utils.ml +++ b/infer/src/base/Utils.ml @@ -330,12 +330,15 @@ let realpath path = | Error (code, f, arg) -> raise (Unix.Unix_error (code, f, arg)) +(* never closed *) +let devnull = lazy (Unix.openfile "/dev/null" ~mode:[Unix.O_WRONLY]) + let suppress_stderr2 f2 x1 x2 = + let restore_stderr src = + Unix.dup2 ~src ~dst:Unix.stderr; + Unix.close src in let orig_stderr = Unix.dup Unix.stderr in - let silent_stderr = Unix.openfile "/dev/null" ~mode:[Unix.O_RDWR] in - let restore_stderr () = - Unix.dup2 ~src:orig_stderr ~dst:Unix.stderr; - Unix.close silent_stderr in - Unix.dup2 ~src:silent_stderr ~dst:Unix.stderr; + Unix.dup2 ~src:(Lazy.force devnull) ~dst:Unix.stderr; let f () = f2 x1 x2 in - protect ~f ~finally:restore_stderr + let finally () = restore_stderr orig_stderr in + protect ~f ~finally