[Libreoffice-commits] core.git: vcl/unx

Ashod Nakashian ashod.nakashian at collabora.co.uk
Sun Nov 5 21:52:00 UTC 2017


 vcl/unx/generic/printer/ppdparser.cxx |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

New commits:
commit 4058d85963e371be657f531d8f30e31381a9ccab
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Nov 5 15:17:47 2017 -0500

    PPDCache: fix segfault due to access after delete
    
    Regression introduced in:
    
        commit afe4d2527ec72e7493a2b1431559652ef45bebab
        Author: Noel Grandin <noel.grandin at collabora.co.uk>
        Date:   Wed Oct 18 09:43:21 2017 +0200
    
            use std::unique_ptr in PPDCache
    
    Removing a naked pointer before inserting a possibly existing
    one in a container is safe. This insured uniqueness (as the
    comment suggests). However with unique_ptr, removal before
    inserting deletes the pointer (when it exists), and the
    insertion now taints the container with a wild pointer.
    
    The fix is to skip adding if the pointer is already in the
    container and add only when missing.
    
    Change-Id: Ifc6b517451abb564949ccadfee10d98bf827540d
    Reviewed-on: https://gerrit.libreoffice.org/44333
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/vcl/unx/generic/printer/ppdparser.cxx b/vcl/unx/generic/printer/ppdparser.cxx
index d8bbd11e4b50..a2d8f45c8c42 100644
--- a/vcl/unx/generic/printer/ppdparser.cxx
+++ b/vcl/unx/generic/printer/ppdparser.cxx
@@ -576,15 +576,15 @@ const PPDParser* PPDParser::getParser( const OUString& rFile )
     if( pNewParser )
     {
         // this may actually be the SGENPRT parser,
-        // so ensure uniqueness here
-        rPPDCache.aAllParsers.erase(
-                std::remove_if(
+        // so ensure uniqueness here (but don't remove lest we delete us!)
+        if (std::find_if(
                     rPPDCache.aAllParsers.begin(),
                     rPPDCache.aAllParsers.end(),
-                    [pNewParser] (std::unique_ptr<PPDParser> const & x) { return x.get() == pNewParser; } ),
-                rPPDCache.aAllParsers.end());
-        // insert new parser to vector
-        rPPDCache.aAllParsers.emplace_back(pNewParser);
+                    [pNewParser] (std::unique_ptr<PPDParser> const & x) { return x.get() == pNewParser; } ) == rPPDCache.aAllParsers.end())
+        {
+            // insert new parser to vector
+            rPPDCache.aAllParsers.emplace_back(pNewParser);
+        }
     }
     return pNewParser;
 }


More information about the Libreoffice-commits mailing list