aboutsummaryrefslogtreecommitdiffstats
path: root/www
diff options
context:
space:
mode:
authorarved <arved@FreeBSD.org>2008-03-16 06:29:03 +0800
committerarved <arved@FreeBSD.org>2008-03-16 06:29:03 +0800
commitdef8c12d53d2ed8124e9197dcabd994afb22b9f7 (patch)
treefcad82df2428ea0e39bf79c1baa90767cdb305fc /www
parent8c640a0e2ba3248c91c044e33b97892459dbf821 (diff)
downloadfreebsd-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/Makefile1
-rw-r--r--www/newsbeuter/files/patch-fixlocalecrash305
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;
++
+ }
+ }
+