Skip to content

Commit

Permalink
Change some "shouldn't happen" failures into panics
Browse files Browse the repository at this point in the history
If the system is so broken that these libc calls are failing, soldiering
on won't lead to sane results.

THis rewords some existing panics, and adds the errno to the output for
all of them.
  • Loading branch information
khwilliamson committed Jan 13, 2018
1 parent f705e65 commit ceac0a2
Showing 1 changed file with 32 additions and 39 deletions.
71 changes: 32 additions & 39 deletions locale.c
Expand Up @@ -3090,8 +3090,8 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
save_input_locale = do_setlocale_r(category, NULL);
if (! save_input_locale) {
Perl_croak(aTHX_
"panic: %s: %d: Could not find current locale for %s\n",
__FILE__, __LINE__, category_name(category));
"panic: %s: %d: Could not find current %s locale, errno=%d\n",
__FILE__, __LINE__, category_name(category), errno);
}

save_input_locale = stdize_locale(savepv(save_input_locale));
Expand Down Expand Up @@ -3161,9 +3161,9 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
/* Get the current LC_CTYPE locale */
save_ctype_locale = do_setlocale_c(LC_CTYPE, NULL);
if (! save_ctype_locale) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not find current locale for LC_CTYPE\n"));
goto cant_use_nllanginfo;
Perl_croak(aTHX_
"panic: %s: %d: Could not find current LC_CTYPE locale,"
" errno=%d\n", __FILE__, __LINE__, errno);
}
save_ctype_locale = stdize_locale(savepv(save_ctype_locale));

Expand All @@ -3176,11 +3176,10 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
save_ctype_locale = NULL;
}
else if (! do_setlocale_c(LC_CTYPE, save_input_locale)) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not change LC_CTYPE locale to %s\n",
save_input_locale));
Safefree(save_ctype_locale);
goto cant_use_nllanginfo;
Perl_croak(aTHX_
"panic: %s: %d: Could not change LC_CTYPE locale to %s,"
" errno=%d\n", __FILE__, __LINE__, save_input_locale, errno);
}
}

Expand Down Expand Up @@ -3278,8 +3277,6 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)

}

cant_use_nllanginfo:

# else /* nl_langinfo should work if available, so don't bother compiling this
fallback code. The final fallback of looking at the name is
compiled, and will be executed if nl_langinfo fails */
Expand All @@ -3306,9 +3303,9 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)

save_monetary_locale = do_setlocale_c(LC_MONETARY, NULL);
if (! save_monetary_locale) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not find current locale for LC_MONETARY\n"));
goto cant_use_monetary;
Perl_croak(aTHX_
"panic: %s: %d: Could not find current LC_MONETARY locale,"
" errno=%d\n", __FILE__, __LINE__, errno);
}
save_monetary_locale = stdize_locale(savepv(save_monetary_locale));

Expand All @@ -3317,11 +3314,10 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
save_monetary_locale = NULL;
}
else if (! do_setlocale_c(LC_MONETARY, save_input_locale)) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not change LC_MONETARY locale to %s\n",
save_input_locale));
Safefree(save_monetary_locale);
goto cant_use_monetary;
Perl_croak(aTHX_
"panic: %s: %d: Could not change LC_MONETARY locale to %s,"
" errno=%d\n", __FILE__, __LINE__, save_input_locale, errno);
}
}

Expand Down Expand Up @@ -3356,7 +3352,6 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
goto finish_and_return;
}
}
cant_use_monetary:

# endif /* USE_LOCALE_MONETARY */
# endif /* HAS_LOCALECONV */
Expand All @@ -3382,9 +3377,9 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)

save_time_locale = do_setlocale_c(LC_TIME, NULL);
if (! save_time_locale) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not find current locale for LC_TIME\n"));
goto cant_use_time;
Perl_croak(aTHX_
"panic: %s: %d: Could not find current LC_TIME locale,"
" errno=%d\n", __FILE__, __LINE__, errno);
}
save_time_locale = stdize_locale(savepv(save_time_locale));

Expand All @@ -3393,11 +3388,10 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
save_time_locale = NULL;
}
else if (! do_setlocale_c(LC_TIME, save_input_locale)) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not change LC_TIME locale to %s\n",
save_input_locale));
Safefree(save_time_locale);
goto cant_use_time;
Perl_croak(aTHX_
"panic: %s: %d: Could not change LC_TIME locale to %s,"
" errno=%d\n", __FILE__, __LINE__, save_input_locale, errno);
}
}

Expand Down Expand Up @@ -3451,7 +3445,6 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
}
DEBUG_L(PerlIO_printf(Perl_debug_log, "All time-related words for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
}
cant_use_time:

# endif

Expand Down Expand Up @@ -3481,9 +3474,9 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)

save_messages_locale = do_setlocale_c(LC_MESSAGES, NULL);
if (! save_messages_locale) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not find current locale for LC_MESSAGES\n"));
goto cant_use_messages;
Perl_croak(aTHX_
"panic: %s: %d: Could not find current LC_MESSAGES locale,"
" errno=%d\n", __FILE__, __LINE__, errno);
}
save_messages_locale = stdize_locale(savepv(save_messages_locale));

Expand All @@ -3492,11 +3485,10 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
save_messages_locale = NULL;
}
else if (! do_setlocale_c(LC_MESSAGES, save_input_locale)) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"Could not change LC_MESSAGES locale to %s\n",
save_input_locale));
Safefree(save_messages_locale);
goto cant_use_messages;
Perl_croak(aTHX_
"panic: %s: %d: Could not change LC_MESSAGES locale to %s,"
" errno=%d\n", __FILE__, __LINE__, save_input_locale, errno);
}
}

Expand Down Expand Up @@ -3538,7 +3530,6 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)

DEBUG_L(PerlIO_printf(Perl_debug_log, "All error messages for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
}
cant_use_messages:

# endif
# endif /* the code that is compiled when no nl_langinfo */
Expand Down Expand Up @@ -3818,8 +3809,9 @@ Perl_my_strerror(pTHX_ const int errnum)

save_locale = do_setlocale_c(LC_MESSAGES, NULL);
if (! save_locale) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"setlocale failed, errno=%d\n", errno));
Perl_croak(aTHX_
"panic: %s: %d: Could not find current LC_MESSAGES locale,"
" errno=%d\n", __FILE__, __LINE__, errno);
}
else {
locale_is_C = isNAME_C_OR_POSIX(save_locale);
Expand Down Expand Up @@ -3864,8 +3856,9 @@ Perl_my_strerror(pTHX_ const int errnum)

if (save_locale && ! locale_is_C) {
if (! do_setlocale_c(LC_MESSAGES, save_locale)) {
DEBUG_L(PerlIO_printf(Perl_debug_log,
"setlocale restore failed, errno=%d\n", errno));
Perl_croak(aTHX_
"panic: %s: %d: setlocale restore failed, errno=%d\n",
__FILE__, __LINE__, errno);
}
Safefree(save_locale);
}
Expand Down

0 comments on commit ceac0a2

Please sign in to comment.