forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
kde-apps/print-manager: Fix crash when cups returns jobs w/ duplicate id
Package-Manager: Portage-2.3.82, Repoman-2.3.20 Signed-off-by: Andreas Sturmlechner <[email protected]>
- Loading branch information
Showing
2 changed files
with
147 additions
and
0 deletions.
There are no files selected for viewing
87 changes: 87 additions & 0 deletions
87
kde-apps/print-manager/files/print-manager-19.08.3-crash-w-cups-jobs-w-duplicate-id.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
From c93f2f16c30d10fbd0f4bfb4c0bf0cec07a4c93b Mon Sep 17 00:00:00 2001 | ||
From: Albert Astals Cid <[email protected]> | ||
Date: Mon, 2 Dec 2019 23:04:42 +0100 | ||
Subject: Fix crash when cups returns jobs with duplicate id | ||
|
||
Summary: | ||
For some reason my cups was giving me two withheld jobs with id 33 and two with id 40 | ||
|
||
That made the JobModel code crash, because it went like this | ||
|
||
* First job with id 33 found | ||
* insertRow with 0 called | ||
* Row 0 inserted | ||
* Job at row 0 updated (from inside insertRow) | ||
* Second job with id 33 found | ||
* The "oh i already have this job code triggers", updates the job, then takesRow 0 and inserts at row 1. QStandardItemModel doesn't like getting a row add at 1 inserted when empty | ||
* First job with id 40 found | ||
* insertRow with 2 called | ||
* Row 2 inserted, it fails, QStandardItemModel doesn't like getting a row add at 2 when empty | ||
* Job at row 2 updated (from iniside insertRow) | ||
* Crash because there's no row 2 in the model | ||
|
||
BUGS: 326289 | ||
|
||
Test Plan: Doesn't crash anymore with my weird cups list of pending jobs | ||
|
||
Reviewers: dantti | ||
|
||
Reviewed By: dantti | ||
|
||
Subscribers: ngraham, marcelm, fvogt, broulik, nicolasfella, kmaterka, kde-utils-devel | ||
|
||
Differential Revision: https://phabricator.kde.org/D25623 | ||
--- | ||
libkcups/JobModel.cpp | 23 +++++++++++++++++++++-- | ||
1 file changed, 21 insertions(+), 2 deletions(-) | ||
|
||
diff --git a/libkcups/JobModel.cpp b/libkcups/JobModel.cpp | ||
index 73c5174..3c4878b 100644 | ||
--- a/libkcups/JobModel.cpp | ||
+++ b/libkcups/JobModel.cpp | ||
@@ -174,6 +174,25 @@ void JobModel::getJobs() | ||
m_processingJob.clear(); | ||
} | ||
|
||
+static KCupsJobs sanitizeJobs(KCupsJobs jobs) | ||
+{ | ||
+ // For some reason sometimes cups has broken job queues with jobs with duplicated id | ||
+ // our model doesn't like that at all so sanitize the job list before processing it | ||
+ QVector<int> seenIds; | ||
+ int i = 0; | ||
+ while (i < jobs.count()) { | ||
+ const int jobId = jobs.at(i).id(); | ||
+ if (seenIds.contains(jobId)) { | ||
+ qCWarning(LIBKCUPS) << "Found job with duplicated id" << jobId; | ||
+ jobs.removeAt(i); | ||
+ } else { | ||
+ seenIds << jobId; | ||
+ ++i; | ||
+ } | ||
+ } | ||
+ return jobs; | ||
+} | ||
+ | ||
void JobModel::getJobFinished(KCupsRequest *request) | ||
{ | ||
if (request) { | ||
@@ -181,7 +200,7 @@ void JobModel::getJobFinished(KCupsRequest *request) | ||
// clear the model after so that the proper widget can be shown | ||
clear(); | ||
} else { | ||
- const KCupsJobs jobs = request->jobs(); | ||
+ const KCupsJobs jobs = sanitizeJobs(request->jobs()); | ||
qCDebug(LIBKCUPS) << jobs.size(); | ||
for (int i = 0; i < jobs.size(); ++i) { | ||
const KCupsJob job = jobs.at(i); | ||
@@ -207,7 +226,7 @@ void JobModel::getJobFinished(KCupsRequest *request) | ||
} | ||
} | ||
|
||
- // remove old printers | ||
+ // remove old jobs | ||
// The above code starts from 0 and make sure | ||
// dest == modelIndex(x) and if it's not the | ||
// case it either inserts or moves it. | ||
-- | ||
cgit v1.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# Copyright 1999-2019 Gentoo Authors | ||
# Distributed under the terms of the GNU General Public License v2 | ||
|
||
EAPI=7 | ||
|
||
KFMIN=5.60.0 | ||
PLASMA_MINIMAL=5.16.5 | ||
QTMIN=5.12.3 | ||
inherit ecm kde.org | ||
|
||
DESCRIPTION="Manage print jobs and printers in Plasma" | ||
LICENSE="GPL-2" # TODO: CHECK | ||
SLOT="5" | ||
KEYWORDS="~amd64 ~arm64 ~x86" | ||
IUSE="+gtk" | ||
|
||
DEPEND=" | ||
>=kde-frameworks/kcmutils-${KFMIN}:5 | ||
>=kde-frameworks/kconfig-${KFMIN}:5 | ||
>=kde-frameworks/kconfigwidgets-${KFMIN}:5 | ||
>=kde-frameworks/kcoreaddons-${KFMIN}:5 | ||
>=kde-frameworks/kdbusaddons-${KFMIN}:5 | ||
>=kde-frameworks/ki18n-${KFMIN}:5 | ||
>=kde-frameworks/kiconthemes-${KFMIN}:5 | ||
>=kde-frameworks/kio-${KFMIN}:5 | ||
>=kde-frameworks/knotifications-${KFMIN}:5 | ||
>=kde-frameworks/kservice-${KFMIN}:5 | ||
>=kde-frameworks/kwidgetsaddons-${KFMIN}:5 | ||
>=kde-frameworks/kwindowsystem-${KFMIN}:5 | ||
>=kde-frameworks/plasma-${KFMIN}:5 | ||
>=dev-qt/qtdbus-${QTMIN}:5 | ||
>=dev-qt/qtdeclarative-${QTMIN}:5 | ||
>=dev-qt/qtgui-${QTMIN}:5 | ||
>=dev-qt/qtnetwork-${QTMIN}:5 | ||
>=dev-qt/qtwidgets-${QTMIN}:5 | ||
net-print/cups | ||
" | ||
RDEPEND="${DEPEND} | ||
>=kde-plasma/kde-cli-tools-${PLASMA_MINIMAL}:5 | ||
gtk? ( app-admin/system-config-printer ) | ||
" | ||
|
||
PATCHES=( "${FILESDIR}"/${P}-crash-w-cups-jobs-w-duplicate-id.patch ) | ||
|
||
pkg_postinst(){ | ||
ecm_pkg_postinst | ||
|
||
if [[ -z "${REPLACING_VERSIONS}" ]] && ! use gtk ; then | ||
ewarn "By switching off \"gtk\" USE flag, you have chosen to do without" | ||
ewarn "an important, though optional, runtime dependency:" | ||
ewarn | ||
ewarn "app-admin/system-config-printer" | ||
ewarn | ||
ewarn "${PN} will work nevertheless, but is going to be less comfortable" | ||
ewarn "and will show the following error status during runtime:" | ||
ewarn | ||
ewarn "\"Failed to group devices: 'The name org.fedoraproject.Config.Printing" | ||
ewarn "was not provided by any .service files'\"" | ||
fi | ||
} |