Kaydet (Commit) 202dac6e authored tarafından Michael Meeks's avatar Michael Meeks

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
üst 4ed5bacc
......@@ -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;
......
......@@ -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
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment