Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: e027904582fc
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: af45a71630e8
Choose a head ref
  • 11 commits
  • 81 files changed
  • 1 contributor

Commits on Apr 1, 2016

  1. Copy the full SHA
    38705be View commit details
  2. Copy the full SHA
    caa01fb View commit details

Commits on Apr 2, 2016

  1. Copy the full SHA
    327db2c View commit details
  2. Copy the full SHA
    f468e8f View commit details
  3. Copy the full SHA
    503f01d View commit details
  4. Copy the full SHA
    fce5a08 View commit details
  5. Copy the full SHA
    9f38060 View commit details
  6. Copy the full SHA
    3dbfb59 View commit details
  7. Copy the full SHA
    1800e54 View commit details
  8. Copy the full SHA
    c77715d View commit details
  9. Copy the full SHA
    af45a71 View commit details
Showing with 1,070 additions and 872 deletions.
  1. +6 −1 core/src/main/java/org/jruby/util/cli/Options.java
  2. +45 −0 test/truffle/integration/safe.sh
  3. +4 −0 truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
  4. +5 −0 truffle/src/main/java/org/jruby/truffle/core/CoreMethod.java
  5. +46 −9 truffle/src/main/java/org/jruby/truffle/core/CoreMethodNodeManager.java
  6. +2 −2 truffle/src/main/java/org/jruby/truffle/core/MainNodes.java
  7. +26 −26 truffle/src/main/java/org/jruby/truffle/core/MathNodes.java
  8. +3 −3 truffle/src/main/java/org/jruby/truffle/core/ProcessNodes.java
  9. +29 −0 truffle/src/main/java/org/jruby/truffle/core/UnsafeNode.java
  10. +38 −38 truffle/src/main/java/org/jruby/truffle/core/array/ArrayNodes.java
  11. +10 −10 truffle/src/main/java/org/jruby/truffle/core/basicobject/BasicObjectNodes.java
  12. +6 −6 truffle/src/main/java/org/jruby/truffle/core/binding/BindingNodes.java
  13. +2 −2 truffle/src/main/java/org/jruby/truffle/core/bool/FalseClassNodes.java
  14. +3 −3 truffle/src/main/java/org/jruby/truffle/core/bool/TrueClassNodes.java
  15. +3 −3 truffle/src/main/java/org/jruby/truffle/core/encoding/EncodingConverterNodes.java
  16. +10 −10 truffle/src/main/java/org/jruby/truffle/core/encoding/EncodingNodes.java
  17. +5 −5 truffle/src/main/java/org/jruby/truffle/core/exception/ExceptionNodes.java
  18. +6 −6 truffle/src/main/java/org/jruby/truffle/core/fiber/FiberNodes.java
  19. +20 −20 truffle/src/main/java/org/jruby/truffle/core/hash/HashNodes.java
  20. +55 −54 truffle/src/main/java/org/jruby/truffle/core/kernel/KernelNodes.java
  21. +5 −5 truffle/src/main/java/org/jruby/truffle/core/klass/ClassNodes.java
  22. +11 −11 truffle/src/main/java/org/jruby/truffle/core/method/MethodNodes.java
  23. +9 −9 truffle/src/main/java/org/jruby/truffle/core/method/UnboundMethodNodes.java
  24. +60 −60 truffle/src/main/java/org/jruby/truffle/core/module/ModuleNodes.java
  25. +7 −7 truffle/src/main/java/org/jruby/truffle/core/mutex/MutexNodes.java
  26. +28 −28 truffle/src/main/java/org/jruby/truffle/core/numeric/BignumNodes.java
  27. +27 −27 truffle/src/main/java/org/jruby/truffle/core/numeric/FixnumNodes.java
  28. +24 −24 truffle/src/main/java/org/jruby/truffle/core/numeric/FloatNodes.java
  29. +4 −4 truffle/src/main/java/org/jruby/truffle/core/numeric/IntegerNodes.java
  30. +4 −4 truffle/src/main/java/org/jruby/truffle/core/objectspace/ObjectSpaceNodes.java
  31. +9 −9 truffle/src/main/java/org/jruby/truffle/core/proc/ProcNodes.java
  32. +9 −9 truffle/src/main/java/org/jruby/truffle/core/queue/QueueNodes.java
  33. +10 −10 truffle/src/main/java/org/jruby/truffle/core/queue/SizedQueueNodes.java
  34. +10 −10 truffle/src/main/java/org/jruby/truffle/core/range/RangeNodes.java
  35. +12 −12 truffle/src/main/java/org/jruby/truffle/core/regexp/MatchDataNodes.java
  36. +8 −8 truffle/src/main/java/org/jruby/truffle/core/regexp/RegexpNodes.java
  37. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/ArrayPrimitiveNodes.java
  38. +5 −5 truffle/src/main/java/org/jruby/truffle/core/rubinius/AtomicReferenceNodes.java
  39. +2 −2 truffle/src/main/java/org/jruby/truffle/core/rubinius/BignumPrimitiveNodes.java
  40. +6 −6 truffle/src/main/java/org/jruby/truffle/core/rubinius/ByteArrayNodes.java
  41. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/ChannelPrimitiveNodes.java
  42. +5 −5 truffle/src/main/java/org/jruby/truffle/core/rubinius/DirPrimitiveNodes.java
  43. +5 −5 truffle/src/main/java/org/jruby/truffle/core/rubinius/EncodingConverterPrimitiveNodes.java
  44. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/EncodingPrimitiveNodes.java
  45. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/ExceptionPrimitiveNodes.java
  46. +2 −2 truffle/src/main/java/org/jruby/truffle/core/rubinius/FixnumPrimitiveNodes.java
  47. +3 −3 truffle/src/main/java/org/jruby/truffle/core/rubinius/FloatPrimitiveNodes.java
  48. +3 −3 truffle/src/main/java/org/jruby/truffle/core/rubinius/IOBufferPrimitiveNodes.java
  49. +16 −16 truffle/src/main/java/org/jruby/truffle/core/rubinius/IOPrimitiveNodes.java
  50. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/NativeFunctionPrimitiveNodes.java
  51. +2 −2 truffle/src/main/java/org/jruby/truffle/core/rubinius/ObjectPrimitiveNodes.java
  52. +15 −15 truffle/src/main/java/org/jruby/truffle/core/rubinius/PointerPrimitiveNodes.java
  53. +64 −64 truffle/src/main/java/org/jruby/truffle/core/rubinius/PosixNodes.java
  54. +5 −5 truffle/src/main/java/org/jruby/truffle/core/rubinius/RandomizerPrimitiveNodes.java
  55. +7 −7 truffle/src/main/java/org/jruby/truffle/core/rubinius/RegexpPrimitiveNodes.java
  56. +6 −0 truffle/src/main/java/org/jruby/truffle/core/rubinius/RubiniusPrimitive.java
  57. +10 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/RubiniusPrimitiveNodeConstructor.java
  58. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/RubiniusTypeNodes.java
  59. +16 −16 truffle/src/main/java/org/jruby/truffle/core/rubinius/StatPrimitiveNodes.java
  60. +27 −27 truffle/src/main/java/org/jruby/truffle/core/rubinius/StringPrimitiveNodes.java
  61. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/SymbolPrimitiveNodes.java
  62. +3 −3 truffle/src/main/java/org/jruby/truffle/core/rubinius/ThreadPrimitiveNodes.java
  63. +10 −10 truffle/src/main/java/org/jruby/truffle/core/rubinius/TimePrimitiveNodes.java
  64. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/UndefinedPrimitiveNodes.java
  65. +23 −23 truffle/src/main/java/org/jruby/truffle/core/rubinius/VMPrimitiveNodes.java
  66. +3 −3 truffle/src/main/java/org/jruby/truffle/core/rubinius/WeakRefPrimitiveNodes.java
  67. +53 −53 truffle/src/main/java/org/jruby/truffle/core/string/StringNodes.java
  68. +7 −7 truffle/src/main/java/org/jruby/truffle/core/symbol/SymbolNodes.java
  69. +3 −3 truffle/src/main/java/org/jruby/truffle/core/thread/ThreadBacktraceLocationNodes.java
  70. +17 −17 truffle/src/main/java/org/jruby/truffle/core/thread/ThreadNodes.java
  71. +6 −6 truffle/src/main/java/org/jruby/truffle/core/time/TimeNodes.java
  72. +69 −39 truffle/src/main/java/org/jruby/truffle/extra/TrufflePrimitiveNodes.java
  73. +15 −15 truffle/src/main/java/org/jruby/truffle/interop/TruffleInteropNodes.java
  74. +12 −1 truffle/src/main/java/org/jruby/truffle/language/Options.java
  75. +16 −0 truffle/src/main/java/org/jruby/truffle/platform/UnsafeGroup.java
  76. +29 −29 truffle/src/main/java/org/jruby/truffle/stdlib/BigDecimalNodes.java
  77. +10 −10 truffle/src/main/java/org/jruby/truffle/stdlib/DigestNodes.java
  78. +1 −1 truffle/src/main/java/org/jruby/truffle/stdlib/EtcNodes.java
  79. +5 −5 truffle/src/main/java/org/jruby/truffle/stdlib/ObjSpaceNodes.java
  80. +18 −18 truffle/src/main/java/org/jruby/truffle/stdlib/psych/PsychEmitterNodes.java
  81. +2 −2 truffle/src/main/java/org/jruby/truffle/stdlib/psych/PsychParserNodes.java
