2 commits - src/kolabformat.cpp src/utils.cpp src/utils.h src/xcalconversions.h

Christian Mollekopf mollekopf at kolabsys.com
Fri Mar 21 17:07:37 CET 2014


 src/kolabformat.cpp   |   46 ++++++++++++++++++++++++++++++++++++----------
 src/utils.cpp         |   11 +++++++++++
 src/utils.h           |    6 ++++++
 src/xcalconversions.h |    4 +---
 4 files changed, 54 insertions(+), 13 deletions(-)

New commits:
commit 85da145b3bdd0be29df23dff1c41ba9b2289bcf5
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Mar 21 17:07:32 2014 +0100

    Validate serialized objects again.
    
    We ensure that we can parse everything we serialize by parsing it again.
    This implies an overhead, but since reads are probably far more frequent than
    write and its generally anyways fast, I assume this is ok.
    
    The error reporting is as usual through Kolab::error().

diff --git a/src/kolabformat.cpp b/src/kolabformat.cpp
index 10f5591..abd8f54 100644
--- a/src/kolabformat.cpp
+++ b/src/kolabformat.cpp
@@ -86,7 +86,10 @@ std::string writeEvent(const Kolab::Event &event, const std::string& productId)
 {
     Utils::clearErrors();
     validate(event);
-    return XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(event, productId);
+    const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(event, productId);
+    //Validate
+    XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(result, false);
+    return result;
 }
 
 Kolab::Todo readTodo(const std::string& s, bool isUrl)
@@ -103,7 +106,10 @@ std::string writeTodo(const Kolab::Todo &event, const std::string& productId)
 {
     Utils::clearErrors();
     validate(event);
-    return XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(event, productId);
+    const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(event, productId);
+    //Validate
+    XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(result, false);
+    return result;
 }
 
 Journal readJournal(const std::string& s, bool isUrl)
@@ -120,7 +126,10 @@ std::string writeJournal(const Kolab::Journal &j, const std::string& productId)
 {
     Utils::clearErrors();
     validate(j);
-    return XCAL::serializeIncidence<XCAL::IncidenceTrait<Kolab::Journal> >(j, productId);
+    const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Journal> >(j, productId);
+    //Validate
+    XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Journal> >(result, false);
+    return result;
 }
 
 Kolab::Freebusy readFreebusy(const std::string& s, bool isUrl)
@@ -137,7 +146,9 @@ std::string writeFreebusy(const Freebusy &f, const std::string& productId)
 {
     Utils::clearErrors();
     validate(f);
-    return XCAL::serializeFreebusy<XCAL::IncidenceTrait<Kolab::Freebusy> >(f, productId);
+    const std::string result = XCAL::serializeFreebusy<XCAL::IncidenceTrait<Kolab::Freebusy> >(f, productId);
+    XCAL::deserializeIncidence<XCAL::IncidenceTrait<Kolab::Freebusy> >(result, false);
+    return result;
 }
 
 Kolab::Contact readContact(const std::string& s, bool isUrl)
@@ -154,7 +165,10 @@ std::string writeContact(const Contact &contact, const std::string& productId)
 {
     Utils::clearErrors();
     validate(contact);
-    return XCARD::serializeCard(contact, productId);
+    const std::string result = XCARD::serializeCard(contact, productId);
+    //Validate
+    XCARD::deserializeCard<Kolab::Contact>(result, false);
+    return result;
 }
 
 DistList readDistlist(const std::string& s, bool isUrl)
@@ -171,7 +185,10 @@ std::string writeDistlist(const DistList &list, const std::string& productId)
 {
     Utils::clearErrors();
     validate(list);
-    return XCARD::serializeCard(list, productId);
+    const std::string result = XCARD::serializeCard(list, productId);
+    //Validate
+    XCARD::deserializeCard<Kolab::DistList>(result, false);
+    return result;
 }
 
 Note readNote(const std::string& s, bool isUrl)
@@ -188,7 +205,10 @@ std::string writeNote(const Note &note, const std::string& productId)
 {
     Utils::clearErrors();
     validate(note);
-    return Kolab::KolabObjects::serializeObject<Kolab::Note>(note, productId);
+    const std::string result = Kolab::KolabObjects::serializeObject<Kolab::Note>(note, productId);
+    //Validate
+    Kolab::KolabObjects::deserializeObject<Kolab::Note>(result, false);
+    return result;
 }
 
 File readFile(const std::string& s, bool isUrl)
