~ chicken-core (chicken-5) 561e047f11f2975fbbf4a90edf62cd2a40fad10b


commit 561e047f11f2975fbbf4a90edf62cd2a40fad10b
Author:     Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Fri Mar 1 20:41:49 2013 +0100
Commit:     Christian Kellermann <ckeen@pestilenz.org>
CommitDate: Sat Mar 2 15:00:37 2013 +0100

    Remove ##sys#get-argument and simplify get-environment-variable
    
    by using the FFI instead of hand-rolled C functions; deprecated these
    underlying C functions This should make the code easier to understand,
    more maintainable and reduce bloat. It is also a more structural
    approach of preventing security problems like those fixed by
    d9f2ad87b42f by using one vetted underlying system; the FFI conversion
    procedures.
    
    Signed-off-by: Christian Kellermann <ckeen@pestilenz.org>
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/NEWS b/NEWS
index a5f90541..03df87c5 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,9 @@
 - Runtime system
   - Special events in poll() are now handled, avoiding hangs in threaded apps.
 
+- C API
+  - Deprecated C_get_argument[_2] and C_get_environment_variable[_2] functions.
+
 4.8.1
 
 - Security fixes
diff --git a/chicken.h b/chicken.h
index 566aad3e..2b9030a8 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1782,14 +1782,14 @@ C_fctexport void C_ccall C_quotient(C_word c, C_word closure, C_word k, C_word n
 C_fctexport void C_ccall C_number_to_string(C_word c, C_word closure, C_word k, C_word num, ...) C_noret;
 C_fctexport void C_ccall C_fixnum_to_string(C_word c, C_word closure, C_word k, C_word num) C_noret;
 C_fctexport void C_ccall C_get_argv(C_word c, C_word closure, C_word k) C_noret; /* OBSOLETE */
-C_fctexport void C_ccall C_get_argument(C_word c, C_word closure, C_word k, C_word index) C_noret;
+C_fctexport void C_ccall C_get_argument(C_word c, C_word closure, C_word k, C_word index) C_noret; /* OBSOLETE */
 C_fctexport void C_ccall C_make_structure(C_word c, C_word closure, C_word k, C_word type, ...) C_noret;
 C_fctexport void C_ccall C_make_symbol(C_word c, C_word closure, C_word k, C_word name) C_noret;
 C_fctexport void C_ccall C_make_pointer(C_word c, C_word closure, C_word k) C_noret;
 C_fctexport void C_ccall C_make_tagged_pointer(C_word c, C_word closure, C_word k, C_word tag) C_noret;
 C_fctexport void C_ccall C_ensure_heap_reserve(C_word c, C_word closure, C_word k, C_word n) C_noret;
 C_fctexport void C_ccall C_return_to_host(C_word c, C_word closure, C_word k) C_noret;
-C_fctexport void C_ccall C_get_environment_variable(C_word c, C_word closure, C_word k, C_word name) C_noret;
+C_fctexport void C_ccall C_get_environment_variable(C_word c, C_word closure, C_word k, C_word name) C_noret; /* OBSOLETE */
 C_fctexport void C_ccall C_get_symbol_table_info(C_word c, C_word closure, C_word k) C_noret;
 C_fctexport void C_ccall C_get_memory_info(C_word c, C_word closure, C_word k) C_noret;
 C_fctexport void C_ccall C_context_switch(C_word c, C_word closure, C_word k, C_word state) C_noret;
diff --git a/library.scm b/library.scm
index 31e1e0c3..f11a4ee9 100644
--- a/library.scm
+++ b/library.scm
@@ -202,7 +202,7 @@ EOF
 (define (current-milliseconds) (##core#inline_allocate ("C_a_i_current_milliseconds" 4) #f))
 (define (current-gc-milliseconds) (##sys#fudge 31))
 (define ##sys#decode-seconds (##core#primitive "C_decode_seconds"))
-(define get-environment-variable (##core#primitive "C_get_environment_variable"))
+(define get-environment-variable (foreign-lambda c-string "C_getenv" c-string))
 
 (define (##sys#start-timer)
   (##sys#gc #t)
@@ -4594,23 +4594,23 @@ EOF
 
 ;;; command-line handling
 
-(define ##sys#get-argument (##core#primitive "C_get_argument"))
 
 (define argv				; includes program name
-  (let ((cache #f))
+  (let ((cache #f)
+        (fetch-arg (foreign-lambda* c-string ((scheme-object i))
+                     "C_return(C_main_argv[C_unfix(i)]);")))
     (lambda ()
-      (or cache
-	  (let ((v (let loop ((i 0))
-		     (let ((arg (##sys#get-argument i)))
-		       (if arg
-			   (cons arg (loop (fx+ i 1)))
-			   '())))))
-	    (set! cache v)
-	    v)))))
+      (unless cache
+        (set! cache (do ((i (fx- main_argc 1) (fx- i 1))
+                         (v '() (cons (fetch-arg i) v)))
+                        ((fx< i 0) v))))
+      cache)))
 
 (define program-name
   (make-parameter
-   (or (##sys#get-argument 0) "<unknown>") ; may happen if embedded in C application
+   (if (null? (argv))
+       "<unknown>" ; may happen if embedded in C application
+       (car (argv)))
    (lambda (x)
      (##sys#check-string x 'program-name)
      x) ) )
diff --git a/runtime.c b/runtime.c
index a5e45fca..61b4abae 100644
--- a/runtime.c
+++ b/runtime.c
@@ -500,10 +500,10 @@ static C_ccall void call_cc_values_wrapper(C_word c, C_word closure, C_word k, .
 static void gc_2(void *dummy) C_noret;
 static void allocate_vector_2(void *dummy) C_noret;
 static void get_argv_2(void *dummy) C_noret; /* OBSOLETE */
-static void get_argument_2(void *dummy) C_noret;
+static void get_argument_2(void *dummy) C_noret; /* OBSOLETE */
 static void make_structure_2(void *dummy) C_noret;
 static void generic_trampoline(void *dummy) C_noret;
-static void get_environment_variable_2(void *dummy) C_noret;
+static void get_environment_variable_2(void *dummy) C_noret; /* OBSOLETE */
 static void handle_interrupt(void *trampoline, void *proc) C_noret;
 static void callback_trampoline(void *dummy) C_noret;
 static C_ccall void callback_return_continuation(C_word c, C_word self, C_word r) C_noret;
@@ -790,7 +790,7 @@ static C_PTABLE_ENTRY *create_initial_ptable()
   C_pte(C_get_symbol_table_info);
   C_pte(C_get_memory_info);
   C_pte(C_decode_seconds);
-  C_pte(C_get_environment_variable);
+  C_pte(C_get_environment_variable); /* OBSOLETE */
   C_pte(C_stop_timer);
   C_pte(C_dload);
   C_pte(C_set_dlopen_flags);
@@ -833,7 +833,7 @@ static C_PTABLE_ENTRY *create_initial_ptable()
   C_pte(C_copy_closure);
   C_pte(C_dump_heap_state);
   C_pte(C_filter_heap_objects);
-  C_pte(C_get_argument);
+  C_pte(C_get_argument); /* OBSOLETE */
 
   /* IMPORTANT: did you remember the hardcoded pte table size? */
   pt[ i ].id = NULL;
@@ -7822,6 +7822,7 @@ void get_argv_2(void *dummy)
 }
 
 
+/* OBSOLETE */
 void C_ccall C_get_argument(C_word c, C_word closure, C_word k, C_word index)
 {
   int i = C_unfix(index);
@@ -7841,6 +7842,7 @@ void C_ccall C_get_argument(C_word c, C_word closure, C_word k, C_word index)
 }
 
 
+/* OBSOLETE */
 void get_argument_2(void *dummy)
 {
   int i = C_unfix(C_restore);
@@ -7955,10 +7957,11 @@ void C_ccall C_return_to_host(C_word c, C_word closure, C_word k)
 }
 
 
-#define C_do_getenv(v) C_getenv(v)
-#define C_free_envbuf() {}
+#define C_do_getenv(v) C_getenv(v) /* OBSOLETE */
+#define C_free_envbuf() {} /* OBSOLETE */
 
 
+/* OBSOLETE */
 void C_ccall C_get_environment_variable(C_word c, C_word closure, C_word k, C_word name)
 {
   int len;
@@ -7989,6 +7992,7 @@ void C_ccall C_get_environment_variable(C_word c, C_word closure, C_word k, C_wo
 }
 
 
+/* OBSOLETE */
 void get_environment_variable_2(void *dummy)
 {
   int len = C_strlen(save_string);
Trap