From 58a7cc48c11bece71ba96f2d10cabd4225ff0b9d Mon Sep 17 00:00:00 2001 From: Sam Blackshear Date: Wed, 19 Jul 2017 15:40:14 -0700 Subject: [PATCH] [java integration] use argfile when trying to store a lot of data in the environment Reviewed By: jeremydubreil Differential Revision: D5454536 fbshipit-source-id: 05a4e75 --- infer/src/base/CommandLineOption.ml | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/infer/src/base/CommandLineOption.ml b/infer/src/base/CommandLineOption.ml index c179fb902..b6ad255d5 100644 --- a/infer/src/base/CommandLineOption.ml +++ b/infer/src/base/CommandLineOption.ml @@ -826,14 +826,20 @@ let parse ?config_file ~usage action initial_command = let curr_usage = parse_args ~usage action ?initial_command cl_args in add_parsed_args_to_args_to_export () ; curr_usage in - (* we have to be careful not to add too much data to the environment because the size of the - environment contributes to the length of the command to be run. if the environment + CLI is too - big, running any command will fail with a cryptic "exit code 127" error. here, we hack around the - issue by refusing to add a string to the environment if it's sufficiently big (and praying that - this won't make the command fail). TODO (t20145863): use argfiles here *) - if List.is_empty !extra_env_args || String.length !args_to_export < 100000 then - Unix.putenv ~key:args_env_var ~data:!args_to_export ; - (!curr_command, curr_usage) + let to_export = + (* We have to be careful not to add too much data to the environment because the size of the + environment contributes to the length of the command to be run. If the environment + CLI is + too big, running any command will fail with a cryptic "exit code 127" error. Use an argfile + to prevent this from happening *) + let file = Filename.temp_file "args_" "" in + let quoted_file_args = + List.map (decode_env_to_argv !args_to_export) ~f:(fun arg -> + if String.contains arg '\'' then arg else F.sprintf "'%s'" arg ) + in + Out_channel.with_file file ~f:(fun oc -> Out_channel.output_lines oc quoted_file_args) ; + "@" ^ file + in + Unix.putenv ~key:args_env_var ~data:to_export ; (!curr_command, curr_usage) let wrap_line indent_string wrap_length line0 = let line = indent_string ^ line0 in