diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/bootstrp/addexes2/makefile.mk | 2 | ||||
-rw-r--r-- | tools/bootstrp/makefile.mk | 2 | ||||
-rw-r--r-- | tools/bootstrp/md5.cxx | 64 | ||||
-rw-r--r-- | tools/inc/tools/postx.h | 76 | ||||
-rw-r--r-- | tools/inc/tools/prex.h | 81 | ||||
-rw-r--r-- | tools/prj/d.lst | 3 | ||||
-rw-r--r-- | tools/source/fsys/urlobj.cxx | 9 | ||||
-rw-r--r-- | tools/source/generic/poly.cxx | 4 | ||||
-rw-r--r-- | tools/util/makefile.mk | 4 | ||||
-rw-r--r-- | tools/workben/urltest.cxx | 19 |
10 files changed, 256 insertions, 8 deletions
diff --git a/tools/bootstrp/addexes2/makefile.mk b/tools/bootstrp/addexes2/makefile.mk index 343dd39c8c71..cd006a35ddd8 100644 --- a/tools/bootstrp/addexes2/makefile.mk +++ b/tools/bootstrp/addexes2/makefile.mk @@ -43,7 +43,7 @@ TARGETTYPE=CUI APP1TARGET= mkunroll APP1OBJS= $(OBJ)$/mkfilt.obj -APP1STDLIBS= $(SALLIB) $(VOSLIB) $(TOOLSLIB) $(BASEGFXLIB) $(UCBHELPERLIB) $(CPPULIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(SALHELPERLIB) $(I18NISOLANGLIB) +APP1STDLIBS= $(SALLIB) $(VOSLIB) $(TOOLSLIB) .IF "$(OS)"=="LINUX" APP1STDLIBS+=-lpthread .ENDIF diff --git a/tools/bootstrp/makefile.mk b/tools/bootstrp/makefile.mk index eca32dbd0503..60bfc57bf96b 100644 --- a/tools/bootstrp/makefile.mk +++ b/tools/bootstrp/makefile.mk @@ -88,6 +88,8 @@ APP2OBJS= $(OBJ)$/rscdep.obj APP2LIBS= $(LB)$/$(TARGET).lib $(LB)$/$(TARGET1).lib APP2STDLIBS= $(SALLIB) $(VOSLIB) $(TOOLSLIB) $(BASEGFXLIB) $(UCBHELPERLIB) $(CPPULIB) $(COMPHELPERLIB) $(I18NISOLANGLIB) $(CPPUHELPERLIB) $(SALHELPERLIB) APP2RPATH= NONE +APP2RPATH= NONE +APP2RPATH= NONE APP3TARGET= so_checksum APP3OBJS= $(OBJ)$/md5.obj \ diff --git a/tools/bootstrp/md5.cxx b/tools/bootstrp/md5.cxx index bca89725fac2..a234f278cc9d 100644 --- a/tools/bootstrp/md5.cxx +++ b/tools/bootstrp/md5.cxx @@ -44,8 +44,62 @@ #define FILE_OPEN_READ "r" #endif +// Extended calc_md5_checksum to recognize Windows executables and libraries. To +// create the same md5 checksum for a (code/data) identical file it ignores a different +// date and header checksum. Please see crashrep/source/win32/soreport.cpp +// where the same method is also used. The crash reporter uses the MD5 +// checksums to transfer them to the crash database. You have to make sure that both +// methods use the same algorithm otherwise there could be problems with stack reports. + +void normalize_pe_image(sal_uInt8* buffer, size_t nBufferSize) +{ + const int OFFSET_PE_OFFSET = 0x3c; + const int OFFSET_COFF_TIMEDATESTAMP = 4; + const int PE_SIGNATURE_SIZE = 4; + const int COFFHEADER_SIZE = 20; + const int OFFSET_PE_OPTIONALHEADER_CHECKSUM = 64; + + // Check the header part of the file buffer + if (buffer[0] == sal_uInt8('M') && buffer[1] == sal_uInt8('Z')) + { + unsigned long PEHeaderOffset = (long)buffer[OFFSET_PE_OFFSET]; + if (PEHeaderOffset < nBufferSize-4) + { + if ( buffer[PEHeaderOffset+0] == sal_uInt8('P') && + buffer[PEHeaderOffset+1] == sal_uInt8('E') && + buffer[PEHeaderOffset+2] == 0 && + buffer[PEHeaderOffset+3] == 0 ) + { + PEHeaderOffset += PE_SIGNATURE_SIZE; + if (PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP < nBufferSize-4) + { + // Set timedatestamp and checksum fields to a normalized + // value to enforce the same MD5 checksum for identical + // Windows executables/libraries. + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+0] = 0; + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+1] = 0; + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+2] = 0; + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+3] = 0; + } + + if (PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM < nBufferSize-4) + { + // Set checksum to a normalized value + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM] = 0; + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM+1] = 0; + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM+2] = 0; + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM+3] = 0; + } + } + } + } +} + rtlDigestError calc_md5_checksum( const char *filename, ByteString &aChecksum ) { + const size_t BUFFER_SIZE = 0x1000; + const size_t MINIMAL_SIZE = 512; + sal_uInt8 checksum[RTL_DIGEST_LENGTH_MD5]; rtlDigestError error = rtl_Digest_E_None; @@ -58,11 +112,19 @@ rtlDigestError calc_md5_checksum( const char *filename, ByteString &aChecksum ) if ( digest ) { size_t nBytesRead; - sal_uInt8 buffer[0x1000]; + sal_uInt8 buffer[BUFFER_SIZE]; + bool bHeader(true); while ( rtl_Digest_E_None == error && 0 != (nBytesRead = fread( buffer, 1, sizeof(buffer), fp )) ) { + if (bHeader) + { + bHeader = false; + if (nBytesRead >= MINIMAL_SIZE && buffer[0] == sal_uInt8('M') && buffer[1] == sal_uInt8('Z') ) + normalize_pe_image(buffer, nBytesRead); + } + error = rtl_digest_updateMD5( digest, buffer, nBytesRead ); } diff --git a/tools/inc/tools/postx.h b/tools/inc/tools/postx.h new file mode 100644 index 000000000000..68a2c3a31cf8 --- /dev/null +++ b/tools/inc/tools/postx.h @@ -0,0 +1,76 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: postx.h,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _POSTX_H +#define _POSTX_H + +#if defined __cplusplus +} +#endif + +/* X-Types */ +#undef Window +#undef BYTE +#undef INT8 +#undef INT64 +#undef BOOL +#undef Font +#undef Cursor +#undef String +#undef KeyCode +#undef Region +#undef Icon +#undef Time +#undef Boolean + +#undef Min +#undef Max +#undef DestroyAll +#undef Success + +#undef Printer +/* #undef FontInfo */ +#undef Orientation + +#undef GetToken +#undef ReleaseToken +#undef InitializeToken +#undef NextRequest + +#ifdef KeyPress +#if KeyPress != 2 +Error KeyPress must be Equal 2 +#endif +#undef KeyPress +#endif +#define XLIB_KeyPress 2 + +#endif + diff --git a/tools/inc/tools/prex.h b/tools/inc/tools/prex.h new file mode 100644 index 000000000000..705e33ca5188 --- /dev/null +++ b/tools/inc/tools/prex.h @@ -0,0 +1,81 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: prex.h,v $ + * $Revision: 1.17 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _PREX_H +#define _PREX_H + +#define Window XLIB_Window +#define BYTE XLIB_BYTE +#define INT8 XLIB_INT8 +#define INT64 XLIB_INT64 +#define BOOL XLIB_BOOL +#define Font XLIB_Font +#define Cursor XLIB_Cursor +#define String XLIB_String +#define KeyCode XLIB_KeyCode +#define Region XLIB_Region +#define Icon XLIB_Icon +#define Time XLIB_Time +#define Region XLIB_Region +#define Boolean XLIB_Boolean + +#if defined __cplusplus +extern "C" { +#endif + +#if defined(LINUX) || defined(FREEBSD) || defined(MACOSX) // should really check for xfree86 or for X11R6.1 and higher +#define __XKeyboardExtension__ 1 +#else +#define __XKeyboardExtension__ 0 +#endif + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/StringDefs.h> +#include <X11/extensions/Xrender.h> +#if __XKeyboardExtension__ +#include <X11/XKBlib.h> +#endif +typedef unsigned long Pixel; + +#undef DestroyAll +#define DestroyAll XLIB_DestroyAll +#define XLIB_DestroyAll 0 +#undef String +#define String XLIB_String + +#undef KeyCode +#define KeyCode XLIB_KeyCode //undef in intrinsics + +#define __Ol_OlXlibExt_h__ + +#endif + diff --git a/tools/prj/d.lst b/tools/prj/d.lst index 660afffc37e9..e8fde61686a4 100644 --- a/tools/prj/d.lst +++ b/tools/prj/d.lst @@ -31,6 +31,9 @@ mkdir: %_DEST%\inc%_EXT%\bootstrp ..\inc\tools\postwin.h %_DEST%\inc%_EXT%\tools\postwin.h ..\inc\tools\prewin.h %_DEST%\inc%_EXT%\tools\prewin.h +..\inc\tools\postx.h %_DEST%\inc%_EXT%\tools\postx.h +..\inc\tools\prex.h %_DEST%\inc%_EXT%\tools\prex.h + ..\inc\tools\agapi.hxx %_DEST%\inc%_EXT%\tools\agapi.hxx ..\inc\tools\agapi.hxx %_DEST%\inc%_EXT%\tools\agapi.hxx ..\inc\tools\agitem.hxx %_DEST%\inc%_EXT%\tools\agitem.hxx diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx index e3484aee4e2d..2aff0d734bf6 100644 --- a/tools/source/fsys/urlobj.cxx +++ b/tools/source/fsys/urlobj.cxx @@ -1523,8 +1523,15 @@ bool INetURLObject::convertRelToAbs(rtl::OUString const & rTheRelURIRef, else if (pEnd - q >= 2 && q[0] == '\\' && q[1] == '\\') { q += 2; - if (scanDomain(q, pEnd) > 0 && (q == pEnd || *q == '\\')) + sal_Int32 n = rtl_ustr_indexOfChar_WithLength( + q, pEnd - q, '\\'); + sal_Unicode const * qe = n == -1 ? pEnd : q + n; + if (parseHostOrNetBiosName( + q, qe, bOctets, ENCODE_ALL, RTL_TEXTENCODING_DONTKNOW, + true, NULL)) + { bFSys = true; // 1st + } } if (bFSys) { diff --git a/tools/source/generic/poly.cxx b/tools/source/generic/poly.cxx index 21024f081383..5cca29b3066e 100644 --- a/tools/source/generic/poly.cxx +++ b/tools/source/generic/poly.cxx @@ -1004,8 +1004,8 @@ void Polygon::GetSimple( Polygon& rResult ) const rResult = Polygon( (USHORT)aPointVector.size() ); ::std::vector< Point >::iterator aIter( aPointVector.begin() ), aEnd( aPointVector.end() ); Point* pPointArray = rResult.mpImplPolygon->mpPointAry; - - while( aIter != aEnd ) + USHORT nPoints = rResult.mpImplPolygon->mnPoints; + while( nPoints-- && aIter != aEnd ) *pPointArray++ = *aIter++; } } diff --git a/tools/util/makefile.mk b/tools/util/makefile.mk index dcc712fec552..546ef29a449a 100644 --- a/tools/util/makefile.mk +++ b/tools/util/makefile.mk @@ -82,12 +82,10 @@ LIB1FILES+= \ $(SLB)$/misc.lib .IF "$(OS)"=="MACOSX" -SHL1STDLIBS += $(UCBHELPERLIB) \ - $(CPPULIB) \ +SHL1STDLIBS += $(CPPULIB) \ $(ZLIB3RDLIB) .ELSE SHL1STDLIBS += $(ZLIB3RDLIB) \ - $(UCBHELPERLIB) \ $(CPPULIB) .ENDIF diff --git a/tools/workben/urltest.cxx b/tools/workben/urltest.cxx index 542297eb4bd6..a232f8ebdd93 100644 --- a/tools/workben/urltest.cxx +++ b/tools/workben/urltest.cxx @@ -799,6 +799,25 @@ main() bSuccess = false; } } + { + bool bWasAbsolute; + if (!rtl::OUString(INetURLObject(rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "file:///"))). + smartRel2Abs( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "\\\\unc_host\\path")), + bWasAbsolute). + GetMainURL(INetURLObject::NO_DECODE)). + equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("file://unc_host/path")) + || !bWasAbsolute) + { + printf("BAD smartRel2Abs(\"\\\\unc_host\\path\")\n"); + bSuccess = false; + } + } } if (true) |