From d1f10d3c01f3317b5d03959d0c2215302fefdc2c Mon Sep 17 00:00:00 2001 From: zhangsheng Date: Thu, 29 Oct 2026 08:30:58 +0800 Subject: [PATCH] fix: validate DBus reply in SMB mount path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Root cause: mountWithUserInput() and mountWithSavedInfos() did not check QDBusReply validity, DBus timeout produced contradictory state ok=false with err=kNoError, triggering false error dialog 2. Fix: add ret.isValid() guard before accessing reply value, on NoReply timeout use isMounted() to verify actual mount status, increase DBus timeout from 25s to 60s for slow SMB networks 3. Impact: eliminates false mount-failure dialog when SMB mount succeeds but DBus call times out, normal path unchanged Log: fix false mount error dialog on SMB DBus timeout Influence: 1. Test SMB mount with correct credentials, verify no false error 2. Test SMB mount under slow network to trigger DBus timeout 3. Verify mount-failure dialog still shows on genuine mount failures fix: 修复SMB挂载DBus超时误报错误对话框 1. 根因:mountWithUserInput()和mountWithSavedInfos()未校验DBus回复 有效性,DBus超时产生矛盾状态ok=false且err=kNoError,误弹错误对话框 2. 方案:访问回复值前增加ret.isValid()检查,NoReply超时时通过 isMounted()查询实际挂载状态,DBus超时从25秒增至60秒 3. 影响:消除SMB挂载成功但DBus超时时的误报错误对话框,正常路径无变化 Log: 修复SMB挂载DBus超时时的误报错误对话框 Influence: 1. 测试使用正确凭据SMB挂载,验证无误报错误对话框 2. 测试慢网络下SMB挂载触发DBus超时场景 3. 验证真实挂载失败仍正确显示错误对话框 PMS: BUG-295741 --- src/dfm-mount/private/dnetworkmounter.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/dfm-mount/private/dnetworkmounter.cpp b/src/dfm-mount/private/dnetworkmounter.cpp index 9553c6df..dabe185d 100644 --- a/src/dfm-mount/private/dnetworkmounter.cpp +++ b/src/dfm-mount/private/dnetworkmounter.cpp @@ -604,7 +604,19 @@ DNetworkMounter::MountRet DNetworkMounter::mountWithUserInput(const QString &add QDBusInterface mntCtrl(kDaemonService, kMountControlPath, kMountControlIFace, QDBusConnection::systemBus()); + mntCtrl.setTimeout(60000); QDBusReply ret = mntCtrl.call(kMountControlMount, address, param); + if (!ret.isValid()) { + const auto &e = ret.error(); + const QString name = e.name(); + if (e.type() == QDBusError::NoReply || name == QStringLiteral("org.freedesktop.DBus.Error.NoReply")) { + QString checkMpt; + if (isMounted(address, checkMpt)) + return { true, DeviceError::kNoError, checkMpt }; + return { false, DeviceError::kGDBusErrorNoReply, "" }; + } + return { false, DeviceError::kGDBusErrorNoReply, "" }; + } auto mntRet = ret.value(); QString mpt = mntRet.value(kDaemonMountRetKeyMpt).toString(); int errNum = mntRet.value(kDaemonMountRetKeyErrno).toInt(); @@ -639,6 +651,17 @@ DNetworkMounter::MountRet DNetworkMounter::mountWithSavedInfos(const QString &ad { kMountFsType, "cifs" } }; QDBusReply ret = mntCtrl.call(kMountControlMount, address, param); + if (!ret.isValid()) { + const auto &e = ret.error(); + const QString name = e.name(); + if (e.type() == QDBusError::NoReply || name == QStringLiteral("org.freedesktop.DBus.Error.NoReply")) { + QString checkMpt; + if (isMounted(address, checkMpt)) + return { true, DeviceError::kNoError, checkMpt }; + break; + } + break; + } auto mntRet = ret.value(); QString mpt = mntRet.value(kDaemonMountRetKeyMpt).toString();