Ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a25176072e02db9254f0e0c84c805cd)
safe.c
Go to the documentation of this file.
1/**********************************************************************
2
3 safe.c -
4
5 $Author$
6 created at: Tue Sep 23 09:44:32 JST 2008
7
8 Copyright (C) 2008 Yukihiro Matsumoto
9
10**********************************************************************/
11
12#define SAFE_LEVEL_MAX RUBY_SAFE_LEVEL_MAX
13
14#include "ruby/ruby.h"
15#include "vm_core.h"
16
17/* $SAFE accessor */
18
19#undef rb_secure
20#undef rb_set_safe_level
21#undef ruby_safe_level_2_warning
22
23int
25{
26 rb_warn("rb_safe_level_2_warning will be removed in Ruby 3.0");
27 return 2;
28}
29
30int
32{
33 rb_warn("rb_safe_level will be removed in Ruby 3.0");
34 return GET_VM()->safe_level_;
35}
36
37void
39{
40 rb_warn("rb_set_safe_level_force will be removed in Ruby 3.0");
41 GET_VM()->safe_level_ = safe;
42}
43
44void
46{
47 rb_vm_t *vm = GET_VM();
48
49 rb_warn("rb_set_safe_level will be removed in Ruby 3.0");
50 if (level > SAFE_LEVEL_MAX) {
51 rb_raise(rb_eArgError, "$SAFE=2 to 4 are obsolete");
52 }
53 else if (level < 0) {
54 rb_raise(rb_eArgError, "$SAFE should be >= 0");
55 }
56 else {
57 int line;
58 const char *path = rb_source_location_cstr(&line);
59
60 if (0) fprintf(stderr, "%s:%d $SAFE %d -> %d\n",
61 path ? path : "-", line, vm->safe_level_, level);
62
63 vm->safe_level_ = level;
64 }
65}
66
67static VALUE
68safe_getter(ID _x, VALUE *_y)
69{
70 rb_warn("$SAFE will become a normal global variable in Ruby 3.0");
71 return INT2NUM(GET_VM()->safe_level_);
72}
73
74static void
75safe_setter(VALUE val, ID _x, VALUE *_y)
76{
77 int level = NUM2INT(val);
78 rb_vm_t *vm = GET_VM();
79
80 rb_warn("$SAFE will become a normal global variable in Ruby 3.0");
81 if (level > SAFE_LEVEL_MAX) {
82 rb_raise(rb_eArgError, "$SAFE=2 to 4 are obsolete");
83 }
84 else if (level < 0) {
85 rb_raise(rb_eArgError, "$SAFE should be >= 0");
86 }
87 else {
88 int line;
89 const char *path = rb_source_location_cstr(&line);
90
91 if (0) fprintf(stderr, "%s:%d $SAFE %d -> %d\n",
92 path ? path : "-", line, vm->safe_level_, level);
93
94 vm->safe_level_ = level;
95 }
96}
97
98void
99rb_secure(int level)
100{
101 rb_warn("rb_secure will be removed in Ruby 3.0");
102 if (level <= GET_VM()->safe_level_) {
103 ID caller_name = rb_frame_callee();
104 if (caller_name) {
105 rb_raise(rb_eSecurityError, "Insecure operation `%"PRIsVALUE"' at level %d",
106 rb_id2str(caller_name), GET_VM()->safe_level_);
107 }
108 else {
109 rb_raise(rb_eSecurityError, "Insecure operation at level %d",
110 GET_VM()->safe_level_);
111 }
112 }
113}
114
115void
117{
118 rb_warn("rb_secure_update will be removed in Ruby 3.0");
119}
120
121void
123{
124 rb_warn("rb_insecure_operation will be removed in Ruby 3.0");
125 ID caller_name = rb_frame_callee();
126 if (caller_name) {
127 rb_raise(rb_eSecurityError, "Insecure operation - %"PRIsVALUE,
128 rb_id2str(caller_name));
129 }
130 else {
131 rb_raise(rb_eSecurityError, "Insecure operation: -r");
132 }
133}
134
135void
137{
138 rb_warn("rb_check_safe_obj will be removed in Ruby 3.0");
139}
140
141void
143{
144 rb_define_virtual_variable("$SAFE", safe_getter, safe_setter);
145}
ID rb_frame_callee(void)
The name of the current method.
Definition: eval.c:1200
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:2671
void rb_warn(const char *fmt,...)
Definition: error.c:315
VALUE rb_eArgError
Definition: error.c:925
VALUE rb_eSecurityError
Definition: error.c:933
void rb_define_virtual_variable(const char *, rb_gvar_getter_t *, rb_gvar_setter_t *)
Definition: variable.c:511
const VALUE VALUE obj
int fprintf(FILE *__restrict__, const char *__restrict__,...) __attribute__((__format__(__printf__
unsigned long VALUE
#define stderr
#define GET_VM()
#define INT2NUM(x)
#define NUM2INT(x)
#define PRIsVALUE
const char * rb_source_location_cstr(int *pline)
Definition: vm.c:1376
unsigned long ID
void rb_secure_update(VALUE obj)
Definition: safe.c:116
int ruby_safe_level_2_warning(void)
Definition: safe.c:24
void rb_set_safe_level(int level)
Definition: safe.c:45
void rb_check_safe_obj(VALUE x)
Definition: safe.c:136
#define SAFE_LEVEL_MAX
Definition: safe.c:12
void rb_insecure_operation(void)
Definition: safe.c:122
int rb_safe_level(void)
Definition: safe.c:31
void rb_set_safe_level_force(int safe)
Definition: safe.c:38
void rb_secure(int level)
Definition: safe.c:99
void Init_safe(void)
Definition: safe.c:142
#define rb_id2str(id)
Definition: vm_backtrace.c:30