@@ -98,6 +98,8 @@ libcdoc::CDocReader::getCDocFileVersion(const std::string& path)
9898libcdoc::CDocReader *
9999libcdoc::CDocReader::createReader (DataSource *src, bool take_ownership, Configuration *conf, CryptoBackend *crypto, NetworkBackend *network)
100100{
101+ if (!src)
102+ return nullptr ;
101103 int version = getCDocFileVersion (src);
102104 LOG_DBG (" CDocReader::createReader: version {}" , version);
103105 if (src->seek (0 ) != libcdoc::OK) return nullptr ;
@@ -106,7 +108,9 @@ libcdoc::CDocReader::createReader(DataSource *src, bool take_ownership, Configur
106108 reader = new CDoc1Reader (src, take_ownership);
107109 } else if (version == 2 ) {
108110 reader = new CDoc2Reader (src, take_ownership);
109- } else {
111+ } else {
112+ if (take_ownership)
113+ delete src;
110114 return nullptr ;
111115 }
112116 reader->conf = conf;
@@ -118,12 +122,18 @@ libcdoc::CDocReader::createReader(DataSource *src, bool take_ownership, Configur
118122libcdoc::CDocReader *
119123libcdoc::CDocReader::createReader (const std::string& path, Configuration *conf, CryptoBackend *crypto, NetworkBackend *network)
120124{
121- int version = getCDocFileVersion (path);
125+ if (path.empty ())
126+ return nullptr ;
127+ auto isrc = make_unique<IStreamSource>(path);
128+ int version = getCDocFileVersion (isrc.get ());
129+ LOG_DBG (" CDocReader::createReader: version {}" , version);
130+ if (isrc->seek (0 ) != libcdoc::OK)
131+ return nullptr ;
122132 CDocReader *reader;
123133 if (version == 1 ) {
124- reader = new CDoc1Reader (path );
134+ reader = new CDoc1Reader (isrc. release (), true );
125135 } else if (version == 2 ) {
126- reader = new CDoc2Reader (path );
136+ reader = new CDoc2Reader (isrc. release (), true );
127137 } else {
128138 return nullptr ;
129139 }
@@ -138,6 +148,7 @@ libcdoc::CDocReader::createReader(std::istream& ifs, Configuration *conf, Crypto
138148{
139149 libcdoc::IStreamSource *isrc = new libcdoc::IStreamSource (&ifs, false );
140150 int version = getCDocFileVersion (isrc);
151+ LOG_DBG (" CDocReader::createReader: version {}" , version);
141152 CDocReader *reader;
142153 if (version == 1 ) {
143154 reader = new CDoc1Reader (isrc, true );
0 commit comments