fix crash when a sink parameter definition is missing in a processing alg (#34978)

This commit is contained in:
Denis Rouzaud 2020-03-14 01:03:13 +01:00 committed by GitHub
parent 35d8b062ca
commit 14b80de7ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 25 additions and 8 deletions

View File

@ -623,7 +623,7 @@ Evaluates the parameter with matching ``name`` to a static boolean value.
%End %End
QgsFeatureSink *parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier /Out/, QgsFeatureSink *parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier /Out/,
const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem(), QgsFeatureSink::SinkFlags sinkFlags = 0 ) const /Factory/; const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem(), QgsFeatureSink::SinkFlags sinkFlags = 0 ) const throw( QgsProcessingException ) /Factory/;
%Docstring %Docstring
Evaluates the parameter with matching ``name`` to a feature sink. Evaluates the parameter with matching ``name`` to a feature sink.
@ -637,6 +637,8 @@ The ``destinationIdentifier`` argument will be set to a string which can be used
to the sink, e.g. via calling :py:func:`QgsProcessingUtils.mapLayerFromString()` to the sink, e.g. via calling :py:func:`QgsProcessingUtils.mapLayerFromString()`
This function creates a new object and the caller takes responsibility for deleting the returned object. This function creates a new object and the caller takes responsibility for deleting the returned object.
:raises :: py:class:`QgsProcessingException`
%End %End
QgsProcessingFeatureSource *parameterAsSource( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const /Factory/; QgsProcessingFeatureSource *parameterAsSource( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const /Factory/;

View File

@ -754,7 +754,7 @@ This function creates a new object and the caller takes responsibility for delet
static QgsFeatureSink *parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariant &value, static QgsFeatureSink *parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariant &value,
const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs,
QgsProcessingContext &context, QString &destinationIdentifier /Out/, QgsFeatureSink::SinkFlags sinkFlags = 0 ) /Factory/; QgsProcessingContext &context, QString &destinationIdentifier /Out/, QgsFeatureSink::SinkFlags sinkFlags = 0 ) throw( QgsProcessingException ) /Factory/;
%Docstring %Docstring
Evaluates the parameter with matching ``definition`` and ``value`` to a feature sink. Evaluates the parameter with matching ``definition`` and ``value`` to a feature sink.
@ -768,6 +768,8 @@ to the sink, e.g. via calling :py:func:`QgsProcessingUtils.mapLayerFromString()`
This function creates a new object and the caller takes responsibility for deleting the returned object. This function creates a new object and the caller takes responsibility for deleting the returned object.
:raises :: py:class:`QgsProcessingException`
.. versionadded:: 3.4 .. versionadded:: 3.4
%End %End

View File

