aboutsummaryrefslogtreecommitdiffstats
path: root/sisinstall
diff options
context:
space:
mode:
authorDaniel Brahneborg <basic@chello.se>2002-03-03 22:02:40 +0000
committerDaniel Brahneborg <basic@chello.se>2002-03-03 22:02:40 +0000
commita4dcb0ecf632832258ebb523c6bc39b7b94f8775 (patch)
tree18cf38bb6ecd95671401414c2ba8381b6c90132f /sisinstall
parentd92c2abcca7d9270f49cbfb09a27bfda86642c31 (diff)
downloadplptools-a4dcb0ecf632832258ebb523c6bc39b7b94f8775.tar.gz
plptools-a4dcb0ecf632832258ebb523c6bc39b7b94f8775.tar.bz2
plptools-a4dcb0ecf632832258ebb523c6bc39b7b94f8775.zip
Add buffer overflow checks to handle truncated and corrupted sis files.
Diffstat (limited to 'sisinstall')
-rw-r--r--sisinstall/Makefile.am3
-rw-r--r--sisinstall/sisinstaller.cpp21
-rw-r--r--sisinstall/sisinstaller.h6
-rw-r--r--sisinstall/sismain.cpp17
4 files changed, 31 insertions, 16 deletions
diff --git a/sisinstall/Makefile.am b/sisinstall/Makefile.am
index 67c990d..09c2620 100644
--- a/sisinstall/Makefile.am
+++ b/sisinstall/Makefile.am
@@ -5,8 +5,7 @@ INCLUDES=-I$(top_srcdir)/lib
bin_PROGRAMS = sisinstall
sisinstall_LDADD = $(top_srcdir)/lib/libplp.la
sisinstall_SOURCES = psion.cpp sisinstaller.cpp sismain.cpp \
- fakepsion.cpp
-sisinstall_HEADERS = fakepsion.h
+ fakepsion.cpp fakepsion.h
EXTRA_DIST = psion.h sisinstaller.h
maintainer-clean-local:
diff --git a/sisinstall/sisinstaller.cpp b/sisinstall/sisinstaller.cpp
index db58720..a82c9a2 100644
--- a/sisinstall/sisinstaller.cpp
+++ b/sisinstall/sisinstaller.cpp
@@ -152,10 +152,16 @@ SISInstaller::installFile(SISFileRecord* fileRecord)
printf("Recursive sis file...\n");
SISFile sisFile;
uchar* buf2 = m_buf + fileRecord->m_filePtrs[m_fileNo];
- sisFile.fillFrom(buf2);
+ off_t len = fileRecord->m_fileLengths[m_fileNo];
+ SisRC rc = sisFile.fillFrom(buf2, len);
+ if (rc != SIS_OK)
+ {
+ printf("Could not read contained sis file, rc = %d\n", rc);
+ break;
+ }
SISInstaller installer;
installer.setPsion(m_psion);
- installer.run(&sisFile, buf2, m_file);
+ rc = installer.run(&sisFile, buf2, len, m_file);
if (0 == m_drive)
{
m_drive = sisFile.m_header.m_installationDrive;
@@ -186,14 +192,14 @@ SISInstaller::setPsion(Psion* psion)
m_psion = psion;
}
-void
-SISInstaller::run(SISFile* file, uchar* buf)
+SisRC
+SISInstaller::run(SISFile* file, uchar* buf, off_t len)
{
- run(file, buf, 0);
+ return run(file, buf, len, 0);
}
-void
-SISInstaller::run(SISFile* file, uchar* buf, SISFile* parent)
+SisRC
+SISInstaller::run(SISFile* file, uchar* buf, off_t len, SISFile* parent)
{
int n;
int lang;
@@ -318,6 +324,7 @@ SISInstaller::run(SISFile* file, uchar* buf, SISFile* parent)
printf("Creating residual sis file %s\n", resname);
copyBuf(buf, firstFile, resname);
delete[] resname;
+ return SIS_OK;
}
void
diff --git a/sisinstall/sisinstaller.h b/sisinstall/sisinstaller.h
index 6bc6c18..00077f3 100644
--- a/sisinstall/sisinstaller.h
+++ b/sisinstall/sisinstaller.h
@@ -3,6 +3,8 @@
#include "sistypes.h"
+#include <sys/types.h>
+
class Psion;
class SISFile;
class SISFileRecord;
@@ -15,9 +17,9 @@ class SISInstaller
{
public:
- void run(SISFile* file, uchar* buf);
+ SisRC run(SISFile* file, uchar* buf, off_t len);
- void run(SISFile* file, uchar* buf, SISFile* parent);
+ SisRC run(SISFile* file, uchar* buf, off_t len, SISFile* parent);
/**
* Ask the user which drive to install to.
diff --git a/sisinstall/sismain.cpp b/sisinstall/sismain.cpp
index 8516b0f..5a5b640 100644
--- a/sisinstall/sismain.cpp
+++ b/sisinstall/sismain.cpp
@@ -67,12 +67,19 @@ void main(int argc, char* argv[])
}
createCRCTable();
SISFile sisFile;
- sisFile.fillFrom(buf);
- if (!dryrun)
+ SisRC rc = sisFile.fillFrom(buf, len);
+ if (rc == SIS_OK)
{
- SISInstaller installer;
- installer.setPsion(psion);
- installer.run(&sisFile, buf);
+ if (!dryrun)
+ {
+ SISInstaller installer;
+ installer.setPsion(psion);
+ installer.run(&sisFile, buf, len);
+ }
+ }
+ else
+ {
+ printf("Could not parse the sis file.\n");
}
psion->disconnect();