]> git.donarmstrong.com Git - lilypond.git/commitdiff
* Documentation/topdocs/NEWS.texi: Add note about safe mode.
authorjanneke <janneke>
Wed, 28 Jan 2004 18:16:51 +0000 (18:16 +0000)
committerjanneke <janneke>
Wed, 28 Jan 2004 18:16:51 +0000 (18:16 +0000)
* mf/GNUmakefile (FETA_LIST_FILES): Install feta*list.lys too.
This allows building the user manual using a binary installation
and a matching unpacked source tree.

* scm/lily.scm (safe-module): New variable.

* lily/includable-lexer.cc (new_input): Fix error messages.

* lily/parse-scm.cc (internal_ly_parse_scm): Add parameter SAFE.
If SAFE, evaluate in safe-module.  Change callers.

* lily/main.cc (Long_option_init): Reinstate safe-mode.

* lily/lexer.ll (embedded_scm): While processing main-input,
invoke ly_parse_scm with safe mode if running in safe-mode.
(<<EOF>>): Reset main_input_b_, fixes old-relative chech
in init.ly for safe-mode.

ChangeLog
Documentation/topdocs/NEWS.texi
lily/includable-lexer.cc
lily/include/parse-scm.hh
lily/lexer.ll
lily/ly-module.cc
lily/main.cc
lily/my-lily-lexer.cc
lily/parse-scm.cc
mf/GNUmakefile
scm/lily.scm

index cf797870eeb64ddb6b23eeb34136b40429b150c9..378ec3eef8584f1d1fe70e8206b5ba83f2126254 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2004-01-28  Jan Nieuwenhuizen  <janneke@gnu.org>
+
+       * Documentation/topdocs/NEWS.texi: Add note about safe mode.
+
+       * mf/GNUmakefile (FETA_LIST_FILES): Install feta*list.lys too.
+       This allows building the user manual using a binary installation
+       and a matching unpacked source tree.
+
+       * scm/lily.scm (safe-module): New variable. 
+
+       * lily/includable-lexer.cc (new_input): Fix error messages.
+
+       * lily/parse-scm.cc (internal_ly_parse_scm): Add parameter SAFE.
+       If SAFE, evaluate in safe-module.  Change callers.
+
+       * lily/main.cc (Long_option_init): Reinstate safe-mode.
+
+       * lily/lexer.ll (embedded_scm): While processing main-input,
+       invoke ly_parse_scm with safe mode if running in safe-mode.
+       (<<EOF>>): Reset main_input_b_, fixes old-relative chech
+       in init.ly for safe-mode.
+
 2004-01-28  Mats Bengtsson  <mabe@drongo.s3.kth.se>
 
        * scripts/lilypond.py (ly_paper_to_latexpaper): Regain
index 7df7feb2e2c8d7210d6f2fab0bbbcd9904d456cf..5c19902c476614da8030ffd5ebdafc3ca99e28ac 100644 (file)
@@ -18,8 +18,13 @@ Version 2.1.13
 
 @itemize @bullet
 
+@item Safe mode has been reinstated for lilypond-bin.  When lilypond-bin
+is invoked with @code{--safe-mode}, the user's Guile expressions are
+evaluated in a safe environment and file inclusion is not allowed.
+(This feature is still experimental.)
+
 @item There is now a Scheme macro for defining markup
-commands. Special mark-up commands can be defined in  user-files too.
+commands. Special mark-up commands can be defined in user-files too.
 
 @item Many fixes for dimension scaling have been made,
 resulting in correct results for scores that mix staves in different
index 929397042501302787e52ec5bb1a6edf410bda3d..fd2a2de4dc8c41b00cbe5a5d3d4aa6f6c00e4f6a 100644 (file)
@@ -47,7 +47,7 @@ Includable_lexer::new_input (String s, Sources  * global_sources)
 {
   if (!allow_includes_b_)
     {
-      LexerError ("include files are disallowed.");
+      LexerError (_ ("include files are not allowed").to_str0 ());
       return;
     }
   
index 896559ea022f16172a01e1fe2a1ac38f64a70f11..3d0158fab8c0aeb38757bb9ba3651925f35bf5ce 100644 (file)
@@ -15,8 +15,8 @@ struct Parse_start
 };
 
 SCM catch_protected_parse_body (void *);
-SCM protected_ly_parse_scm (Parse_start *);
+SCM protected_ly_parse_scm (Parse_start *, bool);
 
