7
7
8
8
#define VERSION_MAX 0x7FFFFFFF
9
9
10
+ #ifndef POSIX_SETLOCALE_LOCK
11
+ # ifdef gwLOCALE_LOCK
12
+ # define POSIX_SETLOCALE_LOCK gwLOCALE_LOCK
13
+ # define POSIX_SETLOCALE_UNLOCK gwLOCALE_UNLOCK
14
+ # else
15
+ # define POSIX_SETLOCALE_LOCK NOOP
16
+ # define POSIX_SETLOCALE_UNLOCK NOOP
17
+ # endif
18
+ #endif
19
+ #ifndef DISABLE_LC_NUMERIC_CHANGES
20
+ # ifdef LOCK_LC_NUMERIC_STANDARD
21
+ # define DISABLE_LC_NUMERIC_CHANGES () LOCK_LC_NUMERIC_STANDARD()
22
+ # define REENABLE_LC_NUMERIC_CHANGES () UNLOCK_LC_NUMERIC_STANDARD()
23
+ # else
24
+ # define DISABLE_LC_NUMERIC_CHANGES () NOOP
25
+ # define REENABLE_LC_NUMERIC_CHANGES () NOOP
26
+ # endif
27
+ #endif
28
+
10
29
/*
11
30
=for apidoc prescan_version
12
31
@@ -569,6 +588,9 @@ to force this SV to be interpreted as an "extended" version.
569
588
#define GET_NUMERIC_VERSION (ver , sv , tbuf , buf , len ) \
570
589
STMT_START { \
571
590
\
591
+ /* Prevent callees from trying to change the locale */ \
592
+ DISABLE_LC_NUMERIC_CHANGES (); \
593
+ \
572
594
/* We earlier created 'sv' for very large version numbers, to rely \
573
595
* on the specialized algorithms SV code has built-in for such \
574
596
* values */ \
@@ -582,6 +604,7 @@ to force this SV to be interpreted as an "extended" version.
582
604
buf = tbuf ; \
583
605
} \
584
606
\
607
+ REENABLE_LC_NUMERIC_CHANGES (); \
585
608
} STMT_END
586
609
587
610
SV *
@@ -659,7 +682,7 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
659
682
/* In windows, or not threaded, or not thread-safe, if it isn't C,
660
683
* set it to C. */
661
684
662
- LC_NUMERIC_LOCK ( 0 ) ; /* Start critical section */
685
+ POSIX_SETLOCALE_LOCK ; /* Start critical section */
663
686
664
687
locale_name_on_entry = setlocale (LC_NUMERIC , NULL );
665
688
if ( strNE (locale_name_on_entry , "C" )
@@ -674,19 +697,14 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
674
697
locale_name_on_entry = NULL ;
675
698
}
676
699
677
- /* Prevent recursed calls from trying to change back */
678
- LOCK_LC_NUMERIC_STANDARD ();
679
-
680
700
GET_NUMERIC_VERSION (ver , sv , tbuf , buf , len );
681
701
682
- UNLOCK_LC_NUMERIC_STANDARD ();
683
-
684
702
if (locale_name_on_entry ) {
685
703
setlocale (LC_NUMERIC , locale_name_on_entry );
686
704
Safefree (locale_name_on_entry );
687
705
}
688
706
689
- LC_NUMERIC_UNLOCK ; /* End critical section */
707
+ POSIX_SETLOCALE_UNLOCK ; /* End critical section */
690
708
# endif
691
709
692
710
}
0 commit comments