Skip to content

Commit fe0f9fc

Browse files
committed
Fix: Prevent segfaults in disk state loading with null pointer protection
1 parent 47864c1 commit fe0f9fc

2 files changed

Lines changed: 10 additions & 9 deletions

File tree

daemon/queue/DiskState.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,15 +1126,15 @@ bool DiskState::LoadFileInfo(FileInfo* fileInfo, StateDiskFile& infile, int form
11261126
char buf[1024];
11271127

11281128
if (!infile.ReadLine(buf, sizeof(buf))) goto error;
1129-
if (fileSummary) fileInfo->SetSubject(buf);
1129+
if (fileSummary && !Util::EmptyStr(buf)) fileInfo->SetSubject(buf);
11301130

11311131
if (!infile.ReadLine(buf, sizeof(buf))) goto error;
1132-
if (fileSummary) fileInfo->SetFilename(buf);
1132+
if (fileSummary && !Util::EmptyStr(buf)) fileInfo->SetFilename(buf);
11331133

11341134
if (formatVersion >= 6)
11351135
{
11361136
if (!infile.ReadLine(buf, sizeof(buf))) goto error;
1137-
if (fileSummary) fileInfo->SetOrigname(Util::EmptyStr(buf) ? nullptr : buf);
1137+
if (fileSummary && !Util::EmptyStr(buf)) fileInfo->SetOrigname(buf);
11381138
}
11391139

11401140
if (formatVersion >= 7)
@@ -1150,14 +1150,14 @@ bool DiskState::LoadFileInfo(FileInfo* fileInfo, StateDiskFile& infile, int form
11501150
{
11511151
int time, filenameConfirmed;
11521152
if (infile.ScanLine("%i,%i", &filenameConfirmed, &time) != 2) goto error;
1153-
if (fileSummary) fileInfo->SetFilenameConfirmed((bool)filenameConfirmed);
1154-
if (fileSummary) fileInfo->SetTime((time_t)time);
1153+
if (fileSummary) fileInfo->SetFilenameConfirmed(static_cast<bool>(filenameConfirmed));
1154+
if (fileSummary) fileInfo->SetTime(static_cast<time_t>(time));
11551155
}
11561156
else if (formatVersion >= 4)
11571157
{
11581158
int time;
11591159
if (infile.ScanLine("%i", &time) != 1) goto error;
1160-
if (fileSummary) fileInfo->SetTime((time_t)time);
1160+
if (fileSummary) fileInfo->SetTime(static_cast<time_t>(time));
11611161
}
11621162

11631163
uint32 High, Low;
@@ -1171,7 +1171,7 @@ bool DiskState::LoadFileInfo(FileInfo* fileInfo, StateDiskFile& infile, int form
11711171

11721172
int parFile;
11731173
if (infile.ScanLine("%i", &parFile) != 1) goto error;
1174-
if (fileSummary) fileInfo->SetParFile((bool)parFile);
1174+
if (fileSummary) fileInfo->SetParFile(static_cast<bool>(parFile));
11751175

11761176
int totalArticles, missedArticles;
11771177
if (infile.ScanLine("%i,%i", &totalArticles, &missedArticles) != 2) goto error;
@@ -1183,7 +1183,7 @@ bool DiskState::LoadFileInfo(FileInfo* fileInfo, StateDiskFile& infile, int form
11831183
for (int i = 0; i < size; i++)
11841184
{
11851185
if (!infile.ReadLine(buf, sizeof(buf))) goto error;
1186-
if (fileSummary) fileInfo->GetGroups()->push_back(buf);
1186+
if (fileSummary && !Util::EmptyStr(buf)) fileInfo->GetGroups()->push_back(buf);
11871187
}
11881188

11891189
if (articles)
@@ -1295,7 +1295,7 @@ bool DiskState::LoadFileState(FileInfo* fileInfo, Servers* servers, StateDiskFil
12951295
if (formatVersion >= 4)
12961296
{
12971297
if (!infile.ReadLine(buf, sizeof(buf))) goto error;
1298-
fileInfo->SetFilename(buf);
1298+
if (!Util::EmptyStr(buf)) fileInfo->SetFilename(buf);
12991299
}
13001300

13011301
if (formatVersion >= 5)

daemon/queue/DownloadInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ class FileInfo
143143
void SetSubject(const char* subject) { m_subject = subject; }
144144
const char* GetFilename() { return m_filename.c_str(); }
145145
void SetFilename(std::string filename) { m_filename = std::move(filename); }
146+
void SetFilename(const char* filename) { m_filename = filename ? filename : ""; }
146147
void SetOrigname(const char* origname) { m_origname = origname; }
147148
const char* GetOrigname() { return m_origname; }
148149
void MakeValidFilename();

0 commit comments

Comments
 (0)