Commit Graph

43 Commits

Author SHA1 Message Date
aszlig
df475092e9
lib: Make escapeShellArg more robust
Quoting various characters that the shell *may* interpret specially is a
very fragile thing to do.

I've used something more robust all over the place in various Nix
expression I've written just because I didn't trust escapeShellArg.

Here is a proof of concept showing that I was indeed right in
distrusting escapeShellArg:

with import <nixpkgs> {};

let
  payload = runCommand "payload" {} ''
    # \x00 is not allowed for Nix strings, so let's begin at 1
    for i in $(seq 1 255); do
      echo -en "\\x$(printf %02x $i)"
    done > "$out"
  '';

  escapers = with lib; {
    current = escapeShellArg;
    better = arg: let
      backslashEscapes = stringToCharacters "\"\\ ';$`()|<>\r\t*[]&!~#";
      search = backslashEscapes ++ [ "\n" ];
      replace = map (c: "\\${c}") backslashEscapes ++ [ "'\n'" ];
    in replaceStrings search replace (toString arg);
    best = arg: "'${replaceStrings ["'"] ["'\\''"] (toString arg)}'";
  };

  testWith = escaper: let
    escaped = escaper (builtins.readFile payload);
  in runCommand "test" {} ''
    if ! r="$(bash -c ${escapers.best "echo -nE ${escaped}"} 2> /dev/null)"
    then
      echo bash eval error > "$out"
      exit 0
    fi
    if echo -n "$r" | cmp -s "${payload}"; then
      echo success > "$out"
    else
      echo failed > "$out"
    fi
  '';

in runCommand "results" {} ''
  echo "Test results:"
  ${lib.concatStrings (lib.mapAttrsToList (name: impl: ''
    echo "  ${name}: $(< "${testWith impl}")"
  '') escapers)}
  exit 1
''

The resulting output is the following:

Test results:
  best: success
  better: success
  current: bash eval error

I did the "better" implementation just to illustrate that the method of
quoting only "harmful" characters results in madness in terms of
implementation and performance.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra, @zimbatm
2016-06-20 23:53:36 +02:00
zimbatm
b0f8416c5c Merge pull request #16180 from zimbatm/shell-escaping
Escape all shell arguments uniformly
2016-06-19 23:27:52 +01:00
zimbatm
bec28d748c Remove unecessary branching on old nix versions
All these builtins are available since 1.10 or earlier (1.10 being the
lib/minver.nix)
2016-06-17 11:06:48 +01:00
zimbatm
28fa4a2f03 Escape all shell arguments uniformly 2016-06-12 18:11:37 +01:00
Nikolay Amiantov
cdff1f61f0 lib: revert my bogus comment fix
See 5445e521b6 (commitcomment-17531945)
2016-05-19 01:26:04 +03:00
Nikolay Amiantov
5445e521b6 firefox: restore gstreamer support for older firefox releases 2016-05-19 00:28:49 +03:00
Nikolay Amiantov
c779e30d53 make*Path: implement via makeSearchPathOutput 2016-04-25 13:24:39 +03:00
Nikolay Amiantov
ab0a0c004e makeSearchPathOutputs: refactor to makeSearchPathOutput 2016-04-25 13:24:39 +03:00
Nikolay Amiantov
9b9fea305f makeSearchPath (and derivatives): check outputUnspecified 2016-04-13 22:09:41 +03:00
Nikolay Amiantov
e26119619f makePerlPath: try to guess outputs 2016-04-13 22:05:45 +03:00
Nikolay Amiantov
2a3b3d6f8b makeSearchPathOutputs: init function 2016-04-13 22:05:45 +03:00
Nikolay Amiantov
5ef56700b9 makeBinPath: guess outputs 2016-04-13 22:05:45 +03:00
Vladimír Čunát
30f14243c3 Merge branch 'master' into closure-size
Comparison to master evaluations on Hydra:
  - 1255515 for nixos
  - 1255502 for nixpkgs
