Imported Upstream version 17.28.2 upstream/17.28.2
authorJinWang An <jinwang.an@samsung.com>
Mon, 27 Dec 2021 00:31:39 +0000 (09:31 +0900)
committerJinWang An <jinwang.an@samsung.com>
Mon, 27 Dec 2021 00:31:39 +0000 (09:31 +0900)
CMakeLists.txt
VERSION.cmake
libzypp.spec.cmake
package/libzypp.changes
zypp/CMakeLists.txt
zypp/ZYppCommitPolicy.cc
zypp/target/TargetImpl.cc
zypp/zyppng/media/medianetwork.cc
zypp/zyppng/media/network/networkrequestdispatcher.cc
zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.cc
zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.h

index ef8e4a4..ace8b8b 100644 (file)
@@ -8,7 +8,6 @@ INCLUDE(ZyppCommon)
 OPTION (ENABLE_BUILD_DOCS "Build documentation by default?" OFF)
 OPTION (ENABLE_BUILD_TRANS "Build translation files by default?" OFF)
 OPTION (ENABLE_BUILD_TESTS "Build and run test suite by default?" OFF)
-OPTION (ENABLE_USE_THREADS "Enable using threads (NOT being used by threads!)?" OFF)
 OPTION (ENABLE_ZSTD_COMPRESSION "Build with zstd compression support?" OFF)
 OPTION (ENABLE_ZCHUNK_COMPRESSION "Build with zchunk compression support?" OFF)
 # Helps with bug https://bugzilla.gnome.org/show_bug.cgi?id=784550 , Segfault during signal emission when slots are cleared
@@ -75,8 +74,14 @@ include(CheckCXXCompilerFlag)
 CHECK_C_COMPILER_FLAG("-Werror=format-security" CC_FORMAT_SECURITY)
 CHECK_CXX_COMPILER_FLAG("-Werror=format-security" CXX_FORMAT_SECURITY)
 
