xref: /openbsd/gnu/usr.bin/perl/util.c (revision fac98b93)
1 /*    util.c
2  *
3  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4  *    2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10 
11 /*
12  * 'Very useful, no doubt, that was to Saruman; yet it seems that he was
13  *  not content.'                                    --Gandalf to Pippin
14  *
15  *     [p.598 of _The Lord of the Rings_, III/xi: "The Palantír"]
16  */
17 
18 /* This file contains assorted utility routines.
19  * Which is a polite way of saying any stuff that people couldn't think of
20  * a better place for. Amongst other things, it includes the warning and
21  * dieing stuff, plus wrappers for malloc code.
22  */
23 
24 #include "EXTERN.h"
25 #define PERL_IN_UTIL_C
26 #include "perl.h"
27 #include "reentr.h"
28 
29 #if defined(USE_PERLIO)
30 #include "perliol.h" /* For PerlIOUnix_refcnt */
31 #endif
32 
33 #ifndef PERL_MICRO
34 #include <signal.h>
35 #ifndef SIG_ERR
36 # define SIG_ERR ((Sighandler_t) -1)
37 #endif
38 #endif
39 
40 #include <math.h>
41 #include <stdlib.h>
42 
43 #ifdef __Lynx__
44 /* Missing protos on LynxOS */
45 int putenv(char *);
46 #endif
47 
48 #ifdef __amigaos__
49 # include "amigaos4/amigaio.h"
50 #endif
51 
52 #ifdef HAS_SELECT
53 # ifdef I_SYS_SELECT
54 #  include <sys/select.h>
55 # endif
56 #endif
57 
58 #ifdef USE_C_BACKTRACE
59 #  ifdef I_BFD
60 #    define USE_BFD
61 #    ifdef PERL_DARWIN
62 #      undef USE_BFD /* BFD is useless in OS X. */
63 #    endif
64 #    ifdef USE_BFD
65 #      include <bfd.h>
66 #    endif
67 #  endif
68 #  ifdef I_DLFCN
69 #    include <dlfcn.h>
70 #  endif
71 #  ifdef I_EXECINFO
72 #    include <execinfo.h>
73 #  endif
74 #endif
75 
76 #ifdef PERL_DEBUG_READONLY_COW
77 # include <sys/mman.h>
78 #endif
79 
80 #define FLUSH
81 
82 /* NOTE:  Do not call the next three routines directly.  Use the macros
83  * in handy.h, so that we can easily redefine everything to do tracking of
84  * allocated hunks back to the original New to track down any memory leaks.
85  * XXX This advice seems to be widely ignored :-(   --AD  August 1996.
86  */
87 
88 #if defined (DEBUGGING) || defined(PERL_IMPLICIT_SYS) || defined (PERL_TRACK_MEMPOOL)
89 #  define ALWAYS_NEED_THX
90 #endif
91 
92 #if defined(PERL_TRACK_MEMPOOL) && defined(PERL_DEBUG_READONLY_COW)
93 static void
S_maybe_protect_rw(pTHX_ struct perl_memory_debug_header * header)94 S_maybe_protect_rw(pTHX_ struct perl_memory_debug_header *header)
95 {
96     if (header->readonly
97      && mprotect(header, header->size, PROT_READ|PROT_WRITE))
98         Perl_warn(aTHX_ "mprotect for COW string %p %lu failed with %d",
99                          header, header->size, errno);
100 }
101 
102 static void
S_maybe_protect_ro(pTHX_ struct perl_memory_debug_header * header)103 S_maybe_protect_ro(pTHX_ struct perl_memory_debug_header *header)
104 {
105     if (header->readonly
106      && mprotect(header, header->size, PROT_READ))
107         Perl_warn(aTHX_ "mprotect RW for COW string %p %lu failed with %d",
108                          header, header->size, errno);
109 }
110 # define maybe_protect_rw(foo) S_maybe_protect_rw(aTHX_ foo)
111 # define maybe_protect_ro(foo) S_maybe_protect_ro(aTHX_ foo)
112 #else
113 # define maybe_protect_rw(foo) NOOP
114 # define maybe_protect_ro(foo) NOOP
115 #endif
116 
117 #if defined(PERL_TRACK_MEMPOOL) || defined(PERL_DEBUG_READONLY_COW)
118  /* Use memory_debug_header */
119 # define USE_MDH
120 # if (defined(PERL_POISON) && defined(PERL_TRACK_MEMPOOL)) \
121    || defined(PERL_DEBUG_READONLY_COW)
122 #  define MDH_HAS_SIZE
123 # endif
124 #endif
125 
126 /*
127 =for apidoc_section $memory
128 =for apidoc safesysmalloc
129 Paranoid version of system's malloc()
130 
131 =cut
132 */
133 
134 Malloc_t
Perl_safesysmalloc(MEM_SIZE size)135 Perl_safesysmalloc(MEM_SIZE size)
136 {
137 #ifdef ALWAYS_NEED_THX
138     dTHX;
139 #endif
140     Malloc_t ptr;
141     dSAVEDERRNO;
142 
143 #ifdef USE_MDH
144     if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size)
145         goto out_of_memory;
146     size += PERL_MEMORY_DEBUG_HEADER_SIZE;
147 #endif
148 #ifdef DEBUGGING
149     if ((SSize_t)size < 0)
150         Perl_croak_nocontext("panic: malloc, size=%" UVuf, (UV) size);
151 #endif
152     if (!size) size = 1;	/* malloc(0) is NASTY on our system */
153     SAVE_ERRNO;
154 #ifdef PERL_DEBUG_READONLY_COW
155     if ((ptr = mmap(0, size, PROT_READ|PROT_WRITE,
156                     MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
157         perror("mmap failed");
158         abort();
159     }
160 #else
161     ptr = (Malloc_t)PerlMem_malloc(size);
162 #endif
163     PERL_ALLOC_CHECK(ptr);
164     if (ptr != NULL) {
165 #ifdef USE_MDH
166         struct perl_memory_debug_header *const header
167             = (struct perl_memory_debug_header *)ptr;
168 #endif
169 
170 #ifdef PERL_POISON
171         PoisonNew(((char *)ptr), size, char);
172 #endif
173 
174 #ifdef PERL_TRACK_MEMPOOL
175         header->interpreter = aTHX;
176         /* Link us into the list.  */
177         header->prev = &PL_memory_debug_header;
178         header->next = PL_memory_debug_header.next;
179         PL_memory_debug_header.next = header;
180         maybe_protect_rw(header->next);
181         header->next->prev = header;
182         maybe_protect_ro(header->next);
183 #  ifdef PERL_DEBUG_READONLY_COW
184         header->readonly = 0;
185 #  endif
186 #endif
187 #ifdef MDH_HAS_SIZE
188         header->size = size;
189 #endif
190         ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
191         DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
192 
193         /* malloc() can modify errno() even on success, but since someone
194            writing perl code doesn't have any control over when perl calls
195            malloc() we need to hide that.
196         */
197         RESTORE_ERRNO;
198     }
199     else {
200 #ifdef USE_MDH
201       out_of_memory:
202 #endif
203         {
204 #ifndef ALWAYS_NEED_THX
205             dTHX;
206 #endif
207             if (PL_nomemok)
208                 ptr =  NULL;
209             else
210                 croak_no_mem();
211         }
212     }
213     return ptr;
214 }
215 
216 /*
217 =for apidoc safesysrealloc
218 Paranoid version of system's realloc()
219 
220 =cut
221 */
222 
223 Malloc_t
Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)224 Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
225 {
226 #ifdef ALWAYS_NEED_THX
227     dTHX;
228 #endif
229     Malloc_t ptr;
230 #ifdef PERL_DEBUG_READONLY_COW
231     const MEM_SIZE oldsize = where
232         ? ((struct perl_memory_debug_header *)((char *)where - PERL_MEMORY_DEBUG_HEADER_SIZE))->size
233         : 0;
234 #endif
235 
236     if (!size) {
237         safesysfree(where);
238         ptr = NULL;
239     }
240     else if (!where) {
241         ptr = safesysmalloc(size);
242     }
243     else {
244         dSAVE_ERRNO;
245         PERL_DEB(UV was_where = PTR2UV(where)); /* used in diags below */
246 #ifdef USE_MDH
247         where = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
248         if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size)
249             goto out_of_memory;
250         size += PERL_MEMORY_DEBUG_HEADER_SIZE;
251         {
252             struct perl_memory_debug_header *const header
253                 = (struct perl_memory_debug_header *)where;
254 
255 # ifdef PERL_TRACK_MEMPOOL
256             if (header->interpreter != aTHX) {
257                 Perl_croak_nocontext("panic: realloc from wrong pool, %p!=%p",
258                                      header->interpreter, aTHX);
259             }
260             assert(header->next->prev == header);
261             assert(header->prev->next == header);
262 #  ifdef PERL_POISON
263             if (header->size > size) {
264                 const MEM_SIZE freed_up = header->size - size;
265                 char *start_of_freed = ((char *)where) + size;
266                 PoisonFree(start_of_freed, freed_up, char);
267             }
268 #  endif
269 # endif
270 # ifdef MDH_HAS_SIZE
271             header->size = size;
272 # endif
273         }
274 #endif
275 #ifdef DEBUGGING
276         if ((SSize_t)size < 0)
277             Perl_croak_nocontext("panic: realloc, size=%" UVuf, (UV)size);
278 #endif
279 #ifdef PERL_DEBUG_READONLY_COW
280         if ((ptr = mmap(0, size, PROT_READ|PROT_WRITE,
281                         MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
282             perror("mmap failed");
283             abort();
284         }
285         Copy(where,ptr,oldsize < size ? oldsize : size,char);
286         if (munmap(where, oldsize)) {
287             perror("munmap failed");
288             abort();
289         }
290 #else
291         ptr = (Malloc_t)PerlMem_realloc(where,size);
292 #endif
293         PERL_ALLOC_CHECK(ptr);
294 
295     /* MUST do this fixup first, before doing ANYTHING else, as anything else
296        might allocate memory/free/move memory, and until we do the fixup, it
297        may well be chasing (and writing to) free memory.  */
298         if (ptr != NULL) {
299 #ifdef PERL_TRACK_MEMPOOL
300             struct perl_memory_debug_header *const header
301                 = (struct perl_memory_debug_header *)ptr;
302 
303 #  ifdef PERL_POISON
304             if (header->size < size) {
305                 const MEM_SIZE fresh = size - header->size;
306                 char *start_of_fresh = ((char *)ptr) + size;
307                 PoisonNew(start_of_fresh, fresh, char);
308             }
309 #  endif
310 
311             maybe_protect_rw(header->next);
312             header->next->prev = header;
313             maybe_protect_ro(header->next);
314             maybe_protect_rw(header->prev);
315             header->prev->next = header;
316             maybe_protect_ro(header->prev);
317 #endif
318             ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
319 
320             /* realloc() can modify errno() even on success, but since someone
321                writing perl code doesn't have any control over when perl calls
322                realloc() we need to hide that.
323             */
324             RESTORE_ERRNO;
325         }
326 
327     /* In particular, must do that fixup above before logging anything via
328      *printf(), as it can reallocate memory, which can cause SEGVs.  */
329 
330         DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) rfree\n",was_where,(long)PL_an++));
331         DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
332 
333         if (ptr == NULL) {
334 #ifdef USE_MDH
335           out_of_memory:
336 #endif
337             {
338 #ifndef ALWAYS_NEED_THX
339                 dTHX;
340 #endif
341                 if (PL_nomemok)
342                     ptr = NULL;
343                 else
344                     croak_no_mem();
345             }
346         }
347     }
348     return ptr;
349 }
350 
351 /*
352 =for apidoc safesysfree
353 Safe version of system's free()
354 
355 =cut
356 */
357 
358 Free_t
Perl_safesysfree(Malloc_t where)359 Perl_safesysfree(Malloc_t where)
360 {
361 #ifdef ALWAYS_NEED_THX
362     dTHX;
363 #endif
364     DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
365     if (where) {
366 #ifdef USE_MDH
367         Malloc_t where_intrn = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
368         {
369             struct perl_memory_debug_header *const header
370                 = (struct perl_memory_debug_header *)where_intrn;
371 
372 # ifdef MDH_HAS_SIZE
373             const MEM_SIZE size = header->size;
374 # endif
375 # ifdef PERL_TRACK_MEMPOOL
376             if (header->interpreter != aTHX) {
377                 Perl_croak_nocontext("panic: free from wrong pool, %p!=%p",
378                                      header->interpreter, aTHX);
379             }
380             if (!header->prev) {
381                 Perl_croak_nocontext("panic: duplicate free");
382             }
383             if (!(header->next))
384                 Perl_croak_nocontext("panic: bad free, header->next==NULL");
385             if (header->next->prev != header || header->prev->next != header) {
386                 Perl_croak_nocontext("panic: bad free, ->next->prev=%p, "
387                                      "header=%p, ->prev->next=%p",
388                                      header->next->prev, header,
389                                      header->prev->next);
390             }
391             /* Unlink us from the chain.  */
392             maybe_protect_rw(header->next);
393             header->next->prev = header->prev;
394             maybe_protect_ro(header->next);
395             maybe_protect_rw(header->prev);
396             header->prev->next = header->next;
397             maybe_protect_ro(header->prev);
398             maybe_protect_rw(header);
399 #  ifdef PERL_POISON
400             PoisonNew(where_intrn, size, char);
401 #  endif
402             /* Trigger the duplicate free warning.  */
403             header->next = NULL;
404 # endif
405 # ifdef PERL_DEBUG_READONLY_COW
406             if (munmap(where_intrn, size)) {
407                 perror("munmap failed");
408                 abort();
409             }
410 # endif
411         }
412 #else
413         Malloc_t where_intrn = where;
414 #endif /* USE_MDH */
415 #ifndef PERL_DEBUG_READONLY_COW
416         PerlMem_free(where_intrn);
417 #endif
418     }
419 }
420 
421 /*
422 =for apidoc safesyscalloc
423 Safe version of system's calloc()
424 
425 =cut
426 */
427 
428 Malloc_t
Perl_safesyscalloc(MEM_SIZE count,MEM_SIZE size)429 Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
430 {
431 #ifdef ALWAYS_NEED_THX
432     dTHX;
433 #endif
434     Malloc_t ptr;
435 #if defined(USE_MDH) || defined(DEBUGGING)
436     MEM_SIZE total_size = 0;
437 #endif
438 
439     /* Even though calloc() for zero bytes is strange, be robust. */
440     if (size && (count <= MEM_SIZE_MAX / size)) {
441 #if defined(USE_MDH) || defined(DEBUGGING)
442         total_size = size * count;
443 #endif
444     }
445     else
446         croak_memory_wrap();
447 #ifdef USE_MDH
448     if (PERL_MEMORY_DEBUG_HEADER_SIZE <= MEM_SIZE_MAX - (MEM_SIZE)total_size)
449         total_size += PERL_MEMORY_DEBUG_HEADER_SIZE;
450     else
451         croak_memory_wrap();
452 #endif
453 #ifdef DEBUGGING
454     if ((SSize_t)size < 0 || (SSize_t)count < 0)
455         Perl_croak_nocontext("panic: calloc, size=%" UVuf ", count=%" UVuf,
456                              (UV)size, (UV)count);
457 #endif
458 #ifdef PERL_DEBUG_READONLY_COW
459     if ((ptr = mmap(0, total_size ? total_size : 1, PROT_READ|PROT_WRITE,
460                     MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
461         perror("mmap failed");
462         abort();
463     }
464 #elif defined(PERL_TRACK_MEMPOOL)
465     /* Have to use malloc() because we've added some space for our tracking
466        header.  */
467     /* malloc(0) is non-portable. */
468     ptr = (Malloc_t)PerlMem_malloc(total_size ? total_size : 1);
469 #else
470     /* Use calloc() because it might save a memset() if the memory is fresh
471        and clean from the OS.  */
472     if (count && size)
473         ptr = (Malloc_t)PerlMem_calloc(count, size);
474     else /* calloc(0) is non-portable. */
475         ptr = (Malloc_t)PerlMem_calloc(count ? count : 1, size ? size : 1);
476 #endif
477     PERL_ALLOC_CHECK(ptr);
478     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) calloc %zu x %zu = %zu bytes\n",PTR2UV(ptr),(long)PL_an++, count, size, total_size));
479     if (ptr != NULL) {
480 #ifdef USE_MDH
481         {
482             struct perl_memory_debug_header *const header
483                 = (struct perl_memory_debug_header *)ptr;
484 
485 #  ifndef PERL_DEBUG_READONLY_COW
486             memset((void*)ptr, 0, total_size);
487 #  endif
488 #  ifdef PERL_TRACK_MEMPOOL
489             header->interpreter = aTHX;
490             /* Link us into the list.  */
491             header->prev = &PL_memory_debug_header;
492             header->next = PL_memory_debug_header.next;
493             PL_memory_debug_header.next = header;
494             maybe_protect_rw(header->next);
495             header->next->prev = header;
496             maybe_protect_ro(header->next);
497 #    ifdef PERL_DEBUG_READONLY_COW
498             header->readonly = 0;
499 #    endif
500 #  endif
501 #  ifdef MDH_HAS_SIZE
502             header->size = total_size;
503 #  endif
504             ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
505         }
506 #endif
507         return ptr;
508     }
509     else {
510 #ifndef ALWAYS_NEED_THX
511         dTHX;
512 #endif
513         if (PL_nomemok)
514             return NULL;
515         croak_no_mem();
516     }
517 }
518 
519 /* These must be defined when not using Perl's malloc for binary
520  * compatibility */
521 
522 #ifndef MYMALLOC
523 
Perl_malloc(MEM_SIZE nbytes)524 Malloc_t Perl_malloc (MEM_SIZE nbytes)
525 {
526 #ifdef PERL_IMPLICIT_SYS
527     dTHX;
528 #endif
529     return (Malloc_t)PerlMem_malloc(nbytes);
530 }
531 
Perl_calloc(MEM_SIZE elements,MEM_SIZE size)532 Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
533 {
534 #ifdef PERL_IMPLICIT_SYS
535     dTHX;
536 #endif
537     return (Malloc_t)PerlMem_calloc(elements, size);
538 }
539 
Perl_realloc(Malloc_t where,MEM_SIZE nbytes)540 Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
541 {
542 #ifdef PERL_IMPLICIT_SYS
543     dTHX;
544 #endif
545     return (Malloc_t)PerlMem_realloc(where, nbytes);
546 }
547 
Perl_mfree(Malloc_t where)548 Free_t   Perl_mfree (Malloc_t where)
549 {
550 #ifdef PERL_IMPLICIT_SYS
551     dTHX;
552 #endif
553     PerlMem_free(where);
554 }
555 
556 #endif
557 
558 /* This is the value stored in *retlen in the two delimcpy routines below when
559  * there wasn't enough room in the destination to store everything it was asked
560  * to.  The value is deliberately very large so that hopefully if code uses it
561  * unquestioningly to access memory, it will likely segfault.  And it is small
562  * enough that if the caller does some arithmetic on it before accessing, it
563  * won't overflow into a small legal number. */
564 #define DELIMCPY_OUT_OF_BOUNDS_RET  I32_MAX
565 
566 /*
567 =for apidoc_section $string
568 =for apidoc delimcpy_no_escape
569 
570 Copy a source buffer to a destination buffer, stopping at (but not including)
571 the first occurrence in the source of the delimiter byte, C<delim>.  The source
572 is the bytes between S<C<from> and C<from_end> - 1>.  Similarly, the dest is
573 C<to> up to C<to_end>.
574 
575 The number of bytes copied is written to C<*retlen>.
576 
577 Returns the position of C<delim> in the C<from> buffer, but if there is no
578 such occurrence before C<from_end>, then C<from_end> is returned, and the entire
579 buffer S<C<from> .. C<from_end> - 1> is copied.
580 
581 If there is room in the destination available after the copy, an extra
582 terminating safety C<NUL> byte is appended (not included in the returned
583 length).
584 
585 The error case is if the destination buffer is not large enough to accommodate
586 everything that should be copied.  In this situation, a value larger than
587 S<C<to_end> - C<to>> is written to C<*retlen>, and as much of the source as
588 fits will be written to the destination.  Not having room for the safety C<NUL>
589 is not considered an error.
590 
591 =cut
592 */
593 char *
Perl_delimcpy_no_escape(char * to,const char * to_end,const char * from,const char * from_end,const int delim,I32 * retlen)594 Perl_delimcpy_no_escape(char *to, const char *to_end,
595                         const char *from, const char *from_end,
596                         const int delim, I32 *retlen)
597 {
598     const char * delim_pos;
599     Ptrdiff_t from_len = from_end - from;
600     Ptrdiff_t to_len = to_end - to;
601     SSize_t copy_len;
602 
603     PERL_ARGS_ASSERT_DELIMCPY_NO_ESCAPE;
604 
605     assert(from_len >= 0);
606     assert(to_len >= 0);
607 
608     /* Look for the first delimiter in the source */
609     delim_pos = (const char *) memchr(from, delim, from_len);
610 
611     /* Copy up to where the delimiter was found, or the entire buffer if not
612      * found */
613     copy_len = (delim_pos) ? delim_pos - from : from_len;
614 
615     /* If not enough room, copy as much as can fit, and set error return */
616     if (copy_len > to_len) {
617         Copy(from, to, to_len, char);
618         *retlen = DELIMCPY_OUT_OF_BOUNDS_RET;
619     }
620     else {
621         Copy(from, to, copy_len, char);
622 
623         /* If there is extra space available, add a trailing NUL */
624         if (copy_len < to_len) {
625             to[copy_len] = '\0';
626         }
627 
628         *retlen = copy_len;
629     }
630 
631     return (char *) from + copy_len;
632 }
633 
634 /*
635 =for apidoc delimcpy
636 
637 Copy a source buffer to a destination buffer, stopping at (but not including)
638 the first occurrence in the source of an unescaped (defined below) delimiter
639 byte, C<delim>.  The source is the bytes between S<C<from> and C<from_end> -
640 1>.  Similarly, the dest is C<to> up to C<to_end>.
641 
642 The number of bytes copied is written to C<*retlen>.
643 
644 Returns the position of the first uncopied C<delim> in the C<from> buffer, but
645 if there is no such occurrence before C<from_end>, then C<from_end> is returned,
646 and the entire buffer S<C<from> .. C<from_end> - 1> is copied.
647 
648 If there is room in the destination available after the copy, an extra
649 terminating safety C<NUL> byte is appended (not included in the returned
650 length).
651 
652 The error case is if the destination buffer is not large enough to accommodate
653 everything that should be copied.  In this situation, a value larger than
654 S<C<to_end> - C<to>> is written to C<*retlen>, and as much of the source as
655 fits will be written to the destination.  Not having room for the safety C<NUL>
656 is not considered an error.
657 
658 In the following examples, let C<x> be the delimiter, and C<0> represent a C<NUL>
659 byte (B<NOT> the digit C<0>).  Then we would have
660 
661   Source     Destination
662  abcxdef        abc0
663 
664 provided the destination buffer is at least 4 bytes long.
665 
666 An escaped delimiter is one which is immediately preceded by a single
667 backslash.  Escaped delimiters are copied, and the copy continues past the
668 delimiter; the backslash is not copied:
669 
670   Source       Destination
671  abc\xdef       abcxdef0
672 
673 (provided the destination buffer is at least 8 bytes long).
674 
675 It's actually somewhat more complicated than that. A sequence of any odd number
676 of backslashes escapes the following delimiter, and the copy continues with
677 exactly one of the backslashes stripped.
678 
679      Source         Destination
680      abc\xdef          abcxdef0
681    abc\\\xdef        abc\\xdef0
682  abc\\\\\xdef      abc\\\\xdef0
683 
684 (as always, if the destination is large enough)
685 
686 An even number of preceding backslashes does not escape the delimiter, so that
687 the copy stops just before it, and includes all the backslashes (no stripping;
688 zero is considered even):
689 
690       Source         Destination
691       abcxdef          abc0
692     abc\\xdef          abc\\0
693   abc\\\\xdef          abc\\\\0
694 
695 =cut
696 */
697 
698 char *
Perl_delimcpy(char * to,const char * to_end,const char * from,const char * from_end,const int delim,I32 * retlen)699 Perl_delimcpy(char *to, const char *to_end,
700               const char *from, const char *from_end,
701               const int delim, I32 *retlen)
702 {
703     const char * const orig_to = to;
704     Ptrdiff_t copy_len = 0;
705     bool stopped_early = FALSE;     /* Ran out of room to copy to */
706 
707     PERL_ARGS_ASSERT_DELIMCPY;
708     assert(from_end >= from);
709     assert(to_end >= to);
710 
711     /* Don't use the loop for the trivial case of the first character being the
712      * delimiter; otherwise would have to worry inside the loop about backing
713      * up before the start of 'from' */
714     if (LIKELY(from_end > from && *from != delim)) {
715         while ((copy_len = from_end - from) > 0) {
716             const char * backslash_pos;
717             const char * delim_pos;
718 
719             /* Look for the next delimiter in the remaining portion of the
720              * source. A loop invariant is that we already know that the copy
721              * should include *from; this comes from the conditional before the
722              * loop, and how we set things up at the end of each iteration */
723             delim_pos = (const char *) memchr(from + 1, delim, copy_len - 1);
724 
725             /* If didn't find it, done looking; set up so copies all of the
726              * source */
727             if (! delim_pos) {
728                 copy_len = from_end - from;
729                 break;
730             }
731 
732             /* Look for a backslash immediately before the delimiter */
733             backslash_pos = delim_pos - 1;
734 
735             /* If the delimiter is not escaped, this ends the copy */
736             if (*backslash_pos != '\\') {
737                 copy_len = delim_pos - from;
738                 break;
739             }
740 
741             /* Here there is a backslash just before the delimiter, but it
742              * could be the final backslash in a sequence of them.  Backup to
743              * find the first one in it. */
744             do {
745                 backslash_pos--;
746             }
747             while (backslash_pos >= from && *backslash_pos == '\\');
748 
749             /* If the number of backslashes is even, they just escape one
750              * another, leaving the delimiter unescaped, and stopping the copy.
751              * */
752             if (! ((delim_pos - (backslash_pos + 1)) & 1)) {
753                 copy_len = delim_pos - from;  /* even, copy up to delimiter */
754                 break;
755             }
756 
757             /* Here is odd, so the delimiter is escaped.  We will try to copy
758              * all but the final backslash in the sequence */
759             copy_len = delim_pos - 1 - from;
760 
761             /* Do the copy, but not beyond the end of the destination */
762             if (copy_len >= to_end - to) {
763                 Copy(from, to, to_end - to, char);
764                 stopped_early = TRUE;
765                 to = (char *) to_end;
766             }
767             else {
768                 Copy(from, to, copy_len, char);
769                 to += copy_len;
770             }
771 
772             /* Set up so next iteration will include the delimiter */
773             from = delim_pos;
774         }
775     }
776 
777     /* Here, have found the final segment to copy.  Copy that, but not beyond
778      * the size of the destination.  If not enough room, copy as much as can
779      * fit, and set error return */
780     if (stopped_early || copy_len > to_end - to) {
781         Copy(from, to, to_end - to, char);
782         *retlen = DELIMCPY_OUT_OF_BOUNDS_RET;
783     }
784     else {
785         Copy(from, to, copy_len, char);
786 
787         to += copy_len;
788 
789         /* If there is extra space available, add a trailing NUL */
790         if (to < to_end) {
791             *to = '\0';
792         }
793 
794         *retlen = to - orig_to;
795     }
796 
797     return (char *) from + copy_len;
798 }
799 
800 /*
801 =for apidoc ninstr
802 
803 Find the first (leftmost) occurrence of a sequence of bytes within another
804 sequence.  This is the Perl version of C<strstr()>, extended to handle
805 arbitrary sequences, potentially containing embedded C<NUL> characters (C<NUL>
806 is what the initial C<n> in the function name stands for; some systems have an
807 equivalent, C<memmem()>, but with a somewhat different API).
808 
809 Another way of thinking about this function is finding a needle in a haystack.
810 C<big> points to the first byte in the haystack.  C<big_end> points to one byte
811 beyond the final byte in the haystack.  C<little> points to the first byte in
812 the needle.  C<little_end> points to one byte beyond the final byte in the
813 needle.  All the parameters must be non-C<NULL>.
814 
815 The function returns C<NULL> if there is no occurrence of C<little> within
816 C<big>.  If C<little> is the empty string, C<big> is returned.
817 
818 Because this function operates at the byte level, and because of the inherent
819 characteristics of UTF-8 (or UTF-EBCDIC), it will work properly if both the
820 needle and the haystack are strings with the same UTF-8ness, but not if the
821 UTF-8ness differs.
822 
823 =cut
824 
825 */
826 
827 char *
Perl_ninstr(const char * big,const char * bigend,const char * little,const char * lend)828 Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend)
829 {
830     PERL_ARGS_ASSERT_NINSTR;
831 
832 #ifdef HAS_MEMMEM
833     return ninstr(big, bigend, little, lend);
834 #else
835 
836     if (little >= lend) {
837         return (char*) big;
838     }
839     else {
840         const U8 first = *little;
841         Size_t lsize;
842 
843         /* No match can start closer to the end of the haystack than the length
844          * of the needle. */
845         bigend -= lend - little;
846         little++;       /* Look for 'first', then the remainder is in here */
847         lsize = lend - little;
848 
849         while (big <= bigend) {
850             big = (char *) memchr((U8 *) big, first, bigend - big + 1);
851             if (big == NULL || big > bigend) {
852                 return NULL;
853             }
854 
855             if (memEQ(big + 1, little, lsize)) {
856                 return (char*) big;
857             }
858             big++;
859         }
860     }
861 
862     return NULL;
863 
864 #endif
865 
866 }
867 
868 /*
869 =for apidoc rninstr
870 
871 Like C<L</ninstr>>, but instead finds the final (rightmost) occurrence of a
872 sequence of bytes within another sequence, returning C<NULL> if there is no
873 such occurrence.
874 
875 =cut
876 
877 */
878 
879 char *
Perl_rninstr(const char * big,const char * bigend,const char * little,const char * lend)880 Perl_rninstr(const char *big, const char *bigend, const char *little, const char *lend)
881 {
882     const Ptrdiff_t little_len = lend - little;
883     const Ptrdiff_t big_len = bigend - big;
884 
885     PERL_ARGS_ASSERT_RNINSTR;
886 
887     /* A non-existent needle trivially matches the rightmost possible position
888      * in the haystack */
889     if (UNLIKELY(little_len <= 0)) {
890         return (char*)bigend;
891     }
892 
893     /* If the needle is larger than the haystack, the needle can't possibly fit
894      * inside the haystack. */
895     if (UNLIKELY(little_len > big_len)) {
896         return NULL;
897     }
898 
899     /* Special case length 1 needles.  It's trivial if we have memrchr();
900      * and otherwise we just do a per-byte search backwards.
901      *
902      * XXX When we don't have memrchr, we could use something like
903      * S_find_next_masked( or S_find_span_end() to do per-word searches */
904     if (little_len == 1) {
905         const char final = *little;
906 
907 #ifdef HAS_MEMRCHR
908 
909         return (char *) memrchr(big, final, big_len);
910 #else
911         const char * cur = bigend - 1;
912 
913         do {
914             if (*cur == final) {
915                 return (char *) cur;
916             }
917         } while (--cur >= big);
918 
919         return NULL;
920 #endif
921 
922     }
923     else {  /* Below, the needle is longer than a single byte */
924 
925         /* We search backwards in the haystack for the final character of the
926          * needle.  Each time one is found, we see if the characters just
927          * before it in the haystack match the rest of the needle. */
928         const char final = *(lend - 1);
929 
930         /* What matches consists of 'little_len'-1 characters, then the final
931          * one */
932         const Size_t prefix_len = little_len - 1;
933 
934         /* If the final character in the needle is any closer than this to the
935          * left edge, there wouldn't be enough room for all of it to fit in the
936          * haystack */
937         const char * const left_fence = big + prefix_len;
938 
939         /* Start at the right edge */
940         char * cur = (char *) bigend;
941 
942         /* memrchr() makes the search easy (and fast); otherwise, look
943          * backwards byte-by-byte. */
944         do {
945 
946 #ifdef HAS_MEMRCHR
947 
948             cur = (char *) memrchr(left_fence, final, cur - left_fence);
949             if (cur == NULL) {
950                 return NULL;
951             }
952 #else
953             do {
954                 cur--;
955                 if (cur < left_fence) {
956                     return NULL;
957                 }
958             }
959             while (*cur != final);
960 #endif
961 
962             /* Here, we know that *cur is 'final'; see if the preceding bytes
963              * of the needle also match the corresponding haystack bytes */
964             if memEQ(cur - prefix_len, little, prefix_len) {
965                 return cur - prefix_len;
966             }
967         } while (cur > left_fence);
968 
969         return NULL;
970     }
971 }
972 
973 /* As a space optimization, we do not compile tables for strings of length
974    0 and 1, and for strings of length 2 unless FBMcf_TAIL.  These are
975    special-cased in fbm_instr().
976 
977    If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
978 
979 /*
980 
981 =for apidoc fbm_compile
982 
983 Analyzes the string in order to make fast searches on it using C<fbm_instr()>
984 -- the Boyer-Moore algorithm.
985 
986 =cut
987 */
988 
989 void
Perl_fbm_compile(pTHX_ SV * sv,U32 flags)990 Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
991 {
992     const U8 *s;
993     STRLEN i;
994     STRLEN len;
995     MAGIC *mg;
996 
997     PERL_ARGS_ASSERT_FBM_COMPILE;
998 
999     if (isGV_with_GP(sv) || SvROK(sv))
1000         return;
1001 
1002     if (SvVALID(sv))
1003         return;
1004 
1005     if (flags & FBMcf_TAIL) {
1006         MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
1007         sv_catpvs(sv, "\n");		/* Taken into account in fbm_instr() */
1008         if (mg && mg->mg_len >= 0)
1009             mg->mg_len++;
1010     }
1011     if (!SvPOK(sv) || SvNIOKp(sv))
1012         s = (U8*)SvPV_force_mutable(sv, len);
1013     else s = (U8 *)SvPV_mutable(sv, len);
1014     if (len == 0)		/* TAIL might be on a zero-length string. */
1015         return;
1016     SvUPGRADE(sv, SVt_PVMG);
1017     SvIOK_off(sv);
1018     SvNOK_off(sv);
1019 
1020     /* add PERL_MAGIC_bm magic holding the FBM lookup table */
1021 
1022     assert(!mg_find(sv, PERL_MAGIC_bm));
1023     mg = sv_magicext(sv, NULL, PERL_MAGIC_bm, &PL_vtbl_bm, NULL, 0);
1024     assert(mg);
1025 
1026     if (len > 2) {
1027         /* Shorter strings are special-cased in Perl_fbm_instr(), and don't use
1028            the BM table.  */
1029         const U8 mlen = (len>255) ? 255 : (U8)len;
1030         const unsigned char *const sb = s + len - mlen; /* first char (maybe) */
1031         U8 *table;
1032 
1033         Newx(table, 256, U8);
1034         memset((void*)table, mlen, 256);
1035         mg->mg_ptr = (char *)table;
1036         mg->mg_len = 256;
1037 
1038         s += len - 1; /* last char */
1039         i = 0;
1040         while (s >= sb) {
1041             if (table[*s] == mlen)
1042                 table[*s] = (U8)i;
1043             s--, i++;
1044         }
1045     }
1046 
1047     BmUSEFUL(sv) = 100;			/* Initial value */
1048     ((XPVNV*)SvANY(sv))->xnv_u.xnv_bm_tail = cBOOL(flags & FBMcf_TAIL);
1049 }
1050 
1051 
1052 /*
1053 =for apidoc fbm_instr
1054 
1055 Returns the location of the SV in the string delimited by C<big> and
1056 C<bigend> (C<bigend>) is the char following the last char).
1057 It returns C<NULL> if the string can't be found.  The C<sv>
1058 does not have to be C<fbm_compiled>, but the search will not be as fast
1059 then.
1060 
1061 =cut
1062 
1063 If SvTAIL(littlestr) is true, a fake "\n" was appended to the string
1064 during FBM compilation due to FBMcf_TAIL in flags. It indicates that
1065 the littlestr must be anchored to the end of bigstr (or to any \n if
1066 FBMrf_MULTILINE).
1067 
1068 E.g. The regex compiler would compile /abc/ to a littlestr of "abc",
1069 while /abc$/ compiles to "abc\n" with SvTAIL() true.
1070 
1071 A littlestr of "abc", !SvTAIL matches as /abc/;
1072 a littlestr of "ab\n", SvTAIL matches as:
1073    without FBMrf_MULTILINE: /ab\n?\z/
1074    with    FBMrf_MULTILINE: /ab\n/ || /ab\z/;
1075 
1076 (According to Ilya from 1999; I don't know if this is still true, DAPM 2015):
1077   "If SvTAIL is actually due to \Z or \z, this gives false positives
1078   if multiline".
1079 */
1080 
1081 
1082 char *
Perl_fbm_instr(pTHX_ unsigned char * big,unsigned char * bigend,SV * littlestr,U32 flags)1083 Perl_fbm_instr(pTHX_ unsigned char *big, unsigned char *bigend, SV *littlestr, U32 flags)
1084 {
1085     unsigned char *s;
1086     STRLEN l;
1087     const unsigned char *little = (const unsigned char *)SvPV_const(littlestr,l);
1088     STRLEN littlelen = l;
1089     const I32 multiline = flags & FBMrf_MULTILINE;
1090     bool valid = SvVALID(littlestr);
1091     bool tail = valid ? cBOOL(SvTAIL(littlestr)) : FALSE;
1092 
1093     PERL_ARGS_ASSERT_FBM_INSTR;
1094 
1095     assert(bigend >= big);
1096 
1097     if ((STRLEN)(bigend - big) < littlelen) {
1098         if (     tail
1099              && ((STRLEN)(bigend - big) == littlelen - 1)
1100              && (littlelen == 1
1101                  || (*big == *little &&
1102                      memEQ((char *)big, (char *)little, littlelen - 1))))
1103             return (char*)big;
1104         return NULL;
1105     }
1106 
1107     switch (littlelen) { /* Special cases for 0, 1 and 2  */
1108     case 0:
1109         return (char*)big;		/* Cannot be SvTAIL! */
1110 
1111     case 1:
1112             if (tail && !multiline) /* Anchor only! */
1113                 /* [-1] is safe because we know that bigend != big.  */
1114                 return (char *) (bigend - (bigend[-1] == '\n'));
1115 
1116             s = (unsigned char *)memchr((void*)big, *little, bigend-big);
1117             if (s)
1118                 return (char *)s;
1119             if (tail)
1120                 return (char *) bigend;
1121             return NULL;
1122 
1123     case 2:
1124         if (tail && !multiline) {
1125             /* a littlestr with SvTAIL must be of the form "X\n" (where X
1126              * is a single char). It is anchored, and can only match
1127              * "....X\n"  or  "....X" */
1128             if (bigend[-2] == *little && bigend[-1] == '\n')
1129                 return (char*)bigend - 2;
1130             if (bigend[-1] == *little)
1131                 return (char*)bigend - 1;
1132             return NULL;
1133         }
1134 
1135         {
1136             /* memchr() is likely to be very fast, possibly using whatever
1137              * hardware support is available, such as checking a whole
1138              * cache line in one instruction.
1139              * So for a 2 char pattern, calling memchr() is likely to be
1140              * faster than running FBM, or rolling our own. The previous
1141              * version of this code was roll-your-own which typically
1142              * only needed to read every 2nd char, which was good back in
1143              * the day, but no longer.
1144              */
1145             unsigned char c1 = little[0];
1146             unsigned char c2 = little[1];
1147 
1148             /* *** for all this case, bigend points to the last char,
1149              * not the trailing \0: this makes the conditions slightly
1150              * simpler */
1151             bigend--;
1152             s = big;
1153             if (c1 != c2) {
1154                 while (s < bigend) {
1155                     /* do a quick test for c1 before calling memchr();
1156                      * this avoids the expensive fn call overhead when
1157                      * there are lots of c1's */
1158                     if (LIKELY(*s != c1)) {
1159                         s++;
1160                         s = (unsigned char *)memchr((void*)s, c1, bigend - s);
1161                         if (!s)
1162                             break;
1163                     }
1164                     if (s[1] == c2)
1165                         return (char*)s;
1166 
1167                     /* failed; try searching for c2 this time; that way
1168                      * we don't go pathologically slow when the string
1169                      * consists mostly of c1's or vice versa.
1170                      */
1171                     s += 2;
1172                     if (s > bigend)
1173                         break;
1174                     s = (unsigned char *)memchr((void*)s, c2, bigend - s + 1);
1175                     if (!s)
1176                         break;
1177                     if (s[-1] == c1)
1178                         return (char*)s - 1;
1179                 }
1180             }
1181             else {
1182                 /* c1, c2 the same */
1183                 while (s < bigend) {
1184                     if (s[0] == c1) {
1185                       got_1char:
1186                         if (s[1] == c1)
1187                             return (char*)s;
1188                         s += 2;
1189                     }
1190                     else {
1191                         s++;
1192                         s = (unsigned char *)memchr((void*)s, c1, bigend - s);
1193                         if (!s || s >= bigend)
1194                             break;
1195                         goto got_1char;
1196                     }
1197                 }
1198             }
1199 
1200             /* failed to find 2 chars; try anchored match at end without
1201              * the \n */
1202             if (tail && bigend[0] == little[0])
1203                 return (char *)bigend;
1204             return NULL;
1205         }
1206 
1207     default:
1208         break; /* Only lengths 0 1 and 2 have special-case code.  */
1209     }
1210 
1211     if (tail && !multiline) {	/* tail anchored? */
1212         s = bigend - littlelen;
1213         if (s >= big && bigend[-1] == '\n' && *s == *little
1214             /* Automatically of length > 2 */
1215             && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
1216         {
1217             return (char*)s;		/* how sweet it is */
1218         }
1219         if (s[1] == *little
1220             && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
1221         {
1222             return (char*)s + 1;	/* how sweet it is */
1223         }
1224         return NULL;
1225     }
1226 
1227     if (!valid) {
1228         /* not compiled; use Perl_ninstr() instead */
1229         char * const b = ninstr((char*)big,(char*)bigend,
1230                          (char*)little, (char*)little + littlelen);
1231 
1232         assert(!tail); /* valid => FBM; tail only set on SvVALID SVs */
1233         return b;
1234     }
1235 
1236     /* Do actual FBM.  */
1237     if (littlelen > (STRLEN)(bigend - big))
1238         return NULL;
1239 
1240     {
1241         const MAGIC *const mg = mg_find(littlestr, PERL_MAGIC_bm);
1242         const unsigned char *oldlittle;
1243 
1244         assert(mg);
1245 
1246         --littlelen;			/* Last char found by table lookup */
1247 
1248         s = big + littlelen;
1249         little += littlelen;		/* last char */
1250         oldlittle = little;
1251         if (s < bigend) {
1252             const unsigned char * const table = (const unsigned char *) mg->mg_ptr;
1253             const unsigned char lastc = *little;
1254             I32 tmp;
1255 
1256           top2:
1257             if ((tmp = table[*s])) {
1258                 /* *s != lastc; earliest position it could match now is
1259                  * tmp slots further on */
1260                 if ((s += tmp) >= bigend)
1261                     goto check_end;
1262                 if (LIKELY(*s != lastc)) {
1263                     s++;
1264                     s = (unsigned char *)memchr((void*)s, lastc, bigend - s);
1265                     if (!s) {
1266                         s = bigend;
1267                         goto check_end;
1268                     }
1269                     goto top2;
1270                 }
1271             }
1272 
1273 
1274             /* hand-rolled strncmp(): less expensive than calling the
1275              * real function (maybe???) */
1276             {
1277                 unsigned char * const olds = s;
1278 
1279                 tmp = littlelen;
1280 
1281                 while (tmp--) {
1282                     if (*--s == *--little)
1283                         continue;
1284                     s = olds + 1;	/* here we pay the price for failure */
1285                     little = oldlittle;
1286                     if (s < bigend)	/* fake up continue to outer loop */
1287                         goto top2;
1288                     goto check_end;
1289                 }
1290                 return (char *)s;
1291             }
1292         }
1293       check_end:
1294         if ( s == bigend
1295              && tail
1296              && memEQ((char *)(bigend - littlelen),
1297                       (char *)(oldlittle - littlelen), littlelen) )
1298             return (char*)bigend - littlelen;
1299         return NULL;
1300     }
1301 }
1302 
1303 const char *
Perl_cntrl_to_mnemonic(const U8 c)1304 Perl_cntrl_to_mnemonic(const U8 c)
1305 {
1306     /* Returns the mnemonic string that represents character 'c', if one
1307      * exists; NULL otherwise.  The only ones that exist for the purposes of
1308      * this routine are a few control characters */
1309 
1310     switch (c) {
1311         case '\a':       return "\\a";
1312         case '\b':       return "\\b";
1313         case ESC_NATIVE: return "\\e";
1314         case '\f':       return "\\f";
1315         case '\n':       return "\\n";
1316         case '\r':       return "\\r";
1317         case '\t':       return "\\t";
1318     }
1319 
1320     return NULL;
1321 }
1322 
1323 /*
1324 =for apidoc savesharedpv
1325 
1326 A version of C<savepv()> which allocates the duplicate string in memory
1327 which is shared between threads.
1328 
1329 =cut
1330 */
1331 char *
Perl_savesharedpv(pTHX_ const char * pv)1332 Perl_savesharedpv(pTHX_ const char *pv)
1333 {
1334     char *newaddr;
1335     STRLEN pvlen;
1336 
1337     PERL_UNUSED_CONTEXT;
1338 
1339     if (!pv)
1340         return NULL;
1341 
1342     pvlen = strlen(pv)+1;
1343     newaddr = (char*)PerlMemShared_malloc(pvlen);
1344     if (!newaddr) {
1345         croak_no_mem();
1346     }
1347     return (char*)memcpy(newaddr, pv, pvlen);
1348 }
1349 
1350 /*
1351 =for apidoc savesharedpvn
1352 
1353 A version of C<savepvn()> which allocates the duplicate string in memory
1354 which is shared between threads.  (With the specific difference that a C<NULL>
1355 pointer is not acceptable)
1356 
1357 =cut
1358 */
1359 char *
Perl_savesharedpvn(pTHX_ const char * const pv,const STRLEN len)1360 Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
1361 {
1362     char *const newaddr = (char*)PerlMemShared_malloc(len + 1);
1363 
1364     PERL_UNUSED_CONTEXT;
1365     /* PERL_ARGS_ASSERT_SAVESHAREDPVN; */
1366 
1367     if (!newaddr) {
1368         croak_no_mem();
1369     }
1370     newaddr[len] = '\0';
1371     return (char*)memcpy(newaddr, pv, len);
1372 }
1373 
1374 /* the SV for Perl_form() and mess() is not kept in an arena */
1375 
1376 STATIC SV *
S_mess_alloc(pTHX)1377 S_mess_alloc(pTHX)
1378 {
1379     SV *sv;
1380     XPVMG *any;
1381 
1382     if (PL_phase != PERL_PHASE_DESTRUCT)
1383         return newSVpvs_flags("", SVs_TEMP);
1384 
1385     if (PL_mess_sv)
1386         return PL_mess_sv;
1387 
1388     /* Create as PVMG now, to avoid any upgrading later */
1389     Newx(sv, 1, SV);
1390     Newxz(any, 1, XPVMG);
1391     SvFLAGS(sv) = SVt_PVMG;
1392     SvANY(sv) = (void*)any;
1393     SvPV_set(sv, NULL);
1394     SvREFCNT(sv) = 1 << 30; /* practically infinite */
1395     PL_mess_sv = sv;
1396     return sv;
1397 }
1398 
1399 #if defined(MULTIPLICITY)
1400 char *
Perl_form_nocontext(const char * pat,...)1401 Perl_form_nocontext(const char* pat, ...)
1402 {
1403     dTHX;
1404     char *retval;
1405     va_list args;
1406     PERL_ARGS_ASSERT_FORM_NOCONTEXT;
1407     va_start(args, pat);
1408     retval = vform(pat, &args);
1409     va_end(args);
1410     return retval;
1411 }
1412 #endif /* MULTIPLICITY */
1413 
1414 /*
1415 =for apidoc_section $display
1416 =for apidoc form
1417 =for apidoc_item form_nocontext
1418 
1419 These take a sprintf-style format pattern and conventional
1420 (non-SV) arguments and return the formatted string.
1421 
1422     (char *) Perl_form(pTHX_ const char* pat, ...)
1423 
1424 can be used any place a string (char *) is required:
1425 
1426     char * s = Perl_form("%d.%d",major,minor);
1427 
1428 They use a single (per-thread) private buffer so if you want to format several
1429 strings you must explicitly copy the earlier strings away (and free the copies
1430 when you are done).
1431 
1432 The two forms differ only in that C<form_nocontext> does not take a thread
1433 context (C<aTHX>) parameter, so is used in situations where the caller doesn't
1434 already have the thread context.
1435 
1436 =for apidoc vform
1437 Like C<L</form>> but but the arguments are an encapsulated argument list.
1438 
1439 =cut
1440 */
1441 
1442 char *
Perl_form(pTHX_ const char * pat,...)1443 Perl_form(pTHX_ const char* pat, ...)
1444 {
1445     char *retval;
1446     va_list args;
1447     PERL_ARGS_ASSERT_FORM;
1448     va_start(args, pat);
1449     retval = vform(pat, &args);
1450     va_end(args);
1451     return retval;
1452 }
1453 
1454 char *
Perl_vform(pTHX_ const char * pat,va_list * args)1455 Perl_vform(pTHX_ const char *pat, va_list *args)
1456 {
1457     SV * const sv = mess_alloc();
1458     PERL_ARGS_ASSERT_VFORM;
1459     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1460     return SvPVX(sv);
1461 }
1462 
1463 /*
1464 =for apidoc mess
1465 =for apidoc_item mess_nocontext
1466 
1467 These take a sprintf-style format pattern and argument list, which are used to
1468 generate a string message.  If the message does not end with a newline, then it
1469 will be extended with some indication of the current location in the code, as
1470 described for C<L</mess_sv>>.
1471 
1472 Normally, the resulting message is returned in a new mortal SV.
1473 But during global destruction a single SV may be shared between uses of
1474 this function.
1475 
1476 The two forms differ only in that C<mess_nocontext> does not take a thread
1477 context (C<aTHX>) parameter, so is used in situations where the caller doesn't
1478 already have the thread context.
1479 
1480 =cut
1481 */
1482 
1483 #if defined(MULTIPLICITY)
1484 SV *
Perl_mess_nocontext(const char * pat,...)1485 Perl_mess_nocontext(const char *pat, ...)
1486 {
1487     dTHX;
1488     SV *retval;
1489     va_list args;
1490     PERL_ARGS_ASSERT_MESS_NOCONTEXT;
1491     va_start(args, pat);
1492     retval = vmess(pat, &args);
1493     va_end(args);
1494     return retval;
1495 }
1496 #endif /* MULTIPLICITY */
1497 
1498 SV *
Perl_mess(pTHX_ const char * pat,...)1499 Perl_mess(pTHX_ const char *pat, ...)
1500 {
1501     SV *retval;
1502     va_list args;
1503     PERL_ARGS_ASSERT_MESS;
1504     va_start(args, pat);
1505     retval = vmess(pat, &args);
1506     va_end(args);
1507     return retval;
1508 }
1509 
1510 const COP*
Perl_closest_cop(pTHX_ const COP * cop,const OP * o,const OP * curop,bool opnext)1511 Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop,
1512                        bool opnext)
1513 {
1514     /* Look for curop starting from o.  cop is the last COP we've seen. */
1515     /* opnext means that curop is actually the ->op_next of the op we are
1516        seeking. */
1517 
1518     PERL_ARGS_ASSERT_CLOSEST_COP;
1519 
1520     if (!o || !curop || (
1521         opnext ? o->op_next == curop && o->op_type != OP_SCOPE : o == curop
1522     ))
1523         return cop;
1524 
1525     if (o->op_flags & OPf_KIDS) {
1526         const OP *kid;
1527         for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
1528             const COP *new_cop;
1529 
1530             /* If the OP_NEXTSTATE has been optimised away we can still use it
1531              * the get the file and line number. */
1532 
1533             if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
1534                 cop = (const COP *)kid;
1535 
1536             /* Keep searching, and return when we've found something. */
1537 
1538             new_cop = closest_cop(cop, kid, curop, opnext);
1539             if (new_cop)
1540                 return new_cop;
1541         }
1542     }
1543 
1544     /* Nothing found. */
1545 
1546     return NULL;
1547 }
1548 
1549 /*
1550 =for apidoc mess_sv
1551 
1552 Expands a message, intended for the user, to include an indication of
1553 the current location in the code, if the message does not already appear
1554 to be complete.
1555 
1556 C<basemsg> is the initial message or object.  If it is a reference, it
1557 will be used as-is and will be the result of this function.  Otherwise it
1558 is used as a string, and if it already ends with a newline, it is taken
1559 to be complete, and the result of this function will be the same string.
1560 If the message does not end with a newline, then a segment such as C<at
1561 foo.pl line 37> will be appended, and possibly other clauses indicating
1562 the current state of execution.  The resulting message will end with a
1563 dot and a newline.
1564 
1565 Normally, the resulting message is returned in a new mortal SV.
1566 During global destruction a single SV may be shared between uses of this
1567 function.  If C<consume> is true, then the function is permitted (but not
1568 required) to modify and return C<basemsg> instead of allocating a new SV.
1569 
1570 =cut
1571 */
1572 
1573 SV *
Perl_mess_sv(pTHX_ SV * basemsg,bool consume)1574 Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
1575 {
1576     SV *sv;
1577 
1578 #if defined(USE_C_BACKTRACE) && defined(USE_C_BACKTRACE_ON_ERROR)
1579     {
1580         char *ws;
1581         UV wi;
1582         /* The PERL_C_BACKTRACE_ON_WARN must be an integer of one or more. */
1583         if ((ws = PerlEnv_getenv("PERL_C_BACKTRACE_ON_ERROR"))
1584             && grok_atoUV(ws, &wi, NULL)
1585             && wi <= PERL_INT_MAX
1586         ) {
1587             Perl_dump_c_backtrace(aTHX_ Perl_debug_log, (int)wi, 1);
1588         }
1589     }
1590 #endif
1591 
1592     PERL_ARGS_ASSERT_MESS_SV;
1593 
1594     if (SvROK(basemsg)) {
1595         if (consume) {
1596             sv = basemsg;
1597         }
1598         else {
1599             sv = mess_alloc();
1600             sv_setsv(sv, basemsg);
1601         }
1602         return sv;
1603     }
1604 
1605     if (SvPOK(basemsg) && consume) {
1606         sv = basemsg;
1607     }
1608     else {
1609         sv = mess_alloc();
1610         sv_copypv(sv, basemsg);
1611     }
1612 
1613     if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
1614         /*
1615          * Try and find the file and line for PL_op.  This will usually be
1616          * PL_curcop, but it might be a cop that has been optimised away.  We
1617          * can try to find such a cop by searching through the optree starting
1618          * from the sibling of PL_curcop.
1619          */
1620 
1621         if (PL_curcop) {
1622             const COP *cop =
1623                 closest_cop(PL_curcop, OpSIBLING(PL_curcop), PL_op, FALSE);
1624             if (!cop)
1625                 cop = PL_curcop;
1626 
1627             if (CopLINE(cop))
1628                 Perl_sv_catpvf(aTHX_ sv, " at %s line %" LINE_Tf,
1629                                 OutCopFILE(cop), CopLINE(cop));
1630         }
1631 
1632         /* Seems that GvIO() can be untrustworthy during global destruction. */
1633         if (GvIO(PL_last_in_gv) && (SvTYPE(GvIOp(PL_last_in_gv)) == SVt_PVIO)
1634                 && IoLINES(GvIOp(PL_last_in_gv)))
1635         {
1636             STRLEN l;
1637             const bool line_mode = (RsSIMPLE(PL_rs) &&
1638                                    *SvPV_const(PL_rs,l) == '\n' && l == 1);
1639             Perl_sv_catpvf(aTHX_ sv, ", <%" SVf "> %s %" IVdf,
1640                            SVfARG(PL_last_in_gv == PL_argvgv
1641                                  ? &PL_sv_no
1642                                  : newSVhek_mortal(GvNAME_HEK(PL_last_in_gv))),
1643                            line_mode ? "line" : "chunk",
1644                            (IV)IoLINES(GvIOp(PL_last_in_gv)));
1645         }
1646         if (PL_phase == PERL_PHASE_DESTRUCT)
1647             sv_catpvs(sv, " during global destruction");
1648         sv_catpvs(sv, ".\n");
1649     }
1650     return sv;
1651 }
1652 
1653 /*
1654 =for apidoc vmess
1655 
1656 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1657 argument list, respectively.  These are used to generate a string message.  If
1658 the
1659 message does not end with a newline, then it will be extended with
1660 some indication of the current location in the code, as described for
1661 L</mess_sv>.
1662 
1663 Normally, the resulting message is returned in a new mortal SV.
1664 During global destruction a single SV may be shared between uses of
1665 this function.
1666 
1667 =cut
1668 */
1669 
1670 SV *
Perl_vmess(pTHX_ const char * pat,va_list * args)1671 Perl_vmess(pTHX_ const char *pat, va_list *args)
1672 {
1673     SV * const sv = mess_alloc();
1674 
1675     PERL_ARGS_ASSERT_VMESS;
1676 
1677     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1678     return mess_sv(sv, 1);
1679 }
1680 
1681 void
Perl_write_to_stderr(pTHX_ SV * msv)1682 Perl_write_to_stderr(pTHX_ SV* msv)
1683 {
1684     IO *io;
1685     MAGIC *mg;
1686 
1687     PERL_ARGS_ASSERT_WRITE_TO_STDERR;
1688 
1689     if (PL_stderrgv && SvREFCNT(PL_stderrgv)
1690         && (io = GvIO(PL_stderrgv))
1691         && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
1692         Perl_magic_methcall(aTHX_ MUTABLE_SV(io), mg, SV_CONST(PRINT),
1693                             G_SCALAR | G_DISCARD | G_WRITING_TO_STDERR, 1, msv);
1694     else {
1695         PerlIO * const serr = Perl_error_log;
1696 
1697         do_print(msv, serr);
1698         (void)PerlIO_flush(serr);
1699     }
1700 }
1701 
1702 /*
1703 =for apidoc_section $warning
1704 */
1705 
1706 /* Common code used in dieing and warning */
1707 
1708 STATIC SV *
S_with_queued_errors(pTHX_ SV * ex)1709 S_with_queued_errors(pTHX_ SV *ex)
1710 {
1711     PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS;
1712     if (PL_errors && SvCUR(PL_errors) && !SvROK(ex)) {
1713         sv_catsv(PL_errors, ex);
1714         ex = sv_mortalcopy(PL_errors);
1715         SvCUR_set(PL_errors, 0);
1716     }
1717     return ex;
1718 }
1719 
1720 bool
Perl_invoke_exception_hook(pTHX_ SV * ex,bool warn)1721 Perl_invoke_exception_hook(pTHX_ SV *ex, bool warn)
1722 {
1723     HV *stash;
1724     GV *gv;
1725     CV *cv;
1726     SV **const hook = warn ? &PL_warnhook : &PL_diehook;
1727     /* sv_2cv might call Perl_croak() or Perl_warner() */
1728     SV * const oldhook = *hook;
1729 
1730     if (!oldhook || oldhook == PERL_WARNHOOK_FATAL)
1731         return FALSE;
1732 
1733     ENTER;
1734     SAVESPTR(*hook);
1735     *hook = NULL;
1736     cv = sv_2cv(oldhook, &stash, &gv, 0);
1737     LEAVE;
1738     if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1739         dSP;
1740         SV *exarg;
1741 
1742         ENTER;
1743         save_re_context();
1744         if (warn) {
1745             SAVESPTR(*hook);
1746             *hook = NULL;
1747         }
1748         exarg = newSVsv(ex);
1749         SvREADONLY_on(exarg);
1750         SAVEFREESV(exarg);
1751 
1752         PUSHSTACKi(warn ? PERLSI_WARNHOOK : PERLSI_DIEHOOK);
1753         PUSHMARK(SP);
1754         XPUSHs(exarg);
1755         PUTBACK;
1756         call_sv(MUTABLE_SV(cv), G_DISCARD);
1757         POPSTACK;
1758         LEAVE;
1759         return TRUE;
1760     }
1761     return FALSE;
1762 }
1763 
1764 /*
1765 =for apidoc die_sv
1766 
1767 This behaves the same as L</croak_sv>, except for the return type.
1768 It should be used only where the C<OP *> return type is required.
1769 The function never actually returns.
1770 
1771 =cut
1772 */
1773 
1774 /* silence __declspec(noreturn) warnings */
1775 MSVC_DIAG_IGNORE(4646 4645)
1776 OP *
Perl_die_sv(pTHX_ SV * baseex)1777 Perl_die_sv(pTHX_ SV *baseex)
1778 {
1779     PERL_ARGS_ASSERT_DIE_SV;
1780     croak_sv(baseex);
1781     /* NOTREACHED */
1782     NORETURN_FUNCTION_END;
1783 }
1784 MSVC_DIAG_RESTORE
1785 
1786 /*
1787 =for apidoc      die
1788 =for apidoc_item die_nocontext
1789 
1790 These behave the same as L</croak>, except for the return type.
1791 They should be used only where the C<OP *> return type is required.
1792 They never actually return.
1793 
1794 The two forms differ only in that C<die_nocontext> does not take a thread
1795 context (C<aTHX>) parameter, so is used in situations where the caller doesn't
1796 already have the thread context.
1797 
1798 =cut
1799 */
1800 
1801 #if defined(MULTIPLICITY)
1802 
1803 /* silence __declspec(noreturn) warnings */
1804 MSVC_DIAG_IGNORE(4646 4645)
1805 OP *
Perl_die_nocontext(const char * pat,...)1806 Perl_die_nocontext(const char* pat, ...)
1807 {
1808     dTHX;
1809     va_list args;
1810     va_start(args, pat);
1811     vcroak(pat, &args);
1812     NOT_REACHED; /* NOTREACHED */
1813     va_end(args);
1814     NORETURN_FUNCTION_END;
1815 }
1816 MSVC_DIAG_RESTORE
1817 
1818 #endif /* MULTIPLICITY */
1819 
1820 /* silence __declspec(noreturn) warnings */
1821 MSVC_DIAG_IGNORE(4646 4645)
1822 OP *
Perl_die(pTHX_ const char * pat,...)1823 Perl_die(pTHX_ const char* pat, ...)
1824 {
1825     va_list args;
1826     va_start(args, pat);
1827     vcroak(pat, &args);
1828     NOT_REACHED; /* NOTREACHED */
1829     va_end(args);
1830     NORETURN_FUNCTION_END;
1831 }
1832 MSVC_DIAG_RESTORE
1833 
1834 /*
1835 =for apidoc croak_sv
1836 
1837 This is an XS interface to Perl's C<die> function.
1838 
1839 C<baseex> is the error message or object.  If it is a reference, it
1840 will be used as-is.  Otherwise it is used as a string, and if it does
1841 not end with a newline then it will be extended with some indication of
1842 the current location in the code, as described for L</mess_sv>.
1843 
1844 The error message or object will be used as an exception, by default
1845 returning control to the nearest enclosing C<eval>, but subject to
1846 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak_sv>
1847 function never returns normally.
1848 
1849 To die with a simple string message, the L</croak> function may be
1850 more convenient.
1851 
1852 =cut
1853 */
1854 
1855 void
Perl_croak_sv(pTHX_ SV * baseex)1856 Perl_croak_sv(pTHX_ SV *baseex)
1857 {
1858     SV *ex = with_queued_errors(mess_sv(baseex, 0));
1859     PERL_ARGS_ASSERT_CROAK_SV;
1860     invoke_exception_hook(ex, FALSE);
1861     die_unwind(ex);
1862 }
1863 
1864 /*
1865 =for apidoc vcroak
1866 
1867 This is an XS interface to Perl's C<die> function.
1868 
1869 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1870 argument list.  These are used to generate a string message.  If the
1871 message does not end with a newline, then it will be extended with
1872 some indication of the current location in the code, as described for
1873 L</mess_sv>.
1874 
1875 The error message will be used as an exception, by default
1876 returning control to the nearest enclosing C<eval>, but subject to
1877 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak>
1878 function never returns normally.
1879 
1880 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1881 (C<$@>) will be used as an error message or object instead of building an
1882 error message from arguments.  If you want to throw a non-string object,
1883 or build an error message in an SV yourself, it is preferable to use
1884 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1885 
1886 =cut
1887 */
1888 
1889 void
Perl_vcroak(pTHX_ const char * pat,va_list * args)1890 Perl_vcroak(pTHX_ const char* pat, va_list *args)
1891 {
1892     SV *ex = with_queued_errors(pat ? vmess(pat, args) : mess_sv(ERRSV, 0));
1893     invoke_exception_hook(ex, FALSE);
1894     die_unwind(ex);
1895 }
1896 
1897 /*
1898 =for apidoc croak
1899 =for apidoc_item croak_nocontext
1900 
1901 These are XS interfaces to Perl's C<die> function.
1902 
1903 They take a sprintf-style format pattern and argument list, which are used to
1904 generate a string message.  If the message does not end with a newline, then it
1905 will be extended with some indication of the current location in the code, as
1906 described for C<L</mess_sv>>.
1907 
1908 The error message will be used as an exception, by default
1909 returning control to the nearest enclosing C<eval>, but subject to
1910 modification by a C<$SIG{__DIE__}> handler.  In any case, these croak
1911 functions never return normally.
1912 
1913 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1914 (C<$@>) will be used as an error message or object instead of building an
1915 error message from arguments.  If you want to throw a non-string object,
1916 or build an error message in an SV yourself, it is preferable to use
1917 the C<L</croak_sv>> function, which does not involve clobbering C<ERRSV>.
1918 
1919 The two forms differ only in that C<croak_nocontext> does not take a thread
1920 context (C<aTHX>) parameter.  It is usually preferred as it takes up fewer
1921 bytes of code than plain C<Perl_croak>, and time is rarely a critical resource
1922 when you are about to throw an exception.
1923 
1924 =cut
1925 */
1926 
1927 #if defined(MULTIPLICITY)
1928 void
Perl_croak_nocontext(const char * pat,...)1929 Perl_croak_nocontext(const char *pat, ...)
1930 {
1931     dTHX;
1932     va_list args;
1933     va_start(args, pat);
1934     vcroak(pat, &args);
1935     NOT_REACHED; /* NOTREACHED */
1936     va_end(args);
1937 }
1938 #endif /* MULTIPLICITY */
1939 
1940 void
Perl_croak(pTHX_ const char * pat,...)1941 Perl_croak(pTHX_ const char *pat, ...)
1942 {
1943     va_list args;
1944     va_start(args, pat);
1945     vcroak(pat, &args);
1946     NOT_REACHED; /* NOTREACHED */
1947     va_end(args);
1948 }
1949 
1950 /*
1951 =for apidoc croak_no_modify
1952 
1953 This encapsulates a common reason for dying, generating terser object code than
1954 using the generic C<Perl_croak>.  It is exactly equivalent to
1955 C<Perl_croak(aTHX_ "%s", PL_no_modify)> (which expands to something like
1956 "Modification of a read-only value attempted").
1957 
1958 Less code used on exception code paths reduces CPU cache pressure.
1959 
1960 =cut
1961 */
1962 
1963 void
Perl_croak_no_modify(void)1964 Perl_croak_no_modify(void)
1965 {
1966     Perl_croak_nocontext( "%s", PL_no_modify);
1967 }
1968 
1969 /* does not return, used in util.c perlio.c and win32.c
1970    This is typically called when malloc returns NULL.
1971 */
1972 void
Perl_croak_no_mem(void)1973 Perl_croak_no_mem(void)
1974 {
1975     dTHX;
1976 
1977     int fd = PerlIO_fileno(Perl_error_log);
1978     if (fd < 0)
1979         SETERRNO(EBADF,RMS_IFI);
1980     else {
1981         /* Can't use PerlIO to write as it allocates memory */
1982         PERL_UNUSED_RESULT(PerlLIO_write(fd, PL_no_mem, sizeof(PL_no_mem)-1));
1983     }
1984     my_exit(1);
1985 }
1986 
1987 /* does not return, used only in POPSTACK */
1988 void
Perl_croak_popstack(void)1989 Perl_croak_popstack(void)
1990 {
1991     dTHX;
1992     PerlIO_printf(Perl_error_log, "panic: POPSTACK\n");
1993     my_exit(1);
1994 }
1995 
1996 /*
1997 =for apidoc warn_sv
1998 
1999 This is an XS interface to Perl's C<warn> function.
2000 
2001 C<baseex> is the error message or object.  If it is a reference, it
2002 will be used as-is.  Otherwise it is used as a string, and if it does
2003 not end with a newline then it will be extended with some indication of
2004 the current location in the code, as described for L</mess_sv>.
2005 
2006 The error message or object will by default be written to standard error,
2007 but this is subject to modification by a C<$SIG{__WARN__}> handler.
2008 
2009 To warn with a simple string message, the L</warn> function may be
2010 more convenient.
2011 
2012 =cut
2013 */
2014 
2015 void
Perl_warn_sv(pTHX_ SV * baseex)2016 Perl_warn_sv(pTHX_ SV *baseex)
2017 {
2018     SV *ex = mess_sv(baseex, 0);
2019     PERL_ARGS_ASSERT_WARN_SV;
2020     if (!invoke_exception_hook(ex, TRUE))
2021         write_to_stderr(ex);
2022 }
2023 
2024 /*
2025 =for apidoc vwarn
2026 
2027 This is an XS interface to Perl's C<warn> function.
2028 
2029 This is like C<L</warn>>, but C<args> are an encapsulated
2030 argument list.
2031 
2032 Unlike with L</vcroak>, C<pat> is not permitted to be null.
2033 
2034 =cut
2035 */
2036 
2037 void
Perl_vwarn(pTHX_ const char * pat,va_list * args)2038 Perl_vwarn(pTHX_ const char* pat, va_list *args)
2039 {
2040     SV *ex = vmess(pat, args);
2041     PERL_ARGS_ASSERT_VWARN;
2042     if (!invoke_exception_hook(ex, TRUE))
2043         write_to_stderr(ex);
2044 }
2045 
2046 /*
2047 =for apidoc warn
2048 =for apidoc_item warn_nocontext
2049 
2050 These are XS interfaces to Perl's C<warn> function.
2051 
2052 They take a sprintf-style format pattern and argument list, which  are used to
2053 generate a string message.  If the message does not end with a newline, then it
2054 will be extended with some indication of the current location in the code, as
2055 described for C<L</mess_sv>>.
2056 
2057 The error message or object will by default be written to standard error,
2058 but this is subject to modification by a C<$SIG{__WARN__}> handler.
2059 
2060 Unlike with C<L</croak>>, C<pat> is not permitted to be null.
2061 
2062 The two forms differ only in that C<warn_nocontext> does not take a thread
2063 context (C<aTHX>) parameter, so is used in situations where the caller doesn't
2064 already have the thread context.
2065 
2066 =cut
2067 */
2068 
2069 #if defined(MULTIPLICITY)
2070 void
Perl_warn_nocontext(const char * pat,...)2071 Perl_warn_nocontext(const char *pat, ...)
2072 {
2073     dTHX;
2074     va_list args;
2075     PERL_ARGS_ASSERT_WARN_NOCONTEXT;
2076     va_start(args, pat);
2077     vwarn(pat, &args);
2078     va_end(args);
2079 }
2080 #endif /* MULTIPLICITY */
2081 
2082 void
Perl_warn(pTHX_ const char * pat,...)2083 Perl_warn(pTHX_ const char *pat, ...)
2084 {
2085     va_list args;
2086     PERL_ARGS_ASSERT_WARN;
2087     va_start(args, pat);
2088     vwarn(pat, &args);
2089     va_end(args);
2090 }
2091 
2092 /*
2093 =for apidoc warner
2094 =for apidoc_item warner_nocontext
2095 
2096 These output a warning of the specified category (or categories) given by
2097 C<err>, using the sprintf-style format pattern C<pat>, and argument list.
2098 
2099 C<err> must be one of the C<L</packWARN>>, C<packWARN2>, C<packWARN3>,
2100 C<packWARN4> macros populated with the appropriate number of warning
2101 categories.  If any of the warning categories they specify is fatal, a fatal
2102 exception is thrown.
2103 
2104 In any event a message is generated by the pattern and arguments.  If the
2105 message does not end with a newline, then it will be extended with some
2106 indication of the current location in the code, as described for L</mess_sv>.
2107 
2108 The error message or object will by default be written to standard error,
2109 but this is subject to modification by a C<$SIG{__WARN__}> handler.
2110 
2111 C<pat> is not permitted to be null.
2112 
2113 The two forms differ only in that C<warner_nocontext> does not take a thread
2114 context (C<aTHX>) parameter, so is used in situations where the caller doesn't
2115 already have the thread context.
2116 
2117 These functions differ from the similarly named C<L</warn>> functions, in that
2118 the latter are for XS code to unconditionally display a warning, whereas these
2119 are for code that may be compiling a perl program, and does extra checking to
2120 see if the warning should be fatal.
2121 
2122 =for apidoc ck_warner
2123 =for apidoc_item ck_warner_d
2124 If none of the warning categories given by C<err> are enabled, do nothing;
2125 otherwise call C<L</warner>>  or C<L</warner_nocontext>> with the passed-in
2126 parameters;.
2127 
2128 C<err> must be one of the C<L</packWARN>>, C<packWARN2>, C<packWARN3>,
2129 C<packWARN4> macros populated with the appropriate number of warning
2130 categories.
2131 
2132 The two forms differ only in that C<ck_warner_d> should be used if warnings for
2133 any of the categories are by default enabled.
2134 
2135 =for apidoc vwarner
2136 This is like C<L</warner>>, but C<args> are an encapsulated argument list.
2137 
2138 =cut
2139 */
2140 
2141 #if defined(MULTIPLICITY)
2142 void
Perl_warner_nocontext(U32 err,const char * pat,...)2143 Perl_warner_nocontext(U32 err, const char *pat, ...)
2144 {
2145     dTHX;
2146     va_list args;
2147     PERL_ARGS_ASSERT_WARNER_NOCONTEXT;
2148     va_start(args, pat);
2149     vwarner(err, pat, &args);
2150     va_end(args);
2151 }
2152 #endif /* MULTIPLICITY */
2153 
2154 void
Perl_ck_warner_d(pTHX_ U32 err,const char * pat,...)2155 Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...)
2156 {
2157     PERL_ARGS_ASSERT_CK_WARNER_D;
2158 
2159     if (Perl_ckwarn_d(aTHX_ err)) {
2160         va_list args;
2161         va_start(args, pat);
2162         vwarner(err, pat, &args);
2163         va_end(args);
2164     }
2165 }
2166 
2167 void
Perl_ck_warner(pTHX_ U32 err,const char * pat,...)2168 Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
2169 {
2170     PERL_ARGS_ASSERT_CK_WARNER;
2171 
2172     if (Perl_ckwarn(aTHX_ err)) {
2173         va_list args;
2174         va_start(args, pat);
2175         vwarner(err, pat, &args);
2176         va_end(args);
2177     }
2178 }
2179 
2180 void
Perl_warner(pTHX_ U32 err,const char * pat,...)2181 Perl_warner(pTHX_ U32  err, const char* pat,...)
2182 {
2183     va_list args;
2184     PERL_ARGS_ASSERT_WARNER;
2185     va_start(args, pat);
2186     vwarner(err, pat, &args);
2187     va_end(args);
2188 }
2189 
2190 void
Perl_vwarner(pTHX_ U32 err,const char * pat,va_list * args)2191 Perl_vwarner(pTHX_ U32  err, const char* pat, va_list* args)
2192 {
2193     PERL_ARGS_ASSERT_VWARNER;
2194     if (
2195         (PL_warnhook == PERL_WARNHOOK_FATAL || ckDEAD(err)) &&
2196         !(PL_in_eval & EVAL_KEEPERR)
2197     ) {
2198         SV * const msv = vmess(pat, args);
2199 
2200         if (PL_parser && PL_parser->error_count) {
2201             qerror(msv);
2202         }
2203         else {
2204             invoke_exception_hook(msv, FALSE);
2205             die_unwind(msv);
2206         }
2207     }
2208     else {
2209         Perl_vwarn(aTHX_ pat, args);
2210     }
2211 }
2212 
2213 /* implements the ckWARN? macros */
2214 
2215 bool
Perl_ckwarn(pTHX_ U32 w)2216 Perl_ckwarn(pTHX_ U32 w)
2217 {
2218     /* If lexical warnings have not been set, use $^W.  */
2219     if (isLEXWARN_off)
2220         return PL_dowarn & G_WARN_ON;
2221 
2222     return ckwarn_common(w);
2223 }
2224 
2225 /* implements the ckWARN?_d macro */
2226 
2227 bool
Perl_ckwarn_d(pTHX_ U32 w)2228 Perl_ckwarn_d(pTHX_ U32 w)
2229 {
2230     /* If lexical warnings have not been set then default classes warn.  */
2231     if (isLEXWARN_off)
2232         return TRUE;
2233 
2234     return ckwarn_common(w);
2235 }
2236 
2237 static bool
S_ckwarn_common(pTHX_ U32 w)2238 S_ckwarn_common(pTHX_ U32 w)
2239 {
2240     if (PL_curcop->cop_warnings == pWARN_ALL)
2241         return TRUE;
2242 
2243     if (PL_curcop->cop_warnings == pWARN_NONE)
2244         return FALSE;
2245 
2246     /* Check the assumption that at least the first slot is non-zero.  */
2247     assert(unpackWARN1(w));
2248 
2249     /* Check the assumption that it is valid to stop as soon as a zero slot is
2250        seen.  */
2251     if (!unpackWARN2(w)) {
2252         assert(!unpackWARN3(w));
2253         assert(!unpackWARN4(w));
2254     } else if (!unpackWARN3(w)) {
2255         assert(!unpackWARN4(w));
2256     }
2257 
2258     /* Right, dealt with all the special cases, which are implemented as non-
2259        pointers, so there is a pointer to a real warnings mask.  */
2260     do {
2261         if (isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w)))
2262             return TRUE;
2263     } while (w >>= WARNshift);
2264 
2265     return FALSE;
2266 }
2267 
2268 char *
Perl_new_warnings_bitfield(pTHX_ char * buffer,const char * const bits,STRLEN size)2269 Perl_new_warnings_bitfield(pTHX_ char *buffer, const char *const bits,
2270                            STRLEN size) {
2271     const MEM_SIZE len_wanted = (size > WARNsize ? size : WARNsize);
2272     PERL_UNUSED_CONTEXT;
2273     PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD;
2274 
2275     /* pass in null as the source string as we will do the
2276      * copy ourselves. */
2277     buffer = rcpv_new(NULL, len_wanted, RCPVf_NO_COPY);
2278     Copy(bits, buffer, size, char);
2279     if (size < WARNsize)
2280         Zero(buffer + size, WARNsize - size, char);
2281     return buffer;
2282 }
2283 
2284 /* since we've already done strlen() for both nam and val
2285  * we can use that info to make things faster than
2286  * sprintf(s, "%s=%s", nam, val)
2287  */
2288 #define my_setenv_format(s, nam, nlen, val, vlen) \
2289    Copy(nam, s, nlen, char); \
2290    *(s+nlen) = '='; \
2291    Copy(val, s+(nlen+1), vlen, char); \
2292    *(s+(nlen+1+vlen)) = '\0'
2293 
2294 
2295 
2296 #if defined(USE_ENVIRON_ARRAY) || defined(WIN32)
2297 /* NB: VMS' my_setenv() is in vms.c */
2298 
2299 /* small wrapper for use by Perl_my_setenv that mallocs, or reallocs if
2300  * 'current' is non-null, with up to three sizes that are added together.
2301  * It handles integer overflow.
2302  */
2303 #  ifndef HAS_SETENV
2304 static char *
S_env_alloc(void * current,Size_t l1,Size_t l2,Size_t l3,Size_t size)2305 S_env_alloc(void *current, Size_t l1, Size_t l2, Size_t l3, Size_t size)
2306 {
2307     void *p;
2308     Size_t sl, l = l1 + l2;
2309 
2310     if (l < l2)
2311         goto panic;
2312     l += l3;
2313     if (l < l3)
2314         goto panic;
2315     sl = l * size;
2316     if (sl < l)
2317         goto panic;
2318 
2319     p = current
2320             ? safesysrealloc(current, sl)
2321             : safesysmalloc(sl);
2322     if (p)
2323         return (char*)p;
2324 
2325   panic:
2326     croak_memory_wrap();
2327 }
2328 #  endif
2329 
2330 /*
2331 =for apidoc_section $utility
2332 =for apidoc my_setenv
2333 
2334 A wrapper for the C library L<setenv(3)>.  Don't use the latter, as the perl
2335 version has desirable safeguards
2336 
2337 =cut
2338 */
2339 
2340 void
Perl_my_setenv(pTHX_ const char * nam,const char * val)2341 Perl_my_setenv(pTHX_ const char *nam, const char *val)
2342 {
2343 #  if defined(USE_ITHREADS) && !defined(WIN32)
2344     /* only parent thread can modify process environment, so no need to use a
2345      * mutex */
2346     if (PL_curinterp != aTHX)
2347         return;
2348 #  endif
2349 
2350 #  if defined(HAS_SETENV) && defined(HAS_UNSETENV)
2351         if (val == NULL) {
2352             unsetenv(nam);
2353         } else {
2354             setenv(nam, val, 1);
2355         }
2356 
2357 #  elif defined(HAS_UNSETENV)
2358 
2359         if (val == NULL) {
2360             if (environ) /* old glibc can crash with null environ */
2361                 unsetenv(nam);
2362         } else {
2363             const Size_t nlen = strlen(nam);
2364             const Size_t vlen = strlen(val);
2365             char * const new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
2366             my_setenv_format(new_env, nam, nlen, val, vlen);
2367             putenv(new_env);
2368         }
2369 
2370 #  else /* ! HAS_UNSETENV */
2371 
2372         const Size_t nlen = strlen(nam);
2373         if (!val) {
2374            val = "";
2375         }
2376         Size_t vlen = strlen(val);
2377         char *new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
2378         /* all that work just for this */
2379         my_setenv_format(new_env, nam, nlen, val, vlen);
2380 #    ifndef WIN32
2381         putenv(new_env);
2382 #    else
2383         PerlEnv_putenv(new_env);
2384         safesysfree(new_env);
2385 #    endif
2386 
2387 #  endif /* HAS_SETENV */
2388 }
2389 
2390 #endif /* USE_ENVIRON_ARRAY || WIN32 */
2391 
2392 #ifdef UNLINK_ALL_VERSIONS
2393 I32
Perl_unlnk(pTHX_ const char * f)2394 Perl_unlnk(pTHX_ const char *f)	/* unlink all versions of a file */
2395 {
2396     I32 retries = 0;
2397 
2398     PERL_ARGS_ASSERT_UNLNK;
2399 
2400     while (PerlLIO_unlink(f) >= 0)
2401         retries++;
2402     return retries ? 0 : -1;
2403 }
2404 #endif
2405 
2406 #if defined(OEMVS)
2407   #if (__CHARSET_LIB == 1)
chgfdccsid(int fd,unsigned short ccsid)2408   static int chgfdccsid(int fd, unsigned short ccsid)
2409   {
2410     attrib_t attr;
2411     memset(&attr, 0, sizeof(attr));
2412     attr.att_filetagchg = 1;
2413     attr.att_filetag.ft_ccsid = ccsid;
2414     if (ccsid != FT_BINARY) {
2415       attr.att_filetag.ft_txtflag = 1;
2416     }
2417     return __fchattr(fd, &attr, sizeof(attr));
2418   }
2419   #endif
2420 #endif
2421 
2422 /*
2423 =for apidoc my_popen_list
2424 
2425 Implementing function on some systems for PerlProc_popen_list()
2426 
2427 =cut
2428 */
2429 
2430 PerlIO *
Perl_my_popen_list(pTHX_ const char * mode,int n,SV ** args)2431 Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
2432 {
2433 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(OS2) && !defined(VMS) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
2434     int p[2];
2435     I32 This, that;
2436     Pid_t pid;
2437     SV *sv;
2438     I32 did_pipes = 0;
2439     int pp[2];
2440 
2441     PERL_ARGS_ASSERT_MY_POPEN_LIST;
2442 
2443     PERL_FLUSHALL_FOR_CHILD;
2444     This = (*mode == 'w');
2445     that = !This;
2446     if (TAINTING_get) {
2447         taint_env();
2448         taint_proper("Insecure %s%s", "EXEC");
2449     }
2450     if (PerlProc_pipe_cloexec(p) < 0)
2451         return NULL;
2452     /* Try for another pipe pair for error return */
2453     if (PerlProc_pipe_cloexec(pp) >= 0)
2454         did_pipes = 1;
2455     while ((pid = PerlProc_fork()) < 0) {
2456         if (errno != EAGAIN) {
2457             PerlLIO_close(p[This]);
2458             PerlLIO_close(p[that]);
2459             if (did_pipes) {
2460                 PerlLIO_close(pp[0]);
2461                 PerlLIO_close(pp[1]);
2462             }
2463             return NULL;
2464         }
2465         Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2466         sleep(5);
2467     }
2468     if (pid == 0) {
2469         /* Child */
2470 #undef THIS
2471 #undef THAT
2472 #define THIS that
2473 #define THAT This
2474         /* Close parent's end of error status pipe (if any) */
2475         if (did_pipes)
2476             PerlLIO_close(pp[0]);
2477 #if defined(OEMVS)
2478   #if (__CHARSET_LIB == 1)
2479         chgfdccsid(p[THIS], 819);
2480         chgfdccsid(p[THAT], 819);
2481   #endif
2482 #endif
2483         /* Now dup our end of _the_ pipe to right position */
2484         if (p[THIS] != (*mode == 'r')) {
2485             PerlLIO_dup2(p[THIS], *mode == 'r');
2486             PerlLIO_close(p[THIS]);
2487             if (p[THAT] != (*mode == 'r'))	/* if dup2() didn't close it */
2488                 PerlLIO_close(p[THAT]);	/* close parent's end of _the_ pipe */
2489         }
2490         else {
2491             setfd_cloexec_or_inhexec_by_sysfdness(p[THIS]);
2492             PerlLIO_close(p[THAT]);	/* close parent's end of _the_ pipe */
2493         }
2494 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2495         /* No automatic close - do it by hand */
2496 #  ifndef NOFILE
2497 #  define NOFILE 20
2498 #  endif
2499         {
2500             int fd;
2501 
2502             for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
2503                 if (fd != pp[1])
2504                     PerlLIO_close(fd);
2505             }
2506         }
2507 #endif
2508         do_aexec5(NULL, args-1, args-1+n, pp[1], did_pipes);
2509         PerlProc__exit(1);
2510 #undef THIS
2511 #undef THAT
2512     }
2513     /* Parent */
2514     if (did_pipes)
2515         PerlLIO_close(pp[1]);
2516     /* Keep the lower of the two fd numbers */
2517     if (p[that] < p[This]) {
2518         PerlLIO_dup2_cloexec(p[This], p[that]);
2519         PerlLIO_close(p[This]);
2520         p[This] = p[that];
2521     }
2522     else
2523         PerlLIO_close(p[that]);		/* close child's end of pipe */
2524 
2525     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2526     SvUPGRADE(sv,SVt_IV);
2527     SvIV_set(sv, pid);
2528     PL_forkprocess = pid;
2529     /* If we managed to get status pipe check for exec fail */
2530     if (did_pipes && pid > 0) {
2531         int errkid;
2532         unsigned read_total = 0;
2533 
2534         while (read_total < sizeof(int)) {
2535             const SSize_t n1 = PerlLIO_read(pp[0],
2536                               (void*)(((char*)&errkid)+read_total),
2537                               (sizeof(int)) - read_total);
2538             if (n1 <= 0)
2539                 break;
2540             read_total += n1;
2541         }
2542         PerlLIO_close(pp[0]);
2543         did_pipes = 0;
2544         if (read_total) {			/* Error */
2545             int pid2, status;
2546             PerlLIO_close(p[This]);
2547             if (read_total != sizeof(int))
2548                 Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", read_total);
2549             do {
2550                 pid2 = wait4pid(pid, &status, 0);
2551             } while (pid2 == -1 && errno == EINTR);
2552             errno = errkid;		/* Propagate errno from kid */
2553             return NULL;
2554         }
2555     }
2556     if (did_pipes)
2557          PerlLIO_close(pp[0]);
2558 #if defined(OEMVS)
2559   #if (__CHARSET_LIB == 1)
2560     PerlIO* io = PerlIO_fdopen(p[This], mode);
2561     if (io) {
2562       chgfdccsid(p[This], 819);
2563     }
2564     return io;
2565   #else
2566     return PerlIO_fdopen(p[This], mode);
2567   #endif
2568 #else
2569     return PerlIO_fdopen(p[This], mode);
2570 #endif
2571 
2572 #else
2573 #  if defined(OS2)	/* Same, without fork()ing and all extra overhead... */
2574     return my_syspopen4(aTHX_ NULL, mode, n, args);
2575 #  elif defined(WIN32)
2576     return win32_popenlist(mode, n, args);
2577 #  else
2578     Perl_croak(aTHX_ "List form of piped open not implemented");
2579     return (PerlIO *) NULL;
2580 #  endif
2581 #endif
2582 }
2583 
2584     /* VMS' my_popen() is in VMS.c, same with OS/2 and AmigaOS 4. */
2585 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(VMS) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
2586 
2587 /*
2588 =for apidoc_section $io
2589 =for apidoc my_popen
2590 
2591 A wrapper for the C library L<popen(3)>.  Don't use the latter, as the Perl
2592 version knows things that interact with the rest of the perl interpreter.
2593 
2594 =cut
2595 */
2596 
2597 PerlIO *
Perl_my_popen(pTHX_ const char * cmd,const char * mode)2598 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2599 {
2600     int p[2];
2601     I32 This, that;
2602     Pid_t pid;
2603     SV *sv;
2604     const I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
2605     I32 did_pipes = 0;
2606     int pp[2];
2607 
2608     PERL_ARGS_ASSERT_MY_POPEN;
2609 
2610     PERL_FLUSHALL_FOR_CHILD;
2611 #ifdef OS2
2612     if (doexec) {
2613         return my_syspopen(aTHX_ cmd,mode);
2614     }
2615 #endif
2616     This = (*mode == 'w');
2617     that = !This;
2618     if (doexec && TAINTING_get) {
2619         taint_env();
2620         taint_proper("Insecure %s%s", "EXEC");
2621     }
2622     if (PerlProc_pipe_cloexec(p) < 0)
2623         return NULL;
2624     if (doexec && PerlProc_pipe_cloexec(pp) >= 0)
2625         did_pipes = 1;
2626     while ((pid = PerlProc_fork()) < 0) {
2627         if (errno != EAGAIN) {
2628             PerlLIO_close(p[This]);
2629             PerlLIO_close(p[that]);
2630             if (did_pipes) {
2631                 PerlLIO_close(pp[0]);
2632                 PerlLIO_close(pp[1]);
2633             }
2634             if (!doexec)
2635                 Perl_croak(aTHX_ "Can't fork: %s", Strerror(errno));
2636             return NULL;
2637         }
2638         Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2639         sleep(5);
2640     }
2641     if (pid == 0) {
2642 
2643 #undef THIS
2644 #undef THAT
2645 #define THIS that
2646 #define THAT This
2647         if (did_pipes)
2648             PerlLIO_close(pp[0]);
2649 #if defined(OEMVS)
2650   #if (__CHARSET_LIB == 1)
2651         chgfdccsid(p[THIS], 819);
2652         chgfdccsid(p[THAT], 819);
2653   #endif
2654 #endif
2655         if (p[THIS] != (*mode == 'r')) {
2656             PerlLIO_dup2(p[THIS], *mode == 'r');
2657             PerlLIO_close(p[THIS]);
2658             if (p[THAT] != (*mode == 'r'))	/* if dup2() didn't close it */
2659                 PerlLIO_close(p[THAT]);
2660         }
2661         else {
2662             setfd_cloexec_or_inhexec_by_sysfdness(p[THIS]);
2663             PerlLIO_close(p[THAT]);
2664         }
2665 #ifndef OS2
2666         if (doexec) {
2667 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2668 #ifndef NOFILE
2669 #define NOFILE 20
2670 #endif
2671             {
2672                 int fd;
2673 
2674                 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2675                     if (fd != pp[1])
2676                         PerlLIO_close(fd);
2677             }
2678 #endif
2679             /* may or may not use the shell */
2680             do_exec3(cmd, pp[1], did_pipes);
2681             PerlProc__exit(1);
2682         }
2683 #endif	/* defined OS2 */
2684 
2685 #ifdef PERLIO_USING_CRLF
2686    /* Since we circumvent IO layers when we manipulate low-level
2687       filedescriptors directly, need to manually switch to the
2688       default, binary, low-level mode; see PerlIOBuf_open(). */
2689    PerlLIO_setmode((*mode == 'r'), O_BINARY);
2690 #endif
2691         PL_forkprocess = 0;
2692 #ifdef PERL_USES_PL_PIDSTATUS
2693         hv_clear(PL_pidstatus);	/* we have no children */
2694 #endif
2695         return NULL;
2696 #undef THIS
2697 #undef THAT
2698     }
2699     if (did_pipes)
2700         PerlLIO_close(pp[1]);
2701     if (p[that] < p[This]) {
2702         PerlLIO_dup2_cloexec(p[This], p[that]);
2703         PerlLIO_close(p[This]);
2704         p[This] = p[that];
2705     }
2706     else
2707         PerlLIO_close(p[that]);
2708 
2709     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2710     SvUPGRADE(sv,SVt_IV);
2711     SvIV_set(sv, pid);
2712     PL_forkprocess = pid;
2713     if (did_pipes && pid > 0) {
2714         int errkid;
2715         unsigned n = 0;
2716 
2717         while (n < sizeof(int)) {
2718             const SSize_t n1 = PerlLIO_read(pp[0],
2719                               (void*)(((char*)&errkid)+n),
2720                               (sizeof(int)) - n);
2721             if (n1 <= 0)
2722                 break;
2723             n += n1;
2724         }
2725         PerlLIO_close(pp[0]);
2726         did_pipes = 0;
2727         if (n) {			/* Error */
2728             int pid2, status;
2729             PerlLIO_close(p[This]);
2730             if (n != sizeof(int))
2731                 Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", n);
2732             do {
2733                 pid2 = wait4pid(pid, &status, 0);
2734             } while (pid2 == -1 && errno == EINTR);
2735             errno = errkid;		/* Propagate errno from kid */
2736             return NULL;
2737         }
2738     }
2739     if (did_pipes)
2740          PerlLIO_close(pp[0]);
2741 #if defined(OEMVS)
2742   #if (__CHARSET_LIB == 1)
2743     PerlIO* io = PerlIO_fdopen(p[This],	mode);
2744     if (io) {
2745       chgfdccsid(p[This], 819);
2746     }
2747     return io;
2748   #else
2749     return PerlIO_fdopen(p[This], mode);
2750   #endif
2751 #else
2752     return PerlIO_fdopen(p[This], mode);
2753 #endif
2754 }
2755 #elif defined(__LIBCATAMOUNT__)
2756 PerlIO *
Perl_my_popen(pTHX_ const char * cmd,const char * mode)2757 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2758 {
2759     return NULL;
2760 }
2761 
2762 #endif /* !DOSISH */
2763 
2764 /* this is called in parent before the fork() */
2765 void
Perl_atfork_lock(void)2766 Perl_atfork_lock(void)
2767 #if defined(USE_ITHREADS)
2768 #  ifdef USE_PERLIO
2769   PERL_TSA_ACQUIRE(PL_perlio_mutex)
2770 #  endif
2771 #  ifdef MYMALLOC
2772   PERL_TSA_ACQUIRE(PL_malloc_mutex)
2773 #  endif
2774   PERL_TSA_ACQUIRE(PL_op_mutex)
2775 #endif
2776 {
2777 #if defined(USE_ITHREADS)
2778     /* locks must be held in locking order (if any) */
2779 #  ifdef USE_PERLIO
2780     MUTEX_LOCK(&PL_perlio_mutex);
2781 #  endif
2782 #  ifdef MYMALLOC
2783     MUTEX_LOCK(&PL_malloc_mutex);
2784 #  endif
2785     OP_REFCNT_LOCK;
2786 #endif
2787 }
2788 
2789 /* this is called in both parent and child after the fork() */
2790 void
Perl_atfork_unlock(void)2791 Perl_atfork_unlock(void)
2792 #if defined(USE_ITHREADS)
2793 #  ifdef USE_PERLIO
2794   PERL_TSA_RELEASE(PL_perlio_mutex)
2795 #  endif
2796 #  ifdef MYMALLOC
2797   PERL_TSA_RELEASE(PL_malloc_mutex)
2798 #  endif
2799   PERL_TSA_RELEASE(PL_op_mutex)
2800 #endif
2801 {
2802 #if defined(USE_ITHREADS)
2803     /* locks must be released in same order as in atfork_lock() */
2804 #  ifdef USE_PERLIO
2805     MUTEX_UNLOCK(&PL_perlio_mutex);
2806 #  endif
2807 #  ifdef MYMALLOC
2808     MUTEX_UNLOCK(&PL_malloc_mutex);
2809 #  endif
2810     OP_REFCNT_UNLOCK;
2811 #endif
2812 }
2813 
2814 /*
2815 =for apidoc_section $concurrency
2816 =for apidoc my_fork
2817 
2818 This is for the use of C<PerlProc_fork> as a wrapper for the C library
2819 L<fork(2)> on some platforms to hide some platform quirks.  It should not be
2820 used except through C<PerlProc_fork>.
2821 
2822 =cut
2823 */
2824 
2825 
2826 Pid_t
Perl_my_fork(void)2827 Perl_my_fork(void)
2828 {
2829 #if defined(HAS_FORK)
2830     Pid_t pid;
2831 #if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
2832     atfork_lock();
2833     pid = fork();
2834     atfork_unlock();
2835 #else
2836     /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2837      * handlers elsewhere in the code */
2838     pid = fork();
2839 #endif
2840     return pid;
2841 #elif defined(__amigaos4__)
2842     return amigaos_fork();
2843 #else
2844     /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2845     Perl_croak_nocontext("fork() not available");
2846     return 0;
2847 #endif /* HAS_FORK */
2848 }
2849 
2850 #ifndef HAS_DUP2
2851 int
dup2(int oldfd,int newfd)2852 dup2(int oldfd, int newfd)
2853 {
2854 #if defined(HAS_FCNTL) && defined(F_DUPFD)
2855     if (oldfd == newfd)
2856         return oldfd;
2857     PerlLIO_close(newfd);
2858     return fcntl(oldfd, F_DUPFD, newfd);
2859 #else
2860 #define DUP2_MAX_FDS 256
2861     int fdtmp[DUP2_MAX_FDS];
2862     I32 fdx = 0;
2863     int fd;
2864 
2865     if (oldfd == newfd)
2866         return oldfd;
2867     PerlLIO_close(newfd);
2868     /* good enough for low fd's... */
2869     while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
2870         if (fdx >= DUP2_MAX_FDS) {
2871             PerlLIO_close(fd);
2872             fd = -1;
2873             break;
2874         }
2875         fdtmp[fdx++] = fd;
2876     }
2877     while (fdx > 0)
2878         PerlLIO_close(fdtmp[--fdx]);
2879     return fd;
2880 #endif
2881 }
2882 #endif
2883 
2884 #ifndef PERL_MICRO
2885 #ifdef HAS_SIGACTION
2886 
2887 /*
2888 =for apidoc_section $signals
2889 =for apidoc rsignal
2890 
2891 A wrapper for the C library functions L<sigaction(2)> or L<signal(2)>.
2892 Use this instead of those libc functions, as the Perl version gives the
2893 safest available implementation, and knows things that interact with the
2894 rest of the perl interpreter.
2895 
2896 =cut
2897 */
2898 
2899 Sighandler_t
Perl_rsignal(pTHX_ int signo,Sighandler_t handler)2900 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2901 {
2902     struct sigaction act, oact;
2903 
2904 #ifdef USE_ITHREADS
2905     /* only "parent" interpreter can diddle signals */
2906     if (PL_curinterp != aTHX)
2907         return (Sighandler_t) SIG_ERR;
2908 #endif
2909 
2910     act.sa_handler = handler;
2911     sigemptyset(&act.sa_mask);
2912     act.sa_flags = 0;
2913 #ifdef SA_RESTART
2914     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2915         act.sa_flags |= SA_RESTART;	/* SVR4, 4.3+BSD */
2916 #endif
2917 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2918     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2919         act.sa_flags |= SA_NOCLDWAIT;
2920 #endif
2921     if (sigaction(signo, &act, &oact) == -1)
2922         return (Sighandler_t) SIG_ERR;
2923     else
2924         return (Sighandler_t) oact.sa_handler;
2925 }
2926 
2927 /*
2928 =for apidoc_section $signals
2929 =for apidoc rsignal_state
2930 
2931 Returns a the current signal handler for signal C<signo>.
2932 See L</C<rsignal>>.
2933 
2934 =cut
2935 */
2936 
2937 Sighandler_t
Perl_rsignal_state(pTHX_ int signo)2938 Perl_rsignal_state(pTHX_ int signo)
2939 {
2940     struct sigaction oact;
2941     PERL_UNUSED_CONTEXT;
2942 
2943     if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
2944         return (Sighandler_t) SIG_ERR;
2945     else
2946         return (Sighandler_t) oact.sa_handler;
2947 }
2948 
2949 int
Perl_rsignal_save(pTHX_ int signo,Sighandler_t handler,Sigsave_t * save)2950 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
2951 {
2952     struct sigaction act;
2953 
2954     PERL_ARGS_ASSERT_RSIGNAL_SAVE;
2955 
2956 #ifdef USE_ITHREADS
2957     /* only "parent" interpreter can diddle signals */
2958     if (PL_curinterp != aTHX)
2959         return -1;
2960 #endif
2961 
2962     act.sa_handler = handler;
2963     sigemptyset(&act.sa_mask);
2964     act.sa_flags = 0;
2965 #ifdef SA_RESTART
2966     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2967         act.sa_flags |= SA_RESTART;	/* SVR4, 4.3+BSD */
2968 #endif
2969 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2970     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2971         act.sa_flags |= SA_NOCLDWAIT;
2972 #endif
2973     return sigaction(signo, &act, save);
2974 }
2975 
2976 int
Perl_rsignal_restore(pTHX_ int signo,Sigsave_t * save)2977 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
2978 {
2979     PERL_UNUSED_CONTEXT;
2980 #ifdef USE_ITHREADS
2981     /* only "parent" interpreter can diddle signals */
2982     if (PL_curinterp != aTHX)
2983         return -1;
2984 #endif
2985 
2986     return sigaction(signo, save, (struct sigaction *)NULL);
2987 }
2988 
2989 #else /* !HAS_SIGACTION */
2990 
2991 Sighandler_t
Perl_rsignal(pTHX_ int signo,Sighandler_t handler)2992 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2993 {
2994 #if defined(USE_ITHREADS) && !defined(WIN32)
2995     /* only "parent" interpreter can diddle signals */
2996     if (PL_curinterp != aTHX)
2997         return (Sighandler_t) SIG_ERR;
2998 #endif
2999 
3000     return PerlProc_signal(signo, handler);
3001 }
3002 
3003 static Signal_t
sig_trap(int signo)3004 sig_trap(int signo)
3005 {
3006     PL_sig_trapped++;
3007 }
3008 
3009 Sighandler_t
Perl_rsignal_state(pTHX_ int signo)3010 Perl_rsignal_state(pTHX_ int signo)
3011 {
3012     Sighandler_t oldsig;
3013 
3014 #if defined(USE_ITHREADS) && !defined(WIN32)
3015     /* only "parent" interpreter can diddle signals */
3016     if (PL_curinterp != aTHX)
3017         return (Sighandler_t) SIG_ERR;
3018 #endif
3019 
3020     PL_sig_trapped = 0;
3021     oldsig = PerlProc_signal(signo, sig_trap);
3022     PerlProc_signal(signo, oldsig);
3023     if (PL_sig_trapped)
3024         PerlProc_kill(PerlProc_getpid(), signo);
3025     return oldsig;
3026 }
3027 
3028 int
Perl_rsignal_save(pTHX_ int signo,Sighandler_t handler,Sigsave_t * save)3029 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
3030 {
3031 #if defined(USE_ITHREADS) && !defined(WIN32)
3032     /* only "parent" interpreter can diddle signals */
3033     if (PL_curinterp != aTHX)
3034         return -1;
3035 #endif
3036     *save = PerlProc_signal(signo, handler);
3037     return (*save == (Sighandler_t) SIG_ERR) ? -1 : 0;
3038 }
3039 
3040 int
Perl_rsignal_restore(pTHX_ int signo,Sigsave_t * save)3041 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
3042 {
3043 #if defined(USE_ITHREADS) && !defined(WIN32)
3044     /* only "parent" interpreter can diddle signals */
3045     if (PL_curinterp != aTHX)
3046         return -1;
3047 #endif
3048     return (PerlProc_signal(signo, *save) == (Sighandler_t) SIG_ERR) ? -1 : 0;
3049 }
3050 
3051 #endif /* !HAS_SIGACTION */
3052 #endif /* !PERL_MICRO */
3053 
3054     /* VMS' my_pclose() is in VMS.c */
3055 
3056 /*
3057 =for apidoc_section $io
3058 =for apidoc my_pclose
3059 
3060 A wrapper for the C library L<pclose(3)>.  Don't use the latter, as the Perl
3061 version knows things that interact with the rest of the perl interpreter.
3062 
3063 =cut
3064 */
3065 
3066 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(VMS) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
3067 I32
Perl_my_pclose(pTHX_ PerlIO * ptr)3068 Perl_my_pclose(pTHX_ PerlIO *ptr)
3069 {
3070     int status;
3071     SV **svp;
3072     Pid_t pid;
3073     Pid_t pid2 = 0;
3074     bool close_failed;
3075     dSAVEDERRNO;
3076     const int fd = PerlIO_fileno(ptr);
3077     bool should_wait;
3078 
3079     svp = av_fetch(PL_fdpid, fd, FALSE);
3080     if (svp) {
3081         pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
3082         SvREFCNT_dec(*svp);
3083         *svp = NULL;
3084     } else {
3085         pid = -1;
3086     }
3087 
3088 #if defined(USE_PERLIO)
3089     /* Find out whether the refcount is low enough for us to wait for the
3090        child proc without blocking. */
3091     should_wait = PerlIOUnix_refcnt(fd) == 1 && pid > 0;
3092 #else
3093     should_wait = pid > 0;
3094 #endif
3095 
3096 #ifdef OS2
3097     if (pid == -2) {                    /* Opened by popen. */
3098         return my_syspclose(ptr);
3099     }
3100 #endif
3101     close_failed = (PerlIO_close(ptr) == EOF);
3102     SAVE_ERRNO;
3103     if (should_wait) do {
3104         pid2 = wait4pid(pid, &status, 0);
3105     } while (pid2 == -1 && errno == EINTR);
3106     if (close_failed) {
3107         RESTORE_ERRNO;
3108         return -1;
3109     }
3110     return(
3111       should_wait
3112        ? pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status)
3113        : 0
3114     );
3115 }
3116 #elif defined(__LIBCATAMOUNT__)
3117 I32
Perl_my_pclose(pTHX_ PerlIO * ptr)3118 Perl_my_pclose(pTHX_ PerlIO *ptr)
3119 {
3120     return -1;
3121 }
3122 #endif /* !DOSISH */
3123 
3124 #if  (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
3125 I32
Perl_wait4pid(pTHX_ Pid_t pid,int * statusp,int flags)3126 Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
3127 {
3128     I32 result = 0;
3129     PERL_ARGS_ASSERT_WAIT4PID;
3130 #ifdef PERL_USES_PL_PIDSTATUS
3131     if (!pid) {
3132         /* PERL_USES_PL_PIDSTATUS is only defined when neither
3133            waitpid() nor wait4() is available, or on OS/2, which
3134            doesn't appear to support waiting for a progress group
3135            member, so we can only treat a 0 pid as an unknown child.
3136         */
3137         errno = ECHILD;
3138         return -1;
3139     }
3140     {
3141         if (pid > 0) {
3142             /* The keys in PL_pidstatus are now the raw 4 (or 8) bytes of the
3143                pid, rather than a string form.  */
3144             SV * const * const svp = hv_fetch(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),FALSE);
3145             if (svp && *svp != &PL_sv_undef) {
3146                 *statusp = SvIVX(*svp);
3147                 (void)hv_delete(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),
3148                                 G_DISCARD);
3149                 return pid;
3150             }
3151         }
3152         else {
3153             HE *entry;
3154 
3155             hv_iterinit(PL_pidstatus);
3156             if ((entry = hv_iternext(PL_pidstatus))) {
3157                 SV * const sv = hv_iterval(PL_pidstatus,entry);
3158                 I32 len;
3159                 const char * const spid = hv_iterkey(entry,&len);
3160 
3161                 assert (len == sizeof(Pid_t));
3162                 memcpy((char *)&pid, spid, len);
3163                 *statusp = SvIVX(sv);
3164                 /* The hash iterator is currently on this entry, so simply
3165                    calling hv_delete would trigger the lazy delete, which on
3166                    aggregate does more work, because next call to hv_iterinit()
3167                    would spot the flag, and have to call the delete routine,
3168                    while in the meantime any new entries can't re-use that
3169                    memory.  */
3170                 hv_iterinit(PL_pidstatus);
3171                 (void)hv_delete(PL_pidstatus,spid,len,G_DISCARD);
3172                 return pid;
3173             }
3174         }
3175     }
3176 #endif
3177 #ifdef HAS_WAITPID
3178 #  ifdef HAS_WAITPID_RUNTIME
3179     if (!HAS_WAITPID_RUNTIME)
3180         goto hard_way;
3181 #  endif
3182     result = PerlProc_waitpid(pid,statusp,flags);
3183     goto finish;
3184 #endif
3185 #if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
3186     result = wait4(pid,statusp,flags,NULL);
3187     goto finish;
3188 #endif
3189 #ifdef PERL_USES_PL_PIDSTATUS
3190 #if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME)
3191   hard_way:
3192 #endif
3193     {
3194         if (flags)
3195             Perl_croak(aTHX_ "Can't do waitpid with flags");
3196         else {
3197             while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
3198                 pidgone(result,*statusp);
3199             if (result < 0)
3200                 *statusp = -1;
3201         }
3202     }
3203 #endif
3204 #if defined(HAS_WAITPID) || defined(HAS_WAIT4)
3205   finish:
3206 #endif
3207     if (result < 0 && errno == EINTR) {
3208         PERL_ASYNC_CHECK();
3209         errno = EINTR; /* reset in case a signal handler changed $! */
3210     }
3211     return result;
3212 }
3213 #endif /* !DOSISH || OS2 || WIN32 */
3214 
3215 #ifdef PERL_USES_PL_PIDSTATUS
3216 void
S_pidgone(pTHX_ Pid_t pid,int status)3217 S_pidgone(pTHX_ Pid_t pid, int status)
3218 {
3219     SV *sv;
3220 
3221     sv = *hv_fetch(PL_pidstatus,(const char*)&pid,sizeof(Pid_t),TRUE);
3222     SvUPGRADE(sv,SVt_IV);
3223     SvIV_set(sv, status);
3224     return;
3225 }
3226 #endif
3227 
3228 #if defined(OS2)
3229 int pclose();
3230 #ifdef HAS_FORK
3231 int					/* Cannot prototype with I32
3232                                            in os2ish.h. */
my_syspclose(PerlIO * ptr)3233 my_syspclose(PerlIO *ptr)
3234 #else
3235 I32
3236 Perl_my_pclose(pTHX_ PerlIO *ptr)
3237 #endif
3238 {
3239     /* Needs work for PerlIO ! */
3240     FILE * const f = PerlIO_findFILE(ptr);
3241     const I32 result = pclose(f);
3242     PerlIO_releaseFILE(ptr,f);
3243     return result;
3244 }
3245 #endif
3246 
3247 /*
3248 =for apidoc repeatcpy
3249 
3250 Make C<count> copies of the C<len> bytes beginning at C<from>, placing them
3251 into memory beginning at C<to>, which must be big enough to accommodate them
3252 all.
3253 
3254 =cut
3255 */
3256 
3257 #define PERL_REPEATCPY_LINEAR 4
3258 void
Perl_repeatcpy(char * to,const char * from,I32 len,IV count)3259 Perl_repeatcpy(char *to, const char *from, I32 len, IV count)
3260 {
3261     PERL_ARGS_ASSERT_REPEATCPY;
3262 
3263     assert(len >= 0);
3264 
3265     if (count < 0)
3266         croak_memory_wrap();
3267 
3268     if (len == 1)
3269         memset(to, *from, count);
3270     else if (count) {
3271         char *p = to;
3272         IV items, linear, half;
3273 
3274         linear = count < PERL_REPEATCPY_LINEAR ? count : PERL_REPEATCPY_LINEAR;
3275         for (items = 0; items < linear; ++items) {
3276             const char *q = from;
3277             IV todo;
3278             for (todo = len; todo > 0; todo--)
3279                 *p++ = *q++;
3280         }
3281 
3282         half = count / 2;
3283         while (items <= half) {
3284             IV size = items * len;
3285             memcpy(p, to, size);
3286             p     += size;
3287             items *= 2;
3288         }
3289 
3290         if (count > items)
3291             memcpy(p, to, (count - items) * len);
3292     }
3293 }
3294 
3295 #ifndef HAS_RENAME
3296 I32
Perl_same_dirent(pTHX_ const char * a,const char * b)3297 Perl_same_dirent(pTHX_ const char *a, const char *b)
3298 {
3299     char *fa = strrchr(a,'/');
3300     char *fb = strrchr(b,'/');
3301     Stat_t tmpstatbuf1;
3302     Stat_t tmpstatbuf2;
3303     SV * const tmpsv = sv_newmortal();
3304 
3305     PERL_ARGS_ASSERT_SAME_DIRENT;
3306 
3307     if (fa)
3308         fa++;
3309     else
3310         fa = a;
3311     if (fb)
3312         fb++;
3313     else
3314         fb = b;
3315     if (strNE(a,b))
3316         return FALSE;
3317     if (fa == a)
3318         sv_setpvs(tmpsv, ".");
3319     else
3320         sv_setpvn(tmpsv, a, fa - a);
3321     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf1) < 0)
3322         return FALSE;
3323     if (fb == b)
3324         sv_setpvs(tmpsv, ".");
3325     else
3326         sv_setpvn(tmpsv, b, fb - b);
3327     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf2) < 0)
3328         return FALSE;
3329     return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
3330            tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
3331 }
3332 #endif /* !HAS_RENAME */
3333 
3334 char*
Perl_find_script(pTHX_ const char * scriptname,bool dosearch,const char * const * const search_ext,I32 flags)3335 Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
3336                  const char *const *const search_ext, I32 flags)
3337 {
3338     const char *xfound = NULL;
3339     char *xfailed = NULL;
3340     char tmpbuf[MAXPATHLEN];
3341     char *s;
3342     I32 len = 0;
3343     int retval;
3344     char *bufend;
3345 #if defined(DOSISH) && !defined(OS2)
3346 #  define SEARCH_EXTS ".bat", ".cmd", NULL
3347 #  define MAX_EXT_LEN 4
3348 #endif
3349 #ifdef OS2
3350 #  define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
3351 #  define MAX_EXT_LEN 4
3352 #endif
3353 #ifdef VMS
3354 #  define SEARCH_EXTS ".pl", ".com", NULL
3355 #  define MAX_EXT_LEN 4
3356 #endif
3357     /* additional extensions to try in each dir if scriptname not found */
3358 #ifdef SEARCH_EXTS
3359     static const char *const exts[] = { SEARCH_EXTS };
3360     const char *const *const ext = search_ext ? search_ext : exts;
3361     int extidx = 0, i = 0;
3362     const char *curext = NULL;
3363 #else
3364     PERL_UNUSED_ARG(search_ext);
3365 #  define MAX_EXT_LEN 0
3366 #endif
3367 
3368     PERL_ARGS_ASSERT_FIND_SCRIPT;
3369 
3370     /*
3371      * If dosearch is true and if scriptname does not contain path
3372      * delimiters, search the PATH for scriptname.
3373      *
3374      * If SEARCH_EXTS is also defined, will look for each
3375      * scriptname{SEARCH_EXTS} whenever scriptname is not found
3376      * while searching the PATH.
3377      *
3378      * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
3379      * proceeds as follows:
3380      *   If DOSISH or VMSISH:
3381      *     + look for ./scriptname{,.foo,.bar}
3382      *     + search the PATH for scriptname{,.foo,.bar}
3383      *
3384      *   If !DOSISH:
3385      *     + look *only* in the PATH for scriptname{,.foo,.bar} (note
3386      *       this will not look in '.' if it's not in the PATH)
3387      */
3388     tmpbuf[0] = '\0';
3389 
3390 #ifdef VMS
3391 #  ifdef ALWAYS_DEFTYPES
3392     len = strlen(scriptname);
3393     if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
3394         int idx = 0, deftypes = 1;
3395         bool seen_dot = 1;
3396 
3397         const int hasdir = !dosearch || (strpbrk(scriptname,":[</") != NULL);
3398 #  else
3399     if (dosearch) {
3400         int idx = 0, deftypes = 1;
3401         bool seen_dot = 1;
3402 
3403         const int hasdir = (strpbrk(scriptname,":[</") != NULL);
3404 #  endif
3405         /* The first time through, just add SEARCH_EXTS to whatever we
3406          * already have, so we can check for default file types. */
3407         while (deftypes ||
3408                (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
3409         {
3410             Stat_t statbuf;
3411             if (deftypes) {
3412                 deftypes = 0;
3413                 *tmpbuf = '\0';
3414             }
3415             if ((strlen(tmpbuf) + strlen(scriptname)
3416                  + MAX_EXT_LEN) >= sizeof tmpbuf)
3417                 continue;	/* don't search dir with too-long name */
3418             my_strlcat(tmpbuf, scriptname, sizeof(tmpbuf));
3419 #else  /* !VMS */
3420 
3421 #ifdef DOSISH
3422     if (strEQ(scriptname, "-"))
3423         dosearch = 0;
3424     if (dosearch) {		/* Look in '.' first. */
3425         const char *cur = scriptname;
3426 #ifdef SEARCH_EXTS
3427         if ((curext = strrchr(scriptname,'.')))	/* possible current ext */
3428             while (ext[i])
3429                 if (strEQ(ext[i++],curext)) {
3430                     extidx = -1;		/* already has an ext */
3431                     break;
3432                 }
3433         do {
3434 #endif
3435             DEBUG_p(PerlIO_printf(Perl_debug_log,
3436                                   "Looking for %s\n",cur));
3437             {
3438                 Stat_t statbuf;
3439                 if (PerlLIO_stat(cur,&statbuf) >= 0
3440                     && !S_ISDIR(statbuf.st_mode)) {
3441                     dosearch = 0;
3442                     scriptname = cur;
3443 #ifdef SEARCH_EXTS
3444                     break;
3445 #endif
3446                 }
3447             }
3448 #ifdef SEARCH_EXTS
3449             if (cur == scriptname) {
3450                 len = strlen(scriptname);
3451                 if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
3452                     break;
3453                 my_strlcpy(tmpbuf, scriptname, sizeof(tmpbuf));
3454                 cur = tmpbuf;
3455             }
3456         } while (extidx >= 0 && ext[extidx]	/* try an extension? */
3457                  && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len));
3458 #endif
3459     }
3460 #endif
3461 
3462     if (dosearch && !strchr(scriptname, '/')
3463 #ifdef DOSISH
3464                  && !strchr(scriptname, '\\')
3465 #endif
3466                  && (s = PerlEnv_getenv("PATH")))
3467     {
3468         bool seen_dot = 0;
3469 
3470         bufend = s + strlen(s);
3471         while (s < bufend) {
3472             Stat_t statbuf;
3473 #  ifdef DOSISH
3474             for (len = 0; *s
3475                     && *s != ';'; len++, s++) {
3476                 if (len < sizeof tmpbuf)
3477                     tmpbuf[len] = *s;
3478             }
3479             if (len < sizeof tmpbuf)
3480                 tmpbuf[len] = '\0';
3481 #  else
3482             s = delimcpy_no_escape(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend,
3483                                    ':', &len);
3484 #  endif
3485             if (s < bufend)
3486                 s++;
3487             if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
3488                 continue;	/* don't search dir with too-long name */
3489             if (len
3490 #  ifdef DOSISH
3491                 && tmpbuf[len - 1] != '/'
3492                 && tmpbuf[len - 1] != '\\'
3493 #  endif
3494                )
3495                 tmpbuf[len++] = '/';
3496             if (len == 2 && tmpbuf[0] == '.')
3497                 seen_dot = 1;
3498             (void)my_strlcpy(tmpbuf + len, scriptname, sizeof(tmpbuf) - len);
3499 #endif  /* !VMS */
3500 
3501 #ifdef SEARCH_EXTS
3502             len = strlen(tmpbuf);
3503             if (extidx > 0)	/* reset after previous loop */
3504                 extidx = 0;
3505             do {
3506 #endif
3507                 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3508                 retval = PerlLIO_stat(tmpbuf,&statbuf);
3509                 if (S_ISDIR(statbuf.st_mode)) {
3510                     retval = -1;
3511                 }
3512 #ifdef SEARCH_EXTS
3513             } while (  retval < 0		/* not there */
3514                     && extidx>=0 && ext[extidx]	/* try an extension? */
3515                     && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len)
3516                 );
3517 #endif
3518             if (retval < 0)
3519                 continue;
3520             if (S_ISREG(statbuf.st_mode)
3521                 && cando(S_IRUSR,TRUE,&statbuf)
3522 #if !defined(DOSISH)
3523                 && cando(S_IXUSR,TRUE,&statbuf)
3524 #endif
3525                 )
3526             {
3527                 xfound = tmpbuf;		/* bingo! */
3528                 break;
3529             }
3530             if (!xfailed)
3531                 xfailed = savepv(tmpbuf);
3532         }
3533 #ifndef DOSISH
3534         {
3535             Stat_t statbuf;
3536             if (!xfound && !seen_dot && !xfailed &&
3537                 (PerlLIO_stat(scriptname,&statbuf) < 0
3538                  || S_ISDIR(statbuf.st_mode)))
3539 #endif
3540                 seen_dot = 1;			/* Disable message. */
3541 #ifndef DOSISH
3542         }
3543 #endif
3544         if (!xfound) {
3545             if (flags & 1) {			/* do or die? */
3546                 /* diag_listed_as: Can't execute %s */
3547                 Perl_croak(aTHX_ "Can't %s %s%s%s",
3548                       (xfailed ? "execute" : "find"),
3549                       (xfailed ? xfailed : scriptname),
3550                       (xfailed ? "" : " on PATH"),
3551                       (xfailed || seen_dot) ? "" : ", '.' not in PATH");
3552             }
3553             scriptname = NULL;
3554         }
3555         Safefree(xfailed);
3556         scriptname = xfound;
3557     }
3558     return (scriptname ? savepv(scriptname) : NULL);
3559 }
3560 
3561 #ifndef PERL_GET_CONTEXT_DEFINED
3562 
3563 /*
3564 =for apidoc_section $embedding
3565 =for apidoc set_context
3566 
3567 Implements L<perlapi/C<PERL_SET_CONTEXT>>, which you should use instead.
3568 
3569 =cut
3570 */
3571 
3572 void
3573 Perl_set_context(void *t)
3574 {
3575     PERL_ARGS_ASSERT_SET_CONTEXT;
3576 #if defined(USE_ITHREADS)
3577 #  ifdef PERL_USE_THREAD_LOCAL
3578     PL_current_context = t;
3579 #  endif
3580 #  ifdef I_MACH_CTHREADS
3581     cthread_set_data(cthread_self(), t);
3582 #  else
3583     /* We set thread-specific value always, as C++ code has to read it with
3584      * pthreads, because the declaration syntax for thread local storage for C11
3585      * is incompatible with C++, meaning that we can't expose the thread local
3586      * variable to C++ code. */
3587     {
3588         const int error = pthread_setspecific(PL_thr_key, t);
3589         if (error)
3590             Perl_croak_nocontext("panic: pthread_setspecific, error=%d", error);
3591     }
3592 #  endif
3593 
3594     PERL_SET_NON_tTHX_CONTEXT(t);
3595 
3596 #else
3597     PERL_UNUSED_ARG(t);
3598 #endif
3599 }
3600 
3601 #endif /* !PERL_GET_CONTEXT_DEFINED */
3602 
3603 /*
3604 =for apidoc get_op_names
3605 
3606 Return a pointer to the array of all the names of the various OPs
3607 Given an opcode from the enum in F<opcodes.h>, C<PL_op_name[opcode]> returns a
3608 pointer to a C language string giving its name.
3609 
3610 =cut
3611 */
3612 
3613 char **
3614 Perl_get_op_names(pTHX)
3615 {
3616     PERL_UNUSED_CONTEXT;
3617     return (char **)PL_op_name;
3618 }
3619 
3620 /*
3621 =for apidoc get_op_descs
3622 
3623 Return a pointer to the array of all the descriptions of the various OPs
3624 Given an opcode from the enum in F<opcodes.h>, C<PL_op_desc[opcode]> returns a
3625 pointer to a C language string giving its description.
3626 
3627 =cut
3628 */
3629 
3630 char **
3631 Perl_get_op_descs(pTHX)
3632 {
3633     PERL_UNUSED_CONTEXT;
3634     return (char **)PL_op_desc;
3635 }
3636 
3637 const char *
3638 Perl_get_no_modify(pTHX)
3639 {
3640     PERL_UNUSED_CONTEXT;
3641     return PL_no_modify;
3642 }
3643 
3644 U32 *
3645 Perl_get_opargs(pTHX)
3646 {
3647     PERL_UNUSED_CONTEXT;
3648     return (U32 *)PL_opargs;
3649 }
3650 
3651 PPADDR_t*
3652 Perl_get_ppaddr(pTHX)
3653 {
3654     PERL_UNUSED_CONTEXT;
3655     return (PPADDR_t*)PL_ppaddr;
3656 }
3657 
3658 #ifndef HAS_GETENV_LEN
3659 char *
3660 Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
3661 {
3662     char * const env_trans = PerlEnv_getenv(env_elem);
3663     PERL_UNUSED_CONTEXT;
3664     PERL_ARGS_ASSERT_GETENV_LEN;
3665     if (env_trans)
3666         *len = strlen(env_trans);
3667     return env_trans;
3668 }
3669 #endif
3670 
3671 /*
3672 =for apidoc_section $io
3673 =for apidoc my_fflush_all
3674 
3675 Implements C<PERL_FLUSHALL_FOR_CHILD> on some platforms.
3676 
3677 =cut
3678  */
3679 
3680 I32
3681 Perl_my_fflush_all(pTHX)
3682 {
3683 #if defined(USE_PERLIO) || defined(FFLUSH_NULL)
3684     return PerlIO_flush(NULL);
3685 #else
3686 # if defined(HAS__FWALK)
3687     extern int fflush(FILE *);
3688     /* undocumented, unprototyped, but very useful BSDism */
3689     extern void _fwalk(int (*)(FILE *));
3690     _fwalk(&fflush);
3691     return 0;
3692 # else
3693 #  if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
3694     long open_max = -1;
3695 #   ifdef PERL_FFLUSH_ALL_FOPEN_MAX
3696     open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
3697 #   elif defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
3698     open_max = sysconf(_SC_OPEN_MAX);
3699 #   elif defined(FOPEN_MAX)
3700     open_max = FOPEN_MAX;
3701 #   elif defined(OPEN_MAX)
3702     open_max = OPEN_MAX;
3703 #   elif defined(_NFILE)
3704     open_max = _NFILE;
3705 #   endif
3706     if (open_max > 0) {
3707       long i;
3708       for (i = 0; i < open_max; i++)
3709             if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3710                 STDIO_STREAM_ARRAY[i]._file < open_max &&
3711                 STDIO_STREAM_ARRAY[i]._flag)
3712                 PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
3713       return 0;
3714     }
3715 #  endif
3716     SETERRNO(EBADF,RMS_IFI);
3717     return EOF;
3718 # endif
3719 #endif
3720 }
3721 
3722 void
3723 Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have)
3724 {
3725     if (ckWARN(WARN_IO)) {
3726         HEK * const name
3727            = gv && (isGV_with_GP(gv))
3728                 ? GvENAME_HEK((gv))
3729                 : NULL;
3730         const char * const direction = have == '>' ? "out" : "in";
3731 
3732         if (name && HEK_LEN(name))
3733             Perl_warner(aTHX_ packWARN(WARN_IO),
3734                         "Filehandle %" HEKf " opened only for %sput",
3735                         HEKfARG(name), direction);
3736         else
3737             Perl_warner(aTHX_ packWARN(WARN_IO),
3738                         "Filehandle opened only for %sput", direction);
3739     }
3740 }
3741 
3742 void
3743 Perl_report_evil_fh(pTHX_ const GV *gv)
3744 {
3745     const IO *io = gv ? GvIO(gv) : NULL;
3746     const PERL_BITFIELD16 op = PL_op->op_type;
3747     const char *vile;
3748     I32 warn_type;
3749 
3750     if (io && IoTYPE(io) == IoTYPE_CLOSED) {
3751         vile = "closed";
3752         warn_type = WARN_CLOSED;
3753     }
3754     else {
3755         vile = "unopened";
3756         warn_type = WARN_UNOPENED;
3757     }
3758 
3759     if (ckWARN(warn_type)) {
3760         SV * const name
3761             = gv && isGV_with_GP(gv) && GvENAMELEN(gv) ?
3762                                      newSVhek_mortal(GvENAME_HEK(gv)) : NULL;
3763         const char * const pars =
3764             (const char *)(OP_IS_FILETEST(op) ? "" : "()");
3765         const char * const func =
3766             (const char *)
3767             (op == OP_READLINE || op == OP_RCATLINE
3768                                  ? "readline"  :	/* "<HANDLE>" not nice */
3769              op == OP_LEAVEWRITE ? "write" :		/* "write exit" not nice */
3770              PL_op_desc[op]);
3771         const char * const type =
3772             (const char *)
3773             (OP_IS_SOCKET(op) || (io && IoTYPE(io) == IoTYPE_SOCKET)
3774              ? "socket" : "filehandle");
3775         const bool have_name = name && SvCUR(name);
3776         Perl_warner(aTHX_ packWARN(warn_type),
3777                    "%s%s on %s %s%s%" SVf, func, pars, vile, type,
3778                     have_name ? " " : "",
3779                     SVfARG(have_name ? name : &PL_sv_no));
3780         if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3781                 Perl_warner(
3782                             aTHX_ packWARN(warn_type),
3783                         "\t(Are you trying to call %s%s on dirhandle%s%" SVf "?)\n",
3784                         func, pars, have_name ? " " : "",
3785                         SVfARG(have_name ? name : &PL_sv_no)
3786                             );
3787     }
3788 }
3789 
3790 /* To workaround core dumps from the uninitialised tm_zone we get the
3791  * system to give us a reasonable struct to copy.  This fix means that
3792  * strftime uses the tm_zone and tm_gmtoff values returned by
3793  * localtime(time()). That should give the desired result most of the
3794  * time. But probably not always!
3795  *
3796  * This does not address tzname aspects of NETaa14816.
3797  *
3798  */
3799 
3800 #ifdef __GLIBC__
3801 # ifndef STRUCT_TM_HASZONE
3802 #    define STRUCT_TM_HASZONE
3803 # endif
3804 #endif
3805 
3806 #ifdef STRUCT_TM_HASZONE /* Backward compat */
3807 # ifndef HAS_TM_TM_ZONE
3808 #    define HAS_TM_TM_ZONE
3809 # endif
3810 #endif
3811 
3812 void
3813 Perl_init_tm(pTHX_ struct tm *ptm)	/* see mktime, strftime and asctime */
3814 {
3815 #ifdef HAS_TM_TM_ZONE
3816     Time_t now;
3817     const struct tm* my_tm;
3818     PERL_UNUSED_CONTEXT;
3819     PERL_ARGS_ASSERT_INIT_TM;
3820     (void)time(&now);
3821 
3822     LOCALTIME_LOCK;
3823     my_tm = localtime(&now);
3824     if (my_tm)
3825         Copy(my_tm, ptm, 1, struct tm);
3826     LOCALTIME_UNLOCK;
3827 #else
3828     PERL_UNUSED_CONTEXT;
3829     PERL_ARGS_ASSERT_INIT_TM;
3830     PERL_UNUSED_ARG(ptm);
3831 #endif
3832 }
3833 
3834 /*
3835 =for apidoc_section $time
3836 =for apidoc mini_mktime
3837 normalise S<C<struct tm>> values without the localtime() semantics (and
3838 overhead) of mktime().
3839 
3840 =cut
3841  */
3842 void
3843 Perl_mini_mktime(struct tm *ptm)
3844 {
3845     int yearday;
3846     int secs;
3847     int month, mday, year, jday;
3848     int odd_cent, odd_year;
3849 
3850     PERL_ARGS_ASSERT_MINI_MKTIME;
3851 
3852 #define DAYS_PER_YEAR   365
3853 #define DAYS_PER_QYEAR  (4*DAYS_PER_YEAR+1)
3854 #define DAYS_PER_CENT   (25*DAYS_PER_QYEAR-1)
3855 #define DAYS_PER_QCENT  (4*DAYS_PER_CENT+1)
3856 #define SECS_PER_HOUR   (60*60)
3857 #define SECS_PER_DAY    (24*SECS_PER_HOUR)
3858 /* parentheses deliberately absent on these two, otherwise they don't work */
3859 #define MONTH_TO_DAYS   153/5
3860 #define DAYS_TO_MONTH   5/153
3861 /* offset to bias by March (month 4) 1st between month/mday & year finding */
3862 #define YEAR_ADJUST     (4*MONTH_TO_DAYS+1)
3863 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3864 #define WEEKDAY_BIAS    6       /* (1+6)%7 makes Sunday 0 again */
3865 
3866 /*
3867  * Year/day algorithm notes:
3868  *
3869  * With a suitable offset for numeric value of the month, one can find
3870  * an offset into the year by considering months to have 30.6 (153/5) days,
3871  * using integer arithmetic (i.e., with truncation).  To avoid too much
3872  * messing about with leap days, we consider January and February to be
3873  * the 13th and 14th month of the previous year.  After that transformation,
3874  * we need the month index we use to be high by 1 from 'normal human' usage,
3875  * so the month index values we use run from 4 through 15.
3876  *
3877  * Given that, and the rules for the Gregorian calendar (leap years are those
3878  * divisible by 4 unless also divisible by 100, when they must be divisible
3879  * by 400 instead), we can simply calculate the number of days since some
3880  * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3881  * the days we derive from our month index, and adding in the day of the
3882  * month.  The value used here is not adjusted for the actual origin which
3883  * it normally would use (1 January A.D. 1), since we're not exposing it.
3884  * We're only building the value so we can turn around and get the
3885  * normalised values for the year, month, day-of-month, and day-of-year.
3886  *
3887  * For going backward, we need to bias the value we're using so that we find
3888  * the right year value.  (Basically, we don't want the contribution of
3889  * March 1st to the number to apply while deriving the year).  Having done
3890  * that, we 'count up' the contribution to the year number by accounting for
3891  * full quadracenturies (400-year periods) with their extra leap days, plus
3892  * the contribution from full centuries (to avoid counting in the lost leap
3893  * days), plus the contribution from full quad-years (to count in the normal
3894  * leap days), plus the leftover contribution from any non-leap years.
3895  * At this point, if we were working with an actual leap day, we'll have 0
3896  * days left over.  This is also true for March 1st, however.  So, we have
3897  * to special-case that result, and (earlier) keep track of the 'odd'
3898  * century and year contributions.  If we got 4 extra centuries in a qcent,
3899  * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3900  * Otherwise, we add back in the earlier bias we removed (the 123 from
3901  * figuring in March 1st), find the month index (integer division by 30.6),
3902  * and the remainder is the day-of-month.  We then have to convert back to
3903  * 'real' months (including fixing January and February from being 14/15 in
3904  * the previous year to being in the proper year).  After that, to get
3905  * tm_yday, we work with the normalised year and get a new yearday value for
3906  * January 1st, which we subtract from the yearday value we had earlier,
3907  * representing the date we've re-built.  This is done from January 1
3908  * because tm_yday is 0-origin.
3909  *
3910  * Since POSIX time routines are only guaranteed to work for times since the
3911  * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3912  * applies Gregorian calendar rules even to dates before the 16th century
3913  * doesn't bother me.  Besides, you'd need cultural context for a given
3914  * date to know whether it was Julian or Gregorian calendar, and that's
3915  * outside the scope for this routine.  Since we convert back based on the
3916  * same rules we used to build the yearday, you'll only get strange results
3917  * for input which needed normalising, or for the 'odd' century years which
3918  * were leap years in the Julian calendar but not in the Gregorian one.
3919  * I can live with that.
3920  *
3921  * This algorithm also fails to handle years before A.D. 1 gracefully, but
3922  * that's still outside the scope for POSIX time manipulation, so I don't
3923  * care.
3924  *
3925  * - lwall
3926  */
3927 
3928     year = 1900 + ptm->tm_year;
3929     month = ptm->tm_mon;
3930     mday = ptm->tm_mday;
3931     jday = 0;
3932     if (month >= 2)
3933         month+=2;
3934     else
3935         month+=14, year--;
3936     yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
3937     yearday += month*MONTH_TO_DAYS + mday + jday;
3938     /*
3939      * Note that we don't know when leap-seconds were or will be,
3940      * so we have to trust the user if we get something which looks
3941      * like a sensible leap-second.  Wild values for seconds will
3942      * be rationalised, however.
3943      */
3944     if ((unsigned) ptm->tm_sec <= 60) {
3945         secs = 0;
3946     }
3947     else {
3948         secs = ptm->tm_sec;
3949         ptm->tm_sec = 0;
3950     }
3951     secs += 60 * ptm->tm_min;
3952     secs += SECS_PER_HOUR * ptm->tm_hour;
3953     if (secs < 0) {
3954         if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
3955             /* got negative remainder, but need positive time */
3956             /* back off an extra day to compensate */
3957             yearday += (secs/SECS_PER_DAY)-1;
3958             secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
3959         }
3960         else {
3961             yearday += (secs/SECS_PER_DAY);
3962             secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
3963         }
3964     }
3965     else if (secs >= SECS_PER_DAY) {
3966         yearday += (secs/SECS_PER_DAY);
3967         secs %= SECS_PER_DAY;
3968     }
3969     ptm->tm_hour = secs/SECS_PER_HOUR;
3970     secs %= SECS_PER_HOUR;
3971     ptm->tm_min = secs/60;
3972     secs %= 60;
3973     ptm->tm_sec += secs;
3974     /* done with time of day effects */
3975     /*
3976      * The algorithm for yearday has (so far) left it high by 428.
3977      * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
3978      * bias it by 123 while trying to figure out what year it
3979      * really represents.  Even with this tweak, the reverse
3980      * translation fails for years before A.D. 0001.
3981      * It would still fail for Feb 29, but we catch that one below.
3982      */
3983     jday = yearday;	/* save for later fixup vis-a-vis Jan 1 */
3984     yearday -= YEAR_ADJUST;
3985     year = (yearday / DAYS_PER_QCENT) * 400;
3986     yearday %= DAYS_PER_QCENT;
3987     odd_cent = yearday / DAYS_PER_CENT;
3988     year += odd_cent * 100;
3989     yearday %= DAYS_PER_CENT;
3990     year += (yearday / DAYS_PER_QYEAR) * 4;
3991     yearday %= DAYS_PER_QYEAR;
3992     odd_year = yearday / DAYS_PER_YEAR;
3993     year += odd_year;
3994     yearday %= DAYS_PER_YEAR;
3995     if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
3996         month = 1;
3997         yearday = 29;
3998     }
3999     else {
4000         yearday += YEAR_ADJUST;	/* recover March 1st crock */
4001         month = yearday*DAYS_TO_MONTH;
4002         yearday -= month*MONTH_TO_DAYS;
4003         /* recover other leap-year adjustment */
4004         if (month > 13) {
4005             month-=14;
4006             year++;
4007         }
4008         else {
4009             month-=2;
4010         }
4011     }
4012     ptm->tm_year = year - 1900;
4013     if (yearday) {
4014       ptm->tm_mday = yearday;
4015       ptm->tm_mon = month;
4016     }
4017     else {
4018       ptm->tm_mday = 31;
4019       ptm->tm_mon = month - 1;
4020     }
4021     /* re-build yearday based on Jan 1 to get tm_yday */
4022     year--;
4023     yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
4024     yearday += 14*MONTH_TO_DAYS + 1;
4025     ptm->tm_yday = jday - yearday;
4026     ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
4027 }
4028 
4029 #define SV_CWD_RETURN_UNDEF \
4030     sv_set_undef(sv); \
4031     return FALSE
4032 
4033 #define SV_CWD_ISDOT(dp) \
4034     (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
4035         (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
4036 
4037 /*
4038 =for apidoc_section $utility
4039 
4040 =for apidoc getcwd_sv
4041 
4042 Fill C<sv> with current working directory
4043 
4044 =cut
4045 */
4046 
4047 /* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
4048  * rewritten again by dougm, optimized for use with xs TARG, and to prefer
4049  * getcwd(3) if available
4050  * Comments from the original:
4051  *     This is a faster version of getcwd.  It's also more dangerous
4052  *     because you might chdir out of a directory that you can't chdir
4053  *     back into. */
4054 
4055 int
4056 Perl_getcwd_sv(pTHX_ SV *sv)
4057 {
4058 #ifndef PERL_MICRO
4059     SvTAINTED_on(sv);
4060 
4061     PERL_ARGS_ASSERT_GETCWD_SV;
4062 
4063 #ifdef HAS_GETCWD
4064     {
4065         char buf[MAXPATHLEN];
4066 
4067         /* Some getcwd()s automatically allocate a buffer of the given
4068          * size from the heap if they are given a NULL buffer pointer.
4069          * The problem is that this behaviour is not portable. */
4070         if (getcwd(buf, sizeof(buf) - 1)) {
4071             sv_setpv(sv, buf);
4072             return TRUE;
4073         }
4074         else {
4075             SV_CWD_RETURN_UNDEF;
4076         }
4077     }
4078 
4079 #else
4080 
4081     Stat_t statbuf;
4082     int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
4083     int pathlen=0;
4084     Direntry_t *dp;
4085 
4086     SvUPGRADE(sv, SVt_PV);
4087 
4088     if (PerlLIO_lstat(".", &statbuf) < 0) {
4089         SV_CWD_RETURN_UNDEF;
4090     }
4091 
4092     orig_cdev = statbuf.st_dev;
4093     orig_cino = statbuf.st_ino;
4094     cdev = orig_cdev;
4095     cino = orig_cino;
4096 
4097     for (;;) {
4098         DIR *dir;
4099         int namelen;
4100         odev = cdev;
4101         oino = cino;
4102 
4103         if (PerlDir_chdir("..") < 0) {
4104             SV_CWD_RETURN_UNDEF;
4105         }
4106         if (PerlLIO_stat(".", &statbuf) < 0) {
4107             SV_CWD_RETURN_UNDEF;
4108         }
4109 
4110         cdev = statbuf.st_dev;
4111         cino = statbuf.st_ino;
4112 
4113         if (odev == cdev && oino == cino) {
4114             break;
4115         }
4116         if (!(dir = PerlDir_open("."))) {
4117             SV_CWD_RETURN_UNDEF;
4118         }
4119 
4120         while ((dp = PerlDir_read(dir)) != NULL) {
4121 #ifdef DIRNAMLEN
4122             namelen = dp->d_namlen;
4123 #else
4124             namelen = strlen(dp->d_name);
4125 #endif
4126             /* skip . and .. */
4127             if (SV_CWD_ISDOT(dp)) {
4128                 continue;
4129             }
4130 
4131             if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
4132                 SV_CWD_RETURN_UNDEF;
4133             }
4134 
4135             tdev = statbuf.st_dev;
4136             tino = statbuf.st_ino;
4137             if (tino == oino && tdev == odev) {
4138                 break;
4139             }
4140         }
4141 
4142         if (!dp) {
4143             SV_CWD_RETURN_UNDEF;
4144         }
4145 
4146         if (pathlen + namelen + 1 >= MAXPATHLEN) {
4147             SV_CWD_RETURN_UNDEF;
4148         }
4149 
4150         SvGROW(sv, pathlen + namelen + 1);
4151 
4152         if (pathlen) {
4153             /* shift down */
4154             Move(SvPVX_const(sv), SvPVX(sv) + namelen + 1, pathlen, char);
4155         }
4156 
4157         /* prepend current directory to the front */
4158         *SvPVX(sv) = '/';
4159         Move(dp->d_name, SvPVX(sv)+1, namelen, char);
4160         pathlen += (namelen + 1);
4161 
4162 #ifdef VOID_CLOSEDIR
4163         PerlDir_close(dir);
4164 #else
4165         if (PerlDir_close(dir) < 0) {
4166             SV_CWD_RETURN_UNDEF;
4167         }
4168 #endif
4169     }
4170 
4171     if (pathlen) {
4172         SvCUR_set(sv, pathlen);
4173         *SvEND(sv) = '\0';
4174         SvPOK_only(sv);
4175 
4176         if (PerlDir_chdir(SvPVX_const(sv)) < 0) {
4177             SV_CWD_RETURN_UNDEF;
4178         }
4179     }
4180     if (PerlLIO_stat(".", &statbuf) < 0) {
4181         SV_CWD_RETURN_UNDEF;
4182     }
4183 
4184     cdev = statbuf.st_dev;
4185     cino = statbuf.st_ino;
4186 
4187     if (cdev != orig_cdev || cino != orig_cino) {
4188         Perl_croak(aTHX_ "Unstable directory path, "
4189                    "current directory changed unexpectedly");
4190     }
4191 
4192     return TRUE;
4193 #endif
4194 
4195 #else
4196     return FALSE;
4197 #endif
4198 }
4199 
4200 #include "vutil.c"
4201 
4202 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM) && defined(HAS_SELECT)
4203 #   define EMULATE_SOCKETPAIR_UDP
4204 #endif
4205 
4206 #ifdef EMULATE_SOCKETPAIR_UDP
4207 static int
4208 S_socketpair_udp (int fd[2]) {
4209     dTHX;
4210     /* Fake a datagram socketpair using UDP to localhost.  */
4211     int sockets[2] = {-1, -1};
4212     struct sockaddr_in addresses[2];
4213     int i;
4214     Sock_size_t size = sizeof(struct sockaddr_in);
4215     unsigned short port;
4216     int got;
4217 
4218     memset(&addresses, 0, sizeof(addresses));
4219     i = 1;
4220     do {
4221         sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET);
4222         if (sockets[i] == -1)
4223             goto tidy_up_and_fail;
4224 
4225         addresses[i].sin_family = AF_INET;
4226         addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4227         addresses[i].sin_port = 0;	/* kernel chooses port.  */
4228         if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
4229                 sizeof(struct sockaddr_in)) == -1)
4230             goto tidy_up_and_fail;
4231     } while (i--);
4232 
4233     /* Now have 2 UDP sockets. Find out which port each is connected to, and
4234        for each connect the other socket to it.  */
4235     i = 1;
4236     do {
4237         if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i],
4238                 &size) == -1)
4239             goto tidy_up_and_fail;
4240         if (size != sizeof(struct sockaddr_in))
4241             goto abort_tidy_up_and_fail;
4242         /* !1 is 0, !0 is 1 */
4243         if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i],
4244                 sizeof(struct sockaddr_in)) == -1)
4245             goto tidy_up_and_fail;
4246     } while (i--);
4247 
4248     /* Now we have 2 sockets connected to each other. I don't trust some other
4249        process not to have already sent a packet to us (by random) so send
4250        a packet from each to the other.  */
4251     i = 1;
4252     do {
4253         /* I'm going to send my own port number.  As a short.
4254            (Who knows if someone somewhere has sin_port as a bitfield and needs
4255            this routine. (I'm assuming crays have socketpair)) */
4256         port = addresses[i].sin_port;
4257         got = PerlLIO_write(sockets[i], &port, sizeof(port));
4258         if (got != sizeof(port)) {
4259             if (got == -1)
4260                 goto tidy_up_and_fail;
4261             goto abort_tidy_up_and_fail;
4262         }
4263     } while (i--);
4264 
4265     /* Packets sent. I don't trust them to have arrived though.
4266        (As I understand it Solaris TCP stack is multithreaded. Non-blocking
4267        connect to localhost will use a second kernel thread. In 2.6 the
4268        first thread running the connect() returns before the second completes,
4269        so EINPROGRESS> In 2.7 the improved stack is faster and connect()
4270        returns 0. Poor programs have tripped up. One poor program's authors'
4271        had a 50-1 reverse stock split. Not sure how connected these were.)
4272        So I don't trust someone not to have an unpredictable UDP stack.
4273     */
4274 
4275     {
4276         struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */
4277         int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0];
4278         fd_set rset;
4279 
4280         FD_ZERO(&rset);
4281         FD_SET((unsigned int)sockets[0], &rset);
4282         FD_SET((unsigned int)sockets[1], &rset);
4283 
4284         got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor);
4285         if (got != 2 || !FD_ISSET(sockets[0], &rset)
4286                 || !FD_ISSET(sockets[1], &rset)) {
4287             /* I hope this is portable and appropriate.  */
4288             if (got == -1)
4289                 goto tidy_up_and_fail;
4290             goto abort_tidy_up_and_fail;
4291         }
4292     }
4293 
4294     /* And the paranoia department even now doesn't trust it to have arrive
4295        (hence MSG_DONTWAIT). Or that what arrives was sent by us.  */
4296     {
4297         struct sockaddr_in readfrom;
4298         unsigned short buffer[2];
4299 
4300         i = 1;
4301         do {
4302 #ifdef MSG_DONTWAIT
4303             got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4304                     sizeof(buffer), MSG_DONTWAIT,
4305                     (struct sockaddr *) &readfrom, &size);
4306 #else
4307             got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4308                     sizeof(buffer), 0,
4309                     (struct sockaddr *) &readfrom, &size);
4310 #endif
4311 
4312             if (got == -1)
4313                 goto tidy_up_and_fail;
4314             if (got != sizeof(port)
4315                     || size != sizeof(struct sockaddr_in)
4316                     /* Check other socket sent us its port.  */
4317                     || buffer[0] != (unsigned short) addresses[!i].sin_port
4318                     /* Check kernel says we got the datagram from that socket */
4319                     || readfrom.sin_family != addresses[!i].sin_family
4320                     || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr
4321                     || readfrom.sin_port != addresses[!i].sin_port)
4322                 goto abort_tidy_up_and_fail;
4323         } while (i--);
4324     }
4325     /* My caller (my_socketpair) has validated that this is non-NULL  */
4326     fd[0] = sockets[0];
4327     fd[1] = sockets[1];
4328     /* I hereby declare this connection open.  May God bless all who cross
4329        her.  */
4330     return 0;
4331 
4332   abort_tidy_up_and_fail:
4333     errno = ECONNABORTED;
4334   tidy_up_and_fail:
4335     {
4336         dSAVE_ERRNO;
4337         if (sockets[0] != -1)
4338             PerlLIO_close(sockets[0]);
4339         if (sockets[1] != -1)
4340             PerlLIO_close(sockets[1]);
4341         RESTORE_ERRNO;
4342         return -1;
4343     }
4344 }
4345 #endif /*  EMULATE_SOCKETPAIR_UDP */
4346 
4347 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET)
4348 
4349 /*
4350 =for apidoc my_socketpair
4351 
4352 Emulates L<socketpair(2)> on systems that don't have it, but which do have
4353 enough functionality for the emulation.
4354 
4355 =cut
4356 */
4357 
4358 int
4359 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4360     /* Stevens says that family must be AF_LOCAL, protocol 0.
4361        I'm going to enforce that, then ignore it, and use TCP (or UDP).  */
4362     dTHXa(NULL);
4363     int listener = -1;
4364     int connector = -1;
4365     int acceptor = -1;
4366     struct sockaddr_in listen_addr;
4367     struct sockaddr_in connect_addr;
4368     Sock_size_t size;
4369 
4370     if (protocol
4371 #ifdef AF_UNIX
4372         || family != AF_UNIX
4373 #endif
4374     ) {
4375         errno = EAFNOSUPPORT;
4376         return -1;
4377     }
4378     if (!fd) {
4379         errno = EINVAL;
4380         return -1;
4381     }
4382 
4383 #ifdef SOCK_CLOEXEC
4384     type &= ~SOCK_CLOEXEC;
4385 #endif
4386 
4387 #ifdef EMULATE_SOCKETPAIR_UDP
4388     if (type == SOCK_DGRAM)
4389         return S_socketpair_udp(fd);
4390 #endif
4391 
4392     aTHXa(PERL_GET_THX);
4393     listener = PerlSock_socket(AF_INET, type, 0);
4394     if (listener == -1)
4395         return -1;
4396     memset(&listen_addr, 0, sizeof(listen_addr));
4397     listen_addr.sin_family = AF_INET;
4398     listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4399     listen_addr.sin_port = 0;	/* kernel chooses port.  */
4400     if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
4401             sizeof(listen_addr)) == -1)
4402         goto tidy_up_and_fail;
4403     if (PerlSock_listen(listener, 1) == -1)
4404         goto tidy_up_and_fail;
4405 
4406     connector = PerlSock_socket(AF_INET, type, 0);
4407     if (connector == -1)
4408         goto tidy_up_and_fail;
4409     /* We want to find out the port number to connect to.  */
4410     size = sizeof(connect_addr);
4411     if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr,
4412             &size) == -1)
4413         goto tidy_up_and_fail;
4414     if (size != sizeof(connect_addr))
4415         goto abort_tidy_up_and_fail;
4416     if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr,
4417             sizeof(connect_addr)) == -1)
4418         goto tidy_up_and_fail;
4419 
4420     size = sizeof(listen_addr);
4421     acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr,
4422             &size);
4423     if (acceptor == -1)
4424         goto tidy_up_and_fail;
4425     if (size != sizeof(listen_addr))
4426         goto abort_tidy_up_and_fail;
4427     PerlLIO_close(listener);
4428     /* Now check we are talking to ourself by matching port and host on the
4429        two sockets.  */
4430     if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr,
4431             &size) == -1)
4432         goto tidy_up_and_fail;
4433     if (size != sizeof(connect_addr)
4434             || listen_addr.sin_family != connect_addr.sin_family
4435             || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
4436             || listen_addr.sin_port != connect_addr.sin_port) {
4437         goto abort_tidy_up_and_fail;
4438     }
4439     fd[0] = connector;
4440     fd[1] = acceptor;
4441     return 0;
4442 
4443   abort_tidy_up_and_fail:
4444 #ifdef ECONNABORTED
4445   errno = ECONNABORTED;	/* This would be the standard thing to do. */
4446 #elif defined(ECONNREFUSED)
4447   errno = ECONNREFUSED;	/* some OSes might not have ECONNABORTED. */
4448 #else
4449   errno = ETIMEDOUT;	/* Desperation time. */
4450 #endif
4451   tidy_up_and_fail:
4452     {
4453         dSAVE_ERRNO;
4454         if (listener != -1)
4455             PerlLIO_close(listener);
4456         if (connector != -1)
4457             PerlLIO_close(connector);
4458         if (acceptor != -1)
4459             PerlLIO_close(acceptor);
4460         RESTORE_ERRNO;
4461         return -1;
4462     }
4463 }
4464 #else
4465 /* In any case have a stub so that there's code corresponding
4466  * to the my_socketpair in embed.fnc. */
4467 int
4468 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4469 #ifdef HAS_SOCKETPAIR
4470     return socketpair(family, type, protocol, fd);
4471 #else
4472     return -1;
4473 #endif
4474 }
4475 #endif
4476 
4477 /*
4478 
4479 =for apidoc sv_nosharing
4480 
4481 Dummy routine which "shares" an SV when there is no sharing module present.
4482 Or "locks" it.  Or "unlocks" it.  In other
4483 words, ignores its single SV argument.
4484 Exists to avoid test for a C<NULL> function pointer and because it could
4485 potentially warn under some level of strict-ness.
4486 
4487 =cut
4488 */
4489 
4490 void
4491 Perl_sv_nosharing(pTHX_ SV *sv)
4492 {
4493     PERL_UNUSED_CONTEXT;
4494     PERL_UNUSED_ARG(sv);
4495 }
4496 
4497 /*
4498 
4499 =for apidoc sv_destroyable
4500 
4501 Dummy routine which reports that object can be destroyed when there is no
4502 sharing module present.  It ignores its single SV argument, and returns
4503 'true'.  Exists to avoid test for a C<NULL> function pointer and because it
4504 could potentially warn under some level of strict-ness.
4505 
4506 =cut
4507 */
4508 
4509 bool
4510 Perl_sv_destroyable(pTHX_ SV *sv)
4511 {
4512     PERL_UNUSED_CONTEXT;
4513     PERL_UNUSED_ARG(sv);
4514     return TRUE;
4515 }
4516 
4517 U32
4518 Perl_parse_unicode_opts(pTHX_ const char **popt)
4519 {
4520   const char *p = *popt;
4521   U32 opt = 0;
4522 
4523   PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS;
4524 
4525   if (*p) {
4526        if (isDIGIT(*p)) {
4527             const char* endptr = p + strlen(p);
4528             UV uv;
4529             if (grok_atoUV(p, &uv, &endptr) && uv <= U32_MAX) {
4530                 opt = (U32)uv;
4531                 p = endptr;
4532                 if (p && *p && *p != '\n' && *p != '\r') {
4533                     if (isSPACE(*p))
4534                         goto the_end_of_the_opts_parser;
4535                     else
4536                         Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
4537                 }
4538             }
4539             else {
4540                 Perl_croak(aTHX_ "Invalid number '%s' for -C option.\n", p);
4541             }
4542         }
4543         else {
4544             for (; *p; p++) {
4545                  switch (*p) {
4546                  case PERL_UNICODE_STDIN:
4547                       opt |= PERL_UNICODE_STDIN_FLAG;	break;
4548                  case PERL_UNICODE_STDOUT:
4549                       opt |= PERL_UNICODE_STDOUT_FLAG;	break;
4550                  case PERL_UNICODE_STDERR:
4551                       opt |= PERL_UNICODE_STDERR_FLAG;	break;
4552                  case PERL_UNICODE_STD:
4553                       opt |= PERL_UNICODE_STD_FLAG;    	break;
4554                  case PERL_UNICODE_IN:
4555                       opt |= PERL_UNICODE_IN_FLAG;	break;
4556                  case PERL_UNICODE_OUT:
4557                       opt |= PERL_UNICODE_OUT_FLAG;	break;
4558                  case PERL_UNICODE_INOUT:
4559                       opt |= PERL_UNICODE_INOUT_FLAG;	break;
4560                  case PERL_UNICODE_LOCALE:
4561                       opt |= PERL_UNICODE_LOCALE_FLAG;	break;
4562                  case PERL_UNICODE_ARGV:
4563                       opt |= PERL_UNICODE_ARGV_FLAG;	break;
4564                  case PERL_UNICODE_UTF8CACHEASSERT:
4565                       opt |= PERL_UNICODE_UTF8CACHEASSERT_FLAG; break;
4566                  default:
4567                       if (*p != '\n' && *p != '\r') {
4568                         if(isSPACE(*p)) goto the_end_of_the_opts_parser;
4569                         else
4570                           Perl_croak(aTHX_
4571                                      "Unknown Unicode option letter '%c'", *p);
4572                       }
4573                  }
4574             }
4575        }
4576   }
4577   else
4578        opt = PERL_UNICODE_DEFAULT_FLAGS;
4579 
4580   the_end_of_the_opts_parser:
4581 
4582   if (opt & ~PERL_UNICODE_ALL_FLAGS)
4583        Perl_croak(aTHX_ "Unknown Unicode option value %" UVuf,
4584                   (UV) (opt & ~PERL_UNICODE_ALL_FLAGS));
4585 
4586   *popt = p;
4587 
4588   return opt;
4589 }
4590 
4591 #ifdef VMS
4592 #  include <starlet.h>
4593 #endif
4594 
4595 /* hash a pointer and return a U32
4596  *
4597  * this code was derived from Sereal, which was derived from autobox.
4598  */
4599 
4600 PERL_STATIC_INLINE U32 S_ptr_hash(PTRV u) {
4601 #if PTRSIZE == 8
4602     /*
4603      * This is one of Thomas Wang's hash functions for 64-bit integers from:
4604      * http://www.concentric.net/~Ttwang/tech/inthash.htm
4605      */
4606     u = (~u) + (u << 18);
4607     u = u ^ (u >> 31);
4608     u = u * 21;
4609     u = u ^ (u >> 11);
4610     u = u + (u << 6);
4611     u = u ^ (u >> 22);
4612 #else
4613     /*
4614      * This is one of Bob Jenkins' hash functions for 32-bit integers
4615      * from: http://burtleburtle.net/bob/hash/integer.html
4616      */
4617     u = (u + 0x7ed55d16) + (u << 12);
4618     u = (u ^ 0xc761c23c) ^ (u >> 19);
4619     u = (u + 0x165667b1) + (u << 5);
4620     u = (u + 0xd3a2646c) ^ (u << 9);
4621     u = (u + 0xfd7046c5) + (u << 3);
4622     u = (u ^ 0xb55a4f09) ^ (u >> 16);
4623 #endif
4624     return (U32)u;
4625 }
4626 
4627 
4628 U32
4629 Perl_seed(pTHX)
4630 {
4631 #if defined(__OpenBSD__)
4632 	return arc4random();
4633 #else
4634     /*
4635      * This is really just a quick hack which grabs various garbage
4636      * values.  It really should be a real hash algorithm which
4637      * spreads the effect of every input bit onto every output bit,
4638      * if someone who knows about such things would bother to write it.
4639      * Might be a good idea to add that function to CORE as well.
4640      * No numbers below come from careful analysis or anything here,
4641      * except they are primes and SEED_C1 > 1E6 to get a full-width
4642      * value from (tv_sec * SEED_C1 + tv_usec).  The multipliers should
4643      * probably be bigger too.
4644      */
4645 #if RANDBITS > 16
4646 #  define SEED_C1	1000003
4647 #define   SEED_C4	73819
4648 #else
4649 #  define SEED_C1	25747
4650 #define   SEED_C4	20639
4651 #endif
4652 #define   SEED_C2	3
4653 #define   SEED_C3	269
4654 #define   SEED_C5	26107
4655 
4656 #ifndef PERL_NO_DEV_RANDOM
4657     int fd;
4658 #endif
4659     U32 u;
4660 #ifdef HAS_GETTIMEOFDAY
4661     struct timeval when;
4662 #else
4663     Time_t when;
4664 #endif
4665 
4666 /* This test is an escape hatch, this symbol isn't set by Configure. */
4667 #ifndef PERL_NO_DEV_RANDOM
4668 #ifndef PERL_RANDOM_DEVICE
4669    /* /dev/random isn't used by default because reads from it will block
4670     * if there isn't enough entropy available.  You can compile with
4671     * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
4672     * is enough real entropy to fill the seed. */
4673 #  ifdef __amigaos4__
4674 #    define PERL_RANDOM_DEVICE "RANDOM:SIZE=4"
4675 #  else
4676 #    define PERL_RANDOM_DEVICE "/dev/urandom"
4677 #  endif
4678 #endif
4679     fd = PerlLIO_open_cloexec(PERL_RANDOM_DEVICE, 0);
4680     if (fd != -1) {
4681         if (PerlLIO_read(fd, (void*)&u, sizeof u) != sizeof u)
4682             u = 0;
4683         PerlLIO_close(fd);
4684         if (u)
4685             return u;
4686     }
4687 #endif
4688 
4689 #ifdef HAS_GETTIMEOFDAY
4690     PerlProc_gettimeofday(&when,NULL);
4691     u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
4692 #else
4693     (void)time(&when);
4694     u = (U32)SEED_C1 * when;
4695 #endif
4696     u += SEED_C3 * (U32)PerlProc_getpid();
4697     u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
4698 #ifndef PLAN9           /* XXX Plan9 assembler chokes on this; fix needed  */
4699     UV ptruv = PTR2UV(&when);
4700     u += SEED_C5 * ptr_hash(ptruv);
4701 #endif
4702     return u;
4703 #endif
4704 }
4705 
4706 void
4707 Perl_get_hash_seed(pTHX_ unsigned char * const seed_buffer)
4708 {
4709 #ifndef NO_PERL_HASH_ENV
4710     const char *env_pv;
4711 #endif
4712     unsigned long i;
4713 
4714     PERL_ARGS_ASSERT_GET_HASH_SEED;
4715 
4716     Zero(seed_buffer, PERL_HASH_SEED_BYTES, U8);
4717     Zero((U8*)PL_hash_state_w, PERL_HASH_STATE_BYTES, U8);
4718 
4719 #ifndef NO_PERL_HASH_ENV
4720     env_pv= PerlEnv_getenv("PERL_HASH_SEED");
4721 
4722     if ( env_pv )
4723     {
4724         if (DEBUG_h_TEST)
4725             PerlIO_printf(Perl_debug_log,"Got PERL_HASH_SEED=<%s>\n", env_pv);
4726         /* ignore leading spaces */
4727         while (isSPACE(*env_pv))
4728             env_pv++;
4729 #    ifdef USE_PERL_PERTURB_KEYS
4730         /* if they set it to "0" we disable key traversal randomization completely */
4731         if (strEQ(env_pv,"0")) {
4732             PL_hash_rand_bits_enabled= 0;
4733         } else {
4734             /* otherwise switch to deterministic mode */
4735             PL_hash_rand_bits_enabled= 2;
4736         }
4737 #    endif
4738         /* ignore a leading 0x... if it is there */
4739         if (env_pv[0] == '0' && env_pv[1] == 'x')
4740             env_pv += 2;
4741 
4742         for( i = 0; isXDIGIT(*env_pv) && i < PERL_HASH_SEED_BYTES; i++ ) {
4743             seed_buffer[i] = READ_XDIGIT(env_pv) << 4;
4744             if ( isXDIGIT(*env_pv)) {
4745                 seed_buffer[i] |= READ_XDIGIT(env_pv);
4746             }
4747         }
4748         while (isSPACE(*env_pv))
4749             env_pv++;
4750 
4751         if (*env_pv && !isXDIGIT(*env_pv)) {
4752             Perl_warn(aTHX_ "perl: warning: Non hex character in '$ENV{PERL_HASH_SEED}', seed only partially set\n");
4753         }
4754         /* should we check for unparsed crap? */
4755         /* should we warn about unused hex? */
4756         /* should we warn about insufficient hex? */
4757     }
4758     else
4759 #endif /* NO_PERL_HASH_ENV */
4760     {
4761         for( i = 0; i < PERL_HASH_SEED_BYTES; i++ ) {
4762             seed_buffer[i] = (unsigned char)(Perl_internal_drand48() * (U8_MAX+1));
4763         }
4764     }
4765 #ifdef USE_PERL_PERTURB_KEYS
4766 #  ifndef NO_PERL_HASH_ENV
4767     env_pv= PerlEnv_getenv("PERL_PERTURB_KEYS");
4768     if (env_pv) {
4769         if (DEBUG_h_TEST)
4770             PerlIO_printf(Perl_debug_log,
4771                 "Got PERL_PERTURB_KEYS=<%s>\n", env_pv);
4772         if (strEQ(env_pv,"0") || strEQ(env_pv,"NO")) {
4773             PL_hash_rand_bits_enabled= 0;
4774         } else if (strEQ(env_pv,"1") || strEQ(env_pv,"RANDOM")) {
4775             PL_hash_rand_bits_enabled= 1;
4776         } else if (strEQ(env_pv,"2") || strEQ(env_pv,"DETERMINISTIC")) {
4777             PL_hash_rand_bits_enabled= 2;
4778         } else {
4779             Perl_warn(aTHX_ "perl: warning: strange setting in '$ENV{PERL_PERTURB_KEYS}': '%s'\n", env_pv);
4780         }
4781     }
4782 #  endif
4783     {   /* initialize PL_hash_rand_bits from the hash seed.
4784          * This value is highly volatile, it is updated every
4785          * hash insert, and is used as part of hash bucket chain
4786          * randomization and hash iterator randomization. */
4787         if (PL_hash_rand_bits_enabled == 1) {
4788             /* random mode initialize from seed() like we would our RNG() */
4789             PL_hash_rand_bits= seed();
4790         }
4791         else {
4792             /* Use a constant */
4793             PL_hash_rand_bits= 0xbe49d17f; /* I just picked a number */
4794             /* and then mix in the leading bytes of the hash seed */
4795             for( i = 0; i < sizeof(UV) ; i++ ) {
4796                 PL_hash_rand_bits ^= seed_buffer[i % PERL_HASH_SEED_BYTES];
4797                 PL_hash_rand_bits = ROTL_UV(PL_hash_rand_bits,8);
4798             }
4799         }
4800         if (!PL_hash_rand_bits) {
4801             /* we use an XORSHIFT RNG to munge PL_hash_rand_bits,
4802              * which means it cannot be 0 or it will stay 0 for the
4803              * lifetime of the process, so if by some insane chance we
4804              * ended up with a 0 after the above initialization
4805              * then set it to this. This really should not happen, or
4806              * very very very rarely.
4807              */
4808             PL_hash_rand_bits = 0x8110ba9d; /* a randomly chosen prime */
4809         }
4810     }
4811 #endif
4812 }
4813 
4814 void
4815 Perl_debug_hash_seed(pTHX_ bool via_debug_h)
4816 {
4817     PERL_ARGS_ASSERT_DEBUG_HASH_SEED;
4818 #if (defined(USE_HASH_SEED) || defined(USE_HASH_SEED_DEBUG)) && !defined(NO_PERL_HASH_SEED_DEBUG)
4819     {
4820         const char * const s = PerlEnv_getenv("PERL_HASH_SEED_DEBUG");
4821         bool via_env = cBOOL(s && strNE(s, "0") && strNE(s,""));
4822 
4823         if ( via_env != via_debug_h ) {
4824             const unsigned char *seed= PERL_HASH_SEED;
4825             const unsigned char *seed_end= PERL_HASH_SEED + PERL_HASH_SEED_BYTES;
4826             PerlIO_printf(Perl_debug_log, "HASH_FUNCTION = %s HASH_SEED = 0x", PERL_HASH_FUNC);
4827             while (seed < seed_end) {
4828                 PerlIO_printf(Perl_debug_log, "%02x", *seed++);
4829             }
4830 #ifdef PERL_HASH_RANDOMIZE_KEYS
4831             PerlIO_printf(Perl_debug_log, " PERTURB_KEYS = %d (%s)",
4832                     PL_HASH_RAND_BITS_ENABLED,
4833                     PL_HASH_RAND_BITS_ENABLED == 0 ? "NO" :
4834                     PL_HASH_RAND_BITS_ENABLED == 1 ? "RANDOM"
4835                                                    : "DETERMINISTIC");
4836             if (DEBUG_h_TEST)
4837                 PerlIO_printf(Perl_debug_log,
4838                         " RAND_BITS=0x%" UVxf, PL_hash_rand_bits);
4839 #endif
4840             PerlIO_printf(Perl_debug_log, "\n");
4841         }
4842     }
4843 #endif /* #if (defined(USE_HASH_SEED) ... */
4844 }
4845 
4846 
4847 
4848 
4849 #ifdef PERL_MEM_LOG
4850 
4851 /* -DPERL_MEM_LOG: the Perl_mem_log_..() is compiled, including
4852  * the default implementation, unless -DPERL_MEM_LOG_NOIMPL is also
4853  * given, and you supply your own implementation.
4854  *
4855  * The default implementation reads a single env var, PERL_MEM_LOG,
4856  * expecting one or more of the following:
4857  *
4858  *    \d+ - fd		fd to write to		: must be 1st (grok_atoUV)
4859  *    'm' - memlog	was PERL_MEM_LOG=1
4860  *    's' - svlog	was PERL_SV_LOG=1
4861  *    't' - timestamp	was PERL_MEM_LOG_TIMESTAMP=1
4862  *
4863  * This makes the logger controllable enough that it can reasonably be
4864  * added to the system perl.
4865  */
4866 
4867 /* -DPERL_MEM_LOG_SPRINTF_BUF_SIZE=X: size of a (stack-allocated) buffer
4868  * the Perl_mem_log_...() will use (either via sprintf or snprintf).
4869  */
4870 #define PERL_MEM_LOG_SPRINTF_BUF_SIZE 256
4871 
4872 /* -DPERL_MEM_LOG_FD=N: the file descriptor the Perl_mem_log_...()
4873  * writes to.  In the default logger, this is settable at runtime.
4874  */
4875 #ifndef PERL_MEM_LOG_FD
4876 #  define PERL_MEM_LOG_FD 2 /* If STDERR is too boring for you. */
4877 #endif
4878 
4879 #ifndef PERL_MEM_LOG_NOIMPL
4880 
4881 # ifdef DEBUG_LEAKING_SCALARS
4882 #   define SV_LOG_SERIAL_FMT	    " [%lu]"
4883 #   define _SV_LOG_SERIAL_ARG(sv)   , (unsigned long) (sv)->sv_debug_serial
4884 # else
4885 #   define SV_LOG_SERIAL_FMT
4886 #   define _SV_LOG_SERIAL_ARG(sv)
4887 # endif
4888 
4889 static void
4890 S_mem_log_common(enum mem_log_type mlt, const UV n,
4891                  const UV typesize, const char *type_name, const SV *sv,
4892                  Malloc_t oldalloc, Malloc_t newalloc,
4893                  const char *filename, const int linenumber,
4894                  const char *funcname)
4895 {
4896     const char *pmlenv;
4897     dTHX;
4898 
4899     PERL_ARGS_ASSERT_MEM_LOG_COMMON;
4900 
4901     PL_mem_log[0] |= 0x2;   /* Flag that the call is from this code */
4902     pmlenv = PerlEnv_getenv("PERL_MEM_LOG");
4903     PL_mem_log[0] &= ~0x2;
4904     if (!pmlenv)
4905         return;
4906     if (mlt < MLT_NEW_SV ? strchr(pmlenv,'m') : strchr(pmlenv,'s'))
4907     {
4908         /* We can't use SVs or PerlIO for obvious reasons,
4909          * so we'll use stdio and low-level IO instead. */
4910         char buf[PERL_MEM_LOG_SPRINTF_BUF_SIZE];
4911 
4912 #   ifdef HAS_GETTIMEOFDAY
4913 #     define MEM_LOG_TIME_FMT	"%10d.%06d: "
4914 #     define MEM_LOG_TIME_ARG	(int)tv.tv_sec, (int)tv.tv_usec
4915         struct timeval tv;
4916         PerlProc_gettimeofday(&tv, 0);
4917 #   else
4918 #     define MEM_LOG_TIME_FMT	"%10d: "
4919 #     define MEM_LOG_TIME_ARG	(int)when
4920         Time_t when;
4921         (void)time(&when);
4922 #   endif
4923         /* If there are other OS specific ways of hires time than
4924          * gettimeofday() (see dist/Time-HiRes), the easiest way is
4925          * probably that they would be used to fill in the struct
4926          * timeval. */
4927         {
4928             STRLEN len;
4929             const char* endptr = pmlenv + strlen(pmlenv);
4930             int fd;
4931             UV uv;
4932             if (grok_atoUV(pmlenv, &uv, &endptr) /* Ignore endptr. */
4933                 && uv && uv <= PERL_INT_MAX
4934             ) {
4935                 fd = (int)uv;
4936             } else {
4937                 fd = PERL_MEM_LOG_FD;
4938             }
4939 
4940             if (strchr(pmlenv, 't')) {
4941                 len = my_snprintf(buf, sizeof(buf),
4942                                 MEM_LOG_TIME_FMT, MEM_LOG_TIME_ARG);
4943                 PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
4944             }
4945             switch (mlt) {
4946             case MLT_ALLOC:
4947                 len = my_snprintf(buf, sizeof(buf),
4948                         "alloc: %s:%d:%s: %" IVdf " %" UVuf
4949                         " %s = %" IVdf ": %" UVxf "\n",
4950                         filename, linenumber, funcname, n, typesize,
4951                         type_name, n * typesize, PTR2UV(newalloc));
4952                 break;
4953             case MLT_REALLOC:
4954                 len = my_snprintf(buf, sizeof(buf),
4955                         "realloc: %s:%d:%s: %" IVdf " %" UVuf
4956                         " %s = %" IVdf ": %" UVxf " -> %" UVxf "\n",
4957                         filename, linenumber, funcname, n, typesize,
4958                         type_name, n * typesize, PTR2UV(oldalloc),
4959                         PTR2UV(newalloc));
4960                 break;
4961             case MLT_FREE:
4962                 len = my_snprintf(buf, sizeof(buf),
4963                         "free: %s:%d:%s: %" UVxf "\n",
4964                         filename, linenumber, funcname,
4965                         PTR2UV(oldalloc));
4966                 break;
4967             case MLT_NEW_SV:
4968             case MLT_DEL_SV:
4969                 len = my_snprintf(buf, sizeof(buf),
4970                         "%s_SV: %s:%d:%s: %" UVxf SV_LOG_SERIAL_FMT "\n",
4971                         mlt == MLT_NEW_SV ? "new" : "del",
4972                         filename, linenumber, funcname,
4973                         PTR2UV(sv) _SV_LOG_SERIAL_ARG(sv));
4974                 break;
4975             default:
4976                 len = 0;
4977             }
4978             PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
4979 #ifdef USE_C_BACKTRACE
4980             if(strchr(pmlenv,'c') && (mlt == MLT_NEW_SV)) {
4981                 len = my_snprintf(buf, sizeof(buf),
4982                         "  caller %s at %s line %" LINE_Tf "\n",
4983                         /* CopSTASHPV can crash early on startup; use CopFILE to check */
4984                         CopFILE(PL_curcop) ? CopSTASHPV(PL_curcop) : "<unknown>",
4985                         CopFILE(PL_curcop), CopLINE(PL_curcop));
4986                 PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
4987 
4988                 Perl_c_backtrace *bt = Perl_get_c_backtrace(aTHX_ 3, 3);
4989                 Perl_c_backtrace_frame *frame;
4990                 UV i;
4991                 for (i = 0, frame = bt->frame_info;
4992                         i < bt->header.frame_count;
4993                         i++, frame++) {
4994                     len = my_snprintf(buf, sizeof(buf),
4995                             "  frame[%" UVuf "]: %p %s at %s +0x%lx\n",
4996                             i,
4997                             frame->addr,
4998                             frame->symbol_name_size && frame->symbol_name_offset ? (char *)bt + frame->symbol_name_offset : "-",
4999                             frame->object_name_size && frame->object_name_offset ? (char *)bt + frame->object_name_offset : "?",
5000                             (char *)frame->addr - (char *)frame->object_base_addr);
5001                     PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
5002                 }
5003                 Perl_free_c_backtrace(bt);
5004             }
5005 #endif /* USE_C_BACKTRACE */
5006         }
5007     }
5008 }
5009 #endif /* !PERL_MEM_LOG_NOIMPL */
5010 
5011 #ifndef PERL_MEM_LOG_NOIMPL
5012 # define \
5013     mem_log_common_if(alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm) \
5014     mem_log_common   (alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm)
5015 #else
5016 /* this is suboptimal, but bug compatible.  User is providing their
5017    own implementation, but is getting these functions anyway, and they
5018    do nothing. But _NOIMPL users should be able to cope or fix */
5019 # define \
5020     mem_log_common_if(alty, num, tysz, tynm, u, oal, nal, flnm, ln, fnnm) \
5021     /* mem_log_common_if_PERL_MEM_LOG_NOIMPL */
5022 #endif
5023 
5024 Malloc_t
5025 Perl_mem_log_alloc(const UV n, const UV typesize, const char *type_name,
5026                    Malloc_t newalloc,
5027                    const char *filename, const int linenumber,
5028                    const char *funcname)
5029 {
5030     PERL_ARGS_ASSERT_MEM_LOG_ALLOC;
5031 
5032     mem_log_common_if(MLT_ALLOC, n, typesize, type_name,
5033                       NULL, NULL, newalloc,
5034                       filename, linenumber, funcname);
5035     return newalloc;
5036 }
5037 
5038 Malloc_t
5039 Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name,
5040                      Malloc_t oldalloc, Malloc_t newalloc,
5041                      const char *filename, const int linenumber,
5042                      const char *funcname)
5043 {
5044     PERL_ARGS_ASSERT_MEM_LOG_REALLOC;
5045 
5046     mem_log_common_if(MLT_REALLOC, n, typesize, type_name,
5047                       NULL, oldalloc, newalloc,
5048                       filename, linenumber, funcname);
5049     return newalloc;
5050 }
5051 
5052 Malloc_t
5053 Perl_mem_log_free(Malloc_t oldalloc,
5054                   const char *filename, const int linenumber,
5055                   const char *funcname)
5056 {
5057     PERL_ARGS_ASSERT_MEM_LOG_FREE;
5058 
5059     mem_log_common_if(MLT_FREE, 0, 0, "", NULL, oldalloc, NULL,
5060                       filename, linenumber, funcname);
5061     return oldalloc;
5062 }
5063 
5064 void
5065 Perl_mem_log_new_sv(const SV *sv,
5066                     const char *filename, const int linenumber,
5067                     const char *funcname)
5068 {
5069     PERL_ARGS_ASSERT_MEM_LOG_NEW_SV;
5070 
5071     mem_log_common_if(MLT_NEW_SV, 0, 0, "", sv, NULL, NULL,
5072                       filename, linenumber, funcname);
5073 }
5074 
5075 void
5076 Perl_mem_log_del_sv(const SV *sv,
5077                     const char *filename, const int linenumber,
5078                     const char *funcname)
5079 {
5080     PERL_ARGS_ASSERT_MEM_LOG_DEL_SV;
5081 
5082     mem_log_common_if(MLT_DEL_SV, 0, 0, "", sv, NULL, NULL,
5083                       filename, linenumber, funcname);
5084 }
5085 
5086 #endif /* PERL_MEM_LOG */
5087 
5088 /*
5089 =for apidoc_section $string
5090 =for apidoc quadmath_format_valid
5091 
5092 C<quadmath_snprintf()> is very strict about its C<format> string and will
5093 fail, returning -1, if the format is invalid.  It accepts exactly
5094 one format spec.
5095 
5096 C<quadmath_format_valid()> checks that the intended single spec looks
5097 sane: begins with C<%>, has only one C<%>, ends with C<[efgaEFGA]>,
5098 and has C<Q> before it.  This is not a full "printf syntax check",
5099 just the basics.
5100 
5101 Returns true if it is valid, false if not.
5102 
5103 See also L</quadmath_format_needed>.
5104 
5105 =cut
5106 */
5107 #ifdef USE_QUADMATH
5108 bool
5109 Perl_quadmath_format_valid(const char* format)
5110 {
5111     STRLEN len;
5112 
5113     PERL_ARGS_ASSERT_QUADMATH_FORMAT_VALID;
5114 
5115     if (format[0] != '%' || strchr(format + 1, '%'))
5116         return FALSE;
5117     len = strlen(format);
5118     /* minimum length three: %Qg */
5119     if (len < 3 || memCHRs("efgaEFGA", format[len - 1]) == NULL)
5120         return FALSE;
5121     if (format[len - 2] != 'Q')
5122         return FALSE;
5123     return TRUE;
5124 }
5125 #endif
5126 
5127 /*
5128 =for apidoc quadmath_format_needed
5129 
5130 C<quadmath_format_needed()> returns true if the C<format> string seems to
5131 contain at least one non-Q-prefixed C<%[efgaEFGA]> format specifier,
5132 or returns false otherwise.
5133 
5134 The format specifier detection is not complete printf-syntax detection,
5135 but it should catch most common cases.
5136 
5137 If true is returned, those arguments B<should> in theory be processed
5138 with C<quadmath_snprintf()>, but in case there is more than one such
5139 format specifier (see L</quadmath_format_valid>), and if there is
5140 anything else beyond that one (even just a single byte), they
5141 B<cannot> be processed because C<quadmath_snprintf()> is very strict,
5142 accepting only one format spec, and nothing else.
5143 In this case, the code should probably fail.
5144 
5145 =cut
5146 */
5147 #ifdef USE_QUADMATH
5148 bool
5149 Perl_quadmath_format_needed(const char* format)
5150 {
5151   const char *p = format;
5152   const char *q;
5153 
5154   PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED;
5155 
5156   while ((q = strchr(p, '%'))) {
5157     q++;
5158     if (*q == '+') /* plus */
5159       q++;
5160     if (*q == '#') /* alt */
5161       q++;
5162     if (*q == '*') /* width */
5163       q++;
5164     else {
5165       if (isDIGIT(*q)) {
5166         while (isDIGIT(*q)) q++;
5167       }
5168     }
5169     if (*q == '.' && (q[1] == '*' || isDIGIT(q[1]))) { /* prec */
5170       q++;
5171       if (*q == '*')
5172         q++;
5173       else
5174         while (isDIGIT(*q)) q++;
5175     }
5176     if (memCHRs("efgaEFGA", *q)) /* Would have needed 'Q' in front. */
5177       return TRUE;
5178     p = q + 1;
5179   }
5180   return FALSE;
5181 }
5182 #endif
5183 
5184 /*
5185 =for apidoc my_snprintf
5186 
5187 The C library C<snprintf> functionality, if available and
5188 standards-compliant (uses C<vsnprintf>, actually).  However, if the
5189 C<vsnprintf> is not available, will unfortunately use the unsafe
5190 C<vsprintf> which can overrun the buffer (there is an overrun check,
5191 but that may be too late).  Consider using C<sv_vcatpvf> instead, or
5192 getting C<vsnprintf>.
5193 
5194 =cut
5195 */
5196 
5197 int
5198 Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
5199 {
5200     int retval = -1;
5201     va_list ap;
5202     dTHX;
5203 
5204     PERL_ARGS_ASSERT_MY_SNPRINTF;
5205 #ifndef HAS_VSNPRINTF
5206     PERL_UNUSED_VAR(len);
5207 #endif
5208     va_start(ap, format);
5209 #ifdef USE_QUADMATH
5210     {
5211         bool quadmath_valid = FALSE;
5212 
5213         if (quadmath_format_valid(format)) {
5214             /* If the format looked promising, use it as quadmath. */
5215             WITH_LC_NUMERIC_SET_TO_NEEDED(
5216                 retval = quadmath_snprintf(buffer, len, format, va_arg(ap, NV));
5217             );
5218             if (retval == -1) {
5219                 Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", format);
5220             }
5221             quadmath_valid = TRUE;
5222         }
5223         /* quadmath_format_single() will return false for example for
5224          * "foo = %g", or simply "%g".  We could handle the %g by
5225          * using quadmath for the NV args.  More complex cases of
5226          * course exist: "foo = %g, bar = %g", or "foo=%Qg" (otherwise
5227          * quadmath-valid but has stuff in front).
5228          *
5229          * Handling the "Q-less" cases right would require walking
5230          * through the va_list and rewriting the format, calling
5231          * quadmath for the NVs, building a new va_list, and then
5232          * letting vsnprintf/vsprintf to take care of the other
5233          * arguments.  This may be doable.
5234          *
5235          * We do not attempt that now.  But for paranoia, we here try
5236          * to detect some common (but not all) cases where the
5237          * "Q-less" %[efgaEFGA] formats are present, and die if
5238          * detected.  This doesn't fix the problem, but it stops the
5239          * vsnprintf/vsprintf pulling doubles off the va_list when
5240          * __float128 NVs should be pulled off instead.
5241          *
5242          * If quadmath_format_needed() returns false, we are reasonably
5243          * certain that we can call vnsprintf() or vsprintf() safely. */
5244         if (!quadmath_valid && quadmath_format_needed(format))
5245           Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", format);
5246 
5247     }
5248 #endif
5249     if (retval == -1) {
5250 
5251 #ifdef HAS_VSNPRINTF
5252         WITH_LC_NUMERIC_SET_TO_NEEDED(
5253             retval = vsnprintf(buffer, len, format, ap);
5254         );
5255 #else
5256         WITH_LC_NUMERIC_SET_TO_NEEDED(
5257             retval = vsprintf(buffer, format, ap);
5258         );
5259 #endif
5260 
5261     }
5262 
5263     va_end(ap);
5264     /* vsprintf() shows failure with < 0 */
5265     if (retval < 0
5266 #ifdef HAS_VSNPRINTF
5267     /* vsnprintf() shows failure with >= len */
5268         ||
5269         (len > 0 && (Size_t)retval >= len)
5270 #endif
5271     )
5272         Perl_croak_nocontext("panic: my_snprintf buffer overflow");
5273     return retval;
5274 }
5275 
5276 /*
5277 =for apidoc my_vsnprintf
5278 
5279 The C library C<vsnprintf> if available and standards-compliant.
5280 However, if the C<vsnprintf> is not available, will unfortunately
5281 use the unsafe C<vsprintf> which can overrun the buffer (there is an
5282 overrun check, but that may be too late).  Consider using
5283 C<sv_vcatpvf> instead, or getting C<vsnprintf>.
5284 
5285 =cut
5286 */
5287 
5288 int
5289 Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
5290 {
5291 #ifdef USE_QUADMATH
5292     PERL_UNUSED_ARG(buffer);
5293     PERL_UNUSED_ARG(len);
5294     PERL_UNUSED_ARG(format);
5295     /* the cast is to avoid gcc -Wsizeof-array-argument complaining */
5296     PERL_UNUSED_ARG((void*)ap);
5297     Perl_croak_nocontext("panic: my_vsnprintf not available with quadmath");
5298     return 0;
5299 #else
5300     int retval;
5301     dTHX;
5302 
5303 #  ifdef NEED_VA_COPY
5304     va_list apc;
5305 
5306     PERL_ARGS_ASSERT_MY_VSNPRINTF;
5307     Perl_va_copy(ap, apc);
5308 #    ifdef HAS_VSNPRINTF
5309 
5310     WITH_LC_NUMERIC_SET_TO_NEEDED(
5311         retval = vsnprintf(buffer, len, format, apc);
5312     );
5313 #    else
5314     PERL_UNUSED_ARG(len);
5315     WITH_LC_NUMERIC_SET_TO_NEEDED(
5316         retval = vsprintf(buffer, format, apc);
5317     );
5318 #    endif
5319 
5320     va_end(apc);
5321 #  else
5322 #    ifdef HAS_VSNPRINTF
5323     WITH_LC_NUMERIC_SET_TO_NEEDED(
5324         retval = vsnprintf(buffer, len, format, ap);
5325     );
5326 #    else
5327     PERL_UNUSED_ARG(len);
5328     WITH_LC_NUMERIC_SET_TO_NEEDED(
5329         retval = vsprintf(buffer, format, ap);
5330     );
5331 #    endif
5332 #  endif /* #ifdef NEED_VA_COPY */
5333 
5334     /* vsprintf() shows failure with < 0 */
5335     if (retval < 0
5336 #  ifdef HAS_VSNPRINTF
5337     /* vsnprintf() shows failure with >= len */
5338         ||
5339         (len > 0 && (Size_t)retval >= len)
5340 #  endif
5341     )
5342         Perl_croak_nocontext("panic: my_vsnprintf buffer overflow");
5343 
5344     return retval;
5345 #endif
5346 }
5347 
5348 void
5349 Perl_my_clearenv(pTHX)
5350 {
5351 #if ! defined(PERL_MICRO)
5352 #  if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
5353     PerlEnv_clearenv();
5354 #  else /* ! (PERL_IMPLICIT_SYS || WIN32) */
5355 #    if defined(USE_ENVIRON_ARRAY)
5356 #      if defined(USE_ITHREADS)
5357     /* only the parent thread can clobber the process environment, so no need
5358      * to use a mutex */
5359     if (PL_curinterp != aTHX)
5360         return;
5361 #      endif /* USE_ITHREADS */
5362 #      if defined(HAS_CLEARENV)
5363     clearenv();
5364 #      elif defined(HAS_UNSETENV)
5365     int bsiz = 80; /* Most envvar names will be shorter than this. */
5366     char *buf = (char*)safesysmalloc(bsiz);
5367     while (*environ != NULL) {
5368         char *e = strchr(*environ, '=');
5369         int l = e ? e - *environ : (int)strlen(*environ);
5370         if (bsiz < l + 1) {
5371             safesysfree(buf);
5372             bsiz = l + 1; /* + 1 for the \0. */
5373             buf = (char*)safesysmalloc(bsiz);
5374         }
5375         memcpy(buf, *environ, l);
5376         buf[l] = '\0';
5377         unsetenv(buf);
5378     }
5379     safesysfree(buf);
5380 #      else /* ! HAS_CLEARENV && ! HAS_UNSETENV */
5381     /* Just null environ and accept the leakage. */
5382     *environ = NULL;
5383 #      endif /* HAS_CLEARENV || HAS_UNSETENV */
5384 #    endif /* USE_ENVIRON_ARRAY */
5385 #  endif /* PERL_IMPLICIT_SYS || WIN32 */
5386 #endif /* PERL_MICRO */
5387 }
5388 
5389 #ifdef MULTIPLICITY
5390 
5391 /*
5392 =for apidoc my_cxt_init
5393 
5394 Implements the L<perlxs/C<MY_CXT_INIT>> macro, which you should use instead.
5395 
5396 The first time a module is loaded, the global C<PL_my_cxt_index> is incremented,
5397 and that value is assigned to that module's static C<my_cxt_index> (whose
5398 address is passed as an arg).  Then, for each interpreter this function is
5399 called for, it makes sure a C<void*> slot is available to hang the static data
5400 off, by allocating or extending the interpreter's C<PL_my_cxt_list> array
5401 
5402 =cut
5403 */
5404 
5405 void *
5406 Perl_my_cxt_init(pTHX_ int *indexp, size_t size)
5407 {
5408     void *p;
5409     int index;
5410 
5411     PERL_ARGS_ASSERT_MY_CXT_INIT;
5412 
5413     index = *indexp;
5414     /* do initial check without locking.
5415      * -1:    not allocated or another thread currently allocating
5416      *  other: already allocated by another thread
5417      */
5418     if (index == -1) {
5419         MUTEX_LOCK(&PL_my_ctx_mutex);
5420         /*now a stricter check with locking */
5421         index = *indexp;
5422         if (index == -1)
5423             /* this module hasn't been allocated an index yet */
5424             *indexp = PL_my_cxt_index++;
5425         index = *indexp;
5426         MUTEX_UNLOCK(&PL_my_ctx_mutex);
5427     }
5428 
5429     /* make sure the array is big enough */
5430     if (PL_my_cxt_size <= index) {
5431         if (PL_my_cxt_size) {
5432             IV new_size = PL_my_cxt_size;
5433             while (new_size <= index)
5434                 new_size *= 2;
5435             Renew(PL_my_cxt_list, new_size, void *);
5436             PL_my_cxt_size = new_size;
5437         }
5438         else {
5439             PL_my_cxt_size = 16;
5440             Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
5441         }
5442     }
5443     /* newSV() allocates one more than needed */
5444     p = (void*)SvPVX(newSV(size-1));
5445     PL_my_cxt_list[index] = p;
5446     Zero(p, size, char);
5447     return p;
5448 }
5449 
5450 #endif /* MULTIPLICITY */
5451 
5452 
5453 /* Perl_xs_handshake():
5454    implement the various XS_*_BOOTCHECK macros, which are added to .c
5455    files by ExtUtils::ParseXS, to check that the perl the module was built
5456    with is binary compatible with the running perl.
5457 
5458    usage:
5459        Perl_xs_handshake(U32 key, void * v_my_perl, const char * file,
5460             [U32 items, U32 ax], [char * api_version], [char * xs_version])
5461 
5462    The meaning of the varargs is determined the U32 key arg (which is not
5463    a format string). The fields of key are assembled by using HS_KEY().
5464 
5465    Under PERL_IMPLICIT_CONTEX, the v_my_perl arg is of type
5466    "PerlInterpreter *" and represents the callers context; otherwise it is
5467    of type "CV *", and is the boot xsub's CV.
5468 
5469    v_my_perl will catch where a threaded future perl526.dll calling IO.dll
5470    for example, and IO.dll was linked with threaded perl524.dll, and both
5471    perl526.dll and perl524.dll are in %PATH and the Win32 DLL loader
5472    successfully can load IO.dll into the process but simultaneously it
5473    loaded an interpreter of a different version into the process, and XS
5474    code will naturally pass SV*s created by perl524.dll for perl526.dll to
5475    use through perl526.dll's my_perl->Istack_base.
5476 
5477    v_my_perl cannot be the first arg, since then 'key' will be out of
5478    place in a threaded vs non-threaded mixup; and analyzing the key
5479    number's bitfields won't reveal the problem, since it will be a valid
5480    key (unthreaded perl) on interp side, but croak will report the XS mod's
5481    key as gibberish (it is really a my_perl ptr) (threaded XS mod); or if
5482    it's a threaded perl and an unthreaded XS module, threaded perl will
5483    look at an uninit C stack or an uninit register to get 'key'
5484    (remember that it assumes that the 1st arg is the interp cxt).
5485 
5486    'file' is the source filename of the caller.
5487 */
5488 
5489 I32
5490 Perl_xs_handshake(const U32 key, void * v_my_perl, const char * file, ...)
5491 {
5492     va_list args;
5493     U32 items, ax;
5494     void * got;
5495     void * need;
5496     const char *stage = "first";
5497 #ifdef MULTIPLICITY
5498     dTHX;
5499     tTHX xs_interp;
5500 #else
5501     CV* cv;
5502     SV *** xs_spp;
5503 #endif
5504     PERL_ARGS_ASSERT_XS_HANDSHAKE;
5505     va_start(args, file);
5506 
5507     got = INT2PTR(void*, (UV)(key & HSm_KEY_MATCH));
5508     need = (void *)(HS_KEY(FALSE, FALSE, "", "") & HSm_KEY_MATCH);
5509     if (UNLIKELY(got != need))
5510         goto bad_handshake;
5511 /* try to catch where a 2nd threaded perl interp DLL is loaded into a process
5512    by a XS DLL compiled against the wrong interl DLL b/c of bad @INC, and the
5513    2nd threaded perl interp DLL never initialized its TLS/PERL_SYS_INIT3 so
5514    dTHX call from 2nd interp DLL can't return the my_perl that pp_entersub
5515    passed to the XS DLL */
5516 #ifdef MULTIPLICITY
5517     xs_interp = (tTHX)v_my_perl;
5518     got = xs_interp;
5519     need = my_perl;
5520 #else
5521 /* try to catch where an unthreaded perl interp DLL (for ex. perl522.dll) is
5522    loaded into a process by a XS DLL built by an unthreaded perl522.dll perl,
5523    but the DynaLoder/Perl that started the process and loaded the XS DLL is
5524    unthreaded perl524.dll, since unthreadeds don't pass my_perl (a unique *)
5525    through pp_entersub, use a unique value (which is a pointer to PL_stack_sp's
5526    location in the unthreaded perl binary) stored in CV * to figure out if this
5527    Perl_xs_handshake was called by the same pp_entersub */
5528     cv = (CV*)v_my_perl;
5529     xs_spp = (SV***)CvHSCXT(cv);
5530     got = xs_spp;
5531     need = &PL_stack_sp;
5532 #endif
5533     stage = "second";
5534     if(UNLIKELY(got != need)) {
5535         bad_handshake:/* recycle branch and string from above */
5536         if(got != (void *)HSf_NOCHK)
5537             noperl_die("%s: loadable library and perl binaries are mismatched"
5538                        " (got %s handshake key %p, needed %p)\n",
5539                        file, stage, got, need);
5540     }
5541 
5542     if(key & HSf_SETXSUBFN) {     /* this might be called from a module bootstrap */
5543         SAVEPPTR(PL_xsubfilename);/* which was require'd from a XSUB BEGIN */
5544         PL_xsubfilename = file;   /* so the old name must be restored for
5545                                      additional XSUBs to register themselves */
5546         /* XSUBs can't be perl lang/perl5db.pl debugged
5547         if (PERLDB_LINE_OR_SAVESRC)
5548             (void)gv_fetchfile(file); */
5549     }
5550 
5551     if(key & HSf_POPMARK) {
5552         ax = POPMARK;
5553         {   SV **mark = PL_stack_base + ax++;
5554             {   dSP;
5555                 items = (I32)(SP - MARK);
5556             }
5557         }
5558     } else {
5559         items = va_arg(args, U32);
5560         ax = va_arg(args, U32);
5561     }
5562     {
5563         U32 apiverlen;
5564         assert(HS_GETAPIVERLEN(key) <= UCHAR_MAX);
5565         if((apiverlen = HS_GETAPIVERLEN(key))) {
5566             char * api_p = va_arg(args, char*);
5567             if(apiverlen != sizeof("v" PERL_API_VERSION_STRING)-1
5568                 || memNE(api_p, "v" PERL_API_VERSION_STRING,
5569                          sizeof("v" PERL_API_VERSION_STRING)-1))
5570                 Perl_croak_nocontext("Perl API version %s of %" SVf " does not match %s",
5571                                     api_p, SVfARG(PL_stack_base[ax + 0]),
5572                                     "v" PERL_API_VERSION_STRING);
5573         }
5574     }
5575     {
5576         U32 xsverlen = HS_GETXSVERLEN(key);
5577         assert(xsverlen <= UCHAR_MAX && xsverlen <= HS_APIVERLEN_MAX);
5578         if(xsverlen)
5579             S_xs_version_bootcheck(aTHX_
5580                 items, ax, va_arg(args, char*), xsverlen);
5581     }
5582     va_end(args);
5583     return ax;
5584 }
5585 
5586 
5587 STATIC void
5588 S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p,
5589                           STRLEN xs_len)
5590 {
5591     SV *sv;
5592     const char *vn = NULL;
5593     SV *const module = PL_stack_base[ax];
5594 
5595     PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK;
5596 
5597     if (items >= 2)	 /* version supplied as bootstrap arg */
5598         sv = PL_stack_base[ax + 1];
5599     else {
5600         /* XXX GV_ADDWARN */
5601         vn = "XS_VERSION";
5602         sv = get_sv(Perl_form(aTHX_ "%" SVf "::%s", SVfARG(module), vn), 0);
5603         if (!sv || !SvOK(sv)) {
5604             vn = "VERSION";
5605             sv = get_sv(Perl_form(aTHX_ "%" SVf "::%s", SVfARG(module), vn), 0);
5606         }
5607     }
5608     if (sv) {
5609         SV *xssv = Perl_newSVpvn_flags(aTHX_ xs_p, xs_len, SVs_TEMP);
5610         SV *pmsv = sv_isobject(sv) && sv_derived_from(sv, "version")
5611             ? sv : sv_2mortal(new_version(sv));
5612         xssv = upg_version(xssv, 0);
5613         if ( vcmp(pmsv,xssv) ) {
5614             SV *string = vstringify(xssv);
5615             SV *xpt = Perl_newSVpvf(aTHX_ "%" SVf " object version %" SVf
5616                                     " does not match ", SVfARG(module), SVfARG(string));
5617 
5618             SvREFCNT_dec(string);
5619             string = vstringify(pmsv);
5620 
5621             if (vn) {
5622                 Perl_sv_catpvf(aTHX_ xpt, "$%" SVf "::%s %" SVf, SVfARG(module), vn,
5623                                SVfARG(string));
5624             } else {
5625                 Perl_sv_catpvf(aTHX_ xpt, "bootstrap parameter %" SVf, SVfARG(string));
5626             }
5627             SvREFCNT_dec(string);
5628 
5629             Perl_sv_2mortal(aTHX_ xpt);
5630             Perl_croak_sv(aTHX_ xpt);
5631         }
5632     }
5633 }
5634 
5635 PERL_STATIC_INLINE bool
5636 S_gv_has_usable_name(pTHX_ GV *gv)
5637 {
5638     GV **gvp;
5639     return GvSTASH(gv)
5640         && HvHasENAME(GvSTASH(gv))
5641         && (gvp = (GV **)hv_fetchhek(
5642                         GvSTASH(gv), GvNAME_HEK(gv), 0
5643            ))
5644         && *gvp == gv;
5645 }
5646 
5647 void
5648 Perl_get_db_sub(pTHX_ SV **svp, CV *cv)
5649 {
5650     SV * const dbsv = GvSVn(PL_DBsub);
5651     const bool save_taint = TAINT_get;
5652 
5653     /* When we are called from pp_goto (svp is null),
5654      * we do not care about using dbsv to call CV;
5655      * it's for informational purposes only.
5656      */
5657 
5658     PERL_ARGS_ASSERT_GET_DB_SUB;
5659 
5660     TAINT_set(FALSE);
5661     save_item(dbsv);
5662     if (!PERLDB_SUB_NN) {
5663         GV *gv = CvGV(cv);
5664 
5665         if (!svp && !CvLEXICAL(cv)) {
5666             gv_efullname3(dbsv, gv, NULL);
5667         }
5668         else if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED)) || CvLEXICAL(cv)
5669              || strEQ(GvNAME(gv), "END")
5670              || ( /* Could be imported, and old sub redefined. */
5671                  (GvCV(gv) != cv || !S_gv_has_usable_name(aTHX_ gv))
5672                  &&
5673                  !( (SvTYPE(*svp) == SVt_PVGV)
5674                     && (GvCV((const GV *)*svp) == cv)
5675                     /* Use GV from the stack as a fallback. */
5676                     && S_gv_has_usable_name(aTHX_ gv = (GV *)*svp)
5677                   )
5678                 )
5679         ) {
5680             /* GV is potentially non-unique, or contain different CV. */
5681             SV * const tmp = newRV(MUTABLE_SV(cv));
5682             sv_setsv(dbsv, tmp);
5683             SvREFCNT_dec(tmp);
5684         }
5685         else {
5686             sv_sethek(dbsv, HvENAME_HEK(GvSTASH(gv)));
5687             sv_catpvs(dbsv, "::");
5688             sv_cathek(dbsv, GvNAME_HEK(gv));
5689         }
5690     }
5691     else {
5692         const int type = SvTYPE(dbsv);
5693         if (type < SVt_PVIV && type != SVt_IV)
5694             sv_upgrade(dbsv, SVt_PVIV);
5695         (void)SvIOK_on(dbsv);
5696         SvIV_set(dbsv, PTR2IV(cv));	/* Do it the quickest way  */
5697     }
5698     SvSETMAGIC(dbsv);
5699     TAINT_IF(save_taint);
5700 #ifdef NO_TAINT_SUPPORT
5701     PERL_UNUSED_VAR(save_taint);
5702 #endif
5703 }
5704 
5705 /*
5706 =for apidoc_section $io
5707 =for apidoc my_dirfd
5708 
5709 The C library C<L<dirfd(3)>> if available, or a Perl implementation of it, or die
5710 if not easily emulatable.
5711 
5712 =cut
5713 */
5714 
5715 int
5716 Perl_my_dirfd(DIR * dir) {
5717 
5718     /* Most dirfd implementations have problems when passed NULL. */
5719     if(!dir)
5720         return -1;
5721 #ifdef HAS_DIRFD
5722     return dirfd(dir);
5723 #elif defined(HAS_DIR_DD_FD)
5724     return dir->dd_fd;
5725 #else
5726     Perl_croak_nocontext(PL_no_func, "dirfd");
5727     NOT_REACHED; /* NOTREACHED */
5728     return 0;
5729 #endif
5730 }
5731 
5732 #if !defined(HAS_MKOSTEMP) || !defined(HAS_MKSTEMP)
5733 
5734 #define TEMP_FILE_CH "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz0123456789"
5735 #define TEMP_FILE_CH_COUNT (sizeof(TEMP_FILE_CH)-1)
5736 
5737 static int
5738 S_my_mkostemp(char *templte, int flags) {
5739     dTHX;
5740     STRLEN len = strlen(templte);
5741     int fd;
5742     int attempts = 0;
5743 #ifdef VMS
5744     int delete_on_close = flags & O_VMS_DELETEONCLOSE;
5745 
5746     flags &= ~O_VMS_DELETEONCLOSE;
5747 #endif
5748 
5749     if (len < 6 ||
5750         templte[len-1] != 'X' || templte[len-2] != 'X' || templte[len-3] != 'X' ||
5751         templte[len-4] != 'X' || templte[len-5] != 'X' || templte[len-6] != 'X') {
5752         SETERRNO(EINVAL, LIB_INVARG);
5753         return -1;
5754     }
5755 
5756     do {
5757         int i;
5758         for (i = 1; i <= 6; ++i) {
5759             templte[len-i] = TEMP_FILE_CH[(int)(Perl_internal_drand48() * TEMP_FILE_CH_COUNT)];
5760         }
5761 #ifdef VMS
5762         if (delete_on_close) {
5763             fd = open(templte, O_RDWR | O_CREAT | O_EXCL | flags, 0600, "fop=dlt");
5764         }
5765         else
5766 #endif
5767         {
5768             fd = PerlLIO_open3(templte, O_RDWR | O_CREAT | O_EXCL | flags, 0600);
5769         }
5770     } while (fd == -1 && errno == EEXIST && ++attempts <= 100);
5771 
5772     return fd;
5773 }
5774 
5775 #endif
5776 
5777 #ifndef HAS_MKOSTEMP
5778 
5779 /*
5780 =for apidoc my_mkostemp
5781 
5782 The C library C<L<mkostemp(3)>> if available, or a Perl implementation of it.
5783 
5784 =cut
5785 */
5786 
5787 int
5788 Perl_my_mkostemp(char *templte, int flags)
5789 {
5790     PERL_ARGS_ASSERT_MY_MKOSTEMP;
5791     return S_my_mkostemp(templte, flags);
5792 }
5793 #endif
5794 
5795 #ifndef HAS_MKSTEMP
5796 
5797 /*
5798 =for apidoc my_mkstemp
5799 
5800 The C library C<L<mkstemp(3)>> if available, or a Perl implementation of it.
5801 
5802 =cut
5803 */
5804 
5805 int
5806 Perl_my_mkstemp(char *templte)
5807 {
5808     PERL_ARGS_ASSERT_MY_MKSTEMP;
5809     return S_my_mkostemp(templte, 0);
5810 }
5811 #endif
5812 
5813 REGEXP *
5814 Perl_get_re_arg(pTHX_ SV *sv) {
5815 
5816     if (sv) {
5817         if (SvMAGICAL(sv))
5818             mg_get(sv);
5819         if (SvROK(sv))
5820             sv = MUTABLE_SV(SvRV(sv));
5821         if (SvTYPE(sv) == SVt_REGEXP)
5822             return (REGEXP*) sv;
5823     }
5824 
5825     return NULL;
5826 }
5827 
5828 /*
5829  * This code is derived from drand48() implementation from FreeBSD,
5830  * found in lib/libc/gen/_rand48.c.
5831  *
5832  * The U64 implementation is original, based on the POSIX
5833  * specification for drand48().
5834  */
5835 
5836 /*
5837 * Copyright (c) 1993 Martin Birgmeier
5838 * All rights reserved.
5839 *
5840 * You may redistribute unmodified or modified versions of this source
5841 * code provided that the above copyright notice and this and the
5842 * following conditions are retained.
5843 *
5844 * This software is provided ``as is'', and comes with no warranties
5845 * of any kind. I shall in no event be liable for anything that happens
5846 * to anyone/anything when using this software.
5847 */
5848 
5849 #define FREEBSD_DRAND48_SEED_0   (0x330e)
5850 
5851 #ifdef PERL_DRAND48_QUAD
5852 
5853 #define DRAND48_MULT UINT64_C(0x5deece66d)
5854 #define DRAND48_ADD  0xb
5855 #define DRAND48_MASK UINT64_C(0xffffffffffff)
5856 
5857 #else
5858 
5859 #define FREEBSD_DRAND48_SEED_1   (0xabcd)
5860 #define FREEBSD_DRAND48_SEED_2   (0x1234)
5861 #define FREEBSD_DRAND48_MULT_0   (0xe66d)
5862 #define FREEBSD_DRAND48_MULT_1   (0xdeec)
5863 #define FREEBSD_DRAND48_MULT_2   (0x0005)
5864 #define FREEBSD_DRAND48_ADD      (0x000b)
5865 
5866 const unsigned short _rand48_mult[3] = {
5867                 FREEBSD_DRAND48_MULT_0,
5868                 FREEBSD_DRAND48_MULT_1,
5869                 FREEBSD_DRAND48_MULT_2
5870 };
5871 const unsigned short _rand48_add = FREEBSD_DRAND48_ADD;
5872 
5873 #endif
5874 
5875 void
5876 Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed)
5877 {
5878     PERL_ARGS_ASSERT_DRAND48_INIT_R;
5879 
5880 #ifdef PERL_DRAND48_QUAD
5881     *random_state = FREEBSD_DRAND48_SEED_0 + ((U64)seed << 16);
5882 #else
5883     random_state->seed[0] = FREEBSD_DRAND48_SEED_0;
5884     random_state->seed[1] = (U16) seed;
5885     random_state->seed[2] = (U16) (seed >> 16);
5886 #endif
5887 }
5888 
5889 double
5890 Perl_drand48_r(perl_drand48_t *random_state)
5891 {
5892     PERL_ARGS_ASSERT_DRAND48_R;
5893 
5894 #ifdef PERL_DRAND48_QUAD
5895     *random_state = (*random_state * DRAND48_MULT + DRAND48_ADD)
5896         & DRAND48_MASK;
5897 
5898     return ldexp((double)*random_state, -48);
5899 #else
5900     {
5901     U32 accu;
5902     U16 temp[2];
5903 
5904     accu = (U32) _rand48_mult[0] * (U32) random_state->seed[0]
5905          + (U32) _rand48_add;
5906     temp[0] = (U16) accu;        /* lower 16 bits */
5907     accu >>= sizeof(U16) * 8;
5908     accu += (U32) _rand48_mult[0] * (U32) random_state->seed[1]
5909           + (U32) _rand48_mult[1] * (U32) random_state->seed[0];
5910     temp[1] = (U16) accu;        /* middle 16 bits */
5911     accu >>= sizeof(U16) * 8;
5912     accu += _rand48_mult[0] * random_state->seed[2]
5913           + _rand48_mult[1] * random_state->seed[1]
5914           + _rand48_mult[2] * random_state->seed[0];
5915     random_state->seed[0] = temp[0];
5916     random_state->seed[1] = temp[1];
5917     random_state->seed[2] = (U16) accu;
5918 
5919     return ldexp((double) random_state->seed[0], -48) +
5920            ldexp((double) random_state->seed[1], -32) +
5921            ldexp((double) random_state->seed[2], -16);
5922     }
5923 #endif
5924 }
5925 
5926 #ifdef USE_C_BACKTRACE
5927 
5928 /* Possibly move all this USE_C_BACKTRACE code into a new file. */
5929 
5930 #ifdef USE_BFD
5931 
5932 typedef struct {
5933     /* abfd is the BFD handle. */
5934     bfd* abfd;
5935     /* bfd_syms is the BFD symbol table. */
5936     asymbol** bfd_syms;
5937     /* bfd_text is handle to the ".text" section of the object file. */
5938     asection* bfd_text;
5939     /* Since opening the executable and scanning its symbols is quite
5940      * heavy operation, we remember the filename we used the last time,
5941      * and do the opening and scanning only if the filename changes.
5942      * This removes most (but not all) open+scan cycles. */
5943     const char* fname_prev;
5944 } bfd_context;
5945 
5946 /* Given a dl_info, update the BFD context if necessary. */
5947 static void bfd_update(bfd_context* ctx, Dl_info* dl_info)
5948 {
5949     /* BFD open and scan only if the filename changed. */
5950     if (ctx->fname_prev == NULL ||
5951         strNE(dl_info->dli_fname, ctx->fname_prev)) {
5952         if (ctx->abfd) {
5953             bfd_close(ctx->abfd);
5954         }
5955         ctx->abfd = bfd_openr(dl_info->dli_fname, 0);
5956         if (ctx->abfd) {
5957             if (bfd_check_format(ctx->abfd, bfd_object)) {
5958                 IV symbol_size = bfd_get_symtab_upper_bound(ctx->abfd);
5959                 if (symbol_size > 0) {
5960                     Safefree(ctx->bfd_syms);
5961                     Newx(ctx->bfd_syms, symbol_size, asymbol*);
5962                     ctx->bfd_text =
5963                         bfd_get_section_by_name(ctx->abfd, ".text");
5964                 }
5965                 else
5966                     ctx->abfd = NULL;
5967             }
5968             else
5969                 ctx->abfd = NULL;
5970         }
5971         ctx->fname_prev = dl_info->dli_fname;
5972     }
5973 }
5974 
5975 /* Given a raw frame, try to symbolize it and store
5976  * symbol information (source file, line number) away. */
5977 static void bfd_symbolize(bfd_context* ctx,
5978                           void* raw_frame,
5979                           char** symbol_name,
5980                           STRLEN* symbol_name_size,
5981                           char** source_name,
5982                           STRLEN* source_name_size,
5983                           STRLEN* source_line)
5984 {
5985     *symbol_name = NULL;
5986     *symbol_name_size = 0;
5987     if (ctx->abfd) {
5988         IV offset = PTR2IV(raw_frame) - PTR2IV(ctx->bfd_text->vma);
5989         if (offset > 0 &&
5990             bfd_canonicalize_symtab(ctx->abfd, ctx->bfd_syms) > 0) {
5991             const char *file;
5992             const char *func;
5993             unsigned int line = 0;
5994             if (bfd_find_nearest_line(ctx->abfd, ctx->bfd_text,
5995                                       ctx->bfd_syms, offset,
5996                                       &file, &func, &line) &&
5997                 file && func && line > 0) {
5998                 /* Size and copy the source file, use only
5999                  * the basename of the source file.
6000                  *
6001                  * NOTE: the basenames are fine for the
6002                  * Perl source files, but may not always
6003                  * be the best idea for XS files. */
6004                 const char *p, *b = NULL;
6005                 /* Look for the last slash. */
6006                 for (p = file; *p; p++) {
6007                     if (*p == '/')
6008                         b = p + 1;
6009                 }
6010                 if (b == NULL || *b == 0) {
6011                     b = file;
6012                 }
6013                 *source_name_size = p - b + 1;
6014                 Newx(*source_name, *source_name_size + 1, char);
6015                 Copy(b, *source_name, *source_name_size + 1, char);
6016 
6017                 *symbol_name_size = strlen(func);
6018                 Newx(*symbol_name, *symbol_name_size + 1, char);
6019                 Copy(func, *symbol_name, *symbol_name_size + 1, char);
6020 
6021                 *source_line = line;
6022             }
6023         }
6024     }
6025 }
6026 
6027 #endif /* #ifdef USE_BFD */
6028 
6029 #ifdef PERL_DARWIN
6030 
6031 /* OS X has no public API for for 'symbolicating' (Apple official term)
6032  * stack addresses to {function_name, source_file, line_number}.
6033  * Good news: there is command line utility atos(1) which does that.
6034  * Bad news 1: it's a command line utility.
6035  * Bad news 2: one needs to have the Developer Tools installed.
6036  * Bad news 3: in newer releases it needs to be run as 'xcrun atos'.
6037  *
6038  * To recap: we need to open a pipe for reading for a utility which
6039  * might not exist, or exists in different locations, and then parse
6040  * the output.  And since this is all for a low-level API, we cannot
6041  * use high-level stuff.  Thanks, Apple. */
6042 
6043 typedef struct {
6044     /* tool is set to the absolute pathname of the tool to use:
6045      * xcrun or atos. */
6046     const char* tool;
6047     /* format is set to a printf format string used for building
6048      * the external command to run. */
6049     const char* format;
6050     /* unavail is set if e.g. xcrun cannot be found, or something
6051      * else happens that makes getting the backtrace dubious.  Note,
6052      * however, that the context isn't persistent, the next call to
6053      * get_c_backtrace() will start from scratch. */
6054     bool unavail;
6055     /* fname is the current object file name. */
6056     const char* fname;
6057     /* object_base_addr is the base address of the shared object. */
6058     void* object_base_addr;
6059 } atos_context;
6060 
6061 /* Given |dl_info|, updates the context.  If the context has been
6062  * marked unavailable, return immediately.  If not but the tool has
6063  * not been set, set it to either "xcrun atos" or "atos" (also set the
6064  * format to use for creating commands for piping), or if neither is
6065  * unavailable (one needs the Developer Tools installed), mark the context
6066  * an unavailable.  Finally, update the filename (object name),
6067  * and its base address. */
6068 
6069 static void atos_update(atos_context* ctx,
6070                         Dl_info* dl_info)
6071 {
6072     if (ctx->unavail)
6073         return;
6074     if (ctx->tool == NULL) {
6075         const char* tools[] = {
6076             "/usr/bin/xcrun",
6077             "/usr/bin/atos"
6078         };
6079         const char* formats[] = {
6080             "/usr/bin/xcrun atos -o '%s' -l %08x %08x 2>&1",
6081             "/usr/bin/atos -d -o '%s' -l %08x %08x 2>&1"
6082         };
6083         struct stat st;
6084         UV i;
6085         for (i = 0; i < C_ARRAY_LENGTH(tools); i++) {
6086             if (stat(tools[i], &st) == 0 && S_ISREG(st.st_mode)) {
6087                 ctx->tool = tools[i];
6088                 ctx->format = formats[i];
6089                 break;
6090             }
6091         }
6092         if (ctx->tool == NULL) {
6093             ctx->unavail = TRUE;
6094             return;
6095         }
6096     }
6097     if (ctx->fname == NULL ||
6098         strNE(dl_info->dli_fname, ctx->fname)) {
6099         ctx->fname = dl_info->dli_fname;
6100         ctx->object_base_addr = dl_info->dli_fbase;
6101     }
6102 }
6103 
6104 /* Given an output buffer end |p| and its |start|, matches
6105  * for the atos output, extracting the source code location
6106  * and returning non-NULL if possible, returning NULL otherwise. */
6107 static const char* atos_parse(const char* p,
6108                               const char* start,
6109                               STRLEN* source_name_size,
6110                               STRLEN* source_line) {
6111     /* atos() output is something like:
6112      * perl_parse (in miniperl) (perl.c:2314)\n\n".
6113      * We cannot use Perl regular expressions, because we need to
6114      * stay low-level.  Therefore here we have a rolled-out version
6115      * of a state machine which matches _backwards_from_the_end_ and
6116      * if there's a success, returns the starts of the filename,
6117      * also setting the filename size and the source line number.
6118      * The matched regular expression is roughly "\(.*:\d+\)\s*$" */
6119     const char* source_number_start;
6120     const char* source_name_end;
6121     const char* source_line_end = start;
6122     const char* close_paren;
6123     UV uv;
6124 
6125     /* Skip trailing whitespace. */
6126     while (p > start && isSPACE(*p)) p--;
6127     /* Now we should be at the close paren. */
6128     if (p == start || *p != ')')
6129         return NULL;
6130     close_paren = p;
6131     p--;
6132     /* Now we should be in the line number. */
6133     if (p == start || !isDIGIT(*p))
6134         return NULL;
6135     /* Skip over the digits. */
6136     while (p > start && isDIGIT(*p))
6137         p--;
6138     /* Now we should be at the colon. */
6139     if (p == start || *p != ':')
6140         return NULL;
6141     source_number_start = p + 1;
6142     source_name_end = p; /* Just beyond the end. */
6143     p--;
6144     /* Look for the open paren. */
6145     while (p > start && *p != '(')
6146         p--;
6147     if (p == start)
6148         return NULL;
6149     p++;
6150     *source_name_size = source_name_end - p;
6151     if (grok_atoUV(source_number_start, &uv,  &source_line_end)
6152         && source_line_end == close_paren
6153         && uv <= PERL_INT_MAX
6154     ) {
6155         *source_line = (STRLEN)uv;
6156         return p;
6157     }
6158     return NULL;
6159 }
6160 
6161 /* Given a raw frame, read a pipe from the symbolicator (that's the
6162  * technical term) atos, reads the result, and parses the source code
6163  * location.  We must stay low-level, so we use snprintf(), pipe(),
6164  * and fread(), and then also parse the output ourselves. */
6165 static void atos_symbolize(atos_context* ctx,
6166                            void* raw_frame,
6167                            char** source_name,
6168                            STRLEN* source_name_size,
6169                            STRLEN* source_line)
6170 {
6171     char cmd[1024];
6172     const char* p;
6173     Size_t cnt;
6174 
6175     if (ctx->unavail)
6176         return;
6177     /* Simple security measure: if there's any funny business with
6178      * the object name (used as "-o '%s'" ), leave since at least
6179      * partially the user controls it. */
6180     for (p = ctx->fname; *p; p++) {
6181         if (*p == '\'' || isCNTRL(*p)) {
6182             ctx->unavail = TRUE;
6183             return;
6184         }
6185     }
6186 
6187     dTHX;
6188     WITH_LC_NUMERIC_SET_TO_NEEDED(
6189         cnt = snprintf(cmd, sizeof(cmd), ctx->format,
6190                        ctx->fname, ctx->object_base_addr, raw_frame);
6191     );
6192 
6193     if (cnt < sizeof(cmd)) {
6194         /* Undo nostdio.h #defines that disable stdio.
6195          * This is somewhat naughty, but is used elsewhere
6196          * in the core, and affects only OS X. */
6197 #undef FILE
6198 #undef popen
6199 #undef fread
6200 #undef pclose
6201         FILE* fp = popen(cmd, "r");
6202         /* At the moment we open a new pipe for each stack frame.
6203          * This is naturally somewhat slow, but hopefully generating
6204          * stack traces is never going to in a performance critical path.
6205          *
6206          * We could play tricks with atos by batching the stack
6207          * addresses to be resolved: atos can either take multiple
6208          * addresses from the command line, or read addresses from
6209          * a file (though the mess of creating temporary files would
6210          * probably negate much of any possible speedup).
6211          *
6212          * Normally there are only two objects present in the backtrace:
6213          * perl itself, and the libdyld.dylib.  (Note that the object
6214          * filenames contain the full pathname, so perl may not always
6215          * be in the same place.)  Whenever the object in the
6216          * backtrace changes, the base address also changes.
6217          *
6218          * The problem with batching the addresses, though, would be
6219          * matching the results with the addresses: the parsing of
6220          * the results is already painful enough with a single address. */
6221         if (fp) {
6222             char out[1024];
6223             UV cnt = fread(out, 1, sizeof(out), fp);
6224             if (cnt < sizeof(out)) {
6225                 const char* p = atos_parse(out + cnt - 1, out,
6226                                            source_name_size,
6227                                            source_line);
6228                 if (p) {
6229                     Newx(*source_name,
6230                          *source_name_size, char);
6231                     Copy(p, *source_name,
6232                          *source_name_size,  char);
6233                 }
6234             }
6235             pclose(fp);
6236         }
6237     }
6238 }
6239 
6240 #endif /* #ifdef PERL_DARWIN */
6241 
6242 /*
6243 =for apidoc_section $debugging
6244 =for apidoc get_c_backtrace
6245 
6246 Collects the backtrace (aka "stacktrace") into a single linear
6247 malloced buffer, which the caller B<must> C<Perl_free_c_backtrace()>.
6248 
6249 Scans the frames back by S<C<depth + skip>>, then drops the C<skip> innermost,
6250 returning at most C<depth> frames.
6251 
6252 =cut
6253 */
6254 
6255 Perl_c_backtrace*
6256 Perl_get_c_backtrace(pTHX_ int depth, int skip)
6257 {
6258     /* Note that here we must stay as low-level as possible: Newx(),
6259      * Copy(), Safefree(); since we may be called from anywhere,
6260      * so we should avoid higher level constructs like SVs or AVs.
6261      *
6262      * Since we are using safesysmalloc() via Newx(), don't try
6263      * getting backtrace() there, unless you like deep recursion. */
6264 
6265     /* Currently only implemented with backtrace() and dladdr(),
6266      * for other platforms NULL is returned. */
6267 
6268 #if defined(HAS_BACKTRACE) && defined(HAS_DLADDR)
6269     /* backtrace() is available via <execinfo.h> in glibc and in most
6270      * modern BSDs; dladdr() is available via <dlfcn.h>. */
6271 
6272     /* We try fetching this many frames total, but then discard
6273      * the |skip| first ones.  For the remaining ones we will try
6274      * retrieving more information with dladdr(). */
6275     int try_depth = skip +  depth;
6276 
6277     /* The addresses (program counters) returned by backtrace(). */
6278     void** raw_frames;
6279 
6280     /* Retrieved with dladdr() from the addresses returned by backtrace(). */
6281     Dl_info* dl_infos;
6282 
6283     /* Sizes _including_ the terminating \0 of the object name
6284      * and symbol name strings. */
6285     STRLEN* object_name_sizes;
6286     STRLEN* symbol_name_sizes;
6287 
6288 #ifdef USE_BFD
6289     /* The symbol names comes either from dli_sname,
6290      * or if using BFD, they can come from BFD. */
6291     char** symbol_names;
6292 #endif
6293 
6294     /* The source code location information.  Dug out with e.g. BFD. */
6295     char** source_names;
6296     STRLEN* source_name_sizes;
6297     STRLEN* source_lines;
6298 
6299     Perl_c_backtrace* bt = NULL;  /* This is what will be returned. */
6300     int got_depth; /* How many frames were returned from backtrace(). */
6301     UV frame_count = 0; /* How many frames we return. */
6302     UV total_bytes = 0; /* The size of the whole returned backtrace. */
6303 
6304 #ifdef USE_BFD
6305     bfd_context bfd_ctx;
6306 #endif
6307 #ifdef PERL_DARWIN
6308     atos_context atos_ctx;
6309 #endif
6310 
6311     /* Here are probably possibilities for optimizing.  We could for
6312      * example have a struct that contains most of these and then
6313      * allocate |try_depth| of them, saving a bunch of malloc calls.
6314      * Note, however, that |frames| could not be part of that struct
6315      * because backtrace() will want an array of just them.  Also be
6316      * careful about the name strings. */
6317     Newx(raw_frames, try_depth, void*);
6318     Newx(dl_infos, try_depth, Dl_info);
6319     Newx(object_name_sizes, try_depth, STRLEN);
6320     Newx(symbol_name_sizes, try_depth, STRLEN);
6321     Newx(source_names, try_depth, char*);
6322     Newx(source_name_sizes, try_depth, STRLEN);
6323     Newx(source_lines, try_depth, STRLEN);
6324 #ifdef USE_BFD
6325     Newx(symbol_names, try_depth, char*);
6326 #endif
6327 
6328     /* Get the raw frames. */
6329     got_depth = (int)backtrace(raw_frames, try_depth);
6330 
6331     /* We use dladdr() instead of backtrace_symbols() because we want
6332      * the full details instead of opaque strings.  This is useful for
6333      * two reasons: () the details are needed for further symbolic
6334      * digging, for example in OS X (2) by having the details we fully
6335      * control the output, which in turn is useful when more platforms
6336      * are added: we can keep out output "portable". */
6337 
6338     /* We want a single linear allocation, which can then be freed
6339      * with a single swoop.  We will do the usual trick of first
6340      * walking over the structure and seeing how much we need to
6341      * allocate, then allocating, and then walking over the structure
6342      * the second time and populating it. */
6343 
6344     /* First we must compute the total size of the buffer. */
6345     total_bytes = sizeof(Perl_c_backtrace_header);
6346     if (got_depth > skip) {
6347         int i;
6348 #ifdef USE_BFD
6349         bfd_init(); /* Is this safe to call multiple times? */
6350         Zero(&bfd_ctx, 1, bfd_context);
6351 #endif
6352 #ifdef PERL_DARWIN
6353         Zero(&atos_ctx, 1, atos_context);
6354 #endif
6355         for (i = skip; i < try_depth; i++) {
6356             Dl_info* dl_info = &dl_infos[i];
6357 
6358             object_name_sizes[i] = 0;
6359             source_names[i] = NULL;
6360             source_name_sizes[i] = 0;
6361             source_lines[i] = 0;
6362 
6363             /* Yes, zero from dladdr() is failure. */
6364             if (dladdr(raw_frames[i], dl_info)) {
6365                 total_bytes += sizeof(Perl_c_backtrace_frame);
6366 
6367                 object_name_sizes[i] =
6368                     dl_info->dli_fname ? strlen(dl_info->dli_fname) : 0;
6369                 symbol_name_sizes[i] =
6370                     dl_info->dli_sname ? strlen(dl_info->dli_sname) : 0;
6371 #ifdef USE_BFD
6372                 bfd_update(&bfd_ctx, dl_info);
6373                 bfd_symbolize(&bfd_ctx, raw_frames[i],
6374                               &symbol_names[i],
6375                               &symbol_name_sizes[i],
6376                               &source_names[i],
6377                               &source_name_sizes[i],
6378                               &source_lines[i]);
6379 #endif
6380 #if PERL_DARWIN
6381                 atos_update(&atos_ctx, dl_info);
6382                 atos_symbolize(&atos_ctx,
6383                                raw_frames[i],
6384                                &source_names[i],
6385                                &source_name_sizes[i],
6386                                &source_lines[i]);
6387 #endif
6388 
6389                 /* Plus ones for the terminating \0. */
6390                 total_bytes += object_name_sizes[i] + 1;
6391                 total_bytes += symbol_name_sizes[i] + 1;
6392                 total_bytes += source_name_sizes[i] + 1;
6393 
6394                 frame_count++;
6395             } else {
6396                 break;
6397             }
6398         }
6399 #ifdef USE_BFD
6400         Safefree(bfd_ctx.bfd_syms);
6401 #endif
6402     }
6403 
6404     /* Now we can allocate and populate the result buffer. */
6405     Newxc(bt, total_bytes, char, Perl_c_backtrace);
6406     Zero(bt, total_bytes, char);
6407     bt->header.frame_count = frame_count;
6408     bt->header.total_bytes = total_bytes;
6409     if (frame_count > 0) {
6410         Perl_c_backtrace_frame* frame = bt->frame_info;
6411         char* name_base = (char *)(frame + frame_count);
6412         char* name_curr = name_base; /* Outputting the name strings here. */
6413         UV i;
6414         for (i = skip; i < skip + frame_count; i++) {
6415             Dl_info* dl_info = &dl_infos[i];
6416 
6417             frame->addr = raw_frames[i];
6418             frame->object_base_addr = dl_info->dli_fbase;
6419             frame->symbol_addr = dl_info->dli_saddr;
6420 
6421             /* Copies a string, including the \0, and advances the name_curr.
6422              * Also copies the start and the size to the frame. */
6423 #define PERL_C_BACKTRACE_STRCPY(frame, doffset, src, dsize, size) \
6424             if (size && src) \
6425                 Copy(src, name_curr, size, char); \
6426             frame->doffset = name_curr - (char*)bt; \
6427             frame->dsize = size; \
6428             name_curr += size; \
6429             *name_curr++ = 0;
6430 
6431             PERL_C_BACKTRACE_STRCPY(frame, object_name_offset,
6432                                     dl_info->dli_fname,
6433                                     object_name_size, object_name_sizes[i]);
6434 
6435 #ifdef USE_BFD
6436             PERL_C_BACKTRACE_STRCPY(frame, symbol_name_offset,
6437                                     symbol_names[i],
6438                                     symbol_name_size, symbol_name_sizes[i]);
6439             Safefree(symbol_names[i]);
6440 #else
6441             PERL_C_BACKTRACE_STRCPY(frame, symbol_name_offset,
6442                                     dl_info->dli_sname,
6443                                     symbol_name_size, symbol_name_sizes[i]);
6444 #endif
6445 
6446             PERL_C_BACKTRACE_STRCPY(frame, source_name_offset,
6447                                     source_names[i],
6448                                     source_name_size, source_name_sizes[i]);
6449             Safefree(source_names[i]);
6450 
6451 #undef PERL_C_BACKTRACE_STRCPY
6452 
6453             frame->source_line_number = source_lines[i];
6454 
6455             frame++;
6456         }
6457         assert(total_bytes ==
6458                (UV)(sizeof(Perl_c_backtrace_header) +
6459                     frame_count * sizeof(Perl_c_backtrace_frame) +
6460                     name_curr - name_base));
6461     }
6462 #ifdef USE_BFD
6463     Safefree(symbol_names);
6464     if (bfd_ctx.abfd) {
6465         bfd_close(bfd_ctx.abfd);
6466     }
6467 #endif
6468     Safefree(source_lines);
6469     Safefree(source_name_sizes);
6470     Safefree(source_names);
6471     Safefree(symbol_name_sizes);
6472     Safefree(object_name_sizes);
6473     /* Assuming the strings returned by dladdr() are pointers
6474      * to read-only static memory (the object file), so that
6475      * they do not need freeing (and cannot be). */
6476     Safefree(dl_infos);
6477     Safefree(raw_frames);
6478     return bt;
6479 #else
6480     PERL_UNUSED_ARG(depth);
6481     PERL_UNUSED_ARG(skip);
6482     return NULL;
6483 #endif
6484 }
6485 
6486 /*
6487 =for apidoc free_c_backtrace
6488 
6489 Deallocates a backtrace received from get_c_backtrace.
6490 
6491 =cut
6492 */
6493 
6494 /*
6495 =for apidoc get_c_backtrace_dump
6496 
6497 Returns a SV containing a dump of C<depth> frames of the call stack, skipping
6498 the C<skip> innermost ones.  C<depth> of 20 is usually enough.
6499 
6500 The appended output looks like:
6501 
6502  ...
6503  1   10e004812:0082   Perl_croak   util.c:1716    /usr/bin/perl
6504  2   10df8d6d2:1d72   perl_parse   perl.c:3975    /usr/bin/perl
6505  ...
6506 
6507 The fields are tab-separated.  The first column is the depth (zero
6508 being the innermost non-skipped frame).  In the hex:offset, the hex is
6509 where the program counter was in C<S_parse_body>, and the :offset (might
6510 be missing) tells how much inside the C<S_parse_body> the program counter was.
6511 
6512 The C<util.c:1716> is the source code file and line number.
6513 
6514 The F</usr/bin/perl> is obvious (hopefully).
6515 
6516 Unknowns are C<"-">.  Unknowns can happen unfortunately quite easily:
6517 if the platform doesn't support retrieving the information;
6518 if the binary is missing the debug information;
6519 if the optimizer has transformed the code by for example inlining.
6520 
6521 =cut
6522 */
6523 
6524 SV*
6525 Perl_get_c_backtrace_dump(pTHX_ int depth, int skip)
6526 {
6527     Perl_c_backtrace* bt;
6528 
6529     bt = get_c_backtrace(depth, skip + 1 /* Hide ourselves. */);
6530     if (bt) {
6531         Perl_c_backtrace_frame* frame;
6532         SV* dsv = newSVpvs("");
6533         UV i;
6534         for (i = 0, frame = bt->frame_info;
6535              i < bt->header.frame_count; i++, frame++) {
6536             Perl_sv_catpvf(aTHX_ dsv, "%d", (int)i);
6537             Perl_sv_catpvf(aTHX_ dsv, "\t%p", frame->addr ? frame->addr : "-");
6538             /* Symbol (function) names might disappear without debug info.
6539              *
6540              * The source code location might disappear in case of the
6541              * optimizer inlining or otherwise rearranging the code. */
6542             if (frame->symbol_addr) {
6543                 Perl_sv_catpvf(aTHX_ dsv, ":%04x",
6544                                (int)
6545                                ((char*)frame->addr - (char*)frame->symbol_addr));
6546             }
6547             Perl_sv_catpvf(aTHX_ dsv, "\t%s",
6548                            frame->symbol_name_size &&
6549                            frame->symbol_name_offset ?
6550                            (char*)bt + frame->symbol_name_offset : "-");
6551             if (frame->source_name_size &&
6552                 frame->source_name_offset &&
6553                 frame->source_line_number) {
6554                 Perl_sv_catpvf(aTHX_ dsv, "\t%s:%" UVuf,
6555                                (char*)bt + frame->source_name_offset,
6556                                (UV)frame->source_line_number);
6557             } else {
6558                 Perl_sv_catpvf(aTHX_ dsv, "\t-");
6559             }
6560             Perl_sv_catpvf(aTHX_ dsv, "\t%s",
6561                            frame->object_name_size &&
6562                            frame->object_name_offset ?
6563                            (char*)bt + frame->object_name_offset : "-");
6564             /* The frame->object_base_addr is not output,
6565              * but it is used for symbolizing/symbolicating. */
6566             sv_catpvs(dsv, "\n");
6567         }
6568 
6569         Perl_free_c_backtrace(bt);
6570 
6571         return dsv;
6572     }
6573 
6574     return NULL;
6575 }
6576 
6577 /*
6578 =for apidoc dump_c_backtrace
6579 
6580 Dumps the C backtrace to the given C<fp>.
6581 
6582 Returns true if a backtrace could be retrieved, false if not.
6583 
6584 =cut
6585 */
6586 
6587 bool
6588 Perl_dump_c_backtrace(pTHX_ PerlIO* fp, int depth, int skip)
6589 {
6590     SV* sv;
6591 
6592     PERL_ARGS_ASSERT_DUMP_C_BACKTRACE;
6593 
6594     sv = Perl_get_c_backtrace_dump(aTHX_ depth, skip);
6595     if (sv) {
6596         sv_2mortal(sv);
6597         PerlIO_printf(fp, "%s", SvPV_nolen(sv));
6598         return TRUE;
6599     }
6600     return FALSE;
6601 }
6602 
6603 #endif /* #ifdef USE_C_BACKTRACE */
6604 
6605 #if defined(USE_ITHREADS) && defined(I_PTHREAD)
6606 
6607 /* pthread_mutex_t and perl_mutex are typedef equivalent
6608  * so casting the pointers is fine. */
6609 
6610 int perl_tsa_mutex_lock(perl_mutex* mutex)
6611 {
6612     return pthread_mutex_lock((pthread_mutex_t *) mutex);
6613 }
6614 
6615 int perl_tsa_mutex_unlock(perl_mutex* mutex)
6616 {
6617     return pthread_mutex_unlock((pthread_mutex_t *) mutex);
6618 }
6619 
6620 int perl_tsa_mutex_destroy(perl_mutex* mutex)
6621 {
6622     return pthread_mutex_destroy((pthread_mutex_t *) mutex);
6623 }
6624 
6625 #endif
6626 
6627 #ifdef USE_DTRACE
6628 
6629 /* log a sub call or return */
6630 
6631 void
6632 Perl_dtrace_probe_call(pTHX_ CV *cv, bool is_call)
6633 {
6634     const char *func;
6635     const char *file;
6636     const char *stash;
6637     const COP  *start;
6638     line_t      line;
6639 
6640     PERL_ARGS_ASSERT_DTRACE_PROBE_CALL;
6641 
6642     if (CvNAMED(cv)) {
6643         HEK *hek = CvNAME_HEK(cv);
6644         func = HEK_KEY(hek);
6645     }
6646     else {
6647         GV  *gv = CvGV(cv);
6648         func = GvENAME(gv);
6649     }
6650     start = (const COP *)CvSTART(cv);
6651     file  = CopFILE(start);
6652     line  = CopLINE(start);
6653     stash = CopSTASHPV(start);
6654 
6655     if (is_call) {
6656         PERL_SUB_ENTRY(func, file, line, stash);
6657     }
6658     else {
6659         PERL_SUB_RETURN(func, file, line, stash);
6660     }
6661 }
6662 
6663 
6664 /* log a require file loading/loaded  */
6665 
6666 void
6667 Perl_dtrace_probe_load(pTHX_ const char *name, bool is_loading)
6668 {
6669     PERL_ARGS_ASSERT_DTRACE_PROBE_LOAD;
6670 
6671     if (is_loading) {
6672         PERL_LOADING_FILE(name);
6673     }
6674     else {
6675         PERL_LOADED_FILE(name);
6676     }
6677 }
6678 
6679 
6680 /* log an op execution */
6681 
6682 void
6683 Perl_dtrace_probe_op(pTHX_ const OP *op)
6684 {
6685     PERL_ARGS_ASSERT_DTRACE_PROBE_OP;
6686 
6687     PERL_OP_ENTRY(OP_NAME(op));
6688 }
6689 
6690 
6691 /* log a compile/run phase change */
6692 
6693 void
6694 Perl_dtrace_probe_phase(pTHX_ enum perl_phase phase)
6695 {
6696     const char *ph_old = PL_phase_names[PL_phase];
6697     const char *ph_new = PL_phase_names[phase];
6698 
6699     PERL_PHASE_CHANGE(ph_new, ph_old);
6700 }
6701 
6702 #endif
6703 
6704 /*
6705  * ex: set ts=8 sts=4 sw=4 et:
6706  */
6707