+cc MAINTAINER Stuart Henderson <[email protected]> writes:
> On 2015/10/04 16:18, Raf Czlonka wrote: >> On Sun, Oct 04, 2015 at 01:30:15PM BST, Stuart Henderson wrote: >> > On 2015/10/04 12:04, Raf Czlonka wrote: >> > > Hi all, >> > > >> > > As suggested in the FAQ, I have emailed the port maintainer first but >> > > hadn't heard back so forwarding the email here. >> > >> > Can you try running with the patch suggested in >> > https://marc.info/?l=openbsd-ports&m=144257374414248&w=2 and see if you >> > trigger the newly added log message? >> > >> >> Hi Stuart, >> >> This was the very thread that prompted me to finally send an email to >> ports@ about the issue. >> >> The OP experiences problems on amd64, the platform on which newsbeuter >> always worked fine for me - hence my i386-specific subject. >> >> Nevertheless, I had built a package with the aforementioned patch - >> still the same issue. >> >> Thanks for quick reply. >> >> Raf >> > > I wonder if it got fixed in any of the updates upstream, can you try this? > If you don't already have g++ 4.9 installed (eg++ doesn't exist) then pkg_add > it first, you'll be there for ages if you have to build it from ports. I also had a diff for newsbeuter-2.9 but given the big changes - c++11 and wordexp - I kinda lost interest. ;) Looking at the differences between 2.7 and 2.9, I doubt that this issue got fixed. newsbeuter stores rss feeds and items timestamps as integers in cache.db, an sqlite database. sqlite3 uses 64 bits integers under the hood, but the sqlite3 format strings used in newsbeuter specify '%u' for timestamps. This can't work on i386, and may also be the reason for a weird time_t value on amd64 in https://marc.info/?l=openbsd-ports&m=144251853400773&w=2 . I can easily reproduce on i386 the crashes experienced by Raf, the following patch seems to fix those, and also addresses other similar problems. I could port it to 2.9 for inclusion in the ports tree, but maybe it would be better to contact upstream, and fix both wordexp and time_t problems there first. Anyway, here's the patch for 2.7. Thoughts? Index: patches/patch-src_cache_cpp =================================================================== RCS file: patches/patch-src_cache_cpp diff -N patches/patch-src_cache_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_cache_cpp 4 Oct 2015 17:57:35 -0000 @@ -0,0 +1,77 @@ +$OpenBSD$ +--- src/cache.cpp.orig Tue Aug 27 14:20:39 2013 ++++ src/cache.cpp Sun Oct 4 19:56:03 2015 +@@ -80,7 +80,7 @@ static int lastmodified_callback(void * handler, int a + } else { + result->etag = ""; + } +- LOG(LOG_INFO, "lastmodified_callback: lastmodified = %d etag = %s", result->lastmodified, result->etag.c_str()); ++ LOG(LOG_INFO, "lastmodified_callback: lastmodified = %lld etag = %s", (long long)result->lastmodified, result->etag.c_str()); + return 0; + } + +@@ -295,7 +295,7 @@ void cache::fetch_lastmodified(const std::string& feed + } + t = result.lastmodified; + etag = result.etag; +- LOG(LOG_DEBUG, "cache::fetch_lastmodified: t = %d etag = %s", t, etag.c_str()); ++ LOG(LOG_DEBUG, "cache::fetch_lastmodified: t = %lld etag = %s", (long long)t, etag.c_str()); + } + + void cache::update_lastmodified(const std::string& feedurl, time_t t, const std::string& etag) { +@@ -306,7 +306,7 @@ void cache::update_lastmodified(const std::string& fee + scope_mutex lock(&mtx); + std::string query = "UPDATE rss_feed SET "; + if (t > 0) +- query.append(utils::strprintf("lastmodified = '%d'", t)); ++ query.append(utils::strprintf("lastmodified = '%lld'", (long long)t)); + if (etag.length() > 0) + query.append(utils::strprintf("%c etag = %s", (t > 0 ? ',' : ' '), prepare_query("'%q'", etag.c_str()).c_str())); + query.append(" WHERE rssurl = "); +@@ -643,9 +643,9 @@ void cache::update_rssitem_unlocked(std::tr1::shared_p + } + } else { + std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued, base) " +- "VALUES ('%q','%q','%q','%q','%q','%u','%q','%d','%q','%q',%d, '%q')", ++ "VALUES ('%q','%q','%q','%q','%q','%lld','%q','%d','%q','%q',%d, '%q')", + item->guid().c_str(), item->title_raw().c_str(), item->author_raw().c_str(), +- item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(), (item->unread() ? 1 : 0), ++ item->link().c_str(), feedurl.c_str(), (long long)item->pubDate_timestamp(), item->description_raw().c_str(), (item->unread() ? 1 : 0), + item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->get_base().c_str()); + LOG(LOG_DEBUG,"running query: %s", insert.c_str()); + rc = sqlite3_exec(db,insert.c_str(),NULL,NULL,NULL); +@@ -715,9 +715,9 @@ void cache::update_rssitem_unread_and_enqueued(rss_ite + } + } else { + std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued,flags,base) " +- "VALUES ('%q','%q','%q','%q','%q','%u','%q','%d','%q','%q',%d, '%q', '%q')", ++ "VALUES ('%q','%q','%q','%q','%q','%lld','%q','%d','%q','%q',%d, '%q', '%q')", + item->guid().c_str(), item->title_raw().c_str(), item->author_raw().c_str(), +- item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(), item->unread() ? 1 : 0, ++ item->link().c_str(), feedurl.c_str(), (long long)item->pubDate_timestamp(), item->description_raw().c_str(), item->unread() ? 1 : 0, + item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->flags().c_str(), + item->get_base().c_str()); + LOG(LOG_DEBUG,"running query: %s", insert.c_str()); +@@ -753,9 +753,9 @@ void cache::update_rssitem_unread_and_enqueued(std::tr + } + } else { + std::string insert = prepare_query("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread,enclosure_url,enclosure_type,enqueued,flags,base) " +- "VALUES ('%q','%q','%q','%q','%q','%u','%q','%d','%q','%q',%d, '%q', '%q')", ++ "VALUES ('%q','%q','%q','%q','%q','%lld','%q','%d','%q','%q',%d, '%q', '%q')", + item->guid().c_str(), item->title_raw().c_str(), item->author_raw().c_str(), +- item->link().c_str(), feedurl.c_str(), item->pubDate_timestamp(), item->description_raw().c_str(), (item->unread() ? 1 : 0), ++ item->link().c_str(), feedurl.c_str(), (long long)item->pubDate_timestamp(), item->description_raw().c_str(), (item->unread() ? 1 : 0), + item->enclosure_url().c_str(), item->enclosure_type().c_str(), item->enqueued() ? 1 : 0, item->flags().c_str(), + item->get_base().c_str()); + LOG(LOG_DEBUG,"running query: %s", insert.c_str()); +@@ -876,8 +876,8 @@ void cache::clean_old_articles() { + if (days > 0) { + time_t old_date = time(NULL) - days*24*60*60; + +- std::string query(utils::strprintf("DELETE FROM rss_item WHERE pubDate < %d", old_date)); +- LOG(LOG_DEBUG, "cache::clean_old_articles: about to delete articles with a pubDate older than %d", old_date); ++ std::string query(utils::strprintf("DELETE FROM rss_item WHERE pubDate < %lld", (long long)old_date)); ++ LOG(LOG_DEBUG, "cache::clean_old_articles: about to delete articles with a pubDate older than %lld", (long long)old_date); + int rc = sqlite3_exec(db, query.c_str(), NULL, NULL, NULL); + LOG(LOG_DEBUG, "cache::clean_old_artgicles: old article delete result: rc = %d", rc); + } else { -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE
