diff options
-rw-r--r-- | mg.c | 4 | ||||
-rw-r--r-- | perl.c | 5 | ||||
-rw-r--r-- | pod/perlembed.pod | 16 |
3 files changed, 22 insertions, 3 deletions
@@ -2540,7 +2540,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) /* The BSDs don't show the argv[] in ps(1) output, they * show a string from the process struct and provide * the setproctitle() routine to manipulate that. */ - { + if (PL_origalen != 1) { s = SvPV_const(sv, len); # if __FreeBSD_version > 410001 /* The leading "-" removes the "perl: " prefix, @@ -2561,7 +2561,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) } #endif #if defined(__hpux) && defined(PSTAT_SETCMD) - { + if (PL_origalen != 1) { union pstun un; s = SvPV_const(sv, len); un.pst_command = (char *)s; @@ -1439,7 +1439,10 @@ setuid perl scripts securely.\n"); PL_origargc = argc; PL_origargv = argv; - { + if (PL_origalen != 0) { + PL_origalen = 1; /* don't use old PL_origalen if perl_parse() is called again */ + } + else { /* Set PL_origalen be the sum of the contiguous argv[] * elements plus the size of the env in case that it is * contiguous with the argv[]. This is used in mg.c:Perl_magic_set() diff --git a/pod/perlembed.pod b/pod/perlembed.pod index 38211e5cac..0bd569fafb 100644 --- a/pod/perlembed.pod +++ b/pod/perlembed.pod @@ -793,6 +793,7 @@ with L<perlfunc/my> whenever possible. } perl_construct(my_perl); + PL_origalen = 1; /* don't let $0 assignment update the proctitle or embedding[0] */ exitstatus = perl_parse(my_perl, NULL, 2, embedding, NULL); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; if(!exitstatus) { @@ -852,6 +853,21 @@ perl 5.7.2 you can specify C<PL_exit_flags |= PERL_EXIT_DESTRUCT_END> to get the new behaviour. This also enables the running of END blocks if the perl_parse fails and C<perl_destruct> will return the exit value. +=head2 $0 assignments + +When a perl script assigns a value to $0 then the perl runtime will +try to make this value show up as the program name reported by "ps" by +updating the memory pointed to by the argv passed to perl_parse() and +also calling API functions like setproctitle() where available. This +behaviour might not be appropriate when embedding perl and can be +disabled by assigning the value C<1> to the variable C<PL_origalen> +before perl_parse() is called. + +The F<persistent.c> example above is for instance likely to segfault +when $0 is assigned to if the C<PL_origalen = 1;> assignment is +removed. This because perl will try to write to the read only memory +of the C<embedding[]> strings. + =head2 Maintaining multiple interpreter instances Some rare applications will need to create more than one interpreter |