diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2014-06-12 13:28:26 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2014-06-12 14:07:23 +0100 |
commit | 202dac6e20f75e87edab3368bb0882d59494d864 (patch) | |
tree | c70322aa0d6271e041bb7dfc4610563500576d87 | |
parent | 4ed5bacc86e0137d9ace5a2ceda09c2393716793 (diff) |
liblok: check new methods via macros on nSize, not by de-referencing.
We can't check for NULL from beyond the end of a smaller structure.
Change-Id: Id3754bf747c402cf0d767eda5fd4b5ad6b5789e9
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.h | 9 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.hxx | 3 | ||||
-rw-r--r-- | smoketest/libtest.cxx | 10 |
3 files changed, 21 insertions, 1 deletions
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index 97acbab80821..657c16c37db6 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -18,6 +18,13 @@ extern "C" typedef struct _LibreOfficeKit LibreOfficeKit; typedef struct _LibreOfficeKitDocument LibreOfficeKitDocument; +// Do we have an extended member in this struct ? +#define LIBREOFFICEKIT_HAS_MEMBER(strct,member,nSize) \ + ((((int)((unsigned char *)&((strct *) 0)->member) + \ + (int)sizeof ((strct *) 0)->member)) <= (nSize)) + +#define LIBREOFFICEKIT_HAS(pKit,member) LIBREOFFICEKIT_HAS_MEMBER(LibreOfficeKit,member,(pKit)->nSize) + struct _LibreOfficeKit { int nSize; @@ -28,6 +35,8 @@ struct _LibreOfficeKit char* (*getError) (LibreOfficeKit *pThis); }; +#define LIBREOFFICEKIT_DOCUMENT_HAS(pDoc,member) LIBREOFFICEKIT_HAS_MEMBER(LibreOfficeKitDocument,member,(pDoc)->nSize) + struct _LibreOfficeKitDocument { int nSize; diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index 956e3cba6208..ec1131312280 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -45,11 +45,12 @@ public: inline bool saveAsWithOptions(const char* pUrl, const char* pFormat = NULL, const char* pFilterOptions = NULL) { // available since LibreOffice 4.3 - if (!mpDoc->saveAsWithOptions) + if (!LIBREOFFICEKIT_DOCUMENT_HAS(mpDoc, saveAsWithOptions)) return false; return mpDoc->saveAsWithOptions(mpDoc, pUrl, pFormat, pFilterOptions); } + inline LibreOfficeKitDocument *get() { return mpDoc; } }; class Office diff --git a/smoketest/libtest.cxx b/smoketest/libtest.cxx index 07a13ec10edd..2316b8c24184 100644 --- a/smoketest/libtest.cxx +++ b/smoketest/libtest.cxx @@ -75,6 +75,16 @@ int main (int argc, char **argv) return -1; } + if (!LIBREOFFICEKIT_DOCUMENT_HAS(pDocument->get(), saveAsWithOptions)) + { + fprintf( stderr, "using obsolete LibreOffice %d + %d vs. %d\n", + (int)((unsigned char *)&((LibreOfficeKitDocument *) 0)->saveAsWithOptions), + (int)sizeof ((LibreOfficeKitDocument *) 0)->saveAsWithOptions, + pDocument->get()->nSize ); + return -1; + } + + end = getTimeMS(); fprintf( stderr, "load time: %ld ms\n", (end-start) ); start = end; |