* 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 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
@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
{
if (!allow_includes_b_)
{
- LexerError ("include files are disallowed.");
+ LexerError (_ ("include files are not allowed").to_str0 ());
return;
}
};
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
}
<<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
}
main_input_b_ = true;
}
else
- error (_ ("\\maininput disallowed outside init files"));
+ error (_ ("\\maininput not allowed outside init files"));
}
<INITIAL,chords,lyrics,figures,notes>\\include {
//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++)
{
}
<<EOF>> {
-
-
+ main_input_b_ = false;
if (! close_input ()) {
yyterminate (); // can't move this, since it actually rets a YY_NULL
}
void
ly_init_anonymous_module (void * data)
{
- scm_c_use_module ("lily");
+ scm_c_use_module ("lily");
}
Protected_scm anon_modules;
{
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;
}
/* 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? */
{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")},
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))
{
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
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();
/* 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);
/* 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
#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);
}
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;
$(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)
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)
(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 ", "))