fix: handle wrong password when processing longname-extract#414
Conversation
deepin pr auto review你好!我是CodeGeeX。我已经仔细审查了你提供的Git Diff,本次修改主要集中在增强CLI解压插件的错误处理逻辑,特别是针对长文件名解压失败、子进程退出状态以及密码错误检测的场景。 整体来看,这次修改填补了之前代码中一些错误未正确上报和信号未发出的漏洞,方向是正确的。但代码在逻辑严谨性、代码性能、代码安全方面还有改进空间。以下是我的详细审查意见: 1. 语法与逻辑问题 1.1: if (exitCode != 0) {
emit signalprogress(100);
emit signalFinished(PFT_Error);
return; // 这里正确返回了
}
deleteProcess();
PluginFinishType ret = extractFiles(m_files, m_extractOptions, property("lnfs").toBool());
if (ret == PFT_Error) {
emit signalprogress(100);
emit signalFinished(PFT_Error); // 这里可能造成信号重复发送
}分析: 如果 问题 1.2: if (pProcess->exitCode() != 0) {分析: 在 Qt 中,如果进程崩溃(被信号杀死,如 SIGSEGV), if (pProcess->exitStatus() == QProcess::NormalExit && pProcess->exitCode() != 0) {
// 处理正常退出但返回非0的情况
} else if (pProcess->exitStatus() == QProcess::CrashExit) {
// 处理进程崩溃的情况
m_eErrorType = ET_CrashError; // 假设有类似枚举
return false;
}2. 代码性能问题 2.1: pProcess->start();
pProcess->waitForFinished(-1);分析:
3. 代码安全问题 3.1:通过字符串匹配检测密码错误极度脆弱 QByteArray output = pProcess->readAllStandardOutput();
if (output.contains("Wrong password")) {
m_eErrorType = ET_WrongPassword;
return false;
}分析:
4. 代码质量问题 4.1: if (m_eErrorType == ET_NoError) {
m_eErrorType = ET_FileWriteError;
}分析: 这种写法虽然安全,但如果有多个地方需要设置错误类型,会导致大量模板代码。 void CliInterface::setErrorType(ErrorType type) {
if (m_eErrorType == ET_NoError) {
m_eErrorType = type;
}
}
// 调用处:
setErrorType(ET_FileWriteError);综合修改建议代码示例针对 // 在 cliinterface.h 中添加辅助函数
private:
void setErrorType(ErrorType type);
// 在 cliinterface.cpp 中实现
void CliInterface::setErrorType(ErrorType type) {
if (m_eErrorType == ET_NoError) {
m_eErrorType = type;
}
}
// 修改 handleLongNameExtract 中的逻辑
pProcess->start();
// 建议不要无限期等待,设置一个超时时间(如30000ms),避免死锁
if (!pProcess->waitForFinished(30000)) {
setErrorType(ET_TimeoutError); // 假设有超时枚举
return false;
}
if (pProcess->exitStatus() == QProcess::NormalExit && pProcess->exitCode() != 0) {
// 优先通过标准错误输出判断,且兼顾多语言或不同提示语的情况
QByteArray stdErr = pProcess->readAllStandardError();
QByteArray stdOut = pProcess->readAllStandardOutput();
// 建议将判断逻辑提取为虚函数,以便针对不同的CLI工具(7z, unrar等)做不同实现
if (stdErr.contains("Wrong password") || stdOut.contains("Wrong password") ||
stdErr.contains("密码错误")) { // 临时方案,最佳方案是判断 exitCode
setErrorType(ET_WrongPassword);
return false;
}
} else if (pProcess->exitStatus() == QProcess::CrashExit) {
// 处理进程崩溃
setErrorType(ET_CrashError);
return false;
}对于 |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: LiHua000, lzwind The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
/merge |
Log: as title
bug: https://pms.uniontech.com//bug-view-361845.html