| Index: experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp | 
| =================================================================== | 
| --- experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp	(revision 9983) | 
| +++ experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp	(working copy) | 
| @@ -67,7 +67,10 @@ | 
| // 1) run on a lot of file | 
| // 2) recoverable corupt file: remove endobj, endsteam, remove other keywords, use other white spaces, insert comments randomly, ... | 
| // 3) irrecoverable corrupt file | 
| -SkNativeParsedPDF::SkNativeParsedPDF(const char* path) : fAllocator(new SkPdfAllocator()) { | 
| +SkNativeParsedPDF::SkNativeParsedPDF(const char* path) | 
| +        : fAllocator(new SkPdfAllocator()) | 
| +        , fRootCatalogRef(NULL) | 
| +        , fRootCatalog(NULL) { | 
| gDoc = this; | 
| FILE* file = fopen(path, "r"); | 
| fContentLength = getFileSize(path); | 
| @@ -97,11 +100,17 @@ | 
| // TODO(edisonn): warn/error expect fObjects[fRefCatalogId].fGeneration == fRefCatalogGeneration | 
| // TODO(edisonn): security, verify that SkPdfCatalogDictionary is indeed using mapper | 
| // load catalog | 
| -    fRootCatalog = (SkPdfCatalogDictionary*)resolveReference(fRootCatalogRef); | 
| -    SkPdfPageTreeNodeDictionary* tree = fRootCatalog->Pages(this); | 
|  | 
| -    fillPages(tree); | 
| +    if (fRootCatalogRef) { | 
| +        fRootCatalog = (SkPdfCatalogDictionary*)resolveReference(fRootCatalogRef); | 
| +        SkPdfPageTreeNodeDictionary* tree = fRootCatalog->Pages(this); | 
|  | 
| +        fillPages(tree); | 
| +    } else { | 
| +        // TODO(edisonn): corrupted pdf, read it from beginning and rebuild (xref, trailer, or just reall all objects) | 
| +        // 0 pages | 
| +    } | 
| + | 
| // now actually read all objects if we want, or do it lazyly | 
| // and resolve references?... or not ... | 
| } | 
| @@ -171,7 +180,13 @@ | 
|  | 
| SkPdfObject token; | 
| current = nextObject(current, trailerEnd, &token, fAllocator); | 
| +    if (!token.isDictionary()) { | 
| +        return -1; | 
| +    } | 
| SkPdfFileTrailerDictionary* trailer = (SkPdfFileTrailerDictionary*)&token; | 
| +    if (!trailer->valid()) { | 
| +        return -1; | 
| +    } | 
|  | 
| if (storeCatalog) { | 
| const SkPdfObject* ref = trailer->Root(NULL); | 
|  |