-SET( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -fno-strict-aliasing -fPIC -g -Wall -Wp,-D_GLIBCXX_ASSERTIONS" )
-SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -fPIC -g -Wall -Wp,-D_GLIBCXX_ASSERTIONS" )
+SET( CMAKE_THREAD_PREFER_PTHREAD TRUE )
+FIND_PACKAGE( Threads REQUIRED )
+IF ( NOT CMAKE_USE_PTHREADS_INIT )
+  MESSAGE( FATAL_ERROR "No pthreads found" )
+ENDIF ( NOT CMAKE_USE_PTHREADS_INIT )
+
+SET( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -pthread -fno-strict-aliasing -fPIC -g -Wall -Wp,-D_GLIBCXX_ASSERTIONS" )
+SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -fno-strict-aliasing -fPIC -g -Wall -Wp,-D_GLIBCXX_ASSERTIONS" )
 
 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -Woverloaded-virtual -Wnon-virtual-dtor" )
 
@@ -130,16 +135,6 @@ ENDMACRO(ADD_TESTS)
 
 ####################################################################
 
-IF ( ENABLE_USE_THREADS )
-  SET( CMAKE_THREAD_PREFER_PTHREAD TRUE )
-  FIND_PACKAGE( Threads REQUIRED )
-  IF ( CMAKE_USE_PTHREADS_INIT )
-    MESSAGE( STATUS "May use threads." )
-    SET( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -pthread -DZYPP_USE_THREADS" )
-    SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -DZYPP_USE_THREADS" )
-  ENDIF ( CMAKE_USE_PTHREADS_INIT )
-ENDIF ( ENABLE_USE_THREADS )
-
 INCLUDE(CheckSymbolExists)
 FIND_PACKAGE(Rpm REQUIRED)
 IF ( NOT RPM_FOUND)
index dffcf46..0582da7 100644 (file)
@@ -61,8 +61,8 @@
 SET(LIBZYPP_MAJOR "17")
 SET(LIBZYPP_COMPATMINOR "22")
 SET(LIBZYPP_MINOR "28")
-SET(LIBZYPP_PATCH "1")
+SET(LIBZYPP_PATCH "2")
 #
-# LAST RELEASED: 17.28.1 (22)
+# LAST RELEASED: 17.28.2 (22)
 # (The number in parenthesis is LIBZYPP_COMPATMINOR)
 #=======
index 5514322..2984764 100644 (file)
@@ -244,8 +244,15 @@ Developer documentation for libzypp.
 %build
 mkdir build
 cd build
+%if 0%{?suse_version} > 1500
+# Bug 1189788 - UsrMerge: filesystem package breaks system when upgraded in a single rpm transaction
+# While the bug is not fixed, we don't allow ZYPP_SINGLE_RPMTRANS=1 on a not UsrMerged system
+export CFLAGS="%{optflags} -DNO_SINGLETRANS_USERMERGE"
+export CXXFLAGS="%{optflags} -DNO_SINGLETRANS_USERMERGE"
+%else
 export CFLAGS="%{optflags}"
 export CXXFLAGS="%{optflags}"
+%endif
 unset EXTRA_CMAKE_OPTIONS
 
 cmake -DCMAKE_INSTALL_PREFIX=%{_prefix} \
index ed38d0e..bb2cd49 100644 (file)
@@ -1,4 +1,11 @@
 -------------------------------------------------------------------
+Tue Aug 31 10:49:51 CEST 2021 - ma@suse.de
+
+- Workaround Bug 1189788: Don't allow ZYPP_SINGLE_RPMTRANS=1 on a
+  not UsrMerged Tumbleweed system.
+- version 17.28.2 (22)
+
+-------------------------------------------------------------------
 Mon Aug 23 08:39:15 CEST 2021 - ma@suse.de
 
 - Fix crashes in logging code when shutting down (bsc#1189031)
index 1e841bf..f65c895 100644 (file)
@@ -945,7 +945,6 @@ macro( ADDZYPPLIB LIBNAME )
   TARGET_LINK_LIBRARIES(${LIBNAME} zypp-core )
   TARGET_LINK_LIBRARIES(${LIBNAME} zypp-protobuf )
 
-
   TARGET_LINK_LIBRARIES(${LIBNAME} ${UTIL_LIBRARY} )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${RPM_LIBRARY} )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${GETTEXT_LIBRARIES} )
@@ -958,6 +957,7 @@ macro( ADDZYPPLIB LIBNAME )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${GPGME_PTHREAD_LIBRARIES})
   target_link_libraries(${LIBNAME} ${YAML_CPP_LIBRARIES})
   target_link_libraries(${LIBNAME} ${PROTOBUF_LITE_LIBRARIES})
+  TARGET_LINK_LIBRARIES(${LIBNAME} pthread )
 
   IF (ENABLE_ZSTD_COMPRESSION)
     TARGET_LINK_LIBRARIES(${LIBNAME} ${ZSTD_LIBRARY})
index 84d8d96..b948ff8 100644 (file)
 #include <zypp-core/base/LogControl.h>
 #include <zypp-core/TriBool.h>
 
+#ifdef NO_SINGLETRANS_USERMERGE
+#include <zypp/PathInfo.h>
+#include <zypp/ZYppCallbacks.h>
+#endif
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
@@ -27,16 +31,29 @@ namespace zypp
 
   bool singleTransInEnv ()
   {
-    static TriBool singleTrans = indeterminate;
-    if ( indeterminate(singleTrans) ) {
+    static bool singleTrans = ([]()->bool{
       const char *val = ::getenv("ZYPP_SINGLE_RPMTRANS");
-      if ( val && std::string_view( val ) == "1"  )
-        singleTrans = true;
-      else
-        singleTrans = false;
-    }
-    // for some reason some compilers do not accept the implicit conversion to bool here.
-    return bool( singleTrans );
+#ifdef NO_SINGLETRANS_USERMERGE
+      // Bug 1189788 - UsrMerge: filesystem package breaks system when upgraded in a single rpm transaction
+      // While the bug is not fixed, we don't allow ZYPP_SINGLE_RPMTRANS=1 on a not UsrMerged system.
+      // I.e. if /lib is a directory and not a symlink.
+      bool ret = ( val && std::string_view( val ) == "1"  );
+      if ( ret && PathInfo( "/lib", PathInfo::LSTAT ).isDir() ) {
+       WAR << "Ignore $ZYPP_SINGLE_RPMTRANS=1: Bug 1189788 - UsrMerge: filesystem package breaks system when upgraded in a single rpm transaction" << std::endl;
+       JobReport::info(
+       "[boo#1189788] Tumbleweeds filesystem package seems to be unable to perform the\n"
+       "              UsrMerge reliably in a single transaction. The requested\n"
+       "              $ZYPP_SINGLE_RPMTRANS=1 will therefore be IGNORED because\n"
+       "              the UsrMerge did not yet happen on this system."
+       , JobReport::UserData( "cmdout", "[boo#1189788]" ) );
+       return false;
+      }
+      return ret;
+#else
+      return ( val && std::string_view( val ) == "1"  );
+#endif
+    })();
+    return singleTrans;
   }
 
   ///////////////////////////////////////////////////////////////////
index 658dc56..525758c 100644 (file)
@@ -85,6 +85,7 @@ using std::endl;
 extern "C"
 {
 #include <solv/repo_rpmdb.h>
+#include <solv/chksum.h>
 }
 namespace zypp
 {
index 7ef2f2d..2bb1ce0 100644 (file)
@@ -539,6 +539,9 @@ namespace zyppng {
         case NetworkRequestError::NotFound:
           ZYPP_THROW( zypp::media::MediaFileNotFoundException( reqUrl, filename ) );
           break;
+        case NetworkRequestError::ExceededMaxLen:
+          ZYPP_THROW( zypp::media::MediaFileSizeExceededException( reqUrl, 0 ) );
+          break;
         default:
           break;
       }
index 53b4696..1bc73b2 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <zypp/base/Logger.h>
 #include <zypp/base/String.h>
+#include <zypp/base/DtorReset.h>
 
 using namespace boost;
 
@@ -156,7 +157,17 @@ void NetworkRequestDispatcherPrivate::onSocketActivated( const SocketNotifier &l
 void NetworkRequestDispatcherPrivate::handleMultiSocketAction(curl_socket_t nativeSocket, int evBitmask)
 {
   int running = 0;
-  CURLMcode rc = curl_multi_socket_action( _multi, nativeSocket, evBitmask, &running );
+  
+  // when inside a curl callback we can not call another multi curl API, 
+  // for now just lock the thing, but we should consider rewriting this 
+  // to post events instead of doing direct calls simply to decouple from 
+  // that limitation
+  CURLMcode rc = CURLM_OK;
+  {
+    zypp::DtorReset lockSet( _locked );
+    _locked = true;
+    rc = curl_multi_socket_action( _multi, nativeSocket, evBitmask, &running );
+  }
   if (rc != 0) {
     //we can not recover from a error like that, cancel all and stop
     NetworkRequestError err = NetworkRequestErrorPrivate::fromCurlMError( rc );
@@ -166,6 +177,11 @@ void NetworkRequestDispatcherPrivate::handleMultiSocketAction(curl_socket_t nati
     _sigError.emit( *z_func() );
     return;
   }
+  
+  // make sure we dequeue pending requests ( in case a call to dequeue was blocked during the API call )
+  zypp::OnScopeExit scopeFinally([this](){
+    this->dequeuePending();
+  });
 
   int msgs_left = 0;
   CURLMsg *msg = nullptr;
@@ -202,6 +218,7 @@ void NetworkRequestDispatcherPrivate::handleMultiSocketAction(curl_socket_t nati
 void NetworkRequestDispatcherPrivate::cancelAll( NetworkRequestError result )
 {
   //prevent dequeuePending from filling up the runningDownloads again
+  zypp::DtorReset lockReset( _locked );
   _locked = true;
 
   while ( _runningDownloads.size() ) {
@@ -212,8 +229,6 @@ void NetworkRequestDispatcherPrivate::cancelAll( NetworkRequestError result )
     std::shared_ptr<NetworkRequest> &req = _pendingDownloads.back();
     setFinished(*req, result );
   }
-
-  _locked = false;
 }
 
 void NetworkRequestDispatcherPrivate::setFinished( NetworkRequest &req, NetworkRequestError result )
index b913cb4..f5ccb3e 100644 (file)
@@ -26,6 +26,10 @@ namespace zyppng {
     for( const auto &req : _runningRequests ) {
       dlnowMulti += req->downloadedByteCount();
     }
+
+    if ( !assertExpectedFilesize( dlnowMulti ) )
+      return;
+
     stateMachine()._sigProgress.emit( *stateMachine().z_func(), _fileSize, dlnowMulti );
   }
 
@@ -53,6 +57,9 @@ namespace zyppng {
     }
 
     _downloadedMultiByteCount += req.downloadedByteCount();
+    if ( !assertExpectedFilesize( _downloadedMultiByteCount ) ) {
+      return;
+    }
 
     MIL_MEDIA << "Request finished "<<std::endl;
     const auto &rngs = reqLocked->requestedRanges();
@@ -284,6 +291,16 @@ namespace zyppng {
     if ( req->_myMirror )
       req->_myMirror->startTransfer();
   }
+  bool RangeDownloaderBaseState::assertExpectedFilesize( off_t currentFilesize )
+  {
+    const off_t expFSize = stateMachine()._spec.expectedFileSize();
+    if ( expFSize  > 0 && expFSize < currentFilesize ) {
+      setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
+      return false;
+    }
+    return true;
+  }
 
   /**
    * Just initialize the requests ranges from the internal blocklist
index cb0dc88..60d7acd 100644 (file)
@@ -78,6 +78,7 @@ namespace zyppng {
     void handleRequestError( std::shared_ptr<Request> req, const zyppng::NetworkRequestError &err );
     bool addBlockRanges( std::shared_ptr<Request> req, std::vector<Block> &&blocks ) const;
     void addNewRequest     (std::shared_ptr<Request> req, const bool connectSignals = true );
+    bool assertExpectedFilesize ( off_t currentFilesize );
 
     std::vector<Block> getNextBlocks ( const std::string &urlScheme );
     std::vector<Block> getNextFailedBlocks( const std::string &urlScheme );