2016-04-10 11:17:52 +02:00
Eelco Dolstra
fd2273e419 Stronger warning against usage of splitString 2016-04-01 13:52:54 +02:00
Vladimír Čunát
ab15a62c68 Merge branch 'master' into closure-size
Beware that stdenv doesn't build. It seems something more will be needed
than just resolution of merge conflicts.
2016-04-01 10:06:01 +02:00
zimbatm
7883ca774b lib/strings: document all the functions 2016-03-10 12:31:06 +00:00
Vladimír Čunát
716aac2519 Merge branch 'staging' into closure-size 2016-01-19 09:55:31 +01:00
Peter Simons
7ca8e13918 lib.getVersion: extend the function to cope with strings as well as derivations 2016-01-05 20:09:39 +01:00
Vladimír Čunát
f9f6f41bff Merge branch 'master' into closure-size
TODO: there was more significant refactoring of qtbase and plasma 5.5
on master, and I'm deferring pointing to correct outputs to later.
2015-12-31 09:53:02 +01:00
Thomas Tuegel
8baebb55d4 lib/strings: add readPathsFromFile 2015-12-16 15:00:34 -06:00
Luca Bruno
5b0352a6a4 Merge branch 'master' into closure-size 2015-12-11 18:31:00 +01:00
Domen Kožar
66c90e6e1f add makeBinPath function for abstracting away pkg/bin:pkg2/bin.. 2015-12-10 12:47:32 +01:00
Luca Bruno
a412927924 Merge remote-tracking branch 'origin/master' into closure-size 2015-11-25 21:37:30 +01:00
Christian Zagrodnick
1cdacc6aa2 lib/strings: add a toInt helper (close #11242)
While the function itself is pretty easy, it's not straitforward to find a way to convert string to int with nix.
2015-11-25 08:50:02 +01:00
Vladimír Čunát
5227fb1dd5 Merge commit staging+systemd into closure-size
Many non-conflict problems weren't (fully) resolved in this commit yet.
2015-10-03 13:33:37 +02:00
Eelco Dolstra
214d4fb73c Allow options with type "package" to be store paths
For example, this allows writing

  nix.package = /nix/store/786mlvhd17xvcp2r4jmmay6jj4wj6b7f-nix-1.10pre4206_896428c;

Also, document types.package in the manual.
2015-08-07 03:09:57 +02:00
Eelco Dolstra
c399f94bb3 intersperse: Fix quadratic performance 2015-07-24 15:58:34 +02:00
Eelco Dolstra
2d9885db9e Remove eqStrings
It's no longer needed. Also clean up some comments.
2015-07-24 15:58:34 +02:00
Eelco Dolstra
9cfd128a42 Use replaceStrings primop 2015-07-24 15:58:34 +02:00
Eelco Dolstra
6f6f66ac98 Use concatStringSep primop 2015-07-24 15:58:34 +02:00
Eelco Dolstra
0ae8b365b3 Rename misc.nix -> deprecated.nix 2015-07-23 18:31:54 +02:00
Eelco Dolstra
637e35deb9 Use foldl' instead of fold in some places 2015-07-23 18:31:54 +02:00
Nicolas B. Pierron
be65ac7c32 Issue 8152 - Reduce number of attribute set created by replaceChars. 2015-07-13 23:46:38 +02:00
Vladimír Čunát
c2fff72836 systemPackages, makeLibraryPath: try to guess outputs 2015-05-05 11:56:31 +02:00
Nikita Mikhailov
63ae447a0f Add 'fixedWidthString' and 'fixedWidthNumber' formatting functions 2015-03-08 19:02:32 +01:00
Eelco Dolstra
6c2bf141cf lib: Use arithmetic operators rather than builtins.add etc. 2014-10-05 01:10:06 +02:00
Igor Pashev
0383b57b3c Added concatMapStringsSep and concatImapStringsSep
Example: configure rewrite rules for Mediawiki

    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
    ${concatMapStringsSep "\n" (u: "RewriteCond %{REQUEST_URI} !^${u.urlPath}") serverInfo.serverConfig.servedDirs}
    RewriteRule ${if config.enableUploads
2014-08-25 10:23:10 +02:00
Kirill Elagin
751a01063d lib: Do not take string context into account
Close #2883.
2014-06-11 20:22:58 +02:00
Vladimír Čunát
bf2bc0f0dc lib/strings: add hasPrefix and simplify hasSuffix
It was discussed as a part of #2570.
2014-05-13 11:05:37 +02:00
Vladimír Čunát
180bd65cd0 lib/strings: simplify removePrefix readability
It was discussed as a part of #2570.
2014-05-13 11:04:38 +02:00
Eelco Dolstra
ea36f3b868 fetchFromGitHub: Use .tar.gz instead of .zip
Also clean up the name attribute of fetchzip derivations a bit.
2014-05-09 15:53:44 +02:00
Eelco Dolstra
785eaf2cea Add some primops to lib 2013-11-12 13:48:30 +01:00
Eelco Dolstra
5fef92c4a0 Move pkgs/lib/ to lib/ 2013-10-10 13:28:21 +02:00