@ -1210,8 +1210,8 @@ while ($LINE_IDX < $LINE_COUNT){
# multiline definition (parenthesis left open) # multiline definition (parenthesis left open)
if ( $MULTILINE_DEFINITION != MULTILINE_NO ){ if ( $MULTILINE_DEFINITION != MULTILINE_NO ){
dbg_info("on multiline"); dbg_info("on multiline");
# https://regex101.com/r/DN01iM/2 # https://regex101.com/r/DN01iM/4
if ( $LINE =~ m/^([^()]+(\((?:[^()]++|(?1))*\)))*[^()]*\)[^()]*$/){ if ( $LINE =~ m/^([^()]+(\((?:[^()]++|(?1))*\)))*[^()]*\)([^()](throw\([^()]+\))?)*$/){
dbg_info("ending multiline"); dbg_info("ending multiline");
# remove potential following body # remove potential following body
if ( $MULTILINE_DEFINITION != MULTILINE_CONDITIONAL_STATEMENT && $LINE !~ m/(\{.*\}|;)\s*(\/\/.*)?$/ ){ if ( $MULTILINE_DEFINITION != MULTILINE_CONDITIONAL_STATEMENT && $LINE !~ m/(\{.*\}|;)\s*(\/\/.*)?$/ ){

View File

@ -599,7 +599,14 @@ bool QgsProcessingAlgorithm::parameterAsBoolean( const QVariantMap &parameters,
QgsFeatureSink *QgsProcessingAlgorithm::parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, QgsFeatureSink::SinkFlags sinkFlags ) const QgsFeatureSink *QgsProcessingAlgorithm::parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, QgsFeatureSink::SinkFlags sinkFlags ) const
{ {
return QgsProcessingParameters::parameterAsSink( parameterDefinition( name ), parameters, fields, geometryType, crs, context, destinationIdentifier, sinkFlags ); try
{
return QgsProcessingParameters::parameterAsSink( parameterDefinition( name ), parameters, fields, geometryType, crs, context, destinationIdentifier, sinkFlags );
}
catch ( QgsProcessingException )
{
throw QgsProcessingException( QObject::tr( "No parameter definition for the sink '%1'" ).arg( name ) );
}
} }
QgsProcessingFeatureSource *QgsProcessingAlgorithm::parameterAsSource( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const QgsProcessingFeatureSource *QgsProcessingAlgorithm::parameterAsSource( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const

View File

@ -628,9 +628,11 @@ class CORE_EXPORT QgsProcessingAlgorithm
* to the sink, e.g. via calling QgsProcessingUtils::mapLayerFromString(). * to the sink, e.g. via calling QgsProcessingUtils::mapLayerFromString().
* *
* This function creates a new object and the caller takes responsibility for deleting the returned object. * This function creates a new object and the caller takes responsibility for deleting the returned object.
*
* \throws QgsProcessingException
*/ */
QgsFeatureSink *parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier SIP_OUT, QgsFeatureSink *parameterAsSink( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context, QString &destinationIdentifier SIP_OUT,
const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem(), QgsFeatureSink::SinkFlags sinkFlags = nullptr ) const SIP_FACTORY; const QgsFields &fields, QgsWkbTypes::Type geometryType = QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs = QgsCoordinateReferenceSystem(), QgsFeatureSink::SinkFlags sinkFlags = nullptr ) const SIP_THROW( QgsProcessingException ) SIP_FACTORY;
/** /**
* Evaluates the parameter with matching \a name to a feature source. * Evaluates the parameter with matching \a name to a feature source.

View File

@ -548,6 +548,10 @@ QgsFeatureSink *QgsProcessingParameters::parameterAsSink( const QgsProcessingPar
return nullptr; return nullptr;
} }
// fall back to default // fall back to default
if ( !definition )
{
throw QgsProcessingException( QObject::tr( "No parameter definition for the sink" ) );
}
dest = definition->defaultValue().toString(); dest = definition->defaultValue().toString();
} }
else else

View File

@ -821,12 +821,12 @@ class CORE_EXPORT QgsProcessingParameters
* to the sink, e.g. via calling QgsProcessingUtils::mapLayerFromString(). * to the sink, e.g. via calling QgsProcessingUtils::mapLayerFromString().
* *
* This function creates a new object and the caller takes responsibility for deleting the returned object. * This function creates a new object and the caller takes responsibility for deleting the returned object.
* * \throws QgsProcessingException
* \since QGIS 3.4 * \since QGIS 3.4
*/ */
static QgsFeatureSink *parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariant &value, static QgsFeatureSink *parameterAsSink( const QgsProcessingParameterDefinition *definition, const QVariant &value,
const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs,
QgsProcessingContext &context, QString &destinationIdentifier SIP_OUT, QgsFeatureSink::SinkFlags sinkFlags = nullptr ) SIP_FACTORY; QgsProcessingContext &context, QString &destinationIdentifier SIP_OUT, QgsFeatureSink::SinkFlags sinkFlags = nullptr ) SIP_THROW( QgsProcessingException ) SIP_FACTORY;
/** /**
* Evaluates the parameter with matching \a definition to a feature source. * Evaluates the parameter with matching \a definition to a feature source.