diff options
| -rw-r--r-- | lib/siscomponentrecord.cpp | 20 | ||||
| -rw-r--r-- | lib/siscomponentrecord.h | 7 | ||||
| -rw-r--r-- | lib/sisfile.cpp | 15 | ||||
| -rw-r--r-- | lib/sisfile.h | 13 | ||||
| -rw-r--r-- | sisinstall/sisinstaller.cpp | 23 | 
5 files changed, 54 insertions, 24 deletions
| diff --git a/lib/siscomponentrecord.cpp b/lib/siscomponentrecord.cpp index 3507bce..ac5ba6d 100644 --- a/lib/siscomponentrecord.cpp +++ b/lib/siscomponentrecord.cpp @@ -35,12 +35,15 @@ SISComponentNameRecord::~SISComponentNameRecord()  }  SisRC -SISComponentNameRecord::fillFrom(uint8_t* buf, int base, off_t len, +SISComponentNameRecord::fillFrom(uint8_t* buf, int* basePos, off_t len,  								 SISFile* sisFile)  {  	int n = sisFile->m_header.m_nlangs; -	if (base + 8 + n * 4 * 2 > len) +	int base = *basePos; +	int entrySize = 8 + n * 4 * 2; +	if (base + entrySize > len)  		return SIS_TRUNCATED; +	*basePos += entrySize;  	uint8_t* p = buf + base;  	int size = 0; @@ -90,6 +93,19 @@ SISComponentNameRecord::fillFrom(uint8_t* buf, int base, off_t len,  	return SIS_OK;  } +uint32_t +SISComponentNameRecord::getLastEnd() +{ +	uint32_t last = 0; +	for (int i = 0; i < m_nameCount; ++i) +		{ +		uint32_t pos = m_namePtrs[i] + m_nameLengths[i]; +		if (last < pos) +			last = pos; +		} +	return last; +} +  uint8_t*  SISComponentNameRecord::getName(int no)  { diff --git a/lib/siscomponentrecord.h b/lib/siscomponentrecord.h index f2bc734..1fc4ff3 100644 --- a/lib/siscomponentrecord.h +++ b/lib/siscomponentrecord.h @@ -50,7 +50,12 @@ public:  	 * @param len The length of the buffer, for range checking.  	 * @param sisFile The container sis file.  	 */ -	SisRC fillFrom(uint8_t* buf, int base, off_t len, SISFile* sisFile); +	SisRC fillFrom(uint8_t* buf, int* base, off_t len, SISFile* sisFile); + +	/** +	 * Find out the end position for the last name in the file. +	 */ +	uint32_t getLastEnd();  	/**  	 * Return the name for the given language. diff --git a/lib/sisfile.cpp b/lib/sisfile.cpp index df60695..97fde1d 100644 --- a/lib/sisfile.cpp +++ b/lib/sisfile.cpp @@ -49,6 +49,7 @@ SISFile::compareApp(SISFile* other)  SisRC  SISFile::fillFrom(uint8_t* buf, off_t len)  { +	m_end = 0;  	int ix = 0;  	m_buf = buf;  	SisRC rc = m_header.fillFrom(buf, &ix, len); @@ -77,6 +78,7 @@ SISFile::fillFrom(uint8_t* buf, off_t len)  			return rc;  			}  		} +	updateEnd(ix);  	// Read requisites.  	// @@ -94,11 +96,14 @@ SISFile::fillFrom(uint8_t* buf, off_t len)  			return rc;  			}  		} +	updateEnd(ix);  	// Read component names, by language.  	//  	ix = m_header.m_componentPtr; -	rc = m_componentRecord.fillFrom(buf, ix, len, this); +	rc = m_componentRecord.fillFrom(buf, &ix, len, this); +	updateEnd(ix); +	updateEnd(m_componentRecord.getLastEnd());  	if (rc != SIS_OK)  		{  		printf(_("Problem reading the name record, rc = %d.\n"), rc); @@ -125,6 +130,7 @@ SISFile::fillFrom(uint8_t* buf, off_t len)  				return rc;  			}  		} +	updateEnd(ix);  	return SIS_OK;  } @@ -165,3 +171,10 @@ SISFile::setLanguage(int lang)  	m_header.m_installationLanguage = lang;  } +void +SISFile::updateEnd(uint32_t pos) +{ +	if (m_end < pos) +		m_end = pos; +} + diff --git a/lib/sisfile.h b/lib/sisfile.h index d74cc1c..bb33570 100644 --- a/lib/sisfile.h +++ b/lib/sisfile.h @@ -74,6 +74,15 @@ public:  	 */  	uint8_t* getName(); +	/** +	 * Get the number of bytes that should be copied to the residual sis +	 * file on the psion. +	 */ +	uint32_t getResidualEnd() +		{ +		return m_end; +		} +  	void ownBuffer()  		{  		m_ownBuffer = true; @@ -112,6 +121,10 @@ private:  	uint8_t* m_buf; +	uint32_t m_end; + +	void updateEnd(uint32_t pos); +  };  #endif diff --git a/sisinstall/sisinstaller.cpp b/sisinstall/sisinstaller.cpp index e23baed..aed67f0 100644 --- a/sisinstall/sisinstaller.cpp +++ b/sisinstall/sisinstaller.cpp @@ -654,7 +654,6 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)  		fprintf(stderr, "Found %d files.\n", n);  	m_drive = (parent == 0) ? 0 : parent->m_header.m_installationDrive;  	int nCopiedFiles = 0; -	int firstFile = -1;  	m_lastSisFile = 0;  	bool skipnext = false;  	bool aborted = false; @@ -662,19 +661,6 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)  		{  		SISFileRecord* fileRecord = &m_file->m_fileRecords[n];  		m_fileNo = (fileRecord->m_flags & 1) ? lang : 0; -		char ch; -#if 0 -		printf("FirstFile = %d, ptr = %d, length = %d\n", -			   firstFile, -			   fileRecord->m_filePtrs[m_fileNo], -			   fileRecord->m_fileLengths[m_fileNo]); -#endif -		int fileIx = fileRecord->getFilePtr(m_fileNo) - m_buf; -		if ((firstFile == -1) || (firstFile >= fileIx)) -			firstFile = fileIx; - -//		 We can only do this if we search all files... -//		 fileRecord->m_filePtrs[m_fileNo] + fileRecord->m_fileLengths[m_fileNo]  		if (skipnext)  			{ @@ -700,13 +686,10 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)  	m_file->setFiles(nCopiedFiles);  	if (logLevel >= 1)  		fprintf(stderr, -				"Installed %d files of %d, cutting at offset max(%d,%d)\n", +				"Installed %d files of %d, cutting at offset %d.\n",  				m_file->m_header.m_installationFiles,  				m_file->m_header.m_nfiles, -				firstFile, -				m_lastSisFile); -	if (firstFile < m_lastSisFile) -		firstFile = m_lastSisFile; +				m_file->getResidualEnd());  	if (nCopiedFiles == 0)  		{  		// There is no need to copy any uninstall information to the @@ -728,7 +711,7 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent)  	sprintf(resname, "C:\\System\\Install\\%.*s.sis", namelen, compName);  	if (logLevel >= 1)  		fprintf(stderr, "Creating residual sis file %s\n", resname); -	copyBuf(buf, firstFile, resname); +	copyBuf(buf, m_file->getResidualEnd(), resname);  #if HAVE_LIBNEWT  	if (m_useNewt)  		{ | 
