From 621b37cf94dbef15f7d3a148aecd7a265c4075fd Mon Sep 17 00:00:00 2001 From: janneke Date: Wed, 28 Jan 2004 18:16:51 +0000 Subject: [PATCH] * 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. (<>): Reset main_input_b_, fixes old-relative chech in init.ly for safe-mode. --- ChangeLog | 22 +++++++++++++ Documentation/topdocs/NEWS.texi | 7 +++- lily/includable-lexer.cc | 2 +- lily/include/parse-scm.hh | 4 +-- lily/lexer.ll | 19 +++++------ lily/ly-module.cc | 3 +- lily/main.cc | 9 ++--- lily/my-lily-lexer.cc | 6 ++-- lily/parse-scm.cc | 58 ++++++++++++++++----------------- mf/GNUmakefile | 30 ++++++++--------- scm/lily.scm | 8 +++-- 11 files changed, 93 insertions(+), 75 deletions(-) diff --git a/ChangeLog b/ChangeLog index cf797870ee..378ec3eef8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2004-01-28 Jan Nieuwenhuizen + + * 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. + (<>): Reset main_input_b_, fixes old-relative chech + in init.ly for safe-mode. + 2004-01-28 Mats Bengtsson * scripts/lilypond.py (ly_paper_to_latexpaper): Regain diff --git a/Documentation/topdocs/NEWS.texi b/Documentation/topdocs/NEWS.texi index 7df7feb2e2..5c19902c47 100644 --- a/Documentation/topdocs/NEWS.texi +++ b/Documentation/topdocs/NEWS.texi @@ -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 diff --git a/lily/includable-lexer.cc b/lily/includable-lexer.cc index 9293970425..fd2a2de4dc 100644 --- a/lily/includable-lexer.cc +++ b/lily/includable-lexer.cc @@ -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; } diff --git a/lily/include/parse-scm.hh b/lily/include/parse-scm.hh index 896559ea02..3d0158fab8 100644 --- a/lily/include/parse-scm.hh +++ b/lily/include/parse-scm.hh @@ -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 diff --git a/lily/lexer.ll b/lily/lexer.ll index c2cb3077ca..1c859e27a4 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -206,6 +206,7 @@ HYPHEN -- } <> { 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")); } \\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 -- } <> { - - + main_input_b_ = false; if (! close_input ()) { yyterminate (); // can't move this, since it actually rets a YY_NULL } diff --git a/lily/ly-module.cc b/lily/ly-module.cc index ae8cedddf6..905940d72a 100644 --- a/lily/ly-module.cc +++ b/lily/ly-module.cc @@ -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; } diff --git a/lily/main.cc b/lily/main.cc index 5d88928cc7..11a97fb92c 100644 --- a/lily/main.cc +++ b/lily/main.cc @@ -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")}, diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index 2a8d3e8cb5..9eead743d7 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -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 diff --git a/lily/parse-scm.cc b/lily/parse-scm.cc index 3204dec58a..d5628707e6 100644 --- a/lily/parse-scm.cc +++ b/lily/parse-scm.cc @@ -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; diff --git a/mf/GNUmakefile b/mf/GNUmakefile index ebc4b8660e..f8f3d5d5e8 100644 --- a/mf/GNUmakefile +++ b/mf/GNUmakefile @@ -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) diff --git a/scm/lily.scm b/scm/lily.scm index ab464ec08b..d0881b90de 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -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 ", ")) -- 2.39.2