From 120cf441bac2e519c25bc8e0d3c5650f28758de1 Mon Sep 17 00:00:00 2001 From: dockes Date: Mon, 16 Nov 2009 16:18:04 +0000 Subject: [PATCH] Lack of error checking after have_document() in preview case could lead to looping, and cancellation was not checked to make things worse --- src/internfile/internfile.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/internfile/internfile.cpp b/src/internfile/internfile.cpp index 312d258c..d1d0b865 100644 --- a/src/internfile/internfile.cpp +++ b/src/internfile/internfile.cpp @@ -46,6 +46,7 @@ using namespace std; #include "mh_html.h" #include "fileudi.h" #include "beaglequeue.h" +#include "cancelcheck.h" #ifdef RCL_USE_XATTR #include "pxattr.h" @@ -758,6 +759,7 @@ FileInterner::Status FileInterner::internfile(Rcl::Doc& doc, string& ipath) // security in the form of a maximum handler stack size. int loop = 0; while (!m_handlers.empty()) { + CancelCheck::instance().checkCancel(); if (loop++ > 1000) { LOGERR(("FileInterner:: looping!\n")); return FIError; @@ -765,6 +767,15 @@ FileInterner::Status FileInterner::internfile(Rcl::Doc& doc, string& ipath) // If there are no more docs at the current top level we pop and // see if there is something at the previous one if (!m_handlers.back()->has_documents()) { + // If looking for a specific doc, this is an error. Happens if + // the index is stale, and the ipath points to the wrong message + // for exemple (one with less attachments) + if (m_forPreview) { + m_reason += "Requested document does not exist. "; + m_reason += m_handlers.back()->get_error(); + LOGERR(("FileInterner: requested document does not exist\n")); + return FIError; + } popHandler(); continue; } @@ -774,8 +785,12 @@ FileInterner::Status FileInterner::internfile(Rcl::Doc& doc, string& ipath) // still want to process the rest of the mbox! For preview: fatal. if (!m_handlers.back()->next_document()) { processNextDocError(doc, ipath); - if (m_forPreview) + if (m_forPreview) { + m_reason += "Requested document does not exist. "; + m_reason += m_handlers.back()->get_error(); + LOGERR(("FileInterner: requested document does not exist\n")); return FIError; + } popHandler(); continue; }