diff options
Diffstat (limited to 'util/scripts/win-binary/nsis/qtnsisext/binpatch.cpp')
-rw-r--r-- | util/scripts/win-binary/nsis/qtnsisext/binpatch.cpp | 216 |
1 files changed, 0 insertions, 216 deletions
diff --git a/util/scripts/win-binary/nsis/qtnsisext/binpatch.cpp b/util/scripts/win-binary/nsis/qtnsisext/binpatch.cpp deleted file mode 100644 index 1c5109c..0000000 --- a/util/scripts/win-binary/nsis/qtnsisext/binpatch.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include <stdio.h> -#include <locale> - -#include "binpatch.h" - -// returns positive value if it finds a null termination inside the buffer -long BinPatch::getBufferStringLength(char *data, char *end) -{ - long size = 0; - while (data < end) { - if (*data == '\0') - return size; - ++data; - ++size; - } - - return -1; -} - -// returns true if data ends with one of the tokens. (Sep. with ;) -bool BinPatch::endsWithTokens(const char *data) -{ - if(strlen(endTokens) > 0) { - char endstmp[1024]; - ulong tlen = ulong(strlen(data)); - - if(strlen(endTokens) >= sizeof(endstmp)) - return false; - - strcpy(endstmp, endTokens); - - char *token = strtok(endstmp, ";"); - - while(token != NULL) { - // check if it ends with the token - if ((tlen >= strlen(token)) - && (stricmp((data+tlen)-strlen(token), token) == 0)) - return true; - token = strtok(NULL, ";"); - } - } else { - return true; //true if no tokens - } - - return false; //no matching tokens -} - -bool BinPatch::patchHelper(char *inbuffer, const char *oldstr, const char *newstr, size_t len, long *rw) -{ - char nc1 = *oldstr; - char nc2 = 0; - char *inend = inbuffer + len; - size_t oldlen = strlen(oldstr); - size_t newlen = strlen(newstr); - char *instart = inbuffer; - *rw = 0; - bool write = true; - - isupper(nc1) ? nc2 = tolower(nc1) : nc2 = toupper(nc1); - - while(inbuffer < inend) { - if ((*inbuffer == nc1) || (*inbuffer == nc2)) { - if (inbuffer > (inend-oldlen) || inbuffer > (inend-newlen)) { - *rw = (long)(inend-inbuffer); //rewind, not enough to make a compare - break; - } - - if (strnicmp(inbuffer, oldstr, oldlen) == 0) { - if (useLength && (instart == inbuffer)) { - *rw = (long)(len+1); //we don't have access to the length byte, rewind all + 1! - write = false; - break; - } - - long oldsize = -1; - if (useLength) { //VC60 - oldsize = (unsigned char)(*(inbuffer-1)); - - // vc60 pdb files sometimes uses 0A, then it should be null terminated - if (oldsize < (long)oldlen) { - if (oldsize != 0x0A) { //strange case... skip - inbuffer+=oldlen; - continue; - } - - oldsize = getBufferStringLength(inbuffer, inend); - - if (oldsize < 0) { - *rw = (long)(inend-inbuffer); //rewind, entire string not in buffer - break; - } - } - - if (inbuffer > (inend-oldsize)) { - *rw = (long)(inend-inbuffer); //rewind, entire string not in buffer - break; - } - } else { //VC7x - oldsize = getBufferStringLength(inbuffer, inend); - if (oldsize < 0) { - *rw = (long)(inend-inbuffer); //rewind, entire string not in buffer - break; - } - } - - char oldPath[1024]; - if (oldsize > sizeof(oldPath)) { - //at least don't crash - inbuffer+=oldsize; - continue; - } - memset(oldPath, '\0', sizeof(oldPath)); - strncpy(oldPath, newstr, newlen); - - if (insertReplace) - strncat(oldPath, inbuffer+oldlen, oldsize-oldlen); - - // just replace if it ends with a token in endTokens - if (endsWithTokens(oldPath)) { - if (oldsize < (long)strlen(oldPath)) - oldsize = (long)strlen(oldPath); - - memcpy(inbuffer, oldPath, oldsize); - } - - inbuffer+=oldsize; - continue; - } - } - ++inbuffer; - } - - return write; -} - -bool BinPatch::patch(const char *oldstr, const char *newstr) -{ - size_t oldlen = strlen(oldstr); - size_t newlen = strlen(newstr); - - if ((!fileName || strlen(fileName) < 1) - || (!oldstr || oldlen < 1) - || (!newstr || newlen < 1)) - return false; - - FILE *input; - - if (!(input = fopen(fileName, "r+b"))) - { - fprintf(stderr, "Cannot open file %s!\n", fileName); - return false; - } - - char data[60000]; - long rw = 0; - long offset = 0; - - size_t len; - len = fread(data, sizeof(char), sizeof(data), input); - - do { - if (patchHelper(data, oldstr, newstr, len, &rw)) { - fseek(input, offset, SEEK_SET); //overwrite - fwrite(data, sizeof(char), len, input); - } - - offset += (long)((-rw) + len); - if (fseek(input, offset, SEEK_SET) != 0) - break; - len = fread(data, sizeof(char), sizeof(data), input); - } while(!(feof(input) && (len <= oldlen || len <= newlen))); - - fclose(input); - - return true; -} |