diff options
author | arved <arved@FreeBSD.org> | 2008-03-16 06:29:03 +0800 |
---|---|---|
committer | arved <arved@FreeBSD.org> | 2008-03-16 06:29:03 +0800 |
commit | def8c12d53d2ed8124e9197dcabd994afb22b9f7 (patch) | |
tree | fcad82df2428ea0e39bf79c1baa90767cdb305fc /www | |
parent | 8c640a0e2ba3248c91c044e33b97892459dbf821 (diff) | |
download | freebsd-ports-gnome-def8c12d53d2ed8124e9197dcabd994afb22b9f7.tar.gz freebsd-ports-gnome-def8c12d53d2ed8124e9197dcabd994afb22b9f7.tar.zst freebsd-ports-gnome-def8c12d53d2ed8124e9197dcabd994afb22b9f7.zip |
Fix crash if a locale is used
PR: 121674
Reported by: Oliver Herold
Obtained from: Upstream
Diffstat (limited to 'www')
-rw-r--r-- | www/newsbeuter/Makefile | 1 | ||||
-rw-r--r-- | www/newsbeuter/files/patch-fixlocalecrash | 305 |
2 files changed, 306 insertions, 0 deletions
diff --git a/www/newsbeuter/Makefile b/www/newsbeuter/Makefile index 1a36a32f195a..767b6b18f2b7 100644 --- a/www/newsbeuter/Makefile +++ b/www/newsbeuter/Makefile @@ -6,6 +6,7 @@ PORTNAME= newsbeuter PORTVERSION= 0.8.1 +PORTREVISION= 1 CATEGORIES= www MASTER_SITES= http://synflood.at/newsbeuter/ diff --git a/www/newsbeuter/files/patch-fixlocalecrash b/www/newsbeuter/files/patch-fixlocalecrash new file mode 100644 index 000000000000..bc962df95b75 --- /dev/null +++ b/www/newsbeuter/files/patch-fixlocalecrash @@ -0,0 +1,305 @@ +Index: include/utils.h +=================================================================== +--- include/utils.h (revision 1224) ++++ include/utils.h (revision 1231) +@@ -15,6 +15,8 @@ + static std::vector<std::string> tokenize_nl(const std::string& str, std::string delimiters = "\r\n"); + static std::vector<std::string> tokenize_quoted(const std::string& str, std::string delimiters = " \r\n\t"); + ++ static std::vector<std::wstring> wtokenize(const std::wstring& str, std::wstring delimiters = L" \r\n\t"); ++ + static bool try_fs_lock(const std::string& lock_file, pid_t & pid); + static void remove_fs_lock(const std::string& lock_file); + +Index: src/formatstring.cpp +=================================================================== +--- src/formatstring.cpp (revision 1224) ++++ src/formatstring.cpp (revision 1231) +@@ -10,45 +10,48 @@ + namespace newsbeuter { + + void fmtstr_formatter::register_fmt(char f, const std::string& value) { +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::register_fmt: char = %c value = %s", f, value.c_str()); ++ // GetLogger().log(LOG_DEBUG, "fmtstr_formatter::register_fmt: char = %c value = %s", f, value.c_str()); + fmts[f] = utils::utf8str2wstr(value); +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::register_fmt: char = %c done", f); ++ // GetLogger().log(LOG_DEBUG, "fmtstr_formatter::register_fmt: char = %c done", f); + } + + std::string fmtstr_formatter::do_format(const std::string& fmt, unsigned int width) { +- std::wstring wfmt(utils::str2wstr(fmt)); +- std::string result = utils::wstr2str(do_wformat(wfmt, width)); +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: after conversion: `%s'", result.c_str()); ++ std::string result; ++ if (fmt.length() > 0) { ++ std::wstring wfmt(utils::str2wstr(fmt)); ++ std::wstring w = do_wformat(wfmt, width); ++ result = utils::wstr2str(w); ++ } + return result; + } + + std::wstring fmtstr_formatter::do_wformat(const std::wstring& wfmt, unsigned int width) { +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: fmt = `%ls' width = %u", wfmt.c_str(), width); ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: fmt = `%ls' width = %u", wfmt.c_str(), width); + std::wstring result; + unsigned int i; + unsigned int fmtlen = wfmt.length(); +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: fmtlen = %u", fmtlen); ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: fmtlen = %u", fmtlen); + for (i=0;i<fmtlen;++i) { + if (wfmt[i] == L'%') { + if (i<(fmtlen-1)) { + if (wfmt[i+1] == L'-' || iswdigit(wfmt[i+1])) { +- std::string number; ++ std::wstring number; + wchar_t c; + while ((wfmt[i+1] == L'-' || iswdigit(wfmt[i+1])) && i<(fmtlen-1)) { + number.append(1,wfmt[i+1]); + ++i; + } +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: number = %s", number.c_str()); ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: number = %ls", number.c_str()); + if (i<(fmtlen-1)) { + c = wfmt[i+1]; + ++i; +- std::istringstream is(number); ++ std::wistringstream is(number); + int align; + is >> align; +- if (abs(align) > fmts[c].length()) { ++ if (static_cast<unsigned int>(abs(align)) > fmts[c].length()) { + wchar_t buf[256]; + swprintf(buf,sizeof(buf)/sizeof(*buf),L"%*ls", align, fmts[c].c_str()); +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: swprintf result = %ls", buf); ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: swprintf result = %ls", buf); + result.append(buf); + } else { + result.append(fmts[c].substr(0,abs(align))); +@@ -56,7 +59,7 @@ + } + } else if (wfmt[i+1] == L'%') { + result.append(1, L'%'); +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: appending %"); ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: appending %"); + ++i; + } else if (wfmt[i+1] == L'>') { + if (wfmt[i+2]) { +@@ -65,9 +68,9 @@ + i += 2; + } else { + std::wstring rightside = do_wformat(&wfmt[i+3], 0); +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: aligning, right side = %ls", rightside.c_str()); ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: aligning, right side = %ls", rightside.c_str()); + int diff = width - wcswidth(result.c_str(),result.length()) - wcswidth(rightside.c_str(), rightside.length()); +- GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_format: diff = %d char = %lc", diff, wfmt[i+2]); ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: diff = %d char = %lc", diff, wfmt[i+2]); + if (diff > 0) { + result.append(diff, wfmt[i+2]); + } +@@ -80,22 +83,30 @@ + while (wfmt[j] && wfmt[j] != L'?') + j++; + if (wfmt[j]) { +- std::wstring cond = wfmt.substr(i+2, j - i - 1); ++ std::wstring cond = wfmt.substr(i+2, j - i - 2); + unsigned int k = j + 1; + while (wfmt[k] && wfmt[k] != L'?') + k++; + if (wfmt[k]) { + std::wstring values = wfmt.substr(j+1, k - j - 1); +- std::vector<std::string> pair = utils::tokenize(utils::wstr2str(values),"&"); ++ std::vector<std::wstring> pair = utils::wtokenize(values,L"&"); + while (pair.size() < 2) +- pair.push_back(""); ++ pair.push_back(L""); + ++ GetLogger().log(LOG_DEBUG, "fmtstr_formatter::do_wformat: values = `%ls' cond = `%ls' cond[0] = `%lc' fmts[cond[0]] = `%ls'", values.c_str(), cond.c_str(), cond[0], fmts[cond[0]].c_str()); ++ GetLogger().log(LOG_DEBUG, "YYY pair0 = `%ls' pair1 = `%ls'", pair[0].c_str(), pair[1].c_str()); ++ std::wstring subresult; + if (fmts[cond[0]].length() > 0) { +- result.append(do_wformat(utils::str2wstr(pair[0]), width)); ++ if (pair[0].length() > 0) ++ subresult = do_wformat(pair[0], width); + } else { +- result.append(do_wformat(utils::str2wstr(pair[1]), width)); ++ if (pair[1].length() > 0) ++ subresult = do_wformat(pair[0], width); + } ++ GetLogger().log(LOG_DEBUG, "YYY result = `%ls'", subresult.c_str()); ++ result.append(subresult); + ++ + i = k; + } else { + i = k - 1; +@@ -112,6 +123,7 @@ + result.append(1, wfmt[i]); + } + } ++ GetLogger().log(LOG_DEBUG, "end of do_wformat"); + return result; + } + +Index: src/utils.cpp +=================================================================== +--- src/utils.cpp (revision 1224) ++++ src/utils.cpp (revision 1231) +@@ -17,6 +17,7 @@ + + #include <curl/curl.h> + ++#include <langinfo.h> + #include <stfl.h> + + namespace newsbeuter { +@@ -133,7 +133,7 @@ + return tokens; + } + +- ++ + std::vector<std::string> utils::tokenize(const std::string& str, std::string delimiters) { + /* + * This function tokenizes a string by the delimiters. Plain and simple. +@@ -150,6 +150,22 @@ + return tokens; + } + ++std::vector<std::wstring> utils::wtokenize(const std::wstring& str, std::wstring delimiters) { ++ /* ++ * This function tokenizes a string by the delimiters. Plain and simple. ++ */ ++ std::vector<std::wstring> tokens; ++ std::wstring::size_type last_pos = str.find_first_not_of(delimiters, 0); ++ std::wstring::size_type pos = str.find_first_of(delimiters, last_pos); ++ ++ while (std::string::npos != pos || std::string::npos != last_pos) { ++ tokens.push_back(str.substr(last_pos, pos - last_pos)); ++ last_pos = str.find_first_not_of(delimiters, pos); ++ pos = str.find_first_of(delimiters, last_pos); ++ } ++ return tokens; ++} ++ + std::vector<std::string> utils::tokenize_spaced(const std::string& str, std::string delimiters) { + std::vector<std::string> tokens; + std::string::size_type last_pos = str.find_first_not_of(delimiters, 0); +@@ -281,9 +297,9 @@ + case EINVAL: + result.append(old_outbufp, outbufp - old_outbufp); + result.append("?"); +- GetLogger().log(LOG_DEBUG, "utils::convert_text: hit EILSEQ/EINVAL: result = `%s'", result.c_str()); ++ // GetLogger().log(LOG_DEBUG, "utils::convert_text: hit EILSEQ/EINVAL: result = `%s'", result.c_str()); + inbufp += strlen(inbufp) - inbytesleft + 1; +- GetLogger().log(LOG_DEBUG, "utils::convert_text: new inbufp: `%s'", inbufp); ++ // GetLogger().log(LOG_DEBUG, "utils::convert_text: new inbufp: `%s'", inbufp); + inbytesleft = strlen(inbufp); + break; + } +@@ -292,8 +308,8 @@ + } + } while (inbytesleft > 0); + +- GetLogger().log(LOG_DEBUG, "utils::convert_text: before: %s", text.c_str()); +- GetLogger().log(LOG_DEBUG, "utils::convert_text: after: %s", result.c_str()); ++ // GetLogger().log(LOG_DEBUG, "utils::convert_text: before: %s", text.c_str()); ++ // GetLogger().log(LOG_DEBUG, "utils::convert_text: after: %s", result.c_str()); + + iconv_close(cd); + +@@ -500,48 +516,19 @@ + } + + std::wstring utils::str2wstr(const std::string& str) { +- const char* pszExt = str.c_str(); +- wchar_t pwszInt [str.length()+1]; +- +- memset(&pwszInt[0], 0, sizeof(wchar_t)*(str.length() + 1)); +- const char* pszNext; +- wchar_t* pwszNext; +- mbstate_t state = {0}; +- GetLogger().log(LOG_DEBUG, "utils::str2wstr: current locale: %s", setlocale(LC_CTYPE, NULL)); +-#ifdef __APPLE__ +- std::locale loc; +-#else +- std::locale loc(setlocale(LC_CTYPE, NULL)); +-#endif +- int res = std::use_facet<std::codecvt<wchar_t, char, mbstate_t> > ( loc ).in( state, pszExt, &pszExt[strlen(pszExt)], pszNext, pwszInt, &pwszInt[strlen(pszExt)], pwszNext ); +- if (res == std::codecvt_base::error) { +- GetLogger().log(LOG_ERROR, "utils::str2wstr: conversion of `%s' failed (locale = %s).", str.c_str(), setlocale(LC_CTYPE, NULL)); +- throw "utils::str2wstr: conversion failed"; +- } +- // pwszInt[strlen(pszExt)] = 0; +- return std::wstring(pwszInt); ++ const char * codeset = nl_langinfo(CODESET); ++ struct stfl_ipool * ipool = stfl_ipool_create(codeset); ++ std::wstring result = stfl_ipool_towc(ipool, str.c_str()); ++ stfl_ipool_destroy(ipool); ++ return result; + } + + std::string utils::wstr2str(const std::wstring& wstr) { +- char pszExt[4*wstr.length()+1]; +- const wchar_t *pwszInt = wstr.c_str(); +- memset(pszExt, 0, 4*wstr.length()+1); +- char* pszNext; +- const wchar_t* pwszNext; +- mbstate_t state = {0}; +- GetLogger().log(LOG_DEBUG, "utils::wstr2str: locale = %s input = `%ls'", setlocale(LC_CTYPE, NULL), wstr.c_str()); +-#ifdef __APPLE__ +- std::locale loc; +-#else +- std::locale loc(setlocale(LC_CTYPE, NULL)); +-#endif +- int res = std::use_facet<std::codecvt<wchar_t, char, mbstate_t> > (loc).out(state, pwszInt, &pwszInt[wcslen(pwszInt)], pwszNext, pszExt, pszExt + sizeof(pszExt), pszNext); +- if (res == std::codecvt_base::error) { +- GetLogger().log(LOG_ERROR, "utils::wstr2str: conversion of `%ls' failed.", wstr.c_str()); +- throw "utils::wstr2str: conversion failed"; +- } +- // pszExt[wcslen(pwszInt)] = 0; +- return std::string(pszExt); ++ const char * codeset = nl_langinfo(CODESET); ++ struct stfl_ipool * ipool = stfl_ipool_create(codeset); ++ std::string result = stfl_ipool_fromwc(ipool, wstr.c_str()); ++ stfl_ipool_destroy(ipool); ++ return result; + } + + std::string utils::to_s(unsigned int u) { +Index: src/logger.cpp +=================================================================== +--- src/logger.cpp (revision 1224) ++++ src/logger.cpp (revision 1231) +@@ -2,7 +2,6 @@ + #include <stdarg.h> + #include <exception.h> + #include <cerrno> +-#include <alloca.h> + + namespace newsbeuter { + +@@ -65,11 +64,11 @@ + va_start(ap, format); + + unsigned int len = vsnprintf(NULL,0,format,ap); +- logmsgbuf = (char *)alloca(len + 1); ++ logmsgbuf = new char[len + 1]; + vsnprintf(logmsgbuf, len + 1, format, ap); + + len = snprintf(NULL, 0, "[%s] %s: %s",date, loglevel_str[level], logmsgbuf); +- buf = (char *)alloca(len + 1); ++ buf = new char[len + 1]; + snprintf(buf,len + 1,"[%s] %s: %s",date, loglevel_str[level], logmsgbuf); + + if (f.is_open()) { +@@ -82,6 +81,9 @@ + ef.flush(); + } + ++ delete[] buf; ++ delete[] logmsgbuf; ++ + } + } + |