Skip to content

Commit 267b2ef

Browse files
committed
Fix crash in property parser for invalid image types
1 parent 10c2101 commit 267b2ef

File tree

3 files changed

+61
-36
lines changed

3 files changed

+61
-36
lines changed

PIFShellExtensionsLib/PIFParser.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ CBaseImageParser::CBaseImageParser() :
2424

2525
CBaseImageParser::~CBaseImageParser()
2626
{
27-
delete [] m_rgData;
27+
if (m_rgData)
28+
{
29+
delete [] m_rgData;
30+
}
31+
2832
GdiplusShutdown(_gdiPlusToken);
2933
}
3034

PIFShellExtensionsLib/PIFShellExtensions.cpp

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -456,53 +456,52 @@ HRESULT CPIFShellExt::_InitializeProperties()
456456
PROPVARIANT pv = {};
457457
CBaseImageParser* pImageParser = nullptr;
458458
hr = CBaseImageParser::CreateParserFromStream(_spStream, &pImageParser);
459-
460459
if (SUCCEEDED(hr))
461460
{
462461
pv.vt = VT_LPWSTR;
463462
pv.pwszVal = L"image/bmp";
464463
hr = _spPropertyStore->SetValue(PKEY_MIMEType, pv);
465-
}
466464

467-
if (SUCCEEDED(hr))
468-
{
469-
pv.vt = VT_UI4;
470-
pv.ulVal = pImageParser->GetWidth();
471-
hr = _spPropertyStore->SetValue(PKEY_Image_HorizontalSize, pv);
472-
}
465+
if (SUCCEEDED(hr))
466+
{
467+
pv.vt = VT_UI4;
468+
pv.ulVal = pImageParser->GetWidth();
469+
hr = _spPropertyStore->SetValue(PKEY_Image_HorizontalSize, pv);
470+
}
473471

474-
if (SUCCEEDED(hr))
475-
{
476-
pv.vt = VT_UI4;
477-
pv.ulVal = pImageParser->GetHeight();
478-
hr = _spPropertyStore->SetValue(PKEY_Image_VerticalSize, pv);
479-
}
472+
if (SUCCEEDED(hr))
473+
{
474+
pv.vt = VT_UI4;
475+
pv.ulVal = pImageParser->GetHeight();
476+
hr = _spPropertyStore->SetValue(PKEY_Image_VerticalSize, pv);
477+
}
480478

481-
if (SUCCEEDED(hr))
482-
{
483-
pv.vt = VT_UI4;
484-
pv.ulVal = pImageParser->GetBitDepth();
485-
hr = _spPropertyStore->SetValue(PKEY_Image_BitDepth, pv);
486-
}
479+
if (SUCCEEDED(hr))
480+
{
481+
pv.vt = VT_UI4;
482+
pv.ulVal = pImageParser->GetBitDepth();
483+
hr = _spPropertyStore->SetValue(PKEY_Image_BitDepth, pv);
484+
}
487485

488-
if (SUCCEEDED(hr))
489-
{
490-
wchar_t szResolution[30];
491-
hr = StringCchPrintf(szResolution, ARRAYSIZE(szResolution), L"%i x %i", pImageParser->GetWidth(), pImageParser->GetHeight());
492-
pv.vt = VT_LPWSTR;
493-
pv.pwszVal = szResolution;
494-
hr = _spPropertyStore->SetValue(PKEY_Image_Dimensions, pv);
495-
}
486+
if (SUCCEEDED(hr))
487+
{
488+
wchar_t szResolution[30];
489+
hr = StringCchPrintf(szResolution, ARRAYSIZE(szResolution), L"%i x %i", pImageParser->GetWidth(), pImageParser->GetHeight());
490+
pv.vt = VT_LPWSTR;
491+
pv.pwszVal = szResolution;
492+
hr = _spPropertyStore->SetValue(PKEY_Image_Dimensions, pv);
493+
}
496494

497-
if (SUCCEEDED(hr))
498-
{
499-
_fPropertiesInitialized = true;
500-
}
495+
if (SUCCEEDED(hr))
496+
{
497+
_fPropertiesInitialized = true;
498+
}
501499

502-
delete pImageParser;
503-
pImageParser = nullptr;
500+
delete pImageParser;
501+
pImageParser = nullptr;
504502

505-
IStream_Reset(_spStream);
503+
IStream_Reset(_spStream);
504+
}
506505
}
507506
return hr;
508507
}

PIFShellExtensionsTests/PropertyStoreTests.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,28 @@ namespace PIFShellExtensionsTests
4141
pPIFShellExt->Release();
4242
}
4343

44+
TEST_METHOD(VerifyInvalidFileGetPropertyStore)
45+
{
46+
CComPtr<IStream> spStream;
47+
Assert::IsTrue(SHCreateStreamOnFileEx(SZ_ROOT_TEST_FOLDER L"Invalid\\PGMB\\barbara_zero_width_and_height.pgm", STGM_READ, FILE_ATTRIBUTE_NORMAL, FALSE, NULL, &spStream) == S_OK);
48+
49+
CPIFShellExt* pPIFShellExt = new CPIFShellExt();
50+
Assert::IsNotNull(pPIFShellExt);
51+
52+
CComPtr<IInitializeWithStream> spInitWithStream;
53+
Assert::IsTrue(pPIFShellExt->QueryInterface(IID_PPV_ARGS(&spInitWithStream)) == S_OK);
54+
55+
Assert::IsTrue(spInitWithStream->Initialize(spStream, STGM_READ) == S_OK);
56+
57+
CComPtr<IPropertyStore> spPropStore;
58+
Assert::IsTrue(pPIFShellExt->QueryInterface(IID_PPV_ARGS(&spPropStore)) == S_OK);
59+
60+
PROPVARIANT pv = {};
61+
Assert::IsFalse(spPropStore->GetValue(PKEY_Image_Dimensions, &pv) == S_OK);
62+
63+
pPIFShellExt->Release();
64+
}
65+
4466

4567
// TODO:
4668
// Verify dimensions are correct

0 commit comments

Comments
 (0)