7 changes: 6 additions & 1 deletion core/src/main/java/org/jruby/util/cli/Options.java
Original file line number Diff line number Diff line change
@@ -222,11 +222,16 @@ public class Options {
public static final Option<Boolean> CLI_STRIP_HEADER = bool(CLI, "cli.strip.header", false, "Strip text before shebang in script. Same as -x.");
public static final Option<Boolean> CLI_LOAD_GEMFILE = bool(CLI, "cli.load.gemfile", false, "Load a bundler Gemfile in cwd before running. Same as -G.");

public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE = bool(TRUFFLE, "truffle.platform.safe", false, "Disallow any unsafe access to the platform, such as IO, processes and so on.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_PROCESSES = bool(TRUFFLE, "truffle.platform.safe.processes", false, "Treat any methods that deal with processes as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_EXIT = bool(TRUFFLE, "truffle.platform.safe.exit", false, "Treat exiting the VM as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_PUTS = bool(TRUFFLE, "truffle.platform.safe_puts", true, "Treat Truffle::Primitive.safe_puts as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_USE_JAVA = bool(TRUFFLE, "truffle.platform.use_java", false, "Use a pure-Java platform, so no native POSIX.");

public static final Option<Boolean> TRUFFLE_COVERAGE = bool(TRUFFLE, "truffle.coverage", false, "Enable coverage (will be enabled by default in the future - currently has some bugs).");
public static final Option<Boolean> TRUFFLE_COVERAGE_GLOBAL = bool(TRUFFLE, "truffle.coverage.global", false, "Run coverage for all code and print results on exit.");

public static final Option<String> TRUFFLE_CORE_LOAD_PATH = string(TRUFFLE, "truffle.core.load_path", "truffle:/jruby-truffle", "Location to load the Truffle core library from.");
public static final Option<Boolean> TRUFFLE_PLATFORM_USE_JAVA = bool(TRUFFLE, "truffle.platform.use_java", false, "Use a pure-Java platform, so no native POSIX.");

public static final Option<Integer> TRUFFLE_ARRAY_UNINITIALIZED_SIZE = integer(TRUFFLE, "truffle.array.uninitialized_size", 32, "How large an Array to allocate when we have no other information to go on.");
public static final Option<Integer> TRUFFLE_ARRAY_SMALL = integer(TRUFFLE, "truffle.array.small", 3, "Maximum size of an Array to consider small for optimisations.");
45 changes: 45 additions & 0 deletions test/truffle/integration/safe.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env bash

function run {
ruby -X+T -Xtruffle.platform.safe=true "$@"
}

function safe {
run "$@" || ( echo "$@" was not safe ; exit 1 )
}

function unsafe {
run "$@" && ( echo "$@" was not unsafe ; exit 1 )
}

# Things that are alway safe

safe -e "14"

# Check our safe_puts is safe

safe -e "Truffle::Primitive.safe_puts 'hello, world'"

# But we can make that unsafe as well if really don't want any output

unsafe -Xtruffle.platform.safe_puts=false -e "Truffle::Primitive.safe_puts 'hello, world'"

# Check default unsafe operations

#unsafe -e "puts 'hello, world'"
unsafe -e '`echo foo`'
unsafe -e 'exit'
unsafe -e 'exit!'

# Check we can enable some unsafe operations if we want to

safe -Xtruffle.platform.safe.processes=true -e '`echo foo`'
safe -Xtruffle.platform.safe.exit=true -e 'exit'

# Check that safe_puts sanitises correctly

if [[ `run -e "Truffle::Primitive.safe_puts 'foo © bar'"` != 'foo ? bar' ]]
then
echo safe_puts is not sanitising output
exit 1
fi
4 changes: 4 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
Original file line number Diff line number Diff line change
@@ -1372,6 +1372,10 @@ public DynamicObject rangeError(String message, Node currentNode) {
return ExceptionNodes.createRubyException(rangeErrorClass, StringOperations.createString(context, StringOperations.encodeRope(message, UTF8Encoding.INSTANCE)), context.getCallStack().getBacktrace(currentNode));
}

public DynamicObject internalErrorUnsafe(Node currentNode) {
return internalError("unsafe operation", currentNode, null);
}

public DynamicObject internalError(String message, Node currentNode) {
return internalError(message, currentNode, null);
}
5 changes: 5 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/core/CoreMethod.java
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@

import org.jruby.runtime.Visibility;
import org.jruby.truffle.language.methods.UnsupportedOperationBehavior;
import org.jruby.truffle.platform.UnsafeGroup;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -81,4 +82,8 @@

boolean returnsEnumeratorIfNoBlock() default false;

UnsafeGroup[] unsafe() default {};

boolean unsafeNeedsAudit() default false;

}
Original file line number Diff line number Diff line change
@@ -24,6 +24,7 @@
import org.jruby.truffle.core.numeric.FixnumLowerNodeGen;
import org.jruby.truffle.language.LexicalScope;
import org.jruby.truffle.language.NotProvided;
import org.jruby.truffle.language.Options;
import org.jruby.truffle.language.RubyConstant;
import org.jruby.truffle.language.RubyGuards;
import org.jruby.truffle.language.RubyNode;
@@ -40,6 +41,7 @@
import org.jruby.truffle.language.objects.SelfNode;
import org.jruby.truffle.language.objects.SingletonClassNode;
import org.jruby.truffle.language.parser.jruby.Translator;
import org.jruby.truffle.platform.UnsafeGroup;

import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -231,24 +233,59 @@ private static RubyRootNode makeGenericMethod(RubyContext context, MethodDetails
}

final RubyNode checkArity = Translator.createCheckArityNode(context, sourceSection, arity);
RubyNode sequence = Translator.sequence(context, sourceSection, Arrays.asList(checkArity, methodNode));

if (method.returnsEnumeratorIfNoBlock()) {
// TODO BF 3-18-2015 Handle multiple method names correctly
sequence = new ReturnEnumeratorIfNoBlockNode(method.names()[0], sequence);
}
RubyNode sequence;

if (context.getOptions().PLATFORM_SAFE && !isSafe(context, method.unsafe())) {
sequence = new UnsafeNode(context, sourceSection);
} else {
sequence = Translator.sequence(context, sourceSection, Arrays.asList(checkArity, methodNode));

if (method.taintFromSelf() || method.taintFromParameter() != -1) {
sequence = new TaintResultNode(method.taintFromSelf(),
method.taintFromParameter(),
sequence);
if (method.returnsEnumeratorIfNoBlock()) {
// TODO BF 3-18-2015 Handle multiple method names correctly
sequence = new ReturnEnumeratorIfNoBlockNode(method.names()[0], sequence);
}

if (method.taintFromSelf() || method.taintFromParameter() != -1) {
sequence = new TaintResultNode(method.taintFromSelf(),
method.taintFromParameter(),
sequence);
}
}

final ExceptionTranslatingNode exceptionTranslatingNode = new ExceptionTranslatingNode(context, sourceSection, sequence, method.unsupportedOperationBehavior());

return new RubyRootNode(context, sourceSection, null, sharedMethodInfo, exceptionTranslatingNode, false);
}

public static boolean isSafe(RubyContext context, UnsafeGroup[] groups) {
final Options options = context.getOptions();

for (UnsafeGroup group : groups) {
final boolean option;

switch (group) {
case PROCESSES:
option = options.PLATFORM_SAFE_PROCESSES;
break;
case EXIT:
option = options.PLATFORM_SAFE_EXIT;
break;
case SAFE_PUTS:
option = options.PLATFORM_SAFE_PUTS;
break;
default:
throw new IllegalStateException();
}

if (!option) {
return false;
}
}

return true;
}

public void allMethodInstalled() {
if (System.getenv("TRUFFLE_CHECK_AMBIGUOUS_OPTIONAL_ARGS") != null &&
!AmbiguousOptionalArgumentChecker.SUCCESS) {
4 changes: 2 additions & 2 deletions truffle/src/main/java/org/jruby/truffle/core/MainNodes.java
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@
@CoreClass(name = "main")
public abstract class MainNodes {

@CoreMethod(names = "public", rest = true, needsSelf = false, visibility = Visibility.PRIVATE)
@CoreMethod(unsafeNeedsAudit = true, names = "public", rest = true, needsSelf = false, visibility = Visibility.PRIVATE)
public abstract static class PublicNode extends CoreMethodArrayArgumentsNode {

@Child private ModuleNodes.PublicNode publicNode;
@@ -39,7 +39,7 @@ public DynamicObject doPublic(VirtualFrame frame, Object[] args) {
}
}

@CoreMethod(names = "private", rest = true, needsSelf = false, visibility = Visibility.PRIVATE)
@CoreMethod(unsafeNeedsAudit = true, names = "private", rest = true, needsSelf = false, visibility = Visibility.PRIVATE)
public abstract static class PrivateNode extends CoreMethodArrayArgumentsNode {

@Child private ModuleNodes.PrivateNode privateNode;
Loading