From 1834241e5aab81a448dd8d5fcbe41c35ac77041b Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Tue, 18 May 2010 18:46:31 -0400 Subject: [PATCH] alien.libraries, stack-checker.alien: check user inputs more carefully to ensure that invalid ABI descriptors don't slip through and break random stuff (reported by prunedtree) --- basis/alien/libraries/libraries.factor | 5 +++-- basis/compiler/tests/alien.factor | 7 +++++++ basis/stack-checker/alien/alien.factor | 20 ++++++++++++-------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/basis/alien/libraries/libraries.factor b/basis/alien/libraries/libraries.factor index 86249436aa..a3f52df098 100755 --- a/basis/alien/libraries/libraries.factor +++ b/basis/alien/libraries/libraries.factor @@ -1,7 +1,8 @@ ! Copyright (C) 2009, 2010 Slava Pestov, Joe Groff. ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien alien.strings assocs io.backend -kernel namespaces destructors sequences system io.pathnames ; +kernel namespaces destructors sequences strings +system io.pathnames ; IN: alien.libraries : dlopen ( path -- dll ) native-string>alien (dlopen) ; @@ -12,7 +13,7 @@ SYMBOL: libraries libraries [ H{ } clone ] initialize -TUPLE: library path abi dll ; +TUPLE: library { path string } { abi abi initial: cdecl } dll ; ERROR: no-library name ; diff --git a/basis/compiler/tests/alien.factor b/basis/compiler/tests/alien.factor index b8c48abfc3..fc7e740de3 100755 --- a/basis/compiler/tests/alien.factor +++ b/basis/compiler/tests/alien.factor @@ -11,6 +11,13 @@ SPECIALIZED-ARRAY: float SPECIALIZED-ARRAY: char IN: compiler.tests.alien +! Make sure that invalid inputs don't pass the stack checker +[ [ void { } "cdecl" alien-indirect ] infer ] must-fail +[ [ "void" { } cdecl alien-indirect ] infer ] must-fail +[ [ void* 3 cdecl alien-indirect ] infer ] must-fail +[ [ void* { "int" } cdecl alien-indirect ] infer ] must-fail +[ [ void* { int } cdecl { } alien-callback ] infer ] must-fail + << : libfactor-ffi-tests-path ( -- string ) "resource:" absolute-path diff --git a/basis/stack-checker/alien/alien.factor b/basis/stack-checker/alien/alien.factor index 4147f8f29f..97b821225b 100644 --- a/basis/stack-checker/alien/alien.factor +++ b/basis/stack-checker/alien/alien.factor @@ -1,21 +1,25 @@ ! Copyright (C) 2008, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel sequences accessors combinators math namespaces -init sets words assocs alien.libraries alien alien.private -alien.c-types fry quotations stack-checker.backend -stack-checker.errors stack-checker.visitor +USING: kernel arrays sequences accessors combinators math +namespaces init sets words assocs alien.libraries alien +alien.private alien.c-types fry quotations strings +stack-checker.backend stack-checker.errors stack-checker.visitor stack-checker.dependencies compiler.utilities ; IN: stack-checker.alien -TUPLE: alien-node-params return parameters abi in-d out-d ; +TUPLE: alien-node-params +return parameters +{ abi abi initial: cdecl } +in-d +out-d ; -TUPLE: alien-invoke-params < alien-node-params library function ; +TUPLE: alien-invoke-params < alien-node-params library { function string } ; TUPLE: alien-indirect-params < alien-node-params ; -TUPLE: alien-assembly-params < alien-node-params quot ; +TUPLE: alien-assembly-params < alien-node-params { quot quotation } ; -TUPLE: alien-callback-params < alien-node-params quot xt ; +TUPLE: alien-callback-params < alien-node-params { quot quotation } xt ; : param-prep-quot ( params -- quot ) parameters>> [ c-type c-type-unboxer-quot ] map spread>quot ;