-SCM ly_parse_scm (char const* s, int *, Input);
+SCM ly_parse_scm (char const *, int *, Input, bool);
 
 #endif
index c2cb3077ca71401c2a27c611c065f2c858712c7f..1c859e27a475ded1eb2b49936d577c9166bce1ff 100644 (file)
@@ -206,6 +206,7 @@ HYPHEN              --
        }
        <<EOF>>         {
                LexerError (_ ("EOF found inside a comment").to_str0 ());
+               main_input_b_ = false;
                if (! close_input ()) 
                  yyterminate (); // can't move this, since it actually rets a YY_NULL
        }
@@ -219,7 +220,7 @@ HYPHEN              --
                main_input_b_ = true;
        }
        else
-               error (_ ("\\maininput disallowed outside init files"));
+               error (_ ("\\maininput not allowed outside init files"));
 }
 
 <INITIAL,chords,lyrics,figures,notes>\\include           {
@@ -286,17 +287,14 @@ HYPHEN            --
        //char const* s = YYText () + 1;
        char const* s = here_str0 ();
        int n = 0;
-       if (main_input_b_ && safe_global_b) {
-               error (_ ("Can't evaluate Scheme in safe mode"));
-               yylval.scm =  SCM_EOL;
-               return SCM_T;
-       }
-       SCM sval = ly_parse_scm (s, &n, here_input());
+       SCM sval = ly_parse_scm (s, &n, here_input (),
+               safe_global_b && main_input_b_);
+
        if (sval == SCM_UNDEFINED)
-               {
+       {
                sval = SCM_UNSPECIFIED;
                errorlevel_ = 1;
-               }
+       }
 
        for (int i=0; i < n; i++)
        {
@@ -529,8 +527,7 @@ HYPHEN              --
 }
 
 <<EOF>> {
-
-
+       main_input_b_ = false;
        if (! close_input ()) { 
          yyterminate (); // can't move this, since it actually rets a YY_NULL
        }
index ae8cedddf633eb1311c060a60e9bb2dc369051df..905940d72a9afb1df609b865a8e6b6b2458d1263 100644 (file)
@@ -19,7 +19,7 @@ static int module_count;
 void
 ly_init_anonymous_module (void * data)
 {
-  scm_c_use_module ("lily");  
+  scm_c_use_module ("lily");
 }
 
 Protected_scm anon_modules;
@@ -29,7 +29,6 @@ ly_make_anonymous_module ()
 {
   String s = "*anonymous-ly-" + to_string (module_count++) +  "*";
   SCM mod = scm_c_define_module (s.to_str0(), ly_init_anonymous_module, 0);
-
   anon_modules = scm_cons (mod, anon_modules);
   return mod;
 }
index 5d88928cc7674dc93e92fd1f6fc2073152252727..11a97fb92c9cc8daade683371c6f1f475156bf30 100644 (file)
@@ -64,7 +64,7 @@ String output_format_global = "tex";
 /* Current output name. */
 String output_name_global;
 
-/* Run in safe mode? -- FIXME: should be re-analised */
+/* Run in safe mode? */
 bool safe_global_b = false;
 
 /* Verbose progress indication? */
@@ -118,12 +118,7 @@ static Long_option_init options_static[] = {
   {0, "no-paper", 'm',  _i ("produce MIDI output only")},
   {_i ("FILE"), "output", 'o',  _i ("write output to FILE")},
   {_i ("DIR"), "dep-prefix", 'P',  _i ("prepend DIR to dependencies")},
-#if 0
-  /*
-    should audit again.
-   */
-  {0, "safe", 's',  _i ("inhibit file output naming and exporting")},
-#endif
+  {0, "safe-mode", 's',  _i ("run in safe mode")},
   {0, "version", 'v',  _i ("print version number")},
   {0, "verbose", 'V', _i ("be verbose")},
   {0, "warranty", 'w',  _i ("show warranty and copyright")},
index 2a8d3e8cb567aadc936a2f4c7e2090c6a0e2e05e..9eead743d750c6d0ad5cd0da2fb30d389057ac3c 100644 (file)
@@ -113,7 +113,7 @@ My_lily_lexer::My_lily_lexer ()
 void
 My_lily_lexer::add_scope (SCM module)
 {
-  ly_reexport_module (scm_current_module());
+  ly_reexport_module (scm_current_module ());
   scm_set_current_module (module);
   for (SCM s = scopes_; gh_pair_p (s); s = gh_cdr (s))
     {
@@ -166,11 +166,11 @@ void
 My_lily_lexer::start_main_input ()
 {  
   new_input (main_input_name_, &global_input_file->sources_);
-  allow_includes_b_ = allow_includes_b_ &&  ! (safe_global_b);
+  allow_includes_b_ = allow_includes_b_ && ! safe_global_b;
 
   scm_module_define (gh_car (scopes_),
                     ly_symbol2scm ("input-file-name"),
-                    scm_makfrom0str (main_input_name_.to_str0()));
+                    scm_makfrom0str (main_input_name_.to_str0 ()));
 }
 
 void
index 3204dec58a3216116ec4d4cf2648272eeff6383d..d5628707e67b4ffbe16ec36096a20b315f2e60b2 100644 (file)
@@ -14,7 +14,7 @@
   Need guile-1.3.4 (>1.3 anyway) for ftell on str ports -- jcn
 */
 SCM
-internal_ly_parse_scm (Parse_start * ps)
+internal_ly_parse_scm (Parse_start * ps, bool safe)
 {
   Source_file* sf =ps->start_location_.source_file_;
   SCM port = sf->get_port();
@@ -29,25 +29,18 @@ internal_ly_parse_scm (Parse_start * ps)
 
   /* Read expression from port */
   if (!SCM_EOF_OBJECT_P (form = scm_read (port)))
-    answer = scm_primitive_eval (form);
+    {
+      if (safe)
+       {
+         SCM safe_module = scm_primitive_eval (ly_symbol2scm ("safe-module"));
+         answer = scm_eval (form, safe_module);
+       }
+      else
+       answer = scm_primitive_eval (form);
+    }
  
-  /*
-   After parsing
-
- (begin (foo 1 2))
-
-   all seems fine, but after parsing
-
- (foo 1 2)
-
-   read_buf has been advanced to read_pos - 1,
-   so that scm_ftell returns 1, instead of #parsed chars
-   */
-  
-  /*
-    urg: reset read_buf for scm_ftell
-    shouldn't scm_read () do this for us?
-  */
+  /* Reset read_buf for scm_ftell.
+     Shouldn't scm_read () do this for us?  */
   scm_fill_input (port);
   SCM to = scm_ftell (port);
   ps->nchars = gh_scm2int (to) - gh_scm2int (from);
@@ -55,20 +48,24 @@ internal_ly_parse_scm (Parse_start * ps)
   /* Don't close the port here; if we re-enter this function via a
      continuation, then the next time we enter it, we'll get an error.
      It's a string port anyway, so there's no advantage to closing it
-     early.
-
-     scm_close_port (port);
-  */
+     early. */
+  // scm_close_port (port);
 
   return answer;
 }
 
-
 SCM
 catch_protected_parse_body (void *p)
 {
   Parse_start *ps = (Parse_start*) p;
-  return internal_ly_parse_scm (ps);
+  return internal_ly_parse_scm (ps, false);
+}
+
+SCM
+safe_catch_protected_parse_body (void *p)
+{
+  Parse_start *ps = (Parse_start*) p;
+  return internal_ly_parse_scm (ps, true);
 }
 
 SCM 
@@ -103,10 +100,11 @@ parse_handler (void * data, SCM tag, SCM args)
 #endif
 
 SCM
-protected_ly_parse_scm (Parse_start *ps)
+protected_ly_parse_scm (Parse_start *ps, bool safe)
 {
   return scm_internal_catch (ly_symbol2scm (READ_ERROR),
-                            &catch_protected_parse_body,
+                            (safe ? &safe_catch_protected_parse_body
+                             : catch_protected_parse_body),
                             (void*)ps,
                             &parse_handler, (void*)ps);
 }
@@ -117,15 +115,15 @@ bool  parse_protect_global  = true;
   Try parsing. If failure, then return SCM_UNDEFINED.
  */
 SCM
-ly_parse_scm (char const* s, int *n, Input i)
+ly_parse_scm (char const* s, int *n, Input i, bool safe)
 {
   
   Parse_start ps ;
   ps.str = s;
   ps.start_location_ = i;
 
-  SCM ans = parse_protect_global ? protected_ly_parse_scm (&ps)
-    : internal_ly_parse_scm (&ps);
+  SCM ans = parse_protect_global ? protected_ly_parse_scm (&ps, safe)
+    : internal_ly_parse_scm (&ps, safe);
   *n = ps.nchars;
 
   return ans;  
index ebc4b8660eb7695e519bf5c18bd94fc0a3bf9168..f8f3d5d5e8665e7b2eeda0cefbbb5dfc0abe09f9 100644 (file)
@@ -25,20 +25,27 @@ AFM_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.afm) \
        $(AF_FILES:%.af=$(outdir)/%.afm)
 ENC_FILES = $(TEXTABLES:.tex=.enc)
 TFM_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.tfm)
+FETA_LIST_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%list.ly)
 
 
 ENCODING_FILE=$(findstring $(<:.mf=.enc), $(FETA_MF_FILES:.mf=.enc))
 MFTRACE_FLAGS=$(if $(ENCODING_FILE),--encoding $(ENCODING_FILE),)
 
+SAUTER_FONTS = cmbxti8
+
+ALL_FONTS = $(FETA_FONTS) $(SAUTER_FONTS)
+PFA_FILES = $(ALL_FONTS:%=$(outdir)/%.pfa)
+PFB_FILES = $(PFA_FILES:%.pfa=%.pfb)
+
 # Make tfm files first, log files last, 
 # so that normally log files aren't made twice
-ALL_GEN_FILES= $(TFM_FILES) $(TEXTABLES) $(AFM_FILES) $(TFM_FILES) $(LOG_FILES) $(ENC_FILES)
+ALL_GEN_FILES= $(TFM_FILES) $(TEXTABLES) $(AFM_FILES) $(TFM_FILES) $(LOG_FILES) $(ENC_FILES) $(FETA_LIST_FILES) $(PFA_FILES) $(outdir)/lilypond.map $(outdir)/fonts.scale
 
 #PRE_INSTALL=$(MAKE) "$(ALL_GEN_FILES)"
 INSTALLATION_DIR=$(local_lilypond_datadir)/fonts/source
 INSTALLATION_FILES=$(MF_FILES) $(AF_FILES)
 
-INSTALLATION_OUT_SUFFIXES=1 2 3 4 5
+INSTALLATION_OUT_SUFFIXES=1 2 3 4 5 6
 
 INSTALLATION_OUT_DIR1=$(local_lilypond_datadir)/tex
 INSTALLATION_OUT_FILES1=$(TEXTABLES)
@@ -49,21 +56,14 @@ INSTALLATION_OUT_FILES2=$(AFM_FILES)
 INSTALLATION_OUT_DIR3=$(local_lilypond_datadir)/fonts/tfm
 INSTALLATION_OUT_FILES3=$(TFM_FILES)
 
+INSTALLATION_OUT_DIR4=$(local_lilypond_datadir)/ly
+INSTALLATION_OUT_FILES4=$(FETA_LIST_FILES)
 
-SAUTER_FONTS = cmbxti8
-
-ALL_FONTS = $(FETA_FONTS) $(SAUTER_FONTS)
-
-
-PFA_FILES = $(ALL_FONTS:%=$(outdir)/%.pfa)
-PFB_FILES = $(PFA_FILES:%.pfa=%.pfb)
-
-ALL_GEN_FILES += $(PFA_FILES) $(outdir)/lilypond.map $(outdir)/fonts.scale
-INSTALLATION_OUT_DIR4=$(local_lilypond_datadir)/fonts/type1
-INSTALLATION_OUT_FILES4=$(PFA_FILES) $(outdir)/fonts.scale
+INSTALLATION_OUT_DIR5=$(local_lilypond_datadir)/fonts/type1
+INSTALLATION_OUT_FILES5=$(PFA_FILES) $(outdir)/fonts.scale
 
-INSTALLATION_OUT_DIR5=$(local_lilypond_datadir)/dvips/
-INSTALLATION_OUT_FILES5=$(outdir)/lilypond.map
+INSTALLATION_OUT_DIR6=$(local_lilypond_datadir)/dvips/
+INSTALLATION_OUT_FILES6=$(outdir)/lilypond.map
 
 export MFINPUTS:=.:$(MFINPUTS)
 
index ab464ec08bf5ba6c89cbf19f474da5196146fecc..d0881b90deecc67a2add17e20f7373322dbff918 100644 (file)
@@ -9,9 +9,11 @@
 
 
 (use-modules (ice-9 regex)
-            (srfi srfi-1)              ;lists
-            (srfi srfi-13)             ;strings
-            )
+            (ice-9 safe)
+            (srfi srfi-1)  ; lists
+            (srfi srfi-13)) ; strings
+
+(define-public safe-module (make-safe-module))
 
 (define-public (myd k v) (display k) (display ": ") (display v) (display ", "))