Commit 0dee39707583b300bc745c923452a848d0f02c88
1 parent
9f7f9496
In QPDF::pipeStreamData read buffer in a single read
Showing
1 changed file
with
8 additions
and
15 deletions
libqpdf/QPDF.cc
| @@ -2419,23 +2419,17 @@ QPDF::pipeStreamData( | @@ -2419,23 +2419,17 @@ QPDF::pipeStreamData( | ||
| 2419 | } | 2419 | } |
| 2420 | 2420 | ||
| 2421 | bool attempted_finish = false; | 2421 | bool attempted_finish = false; |
| 2422 | - bool success = false; | ||
| 2423 | try { | 2422 | try { |
| 2424 | file->seek(offset, SEEK_SET); | 2423 | file->seek(offset, SEEK_SET); |
| 2425 | - char buf[10240]; | ||
| 2426 | - while (length > 0) { | ||
| 2427 | - size_t to_read = (sizeof(buf) < length ? sizeof(buf) : length); | ||
| 2428 | - size_t len = file->read(buf, to_read); | ||
| 2429 | - if (len == 0) { | ||
| 2430 | - throw damagedPDF( | ||
| 2431 | - file, "", file->getLastOffset(), "unexpected EOF reading stream data"); | ||
| 2432 | - } | ||
| 2433 | - length -= len; | ||
| 2434 | - pipeline->write(buf, len); | 2424 | + auto buf = std::make_unique<char[]>(length); |
| 2425 | + if (auto read = file->read(buf.get(), length); read != length) { | ||
| 2426 | + throw damagedPDF( | ||
| 2427 | + file, "", offset + toO(read), "unexpected EOF reading stream data"); | ||
| 2435 | } | 2428 | } |
| 2429 | + pipeline->write(buf.get(), length); | ||
| 2436 | attempted_finish = true; | 2430 | attempted_finish = true; |
| 2437 | pipeline->finish(); | 2431 | pipeline->finish(); |
| 2438 | - success = true; | 2432 | + return true; |
| 2439 | } catch (QPDFExc& e) { | 2433 | } catch (QPDFExc& e) { |
| 2440 | if (!suppress_warnings) { | 2434 | if (!suppress_warnings) { |
| 2441 | qpdf_for_warning.warn(e); | 2435 | qpdf_for_warning.warn(e); |
| @@ -2458,8 +2452,7 @@ QPDF::pipeStreamData( | @@ -2458,8 +2452,7 @@ QPDF::pipeStreamData( | ||
| 2458 | file, | 2452 | file, |
| 2459 | "", | 2453 | "", |
| 2460 | file->getLastOffset(), | 2454 | file->getLastOffset(), |
| 2461 | - "stream will be re-processed without" | ||
| 2462 | - " filtering to avoid data loss")); | 2455 | + "stream will be re-processed without filtering to avoid data loss")); |
| 2463 | } | 2456 | } |
| 2464 | } | 2457 | } |
| 2465 | } | 2458 | } |
| @@ -2470,7 +2463,7 @@ QPDF::pipeStreamData( | @@ -2470,7 +2463,7 @@ QPDF::pipeStreamData( | ||
| 2470 | // ignore | 2463 | // ignore |
| 2471 | } | 2464 | } |
| 2472 | } | 2465 | } |
| 2473 | - return success; | 2466 | + return false ; |
| 2474 | } | 2467 | } |
| 2475 | 2468 | ||
| 2476 | bool | 2469 | bool |