33
33
* ENHANCEMENTS, OR MODIFICATIONS.
34
34
*
35
35
* IDENTIFICATION
36
- * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.90 2005/08/20 19:19:21 tgl Exp $
36
+ * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.91 2005/08/24 18:16:56 tgl Exp $
37
37
*
38
38
**********************************************************************/
39
39
@@ -185,57 +185,88 @@ plperl_init_all(void)
185
185
/* We don't need to do anything yet when a new backend starts. */
186
186
}
187
187
188
+ /* Each of these macros must represent a single string literal */
189
+
190
+ #define PERLBOOT \
191
+ "SPI::bootstrap(); use vars qw(%_SHARED);" \
192
+ "sub ::plperl_warn { my $msg = shift; " \
193
+ " $msg =~ s/\\(eval \\d+\\) //g; &elog(&NOTICE, $msg); } " \
194
+ "$SIG{__WARN__} = \\&::plperl_warn; " \
195
+ "sub ::plperl_die { my $msg = shift; " \
196
+ " $msg =~ s/\\(eval \\d+\\) //g; die $msg; } " \
197
+ "$SIG{__DIE__} = \\&::plperl_die; " \
198
+ "sub ::mkunsafefunc {" \
199
+ " my $ret = eval(qq[ sub { $_[0] $_[1] } ]); " \
200
+ " $@ =~ s/\\(eval \\d+\\) //g if $@; return $ret; }" \
201
+ "use strict; " \
202
+ "sub ::mk_strict_unsafefunc {" \
203
+ " my $ret = eval(qq[ sub { use strict; $_[0] $_[1] } ]); " \
204
+ " $@ =~ s/\\(eval \\d+\\) //g if $@; return $ret; } " \
205
+ "sub ::_plperl_to_pg_array {" \
206
+ " my $arg = shift; ref $arg eq 'ARRAY' || return $arg; " \
207
+ " my $res = ''; my $first = 1; " \
208
+ " foreach my $elem (@$arg) " \
209
+ " { " \
210
+ " $res .= ', ' unless $first; $first = undef; " \
211
+ " if (ref $elem) " \
212
+ " { " \
213
+ " $res .= _plperl_to_pg_array($elem); " \
214
+ " } " \
215
+ " else " \
216
+ " { " \
217
+ " my $str = qq($elem); " \
218
+ " $str =~ s/([\"\\\\])/\\\\$1/g; " \
219
+ " $res .= qq(\"$str\"); " \
220
+ " } " \
221
+ " } " \
222
+ " return qq({$res}); " \
223
+ "} "
224
+
225
+ #define SAFE_MODULE \
226
+ "require Safe; $Safe::VERSION"
227
+
228
+ #define SAFE_OK \
229
+ "use vars qw($PLContainer); $PLContainer = new Safe('PLPerl');" \
230
+ "$PLContainer->permit_only(':default');" \
231
+ "$PLContainer->permit(qw[:base_math !:base_io sort time]);" \
232
+ "$PLContainer->share(qw[&elog &spi_exec_query &return_next " \
233
+ "&spi_query &spi_fetchrow " \
234
+ "&_plperl_to_pg_array " \
235
+ "&DEBUG &LOG &INFO &NOTICE &WARNING &ERROR %_SHARED ]);" \
236
+ "sub ::mksafefunc {" \
237
+ " my $ret = $PLContainer->reval(qq[sub { $_[0] $_[1] }]); " \
238
+ " $@ =~ s/\\(eval \\d+\\) //g if $@; return $ret; }" \
239
+ "$PLContainer->permit('require'); $PLContainer->reval('use strict;');" \
240
+ "$PLContainer->deny('require');" \
241
+ "sub ::mk_strict_safefunc {" \
242
+ " my $ret = $PLContainer->reval(qq[sub { BEGIN { strict->import(); } $_[0] $_[1] }]); " \
243
+ " $@ =~ s/\\(eval \\d+\\) //g if $@; return $ret; }"
244
+
245
+ #define SAFE_BAD \
246
+ "use vars qw($PLContainer); $PLContainer = new Safe('PLPerl');" \
247
+ "$PLContainer->permit_only(':default');" \
248
+ "$PLContainer->share(qw[&elog &ERROR ]);" \
249
+ "sub ::mksafefunc { return $PLContainer->reval(qq[sub { " \
250
+ " elog(ERROR,'trusted Perl functions disabled - " \
251
+ " please upgrade Perl Safe module to version 2.09 or later');}]); }" \
252
+ "sub ::mk_strict_safefunc { return $PLContainer->reval(qq[sub { " \
253
+ " elog(ERROR,'trusted Perl functions disabled - " \
254
+ " please upgrade Perl Safe module to version 2.09 or later');}]); }"
255
+
188
256
189
257
static void
190
258
plperl_init_interp (void )
191
259
{
192
- static char * loose_embedding [3 ] = {
193
- "" , "-e" ,
194
- /* all one string follows (no commas please) */
195
- "SPI::bootstrap(); use vars qw(%_SHARED);"
196
- "sub ::plperl_warn { my $msg = shift; &elog(&NOTICE, $msg); } "
197
- "$SIG{__WARN__} = \\&::plperl_warn; "
198
- "sub ::mkunsafefunc {return eval(qq[ sub { $_[0] $_[1] } ]); }"
199
- "sub ::_plperl_to_pg_array"
200
- "{"
201
- " my $arg = shift; ref $arg eq 'ARRAY' || return $arg; "
202
- " my $res = ''; my $first = 1; "
203
- " foreach my $elem (@$arg) "
204
- " { "
205
- " $res .= ', ' unless $first; $first = undef; "
206
- " if (ref $elem) "
207
- " { "
208
- " $res .= _plperl_to_pg_array($elem); "
209
- " } "
210
- " else "
211
- " { "
212
- " my $str = qq($elem); "
213
- " $str =~ s/([\"\\\\])/\\\\$1/g; "
214
- " $res .= qq(\"$str\"); "
215
- " } "
216
- " } "
217
- " return qq({$res}); "
218
- "} "
219
- };
220
-
221
-
222
- static char * strict_embedding [3 ] = {
223
- "" , "-e" ,
224
- /* all one string follows (no commas please) */
225
- "SPI::bootstrap(); use vars qw(%_SHARED);"
226
- "sub ::plperl_warn { my $msg = shift; &elog(&NOTICE, $msg); } "
227
- "$SIG{__WARN__} = \\&::plperl_warn; "
228
- "sub ::mkunsafefunc {return eval("
229
- "qq[ sub { use strict; $_[0] $_[1] } ]); }"
260
+ static char * embedding [3 ] = {
261
+ "" , "-e" , PERLBOOT
230
262
};
231
263
232
264
plperl_interp = perl_alloc ();
233
265
if (!plperl_interp )
234
266
elog (ERROR , "could not allocate Perl interpreter" );
235
267
236
268
perl_construct (plperl_interp );
237
- perl_parse (plperl_interp , plperl_init_shared_libs , 3 ,
238
- (plperl_use_strict ? strict_embedding : loose_embedding ), NULL );
269
+ perl_parse (plperl_interp , plperl_init_shared_libs , 3 , embedding , NULL );
239
270
perl_run (plperl_interp );
240
271
241
272
plperl_proc_hash = newHV ();
@@ -245,44 +276,10 @@ plperl_init_interp(void)
245
276
static void
246
277
plperl_safe_init (void )
247
278
{
248
- static char * safe_module =
249
- "require Safe; $Safe::VERSION" ;
250
-
251
- static char * common_safe_ok =
252
- "use vars qw($PLContainer); $PLContainer = new Safe('PLPerl');"
253
- "$PLContainer->permit_only(':default');"
254
- "$PLContainer->permit(qw[:base_math !:base_io sort time]);"
255
- "$PLContainer->share(qw[&elog &spi_exec_query &return_next "
256
- "&spi_query &spi_fetchrow "
257
- "&_plperl_to_pg_array "
258
- "&DEBUG &LOG &INFO &NOTICE &WARNING &ERROR %_SHARED ]);"
259
- ;
260
-
261
- static char * strict_safe_ok =
262
- "$PLContainer->permit('require');$PLContainer->reval('use strict;');"
263
- "$PLContainer->deny('require');"
264
- "sub ::mksafefunc { return $PLContainer->reval(qq[ "
265
- " sub { BEGIN { strict->import(); } $_[0] $_[1]}]); }"
266
- ;
267
-
268
- static char * loose_safe_ok =
269
- "sub ::mksafefunc { return $PLContainer->reval(qq[ "
270
- " sub { $_[0] $_[1]}]); }"
271
- ;
272
-
273
- static char * safe_bad =
274
- "use vars qw($PLContainer); $PLContainer = new Safe('PLPerl');"
275
- "$PLContainer->permit_only(':default');"
276
- "$PLContainer->share(qw[&elog &ERROR ]);"
277
- "sub ::mksafefunc { return $PLContainer->reval(qq[sub { "
278
- "elog(ERROR,'trusted Perl functions disabled - "
279
- "please upgrade Perl Safe module to version 2.09 or later');}]); }"
280
- ;
281
-
282
279
SV * res ;
283
280
double safe_version ;
284
281
285
- res = eval_pv (safe_module , FALSE); /* TRUE = croak if failure */
282
+ res = eval_pv (SAFE_MODULE , FALSE); /* TRUE = croak if failure */
286
283
287
284
safe_version = SvNV (res );
288
285
@@ -294,12 +291,11 @@ plperl_safe_init(void)
294
291
if (safe_version < 2.0899 )
295
292
{
296
293
/* not safe, so disallow all trusted funcs */
297
- eval_pv (safe_bad , FALSE);
294
+ eval_pv (SAFE_BAD , FALSE);
298
295
}
299
296
else
300
297
{
301
- eval_pv (common_safe_ok , FALSE);
302
- eval_pv ((plperl_use_strict ? strict_safe_ok : loose_safe_ok ), FALSE);
298
+ eval_pv (SAFE_OK , FALSE);
303
299
}
304
300
305
301
plperl_safe_init_done = true;
@@ -369,7 +365,7 @@ plperl_convert_to_pg_array(SV *src)
369
365
XPUSHs (src );
370
366
PUTBACK ;
371
367
372
- count = call_pv ("_plperl_to_pg_array" , G_SCALAR );
368
+ count = call_pv (":: _plperl_to_pg_array" , G_SCALAR );
373
369
374
370
SPAGAIN ;
375
371
@@ -661,6 +657,7 @@ plperl_create_sub(char *s, bool trusted)
661
657
dSP ;
662
658
SV * subref ;
663
659
int count ;
660
+ char * compile_sub ;
664
661
665
662
if (trusted && !plperl_safe_init_done )
666
663
{
@@ -680,8 +677,17 @@ plperl_create_sub(char *s, bool trusted)
680
677
* errors properly. Perhaps it's because there's another level of
681
678
* eval inside mksafefunc?
682
679
*/
683
- count = perl_call_pv ((trusted ? "::mksafefunc" : "::mkunsafefunc" ),
684
- G_SCALAR | G_EVAL | G_KEEPERR );
680
+
681
+ if (trusted && plperl_use_strict )
682
+ compile_sub = "::mk_strict_safefunc" ;
683
+ else if (plperl_use_strict )
684
+ compile_sub = "::mk_strict_unsafefunc" ;
685
+ else if (trusted )
686
+ compile_sub = "::mksafefunc" ;
687
+ else
688
+ compile_sub = "::mkunsafefunc" ;
689
+
690
+ count = perl_call_pv (compile_sub , G_SCALAR | G_EVAL | G_KEEPERR );
685
691
SPAGAIN ;
686
692
687
693
if (count != 1 )
0 commit comments