@@ -205,7 +225,10 @@ std::string writeFile(const File &file, const std::string& productId)
 {
     Utils::clearErrors();
     validate(file);
-    return Kolab::KolabObjects::serializeObject<Kolab::File>(file, productId);
+    const std::string result = Kolab::KolabObjects::serializeObject<Kolab::File>(file, productId);
+    //Validate
+    Kolab::KolabObjects::deserializeObject<Kolab::File>(result, false);
+    return result;
 }
 
 Configuration readConfiguration(const std::string& s, bool isUrl)
@@ -222,7 +245,10 @@ std::string writeConfiguration(const Configuration &config, const std::string& p
 {
     Utils::clearErrors();
     validate(config);
-    return Kolab::KolabObjects::serializeObject< Kolab::Configuration >(config, productId);
+    const std::string result = Kolab::KolabObjects::serializeObject<Kolab::Configuration>(config, productId);
+    //Validate
+    Kolab::KolabObjects::deserializeObject<Kolab::Configuration>(result, false);
+    return result;
 }
 
 


commit cb48f40745bf4017b3a11d7a61d36cda9139c4e3
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Mar 21 17:05:04 2014 +0100

    Move xCalVersion to thread local storage.
    
    This started to crash due to a double free while trying to add validation by
    parsing the serialized result again. I assume the global variable took a reference
    to a temporary string or alike which got then free'd again, but I'm not sure.
    
    However, this should be in thread-local storage anyways and that fixes the problem.

diff --git a/src/kolabformat.cpp b/src/kolabformat.cpp
index bb0a418..10f5591 100644
--- a/src/kolabformat.cpp
+++ b/src/kolabformat.cpp
@@ -49,7 +49,7 @@ std::string productId()
 
 std::string xCalVersion()
 {
-    return XCAL::global_xCalVersion;
+    return Utils::xCalVersion();
 }
 
 std::string xKolabVersion()
diff --git a/src/utils.cpp b/src/utils.cpp
index 170f6b1..5ece8cb 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -47,6 +47,7 @@ struct Global {
     std::string createdUID;
     std::string productId;
     std::string xKolabVersion;
+    std::string xCalVersion;
     
     ErrorSeverity errorBit;
     std::string errorMessage;
@@ -80,6 +81,16 @@ std::string kolabVersion()
     return ThreadLocal::inst().xKolabVersion;
 }
 
+void setXCalVersion(const std::string &s)
+{
+    ThreadLocal::inst().xCalVersion = s;
+}
+
+std::string xCalVersion()
+{
+    return ThreadLocal::inst().xCalVersion;
+}
+
 void setProductId(const std::string &s)
 {
     ThreadLocal::inst().productId = s;
diff --git a/src/utils.h b/src/utils.h
index 7ed26b9..2c7e579 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -72,6 +72,12 @@ void setKolabVersion(const std::string &);
 std::string kolabVersion();
 
 /**
+ * The xCal Version of the last deserialized object
+ */
+void setXCalVersion(const std::string &);
+std::string xCalVersion();
+
+/**
  * A timestamp which overrides the one normally used.
  */
 void setOverrideTimestamp(const cDateTime &);
diff --git a/src/xcalconversions.h b/src/xcalconversions.h
index a0489a8..9326548 100644
--- a/src/xcalconversions.h
+++ b/src/xcalconversions.h
@@ -47,8 +47,6 @@
 namespace Kolab {
     namespace XCAL {
         
-std::string global_xCalVersion;
-
 const char* const XCAL_VERSION = "2.0";
 const char* const XCAL_NAMESPACE = "urn:ietf:params:xml:ns:icalendar-2.0";
 
@@ -1948,7 +1946,7 @@ typename T::IncidencePtr deserializeIncidence(const std::string& s, bool isUrl)
         }
         
         setProductId( vcalendar.properties().prodid().text() );
-        global_xCalVersion = vcalendar.properties().version().text();
+        setXCalVersion(vcalendar.properties().version().text());
         setKolabVersion( vcalendar.properties().x_kolab_version().text() );
 
         if (incidences.empty()) {




More information about the commits mailing list